142 lines
4.5 KiB
Markdown
142 lines
4.5 KiB
Markdown
---
|
|
tags:
|
|
- propositional-logic
|
|
- nand-to-tetris
|
|
- logic
|
|
---
|
|
|
|
# Boolean function synthesis
|
|
|
|
When we looked at
|
|
[boolean functions](Boolean_functions.md) we were
|
|
working in a particular direction: from a function to a truth table. When we do
|
|
Boolean function synthesis we work in the opposite direction: from a truth table
|
|
to a function.
|
|
|
|
This is an important skill that we will use when constructing
|
|
[logic circuits](Digital_circuits.md).
|
|
We will go from truth conditions (i.e. what we want the circuit to do and when
|
|
we want it to do it) to a function expression which is then reduced to its
|
|
simplest form and implemented with
|
|
[logic gates](Logic_gates.md).
|
|
Specifically, NAND gates.
|
|
|
|
We will show here that a complex logical expression can be reduced to an
|
|
equivalent expression that uses only the NAND operator.
|
|
|
|
## The process
|
|
|
|
The process proceeds as follows:
|
|
|
|
1. Work out the truth conditions for the circuit we want to construct
|
|
2. Identify the rows where the output is equal to 1
|
|
3. For each of these rows construct a Boolean expression that evaluates to that
|
|
output
|
|
4. Join each expression with OR
|
|
5. Reduce these expressions to a single expression in its simplest form
|
|
|
|
## Example
|
|
|
|
Let's say we have the following truth table:
|
|
|
|
| Line | $x$ | $y$ | $z$ | $f$ |
|
|
| ---- | --- | --- | --- | --- |
|
|
| 1 | 0 | 0 | 0 | 0 |
|
|
| 2 | 0 | 0 | 1 | 0 |
|
|
| 3 | 0 | 1 | 0 | 1 |
|
|
| 4 | 0 | 1 | 1 | 0 |
|
|
| 5 | 1 | 0 | 0 | 1 |
|
|
| 6 | 1 | 0 | 1 | 0 |
|
|
| 7 | 1 | 1 | 0 | 0 |
|
|
| 8 | 1 | 1 | 1 | 0 |
|
|
|
|
We only need to focus on lines 1, 3, and 5 since they have the output 1:
|
|
|
|
| Line | $x$ | $y$ | $z$ | $f$ |
|
|
| ---- | --- | --- | --- | --- |
|
|
| 1 | 0 | 0 | 0 | 1 |
|
|
| 3 | 0 | 1 | 0 | 1 |
|
|
| 5 | 1 | 0 | 0 | 1 |
|
|
|
|
For each line we construct a Boolean expression that would result in the value
|
|
in the $f$ column. In other words we construct the function:
|
|
|
|
| Line | $x$ | $y$ | $z$ | $f$ |
|
|
| ---- | --- | --- | --- | ----------------------------------------- |
|
|
| 1 | 0 | 0 | 0 | $\lnot(x) \land \lnot (y) \land \lnot(z)$ |
|
|
| 3 | 0 | 1 | 0 | $\lnot(x) \land y \land \lnot(z)$ |
|
|
| 5 | 1 | 0 | 0 | $x \land \lnot(y) \land \lnot(z)$ |
|
|
|
|
We can now join each expression to create a complex expression that covers the
|
|
entire truth table using OR:
|
|
|
|
$$
|
|
(\lnot(x) \land \lnot (y) \land \lnot(z)) \\ \lor \\ (\lnot(x) \land y \land \lnot(z)) \\ \lor \\ (x \land \lnot(y) \land \lnot(z))
|
|
$$
|
|
|
|
It's clear that we have transcribed the truth conditions accurately but that we
|
|
are doing so in a rather verbose way. We can simplify by just looking at the
|
|
position of the 1s in the truth table. Notice:
|
|
|
|
- $z$ is always 0
|
|
- $x$ and $y$ are either 0 or 1 but never both 1 in the same row
|
|
|
|
So we simplify:
|
|
|
|
$$
|
|
(\lnot(x) \land \lnot(z)) \lor (\lnot(y) \land \lnot(z))
|
|
$$
|
|
|
|
Notice that $\lnot(z)$ is repeated so we can remove the repetition through
|
|
[idempotence](Boolean_algebra.md#idempotent-law):
|
|
|
|
$$
|
|
\lnot z \land (\lnot(x) \lor \lnot(y))
|
|
$$
|
|
|
|
The upshot is that we now have a simpler expression that uses only NOT, OR and
|
|
AND. These are the fundamental logic gates thus we are able to construct a
|
|
circuit that embodies the logic of the expression.
|
|
|
|
> This is important and is an instance of the general theorem that _any Boolean
|
|
> function_ can be represented using an expression containing AND, OR and NOT
|
|
> operations
|
|
|
|
But even this is too complex. We could get rid of the OR and just use AND and
|
|
NOT:
|
|
|
|
We can prove this theorem by showing that an expression with AND, NOT, and OR
|
|
can be formulated as an equivalent expression using just NOT and AND:
|
|
|
|
$$
|
|
x \lor y = \lnot(\lnot(x) \land \lnot(y))
|
|
$$
|
|
|
|
| $x$ | $y$ | $x \lor y$ | $\lnot(\lnot(x) \land \lnot(y)$ |
|
|
| --- | --- | ---------- | ------------------------------- |
|
|
| 0 | 0 | 0 | 0 |
|
|
| 0 | 1 | 1 | 1 |
|
|
| 1 | 0 | 1 | 1 |
|
|
| 1 | 1 | 1 | 1 |
|
|
|
|
Finally, we can simplify even further by doing away with AND and NOT and using a
|
|
single
|
|
[NAND gate](Logic_gates.md#nand-gate)
|
|
which embodies the logic of both, being true in all instances where AND would be
|
|
false: $\lnot (x \land y)$.
|
|
|
|
Let's prove the theorem that every logical expression can be formulated as a
|
|
NAND function. To do this we need to show that both NOT and AND can be converted
|
|
to NAND.
|
|
|
|
NOT:
|
|
|
|
$$
|
|
\lnot(x) = x \lnot\land x
|
|
$$
|
|
|
|
AND:
|
|
|
|
$$
|
|
x \land y = \lnot(x \lnot\land y)
|
|
$$
|