1 from nmigen
import Module
, Signal
2 from nmigen
.back
.pysim
import Simulator
, Delay
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
,
10 get_signal_name
, get_csv
)
11 from soc
.decoder
.power_decoder2
import (PowerDecode2
)
18 InternalOp
.OP_ADD
: "add",
19 InternalOp
.OP_AND
: "and",
20 InternalOp
.OP_OR
: "or"}
24 def __init__(self
, num
):
28 class DecoderTestCase(FHDLTestCase
):
29 def generate_opcode_string(self
, internalop
, r1
, r2
, op3
):
30 opcodestr
= ops
[internalop
]
31 if isinstance(op3
, Register
):
37 string
= "{}{} {}, {}, {}\n".format(opcodestr
,
44 def get_assembled_instruction(self
, instruction
):
45 with tempfile
.NamedTemporaryFile(suffix
=".o") as outfile
:
46 args
= ["powerpc64-linux-gnu-as",
49 p
= subprocess
.Popen(args
, stdin
=subprocess
.PIPE
)
50 p
.communicate(instruction
.encode('utf-8'))
53 with tempfile
.NamedTemporaryFile(suffix
=".bin") as binfile
:
54 args
= ["powerpc64-linux-gnu-objcopy",
58 subprocess
.check_output(args
)
59 binary
= struct
.unpack('>i', binfile
.read(4))[0]
62 def test_decoder(self
):
65 instruction
= Signal(32)
67 pdecode
= create_pdecode()
69 m
.submodules
.pdecode2
= pdecode2
= PowerDecode2(pdecode
)
70 comb
+= pdecode2
.dec
.opcode_in
.eq(instruction
)
76 opcode
= random
.choice(list(ops
.keys()))
77 r1
= Register(random
.randrange(32))
78 r2
= Register(random
.randrange(32))
79 r3
= Register(random
.randrange(32))
81 instruction_str
= self
.generate_opcode_string(
83 print("instr", instruction_str
.strip())
84 instruction_bin
= self
.get_assembled_instruction(
86 print("code", hex(instruction_bin
), bin(instruction_bin
))
88 yield instruction
.eq(instruction_bin
)
91 r1sel
= yield pdecode2
.e
.write_reg
.data
92 r3sel
= yield pdecode2
.e
.read_reg2
.data
94 # For some reason r2 gets decoded either in read_reg1
96 form
= yield pdecode2
.dec
.op
.form
97 if form
== Form
.X
.value
:
98 r2sel
= yield pdecode2
.e
.read_reg3
.data
100 r2sel
= yield pdecode2
.e
.read_reg1
.data
101 assert(r1sel
== r1
.num
)
102 assert(r3sel
== r3
.num
)
103 assert(r2sel
== r2
.num
)
105 sim
.add_process(process
)
106 with sim
.write_vcd("gas.vcd", "gas.gtkw", traces
=[pdecode2
.ports()]):
110 if __name__
== "__main__":