Source code for hwtLib.avalon.st_comp.avalonStToAxi4s

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from hwt.code import Concat
from hwt.hwIOs.utils import addClkRstn
from hwt.hwModule import HwModule
from hwt.math import log2ceil
from hwt.pyUtils.typingFuture import override
from hwtLib.amba.axi4s import Axi4Stream
from hwtLib.avalon.st import AvalonST
from pyMathBitPrecise.bit_utils import mask


[docs] class AvalonST_to_Axi4Stream(HwModule): """ .. hwt-autodoc:: _example_AvalonST_to_Axi4Stream """ @override def hwConfig(self) -> None: AvalonST.hwConfig(self) @override def hwDeclr(self) -> None: addClkRstn(self) with self._hwParamsShared(): self.dataIn = AvalonST() self.dataOut: Axi4Stream = Axi4Stream()._m() assert self.dataBitsPerSymbol == 8, self.dataBitsPerSymbol if self.maxChannel: self.dataOut.ID_WIDTH = log2ceil(self.maxChannel) assert self.readyLatency == 0, self.readyLatency assert not self.readyAllowance, self.readyAllowance m = self.dataOut m.USER_WIDTH = 1 + self.ERROR_WIDTH # 1 for startOfPacket m.USE_KEEP = self.USE_EMPTY assert self.packetsPerClock == 1, self.packetsPerClock m.IS_BIGENDIAN = self.firstSymbolInHighOrderBits @override def hwImpl(self) -> None: m: Axi4Stream = self.dataOut s: AvalonST = self.dataIn if self.maxChannel: m.id(s.channel) if self.USE_EMPTY: size = m.keep._dtype.bit_length() emptyToMaskROM = [mask(size - empty) for empty in range(s.empty._dtype.domain_size())] if self.firstSymbolInHighOrderBits: # handle bigendian, grow mask from msb instead of from lsb emptyToMaskROM = [m << empty for empty, m in enumerate(emptyToMaskROM)] emptyToMaskROM = self._sig("emptyToMaskROM", m.keep._dtype[len(emptyToMaskROM)], emptyToMaskROM) m.keep(emptyToMaskROM[s.empty]) m.valid(s.vld) s.rd(m.ready) m.data(s.data) m.last(s.endOfPacket) user = s.startOfPacket if self.ERROR_WIDTH: user = Concat(s.error, user) m.user(user)
[docs] def _example_AvalonST_to_Axi4Stream(): m = AvalonST_to_Axi4Stream() m.USE_EMPTY = True m.maxChannel = 2 m.ERROR_WIDTH = 4 return m
if __name__ == "__main__": from hwt.synth import to_rtl_str m = _example_AvalonST_to_Axi4Stream() print(to_rtl_str(m))