Source code for hdlConvertorAst.translate.verilog_to_basic_hdl_sim_model.wrap_module_statements_to_processes
from hdlConvertorAst.hdlAst._expr import HdlOp, HdlValueId, HdlOpType
from hdlConvertorAst.hdlAst._statements import HdlStmAssign, HdlStmProcess
from hdlConvertorAst.hdlAst._structural import HdlModuleDef
from hdlConvertorAst.hdlAst import HdlValueInt
[docs]def collect_hdl_ids(expr, res):
"""
:type expr: iHdlExpr
:type res: Set[HdlValueId]
"""
if isinstance(expr, HdlOp):
for o in expr.ops:
collect_hdl_ids(o, res)
elif isinstance(expr, HdlValueId):
res.add(expr)
elif isinstance(expr, (HdlValueInt, bool, int, str, float)):
pass
else:
raise NotImplementedError(expr)
[docs]def collect_indexes(expr):
"""
Collect indexes from expression with optional index operator
:type expr: iHdlExpr
"""
if isinstance(expr, HdlOp) and expr.fn == HdlOpType.INDEX:
assert len(expr.ops) == 2, expr.ops
for i in collect_indexes(expr.ops[0]):
yield i
yield expr.ops[1]
[docs]def wrap_module_statements_to_processes(context):
"""
Wrap statements which are not in any process instance in HdlStmProcess instance
:type context: HdlContext
"""
for o in context.objs:
if isinstance(o, HdlModuleDef):
objs = o.objs
for i, obj in enumerate(objs):
if isinstance(obj, HdlStmAssign):
p = HdlStmProcess()
p.body = obj
p.sensitivity = set()
for _i in collect_indexes(obj.dst):
collect_hdl_ids(_i, p.sensitivity)
collect_hdl_ids(obj.src, p.sensitivity)
objs[i] = p