ParallelPrefixAdder constructor
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();
}