AND
.and .out {
--value: if(style(--a: 0): 0; style(--b: 0): 0; else: 1);
}
→
→
→
→
→
OR
.or .out {
--value: if(style(--a: 1): 1; style(--b: 1): 1; else: 0);
}
→
→
→
→
NOT
.not .out {
--value: if(style(--a: 1): 0; else: 1);
}
→
→
XOR
.xor .out {
--value: if(
style(--a: 0): if(style(--b: 1): 1; else: 0);
style(--a: 1): if(style(--b: 0): 1; else: 0);
else: 0
);
}
→
→
→
→
(a AND b) OR c
→
→
→
→
→
→
→
→
NAND (NOT AND)
→
→
→
→
→
→
→
→
NOR (NOT OR)
→
→
→
→
→
→
→
→
Binary Converter
.binary > .out {
/* Calculate the current bit value */
--value: calc(mod(var(--dec, 0), 2));
/* Value to pass to the next digit */
--next-dec: calc(round(down, var(--dec, 0) / 2, 1));
&::before {
background: rgb(
calc((1 - var(--value)) * 255),
calc((1 - var(--value)) * 255),
calc((1 - var(--value)) * 255)
);
}
7-Segment Display
Dirac delta function using CSS math controls each segment:
Half Adder
/* Half Adder: adds two bits */
.half-adder .sum {
--value: if(
style(--a: 0): if(style(--b: 1): 1; else: 0);
style(--a: 1): if(style(--b: 0): 1; else: 0);
else: 0
);
}
.half-adder .carry {
--value: if(style(--a: 0): 0; style(--b: 0): 0; else: 1);
}
+
=
(sum, carry)
+
=
+
=
+
=
Full Adder
/* Full Adder: adds two bits + carry in */
.full-adder .sum {
/* Sum = (A XOR B) XOR Cin */
--half-sum: if(
style(--a: 0): if(style(--b: 1): 1; else: 0);
style(--a: 1): if(style(--b: 0): 1; else: 0);
else: 0
);
--value: if(
style(--half-sum: 0): if(style(--cin: 1): 1; else: 0);
style(--half-sum: 1): if(style(--cin: 0): 1; else: 0);
else: 0
);
}
.full-adder .carry {
/* Carry = (A AND B) OR (Cin AND (A XOR B)) */
--carry1: if(style(--a: 0): 0; style(--b: 0): 0; else: 1);
--xor-ab: if(
style(--a: 0): if(style(--b: 1): 1; else: 0);
style(--a: 1): if(style(--b: 0): 1; else: 0);
else: 0
);
--carry2: if(style(--cin: 0): 0; style(--xor-ab: 0): 0; else: 1);
--value: if(style(--carry1: 1): 1; style(--carry2: 1): 1; else: 0);
}
+
+
=
(A + B + Cin = sum, carry)
+
+
=
+
+
=
+
+
=
2:1 Multiplexer (MUX)
/* Select one of two inputs based on select line */
.mux-2to1 .out {
--value: if(
style(--s: 0): var(--i0, 0); /* S=0: select I0 */
else: var(--i1, 0) /* S=1: select I1 */
);
}
I0
I1
S
Out
→
I0=0, I1=1, S=0 → Out=0
→
I0=0, I1=1, S=1 → Out=1
4:1 Multiplexer
/* 4:1 MUX implemented with basic logic gates */
/* Out = (I0·!S1·!S0) + (I1·!S1·S0) + (I2·S1·!S0) + (I3·S1·S0) */
.mux-4to1 .out {
/* Step 1: NOT gates for select lines */
--not-s1: if(style(--s1: 1): 0; else: 1);
--not-s0: if(style(--s0: 1): 0; else: 1);
/* Step 2: AND gates for selection conditions */
--term0: if(style(--i0: 0): 0; style(--not-s1: 0): 0; style(--not-s0: 0): 0; else: 1);
--term1: if(style(--i1: 0): 0; style(--not-s1: 0): 0; style(--s0: 0): 0; else: 1);
--term2: if(style(--i2: 0): 0; style(--s1: 0): 0; style(--not-s0: 0): 0; else: 1);
--term3: if(style(--i3: 0): 0; style(--s1: 0): 0; style(--s0: 0): 0; else: 1);
/* Step 3: OR all terms together */
--value: if(
style(--term0: 1): 1;
style(--term1: 1): 1;
style(--term2: 1): 1;
style(--term3: 1): 1;
else: 0
);
}
I0
I1
I2
I3
S1
S0
Out
→
S1S0=00 → I0
→
S1S0=01 → I1
→
S1S0=10 → I2
→
S1S0=11 → I3