Source code for hwtLib.logic.binToOneHot

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

from hwt.code import Concat
from hwt.hwIOs.std import HwIOSignal, HwIOVectSignal
from hwt.hwModule import HwModule
from hwt.hwParam import HwParam
from hwt.math import log2ceil
from hwt.pyUtils.typingFuture import override
from hwt.serializer.mode import serializeParamsUniq
from hwt.simulator.simTestCase import SimTestCase
from hwtSimApi.constants import CLK_PERIOD


[docs] def binToOneHot(sig, en=1): try: _en = int(en) except: _en = None res = Concat(*reversed(list(sig._eq(i) for i in range(2 ** sig._dtype.bit_length())))) if _en == 1: return res else: return en._ternary(res, res._dtype.from_py(0))
[docs] @serializeParamsUniq class BinToOneHot(HwModule): """ Little endian encoded number to number in one-hot encoding .. hwt-autodoc:: """ @override def hwConfig(self): self.DATA_WIDTH = HwParam(8) @override def hwDeclr(self): self.din = HwIOVectSignal(log2ceil(self.DATA_WIDTH)) self.en = HwIOSignal() self.dout = HwIOVectSignal(self.DATA_WIDTH)._m() @override def hwImpl(self): en = self.en dIn = self.din WIDTH = self.DATA_WIDTH if WIDTH == 1: # empty_gen self.dout[0](en) else: self.dout(binToOneHot(dIn, en))
[docs] class BinToOneHotTC(SimTestCase):
[docs] @classmethod @override def setUpClass(cls): cls.dut = BinToOneHot() cls.compileSim(cls.dut)
[docs] def test_basic(self): dut = self.dut dut.en._ag.data.append(1) dut.din._ag.data.extend(range(8)) self.runSim(8 * CLK_PERIOD) self.assertValSequenceEqual(dut.dout._ag.data, [1 << i for i in range(8)])
if __name__ == "__main__": import unittest from hwt.synth import to_rtl_str print(to_rtl_str(BinToOneHot())) testLoader = unittest.TestLoader() # suite = unittest.TestSuite([BinToOneHotTC("test_split")]) suite = testLoader.loadTestsFromTestCase(BinToOneHotTC) runner = unittest.TextTestRunner(verbosity=3) runner.run(suite)