createModule method

  1. @override
Module createModule()
override

Creates a Module instance as configured.

Implementation

@override
Module createModule() {
  final multiplicands = List<Logic>.generate(
      laneCountKnob.value,
      (index) => Logic(
          name: 'multiplicand_$index', width: multiplicandWidthKnob.value));
  final multipliers = List<Logic>.generate(
      laneCountKnob.value,
      (index) =>
          Logic(name: 'multiplier_$index', width: multiplierWidthKnob.value));
  final signedMultiplicand =
      signedMultiplicandKnob.resolve('signedMultiplicand');
  final signedMultiplier = signedMultiplierKnob.resolve('signedMultiplier');
  Adder adderGen(Logic a, Logic b, {Logic? carryIn}) => adderSelectKnob
      .selectedAdder()(a, b, carryIn: carryIn, name: 'dot_product_add');

  Multiplier multiplierGen(
    Logic a,
    Logic b, {
    Logic? clk,
    Logic? reset,
    Logic? enable,
    dynamic signedMultiplicand,
    dynamic signedMultiplier,
  }) =>
      multiplierSelectKnob.selectedMultiplier(
          signedMultiplicand: signedMultiplicand,
          signedMultiplier: signedMultiplier)(
        a,
        b,
        clk: clk,
        reset: reset,
        enable: enable,
        name: 'dot_product_multiply',
      );

  if (implementationKnob.value == DotProductImplementation.compressionTree) {
    if (multiplicandWidthKnob.value != multiplierWidthKnob.value) {
      throw RohdHclException(
          'The compression-tree dot product requires equal operand widths.');
    }
    return CompressionTreeDotProduct(
      multiplicands,
      multipliers,
      signedMultiplicand: signedMultiplicand,
      signedMultiplier: signedMultiplier,
      productRadix: productRadixKnob.value,
      adderGen: adderGen,
    );
  }

  return GeneralDotProduct(
    multiplicands,
    multipliers,
    signedMultiplicand: signedMultiplicand,
    signedMultiplier: signedMultiplier,
    treeRadix: reductionRadixKnob.value,
    multiplierGen: multiplierGen,
    adderGen: (a, b, {carryIn, name = 'dot_product_add'}) =>
        adderSelectKnob.selectedAdder()(a, b, carryIn: carryIn, name: name),
  );
}