Signal: allow to use integral Enum for reset value.
authorStaf Verhaegen <staf@stafverhaegen.be>
Fri, 10 Jan 2020 12:28:19 +0000 (13:28 +0100)
committerwhitequark <cz@m-labs.hk>
Sat, 11 Jan 2020 09:03:20 +0000 (09:03 +0000)
nmigen/hdl/ast.py
nmigen/test/test_hdl_ast.py

index 34c8e2be81d43ea5e9bc818d1b906f771325f2a7..38e0408afef13e05d3e5f04a216ef5f97540e07e 100644 (file)
@@ -797,7 +797,7 @@ class Signal(Value, DUID):
         name this ``Signal`` is assigned to. Name collisions are automatically resolved by
         prepending names of objects that contain this ``Signal`` and by appending integer
         sequences.
-    reset : int
+    reset : int or integral Enum
         Reset (synchronous) or default (combinatorial) value.
         When this ``Signal`` is assigned to in synchronous context and the corresponding clock
         domain is reset, the ``Signal`` assumes the given value. When this ``Signal`` is unassigned
@@ -834,6 +834,11 @@ class Signal(Value, DUID):
                  attrs=None, decoder=None, src_loc_at=0):
         super().__init__(src_loc_at=src_loc_at)
 
+        if isinstance(reset, Enum):
+            reset = reset.value
+        if not isinstance(reset, int):
+            raise TypeError("Reset value has to be an int or an integral Enum")
+
         # TODO(nmigen-0.2): move this to nmigen.compat and make it a deprecated extension
         if min is not None or max is not None:
             warnings.warn("instead of `Signal(min={min}, max={max})`, "
index d5e19f1850844992ef2b0f7c7cbbaf8e7a4e6ba9..de0eb654df8eba6e5bbdbb43044662e7a0563d5b 100644 (file)
@@ -755,6 +755,14 @@ class SignalTestCase(FHDLTestCase):
         self.assertEqual(s1.reset, 0b111)
         self.assertEqual(s1.reset_less, True)
 
+    def test_reset_enum(self):
+        s1 = Signal(2, reset=UnsignedEnum.BAR)
+        self.assertEqual(s1.reset, 2)
+        with self.assertRaises(TypeError,
+                msg="Reset value has to be an int or an integral Enum"
+        ):
+            Signal(1, reset=StringEnum.FOO)
+
     def test_reset_narrow(self):
         with self.assertWarns(SyntaxWarning,
                 msg="Reset value 8 requires 4 bits to represent, but the signal only has 3 bits"):