Simplifying Boolean Expressions With Karnaugh Maps

Karnaugh maps are a formalized way of turning a truth table into a fairly minimal logical expression.

It’s fairly minimal in that it’s the minimal “sum of products” representation, but that might not be the minimal representation of the logic circuit.

The sum of products representation just means that you OR (sum) multiple terms that are ANDed (product) together. For instance the below is a sum of products expression:

Out = \overline{A}B + AB

With multiplication being AND, addition being OR, and a line over a letter being a NOT, the above could be written in C++ code like this:

bool out = (!A && B) || (A && B);

It would be real easy to write code like that especially if you were adding onto an existing condition, and you might not even notice that it isn’t the minimal Boolean expression to make the desired output.

Using Boolean algebra, you can do the following simplifications:
Out = \overline{A}B + AB\\  = B*(\overline{A}+A)\\  = B*1\\  = B

Which simplifies the C++ code to just this:

bool out = B;

Using Boolean algebra to simplify, you’d have to remember (or derive) the identity that A+\overline{A}=1 , and all the other identities to help you simplify equations.

Karnaugh maps make this easier because you will be able to see visually what can be combined (simplified) and what can’t.

Again though, while they give you the smallest possible sum of products representation of the logic circuit, that may not be the smallest possible representation of the circuit.

Let’s get to it!

Two Variable Karnaugh Map: Basics

Going with the example above, it takes two Boolean variables as input (A and B), and gives one Boolean variable as output. Having two input variables means we need a two variable Karnaugh map.

The first step to building the Karnaugh map is having a truth table for the input to output mappings. For our example we’ll use this truth table. This is one of many truth tables that satisfies our equation, so we are working backwards a bit, but hopefully it still makes sense. Usually you would start with the truth table and get a Boolean equation, not the other way around.
\begin{array}{c|c|c}  A & B & Out\\  \hline  0 & 0 & 0 \\  0 & 1 & 1 \\  1 & 0 & 0 \\  1 & 1 & 1 \\  \end{array}

The next thing we do is make our karnaugh map by making a square 2×2 grid where one side of the square is the possible A values, the other side is the possible B values, and the contents of the grid cells are the values we want the formula to come out to be:

\begin{array}{ccc}  & \overline{B} & B \\  \overline{A} & 0 & 1 \\  A & 0 & 1 \\  \end{array}

Next, what you do is circle all 1’s that are in groups of a power of two (one item or two items). Doing that, we get this:

\begin{array}{ccc}  & \overline{B} & B \\  \cline{3-3}  \overline{A} & 0 & \multicolumn{1}{|c|}{1} \\  A & 0 & \multicolumn{1}{|c|}{1} \\  \cline{3-3}  \end{array}

Looking at what we circled, we can see that both values of A are involved in our group, so A doesn’t matter to the output. We can also see that \overline{B} is not involved in any places where there is a 1, so we can ignore that too. All that leaves is B, which is our final, and most minimal answer.

That agrees with the Boolean algebra solution, but came without having to remember any identities. Hooray!

Two Variable Karnaugh Map: Overlaps

If there were multiple groups, you would combine each group with OR to get the final answer. Groups are also allowed to overlap! For instance, let’s look at this truth table to start out:

\begin{array}{c|c|c}  A & B & Out\\  \hline  0 & 0 & 0 \\  0 & 1 & 1 \\  1 & 0 & 1 \\  1 & 1 & 1 \\  \end{array}

Turning that into a Karnaugh map, we get this:

\begin{array}{ccc}  & \overline{B} & B \\  \overline{A} & 0 & 1 \\  A & 1 & 1 \\  \end{array}

Next when it’s time to circle our groups, we have two groups, and they overlap! Here is the first group, which is the same as before:

\begin{array}{ccc}  & \overline{B} & B \\  \cline{3-3}  \overline{A} & 0 & \multicolumn{1}{|c|}{1} \\  A & 1 & \multicolumn{1}{|c|}{1} \\  \cline{3-3}  \end{array}

That group can be expressed as just B.

The other group is this:

\begin{array}{ccc}  & \overline{B} & B \\  \overline{A} & 0 & 1 \\  \cline{2-3}  A & \multicolumn{1}{|c}{1} & \multicolumn{1}{c|}{1} \\  \cline{2-3}  \end{array}

That group can be expressed as just A.

Lastly, we OR our groups together, aka we sum our products, and we get A+B as an answer, which in other words is just A OR B. Check out the truth table and you can see that it is indeed a truth table for OR!

Two Variable Karnaugh Map: Single Sized Groups

What if we don’t have groups of two though, what if we only have groups of one? Let’s explore that real quick with the following truth table:

\begin{array}{c|c|c}  A & B & Out\\  \hline  0 & 0 & 1 \\  0 & 1 & 0 \\  1 & 0 & 0 \\  1 & 1 & 1 \\  \end{array}

That becomes this Karnaugh map:

