#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from hwt.code import If, c
from hwt.interfaces.utils import addClkRstn
from hwt.synthesizer.interfaceLevel.unitImplHelpers import getSignalName
from hwt.synthesizer.param import Param
from hwtLib.handshaked.compBase import HandshakedCompBase
[docs]class HandshakedReg(HandshakedCompBase):
"""
Register for Handshaked interface
"""
[docs] def _config(self):
HandshakedCompBase._config(self)
self.LATENCY = Param(1)
self.DELAY = Param(0)
[docs] def _declr(self):
addClkRstn(self)
with self._paramsShared():
self.dataIn = self.intfCls()
self.dataOut = self.intfCls()
[docs] def _impl_latency(self, inVld, inRd, inData, outVld, outRd, prefix):
isOccupied = self._reg(prefix + "isOccupied", defVal=0)
regs_we = self._sig(prefix + 'reg_we')
outData = []
for iin in inData:
r = self._reg(prefix + 'reg_' + iin._name, iin._dtype)
If(regs_we,
r(iin)
)
outData.append(r)
If(isOccupied,
If(outRd & ~inVld,
isOccupied(0)
)
).Else(
If(inVld,
isOccupied(1)
)
)
If(isOccupied,
c(outRd, inRd),
outVld(1),
regs_we(inVld & outRd)
).Else(
inRd(1),
outVld(0),
regs_we(inVld)
)
return outData
[docs] def _implLatencyAndDelay(self, inVld, inRd, inData, outVld, outRd, prefix):
wordLoaded = self._reg(prefix + "wordLoaded", defVal=0)
If(wordLoaded,
wordLoaded(~outRd)
).Else(
wordLoaded(inVld)
)
outData = []
for iin in inData:
r = self._reg('reg_' + getSignalName(iin), iin._dtype)
If(~wordLoaded,
r(iin)
)
outData.append(r)
inRd(~wordLoaded)
outVld(wordLoaded)
return outData
[docs] def _impl(self):
LATENCY = int(self.LATENCY)
DELAY = int(self.DELAY)
vld = self.getVld
rd = self.getRd
data = self.getData
Out = self.dataOut
In = self.dataIn
if LATENCY == 1 and DELAY == 0:
outData = self._impl_latency(vld(In), rd(In),
data(In), vld(Out),
rd(Out), "latency1_")
elif LATENCY == 2 and DELAY == 1:
latency1_vld = self._sig("latency1_vld")
latency1_rd = self._sig("latency1_rd")
outData = self._impl_latency(vld(In), rd(In), data(In),
latency1_vld, latency1_rd,
"latency1_")
outData = self._implLatencyAndDelay(latency1_vld, latency1_rd,
outData, vld(Out), rd(Out),
"latency2_delay1_")
else:
raise NotImplementedError(LATENCY, DELAY)
for ds, dm in zip(data(Out), outData):
ds(dm)
if __name__ == "__main__":
from hwt.interfaces.std import Handshaked
from hwt.synthesizer.utils import toRtl
u = HandshakedReg(Handshaked)
print(toRtl(u))