Source code for hdlConvertorAst.to.verilog.utils
from hdlConvertorAst.hdlAst import HdlValueId, HdlOp, HdlOpType, HdlTypeAuto
PRIMITIVE_TYPES = (
HdlValueId("reg"),
HdlValueId("wire"),
HdlValueId("bit"),
HdlValueId("logic"),
HdlValueId("signed"),
HdlValueId("unsigned"),
HdlTypeAuto,
)
NULL = HdlValueId("null")
[docs]def collect_array_dims(t):
array_dim = []
while isinstance(t, HdlOp) and t.fn == HdlOpType.INDEX:
assert len(t.ops) <= 2
if len(t.ops) == 2:
d = t.ops[1]
else:
d = None
array_dim.append(d)
t = t.ops[0]
array_dim.reverse()
return t, array_dim
[docs]def get_wire_t_params(t):
"""
wire/reg type is actually stored as: t#(width, is_signed)
This function extracts t, width, is_signed and potential array dimmensions
if this type is an array.
"""
t, array_dim = collect_array_dims(t)
if t in PRIMITIVE_TYPES:
is_signed = None
if t == HdlValueId("signed"):
is_signed = True
elif t == HdlValueId("unsigned"):
is_signed = False
return t, None, is_signed, array_dim
# 1b scala
if not isinstance(t, HdlOp) or t.fn != HdlOpType.PARAMETRIZATION or len(t.ops) != 3:
return None
if t.ops[0] not in PRIMITIVE_TYPES:
return None
t, width, is_signed = t.ops
if width == NULL:
width = None
if is_signed is None:
is_signed = None
else:
is_signed = bool(is_signed)
return t, width, is_signed, array_dim