signExtend method
override
Fully sign extend the PP array: useful for reference only
Implementation
@override
void signExtend() {
if (signedMultiplicand && (selectSignedMultiplicand != null)) {
throw RohdHclException('multiplicand sign reconfiguration requires '
'signedMultiplicand=false');
}
if (isSignExtended) {
throw RohdHclException('Partial Product array already sign-extended');
}
isSignExtended = true;
final signs = [
for (var r = 0; r < rows; r++)
encoder
.fetchEncoding(r)
.sign
.named('sign_r$r', naming: Naming.mergeable)
];
for (var row = 0; row < rows; row++) {
final addend = partialProducts[row];
final Logic sign;
if (selectSignedMultiplicand != null) {
sign = mux(selectSignedMultiplicand!, addend.last, signs[row]);
} else {
sign = signedMultiplicand ? addend.last : signs[row];
}
addend.addAll(List.filled((rows - row) * shift, SignBit(sign)));
if (row > 0) {
addend
..insertAll(0, List.filled(shift - 1, Const(0)))
..insert(0, SignBit(signs[row - 1]));
rowShift[row] -= shift;
}
}
// Insert carry bit in extra row
partialProducts.add(List.generate(selector.width, (i) => Const(0)));
partialProducts.last.insert(0, SignBit(signs[rows - 2]));
rowShift.add((rows - 2) * shift);
}