3.3.3 · D2Combinational Circuits

Visual walkthrough — Carry-lookahead adder

2,157 words10 min readBack to topic

Everything here is just Boolean algebra applied to the full adder, turned into pictures.


Step 1 — What is a carry, really?

WHAT. When we add two binary digits (each is or ) plus an incoming carry, sometimes the result is too big for one digit and spills over into the next column. That spill is the carry-out.

WHY. Before we can predict carries, we must be crystal-clear on what a carry is and where it comes from. Everything downstream is just re-asking "when does this spill happen?"

PICTURE. Look at the four columns below. Each column adds . The tiny arrow leaving the top of a column is the carry handed to the column on its left.

Figure — Carry-lookahead adder

The subscript is just a position label: column is the rightmost (smallest) column, column is next, and so on.


Step 2 — The exact rule for when a carry is born

WHAT. A carry-out happens exactly when at least two of the three inputs are (two ones make , which is — a spill).

WHY. We need the precise boolean condition so we can later split it into pieces we can pre-compute. This is the same equation the Full Adder already gives us — we are only re-reading it.

PICTURE. The "majority" gate: shade every input combination that spills.

Figure — Carry-lookahead adder

Notice the split: one reason ignores entirely; the other reason multiplies . That gap is the whole idea. Hold onto it.


Step 3 — Naming the two reasons: Generate and Propagate

WHAT. We give the two boxes from Step 2 short names, because they depend on only and — inputs we hold in our hands immediately, with no waiting.

WHY. The slowness of a Ripple-Carry Adder comes entirely from waiting for . If we can name the parts that don't need , we can compute them for every column at the same time.

PICTURE. Two little machines per column, both fed only by , lighting up before any carry exists.

Figure — Carry-lookahead adder

Rewriting Step 2 with the new names gives the seed of everything:


Step 4 — Why the recursive form is still slow (the trap)

WHAT. The equation contains . To get you need ; to get you need . That is still a chain.

WHY. We must see the trap before we escape it. If we implemented directly as hardware, each carry waits 2 gate delays (one AND, one OR) for the carry below — exactly the ripple problem, just renamed. (More on this counting in Propagation Delay & Fan-in.)

PICTURE. The bucket brigade: waits for , waits for … the delay stacks column by column.

Figure — Carry-lookahead adder

Step 5 — Unroll the chain: substitute away

WHAT. Wherever a appears, we replace it by its own formula, again and again, until only 's, 's, and the original input carry remain.

WHY. This is pure Boolean Algebra: substitution plus the distributive law. Once is gone, no carry waits for another — they are all functions of inputs available at time zero.

PICTURE. Watch get "unfolded." Each substitution replaces a waiting term with things we already know.

Figure — Carry-lookahead adder

Start from the bottom and expand:

Every term now reads as a little story: "some lower column generated a carry, AND every column above it (up to here) propagated it." The term is "the input carry rode all the way up."


Step 6 — Why this is now fast (constant depth)

WHAT. Each above is one big OR of ANDs — a 2-level AND–OR expression of things known at time zero.

WHY. Depth, not width, sets speed. All appear in 1 gate delay. Every carry is then AND then OR = 2 more delays, no matter how many bits. Sums finish in 1 more. Total ≈ 4 levels, independent of , versus ripple's ≈ .

PICTURE. Left: ripple's staircase of delay grows with . Right: CLA's flat, constant tower.

Figure — Carry-lookahead adder

Step 7 — Edge & degenerate cases (nothing is left unshown)

WHAT. We check the corners so no scenario surprises you.

WHY. A rule you can't trust at the edges isn't a rule. Contract: cover every case.

PICTURE. Three tiny worlds — all-propagate, all-generate, and .

Figure — Carry-lookahead adder
  • Case A — every column propagates, none generates ( for all ). Then . The input carry rides untouched to the top. This is -style behaviour: one source, a chain of passes.
  • Case B — a column generates in the middle (, others ; all ). Then : the born carry floods every column above. Below it, carries stay .
  • Case C — degenerate but all , some . As soon as one , its product term dies: the input carry is blocked there and does not reach higher columns. Never drop the term unless you've confirmed .

Step 8 — One level up: blocks of four (same picture, bigger tiles)

WHAT. Treat a whole 4-bit chunk exactly like one "super-column" with its own group-generate and group-propagate .

WHY. Wide single-level CLA needs impossibly big gates. Grouping keeps fan-in sane while reusing the identical math — self-similarity, like fractal tiles. Compare Carry-Save Adder for a different speed trick entirely.

PICTURE. Four small columns collapse into one big tile obeying .

Figure — Carry-lookahead adder

The one-picture summary

Figure — Carry-lookahead adder

This last figure compresses the journey: two numbers → per-column (instant) → each carry as a 2-level AND–OR of those → all carries at once → 4-bit blocks stacking the same law. Full-adder sum bits close the loop as (reusing Full Adder logic).

Recall Feynman: the whole walkthrough in plain words

Two numbers line up in columns. Each column looks only at its own two cards and decides two facts before the game starts: "I definitely spill a carry" (generate, both cards ) or "if a carry reaches me I'll pass it on" (propagate, my cards differ). A ripple adder still makes each column wait for the one on its right — a slow bucket brigade. The lookahead trick is to take the sentence "I spill if I generate, or if I propagate an arriving carry," and keep substituting the "arriving carry" with its sentence, over and over, until every carry is written purely in terms of the pre-computed generates and propagates and the single input carry. Now a teacher glances at every column's two facts at once and announces all the carries in a fixed few steps — no line, no waiting. Stack four columns into one big tile with a group-generate and group-propagate, and the exact same trick works one level up, which is how real 64-bit adders stay fast.

Recall Quick self-check

Why does not depend on ? ::: Because uses only this column's own inputs — a carry is made regardless of any arriving carry. What single algebraic move turns the recursion into constant depth? ::: Substituting each by its own until only 's, 's and remain (distributive law). In Case A (all propagate, none generate), what is ? ::: — the input carry rides straight through. Why isn't CLA zero-delay? ::: It is constant (~4 gate levels), not zero; and large fan-in forces hierarchical blocks.

Connections

  • Carry-lookahead adder — the parent result this page derives visually.
  • Full Adder — source of and .
  • Ripple-Carry Adder — the slow baseline whose waiting we eliminate.
  • Boolean Algebra — substitution + distributive law does the unrolling.
  • Propagation Delay & Fan-in — why depth is constant but fan-in grows.
  • Carry-Save Adder — a different speed strategy (defer carries).
  • Prefix Adders (Kogge-Stone) — logarithmic-depth generalization of Step 8.