CompressionTreeMultiplier constructor
- Logic a,
- Logic b, {
- int radix = 4,
- Logic? clk,
- Logic? reset,
- Logic? enable,
- dynamic signedMultiplicand,
- dynamic signedMultiplier,
- Adder adderGen(}) = NativeAdder.new,
- PartialProductSignExtension signExtensionGen(
- PartialProductGeneratorBase pp, {
- String name,
- String name = 'compression_tree_multiplier',
- bool reserveName = false,
- bool reserveDefinitionName = false,
- String? definitionName,
Construct a compression tree integer multiplier with a given radix
and an Adder generator functor adderGen
for the final adder.
Sign extension methodology is defined by the partial product generator
supplied via signExtensionGen
.
If clk
is not null then a set of flops are used to latch the output
after compression. reset
and enable
are optional
inputs to control these flops when clk
is provided. If clk
is null,
the Column Compressor is built as a combinational tree of compressors.
Implementation
CompressionTreeMultiplier(
super.a,
super.b, {
int radix = 4,
super.clk,
super.reset,
super.enable,
super.signedMultiplicand,
super.signedMultiplier,
Adder Function(Logic a, Logic b, {Logic? carryIn}) adderGen =
NativeAdder.new,
PartialProductSignExtension Function(PartialProductGeneratorBase pp,
{String name})
signExtensionGen = CompactRectSignExtension.new,
super.name = 'compression_tree_multiplier',
super.reserveName,
super.reserveDefinitionName,
String? definitionName,
}) : super(
definitionName: definitionName ??
'CompressionTreeMultiplier_W${a.width}x'
'${b.width}_${Multiplier.signedMD(signedMultiplicand)}_'
'${Multiplier.signedML(signedMultiplier)}_'
'with${adderGen(a, a).definitionName}') {
final pp = PartialProduct(a, b, RadixEncoder(radix),
selectSignedMultiplicand: selectSignedMultiplicand,
signedMultiplicand: signedMultiplicand,
selectSignedMultiplier: selectSignedMultiplier,
signedMultiplier: signedMultiplier,
name: 'comp_partial_product');
signExtensionGen(pp.array).signExtend();
pp.generateOutputs();
final compressor = ColumnCompressor(pp.rows, pp.rowShift,
clk: clk, reset: reset, enable: enable);
final adder = adderGen(compressor.add0, compressor.add1);
product <= adder.sum.slice(a.width + b.width - 1, 0);
}