Bubble pushing is a visual logic simplification technique based on De Morgan's Laws where you invert gate inputs and outputs to swap AND/OR symbols while preserving the exact same Boolean function. When you are staring at a dense, multi-page schematic for a memory decoder or an FPGA logic block, tracing active-low signals through a maze of NAND and NOR gates can cause cognitive overload. By systematically 'pushing' the inversion bubbles from the output of a gate back to its inputs (or vice versa), you can visually convert a confusing network of NANDs into a highly readable network of AND/OR gates, making the underlying logic intent immediately obvious without altering a single physical wire.
The Core Rules of Bubble Pushing
At the bench or in the IDE, bubble pushing is the graphical equivalent of applying De Morgan's Theorems. The mathematical laws state that the complement of a product is the sum of the complements, and the complement of a sum is the product of the complements. Graphically, we represent logical inversion as a 'bubble' on a schematic wire.
To execute a push, follow these strict transformation steps:
- Identify the target gate: Locate the gate whose symbol you want to change (e.g., a NAND gate you want to view as an OR gate).
- Move the bubble: If the bubble is on the output, push it backward to all inputs. If bubbles are on the inputs, push them forward to the output.
- Swap the symbol: Change the AND shape to an OR shape, or the OR shape to an AND shape.
- Resolve collisions: If pushing a bubble results in two bubbles on the same wire segment, erase both. A double inversion is a logical identity.
| Original Gate | Push Direction | Resulting Symbol | Boolean Equivalence |
|---|---|---|---|
| NAND (AND with output bubble) | Output to Inputs | OR with input bubbles | NOT(A AND B) = NOT(A) OR NOT(B) |
| NOR (OR with output bubble) | Output to Inputs | AND with input bubbles | NOT(A OR B) = NOT(A) AND NOT(B) |
| AND with input bubbles | Inputs to Output | NAND (AND with output bubble) | NOT(A) AND NOT(B) = NOT(A OR B) |
| OR with input bubbles | Inputs to Output | NOR (OR with output bubble) | NOT(A) OR NOT(B) = NOT(A AND B) |
Worked Example: BOM and Space Reduction with the 74HC00
Bubble pushing isn't just for reading schematics; it is a critical tool for Bill of Materials (BOM) optimization and board space management. Consider a scenario where you are designing a fault-monitoring circuit on a tight budget and board footprint. You need a 2-input OR function to trigger an alarm if either Sensor A or Sensor B goes high ($Y = A + B$).
You already have a 74HC00 (Quad 2-Input NAND) on the board for another logic task, and it has three unused gates left inside the SOIC-14 package. You could add a 74HC32 (Quad 2-Input OR) to the BOM, but that costs an additional $0.14 per board and consumes 8.65 x 3.9 mm of PCB real estate. Instead, you use bubble pushing to implement the OR function using the leftover NAND gates.
The Logic Translation:
- Start with the desired function: $Y = A + B$.
- Apply double inversion (which changes nothing logically): $Y = NOT(NOT(A + B))$.
- Apply De Morgan's to the inner term: $Y = NOT(NOT(A) AND NOT(B))$.
The Physical Implementation:
- Gate 1: Wire both inputs of the first NAND gate to Sensor A. This acts as a NOT gate, outputting $NOT(A)$.
- Gate 2: Wire both inputs of the second NAND gate to Sensor B. This outputs $NOT(B)$.
- Gate 3: Feed the outputs of Gate 1 and Gate 2 into the third NAND gate. The output is $NOT(NOT(A) AND NOT(B))$, which perfectly equals $A + B$.
By pushing the bubbles in your mind, you saved a component placement. However, you must account for the physical reality of the silicon. The typical propagation delay ($t_{pd}$) for a single 74HC00 gate at 5V and 25°C is 14 ns. Because our OR equivalent passes through three physical gate stages in series, the total typical propagation delay becomes 42 ns. If your fault monitor requires sub-20 ns response times, this BOM-saving trick will cause a timing violation, and you must use a dedicated 74HC32 (which achieves the OR function in a single 14 ns stage).
Where You Meet Bubble Pushing in Practice
You will encounter the need for bubble pushing in three primary areas of modern digital design:
- Reading Active-Low Control Schematics: Microcontroller and memory datasheets heavily favor active-low signals (e.g., $\overline{CS}$, $\overline{WE}$, $\overline{RESET}$). Schematics drawn by IC vendors often use negative logic symbols (OR gates with input bubbles) to represent what is physically a NAND function. Pushing the bubbles to the outputs converts these into standard NAND gates, aligning the schematic with the physical silicon truth tables.
- FPGA and CPLD Synthesis: When writing Verilog or VHDL, synthesis tools (like AMD Vivado or Intel Quartus) map your code into Look-Up Tables (LUTs). The tool doesn't care about your bubbles, but when you view the post-synthesis RTL schematic to debug a timing failure, the tool will often output a sea of inverted AND/OR structures. Bubble pushing allows you to mentally collapse these LUT mappings back into the high-level state machine logic you originally wrote.
- Interrupt and Reset Trees: In complex systems, multiple fault lines are wire-OR'd or combined via discrete logic to trigger a master interrupt. Pushing bubbles helps verify that an open-drain active-low interrupt line correctly interfaces with an active-high microcontroller GPIO without requiring an extra inverter.
Common Confusions: Logical Equivalence vs. Electrical Levels
The most frequent mistake hobbyists and junior engineers make with bubble pushing is confusing logical equivalence with electrical signaling levels.
Bubble pushing is strictly a mathematical and schematic drawing convention. It tells you that a NAND gate behaves like a negative-logic OR gate. It does not mean the physical chip changes its voltage thresholds. A 74HC00 still expects standard CMOS voltage levels (0V for logic LOW, 5V for logic HIGH). If you are interfacing a 3.3V ESP32 GPIO to a 5V 74HC00 input, pushing bubbles on your schematic will not solve the electrical mismatch; you still need a level shifter or a voltage divider. Always separate the Boolean math (where bubble pushing lives) from the physical layer (where voltage thresholds, fan-out, and propagation delays live).
Frequently Asked Questions
How do you push bubbles through a flip-flop or latch?
You treat the clock, preset, and clear pins exactly like standard gate inputs. If a D flip-flop has an active-low asynchronous clear ($\overline{CLR}$), it has a bubble on that input. If you need to push that bubble through the flip-flop to the Q output, the Q output becomes inverted ($\overline{Q}$), and the internal logical function of the storage element remains unchanged. However, you cannot push a bubble 'through' the clock edge (e.g., converting a rising-edge trigger to a falling-edge trigger via bubble pushing) without explicitly adding a physical inverter to the clock line, as the edge sensitivity is a physical timing property, not just a static logic state.
Does bubble pushing change propagation delay in physical ICs?
No. Bubble pushing is a mental and schematic exercise; it does not alter the physical wiring or the silicon. If you redraw a NAND gate as a negative-OR gate on your schematic, the physical signal still traverses the exact same transistors inside the 74-series IC or FPGA LUT. The propagation delay, power consumption, and rise/fall times remain identical. The only time delay changes is if you use bubble pushing to redesign the circuit to use fewer cascaded physical gates, as demonstrated in the 74HC00 BOM reduction example.
Why use bubble pushing instead of Karnaugh maps for simplification?
Karnaugh maps (K-maps) and Boolean algebra are used to minimize the number of terms in a logic equation before you draw the schematic. Bubble pushing is used after the schematic is drawn (or during the drawing phase) to optimize the use of specific physical IC packages, match active-low signal names, and make the schematic readable to human engineers. K-maps solve the math; bubble pushing solves the schematic drafting and component mapping.






