complicated. change ControlBase.connect API to return list of eq statements
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 28 Mar 2019 03:45:36 +0000 (03:45 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 28 Mar 2019 03:45:36 +0000 (03:45 +0000)
nmigen module elaborate is not done recursively on submodules in
depth-first order.  connect fn was having a side-effect of establishing
the p.i_data and n.o_data... which were not set up from a submodule yet.

src/add/nmigen_add_experiment.py
src/add/singlepipe.py
src/add/test_buf_pipe.py

index 92588762310a13acb34c906e0959a1b45d6c1df6..4b4d9116f61d2e0eba7eb0bd519b6ecd0b8fa6ea 100644 (file)
@@ -1894,13 +1894,12 @@ class FPADDBasePipe(ControlBase):
     def __init__(self, width, id_wid):
         ControlBase.__init__(self)
         self.pipe1 = FPADDBasePipe1(width, id_wid)
-        self.p.i_data = self.pipe1.stage.ispec()
-        self.n.o_data = self.pipe1.stage.ospec()
+        self._eqs = self.connect([self.pipe1])
 
     def elaborate(self, platform):
         m = Module()
         m.submodules.pipe1 = self.pipe1
-        self.connect(m, [self.pipe1])
+        m.d.comb += self._eqs
         return m
 
 
index 3150d389269d798a1b875c4dd21977ebec8a04f1..775081f3dddf3733be154c6a6467f1e081c55669 100644 (file)
@@ -411,7 +411,7 @@ class ControlBase:
         """
         return self.n._connect_out(nxt.n)
 
-    def connect(self, m, pipechain):
+    def connect(self, pipechain):
         """ connects a chain (list) of Pipeline instances together and
             links them to this ControlBase instance:
 
@@ -451,16 +451,15 @@ class ControlBase:
 
         # connect front of chain to ourselves
         front = pipechain[0]
-        #self.p.i_data = front.stage.ispec()
+        self.p.i_data = front.stage.ispec()
         eqs += front._connect_in(self)
 
         # connect end of chain to ourselves
         end = pipechain[-1]
-        #self.n.o_data = end.stage.ospec()
+        self.n.o_data = end.stage.ospec()
         eqs += end._connect_out(self)
 
-        # activate the assignments
-        m.d.comb += eqs
+        return eqs
 
     def set_input(self, i):
         """ helper function to set the input data
index f4764974b9f93ecddcde589a38697c7a2bd24ff2..af725d23c89581e96614fe821e8d2bdeab53ffa8 100644 (file)
@@ -291,13 +291,10 @@ class ExampleBufPipe2(ControlBase):
         pipe1 = ExampleBufPipe()
         pipe2 = ExampleBufPipe()
 
-        self.p.i_data = pipe1.stage.ispec()
-        self.n.o_data = pipe2.stage.ospec()
-
         m.submodules.pipe1 = pipe1
         m.submodules.pipe2 = pipe2
 
-        self.connect(m, [pipe1, pipe2])
+        m.d.comb += self.connect([pipe1, pipe2])
 
         return m