40071b3435958d4f5aaa56453aea7201e21e15ea
1 """Power ISA Decoder second stage
3 based on Anton Blanchard microwatt decode2.vhdl
6 from nmigen
import Module
, Elaboratable
, Signal
, Mux
, Const
, Cat
, Repl
, Record
7 from nmigen
.cli
import rtlil
9 from nmutil
.iocontrol
import RecordObject
10 from nmutil
.extend
import exts
12 from soc
.decoder
.power_decoder
import create_pdecode
13 from soc
.decoder
.power_enums
import (InternalOp
, CryIn
, Function
,
15 LdstLen
, In1Sel
, In2Sel
, In3Sel
,
18 from soc
.regfile
.regfiles
import FastRegs
20 class DecodeA(Elaboratable
):
21 """DecodeA from instruction
23 decodes register RA, whether immediate-zero, implicit and
27 def __init__(self
, dec
):
29 self
.sel_in
= Signal(In1Sel
, reset_less
=True)
30 self
.insn_in
= Signal(32, reset_less
=True)
31 self
.reg_out
= Data(5, name
="reg_a")
32 self
.immz_out
= Signal(reset_less
=True)
33 self
.spr_out
= Data(10, "spr_a")
34 self
.fast_out
= Data(3, "fast_a")
36 def elaborate(self
, platform
):
40 # select Register A field
41 ra
= Signal(5, reset_less
=True)
42 comb
+= ra
.eq(self
.dec
.RA
)
43 with m
.If((self
.sel_in
== In1Sel
.RA
) |
44 ((self
.sel_in
== In1Sel
.RA_OR_ZERO
) &
45 (ra
!= Const(0, 5)))):
46 comb
+= self
.reg_out
.data
.eq(ra
)
47 comb
+= self
.reg_out
.ok
.eq(1)
49 # zero immediate requested
50 with m
.If((self
.sel_in
== In1Sel
.RA_OR_ZERO
) &
51 (self
.reg_out
.data
== Const(0, 5))):
52 comb
+= self
.immz_out
.eq(1)
54 # some Logic/ALU ops have RS as the 3rd arg, but no "RA".
55 with m
.If(self
.sel_in
== In1Sel
.RS
):
56 comb
+= self
.reg_out
.data
.eq(self
.dec
.RS
)
57 comb
+= self
.reg_out
.ok
.eq(1)
59 # decode Fast-SPR based on instruction type
61 # BC or BCREG: potential implicit register (CTR) NOTE: same in DecodeOut
62 with m
.If((op
.internal_op
== InternalOp
.OP_BC
) |
63 (op
.internal_op
== InternalOp
.OP_BCREG
)):
64 with m
.If(~self
.dec
.BO
[2]): # 3.0B p38 BO2=0, use CTR reg
65 comb
+= self
.fast_out
.data
.eq(FastRegs
.CTR
) # constant: CTR
66 comb
+= self
.fast_out
.ok
.eq(1)
68 # MFSPR or MTSPR: move-from / move-to SPRs
69 with m
.If((op
.internal_op
== InternalOp
.OP_MFSPR
) |
70 (op
.internal_op
== InternalOp
.OP_MTSPR
)):
71 # XXX TODO: fast/slow SPR decoding and mapping
72 comb
+= self
.spr_out
.data
.eq(self
.dec
.SPR
) # SPR field, XFX
73 comb
+= self
.spr_out
.ok
.eq(1)
80 def __init__(self
, width
, name
):
81 name_ok
= "%s_ok" % name
82 layout
= ((name
, width
), (name_ok
, 1))
83 Record
.__init
__(self
, layout
)
84 self
.data
= getattr(self
, name
) # convenience
85 self
.ok
= getattr(self
, name_ok
) # convenience
86 self
.data
.reset_less
= True # grrr
87 self
.reset_less
= True # grrr
90 return [self
.data
, self
.ok
]
93 class DecodeB(Elaboratable
):
94 """DecodeB from instruction
96 decodes register RB, different forms of immediate (signed, unsigned),
97 and implicit SPRs. register B is basically "lane 2" into the CompUnits.
98 by industry-standard convention, "lane 2" is where fully-decoded
99 immediates are muxed in.
102 def __init__(self
, dec
):
104 self
.sel_in
= Signal(In2Sel
, reset_less
=True)
105 self
.insn_in
= Signal(32, reset_less
=True)
106 self
.reg_out
= Data(5, "reg_b")
107 self
.imm_out
= Data(64, "imm_b")
108 self
.fast_out
= Data(3, "fast_b")
110 def elaborate(self
, platform
):
114 # select Register B field
115 with m
.Switch(self
.sel_in
):
116 with m
.Case(In2Sel
.RB
):
117 comb
+= self
.reg_out
.data
.eq(self
.dec
.RB
)
118 comb
+= self
.reg_out
.ok
.eq(1)
119 with m
.Case(In2Sel
.RS
):
120 comb
+= self
.reg_out
.data
.eq(self
.dec
.RS
) # for M-Form shiftrot
121 comb
+= self
.reg_out
.ok
.eq(1)
122 with m
.Case(In2Sel
.CONST_UI
):
123 comb
+= self
.imm_out
.data
.eq(self
.dec
.UI
)
124 comb
+= self
.imm_out
.ok
.eq(1)
125 with m
.Case(In2Sel
.CONST_SI
): # TODO: sign-extend here?
126 comb
+= self
.imm_out
.data
.eq(
127 exts(self
.dec
.SI
, 16, 64))
128 comb
+= self
.imm_out
.ok
.eq(1)
129 with m
.Case(In2Sel
.CONST_UI_HI
):
130 comb
+= self
.imm_out
.data
.eq(self
.dec
.UI
<<16)
131 comb
+= self
.imm_out
.ok
.eq(1)
132 with m
.Case(In2Sel
.CONST_SI_HI
): # TODO: sign-extend here?
133 comb
+= self
.imm_out
.data
.eq(self
.dec
.SI
<<16)
134 comb
+= self
.imm_out
.data
.eq(
135 exts(self
.dec
.SI
<< 16, 32, 64))
136 comb
+= self
.imm_out
.ok
.eq(1)
137 with m
.Case(In2Sel
.CONST_LI
):
138 comb
+= self
.imm_out
.data
.eq(self
.dec
.LI
<<2)
139 comb
+= self
.imm_out
.ok
.eq(1)
140 with m
.Case(In2Sel
.CONST_BD
):
141 comb
+= self
.imm_out
.data
.eq(self
.dec
.BD
<<2)
142 comb
+= self
.imm_out
.ok
.eq(1)
143 with m
.Case(In2Sel
.CONST_DS
):
144 comb
+= self
.imm_out
.data
.eq(self
.dec
.DS
<<2)
145 comb
+= self
.imm_out
.ok
.eq(1)
146 with m
.Case(In2Sel
.CONST_M1
):
147 comb
+= self
.imm_out
.data
.eq(~
Const(0, 64)) # all 1s
148 comb
+= self
.imm_out
.ok
.eq(1)
149 with m
.Case(In2Sel
.CONST_SH
):
150 comb
+= self
.imm_out
.data
.eq(self
.dec
.sh
)
151 comb
+= self
.imm_out
.ok
.eq(1)
152 with m
.Case(In2Sel
.CONST_SH32
):
153 comb
+= self
.imm_out
.data
.eq(self
.dec
.SH32
)
154 comb
+= self
.imm_out
.ok
.eq(1)
156 # decode SPR2 based on instruction type
158 # BCREG implicitly uses CTR or LR for 2nd reg
159 with m
.If(op
.internal_op
== InternalOp
.OP_BCREG
):
160 with m
.If(self
.dec
.FormXL
.XO
[9]): # 3.0B p38 top bit of XO
161 comb
+= self
.fast_out
.data
.eq(FastRegs
.CTR
)
163 comb
+= self
.fast_out
.data
.eq(FastRegs
.LR
)
164 comb
+= self
.fast_out
.ok
.eq(1)
169 class DecodeC(Elaboratable
):
170 """DecodeC from instruction
172 decodes register RC. this is "lane 3" into some CompUnits (not many)
175 def __init__(self
, dec
):
177 self
.sel_in
= Signal(In3Sel
, reset_less
=True)
178 self
.insn_in
= Signal(32, reset_less
=True)
179 self
.reg_out
= Data(5, "reg_c")
181 def elaborate(self
, platform
):
185 # select Register C field
186 with m
.Switch(self
.sel_in
):
187 with m
.Case(In3Sel
.RB
):
188 comb
+= self
.reg_out
.data
.eq(self
.dec
.RB
) # for M-Form shiftrot
189 comb
+= self
.reg_out
.ok
.eq(1)
190 with m
.Case(In3Sel
.RS
):
191 comb
+= self
.reg_out
.data
.eq(self
.dec
.RS
)
192 comb
+= self
.reg_out
.ok
.eq(1)
197 class DecodeOut(Elaboratable
):
198 """DecodeOut from instruction
200 decodes output register RA, RT or SPR
203 def __init__(self
, dec
):
205 self
.sel_in
= Signal(OutSel
, reset_less
=True)
206 self
.insn_in
= Signal(32, reset_less
=True)
207 self
.reg_out
= Data(5, "reg_o")
208 self
.spr_out
= Data(10, "spr_o")
209 self
.fast_out
= Data(3, "fast_o")
211 def elaborate(self
, platform
):
215 # select Register out field
216 with m
.Switch(self
.sel_in
):
217 with m
.Case(OutSel
.RT
):
218 comb
+= self
.reg_out
.data
.eq(self
.dec
.RT
)
219 comb
+= self
.reg_out
.ok
.eq(1)
220 with m
.Case(OutSel
.RA
):
221 comb
+= self
.reg_out
.data
.eq(self
.dec
.RA
)
222 comb
+= self
.reg_out
.ok
.eq(1)
223 with m
.Case(OutSel
.SPR
):
224 comb
+= self
.spr_out
.data
.eq(self
.dec
.SPR
) # from XFX
225 comb
+= self
.spr_out
.ok
.eq(1)
227 # BC or BCREG: potential implicit register (CTR) NOTE: same in DecodeA
229 with m
.If((op
.internal_op
== InternalOp
.OP_BC
) |
230 (op
.internal_op
== InternalOp
.OP_BCREG
)):
231 with m
.If(~self
.dec
.BO
[2]): # 3.0B p38 BO2=0, use CTR reg
232 comb
+= self
.fast_out
.data
.eq(FastRegs
.CTR
) # constant: CTR
233 comb
+= self
.fast_out
.ok
.eq(1)
237 class DecodeOut2(Elaboratable
):
238 """DecodeOut2 from instruction
240 decodes output registers
243 def __init__(self
, dec
):
245 self
.sel_in
= Signal(OutSel
, reset_less
=True)
246 self
.insn_in
= Signal(32, reset_less
=True)
247 self
.reg_out
= Data(5, "reg_o")
248 self
.fast_out
= Data(3, "fast_o")
250 def elaborate(self
, platform
):
254 # update mode LD/ST uses read-reg A also as an output
255 with m
.If(self
.dec
.op
.upd
):
256 comb
+= self
.reg_out
.eq(self
.dec
.RA
)
257 comb
+= self
.reg_out
.ok
.eq(1)
259 # BC or BCREG: potential implicit register (LR) output
261 with m
.If((op
.internal_op
== InternalOp
.OP_BC
) |
262 (op
.internal_op
== InternalOp
.OP_BCREG
)):
263 with m
.If(self
.dec
.op
.lk
& self
.dec
.LK
): # "link" mode
264 comb
+= self
.fast_out
.data
.eq(FastRegs
.LR
) # constant: LR
265 comb
+= self
.fast_out
.ok
.eq(1)
270 class DecodeRC(Elaboratable
):
271 """DecodeRc from instruction
273 decodes Record bit Rc
275 def __init__(self
, dec
):
277 self
.sel_in
= Signal(RC
, reset_less
=True)
278 self
.insn_in
= Signal(32, reset_less
=True)
279 self
.rc_out
= Data(1, "rc")
281 def elaborate(self
, platform
):
285 # select Record bit out field
286 with m
.Switch(self
.sel_in
):
288 comb
+= self
.rc_out
.data
.eq(self
.dec
.Rc
)
289 comb
+= self
.rc_out
.ok
.eq(1)
291 comb
+= self
.rc_out
.data
.eq(1)
292 comb
+= self
.rc_out
.ok
.eq(1)
293 with m
.Case(RC
.NONE
):
294 comb
+= self
.rc_out
.data
.eq(0)
295 comb
+= self
.rc_out
.ok
.eq(1)
300 class DecodeOE(Elaboratable
):
301 """DecodeOE from instruction
303 decodes OE field: uses RC decode detection which might not be good
305 -- For now, use "rc" in the decode table to decide whether oe exists.
306 -- This is not entirely correct architecturally: For mulhd and
307 -- mulhdu, the OE field is reserved. It remains to be seen what an
308 -- actual POWER9 does if we set it on those instructions, for now we
309 -- test that further down when assigning to the multiplier oe input.
311 def __init__(self
, dec
):
313 self
.sel_in
= Signal(RC
, reset_less
=True)
314 self
.insn_in
= Signal(32, reset_less
=True)
315 self
.oe_out
= Data(1, "oe")
317 def elaborate(self
, platform
):
321 # select OE bit out field
322 with m
.Switch(self
.sel_in
):
324 comb
+= self
.oe_out
.data
.eq(self
.dec
.OE
)
325 comb
+= self
.oe_out
.ok
.eq(1)
329 class DecodeCRIn(Elaboratable
):
330 """Decodes input CR from instruction
332 CR indices - insn fields - (not the data *in* the CR) require only 3
333 bits because they refer to CR0-CR7
336 def __init__(self
, dec
):
338 self
.sel_in
= Signal(CRInSel
, reset_less
=True)
339 self
.insn_in
= Signal(32, reset_less
=True)
340 self
.cr_bitfield
= Data(3, "cr_bitfield")
341 self
.cr_bitfield_b
= Data(3, "cr_bitfield_b")
342 self
.cr_bitfield_o
= Data(3, "cr_bitfield_o")
343 self
.whole_reg
= Signal(reset_less
=True)
345 def elaborate(self
, platform
):
349 comb
+= self
.cr_bitfield
.ok
.eq(0)
350 comb
+= self
.cr_bitfield_b
.ok
.eq(0)
351 comb
+= self
.whole_reg
.eq(0)
352 with m
.Switch(self
.sel_in
):
353 with m
.Case(CRInSel
.NONE
):
354 pass # No bitfield activated
355 with m
.Case(CRInSel
.CR0
):
356 comb
+= self
.cr_bitfield
.data
.eq(0)
357 comb
+= self
.cr_bitfield
.ok
.eq(1)
358 with m
.Case(CRInSel
.BI
):
359 comb
+= self
.cr_bitfield
.data
.eq(self
.dec
.BI
[2:5])
360 comb
+= self
.cr_bitfield
.ok
.eq(1)
361 with m
.Case(CRInSel
.BFA
):
362 comb
+= self
.cr_bitfield
.data
.eq(self
.dec
.FormX
.BFA
)
363 comb
+= self
.cr_bitfield
.ok
.eq(1)
364 with m
.Case(CRInSel
.BA_BB
):
365 comb
+= self
.cr_bitfield
.data
.eq(self
.dec
.BA
[2:5])
366 comb
+= self
.cr_bitfield
.ok
.eq(1)
367 comb
+= self
.cr_bitfield_b
.data
.eq(self
.dec
.BB
[2:5])
368 comb
+= self
.cr_bitfield_b
.ok
.eq(1)
369 comb
+= self
.cr_bitfield_o
.data
.eq(self
.dec
.BT
[2:5])
370 comb
+= self
.cr_bitfield_o
.ok
.eq(1)
371 with m
.Case(CRInSel
.BC
):
372 comb
+= self
.cr_bitfield
.data
.eq(self
.dec
.BC
[2:5])
373 comb
+= self
.cr_bitfield
.ok
.eq(1)
374 with m
.Case(CRInSel
.WHOLE_REG
):
375 comb
+= self
.whole_reg
.eq(1)
380 class DecodeCROut(Elaboratable
):
381 """Decodes input CR from instruction
383 CR indices - insn fields - (not the data *in* the CR) require only 3
384 bits because they refer to CR0-CR7
387 def __init__(self
, dec
):
389 self
.rc_in
= Signal(reset_less
=True)
390 self
.sel_in
= Signal(CROutSel
, reset_less
=True)
391 self
.insn_in
= Signal(32, reset_less
=True)
392 self
.cr_bitfield
= Data(3, "cr_bitfield")
393 self
.whole_reg
= Signal(reset_less
=True)
395 def elaborate(self
, platform
):
399 comb
+= self
.cr_bitfield
.ok
.eq(0)
400 comb
+= self
.whole_reg
.eq(0)
401 with m
.Switch(self
.sel_in
):
402 with m
.Case(CROutSel
.NONE
):
403 pass # No bitfield activated
404 with m
.Case(CROutSel
.CR0
):
405 comb
+= self
.cr_bitfield
.data
.eq(0)
406 comb
+= self
.cr_bitfield
.ok
.eq(self
.rc_in
) # only when RC=1
407 with m
.Case(CROutSel
.BF
):
408 comb
+= self
.cr_bitfield
.data
.eq(self
.dec
.FormX
.BF
[0:-1])
409 comb
+= self
.cr_bitfield
.ok
.eq(1)
410 with m
.Case(CROutSel
.BT
):
411 comb
+= self
.cr_bitfield
.data
.eq(self
.dec
.FormXL
.BT
[2:5])
412 comb
+= self
.cr_bitfield
.ok
.eq(1)
413 with m
.Case(CROutSel
.WHOLE_REG
):
414 comb
+= self
.whole_reg
.eq(1)
421 self
.ca
= Signal(2, reset_less
=True)
422 self
.ov
= Signal(2, reset_less
=True)
423 self
.so
= Signal(reset_less
=True)
426 return [self
.ca
, self
.ov
, self
.so
]
429 class Decode2ToExecute1Type(RecordObject
):
431 def __init__(self
, name
=None):
433 RecordObject
.__init
__(self
, name
=name
)
435 self
.valid
= Signal(reset_less
=True)
436 self
.insn_type
= Signal(InternalOp
, reset_less
=True)
437 self
.fn_unit
= Signal(Function
, reset_less
=True)
438 self
.nia
= Signal(64, reset_less
=True)
439 self
.write_reg
= Data(5, name
="rego")
440 self
.write_ea
= Data(5, name
="ea") # for LD/ST in update mode
441 self
.read_reg1
= Data(5, name
="reg1")
442 self
.read_reg2
= Data(5, name
="reg2")
443 self
.read_reg3
= Data(5, name
="reg3")
444 self
.imm_data
= Data(64, name
="imm")
445 self
.write_spr
= Data(10, name
="spro")
446 self
.read_spr1
= Data(10, name
="spr1")
447 self
.read_spr2
= Data(10, name
="spr2")
449 self
.read_fast1
= Data(3, name
="fast1")
450 self
.read_fast2
= Data(3, name
="fast2")
451 self
.write_fast1
= Data(3, name
="fasto1")
452 self
.write_fast2
= Data(3, name
="fasto2")
454 self
.read_cr1
= Data(3, name
="cr_in1")
455 self
.read_cr2
= Data(3, name
="cr_in2")
456 self
.read_cr3
= Data(3, name
="cr_in2")
457 self
.read_cr_whole
= Signal(reset_less
=True)
458 self
.write_cr
= Data(3, name
="cr_out")
459 self
.write_cr_whole
= Signal(reset_less
=True)
460 self
.lk
= Signal(reset_less
=True)
461 self
.rc
= Data(1, "rc")
462 self
.oe
= Data(1, "oe")
463 self
.invert_a
= Signal(reset_less
=True)
464 self
.zero_a
= Signal(reset_less
=True)
465 self
.invert_out
= Signal(reset_less
=True)
466 self
.input_carry
= Signal(CryIn
, reset_less
=True)
467 self
.output_carry
= Signal(reset_less
=True)
468 self
.input_cr
= Signal(reset_less
=True) # instr. has a CR as input
469 self
.output_cr
= Signal(reset_less
=True) # instr. has a CR as output
470 self
.is_32bit
= Signal(reset_less
=True)
471 self
.is_signed
= Signal(reset_less
=True)
472 self
.insn
= Signal(32, reset_less
=True)
473 self
.data_len
= Signal(4, reset_less
=True) # bytes
474 self
.byte_reverse
= Signal(reset_less
=True)
475 self
.sign_extend
= Signal(reset_less
=True)# do we need this?
476 self
.update
= Signal(reset_less
=True) # LD/ST is "update" variant
479 class PowerDecode2(Elaboratable
):
481 def __init__(self
, dec
):
484 self
.e
= Decode2ToExecute1Type()
487 return self
.dec
.ports() + self
.e
.ports()
489 def elaborate(self
, platform
):
493 # set up submodule decoders
494 m
.submodules
.dec
= self
.dec
495 m
.submodules
.dec_a
= dec_a
= DecodeA(self
.dec
)
496 m
.submodules
.dec_b
= dec_b
= DecodeB(self
.dec
)
497 m
.submodules
.dec_c
= dec_c
= DecodeC(self
.dec
)
498 m
.submodules
.dec_o
= dec_o
= DecodeOut(self
.dec
)
499 m
.submodules
.dec_o2
= dec_o2
= DecodeOut2(self
.dec
)
500 m
.submodules
.dec_rc
= dec_rc
= DecodeRC(self
.dec
)
501 m
.submodules
.dec_oe
= dec_oe
= DecodeOE(self
.dec
)
502 m
.submodules
.dec_cr_in
= dec_cr_in
= DecodeCRIn(self
.dec
)
503 m
.submodules
.dec_cr_out
= dec_cr_out
= DecodeCROut(self
.dec
)
505 # copy instruction through...
506 for i
in [self
.e
.insn
, dec_a
.insn_in
, dec_b
.insn_in
,
507 dec_c
.insn_in
, dec_o
.insn_in
, dec_o2
.insn_in
, dec_rc
.insn_in
,
508 dec_oe
.insn_in
, dec_cr_in
.insn_in
, dec_cr_out
.insn_in
]:
509 comb
+= i
.eq(self
.dec
.opcode_in
)
511 # ...and subdecoders' input fields
512 comb
+= dec_a
.sel_in
.eq(self
.dec
.op
.in1_sel
)
513 comb
+= dec_b
.sel_in
.eq(self
.dec
.op
.in2_sel
)
514 comb
+= dec_c
.sel_in
.eq(self
.dec
.op
.in3_sel
)
515 comb
+= dec_o
.sel_in
.eq(self
.dec
.op
.out_sel
)
516 comb
+= dec_o2
.sel_in
.eq(self
.dec
.op
.out_sel
)
517 comb
+= dec_rc
.sel_in
.eq(self
.dec
.op
.rc_sel
)
518 comb
+= dec_oe
.sel_in
.eq(self
.dec
.op
.rc_sel
) # XXX should be OE sel
519 comb
+= dec_cr_in
.sel_in
.eq(self
.dec
.op
.cr_in
)
520 comb
+= dec_cr_out
.sel_in
.eq(self
.dec
.op
.cr_out
)
521 comb
+= dec_cr_out
.rc_in
.eq(dec_rc
.rc_out
.data
)
523 # decode LD/ST length
524 with m
.Switch(self
.dec
.op
.ldst_len
):
525 with m
.Case(LdstLen
.is1B
):
526 comb
+= self
.e
.data_len
.eq(1)
527 with m
.Case(LdstLen
.is2B
):
528 comb
+= self
.e
.data_len
.eq(2)
529 with m
.Case(LdstLen
.is4B
):
530 comb
+= self
.e
.data_len
.eq(4)
531 with m
.Case(LdstLen
.is8B
):
532 comb
+= self
.e
.data_len
.eq(8)
534 comb
+= self
.e
.nia
.eq(0) # XXX TODO
535 comb
+= self
.e
.valid
.eq(0) # XXX TODO
536 fu
= self
.dec
.op
.function_unit
537 itype
= Mux(fu
== Function
.NONE
,
538 InternalOp
.OP_ILLEGAL
,
539 self
.dec
.op
.internal_op
)
540 comb
+= self
.e
.insn_type
.eq(itype
)
541 comb
+= self
.e
.fn_unit
.eq(fu
)
543 # registers a, b, c and out and out2 (LD/ST EA)
544 comb
+= self
.e
.read_reg1
.eq(dec_a
.reg_out
)
545 comb
+= self
.e
.read_reg2
.eq(dec_b
.reg_out
)
546 comb
+= self
.e
.read_reg3
.eq(dec_c
.reg_out
)
547 comb
+= self
.e
.write_reg
.eq(dec_o
.reg_out
)
548 comb
+= self
.e
.write_ea
.eq(dec_o2
.reg_out
)
549 comb
+= self
.e
.imm_data
.eq(dec_b
.imm_out
) # immediate in RB (usually)
550 comb
+= self
.e
.zero_a
.eq(dec_a
.immz_out
) # RA==0 detected
553 comb
+= self
.e
.rc
.eq(dec_rc
.rc_out
)
554 comb
+= self
.e
.oe
.eq(dec_oe
.oe_out
)
557 comb
+= self
.e
.read_spr1
.eq(dec_a
.spr_out
)
558 comb
+= self
.e
.write_spr
.eq(dec_o
.spr_out
)
561 comb
+= self
.e
.read_fast1
.eq(dec_a
.fast_out
)
562 comb
+= self
.e
.read_fast2
.eq(dec_b
.fast_out
)
563 comb
+= self
.e
.write_fast1
.eq(dec_o
.fast_out
)
564 comb
+= self
.e
.write_fast2
.eq(dec_o2
.fast_out
)
566 comb
+= self
.e
.read_cr1
.eq(dec_cr_in
.cr_bitfield
)
567 comb
+= self
.e
.read_cr2
.eq(dec_cr_in
.cr_bitfield_b
)
568 comb
+= self
.e
.read_cr3
.eq(dec_cr_in
.cr_bitfield_o
)
569 comb
+= self
.e
.read_cr_whole
.eq(dec_cr_in
.whole_reg
)
571 comb
+= self
.e
.write_cr
.eq(dec_cr_out
.cr_bitfield
)
572 comb
+= self
.e
.write_cr_whole
.eq(dec_cr_out
.whole_reg
)
574 # decoded/selected instruction flags
575 comb
+= self
.e
.invert_a
.eq(self
.dec
.op
.inv_a
)
576 comb
+= self
.e
.invert_out
.eq(self
.dec
.op
.inv_out
)
577 comb
+= self
.e
.input_carry
.eq(self
.dec
.op
.cry_in
) # carry comes in
578 comb
+= self
.e
.output_carry
.eq(self
.dec
.op
.cry_out
) # carry goes out
579 comb
+= self
.e
.is_32bit
.eq(self
.dec
.op
.is_32b
)
580 comb
+= self
.e
.is_signed
.eq(self
.dec
.op
.sgn
)
581 with m
.If(self
.dec
.op
.lk
):
582 comb
+= self
.e
.lk
.eq(self
.dec
.LK
) # XXX TODO: accessor
584 comb
+= self
.e
.byte_reverse
.eq(self
.dec
.op
.br
)
585 comb
+= self
.e
.sign_extend
.eq(self
.dec
.op
.sgn_ext
)
586 comb
+= self
.e
.update
.eq(self
.dec
.op
.upd
) # LD/ST "update" mode.
589 # These should be removed eventually
590 comb
+= self
.e
.input_cr
.eq(self
.dec
.op
.cr_in
) # condition reg comes in
591 comb
+= self
.e
.output_cr
.eq(self
.dec
.op
.cr_out
) # condition reg goes in
597 if __name__
== '__main__':
598 pdecode
= create_pdecode()
599 dec2
= PowerDecode2(pdecode
)
600 vl
= rtlil
.convert(dec2
, ports
=dec2
.ports() + pdecode
.ports())
601 with
open("dec2.il", "w") as f
: