Drafting Sheets · a film
Lighting the sheet…
Power Good
An ATX mainboard drawn from its own TikZ, then booted
A technical drawing that draws itself and then switches on. An orange spark reads a TikZ listing and drafts a whole ATX mainboard, part by part, at 12 by 9.6 inches: the outline and mounting holes, the rear I/O, the CPU socket ringed by fourteen regulator phases, the power connectors, four DDR5 slots and the length-matched bus that reaches them, the expansion slots and M.2 drives, the chipset, everything along the edges, and the debug display. When the last line is down the board is powered on, the way a real one is: the supply's rails come up and it raises Power Good, the regulator's phases take turns round the socket, the debug display counts through its POST codes while the memory is trained slot by slot and the graphics link comes up, and then it runs, under full load, at 85 °C. Every frame is rendered in your browser from that listing as it plays, and the score is code that reads the same plan.
- Tempo
- 96 BPM · 62 bars
- Picture
- The drafting engine, WebGL
- Program
- One TikZ listing, 303 lines
- Power-on
- Rails, POST and heat, modelled
- Sound
- Original score, synthesised from the plan
Chapters11
The listing153 statements
The film is this TikZ, the same listing as Form Factor and drawn by the same engine as the other Drafting Sheets: the pen reaches each step on the bar the script gives it. Copied with one \tikzsetline for the sheet’s own keys, it compiles in any LaTeX document that loads TikZ.
% title: ATX mainboard, 12 x 9.6 in% one unit is one inch; the rear edge is up\begin{tikzpicture} % the board: ATX, 12 x 9.6 in, 1.6 mm FR-4\draw[very thick] (0,0) rectangle (12,9.6);\draw[|<->|] (0,10.55) -- (12,10.55);\draw[|<->|] (12.45,0) -- (12.45,9.6); % nine mounting holes, each in a 0.4 in keep-out\foreach \x/\y in {11.6/9.2,6.7/9.2,0.5/8.3,11.6/3.1,6.7/3.1,0.5/3.1,11.6/0.25,6.7/0.25,0.5/0.25} { \draw (\x,\y) circle (.14); \draw (\x,\y) circle (.07); \draw[help lines,dashed] (\x-.2,\y-.2) rectangle ++(.4,.4);}\draw[|<->|] (-.75,.25) -- (-.75,3.1);\draw[|<->|] (-.75,3.1) -- (-.75,8.3);\draw[|<->|] (6.7,9.82) -- (11.6,9.82); % the rear I/O, under a 6.25 in shield\draw[help lines,dashed] (5.5,8.6) rectangle (11.75,9.75);\draw[|<->|] (5.5,10.1) -- (11.75,10.1);\draw (5.55,8.65) rectangle (6.33,9.72);\foreach \x in {5.75,6.13} \foreach \y in {8.88,9.2,9.52} \draw (\x,\y) circle (.11);\draw (7,8.62) rectangle (7.7,9.72);\draw (7.08,8.95) -- (7.08,9.55) -- (7.62,9.55) -- (7.62,8.95) -- (7.48,8.95) -- (7.48,8.85) -- (7.22,8.85) -- (7.22,8.95) -- cycle;\foreach \x in {7.12,7.5} \draw (\x,9.61) rectangle ++(.08,.06);\foreach \x in {7.85,8.6} { \draw (\x,8.66) rectangle ++(.6,1.06); \draw (\x+.08,9.05) rectangle ++(.44,.55); \draw (\x+.14,9.3) -- ++(.32,0);}\draw (9.35,8.7) rectangle (9.77,9.72);\draw (9.42,9.08) -- (9.42,9.6) -- (9.7,9.6) -- (9.7,9.2) -- (9.6,9.08) -- cycle;\draw (9.87,8.7) rectangle (10.35,9.72);\draw (9.93,9.6) -- (10.29,9.6) -- (10.24,9.12) -- (9.98,9.12) -- cycle;\foreach \x in {10.5,10.72} \draw (\x,8.9) rectangle ++(.16,.82);\foreach \y in {8.95,9.4} \draw (11.02,\y) rectangle ++(.28,.28); % the CPU socket: a square LGA, its frame, load plate and lever\draw[thick] (7.35,4.25) rectangle (9.85,7.15);\foreach \x/\y in {7.5/4.4,9.7/4.4,7.5/7,9.7/7} \draw (\x,\y) circle (.07);\draw (7.6,4.6) rectangle (9.6,6.8);\draw[semithick] (9.98,4.4) -- (10.06,4.3) -- (10.06,6.98) -- (9.85,6.98);% the package, 40 x 40 mm, and its heat spreader\draw (7.8125,4.9125) rectangle ++(1.575,1.575);\draw[semithick] (7.96,5.06) rectangle ++(1.28,1.28);\fill (7.86,4.96) -- ++(.14,0) -- ++(-.14,.14) -- cycle;\foreach \i in {0,...,8} { \draw (8.07+\i*.13,4.94) rectangle ++(.05,.07); \draw (8.07+\i*.13,6.39) rectangle ++(.05,.07);} % Vcore: fourteen phases, a power stage and a choke each\foreach \y in {4.55,4.95,...,6.95} { \draw (10.2,\y-.12) rectangle ++(.2,.24); \draw (10.25,\y-.06) rectangle ++(.1,.12); \draw (10.58,\y-.17) rectangle ++(.34,.34); \draw (10.75,\y) circle (.11);}\foreach \x in {7.55,7.95,...,9.95} { \draw (\x-.12,7.38) rectangle ++(.24,.2); \draw (\x-.06,7.43) rectangle ++(.12,.1); \draw (\x-.17,7.78) rectangle ++(.34,.34); \draw (\x,7.95) circle (.11);}% a bootstrap capacitor beside every power stage\foreach \y in {4.55,4.95,...,6.95} \draw (10.455,\y-.03) rectangle ++(.03,.06);\foreach \x in {7.55,7.95,...,9.95} \draw (\x-.03,7.635) rectangle ++(.06,.03);\foreach \y in {4.6,4.95,5.3,5.65} \draw (11.05,\y) circle (.11);\foreach \x in {7.6,7.93,...,9.9} \draw (\x,8.35) circle (.11);\draw (10.42,7.62) rectangle ++(.26,.26);\foreach \i in {0,...,4} { \draw (10.46+\i*.045,7.62) -- ++(0,-.04); \draw (10.46+\i*.045,7.88) -- ++(0,.04);} % power in: EPS 8 + 4 for the CPU, ATX 24-pin for the rest\draw (11.3,6) rectangle (11.72,6.75);\draw (11.3,6.85) rectangle (11.72,7.25);\foreach \c in {0,1} \foreach \r in {0,...,3} \fill (11.37+\c*.18,6.06+\r*.165) rectangle ++(.1,.1);\foreach \c in {0,1} \foreach \r in {0,1} \fill (11.37+\c*.18,6.92+\r*.165) rectangle ++(.1,.1);\draw (7.8,.15) rectangle (9.85,.7);\draw (8.7,.7) rectangle ++(.25,.08);\foreach \c in {0,...,11} \foreach \r in {0,1} \fill (7.88+\c*.165,.24+\r*.2) rectangle ++(.1,.1); % memory: four DDR5 slots, two channels, latches at both ends\foreach \y in {1.5,1.85,2.35,2.7} { \draw (6.05,\y-.13) rectangle ++(5.2,.26); \draw[densely dotted] (6.15,\y) -- (8.4,\y); \draw[densely dotted] (8.55,\y) -- (11.15,\y); \draw (5.87,\y-.1) rectangle ++(.18,.2); \draw (11.25,\y-.1) rectangle ++(.18,.2);}\foreach \y/\n in {1.5/A1,1.85/A2,2.35/B1,2.7/B2} \node[font=\tiny,anchor=east] at (5.82,\y) {DIMM\_\n}; % the memory bus, length-matched: the short ones meander\foreach \i in {0,1,2,3} \draw[ash,very thin] (7.8+.155*\i,4.25) -- (7.8+.155*\i,4.03-.07*\i) -- (7.72+.155*\i,3.95-.07*\i) -- (7.23+.3*\i,3.95-.07*\i) -- (7.15+.3*\i,3.87-.07*\i);\foreach \i in {4,5,6,7,8,9,10,11} \draw[ash,very thin] (7.8+.155*\i,4.25) -- (7.8+.155*\i,3.26+.07*\i) -- (7.88+.155*\i,3.18+.07*\i) -- (7.37+.3*\i,3.18+.07*\i) -- (7.45+.3*\i,3.1+.07*\i);\foreach \u/\v in {10.75/3.87} \draw[ash,very thin] (\u,\v) -- (\u,2.95);\foreach \u/\v/\a in {7.15/3.87/0.018,7.45/3.8/0.023,7.75/3.73/0.029,8.05/3.66/0.035,8.65/3.38/0.064,8.95/3.45/0.046,9.25/3.52/0.033,9.55/3.59/0.025,9.85/3.66/0.017,10.15/3.73/0.012,10.45/3.8/0.008} { \draw[ash,very thin] (\u,\v) -- (\u,\v-.06); \draw[ash,very thin,domain=\v-.06:3.01,samples=120] plot ({\u+\a*max(-1,min(1,3*sin(5200*\x)))},\x); \draw[ash,very thin] (\u,3.01) -- (\u,2.95);} % expansion: seven slot positions 0.8 in apart, five populated\draw (5.8,7.05) rectangle (6.1,8.05);\draw (5.8,7.59) -- ++(.3,0);\foreach \d in {-.06,.06} \draw[densely dotted] (5.95+\d,7.13) -- (5.95+\d,7.53);\draw[semithick] (5,4.55) rectangle (5.3,8.05);\draw (4.97,4.52) rectangle (5.33,8.08);\draw (5,7.59) -- ++(.3,0);\foreach \d in {-.06,.06} \draw[densely dotted] (5.15+\d,4.63) -- (5.15+\d,7.53);\draw (5.03,4.38) rectangle (5.27,4.55);\draw (3.4,7.05) rectangle (3.7,8.05);\draw (3.4,7.59) -- ++(.3,0);\foreach \d in {-.06,.06} \draw[densely dotted] (3.55+\d,7.13) -- (3.55+\d,7.53);\draw (2.6,4.55) rectangle (2.9,8.05);\draw (2.6,7.59) -- ++(.3,0);\foreach \d in {-.06,.06} \draw[densely dotted] (2.75+\d,4.63) -- (2.75+\d,7.53);\draw (2.63,4.38) rectangle (2.87,4.55);\draw (1,4.55) rectangle (1.3,8.05);\draw (1,7.59) -- ++(.3,0);\foreach \d in {-.06,.06} \draw[densely dotted] (1.15+\d,4.63) -- (1.15+\d,7.53);\draw (1.03,4.38) rectangle (1.27,4.55);\draw[|<->|] (2.75,8.3) -- (3.55,8.3); % storage: three M.2 2280 slots, an NVMe drive in each\draw (6.22,7.98) rectangle (7.15,8.12);\draw (6.25,4.6) rectangle (7.12,8);\foreach \y in {7.25,6.55} \draw (6.35,\y) rectangle ++(.48,-.48);\draw (6.87,7.1) rectangle ++(.17,-.17);\draw (6.685,4.68) circle (.06);\draw (3.885,7.98) rectangle (4.815,8.12);\draw (3.915,4.6) rectangle (4.785,8);\foreach \y in {7.25,6.55} \draw (4.015,\y) rectangle ++(.48,-.48);\draw (4.535,7.1) rectangle ++(.17,-.17);\draw (4.35,4.68) circle (.06);\draw (1.485,7.98) rectangle (2.415,8.12);\draw (1.515,4.6) rectangle (2.385,8);\foreach \y in {7.25,6.55} \draw (1.615,\y) rectangle ++(.48,-.48);\draw (2.135,7.1) rectangle ++(.17,-.17);\draw (1.95,4.68) circle (.06); % the CPU's lanes: sixteen to the graphics slot, four to the boot drive\foreach \k in {0,...,7} \draw[ash,very thin] (7.35,5.15+.16*\k) -- ({5.4+abs(.26*\k-.4)},5.15+.16*\k) -- (5.4,4.75+.42*\k) -- (5.33,4.75+.42*\k);\foreach \k in {0,...,3} \draw[ash,very thin] (7.55+.08*\k,7.15) -- (7.55+.08*\k,7.22+.04*\k) -- (6.61+.1*\k,7.22+.04*\k) -- (6.55+.1*\k,7.28+.04*\k) -- (6.55+.1*\k,8);\draw[ash,very thin] (7.45,4.25) -- (7.45,4.18) -- (4.58,4.18) -- (3.8,3.4);\draw[ash,very thin] (7.5,4.25) -- (7.5,4.135) -- (4.485,4.135) -- (3.75,3.4);\draw[ash,very thin] (7.55,4.25) -- (7.55,4.09) -- (4.39,4.09) -- (3.7,3.4);\draw[ash,very thin] (7.6,4.25) -- (7.6,4.045) -- (4.295,4.045) -- (3.65,3.4); % the chipset, bare, with its heatsink anchors and its lanes\draw[thick] (2.9,2.4) rectangle (3.9,3.4);\draw (3.12,2.62) rectangle ++(.56,.56);\fill (2.95,2.45) -- ++(.12,0) -- ++(-.12,.12) -- cycle;\foreach \x/\y in {2.72/2.22,4.08/3.58} \draw (\x,\y) circle (.06);\draw[ash,very thin] (3.05,2.4) -- (3.05,1.3) -- (2.65,0.9) -- (2.65,0.72);\draw[ash,very thin] (3.25,2.4) -- (3.25,1.3) -- (3.05,1.1) -- (3.05,0.72);\draw[ash,very thin] (3.45,2.4) -- (3.45,1.3) -- (3.6,1.15) -- (3.6,0.72);\draw[ash,very thin] (3.65,2.4) -- (3.65,1.3) -- (4,0.95) -- (4,0.72);\draw[ash,very thin] (3.6,3.4) -- (3.6,3.85) -- (4.35,4.6);\draw[ash,very thin] (3,3.4) -- (3,3.95) -- (2.35,4.6); % the front edge: SATA, USB headers, front panel, fans\foreach \x in {2.45,3.4} { \draw (\x,.12) rectangle ++(.85,.6); \draw (\x+.05,.2) -- ++(0,.18) -- ++(.3,0) -- ++(0,-.06) -- ++(.04,0); \draw (\x+.45,.2) -- ++(0,.18) -- ++(.3,0) -- ++(0,-.06) -- ++(.04,0);}\draw (4.47,.12) rectangle (5.65,.5);\draw (4.97,.12) rectangle ++(.18,.06);\foreach \c in {0,...,9} \foreach \r in {0,1} \fill (4.58+\c*.1,.26+\r*.1) circle (.022);\draw (5.85,.15) rectangle (6.25,.45);\draw (5.92,.22) rectangle (6.18,.38);\draw (.85,.17) rectangle (1.35,.43);\foreach \c in {0,...,4} \foreach \r in {0,1} \fill (.92+\c*.09,.25+\r*.1) circle (.022);\draw (1.55,.17) rectangle (2.05,.43);\foreach \c in {0,...,4} \foreach \r in {0,1} \fill (1.62+\c*.09,.25+\r*.1) circle (.022);\foreach \x/\y in {10.25/8.2,10.8/8.2,7.1/0.2} { \draw (\x,\y) rectangle ++(.45,.22); \foreach \p in {0,...,3} \fill (\x+.085+\p*.093,\y+.11) circle (.022);}\foreach \x/\y in {0.15/5.3} { \draw (\x,\y) rectangle ++(.22,.45); \foreach \p in {0,...,3} \fill (\x+.11,\y+.085+\p*.093) circle (.022);} % audio: its own corner, split from the rest of the board\draw[ash,densely dashed] (.75,8.15) -- (5.45,8.15) -- (5.45,9.55);\draw (2.46,8.71) rectangle ++(.28,.28);\foreach \i in {0,...,5} { \draw (2.5+\i*.04,8.71) -- ++(0,-.04); \draw (2.5+\i*.04,8.99) -- ++(0,.04); \draw (2.46,8.75+\i*.04) -- ++(-.04,0); \draw (2.74,8.75+\i*.04) -- ++(.04,0);}\draw (3.3,8.75) rectangle ++(.24,.2);\foreach \i in {0,...,3} { \draw (3.33+\i*.06,8.75) -- ++(0,-.05); \draw (3.33+\i*.06,8.95) -- ++(0,.05);}\foreach \x/\r in {.95/.13,1.35/.13,1.75/.11,3.95/.13,4.35/.11,4.75/.11} \draw (\x,8.85) circle (\r);\foreach \x in {.95,1.35} \draw (\x,9.25) circle (.09);\draw (4,9.17) rectangle (4.9,9.43);\foreach \c in {0,...,4} \foreach \r in {0,1} \fill (4.12+\c*.165,9.25+\r*.1) circle (.022); % the rest: LAN, Super I/O, the BIOS, the battery, the clock\draw (6.15,8.2) rectangle ++(.3,.3);\draw (5.97,8.28) rectangle ++(.12,.14);\draw (4.625,3.175) rectangle ++(.45,.45);\foreach \i in {0,...,9} { \draw (4.67+\i*.04,3.175) -- ++(0,-.05); \draw (4.67+\i*.04,3.625) -- ++(0,.05); \draw (4.625,3.22+\i*.04) -- ++(-.05,0); \draw (5.075,3.22+\i*.04) -- ++(.05,0);}\draw (4.56,2.08) rectangle ++(.24,.2);\foreach \i in {0,...,3} { \draw (4.59+\i*.06,2.08) -- ++(0,-.05); \draw (4.59+\i*.06,2.28) -- ++(0,.05);}\draw (1.6,3.85) circle (.4);\draw (1.6,3.85) circle (.34);\draw (1.15,3.75) rectangle ++(.08,.2);\draw (2.08,1.98) rectangle ++(.34,.09);\draw (2.25,2.55) rectangle ++(.2,.2);\foreach \i in {0,...,3} { \draw (2.28+\i*.045,2.55) -- ++(0,-.03); \draw (2.28+\i*.045,2.75) -- ++(0,.03);}\draw (.9,3.72) rectangle ++(.2,.16);\foreach \x in {.95,1.05} \fill (\x,3.8) circle (.022);\draw (.95,.62) rectangle (1.75,.86);\foreach \c in {0,...,6} \foreach \r in {0,1} \fill (1.05+\c*.1,.69+\r*.1) circle (.022);\foreach \y in {6.2,6.75} { \draw (.15,\y) rectangle ++(.18,.32); \foreach \p in {0,1,2} \fill (.24,\y+.07+\p*.09) circle (.022);} % what tells you it is alive: the debug display, Q-LEDs, buttons\draw (10.3,.3) rectangle (10.9,.75);\foreach \x in {10.38,10.62} \draw[ash] (\x,.37) rectangle ++(.18,.31);\foreach \y in {.32,.45,.58,.71} \draw (11.05,\y) rectangle ++(.08,.06);\foreach \x in {10.3,10.65} { \draw (\x,.9) rectangle ++(.25,.25); \draw (\x+.125,1.025) circle (.07);}\draw (10.02,.97) rectangle ++(.08,.06); % decoupling: rows of 0402 capacitors where the current changes fast\foreach \x in {6.2,6.45,...,9.95} \draw (\x,1.15) rectangle ++(.06,.03);\foreach \i in {0,...,6} { \draw (2.98+\i*.13,2.25) rectangle ++(.06,.03); \draw (2.98+\i*.13,3.52) rectangle ++(.06,.03); \draw (2.76,2.5+\i*.13) rectangle ++(.03,.06); \draw (4.01,2.5+\i*.13) rectangle ++(.03,.06);}\foreach \x in {5.55,5.65,...,6.05} \draw (\x,4.42) rectangle ++(.03,.06); % silkscreen: what is where\node[font=\footnotesize] at (1.65,1.55) {ATX MAINBOARD};\node[font=\tiny] at (1.65,1.3) {REV 1.0};\foreach \x/\y/\t in {2.62/3.55/U2,4.85/3.85/U3,4.68/1.85/U4,2.6/9.15/U6,1.6/3.28/BAT1} \node[font=\tiny] at (\x,\y) {\t};\foreach \x/\y in {.3/9.35,11.75/1.6,.3/1.2} { \fill (\x,\y) circle (.03); \draw (\x,\y) circle (.07);} \end{tikzpicture}