Source code for hdlConvertorAst.translate.verilog_to_basic_hdl_sim_model.apply_io_scope_to_signal_names

from hdlConvertorAst.hdlAst import HdlValueId, HdlValueInt, HdlOp, HdlOpType
from hdlConvertorAst.py_ver_compatibility import is_str
from hdlConvertorAst.to.hdl_ast_visitor import HdlAstVisitor
from hdlConvertorAst.translate.verilog_to_basic_hdl_sim_model.utils import hdl_getattr, \
    hdl_name_prefix


[docs]def add_io_prefix(o): s = HdlValueId("self") s = hdl_getattr(s, "io") return hdl_name_prefix(s, o)
[docs]class ApplyIoScopeToSignalNames(HdlAstVisitor): """ Change every signal_name to self.io.signal_name in every statement expression. And for signal which are beeing read add .val. :ivar ~._stm_dst: flag which tells if currently processing destination of HdlStmAssig """
[docs] def __init__(self): super(ApplyIoScopeToSignalNames, self).__init__() self._stm_dst = False
[docs] def visit_HdlIdDef(self, var): """ :type var: HdlIdDef """ pass
[docs] def visit_port(self, o): pass
[docs] def visit_param(self, o): pass
[docs] def visit_HdlCompInst(self, o): pass
[docs] def visit_HdlOp(self, o): """ :type o: HdlOp :return: iHdlExpr """ if o.fn == HdlOpType.DOT: # update only left most name o.ops[0] = self.visit_iHdlExpr(o.ops[0]) if not self._stm_dst: return hdl_getattr(o, "val") else: o.ops = [self.visit_iHdlExpr(op) for op in o.ops] return o
[docs] def visit_iHdlExpr(self, o): """ :type o: iHdlExpr :return: iHdlExpr """ if isinstance(o, HdlValueId): o = add_io_prefix(o) if not self._stm_dst: return hdl_getattr(o, "val") return o elif o is None or isinstance(o, HdlValueInt) or is_str(o): return o elif isinstance(o, list): return [self.visit_iHdlExpr(_o) for _o in o] elif isinstance(o, HdlOp): return self.visit_HdlOp(o) else: raise NotImplementedError( "Do not know how to convert %s" % (o))
[docs] def visit_HdlStmAssign(self, o): """ :type o: HdlStmAssign """ assert o.event_delay is None, o assert o.time_delay is None, o _stm_dst = self._stm_dst self._stm_dst = True try: o.dst = self.visit_iHdlExpr(o.dst) finally: self._stm_dst = _stm_dst o.src = self.visit_iHdlExpr(o.src)
[docs] def visit_HdlStmIf(self, o): """ :type o: HdlStmIf """ o.cond = self.visit_iHdlExpr(o.cond) if o.if_true is not None: self.visit_iHdlStatement(o.if_true) o.elifs = [ (self.visit_iHdlExpr(c), stm) for (c, stm) in o.elifs ] for _, stm in o.elifs: self.visit_iHdlStatement(stm) if o.if_false is not None: self.visit_iHdlStatement(o.if_false)