CompressionTreeMultiplier constructor

CompressionTreeMultiplier(
  1. Logic a,
  2. Logic b, {
  3. int radix = 4,
  4. Logic? clk,
  5. Logic? reset,
  6. Logic? enable,
  7. dynamic signedMultiplicand,
  8. dynamic signedMultiplier,
  9. Adder adderGen(
    1. Logic a,
    2. Logic b, {
    3. Logic? carryIn,
    }) = NativeAdder.new,
  10. PartialProductSignExtension signExtensionGen(
    1. PartialProductGeneratorBase pp, {
    2. String name,
    }) = CompactRectSignExtension.new,
  11. String name = 'compression_tree_multiplier',
  12. bool reserveName = false,
  13. bool reserveDefinitionName = false,
  14. 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);
}