Source code for hwtLib.examples.rtlLvl.complexConditions
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from hwt.code import If, Switch
from hwt.hdl.types.enum import HEnum
from hwt.synthesizer.rtlLevel.netlist import RtlNetlist
from hwtLib.examples.rtlLvl.netlistToRtl import netlistToVhdlStr
from ipCorePackager.constants import DIRECTION
[docs]def ComplexConditions():
n = RtlNetlist()
stT = HEnum('t_state', ["idle", "tsWait", "ts0Wait", "ts1Wait", "lenExtr"])
clk = n.sig('clk')
rst = n.sig("rst")
st = n.sig('st', stT, clk=clk, syncRst=rst, def_val=stT.idle)
s_idle = n.sig('s_idle')
sd0 = n.sig('sd0')
sd1 = n.sig('sd1')
cntrlFifoVld = n.sig('ctrlFifoVld')
cntrlFifoLast = n.sig('ctrlFifoLast')
def tsWaitLogic(ifNoTsRd):
return If(sd0 & sd1,
st(stT.lenExtr)
).Elif(sd0,
st(stT.ts1Wait)
).Elif(sd1,
st(stT.ts0Wait)
).Else(
ifNoTsRd
)
Switch(st)\
.Case(stT.idle,
tsWaitLogic(
If(cntrlFifoVld,
st(stT.tsWait)
)
)
).Case(stT.tsWait,
tsWaitLogic(st(st))
).Case(stT.ts0Wait,
If(sd0,
st(stT.lenExtr)
)
).Case(stT.ts1Wait,
If(sd1,
st(stT.lenExtr)
)
).Case(stT.lenExtr,
If(cntrlFifoVld & cntrlFifoLast,
st(stT.idle)
)
)
s_idle(st._eq(stT.idle))
return n, {
rst: DIRECTION.IN,
clk: DIRECTION.IN,
sd0: DIRECTION.IN,
sd1: DIRECTION.IN,
cntrlFifoVld: DIRECTION.IN,
cntrlFifoLast: DIRECTION.IN,
s_idle: DIRECTION.OUT
}
if __name__ == "__main__":
netlist, interfaces = ComplexConditions()
print(netlistToVhdlStr("ComplexConditions", netlist, interfaces))