actorlib/structuring: add Pipeline
authorFlorent Kermarrec <florent@enjoy-digital.fr>
Fri, 31 Oct 2014 12:09:24 +0000 (13:09 +0100)
committerSebastien Bourdeauducq <sb@m-labs.hk>
Sat, 1 Nov 2014 13:47:00 +0000 (21:47 +0800)
Pipeline enables easy cascading of dataflow modules.
DataFlowGraph can eventually use it to implement the
add_pipeline method to avoid duplicating things.

migen/actorlib/structuring.py

index 70a60e5d3ad9dbb02781a21c4e38ac2ed6de19c0..24199aca59c1b17fa42e33ac497cb78447b50afa 100644 (file)
@@ -197,3 +197,31 @@ class Converter(Module):
                else:
                        self.comb += Record.connect(self.sink, self.source)
 
+class Pipeline(Module):
+       def __init__(self, *modules):
+               n = len(modules)
+               m = modules[0]
+               # expose sink of first module
+               # if available
+               if hasattr(m, "sink"):
+                       self.sink = m.sink
+               # use of busy is encouraged
+               # but not mandatory
+               if hasattr(m, "busy"):
+                       busy = m.busy
+               else:
+                       busy = 0
+               for i in range(1, n):
+                       m_n = modules[i]
+                       if hasattr(m_n, "busy"):
+                               busy_n = m_n.busy
+                       else:
+                               busy_n = 0
+                       self.comb += m.source.connect(m_n.sink)
+                       m = m_n
+                       busy = busy | busy_n
+               # expose source of last module
+               # if available
+               if hasattr(m, "source"):
+                       self.source = m.source
+               self.busy = busy