elif isinstance(node, Cat):
l = list(map(ListSignals, node.l))
return set().union(*l)
+ elif isinstance(node, Replicate):
+ return ListSignals(node.v)
elif isinstance(node, Assign):
return ListSignals(node.l) | ListSignals(node.r)
elif isinstance(node, StatementList):
elif isinstance(node, Cat):
l = list(map(ListTargets, node.l))
return set().union(*l)
+ elif isinstance(node, Replicate):
+ return ListTargets(node.v)
elif isinstance(node, Assign):
return ListTargets(node.l)
elif isinstance(node, StatementList):
import math
def BitsFor(n):
- if n == 0:
- return 1
+ if isinstance(n, Constant):
+ return n.bv.width
else:
- return int(math.ceil(math.log(n+1, 2)))
+ if n == 0:
+ return 1
+ else:
+ return int(math.ceil(math.log(n+1, 2)))
class BV:
def __init__(self, width=1, signed=False):
self.width = width
self.signed = signed
- def __str__(self):
+ def __repr__(self):
r = str(self.width) + "'"
if self.signed:
r += "s"
def __init__(self, *args):
self.l = list(map(_cst, args))
+class Replicate(Value):
+ def __init__(self, v, n):
+ self.v = v
+ self.n = n
+
class Constant(Value):
def __init__(self, n, bv=None):
self.bv = bv or BV(BitsFor(n))
self.n = n
+
+ def __repr__(self):
+ return str(self.bv) + str(self.n)
def _cst(x):
if isinstance(x, int):
l = list(map(partial(_printexpr, ns), node.l))
l.reverse()
return "{" + ", ".join(l) + "}"
+ elif isinstance(node, Replicate):
+ return "{" + str(node.n) + "{" + _printexpr(ns, node.v) + "}}"
else:
raise TypeError