GeneralDotProduct constructor

GeneralDotProduct(
  1. List<Logic> multiplicands,
  2. List<Logic> multipliers, {
  3. dynamic signedMultiplicand,
  4. dynamic signedMultiplier,
  5. int treeRadix = 2,
  6. Adder adderGen(
    1. Logic a,
    2. Logic b, {
    3. Logic? carryIn,
    4. String name,
    }) = NativeAdder.new,
  7. Multiplier multiplierGen(
    1. Logic a,
    2. Logic b, {
    3. Logic? clk,
    4. Logic? enable,
    5. Logic? reset,
    6. dynamic signedMultiplicand,
    7. dynamic signedMultiplier,
    }) = NativeMultiplier.new,
  8. String name = 'dotproduct',
  9. bool reserveName = false,
  10. bool reserveDefinitionName = false,
  11. String? definitionName,
})

Construct a GeneralDotProduct with a List of multiplicands and multipliers, a multiplierGen for constructing products, and an adderGen function to generate Adders for use in a ReductionTree for the final addition of the products.

Implementation

GeneralDotProduct(super.multiplicands, super.multipliers,
    {super.signedMultiplicand,
    super.signedMultiplier,
    int treeRadix = 2,
    this.adderGen = NativeAdder.new,
    Multiplier Function(Logic a, Logic b,
            {Logic? clk,
            Logic? reset,
            Logic? enable,
            dynamic signedMultiplicand,
            dynamic signedMultiplier})
        multiplierGen = NativeMultiplier.new,
    super.name = 'dotproduct',
    super.reserveName = false,
    super.reserveDefinitionName = false,
    String? definitionName})
    : super(
          definitionName: definitionName ??
              'DotProductNative_W${multipliers[0].width}_') {
  final dotResults = [
    for (var i = 0; i < multipliers.length; i++)
      multiplierGen(multiplicands[i], multipliers[i],
              signedMultiplicand: signedMultiplicandParameter.getLogic(this),
              signedMultiplier: signedMultiplierParameter.getLogic(this))
          .product
  ];

  // TODO(desmonddak): add sign extension option for use with unsigned
  // multipliers and multiplicands.

  final prefixAdd = ReductionTree(dotResults, addReduceAdders,
      signExtend: true,
      radix: treeRadix,
      name: 'dotproduct_reduction_tree',
      definitionName: 'DotProductReductionTree_W${multiplicands[0].width}_'
          '${multipliers[0].width}_R$treeRadix');
  addOutput('product', width: prefixAdd.out.width) <= prefixAdd.out;
}