3 functions for the relationship between regspecs and Decode2Execute1Type
5 these functions encodes the understanding (relationship) between
6 Regfiles, Computation Units, and the Power ISA Decoder (PowerDecoder2).
8 based on the regspec, which contains the register file name and register
9 name, return a tuple of:
11 * how the decoder should determine whether the Function Unit needs
12 access to a given Regport or not
13 * which Regfile number on that port should be read to get that data
14 * when it comes to writing: likewise, which Regfile num should be written
16 Note that some of the port numbering encoding is *unary*. in the case
17 of "Full Condition Register", it's a full 8-bit mask of read/write-enables.
18 This actually matches directly with the XFX field in MTCR, and at
19 some point that 8-bit mask from the instruction could actually be passed directly through to full_cr (TODO).
21 For the INT and CR numbering, these are expressed in binary in the
22 instruction (note however that XFX in MTCR is unary-masked!)
24 XER is implicitly-encoded based on whether the operation has carry or
27 FAST regfile is, again, implicitly encoded, back in PowerDecode2, based
28 on the type of operation (see DecodeB for an example).
30 The SPR regfile on the other hand is *binary*-encoded, and, furthermore,
32 see https://libre-soc.org/3d_gpu/architecture/regfile/ section on regspecs
34 from nmigen
import Const
35 from soc
.regfile
.regfiles
import XERRegs
, FastRegs
36 from soc
.decoder
.power_enums
import CryIn
39 def regspec_decode_read(e
, regfile
, name
):
40 """regspec_decode_read
44 # Int register numbering is *unary* encoded
46 return e
.read_reg1
.ok
, 1<<e
.read_reg1
.data
48 return e
.read_reg2
.ok
, 1<<e
.read_reg2
.data
50 return e
.read_reg3
.ok
, 1<<e
.read_reg3
.data
53 # CRRegs register numbering is *unary* encoded
54 # *sigh*. numbering inverted on part-CRs. because POWER.
55 if name
== 'full_cr': # full CR
56 return e
.read_cr_whole
, 0b11111111
57 if name
== 'cr_a': # CR A
58 return e
.read_cr1
.ok
, 1<<(7-e
.read_cr1
.data
)
59 if name
== 'cr_b': # CR B
60 return e
.read_cr2
.ok
, 1<<(7-e
.read_cr2
.data
)
61 if name
== 'cr_c': # CR C
62 return e
.read_cr3
.ok
, 1<<(7-e
.read_cr3
.data
)
65 # XERRegs register numbering is *unary* encoded
70 return e
.oe
.oe
[0] & e
.oe
.oe_ok
, SO
72 return e
.oe
.oe
[0] & e
.oe
.oe_ok
, OV
74 return (e
.input_carry
== CryIn
.CA
.value
), CA
77 # FAST register numbering is *unary* encoded
83 SRR0
= 1<<FastRegs
.SRR0
84 SRR1
= 1<<FastRegs
.SRR1
85 if name
in ['cia', 'nia']:
86 return Const(1), PC
# TODO: detect read-conditions
88 return Const(1), MSR
# TODO: detect read-conditions
89 # TODO: remap the SPR numbers to FAST regs
91 return e
.read_fast1
.ok
, 1<<e
.read_fast1
.data
93 return e
.read_fast2
.ok
, 1<<e
.read_fast2
.data
96 assert False, "regfile TODO %s %s" % (regfile
, name
)
97 assert False, "regspec not found %s %s" % (regfile
, name
)
100 def regspec_decode_write(e
, regfile
, name
):
101 """regspec_decode_write
105 # Int register numbering is *unary* encoded
107 return e
.write_reg
, 1<<e
.write_reg
.data
108 if name
== 'o1': # RA (update mode: LD/ST EA)
109 return e
.write_ea
, 1<<e
.write_ea
.data
112 # CRRegs register numbering is *unary* encoded
113 # *sigh*. numbering inverted on part-CRs. because POWER.
114 if name
== 'full_cr': # full CR
115 return e
.write_cr_whole
, 0b11111111
116 if name
== 'cr_a': # CR A
117 return e
.write_cr
, 1<<(7-e
.write_cr
.data
)
120 # XERRegs register numbering is *unary* encoded
125 return None, SO
# hmmm
127 return None, OV
# hmmm
129 return None, CA
# hmmm
131 if regfile
== 'FAST':
132 # FAST register numbering is *unary* encoded
134 MSR
= 1<<FastRegs
.MSR
135 CTR
= 1<<FastRegs
.CTR
137 TAR
= 1<<FastRegs
.TAR
138 SRR0
= 1<<FastRegs
.SRR0
139 SRR1
= 1<<FastRegs
.SRR1
140 if name
in ['cia', 'nia']:
141 return None, PC
# hmmm
143 return None, MSR
# hmmm
144 # TODO: remap the SPR numbers to FAST regs
146 return e
.write_fast1
, 1<<e
.write_fast1
.data
148 return e
.write_fast2
, 1<<e
.write_fast2
.data
151 assert False, "regfile TODO %s %s" % (regfile
, name
)
152 assert False, "regspec not found %s %s" % (regfile
, name
)