Source code for hdlConvertorAst.to.basic_hdl_sim_model.stm
from hdlConvertorAst.hdlAst import HdlOp, HdlStmIf, HdlStmBlock, HdlStmAssign
from hdlConvertorAst.to.basic_hdl_sim_model.expr import ToBasicHdlSimModelExpr
from hdlConvertorAst.to.hdlUtils import Indent, iter_with_last
[docs]class ToBasicHdlSimModelStm(ToBasicHdlSimModelExpr):
[docs] def visit_HdlStmProcess(self, proc):
"""
:type proc: HdlStmProcess
"""
w = self.out.write
w("# sensitivity: ")
for last, s in iter_with_last(proc.sensitivity):
if isinstance(s, HdlOp):
w(str(s.fn))
w(" ")
self.visit_iHdlExpr(s.ops[0])
else:
self.visit_iHdlExpr(s)
if not last:
w(", ")
w("\n")
w("def ")
w(proc.labels[0])
w("(self):\n")
if proc.trigger_constrain is not None:
raise NotImplementedError()
body = proc.body
with Indent(self.out):
self.visit_iHdlStatement_in_statement(body)
w("\n")
[docs] def visit_iHdlStatement_in_statement(self, stm):
if isinstance(stm, HdlStmAssign):
self.visit_HdlStmAssign(stm)
elif isinstance(stm, HdlStmIf):
self.visit_HdlStmIf(stm)
elif isinstance(stm, HdlStmBlock):
self.visit_HdlStmBlock(stm)
else:
raise NotImplementedError(stm.__class__, stm)
[docs] def visit_HdlStmBlock(self, stm):
"""
:type stm: HdlStmBlock
"""
w = self.out.write
if not stm.body:
self.out.write("pass")
return
for is_last, i in iter_with_last(stm.body):
self.visit_iHdlStatement_in_statement(i)
if not is_last:
w("\n")
[docs] def visit_HdlStmIf(self, stm):
"""
:type stm: HdlStmIf
if cond:
...
else:
...
"""
w = self.out.write
c = stm.cond
ifTrue = stm.if_true
ifFalse = stm.if_false
w("if ")
self.visit_iHdlExpr(c)
w(":\n")
with Indent(self.out):
self.visit_iHdlStatement_in_statement(ifTrue)
w("\n")
for (c, _stm) in stm.elifs:
w("elif ")
self.visit_iHdlExpr(c)
w(":\n")
with Indent(self.out):
self.visit_iHdlStatement_in_statement(_stm)
w("\n")
w("else:\n")
with Indent(self.out):
if ifFalse is None:
w("pass")
else:
self.visit_iHdlStatement_in_statement(ifFalse)
[docs] def visit_HdlStmAssign(self, a):
"""
:type a: HdlStmAssign
"""
w = self.out.write
self.visit_iHdlExpr(a.dst)
w(" = ")
# if a.is_blocking:
# raise NotImplementedError(a)
if a.time_delay is not None:
raise NotImplementedError()
if a.event_delay is not None:
raise NotImplementedError()
self.visit_iHdlExpr(a.src)
[docs] def visit_HdlStmThrow(self, o):
"""
:type o: HdlStmThrow
"""
self.visit_doc(o)
w = self.out.write
w("raise")
if o.val is not None:
w(" ")
self.visit_iHdlExpr(o.val)
w("\n")
[docs] def visit_HdlStmWait(self, o):
"""
:type o: HdlStmWait
"""
self.visit_doc(o)
w = self.out.write
w("yield Timer(")
self.visit_iHdlExpr(o.val)
w(")")
[docs] def visit_HdlStmNop(self, o):
"""
:type o: HdlStmNop
"""
self.visit_doc(o)
self.out.write("pass")