\begin{array}{ccc}  & \overline{B} & B \\  \overline{A} & 1 & 0 \\  A & 0 & 1 \\  \end{array}

We once again have two groups, but they are each of size one, which is totally ok!

The upper left group is expressed as \overline{AB}, while the lower right group is expressed as AB. We OR those two groups together to get the answer: \overline{AB} + AB. That’s all there is to it.

Four Variable Karnaugh Map: Don’t Care Values

Let’s get a little more sophisticated and see how we would handle four input variables (We could go to three variables next but after learning two and four it’ll be easy to see how to do three). We will start with a truth table, but our truth table will only contain the input values we care about. We’ll omit the ones we don’t care about.

\begin{array}{c|c}  ABCD & Out\\  \hline  0001 & 0 \\  0011 & 1 \\  0111 & 0 \\  1111 & 1 \\  \end{array}

We’ll put 1’s and 0’s into the Karnaugh map to match our truth table, but put x’s where the output wasn’t listed. These are “don’t care” values, where they could either be 0’s or 1’s, depending on whichever is more convinient for us when simplifying. We are also going to change how we label the map a bit.

\begin{array}{cccccc}  & & \multicolumn{4}{c}{CD} \\  & & 00 & 01 & 11 & 10 \\  & 00 & x & 0 & 1 & x \\  AB & 01 & x & x & 0 & x \\  & 11 & x & x & 1 & x \\  & 10 & x & x & x & x \\  \end{array}

In this case, even with the wild card don’t care values, we still just have two 1 item groups, that we OR together to get the answer:

\overline{AB}CD+ABCD

Note that we could factor out the CD and make it into the below, but then it would no longer be in a sum of products form.

CD(\overline{AB}+AB)

You might also have noticed the strange ordering of the values in the table: 00, 01, 11, 10. Normally doesn’t 2 (10) come before 3 (11)? It does, except in this case, we only want to change one variable at a time between neighboring cells. Going from 01 to 11 means that the first bit changed, while going from 01 to 10 means that two bits changed, so isn’t useful for us finding groups. The order that the numbers are in is actually called Gray Code, named after Frank Grey (Wikipedia: Gray Code).

Four Variable Karnaugh Map: Larger Groups

When dealing with karnaugh maps, like I said before, the groups have to be a size of a power of two, but interestingly it can be a power of two on each axis. So valid groups include 4×1, 2×1, 2×2, 4×2 and others. Let’s take a look at one where we encounter a 2×2 group.

Let’s start with the truth table:

\begin{array}{c|c}  ABCD & Out\\  \hline  0000 & 0 \\  0001 & 0 \\  0010 & 0 \\  0011 & 0 \\  0100 & 0 \\  0101 & 1 \\  0110 & 0 \\  0111 & 1 \\  1000 & 0 \\  1001 & 0 \\  1010 & 0 \\  1011 & 1 \\  1100 & 0 \\  1101 & 1 \\  1110 & 0 \\  1111 & 1 \\  \end{array}

That gives us the Karnaugh map:

\begin{array}{cccccc}  & & \multicolumn{4}{c}{CD} \\  & & 00 & 01 & 11 & 10 \\  & 00 & 0 & 0 & 0 & 0 \\  AB & 01 & 0 & 1 & 1 & 0 \\  & 11 & 0 & 1 & 1 & 0 \\  & 10 & 0 & 0 & 1 & 0 \\  \end{array}

There are two groups there. The first is the 2×2 group below and is the intersection of where B is 1, and D is 1, so can be represented as BD.

\begin{array}{cccccc}  & & \multicolumn{4}{c}{CD} \\  & & 00 & 01 & 11 & 10 \\  & 00 & 0 & 0 & 0 & 0 \\  \cline{4-5}  AB & 01 & 0 & \multicolumn{1}{|c}{1} & \multicolumn{1}{c|}{1} & 0 \\  & 11 & 0 & \multicolumn{1}{|c}{1} & \multicolumn{1}{c|}{1} & 0 \\  \cline{4-5}  & 10 & 0 & 0 & 1 & 0 \\  \end{array}

The second group is a 1×2 group that overlaps the first, and is where A,C and D are 1, but B can be either 0 or 1. That makes it able to be represented as ACD.

\begin{array}{cccccc}  & & \multicolumn{4}{c}{CD} \\  & & 00 & 01 & 11 & 10 \\  & 00 & 0 & 0 & 0 & 0 \\  AB & 01 & 0 & 1 & 1 & 0 \\  \cline{5-5}  & 11 & 0 & 1 & \multicolumn{1}{|c|}{1} & 0 \\  & 10 & 0 & 0 & \multicolumn{1}{|c|}{1} & 0 \\  \cline{5-5}  \end{array}

We combine those groups with OR to get the answer:

BD+ACD

Four Variable Karnaugh Map: Wrap Around

Interestingly, you can make groups by wrapping around the edges of the Karnaugh map, either horizontally or vertically. Let’s start with a truth table:

