BrentKung constructor

BrentKung(
  1. List<Logic> inps,
  2. Logic op(
    1. Logic term1,
    2. Logic term2
    ), {
  3. bool reserveName = false,
  4. bool reserveDefinitionName = false,
  5. String? definitionName,
})

BrentKung constructor.

Implementation

BrentKung(List<Logic> inps, Logic Function(Logic term1, Logic term2) op,
    {super.reserveName, super.reserveDefinitionName, String? definitionName})
    : super(
          definitionName: definitionName ?? 'BrentKung', inps, 'brent_kung') {
  final iseq = <Logic>[];

  inps.forEachIndexed((i, el) {
    iseq.add(addInput('i$i', el, width: el.width));
    _oseq.add(addOutput('o$i', width: el.width));
  });

  // Reduce phase
  var skip = 2;
  while (skip <= inps.length) {
    for (var i = skip - 1; i < inps.length; i += skip) {
      iseq[i] = op(iseq[i - skip ~/ 2], iseq[i])
          .named('reduce_$i', naming: Naming.mergeable);
    }
    skip *= 2;
  }

  // Prefix Phase
  skip = largestPow2LessThan(inps.length);
  while (skip > 2) {
    for (var i = 3 * (skip ~/ 2) - 1; i < inps.length; i += skip) {
      iseq[i] = op(iseq[i - skip ~/ 2], iseq[i])
          .named('prefix_$i', naming: Naming.mergeable);
    }
    skip ~/= 2;
  }

  // Final row
  for (var i = 2; i < inps.length; i += 2) {
    iseq[i] =
        op(iseq[i - 1], iseq[i]).named('final_$i', naming: Naming.mergeable);
  }

  iseq.forEachIndexed((i, el) {
    _oseq[i] <= el.named('o_$i', naming: Naming.mergeable);
  });
}