乗算ハードウェアのシミュレーション
パタヘネ(上)図 3.3 計算のハードウェアで乗算を実行した場合のレジスタの変化を表示するプログラムを作成しました。乗数の対象は6ビット符号なし整数です。例えば
という乗算においては2が被乗数、3が乗数、6が積になります。ハードウェア上では乗数に6ビット、被乗数と積にそれぞれ12ビットのレジスタを割り当てます。
プログラム
import sys if len(sys.argv)==3: md = int(sys.argv[1]) mr = int(sys.argv[2]) else: md = 50 # multiplicand mr = 10 # multiplier p = 0 # product print('{} x {} = {}'.format(md,mr,md*mr)) print('-'*50) print('cycle | step | multiplier | multiplicand | product') print('-'*50) print('0 | init | {:06b} | {:012b} | {:012b}'.format(mr,md,p)) for i in range(6): # product = product + multiplicand str_mr = format(mr,'06b') if str_mr[-1] == '1': p += md print('{} | plus | {:06b} | {:012b} | {:012b}'.format(i+1,mr,md,p)) # left shift md = md<<1 print('{} | shift | {:06b} | {:012b} | {:012b}'.format(i+1,mr,md,p)) # right shift mr = mr>>1 print('{} | shift | {:06b} | {:012b} | {:012b}'.format(i+1,mr,md,p)) print('-'*50)
実行例
> python .\main.py 12 14 12 x 14 = 168 -------------------------------------------------- cycle | step | multiplier | multiplicand | product -------------------------------------------------- 0 | init | 001110 | 000000001100 | 000000000000 1 | shift | 001110 | 000000011000 | 000000000000 1 | shift | 000111 | 000000011000 | 000000000000 2 | plus | 000111 | 000000011000 | 000000011000 2 | shift | 000111 | 000000110000 | 000000011000 2 | shift | 000011 | 000000110000 | 000000011000 3 | plus | 000011 | 000000110000 | 000001001000 3 | shift | 000011 | 000001100000 | 000001001000 3 | shift | 000001 | 000001100000 | 000001001000 4 | plus | 000001 | 000001100000 | 000010101000 4 | shift | 000001 | 000011000000 | 000010101000 4 | shift | 000000 | 000011000000 | 000010101000 5 | shift | 000000 | 000110000000 | 000010101000 5 | shift | 000000 | 000110000000 | 000010101000 6 | shift | 000000 | 001100000000 | 000010101000 6 | shift | 000000 | 001100000000 | 000010101000 --------------------------------------------------