X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gram%2Fstream.py;h=463e2bd1ff08cb057105b8fdb2be0e4eb4013aa7;hb=6b7e293c39dcb17f9f435e6c1c27f4ee0b1f589f;hp=c97e5aab38708c73d6166fa4dc690d5b9ad45e6a;hpb=5eb455681447abe04a337bf65fe37fa1785a61e0;p=gram.git diff --git a/gram/stream.py b/gram/stream.py index c97e5aa..463e2bd 100644 --- a/gram/stream.py +++ b/gram/stream.py @@ -153,7 +153,7 @@ class _UpConverter(Elaboratable): source_layout.append(("valid_token_count", bits_for(ratio))) self.source = source = Endpoint(source_layout) self.ratio = ratio - self._nbits_from = nbits_from + self._nbits_from = nbits_from self._reverse = reverse self._report_valid_token_count = report_valid_token_count @@ -195,7 +195,8 @@ class _UpConverter(Elaboratable): for i in range(self.ratio): with m.Case(i): n = self.ratio-i-1 if self._reverse else i - m.d.sync += self.source.payload.lower()[n*self._nbits_from:(n+1)*self._nbits_from].eq(self.sink.payload) + m.d.sync += self.source.payload.lower()[n*self._nbits_from:( + n+1)*self._nbits_from].eq(self.sink.payload) if self._report_valid_token_count: with m.If(load_part): @@ -246,7 +247,12 @@ class _DownConverter(Elaboratable): for i in range(self.ratio): with m.Case(i): n = self.ratio-i-1 if self._reverse else i - m.d.comb += self.source.data.eq(self.sink.data[n*self._nbits_to:(n+1)*self._nbits_to]) + m.d.comb += self.source.data.eq( + self.sink.data[n*self._nbits_to:(n+1)*self._nbits_to]) + with m.Case(): + n = self.ratio-self.ratio-1-1 if self._reverse else self.ratio-1 + m.d.comb += self.source.data.eq( + self.sink.data[n*self._nbits_to:(n+1)*self._nbits_to]) if self._report_valid_token_count: m.d.comb += self.source.valid_token_count.eq(last) @@ -299,7 +305,7 @@ class Converter(Elaboratable): report_valid_token_count=False): cls, ratio = _get_converter_ratio(nbits_from, nbits_to) self.specialized = cls(nbits_from, nbits_to, ratio, - reverse, report_valid_token_count) + reverse, report_valid_token_count) self.sink = self.specialized.sink self.source = self.specialized.source @@ -328,7 +334,7 @@ class StrideConverter(Elaboratable): nbits_from = len(self.sink.payload.lower()) nbits_to = len(self.source.payload.lower()) - + m.submodules += self.converter # cast sink to converter.sink (user fields --> raw bits) @@ -347,8 +353,8 @@ class StrideConverter(Elaboratable): m.d.comb += dst.eq(src) j += width else: - m.d.comb += self.converter.sink.payload.eq(self.sink.payload.lower()) - + m.d.comb += self.converter.sink.payload.eq( + self.sink.payload.lower()) # cast converter.source to source (raw bits --> user fields) m.d.comb += [ @@ -370,6 +376,7 @@ class StrideConverter(Elaboratable): return m + class Pipeline(Elaboratable): def __init__(self, *modules): self._modules = modules @@ -389,19 +396,23 @@ class Pipeline(Elaboratable): n = len(self._modules) mod = self._modules[0] - + for i in range(1, n): mod_n = self._modules[i] + if isinstance(mod, Endpoint): source = mod else: source = mod.source + if isinstance(mod_n, Endpoint): sink = mod_n else: sink = mod_n.sink + if mod is not mod_n: m.d.comb += source.connect(sink) + mod = mod_n return m