#import "@local/handout:0.1.0": *

#show: handout.with(
  title: [Warm-Up: Adders],
  by: "Mark",
)

#problem()
Fill the following binary addition table. \
#hint([s is "sum," c is "carry"])

#align(
  center,
  table(
    columns: (9mm, 9mm, 9mm, 9mm),
    align: center,
    $a$, $b$, $s$, $c$,
    [0], [0], [?], [?],
    [0], [1], [?], [?],
    [1], [0], [?], [?],
    [1], [1], [?], [?],
  ),
)

#v(1fr)

#problem()
Draw a logic circuit that atisfies the above table. \
This is called a _half adder_. \
#hint([You should need exactly two gates.])

#solution([
  $s = a #text([`xor`]) b$ \
  $c = a #text([`and`]) b$
])

#v(1fr)

#definition()
A _full adder_ is similar to a half adder, but it has an extra input: \
a full adder takes $a$, $b$, and $c_"in"$, and produces $s$ and $c_"out"$. \
#hint([$c_"in"$ is "carry in"])

#problem()
Use two half adders to construct a full adder.

#solution([
  $
    s_1, c_1 & = "HA"(a, b) \
    s_2, c_2 & = "HA"(s_1, c_"in") \
     s_"out" & = s_2 \
     c_"out" & = "OR"(c_1, c_2)
  $

  #v(2mm)

  Of course, the class should just draw the circuit.
])


#v(1fr)
#pagebreak()



#problem(label: "ripple-adder")
How can we add two four-bit binary numbers using the full adder? \
We want a four-bit output sum and a one-bit $c_"out"$.
#v(1fr)

#problem()
Say that all basic logic gates need $1u$ of time to fully switch states. \
#note([This is called _gate delay_], type: "Note")

#v(2mm)

How much time does a full adder need to fully switch states? \
How about your circuit from @ripple-adder?

#v(1fr)

#problem("Bonus")
Design a faster solution to @ripple-adder.

#v(1fr)
