Carry lookahead
Can calculate carries in parallel
Tradeoff: need more hardware (space vs. time)
Boolean expression for carry-out:
cout = \xycin + x\ycin  + xy\cin + xycin
What does this expression look like?
z = \abc + a\bc + ab\c + abc
How many inputs? 3
How many need to be true? 2
What is that function called?
Alternate expression for carry-out:
cout = xy + xcin  + ycin
This means that there is a carry whenever at least 2 of the bits are 1 (possibly all 3).
Call cin ci (carry-in for bit i) and cout ci+1 (carry-in for bit i+1)
Distributive property:
   ci+1 = xiyi + ci(xi + yi)
Define 2 new terms:
   gi = xiyi
   pi = xi + yi
Then rewrite expression for ci+1
   ci+1 = gi + pici
gi is called the generate term
it always generates a carry out, if equal to 1
pi is called the propagate term.
it may generate a carry, depending on the carry-in (ci)
if exactly one of xi or yi is 1, then the carry-in will determine the carry-out
How can we get rid of the dependency on the carry-in?
Let's look at the first carry:
   c1 = g0 + p0c0
The next one is:
   c2 = g1 + p1c1
Now we can plug in the expression for c1, which we just calculated:
   c2 = g1 + p1(g0 + p0c0)
      = g1 + p1g0 + p1p0c0
How do we get the right side of this expression?
Since g1 and p1 depend only on x1 and y1,
and g0 and p0 depend only on x0 and y0,
and c0 depends only on x0 and y0 (there is no carry-in for the addition of bits 0),
we can get c2 right away without waiting for c1!
Likewise,
   c3 = g2 + p2c2
      = g2 + p2(g1 + p1g0 + p1p0c0)
      = g2 + p2g1 + p2p1g0 + p2p1p0c0
Following the same pattern,
   c4 = g3 + p3g2 + p3p2g1 + p3p2p1g0 + p3p2p1p0c0
The circuit uses full adders, but the output of one
is not directly connected to the input of the next