Source code for hwt.serializer.vhdl.types
from hdlConvertorAst.hdlAst._defs import HdlIdDef
from hdlConvertorAst.hdlAst._expr import HdlValueId, HdlOp, HdlOpType, \
HdlTypeType
from hdlConvertorAst.translate.verilog_to_basic_hdl_sim_model.utils import hdl_index, \
hdl_downto
from hdlConvertorAst.translate.common.name_scope import LanguageKeyword
from hwt.hdl.types.array import HArray
from hwt.hdl.types.bits import Bits
from hwt.hdl.types.defs import BOOL, INT, FLOAT64
from hwt.hdl.types.float import HFloat
[docs]class ToHdlAstVhdl2008_types():
BOOLEAN = HdlValueId("BOOLEAN", obj=LanguageKeyword())
INTEGER = HdlValueId("INTEGER", obj=LanguageKeyword())
STRING = HdlValueId("STRING", obj=LanguageKeyword())
STD_LOGIC_VECTOR = HdlValueId("STD_LOGIC_VECTOR", obj=LanguageKeyword())
STD_LOGIC = HdlValueId("STD_LOGIC", obj=LanguageKeyword())
SIGNED = HdlValueId("SIGNED", obj=LanguageKeyword())
UNSIGNED = HdlValueId("UNSIGNED", obj=LanguageKeyword())
[docs] def as_hdl_HdlType_str(self, typ, declaration=False):
assert not declaration
return self.STRING
[docs] def as_hdl_HdlType_bits(self, typ: Bits, declaration=False):
if declaration:
raise NotImplementedError()
if typ == BOOL:
return self.BOOLEAN
if typ == INT:
return self.INTEGER
bitLength = typ.bit_length()
w = typ.bit_length()
isVector = typ.force_vector or bitLength > 1
if typ.signed is None:
if isVector:
name = self.STD_LOGIC_VECTOR
else:
return self.STD_LOGIC
elif typ.signed:
name = self.SIGNED
else:
name = self.UNSIGNED
return HdlOp(HdlOpType.CALL, [
name,
HdlOp(HdlOpType.DOWNTO, [
self.as_hdl(w - 1),
self.as_hdl_int(0)
])])
[docs] def as_hdl_HdlType_array(self, typ: HArray, declaration=False):
if declaration:
v = HdlIdDef()
name = getattr(typ, "name", None)
if name is None:
name = "arr_t_"
v.name = self.name_scope.checked_name(name, typ)
v.type = HdlTypeType
v.origin = typ
size = hdl_downto(
self.as_hdl_int(int(typ.size) - 1),
self.as_hdl_int(0)
)
if self.does_type_requires_extra_def(typ.element_t, ()):
raise NotImplementedError(typ.element_t)
e_t = self.as_hdl_HdlType(typ.element_t, declaration=False)
v.value = hdl_index(e_t, size)
return v
else:
return super(ToHdlAstVhdl2008_types, self).as_hdl_HdlType_array(typ, declaration)
[docs] def as_hdl_HdlType_float(self, typ: HFloat, declaration=False):
if typ == FLOAT64:
return HdlValueId("real")
else:
raise NotImplementedError(typ)