From: Florent Kermarrec Date: Thu, 12 Nov 2015 17:54:15 +0000 (+0100) Subject: soc/interconnect/stream: add BufferizeEndpoints X-Git-Tag: 24jan2021_ls180~2072 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7d6cee6751a4349cebe2bda6053417b25b5e59bd;p=litex.git soc/interconnect/stream: add BufferizeEndpoints --- diff --git a/litex/soc/interconnect/stream.py b/litex/soc/interconnect/stream.py index f6b1bb02..0647af94 100644 --- a/litex/soc/interconnect/stream.py +++ b/litex/soc/interconnect/stream.py @@ -459,4 +459,34 @@ class Pipeline(Module): self.source = m.source +# 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) + # XXX