fhdl: replication support

This commit is contained in:
Sebastien Bourdeauducq 2011-12-09 13:11:34 +01:00
parent 5c7131dc86
commit fa63cc1ec8
3 changed files with 21 additions and 4 deletions

View File

@ -37,6 +37,8 @@ def ListSignals(node):
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):
@ -60,6 +62,8 @@ def ListTargets(node):
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):

View File

@ -1,17 +1,20 @@
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"
@ -98,10 +101,18 @@ class Cat(Value):
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):

View File

@ -39,6 +39,8 @@ def _printexpr(ns, node):
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