Source code for hwt.serializer.systemC.serializer

from copy import copy
from typing import Optional

from hdlConvertorAst.hdlAst._defs import HdlIdDef
from hdlConvertorAst.hdlAst._expr import HdlValueId, HdlOp, HdlOpType
from hdlConvertorAst.hdlAst._structural import HdlModuleDec, HdlCompInst
from hdlConvertorAst.to.systemc.keywords import SYSTEMC_KEYWORDS
from hdlConvertorAst.translate.common.name_scope import LanguageKeyword, NameScope
from hwt.hdl.portItem import HdlPortItem
from hwt.interfaces.std import Clk
from hwt.serializer.generic.to_hdl_ast import ToHdlAst, \
    HWT_TO_HDLCONVEROTR_DIRECTION
from hwt.serializer.simModel.serializer import ToHdlAstSimModel
from hwt.serializer.systemC.expr import ToHdlAstSystemC_expr
from hwt.serializer.systemC.statements import ToHdlAstSystemC_statements
from hwt.serializer.systemC.type import ToHdlAstSystemC_type
from ipCorePackager.constants import DIRECTION


[docs]class ToHdlAstSystemC(ToHdlAstSystemC_expr, ToHdlAstSystemC_type, ToHdlAstSystemC_statements, ToHdlAst): """ Serialized used to convert HWT design to SystemC code """ _keywords_dict = {kw: LanguageKeyword() for kw in SYSTEMC_KEYWORDS} sc_in_clk = HdlValueId("sc_in_clk", obj=LanguageKeyword()) sc_out_clk = HdlValueId("sc_out_clk", obj=LanguageKeyword()) sc_inout_clk = HdlValueId("sc_inout_clk", obj=LanguageKeyword()) sc_in = HdlValueId("sc_in", obj=LanguageKeyword()) sc_out = HdlValueId("sc_out", obj=LanguageKeyword()) sc_inout = HdlValueId("sc_inout", obj=LanguageKeyword())
[docs] def __init__(self, name_scope: Optional[NameScope]=None): ToHdlAst.__init__(self, name_scope=name_scope) self._is_target = False self._in_sensitivity_list = False self.signalType = None
[docs] def as_hdl_HdlModuleDec(self, o: HdlModuleDec): return ToHdlAstSimModel.as_hdl_HdlModuleDec(self, o)
[docs] def as_hdl_HdlPortItem(self, o: HdlPortItem): i = o.getInternSig()._interface d = o.direction if isinstance(i, Clk): assert i._dtype.bit_length() == 1, i if d == DIRECTION.IN: t = self.sc_in_clk elif d == DIRECTION.OUT: t = self.sc_out_clk elif d == DIRECTION.INOUT: t = self.sc_inout_clk else: raise ValueError(d) else: if d == DIRECTION.IN: pt = self.sc_in elif d == DIRECTION.OUT: pt = self.sc_out elif d == DIRECTION.INOUT: pt = self.sc_inout else: raise ValueError(d) t = self.as_hdl_HdlType(o._dtype) t = HdlOp(HdlOpType.PARAMETRIZATION, [pt, t]) var = HdlIdDef() var.direction = HWT_TO_HDLCONVEROTR_DIRECTION[o.direction] s = o.getInternSig() var.name = s.name var.origin = o var.type = t return var
[docs] def as_hdl_HdlCompInst(self, o: HdlCompInst) -> HdlCompInst: new_o = copy(o) new_o.param_map = [] orig_is_target = self._is_target try: self._is_target = True port_map = [] for pi in o.port_map: pm = self.as_hdl_PortConnection(pi) port_map.append(pm) new_o.port_map = port_map finally: self._is_target = orig_is_target return new_o