Source code for hdlConvertorAst.translate.verilog_to_basic_hdl_sim_model.verilog_resolve_types


from hdlConvertorAst.hdlAst import HdlTypeBitsDef, HdlOp, HdlOpType, HdlValueId
from hdlConvertorAst.hdlAst._defs import HdlIdDef
from hdlConvertorAst.hdlAst._expr import HdlTypeAuto
from hdlConvertorAst.to.hdl_ast_visitor import HdlAstVisitor
from hdlConvertorAst.to.verilog.utils import collect_array_dims, get_wire_t_params
from hdlConvertorAst.translate.verilog_to_basic_hdl_sim_model.utils import hdl_index, \
    hdl_sub_int


[docs]class VerilogResolveTypes(HdlAstVisitor): """ Translate Verilog HDL types to BasicHdlSimModel HDL types """
[docs] def visit_HdlIdDef(self, o): """ :type o: HdlIdDef """ o.type = self.visit_type(o.type) if o.value is not None: self.visit_iHdlExpr(o.value)
[docs] def visit_type(self, t): """ :type t: iHdlExpr """ t, array_dims = collect_array_dims(t) wire_params = get_wire_t_params(t) if wire_params is None: if t == HdlTypeAuto: t = HdlTypeBitsDef(1) else: base_t, msb, is_signed, _ = wire_params lsb = 0 if msb is None: msb = 0 elif isinstance(msb, HdlOp): if msb.fn == HdlOpType.DOWNTO: msb, lsb = msb.ops elif msb.fn == HdlOpType.TO: lsb, msb = msb.ops elif msb.fn == HdlOpType.CALL and msb.ops[0] == HdlValueId("slice"): lsb = msb.ops[2] msb = hdl_sub_int(msb.ops[1], 1) t = HdlTypeBitsDef(msb, lsb=lsb, signed=is_signed) for i in array_dims: t = hdl_index(t, i) return t