8b16c24923d6f31c3b87a71e06b51c3c3aaf734d
1 from nmigen
import Module
, Signal
2 from nmigen
.back
.pysim
import Simulator
, Delay
, Settle
3 from nmigen
.test
.utils
import FHDLTestCase
5 from soc
.decoder
.power_decoder
import (create_pdecode
)
6 from soc
.decoder
.power_enums
import (Function
, InternalOp
,
7 In1Sel
, In2Sel
, In3Sel
,
8 OutSel
, RC
, LdstLen
, CryIn
,
9 single_bit_flags
, Form
, SPR
,
10 get_signal_name
, get_csv
)
11 from soc
.decoder
.power_decoder2
import (PowerDecode2
)
12 from soc
.simulator
.program
import Program
13 from soc
.simulator
.qemu
import run_program
14 from soc
.decoder
.isa
.all
import ISA
18 def __init__(self
, num
):
22 class DecoderTestCase(FHDLTestCase
):
24 def run_tst(self
, generator
, initial_mem
=None):
27 instruction
= Signal(32)
29 pdecode
= create_pdecode()
31 m
.submodules
.pdecode2
= pdecode2
= PowerDecode2(pdecode
)
33 simulator
= ISA(pdecode2
, [0] * 32, {}, 0, initial_mem
, 0)
34 comb
+= pdecode2
.dec
.raw_opcode_in
.eq(instruction
)
35 comb
+= pdecode2
.dec
.bigendian
.eq(0)
36 gen
= generator
.generate_instructions()
37 instructions
= list(zip(gen
, generator
.assembly
.splitlines()))
42 index
= simulator
.pc
.CIA
.value
//4
43 while index
< len(instructions
):
44 ins
, code
= instructions
[index
]
46 print("0x{:X}".format(ins
& 0xffffffff))
49 yield instruction
.eq(ins
)
52 opname
= code
.split(' ')[0]
53 yield from simulator
.call(opname
)
54 index
= simulator
.pc
.CIA
.value
//4
57 sim
.add_process(process
)
58 with sim
.write_vcd("simulator.vcd", "simulator.gtkw",
65 lst
= ["addi 6, 0, 0x10",
70 with
Program(lst
) as program
:
71 self
.run_tst_program(program
, [1])
73 def _tstexample(self
):
74 lst
= ["addi 1, 0, 0x5678",
78 with
Program(lst
) as program
:
79 self
.run_tst_program(program
, [1, 2, 3, 4])
82 lst
= ["addi 1, 0, 0x5678",
87 initial_mem
= {0x1230: (0x5432123412345678, 8),
88 0x1238: (0xabcdef0187654321, 8),
90 with
Program(lst
) as program
:
91 self
.run_tst_program(program
,
95 def test_ld_rev_ext(self
):
96 lst
= ["addi 1, 0, 0x5678",
101 with
Program(lst
) as program
:
102 self
.run_tst_program(program
, [1, 2, 3])
104 def test_st_rev_ext(self
):
105 lst
= ["addi 1, 0, 0x5678",
110 with
Program(lst
) as program
:
111 self
.run_tst_program(program
, [1, 2, 3])
113 def test_ldst_extended(self
):
114 lst
= ["addi 1, 0, 0x5678",
119 with
Program(lst
) as program
:
120 self
.run_tst_program(program
, [1, 2, 3])
122 def _tst0_ldst_widths(self
):
123 lst
= ["addis 1, 0, 0xdead",
133 with
Program(lst
) as program
:
134 self
.run_tst_program(program
, [1, 2, 3, 4, 5])
137 lst
= ["addi 1, 0, 0x1234",
140 "subfic 4, 1, 0x1337",
142 with
Program(lst
) as program
:
143 self
.run_tst_program(program
, [1, 2, 3, 4, 5])
145 def _tstadd_with_carry(self
):
146 lst
= ["addi 1, 0, 5",
153 with
Program(lst
) as program
:
154 self
.run_tst_program(program
, [1, 2, 3])
157 lst
= ["addi 1, 0, 0x0FFF",
160 with
Program(lst
) as program
:
161 self
.run_tst_program(program
, [1])
163 @unittest.skip("broken")
165 lst
= ["addi 1, 0, 3",
168 with
Program(lst
) as program
:
169 self
.run_tst_program(program
, [1])
171 def tst_2_load_store(self
):
172 lst
= ["addi 1, 0, 0x1004",
178 initial_regs
= [0] * 32
179 initial_regs
[1] = 0x1004
180 initial_regs
[2] = 0x1008
181 initial_regs
[3] = 0x00ee
182 initial_mem
= {0x1000: (0x5432123412345678, 8),
183 0x1008: (0xabcdef0187654321, 8),
184 0x1020: (0x1828384822324252, 8),
186 with
Program(lst
) as program
:
187 self
.run_tst_program(program
, [3,4], initial_mem
)
189 def _tst3_load_store(self
):
190 lst
= ["addi 1, 0, 0x1004",
195 initial_regs
= [0] * 32
196 initial_regs
[1] = 0x1004
197 initial_regs
[2] = 0x1002
198 initial_regs
[3] = 0x15eb
199 initial_mem
= {0x1000: (0x5432123412345678, 8),
200 0x1008: (0xabcdef0187654321, 8),
201 0x1020: (0x1828384822324252, 8),
203 with
Program(lst
) as program
:
204 self
.run_tst_program(program
, [1,2,3,4], initial_mem
)
206 def run_tst_program(self
, prog
, reglist
, initial_mem
=None):
208 simulator
= self
.run_tst(prog
, initial_mem
=initial_mem
)
210 with
run_program(prog
, initial_mem
) as q
:
211 self
.qemu_register_compare(simulator
, q
, reglist
)
212 self
.qemu_mem_compare(simulator
, q
, reglist
)
213 print(simulator
.gpr
.dump())
215 def qemu_mem_compare(self
, sim
, qemu
, check
=True):
216 if False: # disable convenient large interesting debugging memory dump
218 qmemdump
= qemu
.get_mem(addr
, 2048)
219 for i
in range(len(qmemdump
)):
220 s
= hex(int(qmemdump
[i
]))
221 print ("qemu mem %06x %s" % (addr
+i
*8, s
))
222 for k
, v
in sim
.mem
.mem
.items():
223 qmemdump
= qemu
.get_mem(k
*8, 8)
224 s
= hex(int(qmemdump
[0]))[2:]
225 print ("qemu mem %06x %16s" % (k
*8, s
))
226 for k
, v
in sim
.mem
.mem
.items():
227 print ("sim mem %06x %016x" % (k
*8, v
))
230 for k
, v
in sim
.mem
.mem
.items():
231 qmemdump
= qemu
.get_mem(k
*8, 1)
232 self
.assertEqual(int(qmemdump
[0]), v
)
234 def qemu_register_compare(self
, sim
, qemu
, regs
):
235 qpc
, qxer
, qcr
= qemu
.get_pc(), qemu
.get_xer(), qemu
.get_cr()
236 sim_cr
= sim
.cr
.get_range().value
237 sim_pc
= sim
.pc
.CIA
.value
238 sim_xer
= sim
.spr
['XER'].value
239 print("qemu pc", hex(qpc
))
240 print("qemu cr", hex(qcr
))
241 print("qemu xer", bin(qxer
))
242 print("sim pc", hex(sim
.pc
.CIA
.value
))
243 print("sim cr", hex(sim_cr
))
244 print("sim xer", hex(sim_xer
))
245 self
.assertEqual(qcr
, sim_cr
)
247 qemu_val
= qemu
.get_register(reg
)
248 sim_val
= sim
.gpr(reg
).value
249 self
.assertEqual(qemu_val
, sim_val
)
252 if __name__
== "__main__":