hdl.ir: cast instance port connections to Values.
authorwhitequark <cz@m-labs.hk>
Sun, 13 Oct 2019 03:19:17 +0000 (03:19 +0000)
committerwhitequark <cz@m-labs.hk>
Sun, 13 Oct 2019 03:19:17 +0000 (03:19 +0000)
Fixes #249.

nmigen/hdl/ir.py
nmigen/test/test_hdl_ir.py

index 3173399104b7e009b5dd796cf0547439d17fec83..0f718ffbe60e1e1a96ee8a81aef31f4fc2092212 100644 (file)
@@ -563,7 +563,7 @@ class Instance(Fragment):
             elif kind == "p":
                 self.parameters[name] = value
             elif kind in ("i", "o", "io"):
-                self.named_ports[name] = (value, kind)
+                self.named_ports[name] = (Value.cast(value), kind)
             else:
                 raise NameError("Instance argument {!r} should be a tuple (kind, name, value) "
                                 "where kind is one of \"p\", \"i\", \"o\", or \"io\""
@@ -575,11 +575,11 @@ class Instance(Fragment):
             elif kw.startswith("p_"):
                 self.parameters[kw[2:]] = arg
             elif kw.startswith("i_"):
-                self.named_ports[kw[2:]] = (arg, "i")
+                self.named_ports[kw[2:]] = (Value.cast(arg), "i")
             elif kw.startswith("o_"):
-                self.named_ports[kw[2:]] = (arg, "o")
+                self.named_ports[kw[2:]] = (Value.cast(arg), "o")
             elif kw.startswith("io_"):
-                self.named_ports[kw[3:]] = (arg, "io")
+                self.named_ports[kw[3:]] = (Value.cast(arg), "io")
             else:
                 raise NameError("Instance keyword argument {}={!r} does not start with one of "
                                 "\"p_\", \"i_\", \"o_\", or \"io_\""
index bcd56b5421e5415c55d2c1ce1d11f8be0e3601df..82b9ed10fd4bce9ad3f4e7752ba0dc91ea13c995 100644 (file)
@@ -667,6 +667,22 @@ class InstanceTestCase(FHDLTestCase):
             ("s6", (s6, "io")),
         ]))
 
+    def test_cast_ports(self):
+        inst = Instance("foo",
+            ("i", "s1", 1),
+            ("o", "s2", 2),
+            ("io", "s3", 3),
+            i_s4=4,
+            o_s5=5,
+            io_s6=6,
+        )
+        self.assertRepr(inst.named_ports["s1"][0], "(const 1'd1)")
+        self.assertRepr(inst.named_ports["s2"][0], "(const 2'd2)")
+        self.assertRepr(inst.named_ports["s3"][0], "(const 2'd3)")
+        self.assertRepr(inst.named_ports["s4"][0], "(const 3'd4)")
+        self.assertRepr(inst.named_ports["s5"][0], "(const 3'd5)")
+        self.assertRepr(inst.named_ports["s6"][0], "(const 3'd6)")
+
     def test_wrong_construct_arg(self):
         s = Signal()
         with self.assertRaises(NameError,