def generate_mif(file_name, width, depth, rom): f = open(file_name, 'w') f.write("WIDTH=%d;\n" % width) f.write("DEPTH=%d;\n" % depth) f.write("ADDRESS_RADIX=UNS;\n") f.write("DATA_RADIX=BIN;\n") f.write("CONTENT BEGIN\n") format_of_code = "0" + str(width) + "b" for i in range(depth): machine_code = format(rom[i], format_of_code) f.write("%10d : %s;\n" % (i, machine_code)) f.write("END;\n") f.close() def mov(ra, rb): return 0 << 11 | ra << 8 | rb << 5 def add(ra, rb): return 1 << 11 | ra << 8 | rb << 5 def sub(ra, rb): return 2 << 11 | ra << 8 | rb << 5 def _and(ra, rb): return 3 << 11 | ra << 8 | rb << 5 def _or(ra, rb): return 4 << 11 | ra << 8 | rb << 5 def sl(ra): return 5 << 11 | ra << 8 # 左シフト def sr(ra): return 6 << 11 | ra << 8 # 右シフト def sra(ra): return 7 << 11 | ra << 8 # 算術右シフト def ldl(ra, ival): return 8 << 11 | ra << 8 | (ival & 0xFF) # 下位バイトに即値をロード def ldh(ra, ival): return 9 << 11 | ra << 8 | (ival & 0xFF) # 上位バイトに即値をロード def cmp(ra, rb): return 10 << 11 | ra << 8 | rb << 5 # 一致したらフラグが立つ。 def je(addr): return 11 << 11 | (addr & 0xFF) # 一致フラグが立っていたらジャンプ def jmp(addr): return 12 << 11 | (addr & 0xFF) # 無条件ジャンプ def ld(ra, addr): return 13 << 11 | ra << 8 | (addr & 0xFF) # RAMからレジスタへ値を持ってくる。 def st(ra, addr): return 14 << 11 | ra << 8 | (addr & 0xFF) # レジスタの値をRAMへ格納する。 def hlt(): return 15 << 11 REG0, REG1, REG2, REG3, REG4, REG5, REG6, REG7 = range(8) FILE_NAME = "rom_init.mif" WIDTH = 15 DEPTH = 256 _ = [0] * DEPTH _[0] = ldh(REG0, 0) #レジスタ0 (総和の初期値)をクリアする。 _[1] = ldl(REG0, 0) _[2] = ldh(REG1, 0) # レジスタ1に1 (増分)をセットする。 _[3] = ldl(REG1, 1) _[4] = ldh(REG2, 0) # レジスタ2 (足す数の初期値)をクリアする。 _[5] = ldl(REG2, 0) _[6] = ldh(REG3, 0) # レジスタ3に10 (ループ回数)をセットする。 _[7] = ldl(REG3, 10) _[8] = add(REG2, REG1) # 足す数をインクリメントして、 _[9] = add(REG0, REG2) # それをここまでの総和に加算して、 _[10] = st(REG0, 64) # ここまでの総和をOUTポートに出力して、 _[11] = cmp(REG2, REG3) # 足す数==ループ回数であるなら、 _[12] = je(14) # ループを抜けるが、 _[13] = jmp(8) # そうでなければ加算を繰り返す。 _[14] = hlt() generate_mif(FILE_NAME, WIDTH, DEPTH, _)
生成されたファイル:
WIDTH=15; DEPTH=256; ADDRESS_RADIX=UNS; DATA_RADIX=BIN; CONTENT BEGIN 0 : 100100000000000; 1 : 100000000000000; 2 : 100100100000000; 3 : 100000100000001; 4 : 100101000000000; 5 : 100001000000000; 6 : 100101100000000; 7 : 100001100001010; 8 : 000101000100000; 9 : 000100001000000; 10 : 111000001000000; 11 : 101001001100000; 12 : 101100000001110; 13 : 110000000001000; 14 : 111100000000000; 15 : 000000000000000; 16 : 000000000000000; 17 : 000000000000000; 18 : 000000000000000; (略) 253 : 000000000000000; 254 : 000000000000000; 255 : 000000000000000; END;