big (single-purpose) update: move width arg into pspec
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 5 Jul 2019 16:07:16 +0000 (17:07 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 5 Jul 2019 16:07:16 +0000 (17:07 +0100)
27 files changed:
src/ieee754/div_rem_sqrt_rsqrt/core.py
src/ieee754/fcvt/pipeline.py
src/ieee754/fpadd/add0.py
src/ieee754/fpadd/add1.py
src/ieee754/fpadd/addstages.py
src/ieee754/fpadd/align.py
src/ieee754/fpadd/pipeline.py
src/ieee754/fpadd/specialcases.py
src/ieee754/fpcommon/corrections.py
src/ieee754/fpcommon/denorm.py
src/ieee754/fpcommon/getop.py
src/ieee754/fpcommon/normtopack.py
src/ieee754/fpcommon/pack.py
src/ieee754/fpcommon/postcalc.py
src/ieee754/fpcommon/postnormalise.py
src/ieee754/fpcommon/roundz.py
src/ieee754/fpdiv/div0.py
src/ieee754/fpdiv/div1.py
src/ieee754/fpdiv/div2.py
src/ieee754/fpdiv/divstages.py
src/ieee754/fpdiv/pipeline.py
src/ieee754/fpdiv/specialcases.py
src/ieee754/fpmul/mul0.py
src/ieee754/fpmul/mul1.py
src/ieee754/fpmul/mulstages.py
src/ieee754/fpmul/pipeline.py
src/ieee754/fpmul/specialcases.py

index 95b7f8d24c4ba3ce3e185aeb06d2466d0b8ad5dc..4e613f0d60f4bc1eb27a40a4ca23dd0d244fb237 100644 (file)
@@ -79,12 +79,13 @@ class DivPipeBaseData:
     """ input data base type for ``DivPipe``.
     """
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
         """ Create a ``DivPipeBaseData`` instance. """
+        width = pspec['width']
         self.out_do_z = Signal(reset_less=True)
         self.oz = Signal(width, reset_less=True)
 
-        self.ctx = FPPipeContext(width, pspec)  # context: muxid, operator etc.
+        self.ctx = FPPipeContext(pspec)  # context: muxid, operator etc.
         self.muxid = self.ctx.muxid             # annoying. complicated.
 
     def __iter__(self):
@@ -149,11 +150,11 @@ class DivPipeInputData(DivPipeCoreInputData, DivPipeBaseData):
     def __init__(self, core_config):
         """ Create a ``DivPipeInputData`` instance. """
         DivPipeCoreInputData.__init__(self, core_config)
-        DivPipeBaseData.__init__(self, width, pspec) # XXX TODO args
+        DivPipeBaseData.__init__(self, pspec) # XXX TODO args
         self.out_do_z = Signal(reset_less=True)
         self.oz = Signal(width, reset_less=True)
 
-        self.ctx = FPPipeContext(width, pspec)  # context: muxid, operator etc.
+        self.ctx = FPPipeContext(pspec)  # context: muxid, operator etc.
         self.muxid = self.ctx.muxid             # annoying. complicated.
 
     def __iter__(self):
@@ -235,7 +236,7 @@ class DivPipeInterstageData(DivPipeCoreInterstageData, DivPipeBaseData):
     def __init__(self, core_config):
         """ Create a ``DivPipeCoreInterstageData`` instance. """
         DivPipeCoreInterstageData.__init__(self, core_config)
-        DivPipeBaseData.__init__(self, width, pspec) # XXX TODO args
+        DivPipeBaseData.__init__(self, pspec) # XXX TODO args
 
     def __iter__(self):
         """ Get member signals. """
@@ -290,7 +291,7 @@ class DivPipeOutputData(DivPipeCoreOutputData, DivPipeBaseData):
     def __init__(self, core_config):
         """ Create a ``DivPipeCoreOutputData`` instance. """
         DivPipeCoreOutputData.__init__(self, core_config)
-        DivPipeBaseData.__init__(self, width, pspec) # XXX TODO args
+        DivPipeBaseData.__init__(self, pspec) # XXX TODO args
 
     def __iter__(self):
         """ Get member signals. """
index 7218be4e00420e1263124f9dd7ee1875f9c1123f..c5c9dea95f93a670550a650890f35866f31aae5a 100644 (file)
@@ -37,19 +37,17 @@ class FPCVTSpecialCasesMod(Elaboratable):
         https://steve.hollasch.net/cgindex/coding/ieeefloat.html
     """
 
-    def __init__(self, in_width, out_width, in_pspec, out_pspec):
-        self.in_width = in_width
-        self.out_width = out_width
+    def __init__(self, in_pspec, out_pspec):
         self.in_pspec = in_pspec
         self.out_pspec = out_pspec
         self.i = self.ispec()
         self.o = self.ospec()
 
     def ispec(self):
-        return FPADDBaseData(self.in_width, self.in_pspec)
+        return FPADDBaseData(self.in_pspec)
 
     def ospec(self):
-        return FPAddStage1Data(self.out_width, self.out_pspec)
+        return FPAddStage1Data(self.out_pspec)
 
     def setup(self, m, i):
         """ links module to inputs and outputs
@@ -66,8 +64,9 @@ class FPCVTSpecialCasesMod(Elaboratable):
         #m.submodules.sc_out_z = self.o.z
 
         # decode: XXX really should move to separate stage
-        print ("in_width out", self.in_width, self.out_width)
-        a1 = FPNumBaseRecord(self.in_width, False)
+        print ("in_width out", self.in_pspec['width'],
+                               self.out_pspec['width'])
+        a1 = FPNumBaseRecord(self.in_pspec['width'], False)
         m.submodules.sc_decode_a = a1 = FPNumDecode(None, a1)
         m.d.comb += a1.v.eq(self.i.a)
         z1 = self.o.z
@@ -158,19 +157,18 @@ class FPCVTSpecialCasesDeNorm(FPState, SimpleHandshake):
     """ special cases: NaNs, infs, zeros, denormalised
     """
 
-    def __init__(self, in_width, out_width, in_pspec, out_pspec):
+    def __init__(self, in_pspec, out_pspec):
         FPState.__init__(self, "special_cases")
-        sc = FPCVTSpecialCasesMod(in_width, out_width, in_pspec, out_pspec)
+        sc = FPCVTSpecialCasesMod(in_pspec, out_pspec)
         SimpleHandshake.__init__(self, sc)
         self.out = self.ospec(None)
 
 
 class FPCVTBasePipe(ControlBase):
-    def __init__(self, in_width, out_width, in_pspec, out_pspec):
+    def __init__(self, in_pspec, out_pspec):
         ControlBase.__init__(self)
-        self.pipe1 = FPCVTSpecialCasesDeNorm(in_width, out_width,
-                                             in_pspec, out_pspec)
-        self.pipe2 = FPNormToPack(out_width, out_pspec)
+        self.pipe1 = FPCVTSpecialCasesDeNorm(in_pspec, out_pspec)
+        self.pipe2 = FPNormToPack(out_pspec)
 
         self._eqs = self.connect([self.pipe1, self.pipe2])
 
@@ -192,8 +190,6 @@ class FPCVTMuxInOut(ReservationStations):
         Fan-in and Fan-out are combinatorial.
     """
     def __init__(self, in_width, out_width, num_rows, op_wid=0):
-        self.in_width = in_width
-        self.out_width = out_width
         self.op_wid = op_wid
         self.id_wid = num_bits(in_width)
         self.out_id_wid = num_bits(out_width)
@@ -201,17 +197,18 @@ class FPCVTMuxInOut(ReservationStations):
         self.in_pspec = {}
         self.in_pspec['id_wid'] = self.id_wid
         self.in_pspec['op_wid'] = self.op_wid
+        self.in_pspec['width'] = self.in_width
 
         self.out_pspec = {}
         self.out_pspec['id_wid'] = self.out_id_wid
-        self.out_pspec['op_wid'] = self.op_wid
+        self.out_pspec['op_wid'] = op_wid
+        self.out_pspec['width'] = out_width
 
-        self.alu = FPCVTBasePipe(in_width, out_width,
-                                 self.in_pspec, self.out_pspec)
+        self.alu = FPCVTBasePipe(self.in_pspec, self.out_pspec)
         ReservationStations.__init__(self, num_rows)
 
     def i_specfn(self):
-        return FPADDBaseData(self.in_width, self.in_pspec)
+        return FPADDBaseData(self.in_pspec)
 
     def o_specfn(self):
-        return FPPackData(self.out_width, self.out_pspec)
+        return FPPackData(self.out_pspec)
index 5386f7d066f0ebf232ccf8d37afcff4ba2c84197..e5a683daef6cde8bf56a3a13b0d059fd7ee50b79 100644 (file)
@@ -13,12 +13,13 @@ from ieee754.fpcommon.getop import FPPipeContext
 
 class FPAddStage0Data:
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
+        width = pspec['width']
         self.z = FPNumBaseRecord(width, False)
         self.out_do_z = Signal(reset_less=True)
         self.oz = Signal(width, reset_less=True)
         self.tot = Signal(self.z.m_width + 4, reset_less=True)
-        self.ctx = FPPipeContext(width, pspec)
+        self.ctx = FPPipeContext(pspec)
         self.muxid = self.ctx.muxid
 
     def eq(self, i):
@@ -28,17 +29,16 @@ class FPAddStage0Data:
 
 class FPAddStage0Mod(Elaboratable):
 
-    def __init__(self, width, pspec):
-        self.width = width
+    def __init__(self, pspec):
         self.pspec = pspec
         self.i = self.ispec()
         self.o = self.ospec()
 
     def ispec(self):
-        return FPSCData(self.width, self.pspec, True)
+        return FPSCData(self.pspec, True)
 
     def ospec(self):
-        return FPAddStage0Data(self.width, self.pspec)
+        return FPAddStage0Data(self.pspec)
 
     def process(self, i):
         return self.o
@@ -98,7 +98,7 @@ class FPAddStage0(FPState):
         give greatest accuracy.
     """
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
         FPState.__init__(self, "add_0")
         self.mod = FPAddStage0Mod(width)
         self.o = self.mod.ospec()
index e434be21fc9cb493e3119d384c36957ea74b02bb..70db8b4753f3a3ea1acaea3d9d1c4fcf36ec17b9 100644 (file)
@@ -16,17 +16,16 @@ class FPAddStage1Mod(FPState, Elaboratable):
         detects when tot sum is too big (tot[27] is kinda a carry bit)
     """
 
-    def __init__(self, width, pspec):
-        self.width = width
+    def __init__(self, pspec):
         self.pspec = pspec
         self.i = self.ispec()
         self.o = self.ospec()
 
     def ispec(self):
-        return FPAddStage0Data(self.width, self.pspec)
+        return FPAddStage0Data(self.pspec)
 
     def ospec(self):
-        return FPAddStage1Data(self.width, self.pspec)
+        return FPAddStage1Data(self.pspec)
 
     def process(self, i):
         return self.o
@@ -72,7 +71,7 @@ class FPAddStage1Mod(FPState, Elaboratable):
 
 class FPAddStage1(FPState):
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
         FPState.__init__(self, "add_1")
         self.mod = FPAddStage1Mod(width)
         self.out_z = FPNumBase(width, False)
index 45688c1c308a18b1972812d9869825a9688f4ab7..d37828ee39b63b98db433122f34d1f8ae070ab21 100644 (file)
@@ -18,27 +18,26 @@ from .add1 import FPAddStage1Mod
 
 class FPAddAlignSingleAdd(FPState, SimpleHandshake):
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
         FPState.__init__(self, "align")
-        self.width = width
         self.pspec = pspec
         SimpleHandshake.__init__(self, self) # pipeline is its own stage
         self.a1o = self.ospec()
 
     def ispec(self):
-        return FPSCData(self.width, self.pspec, True)
+        return FPSCData(self.pspec, True)
 
     def ospec(self):
-        return FPAddStage1Data(self.width, self.pspec) # AddStage1 ospec
+        return FPAddStage1Data(self.pspec) # AddStage1 ospec
 
     def setup(self, m, i):
         """ links module to inputs and outputs
         """
 
         # chain AddAlignSingle, AddStage0 and AddStage1
-        mod = FPAddAlignSingleMod(self.width, self.pspec)
-        a0mod = FPAddStage0Mod(self.width, self.pspec)
-        a1mod = FPAddStage1Mod(self.width, self.pspec)
+        mod = FPAddAlignSingleMod(self.pspec)
+        a0mod = FPAddStage0Mod(self.pspec)
+        a1mod = FPAddStage1Mod(self.pspec)
 
         chain = StageChain([mod, a0mod, a1mod])
         chain.setup(m, i)
index 70ce50b681007c82424c6ae07356115428e71f57..1db5affaccd27c76e79ad5dde81b2330484b278c 100644 (file)
@@ -15,13 +15,14 @@ from ieee754.fpcommon.getop import FPPipeContext
 
 class FPNumIn2Ops:
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
+        width = pspec['width']
         self.a = FPNumBaseRecord(width)
         self.b = FPNumBaseRecord(width)
         self.z = FPNumBaseRecord(width, False)
         self.out_do_z = Signal(reset_less=True)
         self.oz = Signal(width, reset_less=True)
-        self.ctx = FPPipeContext(width, pspec)
+        self.ctx = FPPipeContext(pspec)
         self.muxid = self.ctx.muxid
 
     def eq(self, i):
@@ -74,9 +75,9 @@ class FPAddAlignMultiMod(FPState):
 
 class FPAddAlignMulti(FPState):
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
         FPState.__init__(self, "align")
-        self.mod = FPAddAlignMultiMod(width, pspec)
+        self.mod = FPAddAlignMultiMod(pspec)
         self.out_a = FPNumBaseRecord(width)
         self.out_b = FPNumBaseRecord(width)
         self.exp_eq = Signal(reset_less=True)
@@ -98,17 +99,16 @@ class FPAddAlignMulti(FPState):
 
 class FPAddAlignSingleMod(Elaboratable):
 
-    def __init__(self, width, pspec):
-        self.width = width
+    def __init__(self, pspec):
         self.pspec = pspec
         self.i = self.ispec()
         self.o = self.ospec()
 
     def ispec(self):
-        return FPSCData(self.width, self.pspec, True)
+        return FPSCData(self.pspec, True)
 
     def ospec(self):
-        return FPNumIn2Ops(self.width, self.pspec)
+        return FPNumIn2Ops(self.pspec)
 
     def process(self, i):
         return self.o
@@ -136,8 +136,9 @@ class FPAddAlignSingleMod(Elaboratable):
         #m.submodules.align_out_b = self.o.b
 
         # temporary (muxed) input and output to be shifted
-        t_inp = FPNumBaseRecord(self.width)
-        t_out = FPNumBaseRecord(self.width)
+        width = self.pspec['width']
+        t_inp = FPNumBaseRecord(width)
+        t_out = FPNumBaseRecord(width)
         espec = (len(self.i.a.e), True)
         msr = MultiShiftRMerge(self.i.a.m_width, espec)
         #m.submodules.align_t_in = t_inp
@@ -193,9 +194,10 @@ class FPAddAlignSingleMod(Elaboratable):
 
 class FPAddAlignSingle(FPState):
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
         FPState.__init__(self, "align")
-        self.mod = FPAddAlignSingleMod(width, pspec)
+        width = pspec['width']
+        self.mod = FPAddAlignSingleMod(pspec)
         self.out_a = FPNumIn(None, width)
         self.out_b = FPNumIn(None, width)
 
index 7dbd254d1f9b61f7c19fd0ffd9e2a90b9bf41fe6..bee4cf3f736b8c3547bb6ee818db05da3fc0839f 100644 (file)
@@ -20,11 +20,11 @@ from .addstages import FPAddAlignSingleAdd
 
 
 class FPADDBasePipe(ControlBase):
-    def __init__(self, width, id_wid):
+    def __init__(self, pspec):
         ControlBase.__init__(self)
-        self.pipe1 = FPAddSpecialCasesDeNorm(width, id_wid)
-        self.pipe2 = FPAddAlignSingleAdd(width, id_wid)
-        self.pipe3 = FPNormToPack(width, id_wid)
+        self.pipe1 = FPAddSpecialCasesDeNorm(pspec)
+        self.pipe2 = FPAddAlignSingleAdd(pspec)
+        self.pipe3 = FPNormToPack(pspec)
 
         self._eqs = self.connect([self.pipe1, self.pipe2, self.pipe3])
 
@@ -47,15 +47,14 @@ class FPADDMuxInOut(ReservationStations):
         Fan-in and Fan-out are combinatorial.
     """
     def __init__(self, width, num_rows, op_wid=None):
-        self.width = width
         self.id_wid = num_bits(width)
         self.op_wid = op_wid
-        self.pspec = {'id_wid': self.id_wid, 'op_wid': op_wid}
-        self.alu = FPADDBasePipe(width, self.pspec)
+        self.pspec = {'width': width, 'id_wid': self.id_wid, 'op_wid': op_wid}
+        self.alu = FPADDBasePipe(self.pspec)
         ReservationStations.__init__(self, num_rows)
 
     def i_specfn(self):
-        return FPADDBaseData(self.width, self.pspec)
+        return FPADDBaseData(self.pspec)
 
     def o_specfn(self):
-        return FPPackData(self.width, self.pspec)
+        return FPPackData(self.pspec)
index c0c8e24d3f0c89e1325665699a3ec0c16119988c..b6eb1a475becb8098847405e6d51252fe9185a82 100644 (file)
@@ -20,17 +20,16 @@ class FPAddSpecialCasesMod(Elaboratable):
         https://steve.hollasch.net/cgindex/coding/ieeefloat.html
     """
 
-    def __init__(self, width, pspec):
-        self.width = width
+    def __init__(self, pspec):
         self.pspec = pspec
         self.i = self.ispec()
         self.o = self.ospec()
 
     def ispec(self):
-        return FPADDBaseData(self.width, self.pspec)
+        return FPADDBaseData(self.pspec)
 
     def ospec(self):
-        return FPSCData(self.width, self.pspec, True)
+        return FPSCData(self.pspec, True)
 
     def setup(self, m, i):
         """ links module to inputs and outputs
@@ -47,8 +46,9 @@ class FPAddSpecialCasesMod(Elaboratable):
         #m.submodules.sc_out_z = self.o.z
 
         # decode: XXX really should move to separate stage
-        a1 = FPNumBaseRecord(self.width)
-        b1 = FPNumBaseRecord(self.width)
+        width = self.pspec['width']
+        a1 = FPNumBaseRecord(width)
+        b1 = FPNumBaseRecord(width)
         m.submodules.sc_decode_a = a1 = FPNumDecode(None, a1)
         m.submodules.sc_decode_b = b1 = FPNumDecode(None, b1)
         m.d.comb += [a1.v.eq(self.i.a),
@@ -182,24 +182,23 @@ class FPAddSpecialCasesDeNorm(FPState, SimpleHandshake):
         https://steve.hollasch.net/cgindex/coding/ieeefloat.html
     """
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
         FPState.__init__(self, "special_cases")
-        self.width = width
         self.pspec = pspec
         SimpleHandshake.__init__(self, self) # pipe is its own stage
         self.out = self.ospec()
 
     def ispec(self):
-        return FPADDBaseData(self.width, self.pspec) # SC ispec
+        return FPADDBaseData(self.pspec) # SC ispec
 
     def ospec(self):
-        return FPSCData(self.width, self.pspec, True) # DeNorm
+        return FPSCData(self.pspec, True) # DeNorm
 
     def setup(self, m, i):
         """ links module to inputs and outputs
         """
-        smod = FPAddSpecialCasesMod(self.width, self.pspec)
-        dmod = FPAddDeNormMod(self.width, self.pspec, True)
+        smod = FPAddSpecialCasesMod(self.pspec)
+        dmod = FPAddDeNormMod(self.pspec, True)
 
         chain = StageChain([smod, dmod])
         chain.setup(m, i)
index 500792265936af1dfab7bb390f173077fbbaf06e..18a08a04bf8a9667deb1845813442139f5d7aa1c 100644 (file)
@@ -10,17 +10,16 @@ from .roundz import FPRoundData
 
 class FPCorrectionsMod(Elaboratable):
 
-    def __init__(self, width, pspec):
-        self.width = width
+    def __init__(self, pspec):
         self.pspec = pspec
         self.i = self.ispec()
         self.out_z = self.ospec()
 
     def ispec(self):
-        return FPRoundData(self.width, self.pspec)
+        return FPRoundData(self.pspec)
 
     def ospec(self):
-        return FPRoundData(self.width, self.pspec)
+        return FPRoundData(self.pspec)
 
     def process(self, i):
         return self.out_z
index 6c2ed584b9cf5bd277318a9c9156d16d6cd66aa0..586213691abaa88dd593fe73d043f892ec71503a 100644 (file)
@@ -13,18 +13,18 @@ from ieee754.fpcommon.getop import FPPipeContext
 
 class FPSCData:
 
-    def __init__(self, width, pspec, m_extra):
-
+    def __init__(self, pspec, m_extra):
+        width = pspec['width']
         # NOTE: difference between z and oz is that oz is created by
         # special-cases module(s) and will propagate, along with its
         # "bypass" signal out_do_z, through the pipeline, *disabling*
         # all processing of all subsequent stages.
         self.a = FPNumBaseRecord(width, m_extra)   # operand a
         self.b = FPNumBaseRecord(width, m_extra)   # operand b
-        self.z = FPNumBaseRecord(width, False)     # denormed result 
+        self.z = FPNumBaseRecord(width, False)     # denormed result
         self.oz = Signal(width, reset_less=True)   # "finished" (bypass) result
         self.out_do_z = Signal(reset_less=True)    # "bypass" enabled
-        self.ctx = FPPipeContext(width, pspec) 
+        self.ctx = FPPipeContext(pspec)
         self.muxid = self.ctx.muxid
 
     def __iter__(self):
@@ -43,18 +43,17 @@ class FPSCData:
 
 class FPAddDeNormMod(FPState, Elaboratable):
 
-    def __init__(self, width, pspec, m_extra):
-        self.width = width
+    def __init__(self, pspec, m_extra):
         self.pspec = pspec
         self.m_extra = m_extra
         self.i = self.ispec()
         self.o = self.ospec()
 
     def ispec(self):
-        return FPSCData(self.width, self.pspec, self.m_extra)
+        return FPSCData(self.pspec, self.m_extra)
 
     def ospec(self):
-        return FPSCData(self.width, self.pspec, self.m_extra)
+        return FPSCData(self.pspec, self.m_extra)
 
     def process(self, i):
         return self.o
index abe7dc94abcf69dcd53f82c6a77e312dfc92746f..fbdee3e8ce91d8c55ea6db6a8724fa17406f853b 100644 (file)
@@ -84,8 +84,7 @@ class FPNumBase2Ops:
 
 class FPPipeContext:
 
-    def __init__(self, width, pspec):
-        self.width = width
+    def __init__(self, pspec):
         print (pspec)
         self.id_wid = pspec['id_wid']
         self.op_wid = pspec.get('op_wid', 0)
@@ -107,9 +106,9 @@ class FPPipeContext:
 
 class FPADDBaseData:
 
-    def __init__(self, width, pspec, n_ops=2):
-        self.width = width
-        self.ctx = FPPipeContext(width, pspec)
+    def __init__(self, pspec, n_ops=2):
+        width = pspec['width']
+        self.ctx = FPPipeContext(pspec)
         ops = []
         for i in range(n_ops):
             name = chr(ord("a")+i)
index 1cda87659aab349853de9ce13d5e6806fabc852a..cb4a8bcd6187920e4f74ce7c9a815b5caea0d266 100644 (file)
@@ -16,28 +16,27 @@ from .pack import FPPackData, FPPackMod
 
 class FPNormToPack(FPState, SimpleHandshake):
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
         FPState.__init__(self, "normalise_1")
         print ("normtopack", pspec)
         self.pspec = pspec
-        self.width = width
         SimpleHandshake.__init__(self, self) # pipeline is its own stage
 
     def ispec(self):
-        return FPAddStage1Data(self.width, self.pspec)
+        return FPAddStage1Data(self.pspec)
 
     def ospec(self):
-        return FPPackData(self.width, self.pspec) # FPPackMod
+        return FPPackData(self.pspec) # FPPackMod
 
     def setup(self, m, i):
         """ links module to inputs and outputs
         """
 
         # Normalisation, Rounding Corrections, Pack - in a chain
-        nmod = FPNorm1ModSingle(self.width, self.pspec)
-        rmod = FPRoundMod(self.width, self.pspec)
-        cmod = FPCorrectionsMod(self.width, self.pspec)
-        pmod = FPPackMod(self.width, self.pspec)
+        nmod = FPNorm1ModSingle(self.pspec)
+        rmod = FPRoundMod(self.pspec)
+        cmod = FPCorrectionsMod(self.pspec)
+        pmod = FPPackMod(self.pspec)
         stages = [nmod, rmod, cmod, pmod]
         chain = StageChain(stages)
         chain.setup(m, i)
index eae7c6b7da36a6f0c79597ec4035d3aec5de6edc..529dd51b49d7a61de48c6d9a224b3ae79e09c23a 100644 (file)
@@ -14,9 +14,10 @@ from ieee754.fpcommon.getop import FPPipeContext
 
 class FPPackData:
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
+        width = pspec['width']
         self.z = Signal(width, reset_less=True)    # result
-        self.ctx = FPPipeContext(width, pspec)
+        self.ctx = FPPipeContext(pspec)
 
         # this is complicated: it's a workaround, due to the
         # array-indexing not working properly in nmigen.
@@ -40,17 +41,16 @@ class FPPackData:
 
 class FPPackMod(Elaboratable):
 
-    def __init__(self, width, pspec):
-        self.width = width
+    def __init__(self, pspec):
         self.pspec = pspec
         self.i = self.ispec()
         self.o = self.ospec()
 
     def ispec(self):
-        return FPRoundData(self.width, self.pspec)
+        return FPRoundData(self.pspec)
 
     def ospec(self):
-        return FPPackData(self.width, self.pspec)
+        return FPPackData(self.pspec)
 
     def process(self, i):
         return self.o
@@ -63,7 +63,7 @@ class FPPackMod(Elaboratable):
 
     def elaborate(self, platform):
         m = Module()
-        z = FPNumBaseRecord(self.width, False)
+        z = FPNumBaseRecord(self.pspec['width'], False)
         m.submodules.pack_in_z = in_z = FPNumBase(self.i.z)
         #m.submodules.pack_out_z = out_z = FPNumOut(z)
         m.d.comb += self.o.ctx.eq(self.i.ctx)
index a06c99a817eb895bcf5f7b4b52a3089e2996f160..c8a0090e1b880bebd2e66ee0963699ae1214d5cc 100644 (file)
@@ -8,12 +8,13 @@ from ieee754.fpcommon.getop import FPPipeContext
 
 class FPAddStage1Data:
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
+        width = pspec['width']
         self.z = FPNumBaseRecord(width, False)
         self.out_do_z = Signal(reset_less=True)
         self.oz = Signal(width, reset_less=True)
         self.of = Overflow()
-        self.ctx = FPPipeContext(width, pspec)
+        self.ctx = FPPipeContext(pspec)
         self.muxid = self.ctx.muxid
 
     def __iter__(self):
index 95e49174237882c081a526f0592ba504d33c7f39..58ce1e669f3e94eb679a2d6ada8be9c52fcba74f 100644 (file)
@@ -16,12 +16,13 @@ from .postcalc import FPAddStage1Data
 
 class FPNorm1Data:
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
+        width = pspec['width']
         self.roundz = Signal(reset_less=True, name="norm1_roundz")
         self.z = FPNumBaseRecord(width, False)
         self.out_do_z = Signal(reset_less=True)
         self.oz = Signal(width, reset_less=True)
-        self.ctx = FPPipeContext(width, pspec)
+        self.ctx = FPPipeContext(pspec)
         self.muxid = self.ctx.muxid
 
     def eq(self, i):
@@ -32,17 +33,16 @@ class FPNorm1Data:
 
 class FPNorm1ModSingle(Elaboratable):
 
-    def __init__(self, width, pspec):
-        self.width = width
+    def __init__(self, pspec):
         self.pspec = pspec
         self.i = self.ispec()
         self.o = self.ospec()
 
     def ispec(self):
-        return FPAddStage1Data(self.width, self.pspec)
+        return FPAddStage1Data(self.pspec)
 
     def ospec(self):
-        return FPNorm1Data(self.width, self.pspec)
+        return FPNorm1Data(self.pspec)
 
     def setup(self, m, i):
         """ links module to inputs and outputs
@@ -140,7 +140,7 @@ class FPNorm1ModSingle(Elaboratable):
 
 class FPNorm1ModMulti:
 
-    def __init__(self, width, single_cycle=True):
+    def __init__(self, pspec, single_cycle=True):
         self.width = width
         self.in_select = Signal(reset_less=True)
         self.in_z = FPNumBase(width, False)
index 3aa8bf4af6fc2d26c607d3aefdb5b5ddc796423e..1585b310934f43d057e658573b82eba22147d126 100644 (file)
@@ -13,9 +13,10 @@ from .postnormalise import FPNorm1Data
 
 class FPRoundData:
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
+        width = pspec['width']
         self.z = FPNumBaseRecord(width, False)
-        self.ctx = FPPipeContext(width, pspec)
+        self.ctx = FPPipeContext(pspec)
         self.muxid = self.ctx.muxid
         # pipeline bypass [data comes from specialcases]
         self.out_do_z = Signal(reset_less=True)
@@ -29,17 +30,16 @@ class FPRoundData:
 
 class FPRoundMod(Elaboratable):
 
-    def __init__(self, width, pspec):
-        self.width = width
+    def __init__(self, pspec):
         self.pspec = pspec
         self.i = self.ispec()
         self.out_z = self.ospec()
 
     def ispec(self):
-        return FPNorm1Data(self.width, self.pspec)
+        return FPNorm1Data(self.pspec)
 
     def ospec(self):
-        return FPRoundData(self.width, self.pspec)
+        return FPRoundData(self.pspec)
 
     def process(self, i):
         return self.out_z
index fb2bccd6302ad0a7688c6378194550a5ffdeb2f5..81166c74afe54f1f85c2c88cbd85a8bd2a2573fd 100644 (file)
@@ -15,12 +15,12 @@ from ieee754.fpcommon.getop import FPPipeContext
 # TODO: delete (replace by DivPipeCoreInputData)
 class FPDivStage0Data:
 
-    def __init__(self, width, pspec):
-        self.z = FPNumBaseRecord(width, False)
+    def __init__(self, pspec):
+        self.z = FPNumBaseRecord(pspec['width'], False)
         self.out_do_z = Signal(reset_less=True)
-        self.oz = Signal(width, reset_less=True)
+        self.oz = Signal(pspec['width'], reset_less=True)
 
-        self.ctx = FPPipeContext(width, pspec) # context: muxid, operator etc.
+        self.ctx = FPPipeContext(pspec['width'], pspec) # context: muxid, operator etc.
         self.muxid = self.ctx.muxid             # annoying. complicated.
 
         # TODO: here is where Q and R would be put, and passed
@@ -36,18 +36,17 @@ class FPDivStage0Data:
 
 class FPDivStage0Mod(Elaboratable):
 
-    def __init__(self, width, id_wid):
-        self.width = width
-        self.id_wid = id_wid
+    def __init__(self, pspec):
+        self.pspec = pspec
         self.i = self.ispec()
         self.o = self.ospec()
 
     def ispec(self):
-        return FPSCData(self.width, self.id_wid, False)
+        return FPSCData(self.pspec, False)
 
     def ospec(self):
         # XXX TODO: replace with DivPipeCoreInputData, here
-        return FPDivStage0Data(self.width, self.id_wid)
+        return FPDivStage0Data(self.pspec)
 
     def process(self, i):
         return self.o
@@ -105,9 +104,9 @@ class FPDivStage0(FPState):
     """ First stage of div.  
     """
 
-    def __init__(self, width, id_wid):
+    def __init__(self, pspec):
         FPState.__init__(self, "divider_0")
-        self.mod = FPDivStage0Mod(width)
+        self.mod = FPDivStage0Mod(pspec)
         self.o = self.mod.ospec()
 
     def setup(self, m, i):
index 27e4b782328708f4f56032e7d94d4c46fd90b137..6cf49aba062b9ee73e8587c8f3d622ed83be09a7 100644 (file)
@@ -14,19 +14,18 @@ from .div0 import FPDivStage0Data # TODO: replace with DivPipeCoreInterstageData
 
 class FPDivStage1Mod(Elaboratable):
 
-    def __init__(self, width, pspec):
-        self.width = width
+    def __init__(self, pspec):
         self.pspec = pspec
         self.i = self.ispec()
         self.o = self.ospec()
 
     def ispec(self):
         # TODO: DivPipeCoreInterstageData, here
-        return FPDivStage0Data(self.width, self.pspec) # Q/Rem (etc) in...
+        return FPDivStage0Data(self.pspec) # Q/Rem (etc) in...
 
     def ospec(self):
         # TODO: DivPipeCoreInterstageData, here
-        return FPDivStage0Data(self.width, self.pspec) # ... Q/Rem (etc) out
+        return FPDivStage0Data(self.pspec) # ... Q/Rem (etc) out
 
     def process(self, i):
         return self.o
index 43153fc93b842181b504ab7113fff4e2caf865c8..8db281aee5b0b40758d8a81237720b511f840137 100644 (file)
@@ -15,20 +15,19 @@ class FPDivStage2Mod(FPState, Elaboratable):
     """ Second stage of div: preparation for normalisation.
     """
 
-    def __init__(self, width, pspec):
-        self.width = width
+    def __init__(self, pspec):
         self.pspec = pspec
         self.i = self.ispec()
         self.o = self.ospec()
 
     def ispec(self):
         # TODO: DivPipeCoreInterstageData
-        return FPDivStage0Data(self.width, self.pspec) # Q/Rem in...
+        return FPDivStage0Data(self.pspec) # Q/Rem in...
 
     def ospec(self):
         # XXX REQUIRED.  MUST NOT BE CHANGED.  this is the format
         # required for ongoing processing (normalisation, correction etc.)
-        return FPAddStage1Data(self.width, self.pspec) # out to post-process
+        return FPAddStage1Data(self.pspec) # out to post-process
 
     def process(self, i):
         return self.o
@@ -75,10 +74,10 @@ class FPDivStage2Mod(FPState, Elaboratable):
 
 class FPDivStage2(FPState):
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
         FPState.__init__(self, "divider_1")
-        self.mod = FPDivStage2Mod(width)
-        self.out_z = FPNumBaseRecord(width, False)
+        self.mod = FPDivStage2Mod(pspec)
+        self.out_z = FPNumBaseRecord(pspec, False)
         self.out_of = Overflow()
         self.norm_stb = Signal()
 
index b0c539f9805e94080c0713fd83f76fd6739101cc..c5f7683477f231c13eec20a20c35b08aaba7d461 100644 (file)
@@ -25,9 +25,8 @@ from .div0 import FPDivStage0Data
 
 class FPDivStagesSetup(FPState, SimpleHandshake):
 
-    def __init__(self, width, pspec, n_stages):
+    def __init__(self, pspec, n_stages):
         FPState.__init__(self, "divsetup")
-        self.width = width
         self.pspec = pspec
         self.n_stages = n_stages # number of combinatorial stages
         SimpleHandshake.__init__(self, self) # pipeline is its own stage
@@ -35,11 +34,11 @@ class FPDivStagesSetup(FPState, SimpleHandshake):
 
     def ispec(self):
         # REQUIRED.  do NOT change.
-        return FPSCData(self.width, self.pspec, False) # from denorm
+        return FPSCData(self.pspec, False) # from denorm
 
     def ospec(self):
         # XXX TODO: replace with "intermediary" (DivPipeInterstageData)
-        return FPDivStage0Data(self.width, self.pspec) # DIV ospec (loop)
+        return FPDivStage0Data(self.pspec) # DIV ospec (loop)
 
     def setup(self, m, i):
         """ links module to inputs and outputs.
@@ -53,7 +52,7 @@ class FPDivStagesSetup(FPState, SimpleHandshake):
         divstages = []
 
         # Converts from FPSCData into DivPipeInputData
-        divstages.append(FPDivStage0Mod(self.width, self.pspec))
+        divstages.append(FPDivStage0Mod(self.pspec))
 
         # does 1 "convert" (actual processing) from DivPipeInputData
         # into "intermediate" output (DivPipeInterstageData)
@@ -67,7 +66,7 @@ class FPDivStagesSetup(FPState, SimpleHandshake):
         # will add.
         for count in range(self.n_stages): # number of combinatorial stages
             # XXX: this can actually be entirely dropped...
-            divstages.append(FPDivStage1Mod(self.width, self.pspec))
+            divstages.append(FPDivStage1Mod(self.pspec))
 
             # ... and replaced with this.
             # vvvvvvv
@@ -90,25 +89,22 @@ class FPDivStagesSetup(FPState, SimpleHandshake):
 
 class FPDivStagesIntermediary(FPState, SimpleHandshake):
 
-    def __init__(self, width, pspec, n_stages):
+    def __init__(self, pspec, n_stages):
         FPState.__init__(self, "divintermediate")
-        self.width = width
         self.pspec = pspec
         self.n_stages = n_stages # number of combinatorial stages
-        self.begin = begin # "begin" mode
-        self.end = end # "end" mode
         SimpleHandshake.__init__(self, self) # pipeline is its own stage
         self.m1o = self.ospec()
 
     def ispec(self):
         # TODO - this is for FPDivStage1Mod
         # XXX TODO: replace with "intermediary" (DivPipeInterstageData)
-        return FPDivStage0Data(self.width, self.pspec) # DIV ispec (loop)
+        return FPDivStage0Data(self.pspec) # DIV ispec (loop)
 
     def ospec(self):
         # TODO - this is for FPDivStage1Mod
         # XXX TODO: replace with "intermediary" (DivPipeInterstageData)
-        return FPDivStage0Data(self.width, self.pspec) # DIV ospec (loop)
+        return FPDivStage0Data(self.pspec) # DIV ospec (loop)
 
     def setup(self, m, i):
         """ links module to inputs and outputs.
@@ -126,7 +122,7 @@ class FPDivStagesIntermediary(FPState, SimpleHandshake):
         # will add.
         for count in range(self.n_stages): # number of combinatorial stages
             # XXX: this can actually be entirely dropped...
-            divstages.append(FPDivStage1Mod(self.width, self.pspec))
+            divstages.append(FPDivStage1Mod(self.pspec))
 
             # ... and replaced with this.
             # vvvvvvv
@@ -149,9 +145,8 @@ class FPDivStagesIntermediary(FPState, SimpleHandshake):
 
 class FPDivStagesFinal(FPState, SimpleHandshake):
 
-    def __init__(self, width, pspec, n_stages):
+    def __init__(self, pspec, n_stages):
         FPState.__init__(self, "divfinal")
-        self.width = width
         self.pspec = pspec
         self.n_stages = n_stages # number of combinatorial stages
         SimpleHandshake.__init__(self, self) # pipeline is its own stage
@@ -159,11 +154,11 @@ class FPDivStagesFinal(FPState, SimpleHandshake):
 
     def ispec(self):
         # XXX TODO: replace with "intermediary" (DivPipeInterstageData?)
-        return FPDivStage0Data(self.width, self.pspec) # DIV ispec (loop)
+        return FPDivStage0Data(self.pspec) # DIV ispec (loop)
 
     def ospec(self):
         # REQUIRED.  do NOT change.
-        return FPAddStage1Data(self.width, self.pspec) # to post-norm
+        return FPAddStage1Data(self.pspec) # to post-norm
 
     def setup(self, m, i):
         """ links module to inputs and outputs.
@@ -184,7 +179,7 @@ class FPDivStagesFinal(FPState, SimpleHandshake):
         # will add.
         for count in range(self.n_stages): # number of combinatorial stages
             # XXX: this can actually be entirely dropped...
-            divstages.append(FPDivStage1Mod(self.width, self.pspec))
+            divstages.append(FPDivStage1Mod(self.pspec))
 
             # ... and replaced with this.
             # vvvvvvv
@@ -199,7 +194,7 @@ class FPDivStagesFinal(FPState, SimpleHandshake):
         # does conversion from DivPipeOutputData into
         # FPAddStage1Data format (bad name, TODO, doesn't matter),
         # so that post-normalisation and corrections can take over
-        divstages.append(FPDivStage2Mod(self.width, self.pspec))
+        divstages.append(FPDivStage2Mod(self.pspec))
 
         chain = StageChain(divstages)
         chain.setup(m, i)
index 21f746ba982287208138d71b60a103ab25d8c1f7..58fa8e9b0df0e73e64799d7d1ce57dd07d78ddf8 100644 (file)
@@ -73,9 +73,8 @@ from .divstages import (FPDivStagesSetup,
 
 
 class FPDIVBasePipe(ControlBase):
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
         ControlBase.__init__(self)
-        self.width = width
         self.pspec = pspec
 
     def elaborate(self, platform):
@@ -104,11 +103,11 @@ class FPDIVBasePipe(ControlBase):
             else:
                 kls = FPDivStagesIntermediate
 
-            pipechain.append(kls(self.width, self.pspec, n_comb_stages))
+            pipechain.append(kls(self.pspec, n_comb_stages))
 
         # start and end: unpack/specialcases then normalisation/packing
-        pipestart = FPDIVSpecialCasesDeNorm(self.width, self.pspec)
-        pipeend = FPNormToPack(self.width, self.pspec)
+        pipestart = FPDIVSpecialCasesDeNorm(self.pspec)
+        pipeend = FPNormToPack(self.pspec)
 
         # add submodules
         m.submodules.scnorm = pipestart
@@ -135,14 +134,13 @@ class FPDIVMuxInOut(ReservationStations):
                    then be used to change the behaviour of the pipeline.
     """
     def __init__(self, width, num_rows, op_wid=0):
-        self.width = width
         self.id_wid = num_bits(width)
-        self.pspec = {'id_wid': self.id_wid, 'op_wid': op_wid}
-        self.alu = FPDIVBasePipe(width, self.pspec)
+        self.pspec = {'width': width, 'id_wid': self.id_wid, 'op_wid': op_wid}
+        self.alu = FPDIVBasePipe(self.pspec)
         ReservationStations.__init__(self, num_rows)
 
     def i_specfn(self):
-        return FPADDBaseData(self.width, self.pspec)
+        return FPADDBaseData(self.pspec)
 
     def o_specfn(self):
-        return FPPackData(self.width, self.pspec)
+        return FPPackData(self.pspec)
index b7a05047acc289bfa78a0f80b1ab14bd755e6c78..f17044241d771e3bf7bd4bff45a3249f60782511 100644 (file)
@@ -18,17 +18,16 @@ class FPDIVSpecialCasesMod(Elaboratable):
         https://steve.hollasch.net/cgindex/coding/ieeefloat.html
     """
 
-    def __init__(self, width, pspec):
-        self.width = width
+    def __init__(self, pspec):
         self.pspec = pspec
         self.i = self.ispec()
         self.o = self.ospec()
 
     def ispec(self):
-        return FPADDBaseData(self.width, self.pspec)
+        return FPADDBaseData(self.pspec)
 
     def ospec(self):
-        return FPSCData(self.width, self.pspec, False)
+        return FPSCData(self.pspec, False)
 
     def setup(self, m, i):
         """ links module to inputs and outputs
@@ -45,8 +44,8 @@ class FPDIVSpecialCasesMod(Elaboratable):
         #m.submodules.sc_out_z = self.o.z
 
         # decode: XXX really should move to separate stage
-        a1 = FPNumBaseRecord(self.width, False)
-        b1 = FPNumBaseRecord(self.width, False)
+        a1 = FPNumBaseRecord(self.pspec['width'], False)
+        b1 = FPNumBaseRecord(self.pspec['width'], False)
         m.submodules.sc_decode_a = a1 = FPNumDecode(None, a1)
         m.submodules.sc_decode_b = b1 = FPNumDecode(None, b1)
         m.d.comb += [a1.v.eq(self.i.a),
@@ -113,9 +112,9 @@ class FPDIVSpecialCases(FPState):
         https://steve.hollasch.net/cgindex/coding/ieeefloat.html
     """
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
         FPState.__init__(self, "special_cases")
-        self.mod = FPDIVSpecialCasesMod(width)
+        self.mod = FPDIVSpecialCasesMod(pspec)
         self.out_z = self.mod.ospec()
         self.out_do_z = Signal(reset_less=True)
 
@@ -138,24 +137,23 @@ class FPDIVSpecialCasesDeNorm(FPState, SimpleHandshake):
     """ special cases: NaNs, infs, zeros, denormalised
     """
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
         FPState.__init__(self, "special_cases")
-        self.width = width
         self.pspec = pspec
         SimpleHandshake.__init__(self, self) # pipe is its own stage
         self.out = self.ospec()
 
     def ispec(self):
-        return FPADDBaseData(self.width, self.pspec) # SpecialCases ispec
+        return FPADDBaseData(self.pspec) # SpecialCases ispec
 
     def ospec(self):
-        return FPSCData(self.width, self.pspec, False) # DeNorm ospec
+        return FPSCData(self.pspec, False) # DeNorm ospec
 
     def setup(self, m, i):
         """ links module to inputs and outputs
         """
-        smod = FPDIVSpecialCasesMod(self.width, self.pspec)
-        dmod = FPAddDeNormMod(self.width, self.pspec, False)
+        smod = FPDIVSpecialCasesMod(self.pspec)
+        dmod = FPAddDeNormMod(self.pspec, False)
 
         chain = StageChain([smod, dmod])
         chain.setup(m, i)
index db89b33614ab26a1d7199220913500b567d136a7..f56f69b532d524cef9a92a68699c63fcee693563 100644 (file)
@@ -13,13 +13,14 @@ from ieee754.fpcommon.getop import FPPipeContext
 
 class FPMulStage0Data:
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
+        width = pspec['width']
         self.z = FPNumBaseRecord(width, False)
         self.out_do_z = Signal(reset_less=True)
         self.oz = Signal(width, reset_less=True)
         mw = (self.z.m_width)*2 - 1 + 3 # sticky/round/guard bits + (2*mant) - 1
         self.product = Signal(mw, reset_less=True)
-        self.ctx = FPPipeContext(width, pspec)
+        self.ctx = FPPipeContext(pspec)
         self.muxid = self.ctx.muxid
 
     def eq(self, i):
@@ -29,17 +30,16 @@ class FPMulStage0Data:
 
 class FPMulStage0Mod(Elaboratable):
 
-    def __init__(self, width, pspec):
-        self.width = width
+    def __init__(self, pspec):
         self.pspec = pspec
         self.i = self.ispec()
         self.o = self.ospec()
 
     def ispec(self):
-        return FPSCData(self.width, self.pspec, False)
+        return FPSCData(self.pspec, False)
 
     def ospec(self):
-        return FPMulStage0Data(self.width, self.pspec)
+        return FPMulStage0Data(self.pspec)
 
     def process(self, i):
         return self.o
index e6e58fc4da477873ee2a52cb6726ef8b5382fda0..1611fe1835996bd7be3755df6dd22d004a363b2f 100644 (file)
@@ -12,17 +12,16 @@ class FPMulStage1Mod(FPState, Elaboratable):
     """ Second stage of mul: preparation for normalisation.
     """
 
-    def __init__(self, width, pspec):
-        self.width = width
+    def __init__(self, pspec):
         self.pspec = pspec
         self.i = self.ispec()
         self.o = self.ospec()
 
     def ispec(self):
-        return FPMulStage0Data(self.width, self.pspec)
+        return FPMulStage0Data(self.pspec)
 
     def ospec(self):
-        return FPAddStage1Data(self.width, self.pspec)
+        return FPAddStage1Data(self.pspec)
 
     def process(self, i):
         return self.o
@@ -57,9 +56,10 @@ class FPMulStage1Mod(FPState, Elaboratable):
 
 class FPMulStage1(FPState):
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
         FPState.__init__(self, "multiply_1")
-        self.mod = FPMulStage1Mod(width, pspec)
+        width = pspec['width']
+        self.mod = FPMulStage1Mod(pspec)
         self.out_z = FPNumBaseRecord(width, False)
         self.out_of = Overflow()
         self.norm_stb = Signal()
index 53f4cc7f56ef8f508c6c286f9ff943af7545dd4c..fbfe8c7cb08b9058f4d899a278469b9e71d1cd22 100644 (file)
@@ -14,26 +14,25 @@ from .mul1 import FPMulStage1Mod
 
 class FPMulStages(FPState, SimpleHandshake):
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
         FPState.__init__(self, "align")
-        self.width = width
         self.pspec = pspec
         SimpleHandshake.__init__(self, self) # pipeline is its own stage
         self.m1o = self.ospec()
 
     def ispec(self):
-        return FPSCData(self.width, self.pspec, False)
+        return FPSCData(self.pspec, False)
 
     def ospec(self):
-        return FPAddStage1Data(self.width, self.pspec)
+        return FPAddStage1Data(self.pspec)
 
     def setup(self, m, i):
         """ links module to inputs and outputs
         """
 
         # chain MulStage0 and MulStage1
-        m0mod = FPMulStage0Mod(self.width, self.pspec)
-        m1mod = FPMulStage1Mod(self.width, self.pspec)
+        m0mod = FPMulStage0Mod(self.pspec)
+        m1mod = FPMulStage1Mod(self.pspec)
 
         chain = StageChain([m0mod, m1mod])
         chain.setup(m, i)
index d735211cac725fb36519cb80735f5b3174580818..f146b1a70bd67c6bf5b34d93a2e883d3c3b5b559 100644 (file)
@@ -18,11 +18,11 @@ from .mulstages import FPMulStages
 
 
 class FPMULBasePipe(ControlBase):
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
         ControlBase.__init__(self)
-        self.pipe1 = FPMulSpecialCasesDeNorm(width, pspec)
-        self.pipe2 = FPMulStages(width, pspec)
-        self.pipe3 = FPNormToPack(width, pspec)
+        self.pipe1 = FPMulSpecialCasesDeNorm(pspec)
+        self.pipe2 = FPMulStages(pspec)
+        self.pipe3 = FPNormToPack(pspec)
 
         self._eqs = self.connect([self.pipe1, self.pipe2, self.pipe3])
 
@@ -45,17 +45,17 @@ class FPMULMuxInOut(ReservationStations):
         Fan-in and Fan-out are combinatorial.
     """
     def __init__(self, width, num_rows, op_wid=0):
-        self.width = width
         self.pspec = {}
         self.id_wid = num_bits(width)
         self.op_wid = op_wid
         self.pspec['id_wid'] = self.id_wid
+        self.pspec['width'] = width
         self.pspec['op_wid'] = self.op_wid
-        self.alu = FPMULBasePipe(width, self.pspec)
+        self.alu = FPMULBasePipe(self.pspec)
         ReservationStations.__init__(self, num_rows)
 
     def i_specfn(self):
-        return FPADDBaseData(self.width, self.pspec)
+        return FPADDBaseData(self.pspec)
 
     def o_specfn(self):
-        return FPPackData(self.width, self.pspec)
+        return FPPackData(self.pspec)
index dab89b27a6bf53759e3715a2c5a066987f8d21c9..c84eed7113f4a25c00b5aa1858b992ace488622d 100644 (file)
@@ -18,17 +18,16 @@ class FPMulSpecialCasesMod(Elaboratable):
         https://steve.hollasch.net/cgindex/coding/ieeefloat.html
     """
 
-    def __init__(self, width, pspec):
-        self.width = width
+    def __init__(self, pspec):
         self.pspec = pspec
         self.i = self.ispec()
         self.o = self.ospec()
 
     def ispec(self):
-        return FPADDBaseData(self.width, self.pspec)
+        return FPADDBaseData(self.pspec)
 
     def ospec(self):
-        return FPSCData(self.width, self.pspec, False)
+        return FPSCData(self.pspec, False)
 
     def setup(self, m, i):
         """ links module to inputs and outputs
@@ -45,8 +44,9 @@ class FPMulSpecialCasesMod(Elaboratable):
         #m.submodules.sc_out_z = self.o.z
 
         # decode: XXX really should move to separate stage
-        a1 = FPNumBaseRecord(self.width, False)
-        b1 = FPNumBaseRecord(self.width, False)
+        width = self.pspec['width']
+        a1 = FPNumBaseRecord(width, False)
+        b1 = FPNumBaseRecord(width, False)
         m.submodules.sc_decode_a = a1 = FPNumDecode(None, a1)
         m.submodules.sc_decode_b = b1 = FPNumDecode(None, b1)
         m.d.comb += [a1.v.eq(self.i.a),
@@ -131,24 +131,23 @@ class FPMulSpecialCasesDeNorm(FPState, SimpleHandshake):
     """ special cases: NaNs, infs, zeros, denormalised
     """
 
-    def __init__(self, width, pspec):
+    def __init__(self, pspec):
         FPState.__init__(self, "special_cases")
-        self.width = width
         self.pspec = pspec
         SimpleHandshake.__init__(self, self) # pipe is its own stage
         self.out = self.ospec()
 
     def ispec(self):
-        return FPADDBaseData(self.width, self.pspec)
+        return FPADDBaseData(self.pspec)
 
     def ospec(self):
-        return FPSCData(self.width, self.pspec, False)
+        return FPSCData(self.pspec, False)
 
     def setup(self, m, i):
         """ links module to inputs and outputs
         """
-        smod = FPMulSpecialCasesMod(self.width, self.pspec)
-        dmod = FPAddDeNormMod(self.width, self.pspec, False)
+        smod = FPMulSpecialCasesMod(self.pspec)
+        dmod = FPAddDeNormMod(self.pspec, False)
 
         chain = StageChain([smod, dmod])
         chain.setup(m, i)