MultiplyOnly constructor

MultiplyOnly(
  1. Logic a,
  2. Logic b,
  3. Logic c,
  4. Multiplier mulGen(
    1. Logic a,
    2. Logic b, {
    3. dynamic signedMultiplicand,
    4. dynamic signedMultiplier,
    }), {
  5. dynamic signedMultiplicand,
  6. dynamic signedMultiplier,
  7. dynamic signedAddend,
  8. int? outputWidth,
})

Construct a MultiplyAccumulate that only multiplies to enable using the same tester with zero accumulate addend c.

The optional outputWidth parameter configures the width of accumulate, as described in MultiplyAccumulate.

Implementation

MultiplyOnly(
  super.a,
  super.b,
  super.c,
  Multiplier Function(Logic a, Logic b,
          {dynamic signedMultiplicand, dynamic signedMultiplier})
      mulGen, {
  super.signedMultiplicand,
  super.signedMultiplier,
  super.signedAddend,
  super.outputWidth,
}) // Will be overrwridden by multiplyGenerator
: super(
        name: 'multiply_only_${_genName(
          mulGen,
          a,
          b,
          signedMultiplicand,
          signedMultiplier,
        )}',
      ) {
  // Copy the configuration using this module's internal runtime input.
  final multiply = mulGen(a, b,
      signedMultiplicand: StaticOrRuntimeParameter(
          name: 'selectSignedMultiplicand',
          runtimeConfig: signedMultiplicandParameter.tryRuntimeInput(this),
          staticConfig: signedMultiplicandParameter.runtimeConfig == null
              ? signedMultiplicandParameter.staticConfig
              : null),
      signedMultiplier: StaticOrRuntimeParameter(
          name: 'selectSignedMultiplier',
          runtimeConfig: signedMultiplierParameter.tryRuntimeInput(this),
          staticConfig: signedMultiplierParameter.runtimeConfig == null
              ? signedMultiplierParameter.staticConfig
              : null));

  accumulate <=
      // The wrapper needs the generated multiplier's signedness metadata.
      // ignore: invalid_use_of_protected_member
      fitAccumulateWidth(multiply.product, signed: multiply.isProductSigned);
}