+# SPDX-License-Identifier: LGPL-3-or-later
from nmigen import Module, Signal, Elaboratable, Cat, Repl
import math
+""" This module is much more efficient than PriorityEncoder
+ although it is functionally identical.
+ see https://bugs.libre-soc.org/show_bug.cgi?id=326
+
+ This work is funded through NLnet under Grant 2019-02-012
+
+ License: LGPLv3+
+
+"""
+
+
+def clz(v, width):
+ """count leading zeros."""
+ assert isinstance(width, int) and 0 <= width
+ max_v = (1 << width) - 1
+ assert isinstance(v, int) and 0 <= v <= max_v
+ return max_v.bit_length() - v.bit_length()
+
class CLZ(Elaboratable):
def __init__(self, width):
left, lv = pairs[i+1]
right, rv = pairs[i]
width = right.width + 1
- new_pair = Signal(width, name="cnt_%d_%d" %
- (iteration, i))
+ new_pair = Signal(width, name="cnt_%d_%d" % (iteration, i))
if rv == lv:
with m.If(left[-1] == 1):
with m.If(right[-1] == 1):
with m.Else():
comb += new_pair.eq(left)
-
ret.append((new_pair, lv+rv))
return ret
comb += self.lz.eq(pairs[0][0])
return m
-
-