Source code for hwtLib.logic.oneHotToBin

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

from typing import Union, List

from hwt.code import If, Or
from hwt.hdl.types.bits import Bits
from hwt.interfaces.std import Signal, VldSynced, VectSignal
from hwt.math import log2ceil
from hwt.serializer.mode import serializeParamsUniq
from hwt.synthesizer.param import Param
from hwt.synthesizer.rtlLevel.rtlSignal import RtlSignal
from hwt.synthesizer.unit import Unit
from hwt.synthesizer.vectorUtils import iterBits


[docs]@serializeParamsUniq class OneHotToBin(Unit): """ Converts one hot signal to binary, bin.vld is high when oneHot != 0 .. hwt-autodoc:: """ def _config(self): self.ONE_HOT_WIDTH = Param(8) def _declr(self): self.oneHot = VectSignal(self.ONE_HOT_WIDTH) self.bin = VldSynced()._m() self.bin.DATA_WIDTH = log2ceil(self.ONE_HOT_WIDTH) def _impl(self): self.bin.data(oneHotToBin(self, self.oneHot)) self.bin.vld(Or(*[bit for bit in iterBits(self.oneHot)]))
[docs]def oneHotToBin(parent, signals: Union[RtlSignal, Signal, List[Union[RtlSignal, Signal]]], resName="oneHotToBin"): if isinstance(signals, (RtlSignal, Signal)): signals = [signals[i] for i in range(signals._dtype.bit_length())] else: signals = list(signals) res = parent._sig(resName, Bits(log2ceil(len(signals)))) leadingZeroTop = None for i, s in enumerate(reversed(signals)): connections = res(len(signals) - i - 1) if leadingZeroTop is None: leadingZeroTop = connections else: leadingZeroTop = If(s, connections ).Else( leadingZeroTop ) return res
if __name__ == "__main__": from hwt.synthesizer.utils import to_rtl_str u = OneHotToBin() print(to_rtl_str(u))