ParallelPrefixAdder constructor

ParallelPrefixAdder(
  1. Logic a,
  2. Logic b, {
  3. Logic? carryIn,
  4. ParallelPrefix ppGen(
    1. List<Logic> inps,
    2. Logic op(
      1. Logic term1,
      2. Logic term2
      )
    ) = KoggeStone.new,
  5. String name = 'parallel_prefix_adder',
})

Adder constructor

Implementation

ParallelPrefixAdder(super.a, super.b,
    {super.carryIn,
    ParallelPrefix Function(
            List<Logic> inps, Logic Function(Logic term1, Logic term2) op)
        ppGen = KoggeStone.new,
    super.name = 'parallel_prefix_adder'})
    : super(definitionName: 'ParallelPrefixAdder_W${a.width}') {
  final l = List<Logic>.generate(a.width - 1,
      (i) => [a[i + 1] & b[i + 1], a[i + 1] | b[i + 1]].swizzle());
  final cin = carryIn ?? Const(0);
  // ignore: cascade_invocations
  l.insert(
      0,
      [(a[0] & b[0]) | (a[0] & cin) | (b[0] & cin), a[0] | b[0] | cin]
          .swizzle()
          .named('pg_base', naming: Naming.mergeable));
  final u = ppGen(
      l,
      (lhs, rhs) => [rhs[1] | rhs[0] & lhs[1], rhs[0] & lhs[0]]
          .swizzle()
          .named('pg', naming: Naming.mergeable));
  sum <=
      [
        u.val[a.width - 1][1],
        List<Logic>.generate(
            a.width,
            (i) =>
                ((i == 0) ? a[i] ^ b[i] ^ cin : a[i] ^ b[i] ^ u.val[i - 1][1])
                    .named('t_$i')).rswizzle()
      ].swizzle();
}