flow: add AbstractActor busy signals
authorSebastien Bourdeauducq <sebastien@milkymist.org>
Fri, 25 Oct 2013 16:50:14 +0000 (18:50 +0200)
committerSebastien Bourdeauducq <sebastien@milkymist.org>
Fri, 25 Oct 2013 16:50:14 +0000 (18:50 +0200)
migen/flow/network.py

index 9bf775a774d272e3ea424e30ff32c42de82c246f..62900af8962f205eb2d2da792c9246885691ffd8 100644 (file)
@@ -14,6 +14,7 @@ class AbstractActor:
                self.actor_class = actor_class
                self.parameters = parameters
                self.name = name
+               self.busy = Signal()
        
        def create_instance(self):
                return self.actor_class(**self.parameters)
@@ -30,6 +31,7 @@ class DataFlowGraph(MultiDiGraph):
        def __init__(self):
                MultiDiGraph.__init__(self)
                self.elaborated = False
+               self.abstract_busy_signals = dict()
        
        def add_connection(self, source_node, sink_node,
          source_ep=None, sink_ep=None,         # default: assume nodes have 1 source/sink and use that one
@@ -71,7 +73,9 @@ class DataFlowGraph(MultiDiGraph):
                self.remove_node(old)
                
        def instantiate(self, actor):
-               self.replace_actor(actor, actor.create_instance())
+               inst = actor.create_instance()
+               self.abstract_busy_signals[id(inst)] = actor.busy
+               self.replace_actor(actor, inst)
        
        # Returns a dictionary
        #   source -> [sink1, ..., sinkn]
@@ -237,6 +241,15 @@ class CompositeActor(Module):
                                assert(not hasattr(self, k))
                                setattr(self, k, v)
 
+               # connect abstract busy signals
+               for node in dfg:
+                       try:
+                               abstract_busy_signal = dfg.abstract_busy_signals[id(node)]
+                       except KeyError:
+                               pass
+                       else:
+                               self.comb += abstract_busy_signal.eq(node.busy)
+
                # generate busy signal
                self.busy = Signal()
                self.comb += self.busy.eq(optree("|", [node.busy for node in dfg]))