back.rtlil: match shape of Array elements to ArrayProxy shape.
authorwhitequark <cz@m-labs.hk>
Mon, 31 Dec 2018 03:43:34 +0000 (03:43 +0000)
committerwhitequark <cz@m-labs.hk>
Mon, 31 Dec 2018 03:43:34 +0000 (03:43 +0000)
Fixes #15.

nmigen/back/rtlil.py

index 10ff80f6bdc6f75e07af5d7adc74b9fea5104658..83a7d176a3cf21cc068056ca632cb68f74e88654 100644 (file)
@@ -328,9 +328,10 @@ class _ValueCompiler(xfrm.ValueVisitor):
         index = self.s.expand(value.index)
         if isinstance(index, ast.Const):
             if index.value < len(value.elems):
-                return self(value.elems[index.value])
+                elem = value.elems[index.value]
             else:
-                return self(value.elems[-1])
+                elem = value.elems[-1]
+            return self.match_shape(elem, *value.shape())
         else:
             raise LegalizeValue(value.index, range(len(value.elems)))
 
@@ -503,6 +504,10 @@ class _LHSValueCompiler(_ValueCompiler):
     def on_Operator(self, value):
         raise TypeError # :nocov:
 
+    def match_shape(self, value, new_bits, new_sign):
+        assert value.shape() == (new_bits, new_sign)
+        return self(value)
+
     def on_Signal(self, value):
         wire_curr, wire_next = self.s.resolve(value)
         if wire_next is None: