1 """Decode2ToExecute1Type
3 based on Anton Blanchard microwatt decode2.vhdl
6 from nmigen
import Signal
, Record
7 from nmutil
.iocontrol
import RecordObject
8 from soc
.decoder
.power_enums
import InternalOp
, CryIn
, Function
, SPR
13 def __init__(self
, width
, name
):
14 name_ok
= "%s_ok" % name
15 layout
= ((name
, width
), (name_ok
, 1))
16 Record
.__init
__(self
, layout
)
17 self
.data
= getattr(self
, name
) # convenience
18 self
.ok
= getattr(self
, name_ok
) # convenience
19 self
.data
.reset_less
= True # grrr
20 self
.reset_less
= True # grrr
23 return [self
.data
, self
.ok
]
26 class Decode2ToOperand(RecordObject
):
28 def __init__(self
, name
=None):
30 RecordObject
.__init
__(self
, name
=name
)
32 self
.insn_type
= Signal(InternalOp
, reset_less
=True)
33 self
.fn_unit
= Signal(Function
, reset_less
=True)
34 self
.imm_data
= Data(64, name
="imm")
36 self
.lk
= Signal(reset_less
=True)
37 self
.rc
= Data(1, "rc")
38 self
.oe
= Data(1, "oe")
39 self
.xer_in
= Signal(reset_less
=True) # xer might be read
40 self
.xer_out
= Signal(reset_less
=True) # xer might be written
41 self
.invert_a
= Signal(reset_less
=True)
42 self
.zero_a
= Signal(reset_less
=True)
43 self
.input_carry
= Signal(CryIn
, reset_less
=True)
44 self
.output_carry
= Signal(reset_less
=True)
45 self
.input_cr
= Signal(reset_less
=True) # instr. has a CR as input
46 self
.output_cr
= Signal(reset_less
=True) # instr. has a CR as output
47 self
.invert_out
= Signal(reset_less
=True)
48 self
.is_32bit
= Signal(reset_less
=True)
49 self
.is_signed
= Signal(reset_less
=True)
50 self
.insn
= Signal(32, reset_less
=True)
51 self
.data_len
= Signal(4, reset_less
=True) # bytes
52 self
.byte_reverse
= Signal(reset_less
=True)
53 self
.sign_extend
= Signal(reset_less
=True)# do we need this?
54 self
.update
= Signal(reset_less
=True) # LD/ST is "update" variant
55 self
.traptype
= Signal(5, reset_less
=True) # see trap main_stage.py
56 self
.trapaddr
= Signal(13, reset_less
=True)
59 class Decode2ToExecute1Type(Decode2ToOperand
):
61 def __init__(self
, name
=None, asmcode
=True):
63 Decode2ToOperand
.__init
__(self
, name
=name
)
66 self
.asmcode
= Signal(8, reset_less
=True) # only for simulator
67 self
.nia
= Signal(64, reset_less
=True)
68 self
.write_reg
= Data(5, name
="rego")
69 self
.write_ea
= Data(5, name
="ea") # for LD/ST in update mode
70 self
.read_reg1
= Data(5, name
="reg1")
71 self
.read_reg2
= Data(5, name
="reg2")
72 self
.read_reg3
= Data(5, name
="reg3")
73 self
.write_spr
= Data(SPR
, name
="spro")
74 self
.read_spr1
= Data(SPR
, name
="spr1")
75 #self.read_spr2 = Data(SPR, name="spr2") # only one needed
77 self
.read_fast1
= Data(3, name
="fast1")
78 self
.read_fast2
= Data(3, name
="fast2")
79 self
.write_fast1
= Data(3, name
="fasto1")
80 self
.write_fast2
= Data(3, name
="fasto2")
82 self
.read_cr1
= Data(3, name
="cr_in1")
83 self
.read_cr2
= Data(3, name
="cr_in2")
84 self
.read_cr3
= Data(3, name
="cr_in2")
85 self
.read_cr_whole
= Signal(reset_less
=True)
86 self
.write_cr
= Data(3, name
="cr_out")
87 self
.write_cr_whole
= Signal(reset_less
=True)