m.d.comb += self.output.eq(adder.output)
return m
# go on to handle recursive case
- intermediate_terms: List[Signal]
intermediate_terms = []
def add_intermediate_term(value):
intermediate_terms.append(intermediate_term)
m.d.comb += intermediate_term.eq(value)
- part_mask = self._reg_partition_points.as_mask(len(self.output))
+ # store mask in intermediary (simplifies graph)
+ part_mask = Signal(len(self.output), reset_less=True)
+ mask = self._reg_partition_points.as_mask(len(self.output))
+ m.d.comb += part_mask.eq(mask)
# create full adders for this recursive level.
# this shrinks N terms to 2 * (N // 3) plus the remainder
.eq(self._delayed_part_ops[j][i])
for j in range(len(self.register_levels))]
+ def add_intermediate_value(value):
+ intermediate_value = Signal(len(value), reset_less=True)
+ m.d.comb += intermediate_value.eq(value)
+ return intermediate_value
+
for parts, delayed_parts in [(self._part_64, self._delayed_part_64),
(self._part_32, self._delayed_part_32),
(self._part_16, self._delayed_part_16),
(self._part_8, self._delayed_part_8)]:
byte_count = 8 // len(parts)
for i in range(len(parts)):
- value = self._part_byte(i * byte_count - 1)
+ pb = self._part_byte(i * byte_count - 1)
+ value = add_intermediate_value(pb)
for j in range(i * byte_count, (i + 1) * byte_count - 1):
- value &= ~self._part_byte(j)
- value &= self._part_byte((i + 1) * byte_count - 1)
+ pb = add_intermediate_value(~self._part_byte(j))
+ value = add_intermediate_value(value & pb)
+ pb = self._part_byte((i + 1) * byte_count - 1)
+ value = add_intermediate_value(value & pb)
m.d.comb += parts[i].eq(value)
m.d.comb += delayed_parts[0][i].eq(parts[i])
m.d.sync += [delayed_parts[j + 1][i].eq(delayed_parts[j][i])
byte_width = 8 // len(parts)
bit_width = 8 * byte_width
for i in range(len(parts)):
- b_enabled = parts[i] & self.a[(i + 1) * bit_width - 1] \
+ ae = parts[i] & self.a[(i + 1) * bit_width - 1] \
& self._a_signed[i * byte_width]
- a_enabled = parts[i] & self.b[(i + 1) * bit_width - 1] \
+ be = parts[i] & self.b[(i + 1) * bit_width - 1] \
& self._b_signed[i * byte_width]
+ a_enabled = Signal(name="a_enabled_%d" % i, reset_less=True)
+ b_enabled = Signal(name="b_enabled_%d" % i, reset_less=True)
+ m.d.comb += a_enabled.eq(ae)
+ m.d.comb += b_enabled.eq(be)
# for 8-bit values: form a * 0xFF00 by using -a * 0x100, the
# negation operation is split into a bitwise not and a +1.