<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: 千田　智也</title>
    <description>The latest articles on DEV Community by 千田　智也 (@tomoyacreater).</description>
    <link>https://dev.to/tomoyacreater</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4205009%2Fb9387432-7ddc-4c7b-8ab3-a307675b1e3f.png</url>
      <title>DEV Community: 千田　智也</title>
      <link>https://dev.to/tomoyacreater</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tomoyacreater"/>
    <language>en</language>
    <item>
      <title>From 1,464 Unrouted Nets to Zero — But I'm Still Not Calling This Board Manufacturable</title>
      <dc:creator>千田　智也</dc:creator>
      <pubDate>Sun, 25 Oct 2026 04:14:44 +0000</pubDate>
      <link>https://dev.to/tomoyacreater/from-1464-unrouted-nets-to-zero-but-im-still-not-calling-this-board-manufacturable-2c4h</link>
      <guid>https://dev.to/tomoyacreater/from-1464-unrouted-nets-to-zero-but-im-still-not-calling-this-board-manufacturable-2c4h</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Part 2 of letting an AI agent (Codex, driving KiCad through its CLI) design my Raspberry Pi CM4 Mini-ITX IO board. The board is now &lt;strong&gt;fully routed and adopted as the official design&lt;/strong&gt;: ERC 0, DRC 0, unrouted nets 0, schematic↔PCB mismatches 0. Vendor-model power simulations that timed out last time now complete all 12 cases. And yet the strict all-checks pass flag is still &lt;code&gt;false&lt;/code&gt;, and I am &lt;strong&gt;not&lt;/strong&gt; releasing Gerbers — because a fault simulation leaves about −1.35 V on a power controller pin, and nobody has explained it away yet.&lt;/p&gt;

&lt;p&gt;This is a series: &lt;a href="https://dev.to/tomoyacreater/i-let-an-ai-agent-design-my-raspberry-pi-cm4-board-486-checks-later-heres-the-scoreboard-3094"&gt;Part 1 — 486 checks and the first scoreboard&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The scoreboard: Part 1 → Part 2
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Part 1 (Oct 24)&lt;/th&gt;
&lt;th&gt;Part 2 (Oct 25)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ERC errors&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DRC errors&lt;/td&gt;
&lt;td&gt;244&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unrouted nets&lt;/td&gt;
&lt;td&gt;1,464&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schematic↔PCB mismatches&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warnings&lt;/td&gt;
&lt;td&gt;188&lt;/td&gt;
&lt;td&gt;124 (94 copper slivers, 21 vias, 9 track ends)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Board&lt;/td&gt;
&lt;td&gt;placement stage, 0 tracks&lt;/td&gt;
&lt;td&gt;170×170 mm, 8 layers, 963 footprints, 18,500 tracks + vias&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor-model startup sims&lt;/td&gt;
&lt;td&gt;timed out twice, undetermined&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12/12 cases completed to 300 ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strict all-checks pass&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;still false&lt;/strong&gt; (warnings + one unresolved fault case)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The formal re-verification ran on 2026-10-25 at 11:42 JST and also confirmed that none of the 52 input files changed while the checks were running — the loop checks its own homework, including whether the homework moved.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzms90t09jv5yq7njy71u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzms90t09jv5yq7njy71u.png" alt="Top side of the fully routed board" width="800" height="792"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Top side. The silkscreen still says "ROUTED ENGINEERING PROTOTYPE / DO NOT FABRICATE" — that text has earned its place.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flfvflkty8r28sccwyspk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flfvflkty8r28sccwyspk.png" alt="Bottom side of the fully routed board" width="800" height="802"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Bottom side, with the power stages and the back of the ATX connector.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it took to finish routing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High-speed differential sections were reworked segment by segment&lt;/strong&gt;: length-error cancellation across the AC-coupling capacitors, layer usage, and via depth differences were corrected. On D5, both capacitors moved to the B side and the clock termination was repositioned. The loop also verified that no existing signal's reference GND plane gained new splits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Power monitor window adjusted&lt;/strong&gt;: R119 went 150 Ω → 200 Ω and R272 9.31 kΩ → 9.42 kΩ, synced across schematic, PCB, BOM and part data. A pin type on U300.A8 was corrected to match the actual output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The verification scripts themselves got fixed&lt;/strong&gt;: a stale dependency on old power summaries and an absolute/relative path mismatch in file collation. The checker now verifies that the board, the part data and the stored analysis results actually agree with each other.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Simulations: the static picture holds, the dynamic picture advanced
&lt;/h2&gt;