\begin{array}{c|c}  ABCD & Out\\  \hline  0000 & 0 \\  0001 & 0 \\  0010 & 0 \\  0011 & 1 \\  0100 & 0 \\  0101 & 0 \\  0110 & 0 \\  0111 & 0 \\  1000 & 0 \\  1001 & 0 \\  1010 & 0 \\  1011 & 1 \\  1100 & 0 \\  1101 & 0 \\  1110 & 0 \\  1111 & 0 \\  \end{array}

That gives us the Karnaugh map:

\begin{array}{cccccc}  & & \multicolumn{4}{c}{CD} \\  & & 00 & 01 & 11 & 10 \\  & 00 & 0 & 0 & 1 & 0 \\  AB & 01 & 0 & 0 & 0 & 0 \\  & 11 & 0 & 0 & 0 & 0 \\  & 10 & 0 & 0 & 1 & 0 \\  \end{array}

Here is the group highlighted below, which is represented as \overline{B}CD, which is also the answer:

\begin{array}{cccccc}  & & \multicolumn{4}{c}{CD} \\  & & 00 & 01 & 11 & 10 \\  & 00 & 0 & 0 & \multicolumn{1}{|c|}{1} & 0 \\  \cline{5-5}  AB & 01 & 0 & 0 & 0 & 0 \\  & 11 & 0 & 0 & 0 & 0 \\  \cline{5-5}  & 10 & 0 & 0 & \multicolumn{1}{|c|}{1} & 0 \\  \end{array}

Two Variable Karnaugh Map: Handling Redundant Info

If you are like me, you might be wondering – If Karnaugh maps can give you the minimal sum of products expression for a truth table, how does it deal with redundant information or solutions that are of equal size, so it’s ambiguous which to choose?

For instance, Let’s go with the truth table table below. All other inputs not listed are “don’t care” values.

\begin{array}{c|c}  AB & Out\\  \hline  00 & 0 \\  11 & 1 \\  \end{array}

It’s obvious that the output bit corresponds exactly to both A and B separately. Which one does it choose, or does it make some more complex expression that involves both?

Here is the Karnaugh map:

\begin{array}{ccc}  & \overline{B} & B \\  \overline{A} & 0 & x \\  A & x & 1 \\  \end{array}

Well, the disambiguation comes up now that you – the pattern finder in the Karnaugh map – chooses between the two possible groups.

One answer, which is perfectly valid is the below, which is just A.

\begin{array}{ccc}  & \overline{B} & B \\  \overline{A} & 0 & x \\  \cline{2-3}  A & \multicolumn{1}{|c}{x} & \multicolumn{1}{c|}{1} \\  \cline{2-3}  \end{array}

The other answer, which is also perfectly valid, is the below, which is just B

\begin{array}{ccc}  & \overline{B} & B \\  \cline{3-3}  \overline{A} & 0 & \multicolumn{1}{|c|}{x} \\  A & x & \multicolumn{1}{|c|}{1} \\  \cline{3-3}  \end{array}

So, the disambiguation / simplification is left up to the user to choose, but yes, it still comes up with a minimal sum of products answer, and doesn’t try to incorporate both bits into a more complex logic operation.

Other Notes

The act of turning a truth table into a logical expression is called logical synthesis, if you want to read more along those lines.

You might be wondering if because there is a sum of products form, if there is also a product of sums form? There is in fact, and you can get that form from Karnaugh maps as well. It may result in a more optimal logical expression. More info on that here: Is Karnaugh Map possible for Maxterms?.

You might be tempted to bring a higher number of variables into the mix. Be warned… adding a 5th variable makes the Karnaugh map into a 4x4x2 3d shape. Adding a 6th variable makes it into a 4x4x4 cube. Adding a 7th variable makes it into a 4x4x4x2 hypercube, and the pattern continues.

For higher numbers of inputs, people will often use a different algorithm instead, that I hope to write a post on before too long. You can read about it here: Wikipedia: Quine–McCluskey algorithm

Lastly, you might be wondering, what do i do if i have M input bits, and N output bits? How can I make a circuit or a set of instructions to generate a minimal logical expression to encompass that?

Well, one simple way is to handle each bit separately and have N Karnaugh maps each having M variables. A problem there though is that computers do operations on multiple bits at the same time with most operations, so having each bit do it’s calculations without considering sharing instructions with another bit leaves some efficiency on the table.

I’m not sure of any better algorithms currently, but I’ve asked on stack exchange so there may be some more info there by the time you read this:
Algorithms for logical synthesis of multiple output bits?

Comments

comments

About Demofox

I'm a game and engine programmer at Blizzard Entertainment and have been making games since 1990 (starting out with QBasic and TI-85 games) My shipped titles include: * Heroes of the Storm * StarCraft II: Heart of the Swarm & Legacy of the void * Insanely Twisted Shadow Planet (PC) * Gotham City Impostors (PC, 360, PS3) * Line Rider (PC, Wii, DS) I also like hiking, making music, learning cool new stuff and attempting the impossible.