NativeMultiplier constructor
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,
super.signedMultiplier,
super.name = 'native_multiplier',
super.reserveName,
super.reserveDefinitionName,
String? definitionName})
: super(
definitionName: definitionName ??
'NativeMultiplier_W${a.width}x'
'${b.width}_${Multiplier.signedMD(signedMultiplicand)}_'
'${Multiplier.signedML(signedMultiplier)}') {
if (a.width != b.width) {
throw RohdHclException('inputs of a and b should have same width.');
}
final pW = a.width + b.width;
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);
}