fhdl: replication support
This commit is contained in:
parent
5c7131dc86
commit
fa63cc1ec8
|
@ -37,6 +37,8 @@ def ListSignals(node):
|
||||||
elif isinstance(node, Cat):
|
elif isinstance(node, Cat):
|
||||||
l = list(map(ListSignals, node.l))
|
l = list(map(ListSignals, node.l))
|
||||||
return set().union(*l)
|
return set().union(*l)
|
||||||
|
elif isinstance(node, Replicate):
|
||||||
|
return ListSignals(node.v)
|
||||||
elif isinstance(node, Assign):
|
elif isinstance(node, Assign):
|
||||||
return ListSignals(node.l) | ListSignals(node.r)
|
return ListSignals(node.l) | ListSignals(node.r)
|
||||||
elif isinstance(node, StatementList):
|
elif isinstance(node, StatementList):
|
||||||
|
@ -60,6 +62,8 @@ def ListTargets(node):
|
||||||
elif isinstance(node, Cat):
|
elif isinstance(node, Cat):
|
||||||
l = list(map(ListTargets, node.l))
|
l = list(map(ListTargets, node.l))
|
||||||
return set().union(*l)
|
return set().union(*l)
|
||||||
|
elif isinstance(node, Replicate):
|
||||||
|
return ListTargets(node.v)
|
||||||
elif isinstance(node, Assign):
|
elif isinstance(node, Assign):
|
||||||
return ListTargets(node.l)
|
return ListTargets(node.l)
|
||||||
elif isinstance(node, StatementList):
|
elif isinstance(node, StatementList):
|
||||||
|
|
|
@ -1,17 +1,20 @@
|
||||||
import math
|
import math
|
||||||
|
|
||||||
def BitsFor(n):
|
def BitsFor(n):
|
||||||
if n == 0:
|
if isinstance(n, Constant):
|
||||||
return 1
|
return n.bv.width
|
||||||
else:
|
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:
|
class BV:
|
||||||
def __init__(self, width=1, signed=False):
|
def __init__(self, width=1, signed=False):
|
||||||
self.width = width
|
self.width = width
|
||||||
self.signed = signed
|
self.signed = signed
|
||||||
|
|
||||||
def __str__(self):
|
def __repr__(self):
|
||||||
r = str(self.width) + "'"
|
r = str(self.width) + "'"
|
||||||
if self.signed:
|
if self.signed:
|
||||||
r += "s"
|
r += "s"
|
||||||
|
@ -98,10 +101,18 @@ class Cat(Value):
|
||||||
def __init__(self, *args):
|
def __init__(self, *args):
|
||||||
self.l = list(map(_cst, args))
|
self.l = list(map(_cst, args))
|
||||||
|
|
||||||
|
class Replicate(Value):
|
||||||
|
def __init__(self, v, n):
|
||||||
|
self.v = v
|
||||||
|
self.n = n
|
||||||
|
|
||||||
class Constant(Value):
|
class Constant(Value):
|
||||||
def __init__(self, n, bv=None):
|
def __init__(self, n, bv=None):
|
||||||
self.bv = bv or BV(BitsFor(n))
|
self.bv = bv or BV(BitsFor(n))
|
||||||
self.n = n
|
self.n = n
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return str(self.bv) + str(self.n)
|
||||||
|
|
||||||
def _cst(x):
|
def _cst(x):
|
||||||
if isinstance(x, int):
|
if isinstance(x, int):
|
||||||
|
|
|
@ -39,6 +39,8 @@ def _printexpr(ns, node):
|
||||||
l = list(map(partial(_printexpr, ns), node.l))
|
l = list(map(partial(_printexpr, ns), node.l))
|
||||||
l.reverse()
|
l.reverse()
|
||||||
return "{" + ", ".join(l) + "}"
|
return "{" + ", ".join(l) + "}"
|
||||||
|
elif isinstance(node, Replicate):
|
||||||
|
return "{" + str(node.n) + "{" + _printexpr(ns, node.v) + "}}"
|
||||||
else:
|
else:
|
||||||
raise TypeError
|
raise TypeError
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue