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 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)
|
||||||
|
@ -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:
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user