.mifファイルを生成するアセンブラのようなものを作る

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;