boolean logic inversion, x = ~a & ~b & ~c ==> ~(a | b | c) then use list
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 17 Aug 2019 08:00:18 +0000 (09:00 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 17 Aug 2019 08:00:18 +0000 (09:00 +0100)
of terms, use bool(), and graph size is reduced

src/ieee754/part_mul_add/multiply.py

index 5be8768c56aca65ff9c00a690f0c286ee1915579..6e2596be2c79f993f9d7f04d24407faa4eb6277f 100644 (file)
@@ -514,11 +514,16 @@ class Mul8_16_32_64(Elaboratable):
 
         for a_index in range(8):
             for b_index in range(8):
-                term_enabled: Value = C(True, 1)
+                terms = []
                 min_index = min(a_index, b_index)
                 max_index = max(a_index, b_index)
                 for i in range(min_index, max_index):
-                    term_enabled &= ~self._part_byte(i)
+                    pbs = Signal(reset_less=True)
+                    m.d.comb += pbs.eq(self._part_byte(i))
+                    terms.append(pbs)
+                name = "te_%d_%d" % (a_index, b_index)
+                term_enabled = Signal(name=name, reset_less=True)
+                m.d.comb += term_enabled.eq(~(Cat(*terms).bool()))
                 add_term(products[a_index][b_index],
                          8 * (a_index + b_index),
                          term_enabled)