hdl.ast: Add AnyConst and AnySeq value types.
authorWilliam D. Jones <thor0505@comcast.net>
Tue, 15 Jan 2019 20:13:47 +0000 (15:13 -0500)
committerwhitequark <whitequark@whitequark.org>
Tue, 15 Jan 2019 22:52:45 +0000 (22:52 +0000)
nmigen/__init__.py
nmigen/hdl/ast.py

index 9c3c7771749a409ce6ea83dab5be6289e6174570..473e8de6e82434ddf4f3f20f881db3b2eebeb655 100644 (file)
@@ -1,4 +1,4 @@
-from .hdl.ast import Value, Const, C, Mux, Cat, Repl, Array, Signal, ClockSignal, ResetSignal, Assert, Assume
+from .hdl.ast import Value, Const, C, AnyConst, AnySeq, Mux, Cat, Repl, Array, Signal, ClockSignal, ResetSignal, Assert, Assume
 from .hdl.dsl import Module
 from .hdl.cd import ClockDomain
 from .hdl.ir import Fragment, Instance
index 6e95611a11886715e5061e9b7e8b98ce42e243e4..5a03ef741affe388940384040470f3650feb0ba1 100644 (file)
@@ -9,7 +9,7 @@ from ..tools import *
 
 
 __all__ = [
-    "Value", "Const", "C", "Operator", "Mux", "Part", "Slice", "Cat", "Repl",
+    "Value", "Const", "C", "AnyConst", "AnySeq", "Operator", "Mux", "Part", "Slice", "Cat", "Repl",
     "Array", "ArrayProxy",
     "Signal", "ClockSignal", "ResetSignal",
     "Statement", "Assign", "Assert", "Assume", "Switch", "Delay", "Tick",
@@ -254,6 +254,32 @@ class Const(Value):
 C = Const  # shorthand
 
 
+class AnyValue(Value):
+    def __init__(self, shape):
+        super().__init__(src_loc_at=0)
+        if isinstance(shape, int):
+            shape = shape, False
+        self.nbits, self.signed = shape
+        if not isinstance(self.nbits, int) or self.nbits < 0:
+            raise TypeError("Width must be a non-negative integer, not '{!r}'", self.nbits)
+
+    def shape(self):
+        return self.nbits, self.signed
+
+    def _rhs_signals(self):
+        return ValueSet()
+
+
+class AnyConst(AnyValue):
+    def __repr__(self):
+        return "(anyconst {}'{})".format(self.nbits, "s" if self.signed else "")
+
+
+class AnySeq(AnyValue):
+    def __repr__(self):
+        return "(anyseq {}'{})".format(self.nbits, "s" if self.signed else "")
+
+
 class Operator(Value):
     def __init__(self, op, operands, src_loc_at=0):
         super().__init__(src_loc_at=1 + src_loc_at)