40071b3435958d4f5aaa56453aea7201e21e15ea
[soc.git] / src / soc / decoder / power_decoder2.py
1 """Power ISA Decoder second stage
2
3 based on Anton Blanchard microwatt decode2.vhdl
4
5 """
6 from nmigen import Module, Elaboratable, Signal, Mux, Const, Cat, Repl, Record
7 from nmigen.cli import rtlil
8
9 from nmutil.iocontrol import RecordObject
10 from nmutil.extend import exts
11
12 from soc.decoder.power_decoder import create_pdecode
13 from soc.decoder.power_enums import (InternalOp, CryIn, Function,
14 CRInSel, CROutSel,
15 LdstLen, In1Sel, In2Sel, In3Sel,
16 OutSel, SPR, RC)
17
18 from soc.regfile.regfiles import FastRegs
19
20 class DecodeA(Elaboratable):
21 """DecodeA from instruction
22
23 decodes register RA, whether immediate-zero, implicit and
24 explicit CSRs
25 """
26
27 def __init__(self, dec):
28 self.dec = 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")
35
36 def elaborate(self, platform):
37 m = Module()
38 comb = m.d.comb
39
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)
48
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)
53
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)
58
59 # decode Fast-SPR based on instruction type
60 op = self.dec.op
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)
67
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)
74
75 return m
76
77
78 class Data(Record):
79
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
88
89 def ports(self):
90 return [self.data, self.ok]
91
92
93 class DecodeB(Elaboratable):
94 """DecodeB from instruction
95
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.
100 """
101
102 def __init__(self, dec):
103 self.dec = 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")
109
110 def elaborate(self, platform):
111 m = Module()
112 comb = m.d.comb
113
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)
155
156 # decode SPR2 based on instruction type
157 op = self.dec.op
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)
162 with m.Else():
163 comb += self.fast_out.data.eq(FastRegs.LR)
164 comb += self.fast_out.ok.eq(1)
165
166 return m
167
168
169 class DecodeC(Elaboratable):
170 """DecodeC from instruction
171
172 decodes register RC. this is "lane 3" into some CompUnits (not many)
173 """
174
175 def __init__(self, dec):
176 self.dec = 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")
180
181 def elaborate(self, platform):
182 m = Module()
183 comb = m.d.comb
184
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)
193
194 return m
195
196
197 class DecodeOut(Elaboratable):
198 """DecodeOut from instruction
199
200 decodes output register RA, RT or SPR
201 """
202
203 def __init__(self, dec):
204 self.dec = 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")
210
211 def elaborate(self, platform):
212 m = Module()
213 comb = m.d.comb
214
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)
226
227 # BC or BCREG: potential implicit register (CTR) NOTE: same in DecodeA
228 op = self.dec.op
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)
234 return m
235
236
237 class DecodeOut2(Elaboratable):
238 """DecodeOut2 from instruction
239
240 decodes output registers
241 """
242
243 def __init__(self, dec):
244 self.dec = 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")
249
250 def elaborate(self, platform):
251 m = Module()
252 comb = m.d.comb
253
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)
258
259 # BC or BCREG: potential implicit register (LR) output
260 op = self.dec.op
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)
266
267 return m
268
269
270 class DecodeRC(Elaboratable):
271 """DecodeRc from instruction
272
273 decodes Record bit Rc
274 """
275 def __init__(self, dec):
276 self.dec = 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")
280
281 def elaborate(self, platform):
282 m = Module()
283 comb = m.d.comb
284
285 # select Record bit out field
286 with m.Switch(self.sel_in):
287 with m.Case(RC.RC):
288 comb += self.rc_out.data.eq(self.dec.Rc)
289 comb += self.rc_out.ok.eq(1)
290 with m.Case(RC.ONE):
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)
296
297 return m
298
299
300 class DecodeOE(Elaboratable):
301 """DecodeOE from instruction
302
303 decodes OE field: uses RC decode detection which might not be good
304
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.
310 """
311 def __init__(self, dec):
312 self.dec = 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")
316
317 def elaborate(self, platform):
318 m = Module()
319 comb = m.d.comb
320
321 # select OE bit out field
322 with m.Switch(self.sel_in):
323 with m.Case(RC.RC):
324 comb += self.oe_out.data.eq(self.dec.OE)
325 comb += self.oe_out.ok.eq(1)
326
327 return m
328
329 class DecodeCRIn(Elaboratable):
330 """Decodes input CR from instruction
331
332 CR indices - insn fields - (not the data *in* the CR) require only 3
333 bits because they refer to CR0-CR7
334 """
335
336 def __init__(self, dec):
337 self.dec = 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)
344
345 def elaborate(self, platform):
346 m = Module()
347 comb = m.d.comb
348
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)
376
377 return m
378
379
380 class DecodeCROut(Elaboratable):
381 """Decodes input CR from instruction
382
383 CR indices - insn fields - (not the data *in* the CR) require only 3
384 bits because they refer to CR0-CR7
385 """
386
387 def __init__(self, dec):
388 self.dec = 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)
394
395 def elaborate(self, platform):
396 m = Module()
397 comb = m.d.comb
398
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)
415
416 return m
417
418
419 class XerBits:
420 def __init__(self):
421 self.ca = Signal(2, reset_less=True)
422 self.ov = Signal(2, reset_less=True)
423 self.so = Signal(reset_less=True)
424
425 def ports(self):
426 return [self.ca, self.ov, self.so]
427
428
429 class Decode2ToExecute1Type(RecordObject):
430
431 def __init__(self, name=None):
432
433 RecordObject.__init__(self, name=name)
434
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")
448
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")
453
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
477
478
479 class PowerDecode2(Elaboratable):
480
481 def __init__(self, dec):
482
483 self.dec = dec
484 self.e = Decode2ToExecute1Type()
485
486 def ports(self):
487 return self.dec.ports() + self.e.ports()
488
489 def elaborate(self, platform):
490 m = Module()
491 comb = m.d.comb
492
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)
504
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)
510
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)
522
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)
533
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)
542
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
551
552 # rc and oe out
553 comb += self.e.rc.eq(dec_rc.rc_out)
554 comb += self.e.oe.eq(dec_oe.oe_out)
555
556 # SPRs out
557 comb += self.e.read_spr1.eq(dec_a.spr_out)
558 comb += self.e.write_spr.eq(dec_o.spr_out)
559
560 # Fast regs 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)
565
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)
570
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)
573
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
583
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.
587
588
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
592
593
594 return m
595
596
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:
602 f.write(vl)
603