app
AI Flow: Reverse Engineering
Public Made by Adomby adom
Photos of a PCB to a tagged KiCad copy: parts placed, copper and nets with their evidence, a schematic, a measured confidence score, bench tests and a video of the run.
main
Caleb
Add the page README, the run and process video sub-pages, and captions
64663a4
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
WEBVTT
00:00:01.952 --> 00:00:05.849
It starts with four photos of a motor driver board, and one request.
00:00:05.869 --> 00:00:10.135
Find the parts, the functional blocks, the pours and the routing.
00:00:10.155 --> 00:00:11.794
Copy everything you can see.
00:00:11.814 --> 00:00:15.780
Then work out what you can't, pick a layer count, and say how sure you are.
00:00:16.361 --> 00:00:21.041
The first attempt reused the existing AI Flow program, and Caleb called that
00:00:21.061 --> 00:00:21.288
out.
00:00:21.308 --> 00:00:25.908
So this became its own Rust program, with its own copper reader and its own
00:00:25.928 --> 00:00:26.339
router.
00:00:26.359 --> 00:00:29.894
The program does the measuring. The AI does the naming.
00:00:29.914 --> 00:00:33.128
Eleven steps, and each one records what it produced.
00:00:33.690 --> 00:00:35.968
Two photos of the top, two of the bottom.
00:00:35.988 --> 00:00:39.805
The program finds the board edge in each one and straightens it.
00:00:39.825 --> 00:00:44.512
Then it turns the bottom over to line up with the top. 38 holes agree, 2
00:00:44.532 --> 00:00:44.904
don't.
00:00:45.482 --> 00:00:51.031
Scale comes from the board itself. The header rows have known pitches, 2 mm
00:00:51.051 --> 00:00:51.923
and 2.54 mm.
00:00:51.943 --> 00:00:55.113
That gives 46.6 pixels per millimeter.
00:00:55.133 --> 00:00:59.787
The driver chip's 6 mm body settles which pitch standard the rows are.
00:01:00.360 --> 00:01:02.841
Then the parts, 137 of them.
00:01:02.861 --> 00:01:06.374
103 are placed by their own pads on the photo.
00:01:06.394 --> 00:01:12.507
Markings get read where they're legible, like this TI DRV8323S.
00:01:12.527 --> 00:01:16.699
Where they aren't, the program says so. 91 parts still need a test.
00:01:17.284 --> 00:01:20.918
Silkscreen and circuit role sort them into 11 blocks.
00:01:20.938 --> 00:01:26.152
Power entry, the three-phase power stage, bridge sensing, the logic supply.
00:01:26.172 --> 00:01:31.719
The gate driver, the microcontroller, CAN, AUX, the fan, motor temperature and
00:01:31.739 --> 00:01:33.074
the mounting holes.
00:01:33.658 --> 00:01:38.749
Then came the real miss. The first copy had 58 pours, all on the bottom, and
00:01:38.769 --> 00:01:40.026
not a single track.
00:01:40.046 --> 00:01:44.773
Caleb looked at it and said fill and via recognition was completely lacking.
00:01:44.793 --> 00:01:45.676
That was correct.
00:01:46.249 --> 00:01:50.301
So the reader was rewritten. Under solder mask, copper looks a little lighter
00:01:50.321 --> 00:01:53.209
than bare laminate, compared with its own neighborhood.
00:01:53.229 --> 00:01:56.060
Thin dark lines mark the gaps between copper.
00:01:56.080 --> 00:02:02.294
Follow those gaps and the board falls apart into islands. 1,444 of them.
00:02:02.314 --> 00:02:07.370
That became 116 pours and 314 tracks, on both faces.
00:02:07.949 --> 00:02:13.882
Vias are next. 2,681 candidates, and 1,028 kept.
00:02:13.902 --> 00:02:18.031
They're tented on the top, so only 45 show on both faces.
00:02:18.051 --> 00:02:22.994
Zoom in and the misses show. Up to a third land on something pale, mostly
00:02:23.014 --> 00:02:24.965
silkscreen letters and lines.
00:02:24.985 --> 00:02:29.825
And the 3 read as leading only inward look like ordinary domes in a stitching
00:02:29.845 --> 00:02:32.477
field. So that's no proof of inner layers.
00:02:33.050 --> 00:02:37.964
All of that goes straight into a KiCad board, as photographed, before anything
00:02:37.984 --> 00:02:38.659
is guessed.
00:02:38.679 --> 00:02:41.979
Here's the copy laid over the top photo, and over the bottom.
00:02:42.550 --> 00:02:48.074
Now for what nobody can see. Datasheets and the circuit fill in the rest of
00:02:48.094 --> 00:02:51.252
the nets. 77 nets, 249 connections to make.
00:02:51.272 --> 00:02:56.221
99 pins disagree with the copper they seem to touch. Those get reported, not
00:02:56.241 --> 00:02:57.136
quietly fixed.
00:02:57.726 --> 00:03:02.040
Then the router. It's written for this job, and it uses every inner layer.
00:03:02.060 --> 00:03:06.974
When photographed pours were hard walls, 235 connections stayed open.
00:03:06.994 --> 00:03:11.990
Real vias pass through pours, so seen copper became expensive to cross instead
00:03:12.010 --> 00:03:12.826
of forbidden.
00:03:12.846 --> 00:03:17.587
17 recorded runs later, 6 and 8 layers are down to about 30.
00:03:18.157 --> 00:03:21.244
The layer count comes from how hard that is.
00:03:21.264 --> 00:03:27.699
4 layers: 54 open, and 327 mm cut through copper the photos show.
00:03:27.719 --> 00:03:30.646
6 layers: 34 open, 24 mm.
00:03:30.666 --> 00:03:37.037
8 layers: 29 open, 30 mm. That's no real gain, since runs vary by about a
00:03:37.057 --> 00:03:37.737
quarter.
00:03:37.757 --> 00:03:42.411
So the proposal is 6. It's a measure of difficulty. Nobody has seen inside
00:03:42.431 --> 00:03:43.105
this board.
00:03:43.693 --> 00:03:48.776
The rules were set from the start: KiCad's defaults, 0.2 mm track and
00:03:48.796 --> 00:03:49.516
clearance.
00:03:49.536 --> 00:03:53.723
Most of what's left open is fan-out at the two QFN chips.
00:03:53.743 --> 00:04:00.570
The same copy at JLC-style rules, 0.127 mm, leaves just 2 open at 6 layers.
00:04:00.590 --> 00:04:05.024
So that's mostly a rules limit. That run has no valid design rule check yet.
00:04:05.592 --> 00:04:10.631
Then it reviews itself, in a loop. 4 passes, and the last one changes nothing.
00:04:10.651 --> 00:04:15.930
Blocks and placement come out high. Identity, values, copper, vias and layers,
00:04:15.950 --> 00:04:16.406
medium.
00:04:16.426 --> 00:04:18.593
Connectivity is low, and it says why.
00:04:18.613 --> 00:04:23.647
Everything still unknown gets a test. 119 of them.
00:04:24.218 --> 00:04:25.731
So this is not a finished board.
00:04:25.751 --> 00:04:31.262
34 connections stay open. KiCad counts 76 missing, because some seen copper
00:04:31.282 --> 00:04:33.105
isn't joined in the copy.
00:04:33.125 --> 00:04:37.466
The rails at the upper left of the bottom are largely missing, and signal
00:04:37.486 --> 00:04:39.139
bundles mostly read as gaps.
00:04:39.159 --> 00:04:43.115
And the inner copper is one way to connect it, not what's actually inside.
00:04:43.682 --> 00:04:48.729
Every stage is saved in the flow window. 110 recorded steps you can replay.
00:04:49.308 --> 00:04:54.732
From the first prompt to the report took about 6.5 hours of AI time, with idle
00:04:54.752 --> 00:04:56.756
gaps over 15 minutes cut out.
00:04:56.776 --> 00:05:05.483
914,981 output tokens, and 272 million cache reads, across 463 model calls.
00:05:05.503 --> 00:05:10.357
Next up: real measurements on this board, and a second board, before any of it
00:05:10.377 --> 00:05:11.107
goes public.