Source code for hwt.serializer.verilog.statements

from hdlConvertorAst.hdlAst._bases import iHdlStatement
from hdlConvertorAst.hdlAst._expr import HdlAll
from hdlConvertorAst.hdlAst._statements import HdlStmProcess, HdlStmWait,\
    HdlStmBlock
from hdlConvertorAst.to.verilog.constants import SIGNAL_TYPE
from hwt.hdl.statements.assignmentContainer import HdlAssignmentContainer
from hwt.hdl.statements.codeBlockContainer import HdlStmCodeBlockContainer
from hwt.serializer.verilog.utils import verilogTypeOfSig


[docs]class ToHdlAstVerilog_statements():
[docs] def as_hdl_HdlAssignmentContainer(self, a: HdlAssignmentContainer): blocking = False ver_sig_t = verilogTypeOfSig(a.dst) if ver_sig_t in (SIGNAL_TYPE.REG, SIGNAL_TYPE.PORT_REG): evDep = False for driver in a.dst.drivers: if driver._event_dependent_from_branch is not None: evDep = True break if not evDep or a.dst.virtual_only: blocking = True elif ver_sig_t in (SIGNAL_TYPE.WIRE, SIGNAL_TYPE.PORT_WIRE): blocking = True else: raise ValueError(ver_sig_t) a = super(ToHdlAstVerilog_statements, self).as_hdl_HdlAssignmentContainer(a) a.is_blocking = blocking return a
[docs] def can_pop_process_wrap(self, stms, hasToBeVhdlProcess): if hasToBeVhdlProcess: return False else: assert len(stms) == 1 return True
[docs] def has_to_be_process(self, proc: HdlStmCodeBlockContainer): for o in proc._outputs: if verilogTypeOfSig(o) in (SIGNAL_TYPE.REG, SIGNAL_TYPE.PORT_REG): return True return False
[docs] def as_hdl_HdlStmCodeBlockContainer(self, proc: HdlStmCodeBlockContainer) -> iHdlStatement: p = super(ToHdlAstVerilog_statements, self).as_hdl_HdlStmCodeBlockContainer(proc) if isinstance(p, HdlStmProcess): no_wait = True if isinstance(p.body, HdlStmWait): no_wait = False elif isinstance(p.body, HdlStmBlock): for _o in p.body.body: if isinstance(_o, HdlStmWait): no_wait = False break if no_wait and not p.sensitivity: # all input are constant and that is why this process does not have # any sensitivity p.sensitivity = [HdlAll, ] # add label if not isinstance(p.body, HdlStmBlock): b = p.body p.body = HdlStmBlock() p.body.body.append(b) p.body.labels.extend(p.labels) p.labels.clear() return p