From: Florent Kermarrec Date: Mon, 27 Apr 2015 13:12:01 +0000 (+0200) Subject: migen/actorlib/misc: add BufferizeEndpoints X-Git-Tag: 24jan2021_ls180~2099^2~74 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f976b1916a5edea289d506bfab353b5188854623;p=litex.git migen/actorlib/misc: add BufferizeEndpoints BufferizeEndpoints provides an easy way improve timings of chained dataflow modules and avoid polluting code with internals buffers. --- diff --git a/migen/actorlib/misc.py b/migen/actorlib/misc.py index 0779957c..3dca8823 100644 --- a/migen/actorlib/misc.py +++ b/migen/actorlib/misc.py @@ -2,6 +2,7 @@ from migen.fhdl.std import * from migen.genlib.record import * from migen.genlib.fsm import * from migen.flow.actor import * +from migen.flow.plumbing import Buffer # Generates integers from start to maximum-1 @@ -63,3 +64,33 @@ class IntSequence(Module): If(last, NextState("IDLE")) ) ) + +# Add buffers on Endpoints (can be used to improve timings) +class BufferizeEndpoints(ModuleTransformer): + def __init__(self, *names): + self.names = names + + def transform_instance(self, submodule): + endpoints = get_endpoints(submodule) + sinks = {} + sources = {} + for name, endpoint in endpoints.items(): + if not self.names or name in self.names: + if isinstance(endpoint, Sink): + sinks.update({name: endpoint}) + elif isinstance(endpoint, Source): + sources.update({name: endpoint}) + + # add buffer on sinks + for name, sink in sinks.items(): + buf = Buffer(sink.description) + submodule.submodules += buf + setattr(submodule, name, buf.d) + submodule.comb += Record.connect(buf.q, sink) + + # add buffer on sources + for name, source in sources.items(): + buf = Buffer(source.description) + submodule.submodules += buf + submodule.comb += Record.connect(source, buf.d) + setattr(submodule, name, buf.q)