1 from nmigen
import Module
, Signal
2 from nmigen
.back
.pysim
import Simulator
, Delay
3 from nmigen
.test
.utils
import FHDLTestCase
5 from soc
.simulator
.internalop_sim
import InternalOpSimulator
6 from soc
.decoder
.power_decoder
import (create_pdecode
)
7 from soc
.decoder
.power_enums
import (Function
, InternalOp
,
8 In1Sel
, In2Sel
, In3Sel
,
9 OutSel
, RC
, LdstLen
, CryIn
,
10 single_bit_flags
, Form
, SPR
,
11 get_signal_name
, get_csv
)
12 from soc
.decoder
.power_decoder2
import (PowerDecode2
)
13 from soc
.simulator
.gas
import get_assembled_instruction
14 from soc
.simulator
.program
import Program
18 def __init__(self
, num
):
23 class DecoderTestCase(FHDLTestCase
):
25 def run_tst(self
, generator
, simulator
):
28 instruction
= Signal(32)
30 pdecode
= create_pdecode()
32 m
.submodules
.pdecode2
= pdecode2
= PowerDecode2(pdecode
)
33 comb
+= pdecode2
.dec
.raw_opcode_in
.eq(instruction
)
35 gen
= generator
.generate_instructions()
40 print("0x{:X}".format(ins
& 0xffffffff))
42 # ask the decoder to decode this binary data (endian'd)
43 yield pdecode2
.dec
.bigendian
.eq(0) # little / big?
44 yield instruction
.eq(ins
) # raw binary instr.
46 yield from simulator
.execute_op(pdecode2
)
48 sim
.add_process(process
)
49 with sim
.write_vcd("simulator.vcd", "simulator.gtkw",
50 traces
=[pdecode2
.ports()]):
53 def test_example(self
):
54 lst
= ["addi 1, 0, 0x1234",
60 simulator
= InternalOpSimulator()
62 self
.run_tst(gen
, simulator
)
63 simulator
.regfile
.assert_gprs(
70 lst
= ["addi 1, 0, 0x1234",
76 simulator
= InternalOpSimulator()
78 self
.run_tst(gen
, simulator
)
79 simulator
.regfile
.assert_gprs(
84 def test_ldst_extended(self
):
85 lst
= ["addi 1, 0, 0x1234",
92 simulator
= InternalOpSimulator()
94 self
.run_tst(gen
, simulator
)
95 simulator
.regfile
.assert_gprs(
99 def test_ldst_widths(self
):
100 lst
= [" lis 1, 0xdead",
111 simulator
= InternalOpSimulator()
112 self
.run_tst(gen
, simulator
)
113 simulator
.regfile
.assert_gprs({
117 5: 0xffffffffde12beef}) # checked with qemu
120 if __name__
== "__main__":