+def insert_into_rom(startaddr, instructions, rom):
+ print("insn before, init rom", len(instructions))
+ pprint(rom)
+
+ startaddr //= 4 # instructions are 32-bit
+
+ # 64 bit
+ mask = ((1 << 64)-1)
+ for ins in instructions:
+ if isinstance(ins, tuple):
+ insn, code = ins
+ else:
+ insn, code = ins, ''
+ insn = insn & 0xffffffff
+ msbs = (startaddr >> 1) & mask
+ lsb = 1 if (startaddr & 1) else 0
+ print ("insn", hex(insn), hex(msbs), hex(lsb))
+
+ val = rom.get(msbs<<3, 0)
+ if insn != 0:
+ print("before set", hex(4*startaddr),
+ hex(msbs), hex(val), hex(insn))
+ val = (val | (insn << (lsb*32)))
+ val = val & mask
+ rom[msbs<<3] = val
+ if insn != 0:
+ print("after set", hex(4*startaddr), hex(msbs), hex(val))
+ print("instr: %06x 0x%x %s %08x" % (4*startaddr, insn, code, val))
+ startaddr += 1
+ startaddr = startaddr & mask
+
+ print ("after insn insert")
+ pprint(rom)
+
+
+def setup_i_memory(imem, startaddr, instructions, rom):