Source code for hdlConvertorAst.translate.verilog_to_basic_hdl_sim_model.assignment_to_update_assignment

from hdlConvertorAst.hdlAst._expr import HdlValueInt
from hdlConvertorAst.to.hdl_ast_visitor import HdlAstVisitor
from hdlConvertorAst.to.verilog.utils import collect_array_dims
from hdlConvertorAst.translate.verilog_to_basic_hdl_sim_model.utils import hdl_getattr


[docs]class AssignmentToUpdateAssignment(HdlAstVisitor): """ Convert an assignment to an assignment of a update. Assignment of a update has folowing format: .. code-block:: python # dst is a name of destination signal # src is name of source signal or value # is_clock_edge_dependent is a flag which tells if # the assignment is updating some clock edge memory # scalar updater dst.val_next = (src, is_clock_edge_dependent) # updater for array element dst.val_next = (src, indexes, is_clock_edge_dependent) """
[docs] def pop_index_list(self, o): """ :type o: iHdlExpr """ return collect_array_dims(o)
[docs] def is_clock_edge_dependent(self, o): """ :type o: HdlStmAssign """ # [TODO] return HdlValueInt(0, 1, None)
[docs] def visit_HdlStmAssign(self, o): """ :type o: HdlStmAssign """ assert o.event_delay is None, o assert o.time_delay is None, o is_clock_edge_dependent = self.is_clock_edge_dependent(o) dst, dst_index = self.pop_index_list(o.dst) o.dst = hdl_getattr(dst, "val_next") if dst_index: o.src = [o.src, dst_index, is_clock_edge_dependent] else: o.src = [o.src, is_clock_edge_dependent]