convert to DynamicPipe (default class in PipelineSpec: SimpleHandshake)
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 31 Jul 2019 09:47:53 +0000 (10:47 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 31 Jul 2019 09:47:53 +0000 (10:47 +0100)
src/ieee754/fpadd/specialcases.py
src/ieee754/fpcommon/getop.py
src/ieee754/fpcommon/normtopack.py
src/ieee754/fpdiv/divstages.py
src/ieee754/fpdiv/specialcases.py
src/ieee754/fpmul/align.py
src/ieee754/fpmul/mulstages.py
src/ieee754/fpmul/specialcases.py

index 3221e9cc73cf0c3fc4ebd19eac019f8fb104d1e0..33b1811afcf225e0fe9611d87141f132b5f7d043 100644 (file)
@@ -10,7 +10,7 @@ from ieee754.fpcommon.fpbase import FPNumDecode
 from nmutil.singlepipe import StageChain
 from ieee754.pipeline import DynamicPipe
 
 from nmutil.singlepipe import StageChain
 from ieee754.pipeline import DynamicPipe
 
-from ieee754.fpcommon.fpbase import FPState, FPID, FPNumBaseRecord
+from ieee754.fpcommon.fpbase import FPNumBaseRecord
 from ieee754.fpcommon.getop import FPADDBaseData
 from ieee754.fpcommon.denorm import (FPSCData, FPAddDeNormMod)
 
 from ieee754.fpcommon.getop import FPADDBaseData
 from ieee754.fpcommon.denorm import (FPSCData, FPAddDeNormMod)
 
@@ -146,33 +146,6 @@ class FPAddSpecialCasesMod(Elaboratable):
         return m
 
 
         return m
 
 
-class FPAddSpecialCases(FPState):
-    """ special cases: NaNs, infs, zeros, denormalised
-        NOTE: some of these are unique to add.  see "Special Operations"
-        https://steve.hollasch.net/cgindex/coding/ieeefloat.html
-    """
-
-    def __init__(self, width, id_wid):
-        FPState.__init__(self, "special_cases")
-        self.mod = FPAddSpecialCasesMod(width)
-        self.out_z = self.mod.ospec()
-        self.out_do_z = Signal(reset_less=True)
-
-    def setup(self, m, i):
-        """ links module to inputs and outputs
-        """
-        self.mod.setup(m, i, self.out_do_z)
-        m.d.sync += self.out_z.v.eq(self.mod.out_z.v) # only take the output
-        m.d.sync += self.out_z.ctx.eq(self.mod.o.ctx)  # (and mid)
-
-    def action(self, m):
-        self.idsync(m)
-        with m.If(self.out_do_z):
-            m.next = "put_z"
-        with m.Else():
-            m.next = "denormalise"
-
-
 class FPAddSpecialCasesDeNorm(DynamicPipe):
     """ special cases: NaNs, infs, zeros, denormalised
         NOTE: some of these are unique to add.  see "Special Operations"
 class FPAddSpecialCasesDeNorm(DynamicPipe):
     """ special cases: NaNs, infs, zeros, denormalised
         NOTE: some of these are unique to add.  see "Special Operations"
index fb7f3b26998679b624b5a03c255a0b063ce2e4d0..1bf971e754145684f1321cfdfec4731d5754dc1b 100644 (file)
@@ -9,7 +9,7 @@ from math import log
 
 from ieee754.fpcommon.fpbase import FPNumIn, FPNumOut, FPOpIn, Overflow, FPBase, FPNumBase
 from ieee754.fpcommon.fpbase import MultiShiftRMerge, Trigger
 
 from ieee754.fpcommon.fpbase import FPNumIn, FPNumOut, FPOpIn, Overflow, FPBase, FPNumBase
 from ieee754.fpcommon.fpbase import MultiShiftRMerge, Trigger
-from nmutil.singlepipe import (ControlBase, StageChain, SimpleHandshake,
+from nmutil.singlepipe import (ControlBase, StageChain,
                         PassThroughStage, PrevControl)
 from nmutil.multipipe import CombMuxOutPipe
 from nmutil.multipipe import PriorityCombMuxInPipe
                         PassThroughStage, PrevControl)
 from nmutil.multipipe import CombMuxOutPipe
 from nmutil.multipipe import PriorityCombMuxInPipe
index b90d02321cfa1988fafe910a54ca0d4f03364656..453c5c22a0a82c22331a816432bcb2291216e171 100644 (file)
@@ -4,24 +4,23 @@
 
 #from nmigen.cli import main, verilog
 
 
 #from nmigen.cli import main, verilog
 
-from nmutil.singlepipe import StageChain, SimpleHandshake
+from nmutil.singlepipe import StageChain
 
 
-from ieee754.fpcommon.fpbase import FPState, FPID
-from .postcalc import FPAddStage1Data
-from .postnormalise import FPNorm1ModSingle
-from .roundz import FPRoundMod
-from .corrections import FPCorrectionsMod
-from .pack import FPPackData, FPPackMod
+from ieee754.pipeline import DynamicPipe
+from ieee754.fpcommon.postcalc import FPAddStage1Data
+from ieee754.fpcommon.postnormalise import FPNorm1ModSingle
+from ieee754.fpcommon.roundz import FPRoundMod
+from ieee754.fpcommon.corrections import FPCorrectionsMod
+from ieee754.fpcommon.pack import FPPackData, FPPackMod
 
 
 
 
-class FPNormToPack(FPState, SimpleHandshake):
+class FPNormToPack(DynamicPipe):
 
     def __init__(self, pspec, e_extra=False):
 
     def __init__(self, pspec, e_extra=False):
-        FPState.__init__(self, "normalise_1")
         #print ("normtopack", pspec)
         self.pspec = pspec
         self.e_extra = e_extra
         #print ("normtopack", pspec)
         self.pspec = pspec
         self.e_extra = e_extra
-        SimpleHandshake.__init__(self, self) # pipeline is its own stage
+        super().__init__(pspec)
 
     def ispec(self):
         return FPAddStage1Data(self.pspec, e_extra=self.e_extra)
 
     def ispec(self):
         return FPAddStage1Data(self.pspec, e_extra=self.e_extra)
@@ -47,7 +46,3 @@ class FPNormToPack(FPState, SimpleHandshake):
 
     def process(self, i):
         return self.o
 
     def process(self, i):
         return self.o
-
-    def action(self, m):
-        m.d.sync += self.out_z.eq(self.process(None))
-        m.next = "pack_put_z"
index 112c9d8819bca3184d32d062fb5ae47f988184e4..81f9f3118f70963d54e8179300279a40995ef296 100644 (file)
@@ -7,9 +7,9 @@ Relevant bugreport: http://bugs.libre-riscv.org/show_bug.cgi?id=99
 from nmigen import Module
 from nmigen.cli import main, verilog
 
 from nmigen import Module
 from nmigen.cli import main, verilog
 
-from nmutil.singlepipe import (StageChain, SimpleHandshake)
+from nmutil.singlepipe import StageChain
 
 
-from ieee754.fpcommon.fpbase import FPState
+from ieee754.pipeline import DynamicPipe
 from ieee754.fpcommon.denorm import FPSCData
 from ieee754.fpcommon.postcalc import FPAddStage1Data
 from ieee754.div_rem_sqrt_rsqrt.div_pipe import (DivPipeInterstageData,
 from ieee754.fpcommon.denorm import FPSCData
 from ieee754.fpcommon.postcalc import FPAddStage1Data
 from ieee754.div_rem_sqrt_rsqrt.div_pipe import (DivPipeInterstageData,
@@ -23,15 +23,13 @@ from .div0 import FPDivStage0Mod
 from .div2 import FPDivStage2Mod
 
 
 from .div2 import FPDivStage2Mod
 
 
-class FPDivStagesSetup(FPState, SimpleHandshake):
+class FPDivStagesSetup(DynamicPipe):
 
     def __init__(self, pspec, n_stages, stage_offs):
 
     def __init__(self, pspec, n_stages, stage_offs):
-        FPState.__init__(self, "divsetup")
         self.pspec = pspec
         self.n_stages = n_stages # number of combinatorial stages
         self.stage_offs = stage_offs # each CalcStage needs *absolute* idx
         self.pspec = pspec
         self.n_stages = n_stages # number of combinatorial stages
         self.stage_offs = stage_offs # each CalcStage needs *absolute* idx
-        SimpleHandshake.__init__(self, self) # pipeline is its own stage
-        self.m1o = self.ospec()
+        super().__init__(pspec)
 
     def ispec(self):
         # REQUIRED.  do NOT change.
 
     def ispec(self):
         # REQUIRED.  do NOT change.
@@ -73,20 +71,14 @@ class FPDivStagesSetup(FPState, SimpleHandshake):
     def process(self, i):
         return self.o
 
     def process(self, i):
         return self.o
 
-    def action(self, m):
-        m.d.sync += self.m1o.eq(self.process(None))
-        m.next = "normalise_1"
 
 
-
-class FPDivStagesIntermediate(FPState, SimpleHandshake):
+class FPDivStagesIntermediate(DynamicPipe):
 
     def __init__(self, pspec, n_stages, stage_offs):
 
     def __init__(self, pspec, n_stages, stage_offs):
-        FPState.__init__(self, "divintermediate")
         self.pspec = pspec
         self.n_stages = n_stages # number of combinatorial stages
         self.stage_offs = stage_offs # each CalcStage needs *absolute* idx
         self.pspec = pspec
         self.n_stages = n_stages # number of combinatorial stages
         self.stage_offs = stage_offs # each CalcStage needs *absolute* idx
-        SimpleHandshake.__init__(self, self) # pipeline is its own stage
-        self.m1o = self.ospec()
+        super().__init__(pspec)
 
     def ispec(self):
         # TODO - this is for FPDivStage1Mod
 
     def ispec(self):
         # TODO - this is for FPDivStage1Mod
@@ -122,20 +114,14 @@ class FPDivStagesIntermediate(FPState, SimpleHandshake):
     def process(self, i):
         return self.o
 
     def process(self, i):
         return self.o
 
-    def action(self, m):
-        m.d.sync += self.m1o.eq(self.process(None))
-        m.next = "normalise_1"
-
 
 
-class FPDivStagesFinal(FPState, SimpleHandshake):
+class FPDivStagesFinal(DynamicPipe):
 
     def __init__(self, pspec, n_stages, stage_offs):
 
     def __init__(self, pspec, n_stages, stage_offs):
-        FPState.__init__(self, "divfinal")
         self.pspec = pspec
         self.n_stages = n_stages # number of combinatorial stages
         self.stage_offs = stage_offs # each CalcStage needs *absolute* idx
         self.pspec = pspec
         self.n_stages = n_stages # number of combinatorial stages
         self.stage_offs = stage_offs # each CalcStage needs *absolute* idx
-        SimpleHandshake.__init__(self, self) # pipeline is its own stage
-        self.m1o = self.ospec()
+        super().__init__(pspec)
 
     def ispec(self):
         return DivPipeInterstageData(self.pspec) # DIV ispec (loop)
 
     def ispec(self):
         return DivPipeInterstageData(self.pspec) # DIV ispec (loop)
@@ -180,9 +166,3 @@ class FPDivStagesFinal(FPState, SimpleHandshake):
 
     def process(self, i):
         return self.o
 
     def process(self, i):
         return self.o
-
-    def action(self, m):
-        m.d.sync += self.m1o.eq(self.process(None))
-        m.next = "normalise_1"
-
-
index f831886609b07759efeb3d1134daa9d9d371e9b9..feed87f7bf4e40186638bf0dbbc5a5975dc1d8b7 100644 (file)
@@ -14,9 +14,9 @@ from nmigen.cli import main, verilog
 from math import log
 
 from ieee754.fpcommon.fpbase import FPNumDecode, FPNumBaseRecord
 from math import log
 
 from ieee754.fpcommon.fpbase import FPNumDecode, FPNumBaseRecord
-from nmutil.singlepipe import SimpleHandshake, StageChain
+from nmutil.singlepipe import StageChain
 
 
-from ieee754.fpcommon.fpbase import FPState, FPID
+from ieee754.pipeline import DynamicPipe
 from ieee754.fpcommon.getop import FPADDBaseData
 from ieee754.fpcommon.denorm import (FPSCData, FPAddDeNormMod)
 from ieee754.fpmul.align import FPAlignModSingle
 from ieee754.fpcommon.getop import FPADDBaseData
 from ieee754.fpcommon.denorm import (FPSCData, FPAddDeNormMod)
 from ieee754.fpmul.align import FPAlignModSingle
@@ -174,41 +174,13 @@ class FPDIVSpecialCasesMod(Elaboratable):
         return m
 
 
         return m
 
 
-class FPDIVSpecialCases(FPState):
+class FPDIVSpecialCasesDeNorm(DynamicPipe):
     """ special cases: NaNs, infs, zeros, denormalised
     """ special cases: NaNs, infs, zeros, denormalised
-        NOTE: some of these are unique to div.  see "Special Operations"
-        https://steve.hollasch.net/cgindex/coding/ieeefloat.html
     """
 
     def __init__(self, pspec):
     """
 
     def __init__(self, pspec):
-        FPState.__init__(self, "special_cases")
-        self.mod = FPDIVSpecialCasesMod(pspec)
-        self.out_z = self.mod.ospec()
-        self.out_do_z = Signal(reset_less=True)
-
-    def setup(self, m, i):
-        """ links module to inputs and outputs
-        """
-        self.mod.setup(m, i, self.out_do_z)
-        m.d.sync += self.out_z.v.eq(self.mod.out_z.v)  # only take the output
-        m.d.sync += self.out_z.mid.eq(self.mod.o.mid)  # (and mid)
-
-    def action(self, m):
-        self.idsync(m)
-        with m.If(self.out_do_z):
-            m.next = "put_z"
-        with m.Else():
-            m.next = "denormalise"
-
-
-class FPDIVSpecialCasesDeNorm(FPState, SimpleHandshake):
-    """ special cases: NaNs, infs, zeros, denormalised
-    """
-
-    def __init__(self, pspec):
-        FPState.__init__(self, "special_cases")
         self.pspec = pspec
         self.pspec = pspec
-        SimpleHandshake.__init__(self, self)  # pipe is its own stage
+        super().__init__(pspec)
         self.out = self.ospec()
 
     def ispec(self):
         self.out = self.ospec()
 
     def ispec(self):
@@ -234,11 +206,3 @@ class FPDIVSpecialCasesDeNorm(FPState, SimpleHandshake):
 
     def process(self, i):
         return self.o
 
     def process(self, i):
         return self.o
-
-    def action(self, m):
-        # for break-out (early-out)
-        #with m.If(self.out_do_z):
-        #    m.next = "put_z"
-        #with m.Else():
-            m.d.sync += self.out.eq(self.process(None))
-            m.next = "align"
index 2f578e9ed55f05afc4e1a685b622b07e4a2764be..a32024e014de49bb3cce5c1cc6e79f0fbbf28d25 100644 (file)
@@ -4,7 +4,7 @@ from nmigen import Module, Signal, Cat, Mux, Elaboratable
 from nmigen.cli import main, verilog
 from math import log
 
 from nmigen.cli import main, verilog
 from math import log
 
-from nmutil.singlepipe import (StageChain, SimpleHandshake)
+from nmutil.singlepipe import StageChain
 
 from ieee754.fpcommon.fpbase import (Overflow, OverflowMod,
                                      FPNumBase, FPNumBaseRecord)
 
 from ieee754.fpcommon.fpbase import (Overflow, OverflowMod,
                                      FPNumBase, FPNumBaseRecord)
index 415ed8efdfaad8fe5a4c399a6dbb01b238694e55..2e96ed3b668e1151e5bf68e7271af6ba15f13132 100644 (file)
@@ -3,21 +3,20 @@
 from nmigen import Module
 from nmigen.cli import main, verilog
 
 from nmigen import Module
 from nmigen.cli import main, verilog
 
-from nmutil.singlepipe import (StageChain, SimpleHandshake)
+from nmutil.singlepipe import StageChain
 
 
-from ieee754.fpcommon.fpbase import FPState
+from ieee754.pipeline import DynamicPipe
 from ieee754.fpcommon.denorm import FPSCData
 from ieee754.fpcommon.postcalc import FPAddStage1Data
 from ieee754.fpcommon.denorm import FPSCData
 from ieee754.fpcommon.postcalc import FPAddStage1Data
-from .mul0 import FPMulStage0Mod
-from .mul1 import FPMulStage1Mod
+from ieee754.fpmul.mul0 import FPMulStage0Mod
+from ieee754.fpmul.mul1 import FPMulStage1Mod
 
 
 
 
-class FPMulStages(FPState, SimpleHandshake):
+class FPMulStages(DynamicPipe):
 
     def __init__(self, pspec):
 
     def __init__(self, pspec):
-        FPState.__init__(self, "mulstages")
         self.pspec = pspec
         self.pspec = pspec
-        SimpleHandshake.__init__(self, self) # pipeline is its own stage
+        super().__init__(pspec)
         self.m1o = self.ospec()
 
     def ispec(self):
         self.m1o = self.ospec()
 
     def ispec(self):
@@ -42,8 +41,3 @@ class FPMulStages(FPState, SimpleHandshake):
     def process(self, i):
         return self.o
 
     def process(self, i):
         return self.o
 
-    def action(self, m):
-        m.d.sync += self.m1o.eq(self.process(None))
-        m.next = "normalise_1"
-
-
index 8e0fada2824094a29a1a320275e6ee6820b448f8..eb3fe50a3073f2bb14ae3d2ea8436024073436a6 100644 (file)
@@ -5,9 +5,9 @@ from nmigen.cli import main, verilog
 from math import log
 
 from ieee754.fpcommon.fpbase import FPNumDecode, FPNumBaseRecord
 from math import log
 
 from ieee754.fpcommon.fpbase import FPNumDecode, FPNumBaseRecord
-from nmutil.singlepipe import SimpleHandshake, StageChain
+from nmutil.singlepipe import StageChain
 
 
-from ieee754.fpcommon.fpbase import FPState, FPID
+from ieee754.pipeline import DynamicPipe
 from ieee754.fpcommon.getop import FPADDBaseData
 from ieee754.fpcommon.denorm import (FPSCData, FPAddDeNormMod)
 from ieee754.fpmul.align import FPAlignModSingle
 from ieee754.fpcommon.getop import FPADDBaseData
 from ieee754.fpcommon.denorm import (FPSCData, FPAddDeNormMod)
 from ieee754.fpmul.align import FPAlignModSingle
@@ -101,41 +101,13 @@ class FPMulSpecialCasesMod(Elaboratable):
         return m
 
 
         return m
 
 
-class FPMulSpecialCases(FPState):
-    """ special cases: NaNs, infs, zeros, denormalised
-        NOTE: some of these are unique to add.  see "Special Operations"
-        https://steve.hollasch.net/cgindex/coding/ieeefloat.html
-    """
-
-    def __init__(self, width, id_wid):
-        FPState.__init__(self, "special_cases")
-        self.mod = FPMulSpecialCasesMod(width)
-        self.out_z = self.mod.ospec()
-        self.out_do_z = Signal(reset_less=True)
-
-    def setup(self, m, i):
-        """ links module to inputs and outputs
-        """
-        self.mod.setup(m, i, self.out_do_z)
-        m.d.sync += self.out_z.v.eq(self.mod.out_z.v) # only take the output
-        m.d.sync += self.out_z.ctx.eq(self.mod.o.ctx)  # (and context)
-
-    def action(self, m):
-        self.idsync(m)
-        with m.If(self.out_do_z):
-            m.next = "put_z"
-        with m.Else():
-            m.next = "denormalise"
-
-
-class FPMulSpecialCasesDeNorm(FPState, SimpleHandshake):
+class FPMulSpecialCasesDeNorm(DynamicPipe):
     """ special cases: NaNs, infs, zeros, denormalised
     """
 
     def __init__(self, pspec):
     """ special cases: NaNs, infs, zeros, denormalised
     """
 
     def __init__(self, pspec):
-        FPState.__init__(self, "special_cases")
         self.pspec = pspec
         self.pspec = pspec
-        SimpleHandshake.__init__(self, self) # pipe is its own stage
+        super().__init__(pspec)
         self.out = self.ospec()
 
     def ispec(self):
         self.out = self.ospec()
 
     def ispec(self):
@@ -162,12 +134,3 @@ class FPMulSpecialCasesDeNorm(FPState, SimpleHandshake):
     def process(self, i):
         return self.o
 
     def process(self, i):
         return self.o
 
-    def action(self, m):
-        # for break-out (early-out)
-        #with m.If(self.out_do_z):
-        #    m.next = "put_z"
-        #with m.Else():
-            m.d.sync += self.out.eq(self.process(None))
-            m.next = "align"
-
-