1
0
mirror of https://github.com/myhdl/myhdl.git synced 2025-01-24 21:52:56 +08:00

check whether intbv call argument is constant

This commit is contained in:
Jan Decaluwe 2008-12-12 22:48:43 +01:00
parent 515265773a
commit 20fd41d5fe
3 changed files with 29 additions and 6 deletions

View File

@ -23,6 +23,7 @@
import inspect import inspect
import compiler
from compiler import ast as astNode from compiler import ast as astNode
import myhdl import myhdl
@ -163,3 +164,23 @@ class _UniqueSuffixGenerator(object):
return "_%s" % self.i return "_%s" % self.i
_genUniqueSuffix = _UniqueSuffixGenerator() _genUniqueSuffix = _UniqueSuffixGenerator()
# check if expression is constant
def _isConstant(ast, symdict):
v = _namesVisitor()
compiler.walk(ast, v)
for name in v.names:
if name not in symdict:
return False
if not isinstance(symdict[name], int):
return False
return True
class _namesVisitor(object):
def __init__(self):
self.names = []
def visitName(self, node):
self.names.append(node.name)

View File

@ -47,7 +47,7 @@ from myhdl._always_comb import _AlwaysComb
from myhdl._always import _Always from myhdl._always import _Always
from myhdl._instance import _Instantiator from myhdl._instance import _Instantiator
from myhdl.conversion._misc import (_error, _access, _kind,_context, from myhdl.conversion._misc import (_error, _access, _kind,_context,
_ConversionMixin, _Label, _genUniqueSuffix) _ConversionMixin, _Label, _genUniqueSuffix, _isConstant)
from myhdl.conversion._analyze import (_analyzeSigs, _analyzeGens, _analyzeTopFunc, from myhdl.conversion._analyze import (_analyzeSigs, _analyzeGens, _analyzeTopFunc,
_Ram, _Rom, _enumTypeSet) _Ram, _Rom, _enumTypeSet)
from myhdl._Signal import _WaiterList from myhdl._Signal import _WaiterList
@ -1254,7 +1254,8 @@ class _ConvertVisitor(_ConversionMixin):
def visitSlice(self, node, context=None, *args): def visitSlice(self, node, context=None, *args):
if isinstance(node.expr, astNode.CallFunc) and \ if isinstance(node.expr, astNode.CallFunc) and \
node.expr.node.obj is intbv: node.expr.node.obj is intbv and \
_isConstant(node.expr.args[0], self.ast.symdict):
c = self.getVal(node)._val c = self.getVal(node)._val
pre, post = "", "" pre, post = "", ""
if node.vhd.size <= 30: if node.vhd.size <= 30:

View File

@ -46,7 +46,7 @@ from myhdl._always_comb import _AlwaysComb
from myhdl._always import _Always from myhdl._always import _Always
from myhdl._instance import _Instantiator from myhdl._instance import _Instantiator
from myhdl.conversion._misc import (_error, _access, _kind,_context, from myhdl.conversion._misc import (_error, _access, _kind,_context,
_ConversionMixin, _Label, _genUniqueSuffix) _ConversionMixin, _Label, _genUniqueSuffix, _isConstant)
from myhdl.conversion._analyze import (_analyzeSigs, _analyzeGens, _analyzeTopFunc, from myhdl.conversion._analyze import (_analyzeSigs, _analyzeGens, _analyzeTopFunc,
_Ram, _Rom) _Ram, _Rom)
@ -632,10 +632,10 @@ class _ConvertVisitor(_ConversionMixin):
self.write(f.__name__) self.write(f.__name__)
if node.args: if node.args:
self.write(opening) self.write(opening)
self.visit(node.args[0]) self.visit(node.args[0], *args)
for arg in node.args[1:]: for arg in node.args[1:]:
self.write(", ") self.write(", ")
self.visit(arg) self.visit(arg, *args)
self.write(closing) self.write(closing)
if hasattr(node, 'ast'): if hasattr(node, 'ast'):
if node.ast.kind == _kind.TASK: if node.ast.kind == _kind.TASK:
@ -956,7 +956,8 @@ class _ConvertVisitor(_ConversionMixin):
def visitSlice(self, node, context=None, *args): def visitSlice(self, node, context=None, *args):
if isinstance(node.expr, astNode.CallFunc) and \ if isinstance(node.expr, astNode.CallFunc) and \
node.expr.node.obj is intbv: node.expr.node.obj is intbv and \
_isConstant(node.expr.args[0], self.ast.symdict):
c = self.getVal(node) c = self.getVal(node)
self.write("%s'h" % c._nrbits) self.write("%s'h" % c._nrbits)
self.write("%x" % c._val) self.write("%x" % c._val)