signExtend method

  1. @override
void signExtend()
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);
}