Source code for hwt.serializer.hwt.serializer
from typing import Optional
from hdlConvertorAst.hdlAst import HdlStmBlock
from hdlConvertorAst.hdlAst._expr import HdlValueId
from hdlConvertorAst.hdlAst._structural import HdlModuleDef
from hdlConvertorAst.to.hwt.keywords import HWT_KEYWORDS
from hdlConvertorAst.translate.common.name_scope import LanguageKeyword, NameScope
from hwt.code import CodeBlock
from hwt.hdl.operator import Operator
from hwt.hdl.operatorDefs import AllOps
from hwt.serializer.generic.to_hdl_ast import ToHdlAst
from hwt.serializer.hwt.ops import ToHdlAstHwt_ops
from hwt.serializer.hwt.types import ToHdlAstHwt_types
from hwt.serializer.hwt.value import ToHdlAstHwt_value
from hwt.serializer.simModel.serializer import ToHdlAstSimModel
[docs]class ToHdlAstHwt(ToHdlAstHwt_value, ToHdlAstHwt_ops,
ToHdlAstHwt_types, ToHdlAst):
"""
Serializer which converts Hwt objects back to Hwt code
for debugging purposes/code ports
:ivar ~._valueWidthRequired: flag which tells if the values are required to have
the width specified
"""
_keywords_dict = {kw: LanguageKeyword() for kw in HWT_KEYWORDS}
[docs] def __init__(self, name_scope: Optional[NameScope]=None):
super(ToHdlAstHwt, self).__init__(name_scope=name_scope)
self._valueWidthRequired = False
self.currentUnit = None
self.debug = False
[docs] def has_to_be_process(self, proc):
return True
[docs] def can_pop_process_wrap(self, statements, hasToBeVhdlProcess):
return False
[docs] def _as_hdl_HdlModuleDef(self, new_m: HdlModuleDef) -> HdlModuleDef:
return ToHdlAstSimModel._as_hdl_HdlModuleDef(self, new_m)
[docs] def sensitivityListItem(self, item, anyIsEventDependnt):
if isinstance(item, Operator):
op = item.operator
assert op in (AllOps.RISING_EDGE, AllOps.FALLING_EDGE), item
assert not item.operands[0].hidden, item
return self.as_hdl_Operator(item)
else:
return HdlValueId(item.name, obj=item)
[docs] def as_hdl_CodeBlock(self, o: CodeBlock):
res = HdlStmBlock()
for _o in o.statements:
res.body.append(self.as_hdl(_o))
return res