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:
parent
515265773a
commit
20fd41d5fe
@ -23,6 +23,7 @@
|
||||
|
||||
|
||||
import inspect
|
||||
import compiler
|
||||
from compiler import ast as astNode
|
||||
|
||||
import myhdl
|
||||
@ -163,3 +164,23 @@ class _UniqueSuffixGenerator(object):
|
||||
return "_%s" % self.i
|
||||
|
||||
_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)
|
||||
|
@ -47,7 +47,7 @@ from myhdl._always_comb import _AlwaysComb
|
||||
from myhdl._always import _Always
|
||||
from myhdl._instance import _Instantiator
|
||||
from myhdl.conversion._misc import (_error, _access, _kind,_context,
|
||||
_ConversionMixin, _Label, _genUniqueSuffix)
|
||||
_ConversionMixin, _Label, _genUniqueSuffix, _isConstant)
|
||||
from myhdl.conversion._analyze import (_analyzeSigs, _analyzeGens, _analyzeTopFunc,
|
||||
_Ram, _Rom, _enumTypeSet)
|
||||
from myhdl._Signal import _WaiterList
|
||||
@ -1254,7 +1254,8 @@ class _ConvertVisitor(_ConversionMixin):
|
||||
|
||||
def visitSlice(self, node, context=None, *args):
|
||||
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
|
||||
pre, post = "", ""
|
||||
if node.vhd.size <= 30:
|
||||
|
@ -46,7 +46,7 @@ from myhdl._always_comb import _AlwaysComb
|
||||
from myhdl._always import _Always
|
||||
from myhdl._instance import _Instantiator
|
||||
from myhdl.conversion._misc import (_error, _access, _kind,_context,
|
||||
_ConversionMixin, _Label, _genUniqueSuffix)
|
||||
_ConversionMixin, _Label, _genUniqueSuffix, _isConstant)
|
||||
from myhdl.conversion._analyze import (_analyzeSigs, _analyzeGens, _analyzeTopFunc,
|
||||
_Ram, _Rom)
|
||||
|
||||
@ -632,10 +632,10 @@ class _ConvertVisitor(_ConversionMixin):
|
||||
self.write(f.__name__)
|
||||
if node.args:
|
||||
self.write(opening)
|
||||
self.visit(node.args[0])
|
||||
self.visit(node.args[0], *args)
|
||||
for arg in node.args[1:]:
|
||||
self.write(", ")
|
||||
self.visit(arg)
|
||||
self.visit(arg, *args)
|
||||
self.write(closing)
|
||||
if hasattr(node, 'ast'):
|
||||
if node.ast.kind == _kind.TASK:
|
||||
@ -956,7 +956,8 @@ class _ConvertVisitor(_ConversionMixin):
|
||||
|
||||
def visitSlice(self, node, context=None, *args):
|
||||
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)
|
||||
self.write("%s'h" % c._nrbits)
|
||||
self.write("%x" % c._val)
|
||||
|
Loading…
x
Reference in New Issue
Block a user