flow: simplify actor fragment interface
authorSebastien Bourdeauducq <sebastien@milkymist.org>
Tue, 10 Jan 2012 14:54:51 +0000 (15:54 +0100)
committerSebastien Bourdeauducq <sebastien@milkymist.org>
Tue, 10 Jan 2012 14:54:51 +0000 (15:54 +0100)
examples/dataflow.py
migen/flow/actor.py
migen/flow/network.py
migen/flow/plumbing.py

index 8e43f8c5d0186a1de6d2d40e19ffc765d97af14d..aab603f9a0ea8dcdfa317b7d92c383d3dec62123 100644 (file)
@@ -1,7 +1,7 @@
 import sys
 import networkx as nx
 
-from migen.fhdl import verilog 
+from migen.fhdl import verilog
 from migen.flow.ala import *
 from migen.flow.network import *
 from migen.flow.composer import *
@@ -13,7 +13,7 @@ a3 = make_composable(g, Add(BV(16)))
 c3 = (a1 + a2)*a3
 c = CompositeActor(g)
 
-frag = c.get_control_fragment() + c.get_process_fragment()
+frag = c.get_fragment()
 
 print(verilog.convert(frag))
 
index 25279bd842bef1092d3cbb9c451faaeeb3d36ab6..346cc06e054749c94d5d990be3df5442398d5dbd 100644 (file)
@@ -146,28 +146,26 @@ class Actor:
                elif self.scheduling_model.model == SchedulingModel.PIPELINE:
                        return _control_fragment_pipe(self.scheduling_model.latency, stb_i, ack_o, stb_o, ack_i, self.busy, self.pipe_ce)
                elif self.scheduling_model.model == SchedulingModel.DYNAMIC:
-                       raise NotImplementedError("Actor classes with dynamic scheduling must overload get_control_fragment")
+                       raise NotImplementedError("Actor classes with dynamic scheduling must overload get_control_fragment or get_fragment")
        
        def get_process_fragment(self):
                raise NotImplementedError("Actor classes must overload get_process_fragment")
        
+       def get_fragment(self):
+               return self.get_control_fragment() + self.get_process_fragment()
+       
        def __repr__(self):
                return "<" + self.__class__.__name__ + " " + repr(self.scheduling_model) + " " + repr(self.sinks()) + " " + repr(self.sources()) + ">"
 
-def get_conn_control_fragment(source, sink):
-       assert isinstance(source, Source)
-       assert isinstance(sink, Sink)
-       comb = [
-               source.ack.eq(sink.ack),
-               sink.stb.eq(source.stb)
-       ]
-       return Fragment(comb)
-       
-def get_conn_process_fragment(source, sink):
+def get_conn_fragment(source, sink):
        assert isinstance(source, Source)
        assert isinstance(sink, Sink)
        assert sink.token.compatible(source.token)
        sigs_source = source.token.flatten()
        sigs_sink = sink.token.flatten()
-       comb = [Cat(*sigs_sink).eq(Cat(*sigs_source))]
+       comb = [
+               source.ack.eq(sink.ack),
+               sink.stb.eq(source.stb),
+               Cat(*sigs_sink).eq(Cat(*sigs_source))
+       ]
        return Fragment(comb)
index 409e32c2699d4d12e95deb21eb34ce26d53c5b68..d0333a3d3cbedd155b30c24a696c810e2c4bd785 100644 (file)
@@ -20,18 +20,12 @@ class CompositeActor(Actor):
                        SchedulingModel(SchedulingModel.DYNAMIC),
                        endpoints=our_endpoints)
        
-       def get_control_fragment(self):
-               this = sum([get_conn_control_fragment(x[2]['source'], x[2]['sink'])
+       def get_fragment(self):
+               this = sum([get_conn_fragment(x[2]['source'], x[2]['sink'])
                        for x in self.dfg.edges(data=True)], Fragment())
-               others = sum([node.get_control_fragment() for node in self.dfg], Fragment())
+               others = sum([node.get_fragment() for node in self.dfg], Fragment())
                busy = Fragment([self.busy.eq(optree('|', [node.busy for node in self.dfg]))])
                return this + others + busy
-       
-       def get_process_fragment(self):
-               this = sum([get_conn_process_fragment(x[2]['source'], x[2]['sink'])
-                       for x in self.dfg.edges(data=True)], Fragment())
-               others = sum([node.get_process_fragment() for node in self.dfg], Fragment())
-               return this + others
 
 def add_connection(dfg, source_node, sink_node, source_ep=None, sink_ep=None):
        if source_ep is None:
index e7f06efcec40e466e7158c7ac0ceaede64240d27..6f9c8b44491a4f507ab5c09dda64e32fdc34f463 100644 (file)
@@ -25,10 +25,7 @@ class Combinator(Actor):
                        SchedulingModel(SchedulingModel.COMBINATORIAL),
                        self.ins, self.destination)
 
-       def get_process_fragment(self):
-               return Fragment() # nothing to do
-       
-       def get_control_fragment(self):
+       def get_fragment(self):
                source = self.sources()[0]
                sinks = self.sinks()
                comb = [source.stb.eq(optree('&', [sink.stb for sink in sinks]))]
@@ -43,7 +40,4 @@ class Splitter(Actor):
                        SchedulingModel(SchedulingModel.COMBINATORIAL),
                        self.source, self.outs)
                
-       def get_process_fragment(self):
-               return Fragment() # nothing to do
-       
-       # TODO def get_control_fragment(self):
+       # TODO def get_fragment(self):