&lt;p&gt;Re-run on the adopted board:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;384 passive SPICE conditions across the 6 base power rails&lt;/li&gt;
&lt;li&gt;Voltage drop including 357 shared-GND points&lt;/li&gt;
&lt;li&gt;68 control/sense paths, 16 power sections, 48 capacitor paths&lt;/li&gt;
&lt;li&gt;32,768 PG/UV analysis conditions — the tightest power-good re-engagement margin across the 4 branches is about &lt;strong&gt;5.345 mV&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of that holds &lt;strong&gt;within the declared static conditions&lt;/strong&gt;. And the part that was stuck last time moved: with the original ADI/Nexperia vendor models, 4 power branches × (startup, output short circuit, normal input loss) = &lt;strong&gt;12 cases, all numerically completed to 300 ms&lt;/strong&gt;, passing limited terminal-voltage and MOSFET-voltage checks against the saved waveforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  The catch: −1.35 V that nobody has explained away
&lt;/h2&gt;

&lt;p&gt;A separate internal-fault diagnosis puts a 1 mΩ short on the upstream BUCK side. On the latest board, the saved waveforms still show:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;LTC4229 pin&lt;/th&gt;
&lt;th&gt;Minimum in saved waveform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IN&lt;/td&gt;
&lt;td&gt;≈ −1.338 V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DSRC&lt;/td&gt;
&lt;td&gt;≈ −1.353 V&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The check floor is −0.3 V. Added-capacitor and snubber proposals did &lt;strong&gt;not&lt;/strong&gt; fix it, so they were not adopted into the board. Two honest caveats cut in opposite directions: this is a partial model with assumed parasitics and supply response, so it does &lt;strong&gt;not&lt;/strong&gt; prove the real board would be damaged — but "the model might be wrong" is not a passing grade either. Until this is resolved, the design does not get called complete, problem-free, or manufacturable, and the Gerber/drill/assembly outputs stay unreleased.&lt;/p&gt;

&lt;p&gt;Still open after that: fault tolerance, the full power control loop, high-speed SI, thermal/EMI, simultaneous real-world I/O, and case/assembly/manufacturing checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions for you
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;When a partial SPICE model shows a below-absolute-maximum pin voltage that layout tweaks won't move, where do you look first — the model's assumed parasitics, or the circuit?&lt;/li&gt;
&lt;li&gt;Would you fabricate a board whose own verification suite refuses to say "pass"?&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Series: Part 1 covered the spec (DisplayPort + HDMI, 2× USB-A, 2× USB-C, a PCIe switch feeding 2 slots + 2 M.2, ATX 24-pin power) and the first 486 power-analysis conditions. The Japanese edition of Part 1 is on &lt;a href="https://qiita.com/tomoya-creater/items/b5b88a2d2e23ead4d5a7" rel="noopener noreferrer"&gt;Qiita&lt;/a&gt;. Part 2 in Japanese is on &lt;a href="https://qiita.com/tomoya-creater/items/346dee8c320c487020e9" rel="noopener noreferrer"&gt;Qiita&lt;/a&gt; too.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>raspberrypi</category>
      <category>ai</category>
      <category>hardware</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>I Let an AI Agent Design My Raspberry Pi CM4 Board — 486 Checks Later, Here's the Scoreboard</title>
      <dc:creator>千田　智也</dc:creator>
      <pubDate>Sat, 24 Oct 2026 16:07:46 +0000</pubDate>
      <link>https://dev.to/tomoyacreater/i-let-an-ai-agent-design-my-raspberry-pi-cm4-board-486-checks-later-heres-the-scoreboard-3094</link>
      <guid>https://dev.to/tomoyacreater/i-let-an-ai-agent-design-my-raspberry-pi-cm4-board-486-checks-later-heres-the-scoreboard-3094</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; For two days, an AI coding agent (Codex) has been designing a Mini-ITX I/O board for the Raspberry Pi CM4 by driving KiCad from the command line in an inspect → fix loop. ERC is clean, the 5V rail passed 486 analysis conditions, routing has started — and the power design is fighting back. This is build log #1.&lt;/p&gt;




&lt;p&gt;I'm building a carrier board for the Raspberry Pi Compute Module 4. Or, more accurately: I'm &lt;em&gt;watching&lt;/em&gt; one get built.&lt;/p&gt;

