Source code for hdlConvertorAst.translate.verilog_to_basic_hdl_sim_model.verilog_types_to_basic_hdl_sim_model
from hdlConvertorAst.hdlAst import HdlTypeBitsDef, HdlOpType, HdlOp, HdlValueId,\
HdlTypeAuto, HdlValueInt
from hdlConvertorAst.to.basic_hdl_sim_model.utils import BitsT,\
_verilog_slice_to_width
from hdlConvertorAst.translate.verilog_to_basic_hdl_sim_model.utils import hdl_index
from hdlConvertorAst.translate.verilog_to_basic_hdl_sim_model.verilog_resolve_types import VerilogResolveTypes
from hdlConvertorAst.py_ver_compatibility import is_str
[docs]class VerilogTypesToBasicHdlSimModel(VerilogResolveTypes):
"""
Translate Verilog HDL types to BasicHdlSimModel HDL types
"""
[docs] def _visit_type(self, t):
"""
:type t: Union[iHdlExpr, iHdlTypeDef]
"""
if isinstance(t, HdlOp) and t.fn == HdlOpType.INDEX:
o0, o1 = t.ops
return hdl_index(self._visit_type(o0), o1)
elif isinstance(t, HdlTypeBitsDef):
width = _verilog_slice_to_width(t.msb, t.lsb)
return BitsT(width, bool(t.signed))
elif isinstance(t, HdlValueId):
if t == HdlValueId("integer"):
return HdlValueId("INT")
raise NotImplementedError(t)
[docs] def visit_HdlIdDef(self, o):
"""
:type o: HdlIdDef
"""
if o.type is HdlTypeAuto:
if is_str(o.value):
o.type = HdlValueId("STR")
return o
elif isinstance(o.value, HdlValueInt):
v = o.value.val
if isinstance(v, int) and (v <= 1 and v >= 0):
o.type = HdlValueId("BIT")
else:
o.type = HdlValueId("INT")
return o
return VerilogResolveTypes.visit_HdlIdDef(self, o)
[docs] def visit_type(self, t):
"""
:type t: iHdlExpr
"""
t = VerilogResolveTypes.visit_type(self, t)
return self._visit_type(t)