Source code for hwtLib.logic.binToOneHot
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from hwt.code import Concat
from hwt.interfaces.std import Signal, VectSignal
from hwt.math import log2ceil
from hwt.serializer.mode import serializeParamsUniq
from hwt.simulator.simTestCase import SimTestCase
from hwt.synthesizer.param import Param
from hwt.synthesizer.unit import Unit
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(Unit):
"""
Little endian encoded number to number in one-hot encoding
.. hwt-autodoc::
"""
def _config(self):
self.DATA_WIDTH = Param(8)
def _declr(self):
self.din = VectSignal(log2ceil(self.DATA_WIDTH))
self.en = Signal()
self.dout = VectSignal(self.DATA_WIDTH)._m()
def _impl(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
def setUpClass(cls):
cls.u = BinToOneHot()
cls.compileSim(cls.u)
[docs] def test_basic(self):
u = self.u
u.en._ag.data.append(1)
u.din._ag.data.extend(range(8))
self.runSim(8 * CLK_PERIOD)
self.assertValSequenceEqual(u.dout._ag.data,
[1 << i for i in range(8)])
if __name__ == "__main__":
import unittest
from hwt.synthesizer.utils 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)