Number Representations, Boolean Minimisation and Combinational CMOS Logic
Fixed Point for Signal Paths, Floating Point for Range
A fixed-point number is an integer with an agreed binary point, and it is the format almost all real signal processing hardware actually uses, so it is worth being fluent in. In the common Q7 form a byte holds one sign bit and seven fractional bits, so the representable values run from −1.0 to +1 − 2^(−7) = 0.9921875 in steps of 2^(−7) = 0.0078125. The spacing is constant across the whole range — that is the defining property, and it is why a fixed-point filter has a flat quantisation noise floor. The price is range: multiply two Q7 numbers and the product is Q14, needing 16 bits, and every practical implementation must then decide whether to round, truncate or saturate.
A floating-point number buys range by making the spacing grow with magnitude. IEEE 754 single precision spends 32 bits as 1 sign, 8 exponent, 23 significand, stores the exponent biased by 127, and does not store the leading 1 of a normalised significand at all — that implied bit is a free 24th bit of precision. Encode +0.15625 and every step is exact, which makes it a good pattern to be able to reproduce: 0.15625 = 5/32, which is 0.00101 in binary, which normalises to 1.01 × 2^(−3). So the sign bit is 0, the exponent field is −3 + 127 = 124 = 01111100, and the significand field is 01 followed by twenty-one zeros. The complete word is 0 01111100 01000000000000000000000. Reverse the process on any pattern by remembering that the stored exponent E means a scale of 2^(E − 127) and the stored fraction f means a significand of 1.f.
| Quantity | Two's complement integer | Q7 fixed point |
|---|---|---|
| Most positive value | 01111111 = 127 as an integer | 01111111 = 0.9921875 as a fraction |
| Most negative value | 10000000 = −128, the most negative | 10000000 = −1.0 exactly |
| Step between neighbours | 1 LSB | 2^(−7) = 0.0078125 per LSB |
Pattern 11011111 | −33 as an integer | −33/128 = −0.2578125 as a fraction |
| What the hardware does | Identical addition and subtraction | Identical too — only the reader's scaling differs |
0.5, 0.25 and 0.15625 are exact while 0.1 and 0.3 are not, and store as the nearest representable neighbour instead. In fixed point that error is bounded by half a step everywhere; in floating point the step itself scales with the exponent, so adding a small sample to a large accumulator can change nothing at all and floating-point addition is genuinely not associative. That is the mechanism behind an accumulator that stalls in a long filter sum, and it is why DSP hardware often carries a wider accumulator than its data path. Range and precision are separate questions: single precision reaches about 3.4 × 10^38 while holding only about seven decimal digits, and a question asking whether a value can be stored is nearly always asking about the second.Boolean Identities, and Literal Count as a Cost
Boolean algebra is worth learning as a set of moves with a purpose, and for EC the purpose is usually transistor count. In static CMOS, one literal in a product term is one nMOS transistor in the pull-down network and one pMOS in the pull-up network, so deleting a literal deletes two transistors and deleting a term deletes a whole branch. That makes literal count, not term count, the honest measure of what a simplification bought. The identities that keep paying are few: De Morgan, (A + B)′ = A′B′ and (AB)′ = A′ + B′, which is how you move between an AND-OR form and the NAND-only or NOR-only form a CMOS library actually offers; absorption, A + AB = A; the redundancy law A + A′B = A + B; and consensus, AB + A′C + BC = AB + A′C, whose middle term is the one a Karnaugh map shows as covered twice over.
| Identity | Statement | What it buys |
|---|---|---|
| De Morgan | (AB)′ = A′ + B′, (A + B)′ = A′B′ | Converts a design into the inverting gates a CMOS library has |
| Absorption | A + AB = A, A(A + B) = A | Deletes a term the map would show as fully contained |
| Redundancy | A + A′B = A + B | Removes one literal, hence two transistors |
| Consensus | AB + A′C + BC = AB + A′C | Drops a whole redundant branch from the network |
| Shannon expansion | f = A·f(A = 1) + A′·f(A = 0) | The formal basis of multiplexer-based logic |
Two structural facts round the algebra off. NAND and NOR are each functionally complete: tie a NAND's inputs together and it is an inverter, follow a NAND with that inverter and it is an AND, and De Morgan supplies OR — so a whole design can be built from one cell type, which is exactly what a real standard-cell library prefers because one cell means one characterised delay and one mask set. And XOR is not a primitive: A ⊕ B = AB′ + A′B = (A + B)(AB)′, which matters because the arithmetic circuits later in this chapter are built almost entirely from XOR, and its cost in transistors is the cost of the adder.
AB covers minterms 6 and 7 of three variables, A′C covers 1 and 3, and BC covers 3 and 7 — both of which are already in the union, so BC adds nothing and the law is proved in one line with no rearrangement at all. The same counting habit answers the questions that ask how many minterms a function has, which are otherwise easy marks lost to arithmetic.Karnaugh Maps: Prime Implicants, Don't Cares and Non-Unique Answers
A Karnaugh map is a truth table redrawn so that physically adjacent squares differ in exactly one variable, which is why a rectangular group of 2^k ones can be written as a product term with k variables deleted. Take f(A,B,C,D) = Σm(1,3,7,11,15) with don't cares at 0, 2 and 5, and lay the map out with AB down the side in the order 00, 01, 11, 10 and CD across the top in the same order. Row AB = 00 holds minterms 0, 1, 3, 2 in that column order; row 01 holds 4, 5, 7, 6; row 11 holds 12, 13, 15, 14; row 10 holds 8, 9, 11, 10. Fill it in and three groups appear: the column CD = 11 is all ones and gives CD; the pair of columns CD = 01 and CD = 11 in the top two rows gives A′D using the don't care at 5; and the top-left square of four gives A′B′ using the don't cares at 0 and 2.
Row AB | CD = 00 | CD = 01 | CD = 11 | CD = 10 |
|---|---|---|---|---|
AB = 00 | m0 = X, don't care | m1 = 1 | m3 = 1 | m2 = X, don't care |
AB = 01 | m4 = 0 | m5 = X, don't care | m7 = 1 | m6 = 0 |
AB = 11 | m12 = 0 | m13 = 0 | m15 = 1 | m14 = 0 |
AB = 10 | m8 = 0 | m9 = 0 | m11 = 1 | m10 = 0 |
Now separate the two questions a map answers. A prime implicant is a group that cannot be made any larger, which is a local fact about one group: CD cannot grow to D because that would need minterms 9 and 13, and neither is a one or a don't care. This function has exactly three prime implicants — CD, A′D and A′B′. An essential prime implicant is one that is the only cover of some minterm, which is a global fact about the whole function: minterm 11 sits in CD alone, so CD is essential, while minterm 1 sits in both A′D and A′B′, so neither of those is forced. The consequence is that this function has two different minimal expressions, f = CD + A′D and f = CD + A′B′, each with two terms and four literals, and both are fully correct answers. A question that says the minimal form has assumed something the map does not guarantee.
| Prime implicant | Squares it covers | Essential? |
|---|---|---|
CD | 3, 7, 11, 15 — all ones | Yes, the only cover of minterm 11 |
A′D | 1, 3, 7 and the don't care 5 | No — minterm 1 has another home |
A′B′ | 1, 3 and the don't cares 0 and 2 | No — the alternative to A′D |
One more map is worth carrying, because it teaches a pattern rather than a procedure. g(A,B,C,D) = Σm(0,2,5,7,8,10,13,15) looks scattered when you write the minterms out, and on the map it forms two groups of four that no beginner spots: every one has either B = 0 with D = 0, or B = 1 with D = 1. So g = B′D′ + BD, which is (B ⊕ D)′ — the XNOR of two of the four variables, with A and C irrelevant. A checkerboard on a Karnaugh map is always an XOR or XNOR, never a two-literal product, and recognising it saves the minute a question spends trying to draw rectangles round diagonal ones.
f above is Σm(1,3,7,11,15), five minterms, even though f = CD + A′B′ also happens to make squares 0 and 2 output a one. So a question asking how many minterms the function has gets 5, while a question asking how many squares the implementation drives high gets 7 — and these are different questions with different answers. The related exam habit is notation: write an unused entry as X or spell out don't care, and never as a repeated letter, because a marker cannot tell a smudged three-letter scrawl from a variable name.Static CMOS: Two Dual Networks, and Why Every Gate Inverts
This is the sub-item the EC syllabus names and a computer-science digital section does not, so treat it as compulsory rather than as background. A static CMOS gate is two networks between the output node and the rails. The pull-down network is nMOS transistors between the output and ground, and it conducts when the output should be 0. The pull-up network is pMOS transistors between the output and V_DD, and it conducts when the output should be 1. The two are duals: series in one is parallel in the other. Because an nMOS conducts when its gate is high and pulls the output low, the gate is inherently inverting — series nMOS realises (A·B)′ and never A·B, and there is no static CMOS AND gate at all, only a NAND followed by an inverter.
Counting transistors then becomes mechanical, and it is the most common question type on this sub-item. An n-input NAND or NOR takes 2n transistors, one nMOS and one pMOS per input. A complex gate takes two transistors per literal in its expression, provided the expression is written in the inverted form the gate naturally produces. So Y = (A·(B + C))′ needs a pull-down of A in series with B parallel C, three nMOS; its dual pull-up is A in parallel with B in series with C, three pMOS; six transistors in one gate, and one gate delay. Ask for the non-inverted Y = A·(B + C) and you must add an inverter, so eight transistors and two gate delays — the standard reason a designer pushes inversions back through a network with De Morgan until the bubbles cancel rather than paying for them.
| Function | Pull-down network of nMOS | Pull-up network of pMOS | Transistors |
|---|---|---|---|
Inverter, Y = A′ | One nMOS | One pMOS | 2 |
NAND2, Y = (AB)′ | A and B in series | A and B in parallel | 4 |
NOR2, Y = (A + B)′ | A and B in parallel | A and B in series | 4 |
AND2, Y = AB | NAND2 pull-down plus the inverter's nMOS | NAND2 pull-up plus the inverter's pMOS | 6 |
AOI, Y = (A(B + C))′ | A in series with B parallel C | A in parallel with B series C | 6, in a single gate |
| XOR2, complementary form | Four nMOS, driven by A, A′, B, B′ | Four pMOS in the dual arrangement | 12, counting the two input inverters |
f·C·V_DD^2 rather than its static power sets the power budget.Delay follows from the same picture, and one number is enough to make it concrete. Model the conducting network as an average on-resistance R charging or discharging a load capacitance C_L. The output moves exponentially, so the fifty-per-cent point arrives after 0.69·R·C_L. With R = 2 kΩ and C_L = 50 fF, that is 0.69 × 2000 × 50 × 10^(−15) = 69 ps. Two readings matter. First, delay is proportional to load, which is why fanout appears in every timing question. Second, a two-input NAND has two nMOS in series, so its effective R is about twice an inverter's for the same width — that is the origin of the rule of thumb that a gate with more inputs is slower, and it is the circuit-level fact behind the critical-path arithmetic in the next chapter.
Adders, and the Carry That Sets the Delay
A half adder takes two bits and produces S = A ⊕ B and C_out = A·B. A full adder takes a carry in as well, and its two outputs are S = A ⊕ B ⊕ C_in and C_out = A·B + C_in·(A ⊕ B). That second form of the carry is worth writing exactly as shown, because it names the two mechanisms every fast adder exploits: a stage generates a carry when A·B = 1 regardless of what arrives, and it propagates an incoming carry when A ⊕ B = 1. Cascade n full adders with each carry-out wired to the next carry-in and you have a ripple-carry adder — minimal hardware, and a delay that grows linearly with the word length.
Put numbers on that, because the exam does. Suppose each full adder needs 0.8 ns from its carry-in to its carry-out and 0.6 ns from its carry-in to its sum. In a 16-bit ripple-carry adder the carry produced by stage 0 appears at 0.8 ns, the carry into stage 15 therefore appears at 15 × 0.8 = 12.0 ns, and that stage's sum bit settles 0.6 ns later, at 12.6 ns. The carry-out of the whole adder is later still, at 16 × 0.8 = 12.8 ns, so 12.8 ns is the honest worst-case delay of the block and the number a timing question wants. Notice what the answer does not depend on: the data. The worst case is a pattern that makes every stage propagate — 0000000000000001 plus 1111111111111111 is the classic — while typical data settles far sooner, which is why a synchronous design must be clocked for the worst case and never for the average.
| Adder | How the carry travels | Delay behaviour | Hardware cost |
|---|---|---|---|
| Ripple carry | Serially, stage by stage | Grows as n; 12.8 ns in the example above | Lowest — n full adders and nothing else |
| Carry lookahead | Computed in parallel from generate and propagate terms | Grows as log n when blocks are nested | High — extra logic per block, fanout grows |
| Carry select | Both answers computed, then a multiplexer picks | About half of ripple, at one extra mux delay | Roughly double the adders plus multiplexers |
M to XOR every bit of the second operand and to drive the carry-in as well: with M = 0 the block computes A + B, and with M = 1 it computes A + B′ + 1, which is A − B. One adder, one XOR per bit, both operations. Two flags then fall out for free: the carry-out is the unsigned borrow indication, and signed overflow is C_n ⊕ C_(n−1), the XOR of the carry out of the sign position with the carry into it, which is a single gate and needs no case analysis. This is the fastest reliable way to answer any question that asks whether a particular signed addition overflowed — compute the top two carries and XOR them, rather than reasoning about magnitudes.Code Converters, Multiplexers and Decoders
A code converter is a combinational block that re-labels the same information, and the one EC asks about most is binary to Gray, because Gray code is what a shaft encoder or a flash ADC actually emits. Its defining property is that consecutive codes differ in exactly one bit, so a reading taken while the encoder is between two positions can be wrong by at most one step instead of by anything at all. The converter is pure XOR: G_3 = B_3 and G_i = B_(i+1) ⊕ B_i for the rest. Convert 1011, which is decimal 11: G_3 = 1, G_2 = 1 ⊕ 0 = 1, G_1 = 0 ⊕ 1 = 1, G_0 = 1 ⊕ 1 = 0, so the Gray code is 1110. Going back is a running XOR in the other direction: B_3 = G_3 = 1, then B_2 = B_3 ⊕ G_2 = 0, B_1 = B_2 ⊕ G_1 = 1, B_0 = B_1 ⊕ G_0 = 1, recovering 1011. Note the structural difference, because it is examinable: binary to Gray needs n − 1 independent XOR gates and has one gate delay, while Gray to binary is a chain and its delay grows with n.
| Decimal | Binary B_3 B_2 B_1 B_0 | Gray G_3 G_2 G_1 G_0 | Bits changed from the previous code in the sequence |
|---|---|---|---|
| 7 | 0111 | 0100 | One |
| 8 | 1000 | 1100 | One in Gray, but all four in binary |
| 11 | 1011 | 1110 | One |
| 12 | 1100 | 1010 | One |
A multiplexer selects one of 2^k data inputs with k select lines, and Shannon expansion turns it into a general logic element. Drive the selects with some of the variables; each data input then carries the residual function of whatever variables are left. Realise f(A,B,C) = Σm(1,2,4,7) on a 4-to-1 multiplexer with A and B as selects. For AB = 00 the map holds minterms 0 and 1, whose outputs are 0 and 1, so the residual is C. For AB = 01, minterms 2 and 3 give 1 and 0, so the residual is C′. For AB = 10, minterms 4 and 5 give 1 and 0, so C′ again. For AB = 11, minterms 6 and 7 give 0 and 1, so C. The four data inputs are therefore C, C′, C′, C — and the function itself was A ⊕ B ⊕ C, the odd-parity function, which is worth recognising from its minterm list alone.
Select AB | Minterms in that column | Their outputs for C = 0, C = 1 | Data input needed |
|---|---|---|---|
AB = 00 | 0 and 1 | 0, then 1 | I_0 = C |
AB = 01 | 2 and 3 | 1, then 0 | I_1 = C′ |
AB = 11 | 4 and 5 | 1, then 0 | I_2 = C′ |
AB = 10 | 6 and 7 | 0, then 1 | I_3 = C |
A decoder is the same idea run backwards: an n-to-2^n decoder raises exactly one output for each input combination, so it emits every minterm at once. One OR gate across the selected outputs then realises any single function of n variables, and several OR gates realise several functions of the same inputs without repeating any logic — which is precisely how a small read-only memory implements a truth table, and the link forward to the memories in the next chapter. Two practical details matter in questions. Real decoders are usually active low, so the selected line goes to 0 and the collecting gate becomes a NAND rather than an OR. And the enable input is what allows cascading: a 3-to-8 decoder with an enable can be grown into a 4-to-16 by using the fourth address bit to enable one of two devices, which is the same trick that selects one memory chip out of several.
2^k-to-1 multiplexer has k select lines, and the residual function of the one remaining variable can only be 0, 1, that variable or its complement — all four of which are available at no cost. So the same part covers k + 1 variables, not k: a 4-to-1 handles any function of three variables, and an 8-to-1 any function of four. Candidates lose marks here in the cautious direction, reaching for a 16-to-1 where an 8-to-1 was sufficient. Push the idea one step further and the residual can be a small gate rather than a literal, which is how a multiplexer tree implements a wide function with far fewer levels than a two-level AND-OR form; a question that gives you an external inverter and asks for the smallest multiplexer is testing exactly this.Key takeaways
- Read the most significant bit of a two's complement word as weight
−2^(n−1):11010011is−45signed and211unsigned, from the same eight bits. - Carry-out is the unsigned flag; signed overflow is
C_n ⊕ C_(n−1), and one addition can raise either, both or neither. - Fixed point has constant spacing and IEEE 754 single spends 1 + 8 + 23 bits with a bias of 127 and an implied leading one —
0.15625encodes as0 01111100 01000000000000000000000. - A prime implicant cannot be enlarged; an essential one is the sole cover of some minterm —
Σm(1,3,7,11,15)with don't cares at 0, 2, 5 has three primes, one essential and two equally minimal answers. - Static CMOS is two dual networks and is therefore always inverting:
2ntransistors for ann-input NAND, six for(A(B + C))′, eight for the non-inverted version. - A ripple-carry adder's worst case is data-independent and set by the carry chain —
16 × 0.8 = 12.8 nsfor the 16-bit example, which is why lookahead exists. - Binary to Gray is
G_i = B_(i+1) ⊕ B_iin one gate delay, and a2^k-to-1 multiplexer realises any function ofk + 1variables.
Practice questions (8)
Attempt each one before opening the answer. Every explanation names the tempting wrong option as well as the right one, because that is where marks are lost.
A 32-bit word holds the IEEE 754 single-precision pattern 1 10000010 01100000000000000000000, written as sign, then the eight exponent bits, then the twenty-three fraction bits. What decimal value does it represent?
Show answer
Answer: B — Minus 11.0
The sign bit is 1, so the value is negative. The exponent field 10000010 is 130 and the stored exponent is biased by 127, so the scale is two raised to 130 minus 127 = 3, that is 8. The fraction field 0110000... means a significand of 1.011 in binary, which is 1 + 0.25 + 0.125 = 1.375, the leading one being implied and not stored. The value is therefore minus 1.375 times 8 = minus 11.0. Answering minus 1.375 stops after reading the significand and forgets to apply the exponent at all, which is the commonest slip; minus 22.0 uses a bias of 126 and so doubles the scale.An eight-bit register holds the pattern 11010011, which the hardware treats as a two's complement signed integer. The value is widened to sixteen bits and the sixteen-bit result is then shifted left by two places, with no bits lost off the top. What decimal value does the register now hold?
Show answer
Answer: D — Minus 180
Read the pattern with the most significant bit carrying weight minus 128: minus 128 + 64 + 16 + 2 + 1 = minus 45. Widening a two's complement value means copying the sign bit into every new position, so the sixteen-bit word is 1111111111010011 and still represents minus 45; zero-extending instead would give plus 211, which is the same eight bits read as unsigned. A left shift of two places multiplies by four, so the final value is minus 180. The answer 844 is 211 multiplied by four and is what you get by taking the unsigned reading and zero-extending, which is exactly the mix-up that corrupts a signed sample loaded into a wider accumulator.A four-variable function is f(A, B, C, D) = the sum of minterms 1, 5, 7, 13 and 15, with don't cares at minterms 3 and 9. How many prime implicants does f have, and how many of them are essential?
Show answer
Answer: A — Three prime implicants, of which one is essential
Every one and every don't care has D equal to 1, so all the covering groups live in the D half of the map. Three groups of four cannot be enlarged: C'D covers 1, 5, 13 and the don't care 9; BD covers 5, 7, 13, 15; and A'D covers 1, 5, 7 and the don't care 3. None can grow to D alone, because minterm 11 is a zero, so there are exactly three prime implicants. Essentiality is a different test: minterm 15 lies only in BD, so BD is essential, while minterm 1 has a home in both C'D and A'D and forces neither, so only one prime implicant is essential and there are two equally minimal answers. Counting all three as essential is the usual confusion of a group that cannot be enlarged with a group that cannot be dispensed with.A static CMOS gate has a pull-down network in which the transistors driven by A and by B are in parallel with each other, and that parallel pair is in series with the transistor driven by C. The pull-up network is the dual of it. What function does the output carry?
Show answer
Answer: C — The complement of (A + B) and C
The pull-down network conducts, and so drives the output low, exactly when its path from the output to ground is complete. Here that path needs A or B to be high, and C to be high as well, so the output is low when (A + B) and C is true and high otherwise. The gate therefore realises the complement of that product, which is an and-or-invert cell of six transistors. Answering the non-inverted form is the standard slip and ignores the fact that an nMOS network conducting to ground can only ever pull the output down: static CMOS is inherently inverting, and getting (A + B) and C out of it costs an extra inverter, two more transistors and a second gate delay.Two gates in one static CMOS library have the same number of inputs and identical transistor widths: a three-input NAND and a three-input NOR. Which of them has the slower worst-case output rise, and for what reason?
Show answer
Answer: A — The NOR, because its pull-up is a series stack of three pMOS and holes are the slower carriers
A rising output is driven by the pull-up network. In a NAND the pull-up is three pMOS in parallel, so the rise is fast; in a NOR it is three pMOS in series, and series on-resistances add. That stack is made of the slow devices, since hole mobility is roughly two to three times below electron mobility, so the NOR is much the worse of the two and that asymmetry is why real standard-cell libraries are NAND-heavy. The NAND's series nMOS stack governs its fall rather than its rise, so it is the wrong network to blame for a slow rise. Both gates use exactly six transistors, so the transistor count cannot be the reason, and being duals guarantees the same logic structure, not the same speed.A twelve-bit ripple-carry adder is assembled from full adders in which the delay from carry-in to carry-out is 0.5 ns and the delay from carry-in to sum is 0.4 ns. Operands arrive at all inputs at the same instant. How long after that is every output bit, including the final carry-out, guaranteed stable?
Show answer
Answer: B — 6.0 ns
The carry has to cross every stage in turn, so the carry-out of the whole adder appears after twelve carry-to-carry delays, 12 times 0.5 = 6.0 ns. The sum bit of the most significant stage is ready earlier than that: its carry-in arrives after eleven stages, 11 times 0.5 = 5.5 ns, and its sum follows 0.4 ns later at 5.9 ns. The block is stable only when the last of its outputs is, so the answer is the larger of the two, 6.0 ns. Quoting 5.9 ns takes the most significant sum bit and forgets that the carry-out is also an output of the adder, and 6.4 ns adds the sum delay onto the full carry chain, double-counting the last stage.A single multiplexer is to realise an arbitrary Boolean function, with each data input free to be driven by a constant 0, a constant 1, one remaining variable or that variable complemented. What is the smallest multiplexer that can handle any function of five variables?
Show answer
Answer: D — A sixteen-to-one multiplexer
Driving the select lines with k of the variables splits the function by Shannon expansion into two-to-the-k residual functions of the variables that are left. If exactly one variable is left, its residual can only be 0, 1, that variable or its complement, and all four are available at no cost, so a multiplexer with k select lines covers k + 1 variables. Five variables therefore need k = 4, that is a sixteen-to-one part. Reaching for the thirty-two-to-one is the cautious error of assuming one data input per minterm, which throws away the free extra variable; the eight-to-one has only three select lines and covers four variables, one short.An engineer is assembling a data path out of code converters, address decoders and static CMOS cells, and wants to know what each block costs in gate delays and in transistors. Which of the following claims hold?
Show answer
Answer: A — Binary-to-Gray conversion takes one exclusive-OR gate delay whatever the word length, while Gray-to-binary is a chain whose delay grows with the word length; B — A decoder raises one output for each input combination, so it emits every minterm and one OR gate over selected outputs realises any function of its inputs
Each Gray bit is the exclusive-OR of a binary bit with its neighbour one place up, and all of those gates work at once, so the conversion costs one gate delay however wide the word; the inverse is a running exclusive-OR in which each output feeds the next, so its delay grows with the word. A decoder emits every minterm of its inputs on separate lines, which is exactly why one collecting gate per function realises several functions of the same inputs without repeating any logic. A don't care is permission and never an obligation: using it to grow a group does not add it to the function, so the function above would still have exactly its stated minterms. And an AND gate in static CMOS is a NAND followed by an inverter, six transistors against four.