convert fcvt to DynamicPipe
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 31 Jul 2019 10:04:08 +0000 (11:04 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 31 Jul 2019 10:04:08 +0000 (11:04 +0100)
src/ieee754/fcvt/pipeline.py
src/ieee754/pipeline.py

index d8f0db06cb6124045b0b070f7f2e7af03b3f15e5..cb23a02447f8ecfe683309cf463520bb8a85c4aa 100644 (file)
@@ -21,10 +21,9 @@ from math import log
 
 from ieee754.fpcommon.getop import FPPipeContext
 
-from nmutil.singlepipe import SimpleHandshake, StageChain
+from nmutil.singlepipe import StageChain
 
-from ieee754.fpcommon.fpbase import FPState
-from ieee754.pipeline import PipelineSpec
+from ieee754.pipeline import PipelineSpec, DynamicPipe
 
 from ieee754.fcvt.float2int import FPCVTFloatToIntMod
 from ieee754.fcvt.int2float import FPCVTIntToFloatMod
@@ -40,21 +39,22 @@ class SignedOp:
         return [self.signed.eq(i)]
 
 
-class FPCVTConvertDeNorm(FPState, SimpleHandshake):
+class FPCVTConvertDeNorm(DynamicPipe):
     """ FPConversion and De-norm
     """
 
-    def __init__(self, modkls, in_pspec, out_pspec):
-        FPState.__init__(self, "cvt")
+    def __init__(self, in_pspec, out_pspec, modkls):
+        print ("cvtdenorm")
         sc = modkls(in_pspec, out_pspec)
-        SimpleHandshake.__init__(self, sc)
+        in_pspec.stage = sc
+        super().__init__(in_pspec)
         self.out = self.ospec(None)
 
 
 class FPCVTFtoIntBasePipe(ControlBase):
     def __init__(self, modkls, e_extra, in_pspec, out_pspec):
         ControlBase.__init__(self)
-        self.pipe1 = FPCVTConvertDeNorm(modkls, in_pspec, out_pspec)
+        self.pipe1 = FPCVTConvertDeNorm(in_pspec, out_pspec, modkls)
         #self.pipe2 = FPNormToPack(out_pspec, e_extra=e_extra)
 
         #self._eqs = self.connect([self.pipe1, self.pipe2])
@@ -71,7 +71,7 @@ class FPCVTFtoIntBasePipe(ControlBase):
 class FPCVTBasePipe(ControlBase):
     def __init__(self, modkls, e_extra, in_pspec, out_pspec):
         ControlBase.__init__(self)
-        self.pipe1 = FPCVTConvertDeNorm(modkls, in_pspec, out_pspec)
+        self.pipe1 = FPCVTConvertDeNorm(in_pspec, out_pspec, modkls)
         self.pipe2 = FPNormToPack(out_pspec, e_extra=e_extra)
 
         self._eqs = self.connect([self.pipe1, self.pipe2])
@@ -99,8 +99,8 @@ class FPCVTMuxInOutBase(ReservationStations):
         self.op_wid = op_wid
         self.id_wid = num_bits(num_rows)
 
-        self.in_pspec = PipelineSpec(in_width, id_wid, self.op_wid)
-        self.out_pspec = PipelineSpec(out_width, id_wid, op_wid)
+        self.in_pspec = PipelineSpec(in_width, self.id_wid, self.op_wid)
+        self.out_pspec = PipelineSpec(out_width, self.id_wid, op_wid)
 
         self.alu = pkls(modkls, e_extra, self.in_pspec, self.out_pspec)
         ReservationStations.__init__(self, num_rows)
index 9c6866d6121eb7355af5302faefc3491de3eb92f..3bd4d9f340d38aa2e5aedb4852d4ccaf1290175b 100644 (file)
@@ -32,6 +32,7 @@ class PipelineSpec:
         self.op_wid = op_wid
         self.opkls = opkls
         self.pipekls = pipekls or SimpleHandshakeRedir
+        self.stage = None
         self.core_config = None
         self.fpformat = None
         self.n_comb_stages = None
@@ -96,7 +97,10 @@ class DynamicPipe(metaclass=Meta):
 # "self" as the 1st argument (it is its own "Stage").  anything else
 # could hypothetically be passed through the pspec.
 class SimpleHandshakeRedir(SimpleHandshake):
-    def __init__(self, pspec, *args):
-        print ("redir", pspec, args)
-        SimpleHandshake.__init__(self, self)
+    def __init__(self, mod, *args):
+        print ("redir", mod, args)
+        stage = self
+        if args and args[0].stage:
+            stage = args[0].stage
+        SimpleHandshake.__init__(self, stage)