hdl.ast: handle a common typo, such as Signal(1, True).
authorwhitequark <cz@m-labs.hk>
Wed, 3 Apr 2019 14:59:01 +0000 (14:59 +0000)
committerwhitequark <cz@m-labs.hk>
Wed, 3 Apr 2019 14:59:01 +0000 (14:59 +0000)
nmigen/hdl/ast.py
nmigen/test/test_hdl_ast.py

index 75dad9b9768257f7e8254630028094c3119c9c9c..b64f7bfb4570fc8378a2d5f03f638f810e9b9ff0 100644 (file)
@@ -581,6 +581,8 @@ class Signal(Value, DUID):
                  attrs=None, decoder=None, src_loc_at=0):
         super().__init__(src_loc_at=src_loc_at)
 
+        if name is not None and not isinstance(name, str):
+            raise TypeError("Name must be a string, not '{!r}'".format(name))
         self.name = name or tracer.get_var_name(depth=2 + src_loc_at, default="$signal")
 
         if shape is None:
index 9f20d1728032c3eeb3287a0b26939bffe5266d2e..608870fdc4f1db4ad88ce73837dcb309fdbc9f11 100644 (file)
@@ -429,6 +429,12 @@ class SignalTestCase(FHDLTestCase):
         s2 = Signal(name="sig")
         self.assertEqual(s2.name, "sig")
 
+    def test_name_bad(self):
+        with self.assertRaises(TypeError,
+                msg="Name must be a string, not 'True'"):
+            # A common typo: forgetting to put parens around width and signedness
+            Signal(1, True)
+
     def test_reset(self):
         s1 = Signal(4, reset=0b111, reset_less=True)
         self.assertEqual(s1.reset, 0b111)