semi-working, top-level signals okay, ObjectProxy not yet connected
[ieee754fpu.git] / src / add / pipeline_example.py
index 86bc8549bbeec06cc966c3227c0706daa4860cd2..922355d64522344322f77158ca4dadebd87ac75a 100644 (file)
@@ -1,6 +1,6 @@
 """ Example 5: Making use of PyRTL and Introspection. """
 
-from nmigen import Module, Signal
+from nmigen import Module, Signal, Const
 from nmigen.cli import main, verilog, rtlil
 
 
@@ -52,8 +52,8 @@ class ObjectBasedPipelineExample(SimplePipeline):
     def stage1(self):
         self.n = self.n + self.o.a
         o = ObjectProxy(self._m)
-        o.a = self.n
-        o.b = self.o.b
+        o.c = self.n
+        o.d = self.o.b + self.n + Const(5)
         self.o = o
 
     def stage2(self):
@@ -61,16 +61,16 @@ class ObjectBasedPipelineExample(SimplePipeline):
         self._m.d.comb += localv.eq(2)
         self.n = self.n << localv
         o = ObjectProxy(self._m)
-        o.b = self.n + self.o.a + self.o.b
+        o.e = self.n + self.o.c + self.o.d
         self.o = o
 
     def stage3(self):
         self.n = ~self.n
         self.o = self.o
-        self.o.b = self.o.b + self.n
+        self.o.e = self.o.e + self.n
 
     def stage4(self):
-        self._m.d.sync += self._loopback.eq(self.n + 3 + self.o.b)
+        self._m.d.sync += self._loopback.eq(self.n + 3 + self.o.e)
 
 
 class PipeModule:
@@ -103,7 +103,8 @@ class PipelineStageExample:
                 #p.n = ~self._loopback + 5
                 localv = Signal(4)
                 m.d.comb += localv.eq(2)
-                p.n = p.n << localv
+                p.n = p.n << localv + 1
+                #p.m = p.n + 2
 
         print (pipe.stages)
 
@@ -118,34 +119,65 @@ class PipelineStageObjectExample:
 
         m = Module()
 
-        o = ObjectProxy(None)
+        o = ObjectProxy(None, pipemode=False)
         o.a = Signal(4)
         o.b = Signal(4)
         self._obj = o
 
+        localv2 = Signal(4)
+        m.d.sync += localv2.eq(localv2 + 3)
+
+        #m.d.comb += self.obj.a.eq(localv2 + 1)
+        #m.d.sync += self._loopback.eq(localv2)
+
+        ispec= [self._loopback, self._obj]
         with PipeManager(m, pipemode=True) as pipe:
 
             with pipe.Stage("first",
-                            ispec=[self._loopback, self._obj]) as (p, m):
+                            ispec=ispec) as (p, m):
                 p.n = ~self._loopback
                 p.o = self._obj
             with pipe.Stage("second", p) as (p, m):
                 #p.n = ~self._loopback + 2
-                p.n = p.n + 2
-                o = ObjectProxy(None)
-                o.a = p.n
-                o.b = p.o.b
+                p.n = p.n + Const(2)
+                o = ObjectProxy(None, pipemode=False)
+                o.c = p.n
+                o.d = p.o.b + p.n + Const(5)
                 p.o = o
             with pipe.Stage("third", p) as (p, m):
                 #p.n = ~self._loopback + 5
                 localv = Signal(4)
                 m.d.comb += localv.eq(2)
                 p.n = p.n << localv
-                o = ObjectProxy(None)
-                o.b = p.n + p.o.a + p.o.b
+                o = ObjectProxy(None, pipemode=False)
+                o.e = p.n + p.o.c + p.o.d
                 p.o = o
 
-        print (pipe.stages)
+        print ("stages", pipe.stages)
+
+        return m
+
+
+class PipelineStageObjectExample2:
+
+    def __init__(self):
+        self._loopback = Signal(4)
+
+    def get_fragment(self, platform=None):
+
+        m = Module()
+
+        ispec= [self._loopback]
+        with PipeManager(m, pipemode=True) as pipe:
+
+            with pipe.Stage("first",
+                            ispec=ispec) as (p, m):
+                p.n = ~self._loopback
+                o = ObjectProxy(None, pipemode=False)
+                o.b = ~self._loopback + Const(5)
+                p.o = o
+
+        print ("stages", pipe.stages)
 
         return m