Avoid timing violation on ECP5 PHY PAUSE signal
[gram.git] / gram / stream.py
index c97e5aab38708c73d6166fa4dc690d5b9ad45e6a..463e2bd1ff08cb057105b8fdb2be0e4eb4013aa7 100644 (file)
@@ -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