add register specs to pipeline in/out so that they can be used to connect up
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 20 May 2020 18:10:53 +0000 (19:10 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 20 May 2020 18:10:53 +0000 (19:10 +0100)
Function Units to regfiles

src/soc/fu/alu/pipe_data.py
src/soc/fu/branch/pipe_data.py
src/soc/fu/cr/pipe_data.py
src/soc/fu/logical/pipe_data.py
src/soc/fu/shift_rot/pipe_data.py
src/soc/fu/trap/pipe_data.py

index 0d299ef477e987d466d5e5fcda0e3e6cc836b39a..3d64de891870a2580a3cbd5a34484d2ade10b93d 100644 (file)
@@ -21,6 +21,10 @@ class IntegerData:
 
 
 class ALUInputData(IntegerData):
+    regspec = [('INT', 'a', '0:63'),
+               ('INT', 'b', '0:63'),
+               ('XER', 'xer_so', '32'),
+               ('XER', 'xer_ca', '34,45')]
     def __init__(self, pspec):
         super().__init__(pspec)
         self.a = Signal(64, reset_less=True) # RA
@@ -47,6 +51,11 @@ class ALUInputData(IntegerData):
 # https://bugs.libre-soc.org/show_bug.cgi?id=305#c19
 
 class ALUOutputData(IntegerData):
+    regspec = [('INT', 'o', '0:63'),
+               ('CR', 'cr0', '0:3'),
+               ('XER', 'xer_ca', '34,45'),
+               ('XER', 'xer_ov', '33,44'),
+               ('XER', 'xer_so', '32')]
     def __init__(self, pspec):
         super().__init__(pspec)
         self.o = Signal(64, reset_less=True, name="stage_o")
index 2772236eb61403fef7f64c894d29031d4b12b4e1..05d3a931c2024521acdc0e7163937481f20bfcf8 100644 (file)
@@ -30,6 +30,10 @@ from soc.fu.alu.pipe_data import IntegerData
 
 
 class BranchInputData(IntegerData):
+    regspec = [('SPR', 'spr1', '0:63'),
+               ('SPR', 'spr2', '0:63'),
+               ('CR', 'cr', '32'),
+               ('PC', 'cia', '0:63')]
     def __init__(self, pspec):
         super().__init__(pspec)
         # Note: for OP_BCREG, SPR1 will either be CTR, LR, or TAR
@@ -59,6 +63,9 @@ class BranchInputData(IntegerData):
 
 
 class BranchOutputData(IntegerData):
+    regspec = [('SPR', 'spr1', '0:63'),
+               ('SPR', 'spr2', '0:63'),
+               ('PC', 'cia', '0:63')]
     def __init__(self, pspec):
         super().__init__(pspec)
         self.spr1 = Data(64, name="spr1")
index 107a340e37211b73ac559bb1fb590058d08d302c..2b240263ab0cc9badbbeaa4e180cfba382c7bdb2 100644 (file)
@@ -4,10 +4,12 @@ from soc.fu.alu.pipe_data import IntegerData
 
 
 class CRInputData(IntegerData):
+    regspec = [('INT', 'a', '0:63'),
+               ('CR', 'cr', '32')]
     def __init__(self, pspec):
         super().__init__(pspec)
         self.a = Signal(64, reset_less=True) # RA
-        self.cr = Signal(64, reset_less=True) # CR in
+        self.cr = Signal(32, reset_less=True) # CR in
 
     def __iter__(self):
         yield from super().__iter__()
@@ -20,10 +22,12 @@ class CRInputData(IntegerData):
                       self.cr.eq(i.cr)]
 
 class CROutputData(IntegerData):
+    regspec = [('INT', 'o', '0:63'),
+               ('CR', 'cr', '32')]
     def __init__(self, pspec):
         super().__init__(pspec)
         self.o = Signal(64, reset_less=True) # RA
-        self.cr = Signal(64, reset_less=True) # CR in
+        self.cr = Signal(32, reset_less=True) # CR in
 
     def __iter__(self):
         yield from super().__iter__()
index aed7868977d08e06aaaadf9cca38b19036153d1d..9ed7252f4c36715b0f061c83e575086bfeb482d9 100644 (file)
@@ -4,6 +4,10 @@ from soc.fu.alu.pipe_data import IntegerData
 
 
 class LogicalInputData(IntegerData):
+    regspec = [('INT', 'a', '0:63'),
+               ('INT', 'rb', '0:63'),
+               ('XER', 'xer_so', '32'),
+               ('XER', 'xer_ca', '34,45')]
     def __init__(self, pspec):
         super().__init__(pspec)
         self.a = Signal(64, reset_less=True) # RA
index 0c0e6cab54db84a05bce85ae1b8bc1276540c3b8..eed4dffe4d37787863c57213154df910a33914f6 100644 (file)
@@ -6,6 +6,11 @@ from soc.fu.alu.pipe_data import IntegerData
 
 
 class ShiftRotInputData(IntegerData):
+    regspec = [('INT', 'ra', '0:63'),
+               ('INT', 'rs', '0:63'),
+               ('INT', 'rb', '0:63'),
+               ('XER', 'xer_so', '32'),
+               ('XER', 'xer_ca', '34,45')]
     def __init__(self, pspec):
         super().__init__(pspec)
         self.ra = Signal(64, reset_less=True) # RA
index ebe34fd64118517975f5903cbe23cd0f8eacd71e..033f7bb184f1375d31aa221b4eeb55cc0493fdd4 100644 (file)
@@ -5,6 +5,10 @@ from soc.decoder.power_decoder2 import Data
 
 
 class TrapInputData(IntegerData):
+    regspec = [('INT', 'a', '0:63'),
+               ('INT', 'b', '0:63'),
+               ('PC', 'cia', '0:63'),
+               ('MSR', 'msr', '0:63')]
     def __init__(self, pspec):
         super().__init__(pspec)
         self.a = Signal(64, reset_less=True)  # RA
@@ -26,12 +30,16 @@ class TrapInputData(IntegerData):
 
 
 class TrapOutputData(IntegerData):
+    regspec = [('SPR', 'srr0', '0:63'),
+               ('SPR', 'srr1', '0:63'),
+               ('PC', 'nia', '0:63'),
+               ('MSR', 'msr', '0:63')]
     def __init__(self, pspec):
         super().__init__(pspec)
-        self.nia = Data(64, name="nia") # NIA (Next PC)
-        self.msr = Signal(64, reset_less=True) # MSR
         self.srr0 = Data(64, name="srr0") # SRR0 SPR
         self.srr1 = Data(64, name="srr1") # SRR1 SPR
+        self.nia = Data(64, name="nia") # NIA (Next PC)
+        self.msr = Signal(64, reset_less=True) # MSR
 
     def __iter__(self):
         yield from super().__iter__()