add SPR compunit
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sun, 5 Jul 2020 11:18:10 +0000 (12:18 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sun, 5 Jul 2020 11:18:10 +0000 (12:18 +0100)
src/soc/fu/compunits/compunits.py

index 6de63d059dff17e07058c0493547af6897212448..73cc249fc526b1f0ddf3f8c907a0da7c03de8db2 100644 (file)
@@ -16,6 +16,7 @@ Two types exist:
   - CR: not so many needed (perhaps)
   - Branch: one or two of these (depending on speculation run-ahead)
   - Trap: yeah really only one of these
+  - SPR: again, only one.
   - ShiftRot (perhaps not too many of these)
 
 * Multi-cycle (and FSM) Function Units.  these are FUs that can only
@@ -64,6 +65,9 @@ from soc.fu.branch.pipe_data import BranchPipeSpec
 from soc.fu.shift_rot.pipeline import ShiftRotBasePipe
 from soc.fu.shift_rot.pipe_data import ShiftRotPipeSpec
 
+from soc.fu.spr.pipeline import SPRBasePipe
+from soc.fu.spr.pipe_data import SPRPipeSpec
+
 from soc.fu.trap.pipeline import TrapBasePipe
 from soc.fu.trap.pipe_data import TrapPipeSpec
 
@@ -150,6 +154,11 @@ class TrapFunctionUnit(FunctionUnitBaseSingle):
     def __init__(self, idx):
         super().__init__(TrapPipeSpec, TrapBasePipe, idx)
 
+class SPRFunctionUnit(FunctionUnitBaseSingle):
+    fnunit = Function.SPR
+    def __init__(self, idx):
+        super().__init__(SPRPipeSpec, SPRBasePipe, idx)
+
 # special-case
 class LDSTFunctionUnit(LDSTCompUnit):
     fnunit = Function.LDST
@@ -182,12 +191,14 @@ class AllFunctionUnits(Elaboratable):
         addrwid = pspec.addr_wid
         units = pspec.units
         if not isinstance(units, dict):
-            units = {'alu': 1, 'cr': 1, 'branch': 1, 'trap': 1, 'logical': 1,
+            units = {'alu': 1, 'cr': 1, 'branch': 1, 'trap': 1,
+                     'spr': 1, 'logical': 1,
                      'div': 1, 'shiftrot': 1}
         alus = {'alu': ALUFunctionUnit,
                  'cr': CRFunctionUnit,
                  'branch': BranchFunctionUnit,
                  'trap': TrapFunctionUnit,
+                 'spr': SPRFunctionUnit,
                  'div': DIVFunctionUnit,
                  'logical': LogicalFunctionUnit,
                  'shiftrot': ShiftRotFunctionUnit,
@@ -221,6 +232,7 @@ def tst_single_fus_il():
                         ('cr', CRFunctionUnit),
                         ('branch', BranchFunctionUnit),
                         ('trap', TrapFunctionUnit),
+                        ('spr', SprFunctionUnit),
                         ('logical', LogicalFunctionUnit),
                         ('shiftrot', ShiftRotFunctionUnit)):
         fu = kls(0)