0cb708ea13046d18ef9715d0bd873287314e13b1
1 from nmigen
import Module
, Signal
2 from nmigen
.back
.pysim
import Simulator
, Delay
3 from nmigen
.test
.utils
import FHDLTestCase
4 from nmigen
.cli
import rtlil
9 from power_decoder
import (PowerDecoder
)
10 from power_enums
import (Function
, InternalOp
, In1Sel
, In2Sel
, In3Sel
,
11 OutSel
, RC
, LdstLen
, CryIn
, single_bit_flags
,
12 get_signal_name
, get_csv
)
15 class DecoderTestCase(FHDLTestCase
):
17 def run_tst(self
, bitsel
, csvname
, suffix
=None, opint
=True):
21 function_unit
= Signal(Function
)
22 internal_op
= Signal(InternalOp
)
23 in1_sel
= Signal(In1Sel
)
24 in2_sel
= Signal(In2Sel
)
25 in3_sel
= Signal(In3Sel
)
26 out_sel
= Signal(OutSel
)
28 ldst_len
= Signal(LdstLen
)
29 cry_in
= Signal(CryIn
)
31 opcodes
= get_csv(csvname
)
32 m
.submodules
.dut
= dut
= PowerDecoder(32, opcodes
, bitsel
=bitsel
,
33 opint
=opint
, suffix
=suffix
)
34 comb
+= [dut
.opcode_in
.eq(opcode
),
35 function_unit
.eq(dut
.op
.function_unit
),
36 in1_sel
.eq(dut
.op
.in1_sel
),
37 in2_sel
.eq(dut
.op
.in2_sel
),
38 in3_sel
.eq(dut
.op
.in3_sel
),
39 out_sel
.eq(dut
.op
.out_sel
),
40 rc_sel
.eq(dut
.op
.rc_sel
),
41 ldst_len
.eq(dut
.op
.ldst_len
),
42 cry_in
.eq(dut
.op
.cry_in
),
43 internal_op
.eq(dut
.op
.internal_op
)]
48 for row
in dut
.opcodes
:
52 if not opint
: # HACK: convert 001---10 to 0b00100010
53 op
= "0b" + op
.replace('-', '0')
54 print ("opint", opint
, row
['opcode'], op
)
56 yield opcode
[bitsel
[0]:bitsel
[1]].eq(int(op
, 0))
58 signals
= [(function_unit
, Function
, 'unit'),
59 (internal_op
, InternalOp
, 'internal op'),
60 (in1_sel
, In1Sel
, 'in1'),
61 (in2_sel
, In2Sel
, 'in2'),
62 (in3_sel
, In3Sel
, 'in3'),
63 (out_sel
, OutSel
, 'out'),
65 (cry_in
, CryIn
, 'cry in'),
66 (ldst_len
, LdstLen
, 'ldst len')]
67 for sig
, enm
, name
in signals
:
69 expected
= enm
[row
[name
]]
70 msg
= f
"{sig.name} == {enm(result)}, expected: {expected}"
71 self
.assertEqual(enm(result
), expected
, msg
)
72 for bit
in single_bit_flags
:
73 sig
= getattr(dut
.op
, get_signal_name(bit
))
75 expected
= int(row
[bit
])
76 msg
= f
"{sig.name} == {result}, expected: {expected}"
77 self
.assertEqual(expected
, result
, msg
)
78 sim
.add_process(process
)
79 prefix
= os
.path
.splitext(csvname
)[0]
80 with sim
.write_vcd("%s.vcd" % prefix
, "%s.gtkw" % prefix
, traces
=[
81 opcode
, function_unit
, internal_op
,
85 def generate_ilang(self
, bitsel
, csvname
, opint
=True, suffix
=None):
86 prefix
= os
.path
.splitext(csvname
)[0]
88 prefix
+= ".%s" % str(suffix
).replace(" ", "")[1:-1]
89 dut
= PowerDecoder(32, get_csv(csvname
), bitsel
=bitsel
,
90 opint
=opint
, suffix
=suffix
)
91 vl
= rtlil
.convert(dut
, ports
=dut
.ports())
92 with
open("%s_decoder.il" % prefix
, "w") as f
:
96 self
.run_tst((26, 32), "major.csv")
97 self
.generate_ilang((26, 32), "major.csv")
99 # def test_minor_19(self):
100 # self.run_tst(10, "minor_19.csv", suffix=(0, 5))
101 # self.generate_ilang(10, "minor_19.csv", suffix=(0, 5))
103 # def test_minor_19_00000(self):
104 # self.run_tst(10, "minor_19_00000.csv")
105 # self.generate_ilang(10, "minor_19_00000.csv")
107 # def test_minor_30(self):
108 # self.run_tst(4, "minor_30.csv")
109 # self.generate_ilang(4, "minor_30.csv")
111 # def test_minor_31(self):
112 # self.run_tst(10, "minor_31.csv", suffix=(0, 5))
113 # self.generate_ilang(10, "minor_31.csv", suffix=(0, 5))
115 # #def test_minor_31_prefix(self):
116 # # self.run_tst(10, "minor_31.csv", suffix=(5, 10))
117 # # self.generate_ilang(10, "minor_31.csv", suffix=(5, 10))
119 # def test_extra(self):
120 # self.run_tst(32, "extra.csv", opint=False)
121 # self.generate_ilang(32, "extra.csv", opint=False)
124 if __name__
== "__main__":