def elaborate(self, platform):
m = Module()
- parts = self.terms
+ all_terms = self.terms.copy() # create copy to avoid modifying self
for shift in range(self.factor_width):
part_prod = Signal(self.output.width, name=f"part_prod_{shift}")
- # TODO comment (nice ASCII diagram in docstring then refer to it?)
+ # construct partial product term
mask = Repl(self.factor2[shift], self.factor_width)
m.d.comb += part_prod.eq((self.factor1 & mask) << shift)
- parts.append(part_prod)
+ all_terms.append(part_prod)
- # TODO comment
- output = treereduce(parts, operator.xor)
+ # merge all terms together
+ output = treereduce(all_terms, operator.xor)
m.d.comb += self.output.eq(output)
return m