仮想計算機構

ブログのひとこと説明 ※ブログ名の近くに表示されます

【パタヘネ】【Python】乗算ハードウェアの第1のバージョンのシミュレーション

乗算ハードウェアのシミュレーション

パタヘネ(上)図 3.3 計算のハードウェアで乗算を実行した場合のレジスタの変化を表示するプログラムを作成しました。乗数の対象は6ビット符号なし整数です。例えば

2\times 3=6

という乗算においては2が被乗数、3が乗数、6が積になります。ハードウェア上では乗数に6ビット、被乗数と積にそれぞれ12ビットのレジスタを割り当てます。

実行環境

Python 3.7.6
OS : Windows 10

プログラム

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
--------------------------------------------------

参考文献

パターソン&ヘネシー『コンピュータの構成と設計 第5版 上』日経BP