Source code for hdlConvertorAst.translate.verilog_to_basic_hdl_sim_model.verilog_operands_to_basic_hdl_sim_model

from copy import deepcopy

from hdlConvertorAst.hdlAst import HdlOpType, HdlOp, HdlValueId, HdlStmThrow
from hdlConvertorAst.to.hdl_ast_modifier import HdlAstModifier
from hdlConvertorAst.translate.verilog_to_basic_hdl_sim_model.utils import \
    to_property_call, hdl_call, hdl_getattr, hdl_add_int, hdl_sub_int


[docs]class BasicHdlSimModelTranslateVerilogOperands(HdlAstModifier):
[docs] def __init__(self, downto_to_slice_fn=True): super(BasicHdlSimModelTranslateVerilogOperands, self).__init__() self.downto_to_slice_fn = downto_to_slice_fn
[docs] def visit_HdlOp(self, o): """ :type o: HdlOp """ o = HdlAstModifier.visit_HdlOp(self, o) op = o.fn if op == HdlOpType.EQ or op == HdlOpType.XNOR: # HdlOpType.EQ: '%s._eq(%s)', to_property_call(o, "_eq") elif op == HdlOpType.CONCAT: to_property_call(o, "_concat") elif op == HdlOpType.TERNARY: to_property_call(o, "_ternary__val") elif op == HdlOpType.DOWNTO: if self.downto_to_slice_fn: o.fn = HdlOpType.CALL o.ops = [HdlValueId("slice"), hdl_add_int(o.ops[0], 1), o.ops[1]] else: o.ops = [hdl_add_int(o.ops[0], 1), o.ops[1]] elif op == HdlOpType.TO: raise NotImplementedError(o) elif op == HdlOpType.CALL: fn = o.ops[0] if fn == HdlValueId("$display"): o.ops = [HdlValueId("print"), ] + o.ops[1:] elif fn == HdlValueId("$finish"): t = HdlStmThrow() t.val = hdl_call(HdlValueId("Exception"), []) return t elif fn == HdlValueId("$time"): return hdl_getattr(HdlValueId("sim"), "now") elif fn == HdlValueId("$rtoi"): o.ops = [HdlValueId("int"), ] + o.ops[1:] else: return hdl_call(hdl_getattr(HdlValueId("self"), fn.val), o.ops[1:]) elif op == HdlOpType.REPL_CONCAT: n, v = o.ops return hdl_call(HdlValueId("replicate"), [n, v]) elif op in (HdlOpType.AND_LOG, HdlOpType.OR_LOG, HdlOpType.NEG_LOG): ops = [hdl_call(hdl_getattr(_o, "_isOn"), []) for _o in o.ops] if op == HdlOpType.AND_LOG: new_o_fn = HdlOpType.AND elif op == HdlOpType.OR_LOG: new_o_fn = HdlOpType.OR else: assert op == HdlOpType.NEG_LOG new_o_fn = HdlOpType.NEG return HdlOp(new_o_fn, ops) elif op == HdlOpType.PART_SELECT_POST: # logic [31: 0] a; # a[ 0 +: 8] == a[ 7 : 0]; # logic [0 :31] b; # b[ 0 +: 8] == b[0 : 7] high, width = o.ops o.fn = HdlOpType.CALL o.ops = [HdlValueId("slice"), high, HdlOp(HdlOpType.SUB, [deepcopy(high), width])] return o