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 = false,
super.signedMultiplier = false,
super.selectSignedMultiplicand,
super.selectSignedMultiplier,
super.name = 'native_multiplier'})
: super(definitionName: 'NativeMultiplier_W${a.width}') {
if (a.width != b.width) {
throw RohdHclException('inputs of a and b should have same width.');
}
final pW = a.width + b.width;
final product = addOutput('product', width: pW);
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);
}