addReduceAdders method

Logic addReduceAdders(
  1. List<Logic> inputs, {
  2. int? depth,
  3. Logic? control,
  4. String name = 'prefix',
})

Reduction tree adder generator for the final addition.

Implementation

Logic addReduceAdders(List<Logic> inputs,
    {int? depth, Logic? control, String name = 'prefix'}) {
  var level = inputs;
  var stage = 0;
  while (level.length > 1) {
    final nextLevel = <Logic>[];
    for (var i = 0; i < level.length; i += 2) {
      if (i + 1 == level.length) {
        nextLevel.add(level[i]);
        continue;
      }

      final inputWidth = level[i].width > level[i + 1].width
          ? level[i].width
          : level[i + 1].width;
      final resultWidth = inputWidth + 1;
      final a = _extendForSum(level[i], resultWidth, control);
      final b = _extendForSum(level[i + 1], resultWidth, control);
      final sum = adderGen(a, b, name: '${name}_s${stage}_add${i ~/ 2}').sum;
      nextLevel.add(sum.slice(resultWidth - 1, 0));
    }
    level = nextLevel;
    stage++;
  }
  return level.single;
}