&lt;p&gt;The designer is an AI agent working through &lt;code&gt;kicad-cli&lt;/code&gt; and scripted checks — running ERC/DRC, comparing schematic and PCB nets, doing DC analysis on the power rails, fixing what the checks flag, and re-running. My job is reading its inspection reports and looking at renders. It feels less like prompting a chatbot and more like supervising a very fast, very literal junior engineer who never sleeps and documents everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  The spec is a bit unhinged
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mini-ITX form factor, &lt;strong&gt;ATX 24-pin&lt;/strong&gt; power&lt;/li&gt;
&lt;li&gt;DisplayPort ×1, HDMI ×1&lt;/li&gt;
&lt;li&gt;USB-A ×2, USB-C ×2&lt;/li&gt;
&lt;li&gt;A PCIe switch feeding &lt;strong&gt;PCIe slots ×2 + M.2 ×2&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you know the CM4, you see the problem immediately: the module exposes &lt;strong&gt;one&lt;/strong&gt; PCIe Gen2 x1 lane, and DisplayPort isn't native to it. Cramming this into Mini-ITX, with ATX soft-power handling on top, is exactly the kind of dense, constraint-heavy problem I wanted to throw at the loop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffq1bqkoodzquboe5n1hf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffq1bqkoodzquboe5n1hf.png" alt="The current board layout: CM4 area on the left, two M.2 slots in the middle, ATX 24-pin on the right edge — still stamped UNROUTED ENGINEERING DRAFT" width="800" height="798"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The loop's toolbox
&lt;/h2&gt;

&lt;p&gt;Everything goes through the CLI and scripts, roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kicad-cli sch erc board.kicad_sch            &lt;span class="c"&gt;# electrical rule check&lt;/span&gt;
kicad-cli pcb drc board.kicad_pcb            &lt;span class="c"&gt;# design rule check&lt;/span&gt;
&lt;span class="c"&gt;# + custom scripts: net consistency, power DC analysis across tolerances&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No GUI, no mouse. Just checks, fixes, and re-checks — hundreds of iterations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The scoreboard after 2 days
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Schematic ERC: 0 errors&lt;/strong&gt;, 3 warnings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schematic ↔ PCB net mismatches: 0&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CM4 5V rail DC analysis: 486 conditions&lt;/strong&gt; (reference/resistor tolerance, temperature coefficient, input bias) → output range &lt;strong&gt;4.909–5.092 V&lt;/strong&gt;. Inside the CM4's 5V ±5% requirement, with ~0.16 V of margin on the low side&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Startup analysis with the manufacturer's power model: timed out twice.&lt;/strong&gt; Still undetermined, and the loop says so plainly. I trust a tool more when it admits what it hasn't proven&lt;/li&gt;
&lt;li&gt;At placement stage: &lt;strong&gt;1,464 unrouted segments, 244 DRC errors.&lt;/strong&gt; Routing has now started, so those numbers are finally moving&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  An 8mm × 10mm drama
&lt;/h2&gt;

&lt;p&gt;The moment that made me start this log is a clearance check in the power section. On the front copper, a signal trace (D4 TX N) has to pass the &lt;em&gt;projection&lt;/em&gt; of the back-side MOSFET's drain pad — Q901, sitting next to the R900 current shunt. The drain is a high-current power net, so the loop projects the back-side pad onto the front view and routes the signal around it, checking clearance point by point.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyke64m7lpelb3r8bpbnd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyke64m7lpelb3r8bpbnd.png" alt="Clearance check close-up: the D4 TX N trace (green) routed around the projected drain pad of the back-side MOSFET Q901 (cyan)" width="800" height="846"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unglamorous, invisible work. Also the work that decides whether a board works at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it's losing (for now)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IR drop.&lt;/strong&gt; Under load, the power rails sag more than they should. The loop has started flagging it on its own&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The 1.1 V rail&lt;/strong&gt; still drops too much&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Power sequencing for the expansion cards&lt;/strong&gt; is unfinished — a board that boots the CM4 but browns out a PCIe card is a paperweight&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MOSFET selection for the power stage is still open.&lt;/strong&gt; Those FETs set the Rds(on) losses, so the choice feeds straight back into the IR-drop problem. The loop is researching candidates right now&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The silkscreen on the current layout literally reads "UNROUTED ENGINEERING DRAFT / DO NOT FABRICATE". Accurate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions for people who've done this
&lt;/h2&gt;

&lt;p&gt;If you've designed CM4 carrier boards:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How did you handle power sequencing for downstream PCIe devices?&lt;/li&gt;
&lt;li&gt;What MOSFETs did you land on for the input power stage?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Genuinely collecting answers — the loop and I are still deciding, and I'd rather learn from your scars than earn my own.&lt;/p&gt;

&lt;p&gt;Part 2 when routing finishes (or when the startup analysis finally completes instead of timing out — whichever comes first).&lt;/p&gt;

</description>
      <category>raspberrypi</category>
      <category>ai</category>
      <category>hardware</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
