+ # Mirror the nibbles on the last byte
+ last_start = positions[-2]
+ last_end = positions[-1]
+ last_middle = (last_start+last_end)//2
+ comb += self.output[last_middle:last_end].eq(
+ self.output[last_start:last_middle])
+ for i in range(self.mwidth, 0, -1):
+ start = positions[i-1]
+ end = positions[i]
+ middle = (start + end) // 2
+ # Propagate from the previous byte.
+ with m.If(~gates[i]):
+ comb += self.output[middle:end].eq(
+ self.output[last_middle:last_end])
+ with m.Else():
+ # ... unless it's a partition boundary.
+ # If so, mirror the nibbles again.
+ comb += self.output[middle:end].eq(
+ self.output[start:middle])
+ last_start = start
+ last_middle = middle
+ last_end = end
+