+"""
+Links:
+* https://libre-soc.org/3d_gpu/architecture/regfile/ section on regspecs
+"""
from nmigen import Signal, Const
from ieee754.fpcommon.getop import FPPipeContext
-from soc.fu.pipe_data import IntegerData
-from nmutil.dynamicpipe import SimpleHandshakeRedir
-from soc.fu.alu.alu_input_record import CompALUOpSubset # TODO: replace
+from soc.fu.pipe_data import IntegerData, CommonPipeSpec
+from soc.fu.cr.cr_input_record import CompCROpSubset
+from soc.decoder.power_decoder2 import Data
class CRInputData(IntegerData):
- regspec = [('INT', 'a', '0:63'),
- ('CR', 'cr', '32')]
+ regspec = [('INT', 'a', '0:63'), # 64 bit range
+ ('INT', 'b', '0:63'), # 6B bit range
+ ('CR', 'full_cr', '0:31'), # 32 bit range
+ ('CR', 'cr_a', '0:3'), # 4 bit range
+ ('CR', 'cr_b', '0:3'), # 4 bit range
+ ('CR', 'cr_c', '0:3')] # 4 bit range
def __init__(self, pspec):
super().__init__(pspec)
self.a = Signal(64, reset_less=True) # RA
- self.cr = Signal(32, reset_less=True) # CR in
+ self.b = Signal(64, reset_less=True) # RB
+ self.full_cr = Signal(32, reset_less=True) # full CR in
+ self.cr_a = Signal(4, reset_less=True)
+ self.cr_b = Signal(4, reset_less=True)
+ self.cr_c = Signal(4, reset_less=True) # needed for CR_OP partial update
def __iter__(self):
yield from super().__iter__()
yield self.a
- yield self.cr
+ yield self.b
+ yield self.full_cr
+ yield self.cr_a
+ yield self.cr_b
+ yield self.cr_c
def eq(self, i):
lst = super().eq(i)
return lst + [self.a.eq(i.a),
- self.cr.eq(i.cr)]
+ self.b.eq(i.b),
+ self.full_cr.eq(i.full_cr),
+ self.cr_a.eq(i.cr_a),
+ self.cr_b.eq(i.cr_b),
+ self.cr_c.eq(i.cr_c)]
+
class CROutputData(IntegerData):
- regspec = [('INT', 'o', '0:63'),
- ('CR', 'cr', '32')]
+ regspec = [('INT', 'o', '0:63'), # 64 bit range
+ ('CR', 'full_cr', '0:31'), # 32 bit range
+ ('CR', 'cr', '0:3')] # 4 bit range
def __init__(self, pspec):
super().__init__(pspec)
- self.o = Signal(64, reset_less=True) # RA
- self.cr = Signal(32, reset_less=True, name="cr_out") # CR in
+ self.o = Data(64, name="o") # RA
+ self.full_cr = Data(32, name="cr_out") # CR in
+ self.cr = Data(4, name="cr_o")
def __iter__(self):
yield from super().__iter__()
yield self.o
+ yield self.full_cr
yield self.cr
def eq(self, i):
lst = super().eq(i)
return lst + [self.o.eq(i.o),
+ self.full_cr.eq(i.full_cr),
self.cr.eq(i.cr)]
-# TODO: replace CompALUOpSubset with CompCROpSubset
-class CRPipeSpec:
+
+class CRPipeSpec(CommonPipeSpec):
regspec = (CRInputData.regspec, CROutputData.regspec)
- opsubsetkls = CompALUOpSubset
- def __init__(self, id_wid, op_wid):
- self.id_wid = id_wid
- self.op_wid = op_wid
- self.opkls = lambda _: self.opsubsetkls(name="op")
- self.stage = None
- self.pipekls = SimpleHandshakeRedir
+ opsubsetkls = CompCROpSubset