Extend clz to work with odd widths
authorMichael Nolan <mtnolan2640@gmail.com>
Mon, 4 May 2020 20:01:20 +0000 (16:01 -0400)
committerMichael Nolan <mtnolan2640@gmail.com>
Mon, 4 May 2020 20:01:20 +0000 (16:01 -0400)
src/ieee754/cordic/clz.py
src/ieee754/cordic/test/test_clz.py

index 51239dc2f43e830bab8a251eac3cbb86d6b3a07e..b8359152b41767caa771befd160182f19d4f95d8 100644 (file)
@@ -10,21 +10,25 @@ class CLZ(Elaboratable):
 
     def generate_pairs(self, m):
         comb = m.d.comb
-        assert self.width % 2 == 0  # TODO handle odd widths
         pairs = []
         for i in range(0, self.width, 2):
-            pair = Signal(2, name="pair%d" % i)
-            comb += pair.eq(self.sig_in[i:i+2])
+            if i+1 >= self.width:
+                pair = Signal(1, name="cnt_1_%d" % (i/2))
+                comb += pair.eq(~self.sig_in[i])
+                pairs.append((pair, 1))
+            else:
+                pair = Signal(2, name="pair%d" % i)
+                comb += pair.eq(self.sig_in[i:i+2])
 
-            pair_cnt = Signal(2, name="cnt_1_%d" % (i/2))
-            with m.Switch(pair):
-                with m.Case(0):
-                    comb += pair_cnt.eq(2)
-                with m.Case(1):
-                    comb += pair_cnt.eq(1)
-                with m.Default():
-                    comb += pair_cnt.eq(0)
-            pairs.append((pair_cnt, 2))  # append pair, max_value
+                pair_cnt = Signal(2, name="cnt_1_%d" % (i/2))
+                with m.Switch(pair):
+                    with m.Case(0):
+                        comb += pair_cnt.eq(2)
+                    with m.Case(1):
+                        comb += pair_cnt.eq(1)
+                    with m.Default():
+                        comb += pair_cnt.eq(0)
+                pairs.append((pair_cnt, 2))  # append pair, max_value
         return pairs
 
     def combine_pairs(self, m, iteration, pairs):
index c3051007f6f17cbb4204c7f2dd5df678d78ceab1..5d9524173eb68bb864da3c8f2a64bcb2d9e45c46 100644 (file)
@@ -39,7 +39,7 @@ class CLZTestCase(FHDLTestCase):
 
     def test_non_power_2(self):
         inputs = [0, 128, 512]
-        self.run_test(iter(inputs), width=10)
+        self.run_test(iter(inputs), width=11)
 
 
 if __name__ == "__main__":