createModule method
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),
);
}