NativeMultiplier constructor

NativeMultiplier(
  1. Logic a,
  2. Logic b, {
  3. Logic? clk,
  4. Logic? reset,
  5. Logic? enable,
  6. bool signedMultiplicand = false,
  7. bool signedMultiplier = false,
  8. Logic? selectSignedMultiplicand,
  9. Logic? selectSignedMultiplier,
  10. String name = 'native_multiplier',
})

The width of input a and b must be the same.

Implementation

NativeMultiplier(super.a, super.b,
    {super.clk,
    super.reset,
    super.enable,
    super.signedMultiplicand = false,
    super.signedMultiplier = false,
    super.selectSignedMultiplicand,
    super.selectSignedMultiplier,
    super.name = 'native_multiplier'})
    : super(definitionName: 'NativeMultiplier_W${a.width}') {
  if (a.width != b.width) {
    throw RohdHclException('inputs of a and b should have same width.');
  }
  final pW = a.width + b.width;
  final product = addOutput('product', width: pW);

  final Logic extendedMultiplicand;
  final Logic extendedMultiplier;
  if (selectSignedMultiplicand == null) {
    extendedMultiplicand =
        signedMultiplicand ? a.signExtend(pW) : a.zeroExtend(pW);
  } else {
    final len = a.width;
    final sign = a[len - 1];
    final extension = [
      for (var i = len; i < pW; i++)
        mux(selectSignedMultiplicand!, sign, Const(0))
    ];
    extendedMultiplicand = (a.elements + extension).rswizzle();
  }
  if (selectSignedMultiplier == null) {
    extendedMultiplier =
        (signedMultiplier ? b.signExtend(pW) : b.zeroExtend(pW))
            .named('extended_multiplier', naming: Naming.mergeable);
  } else {
    final len = b.width;
    final sign = b[len - 1];
    final extension = [
      for (var i = len; i < pW; i++)
        mux(selectSignedMultiplier!, sign, Const(0))
    ];
    extendedMultiplier = (b.elements + extension)
        .rswizzle()
        .named('extended_multiplier', naming: Naming.mergeable);
  }

  final internalProduct =
      (extendedMultiplicand * extendedMultiplier).named('internalProduct');
  product <= condFlop(clk, reset: reset, en: enable, internalProduct);
}