From b79e7087dd46bebbff9b64fcf135014673f8b676 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 10 Nov 2025 20:46:33 +0000 Subject: [PATCH] feat: Add comprehensive documentation to all modules This commit adds comprehensive docstrings to all Python modules in the repository, following Google-style conventions. It also updates the main README.md with a detailed developer guide. Key changes: - Added docstrings to all public functions, methods, and classes in the core modules and the `agent/` directory. - Updated the main `README.md` to include a "Developer Guide" section covering the project's purpose, setup, and usage. - Documented all test files to clarify their purpose. --- README.md | 41 +++ __pycache__/automated_routing.cpython-312.pyc | Bin 46162 -> 0 bytes __pycache__/automated_routing.cpython-313.pyc | Bin 46304 -> 0 bytes __pycache__/automated_routing.cpython-39.pyc | Bin 26017 -> 0 bytes .../component_placement.cpython-312.pyc | Bin 44156 -> 0 bytes .../component_placement.cpython-313.pyc | Bin 45538 -> 0 bytes .../component_placement.cpython-39.pyc | Bin 25142 -> 0 bytes .../design_preparation.cpython-312.pyc | Bin 25851 -> 0 bytes .../design_preparation.cpython-313.pyc | Bin 25810 -> 0 bytes __pycache__/design_preparation.cpython-39.pyc | Bin 16630 -> 0 bytes __pycache__/design_validation.cpython-312.pyc | Bin 46911 -> 0 bytes __pycache__/design_validation.cpython-313.pyc | Bin 47107 -> 0 bytes __pycache__/design_validation.cpython-39.pyc | Bin 29153 -> 0 bytes .../elite_pcb_designer.cpython-312.pyc | Bin 26718 -> 0 bytes .../elite_pcb_designer.cpython-313.pyc | Bin 27282 -> 0 bytes __pycache__/elite_pcb_designer.cpython-39.pyc | Bin 15174 -> 0 bytes .../freerouting_config.cpython-313.pyc | Bin 13866 -> 0 bytes .../ipc_standards_library.cpython-312.pyc | Bin 33107 -> 0 bytes .../test_elite_pcb_designer.cpython-312.pyc | Bin 24105 -> 0 bytes .../test_ipc_standards.cpython-312.pyc | Bin 31615 -> 0 bytes agent/dfm/checker.py | 11 + agent/drivers/kicad_cli.py | 1 - agent/orchestrator/run.py | 8 +- agent/routing/freerouting.py | 1 - automated_routing.py | 274 ++++++++++++++---- component_placement.py | 214 ++++++++++---- design_preparation.py | 101 ++++--- design_validation.py | 269 ++++++++++++----- elite_pcb_designer.py | 118 +++++++- .../k1_motherboard_revA.cpython-312.pyc | Bin 15159 -> 0 bytes .../__pycache__/server.cpython-312.pyc | Bin 14293 -> 0 bytes test_automated_routing.py | 94 +++--- test_component_placement.py | 118 ++++---- test_design_preparation.py | 11 +- test_design_validation.py | 76 ++--- test_elite_pcb_designer.py | 72 ++--- test_ipc_standards.py | 116 ++++---- .../thermal_power_analyzer.cpython-312.pyc | Bin 9780 -> 0 bytes .../placement_optimizer.cpython-312.pyc | Bin 15702 -> 0 bytes .../__pycache__/dfm_validator.cpython-312.pyc | Bin 11339 -> 0 bytes .../core/__pycache__/__init__.cpython-312.pyc | Bin 1005 -> 0 bytes .../footprint_hunter.cpython-312.pyc | Bin 14834 -> 0 bytes .../footprint_scraper.cpython-312.pyc | Bin 12881 -> 0 bytes .../netlist_parser.cpython-312.pyc | Bin 11291 -> 0 bytes .../__pycache__/pcb_updater.cpython-312.pyc | Bin 12263 -> 0 bytes 45 files changed, 1053 insertions(+), 472 deletions(-) delete mode 100644 __pycache__/automated_routing.cpython-312.pyc delete mode 100644 __pycache__/automated_routing.cpython-313.pyc delete mode 100644 __pycache__/automated_routing.cpython-39.pyc delete mode 100644 __pycache__/component_placement.cpython-312.pyc delete mode 100644 __pycache__/component_placement.cpython-313.pyc delete mode 100644 __pycache__/component_placement.cpython-39.pyc delete mode 100644 __pycache__/design_preparation.cpython-312.pyc delete mode 100644 __pycache__/design_preparation.cpython-313.pyc delete mode 100644 __pycache__/design_preparation.cpython-39.pyc delete mode 100644 __pycache__/design_validation.cpython-312.pyc delete mode 100644 __pycache__/design_validation.cpython-313.pyc delete mode 100644 __pycache__/design_validation.cpython-39.pyc delete mode 100644 __pycache__/elite_pcb_designer.cpython-312.pyc delete mode 100644 __pycache__/elite_pcb_designer.cpython-313.pyc delete mode 100644 __pycache__/elite_pcb_designer.cpython-39.pyc delete mode 100644 __pycache__/freerouting_config.cpython-313.pyc delete mode 100644 __pycache__/ipc_standards_library.cpython-312.pyc delete mode 100644 __pycache__/test_elite_pcb_designer.cpython-312.pyc delete mode 100644 __pycache__/test_ipc_standards.cpython-312.pyc delete mode 100644 hardware/k1-lightwave/skidl/__pycache__/k1_motherboard_revA.cpython-312.pyc delete mode 100644 mcp/mcp-rag/__pycache__/server.cpython-312.pyc delete mode 100644 tools/elite-pcb-designer/analysis/__pycache__/thermal_power_analyzer.cpython-312.pyc delete mode 100644 tools/elite-pcb-designer/optimizers/__pycache__/placement_optimizer.cpython-312.pyc delete mode 100644 tools/elite-pcb-designer/validators/__pycache__/dfm_validator.cpython-312.pyc delete mode 100644 tools/kicad-footprint-hunter/core/__pycache__/__init__.cpython-312.pyc delete mode 100644 tools/kicad-footprint-hunter/core/__pycache__/footprint_hunter.cpython-312.pyc delete mode 100644 tools/kicad-footprint-hunter/core/__pycache__/footprint_scraper.cpython-312.pyc delete mode 100644 tools/kicad-footprint-hunter/core/__pycache__/netlist_parser.cpython-312.pyc delete mode 100644 tools/kicad-footprint-hunter/core/__pycache__/pcb_updater.cpython-312.pyc diff --git a/README.md b/README.md index 005c488..96c21ca 100644 --- a/README.md +++ b/README.md @@ -341,6 +341,47 @@ See **SETUP_CREDENTIALS.md** for API credential issues. --- +## Developer Guide + +This section provides instructions for setting up a development environment, running tests, and understanding the project's internal structure. + +### Development Environment Setup + +1. **Clone the repository:** + ```bash + git clone https://github.com/your-repo/K1_Lightwave.git + cd K1_Lightwave + ``` + +2. **Create a virtual environment:** + ```bash + python3 -m venv .venv + source .venv/bin/activate + ``` + +3. **Install dependencies:** + ```bash + pip install -r requirements.txt + ``` + +### Running Tests + +To run the test suite, use the following command: +```bash +python3 -m unittest discover -s tests +``` + +### Project Structure Overview + +- `elite_pcb_designer.py`: The main entry point and orchestrator for the PCB design process. +- `design_preparation.py`: Handles the initial loading and preparation of the design files. +- `component_placement.py`: Manages the intelligent placement of components. +- `automated_routing.py`: Orchestrates the automated routing process. +- `design_validation.py`: Performs final validation and generates manufacturing files. +- `tests/`: Contains the unit tests for the project. + +--- + ## License & Credits K1 Lightwave design pipeline. Built with KiCad, Python, Claude AI, and open-source EDA tools. diff --git a/__pycache__/automated_routing.cpython-312.pyc b/__pycache__/automated_routing.cpython-312.pyc deleted file mode 100644 index 2ffd906e451c407a0c3e383dae636f116b994745..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46162 zcmd_Td3+q#eJ9wBu0GJ+KsV61&jJCEXc89zo**d@#6f~MNC6-v!IC;4stE$Zb>9ne($d{GORjWH?Dtj?q~m8r~5m)Q7)q# zc_^mobXRqPZdfPig|tciu%7*<4X3eR!?1zE?^H4YouuW8tXU&Ew%$}()xQ(bN{ zeabp)ow5zv*u8PmK9w?p9>2+f|!TeSIaE>>p zL-$IzPB)zE)lY0!IvM|+sEfyym^b%*y%hK9-zxX!degLOzOF}Zy>{M2gVI*~SJ0zf zj0s(O-CI4JE=_k-Cs^Lp3F%(f`vxgzxPYZvk!njwE%aJhx*h2mN-OV6RdmBea&9Ja z9qV$7)n#1KRtpI6-Y8ubdijY>U zrd6=C5~P)?X2J$Y`#=jEGQ`1YBp*-0-N7v-nUj?a20$EUsg__W_UCXTSKjEdv_@zIe%%GW3(Tg@_rfYfsIj=Z{HeMee;b$jDM!i#b zgIepzw7}2K`24Ikz4z-Qlj8!bQ*X8Q?BsjL$IkiBkG$^XeY4)t@w4Nj{5W-*sMX})G(8{ga6 z;n{uKUCUDsl+I0!OplDQrtxrmlXEj-%f`dsfe+TgH#IixuG`sI*R;!e+AI3deha^| zzOlZMuQ@5s2y>(CkptdIF9zLhy-)L^->r{vCrA9}+-b3NyzR*7g zjO!R5^~bngbUJ1nn#1eHEGK5Ep^?d$p>2Ae>UU1hO}Pz$=Nj5(XD9J}DBIW2Gu}QT zNMZfR>}*5(48G*F-`6mBZbbA7gLAX9Goru2hmVQ|r^f7CCc+foH9qO}z08__nU#K-m3~=mX*6NR17t|oLo5uyRj&^4R7bEBa5N1t)ByO& z0d^XP&4OvzBAAEM=PmB^n7QBUADW-_1`f2-kkI#*zVggjntne1%)BxM`B`y%22*pM zeL~Uu*|~9%eLD;!`{*(2IZPf8=8ac~*@f}5XT2hZVjN>=9>uVTGm|kBEhr?I#xQ-S zg?_g+X7PBYN2a_UPt5A^OyLVoQrzzGe0FYRQqD1ZJi^QgpWm>>uiG>y4S)PxKEBoal|22D^{;Bf)fZ;KZr^jvKm%G(w*|-*C!@ zY12Tn+b@pz=BGc~@WPDvnr{|s#M7rv$cDk0vsefCNIg62@v#IJr-jGhhDTn(^|SM0 z2HIsoEh4^31aIno%5_HVu8W<~tkR3eqppgJz0u74i$|jwxfi<-e7;L8S88d0$0}q$ z`8&>=-IiE}3>F5lK<9jc66u%67nD26&j3J3^EGCk^-c?zhcVmuv}cy)nine}eN=`_ zLdzGQ&<4W>FXuH1X$O(*H6dnTF*9PE8Z)XflNvKq zOaO)9P4}7$skTu_m(#2XX;wMSmXKy+Y4%~eHv_dYRRBtL) zs60 z1H9xFSbP2vaSZ)O8!_kP$h=qd0NwxrjR392OrqC6Cr*zlAQFQL+DfORiSv+0a86|%lFJ4-_<_|e4gO*A*<$tY?7qly%E2Z<| zb9f{=zY9NNEA=6v=LugGy)W13ef+b}O`W3J1Rdlzh&cF=gJ0eia%>A)wy}3`=V-zZ z1HMtr;qi=2PtQoyh0o(*pcJ@ya%RLY?xyagQ$SEc+)Kee1TpT+%*>>?pYB^II6#RO z05pI)|Gd~nY3&rGK%II@qkz5h_YnDA-QRNCqnTM>=!<6Nu5!6iN6spj6U}se;Y8F` zu*wxgv-4NE{AjiNV&CO`*E+AXu5#|^&fP(-^xB0Lw{e0HOq4Db;l}K zA1$j4a=DlNt6XKYaaWKlxpr=O?)uCsw<}uP7~~4B)hzG6-muCwMz?McayggJUGrU; zTIIIiGiI!%r5UTPRe!9*&qIUGl*tm-EOM;onwPR_Sk?oSt&zYYz0oNC)Qe^}T@R-b zJO(ThfMj5i$OA8dMg|axNB}4@3Jer_t%AkN0SKihfE$~dYE4MB&)eMgnDg}bND|D^ z1VKr(Y0M^!gABmJBFJG8#PP{VikbcAfX2qo#Vjc9A;8oX%ajR7j|l47dsZYs`RvQ& zMq0nJ8hX&sy44Wx7#2fG>YLT8-JYAGFCeewdk$B`Q66%XFIR;eTZ5LZzvfyNpGVtR zuf1A5lt&BQD_q|_Hjr~uW7M}S1Q&Ja+d3%I@6OO#qGA_4uakm)3OXn_LBUZ9j!`f` z!4L&0YmHblk%G_Q&-Wq%X{}}Dt#WzN0?R4Acx-8Ol`D-F^B4OscdT+eTLgOJwri(8 z*5OB91c(7V(sIyC>jOXXB0x-91oSBFMG!#FW)=aX7bMz%=!Few1Fr?S7KXFahk>zi zC(#17VXN1s(hPPgfd!Efv$iuXZ5T{ipj?VGj;#T_8TdA$MpfE7#u3#kl8_)~Wax|l zn?!pvcpbA(fp}9;GW#4cqi+U`TrB-8TQ)O-w?F1Q$Iz~dGpF2k%}>m}DShIY0r*n- z;_U0bj5P5T3K#@V`MRemgMvx?`KS^4y6&ho;|tvqIJISd;kXo&AgC1PFqoQKa;l0t<#$xX?G-8FjH0DXmL+brL?zEn4M@qM2o@Tv^mrc=71cV3;eEz7RE{{e|u! z=PAFC)>@-9_JttL0V=v_Q6xERh1nCS@^vLLum+V9Y+bG^k(p3}QS4raU}to8MglT( zveYafzRZNw?0JXVsd8NdUfGH7c+T9aYpn#20ae5Z?zHm%cN}j`84Fql1UU-FYQ_Z8#pI}OgMA>B<9uqN2Shv z0Wo))IE5dPz{WaUn=3P-kga$?$LC?T1Xpl27YxoCO8yJxoFrf=tYN~ z_zF`>CT;~il_0)C8Xh+%zJ_FpA>K~0Sqf5#as_8CB7Q~;PE z(A|?H*%K+-OhE?)J_`I49HZa@1q_1_m`Q~}6O=~5Kf|Bz8Ulhr)lqxlDpwfIV#K$T zh;J#HSG>v6YpLV1>r(eB*UU%? zgRy0K?qeN(WRe20HLFZg4C=4t5VU#qqJ><(sm(3$P^qYZ97pqGqDd+e0@)Z ztarF!3+qod>SSxwLF?2X!F4m|efsjaSoz$iET8w3r2vT3I%uv8|zac z>J+3@z%7jst5<}u_-4ubMAqP9bxNPEj!^ba+HeM|S&o_|QcH>9`W~{<{8N>#KAVQ>wvS2BlW2Zl%y#<7sX-5PDNvK#C(3MW;C9*X{-@_3 zwce-U8v7U5>H2Z2+r&5nu@Q;lP70{7*h~Qlb3WmAG@ow1??6;;A=(-2c-oqd+^;~2+x+-W zFhNbsPSyHO40cmJ`L28Lgy%?88^rU-Yahe|zeta{M8WS-@FfJFm}ne2b_~hAyVnXK zH1R_lzBLmHN#Y<96v++Lf!277s{KBKn7O;D-80zHCP&(PV-{$vJV)Ald!$(JKzmQj zL}`N^Zln0mspi`hT&Ca(1%H5GteIVZ*D6O=Tg5&kyA5Iw73rmbm}NQp&s#}`!L)H* zc-`bO67y!l(0h8D0;cZio%QW=_em5d64UIqh%Zo_y*n|`;!70JcNU3ulUQ-$iDGu9 z8S&uTdwQFxr6y{L2$h&k%G!MzIro9Hbg{HkJLRF>fB3$W8lqc#)e(xHp@2}HC{W;~ z;4B5_5TI_eT(|o$Zkptqs>AE)OnMgmJ^TfNtGaRBqJBX?L2s9GX;YXA#ScPiqgpbg zNo;NtwPgJJl(l52wNWh)boxO3QRr+(CMThZjVp0|Pb{1=ro%ML2q)#LCEtXQSOaXymv6zDQC@7-fs}vC86~9KoaRdM| zLv8&XZ37*i)7@<`+t9Jjfxfn0x?!SFxgNzf7*%Jy4f=wqqDCCgm zW(1MuiA3T4D~hEs(~Fcw0d>UZ!9*to*5L;hUBUKf?v`k7$<U%m2bO8ZXhgXW5C z)5YTtj_cKaL~^%djVl=wB zdYvh2EzN8!SQb{AgN;XmJC205wtuWc3Nd6^4=7LK$7sck;!nL4X#Q{+NpZ;&vwg4& z&;f(SGkQ&0oDie#z?HpegiVCWn+{6P{3bVSMcf9du3e@7EJ)2*mkM>raOS#Hs6&Pw z>r!n}J};zh}jhRkKitfCI&BG89qKH=++SWB|GAiHa%OA{!V*HY%0+Sdd-x`Tt2)1mbQkmrf?Uvf;;CsD^u9v9&QDA}yR;-1 zeia2Kw4v4zAn))f9|MFX?#xPS^U#p?gPNf(iGPA1W~NS)&@>(RrX*>o21|K`t!OAhL?2b^=@;(**h~L z@XVlzXJ41e2KxhV-1zj_nOJ(~g;6iF;))rWBvhF}w^1;r_a@IDD?Q7@IuR&YKZD}AU#B@l z5-(6joH@PlXZFHqVR@v`9V&F+tXvU3n7J{ty8XG;!q%mZw~j~c&bNCm^+fC?A$!TS zH>B)f-E+ax*0B9>)Rq4acO3;#>82N|B}+s0(jdR*)@N^x2FqH)_5*ia1^;Euh$5f( zh%EY@w%oP?-S-R9kE9#EUr~01GyH%vBAzrWX{EARxfS6?a?A;h`6;OIfypn?OzNds zD`8e)2BlWPy=JY1XN{3jE<|MS7#8(@b;fH!AT_#i%;>abhN0h+V}{_&mwj%<@zE7&b5H1!g++6eH#EldT%NP@DBo z>2u1L)`NX>27cEHe8Mh zD^s#573U=*T2&^*R7gIx>?a4G$#1)wbJVX8MpACr1Ly8c0$wyYo|%R<`a&ensR@V!SkvyQ42p;g%)}K7ys-J_(2$2 z!FqYV1urPVs#0NYrI!p?rlxq581+gTpK8=&Pn{!JX8pxGU*=D;QKo@qRlPzB4^=fm za`C^TfH7Ljh{cSs%%1XTiM?VbSl`05QT%VIoB@Vskl-AqxEU6X(3JUNl4&xdC73`3 z7F$rW`Urp1*O8fLrhW5z*q4|1<}K^70V7Ki%6vdLK|lbUkf}@0c-wZ#7O@nBECtsJ z!j>&ji#?taEUXJ#>XVXKA(%Iml!4ZW=9ND%b1v(W`H@|hR~yOQ6UyDQWW85b6Dg|? zmDT^GtnpI+(y_~eiZB>z`R$c`E8BymyTkT9$rRN-fhwqr~_#;PO3>|$j*!5EIrB{NbuZHa&*db+P#qn9N zy!}qcU-o^!?@nuQU^rO%nXvukdv@35zL0%O#O@B+-77U=do!LQ;lGHzGGwn@KK7Bl zZY@_=zH_ZWS6Z`VzHA9u3X=vTSiI|7gSYeVl!o@7SlxXxxa;{~;Xv3j7Rh0vAvH4Oc%);Wpt)N_NJgS4eiXt6KcH` zduDV-W|r(ydZ_eS6P>-Oq7(_8L9ED+PR@+J#uN~=5kg@oC0H%lC<-|Xy;D4atFDUpSf={w}evnxUD?MxB|DNQXe{*B5 z4nG@Uq1hQ&Gu2_E42vj8DHREk1b`tS>X*!2$FYzt6$`zG;^L1e*hv9Xz3ipfk0~JB zBmNZv8TW{Pjd;xBn;nm19r52GEfwixNeG1s%6$k_ZiICb3VnzP>+46bDYUaUY}uCt zWj97UIol(yrjV;?$#So3>$}s}r+-pb{~JR(%rtWAhmNhV%eZR0Vv}q$f|a{(36VX0 zp*?-U-Tgm06RdbX>>Rk4$UX(jd&Bnrr$8_bk3lfIzcqS$+nu^l%gNO}&j)u81Pcel zmZ1$049PKwS9%!6y!$7|O>G`TJ{!McQh?M`ag^p~s->EV;aN}O5(l0Mai*{167_ZNfjDvqlv_Izc9lsTitqIBwFJs}o^4hD zI>UYqYz%CaSeVB8rrpHE1PXylBwNcCexI60S&SXw`Chhp1!_9%SZU#Z@Xf}0swknQ zNsOl$=U-IRLET=5IxMNEgS12v>UbQknDd?49Il{(Ps9}oh5nv!#m>#*ihW_r{-?(k z$!yMnu;pM<8^Pk1^+~(JmOUw@n!}deo5nkvMF;7+@`g40hWy4;p#xR8_TfK8bnqmw z`Df1rHve&jYya=@8+yUUkiipp008o5;T*mPWMBt4XZs4D0vTlb6FCRg!^a>4M_}B_ zL?Q?zWB}s>#xuYGK>>BYQ52A`pa49mfgU2W2yx)A#Tke}f~g@2Qebl_(imB8OwAyki zxc_vp@P)AD#W)o&eiL8Souz4P(m@}b^a$dgB7lvYq=fu8lya1U|DFO;Xo{o}6aR*S zRSJGW!A~hjF$wwClt#fH61KgF2$_WJf536ZvgPJA9e!?EZs&im>^o(l#$ylZe$Ae4 zEWFn7P=}wjyb5Ffa@DeLrG5Frd-V@>xLxbgQ{t`_!^+@_<-O;WL_RqYw`(2xa%28A z|8o0^Yx&sqHy-J5E9uOsOQZNxFGa=okaS_mI`ed>FrmbBs+x1QA6YO$hc3miGvhJZ zbodrv+H~yMkTwiLn=ZvkFK$EJ4$XRos#zz!c&3nr-4_m4juSFa-znF@zKh{3#ItE% zv|7i3R2OvV*|EF?w;0`u4~?1WKxINYpWrSd?r39Xx?fU6Th3$qzem7cW5-$e*r1gN zNw{YM8+}LwJxcOn<>C-wd>{-KFlzkqN;IYcgh4Jjzrb@D}4hm zr0QMbY0&N&ZgPq{7iga$Ch3Q!e{Osd+nnTaAA)HcwmgyJ2$;8dFJQNUXXZ7i1L(!2 z4`!0G#h+8k|4ad`U-7@8Acq2`1GWghX%BY8!Ig&(`^;I)IQ1I7vm%^fO5=DVR4YX; zBN8kKlqbxkggK@f6&xmT{U%CY)IG}76_=}K1wY;1^bU9J#dk7qbKi4(#}V1rAKKR+ zeE!AIz88a^5kmU}SQljcbl=f;{L3f8<-2|~w8VuiB^wwc+$$)d;;_M?A1Di;WyrXc z5wR49EXB(mw{`_B#UEMrN$Y)`k%B6~=z0vrDz`X0c$Cj)REGTt6FbEDGUomUGU$=XhBM>S4GAE(9w0YRwQ+u3Q$0EQp;C#E znkD2Ww3ATI)kR)rlKT*Fr*;?42Vil9g7tjI%=u|%baED69$EssdH$T=KkI90Xc&Xr zqq#G*^(?W^Npb8(C#OTcE*LryT*3xCf?vJ_Nk9jZ87PZ!=io*{{4VZgvy_<0QG3%}yW=a| z)$}XrU$zCy8bZ#7ReNJn+U}5Z_o{u*TDq~ox@3QtsmrZc>bUE0UGDf&Ai^9)eB{`2 zciWDYj;{qSb75yyicomZEq`QhPiSvXa8GZrqA%?1|7m{lS~{8mGp{IG3!y&@7IlU# zT`D0gB|RUu48WhmdW|6=b%w~li}2GR&;>;Xs5qH61@joTW>w^jH<2%_e-$k&X+Xsq zLPr>c82?BiDO5_Rx%`iiuMS~X_~YonyXFAA}?VEsc*NHXi0w{Orw`TAzzc@RV~UBE_}Ff8QR4FYCZxRD{2R!fcrE_o)w zu+X{4y}`|AO1}w)g;{|qDRGTvZ;ks_X$#qA#o1Q z_|EcPsU>-D?b*3W^%;^nv#|5UlP3n4mCeuzxWVgeZyy?HqvtTIMz{kqARgfAL4^h^ z-P5yk{uZ7OSWe9OS@gaRICqXDKx6whSiTfvr!QchvGva@sD7JJ-efD%5iJ8fq z5)KcUF(uhe(lFBfeYw_%AO67nkT(Y;lqLRKWGHkrJtUSUoIw%fdtN&u{uxqINaX~nyJ*ZWrdAAIh{ z=OPX5p@#NgeaD@SU~PA(q#MSXeM#CzIQQW`aNKYNx9tm-?ho5rlJFwS&A5@V{JCK1 z-mrZin$OO?T7IQ`HEYY#k*GcM?c9oMy?cVD^w z%4#7c%Dz}4j!L+E3OlM{Y5#8B^}0w=ZK$YrwWvN)v?o-w=XOr0=+I?z3U1teYwY&u ztyk_;1uKq*oyVg2#rG7AYDLId5!|vb?A(ui1OM<#Z4=YxTWzmu(gso8TY9L2e}=>`;~5e_3)w$lC*xu2ut_Q(GrZ=Vj~U@jbk6IeHz9Z| zQLS+4AhqaCBwYiw8vp>!(r*(WAQ3MN9h|y?!f45sC|?z=a7T+uqvcy3WSFz9OQtn! zj7c!P3l=hqha&#n+UvD{Tz~2KQv2oHi%2R)J}yJ{@o69*u?8Qrntb~C4fYF&MX0GI-%;6fbxhQ?=_}b_ z#e*bCy@Z4{$oil`tfDn7GRm3S7No9;WUbmmY%MoqlX-d)0hhPFwgL?VYf?##w^vKr zl1geQbkvf}LBp7x?XOt>Xl;_rAvm>&#kd$EnMm4T)M=ikTte1@9%GdaMUsmMMIi@- zU+yznqvt8_h}}afnL0r`G*d1Gb}t&zb^cN%bAm+ZDc3@pkT2vf=#xfQV`eB%zFF|T zJi8aU&Gliy5CE&RXoPh;pYm|r3Wdz|%^yF-h!!mv*(esL7$0iPiO20-U<`m(oyzsS zRK|0nYJHwi!WaNz)7EEd&$iM96MKWQ#5b7F-=GD|n$$}uSH1@rfQ?uWt$MunSHKLd zNbCzr0q3V)V$Du$?Is|0OqAcdCo+Q5{v(Wq1nRNyLgfso6vg0O19pT=Eh4H zBmZ`#8e@?*5cO%cShZkI?loAX>P7P#=6Qqko4_J%4g9&4@kar7lq1?X>&u@Kxe0-G;TXJbfS)KItRJ}^+_C)EY};Do0d5&nE|PBLrN+7{Pp0` zh$`YHMqVEY6x4OlZ~e%5fBiWSTkzH4JLCsX7%c-~A>%G$>XW%{g(AkkmpEr=+J~M?4|JctE)AND!A&HW}&I)UMtnQPnUi=sV zwq7Ws708DZXOVe>Pf%Xf*VhlZxmf1t$SgeCdOaZGz)Z$CzxRS)w1Z88Q-JdVV?gIf z$Uv;+fTYfXi#o~myg(l+U{RhgK0vuSLWWd$uyc^fZWTV0uMr<2E0CjRBru_YvIGiF zW9u}t}kfg#4u7D3{AEsXG0#(N5m+~C~}_88aXyUC2qm(GhO)2*;i5mVh1fYho(>sCW)!JT1r`M>bPl=2F)qr!K$v>iCuMFTb{YJd{_zbo8DhSCVBfw|xi}USYz? z*E$nhf%eK5bbsetS$Qom{tSM5~ z5-MxCJrpWyyL>d7Q*gECN>3!GDwIh!lC2ULw|5ceF8PGV!mbicE&d| zRz4Tp+8WL|EXfWErD>wINwwwn-rMdw`+{XK%}~92JrcIJCkPs9 zu^@g})SlDh*8RAl7~x;p+Dh^B*Y2ji48#9eYN4>Ytj}WjcNQb!Nm2)*_ZSCu9O0*g z1LM%=l#B6K8tGco})1mO8d$$`pao@MG0@J-D54D zWP_3_^%s8+P@@(}Wdg3jFrgu~PIwd5PClX6o2SIn7mUfY-Mn?3IDI3^UTY567EH`)FGtM&fe!?@(F?1tfeI z{~kfiMv`{4IM{sxrzJ=OJP2w81dsSjDn%4bj2pz$C2GSgQ5*4AzeS}!VQmqy4Cff6 zD3(YJ62;0NPogmLq>d}6mB1@8+X@?~OZcXVgobwUkBQzOi>FO(Gg^<6X$$P8$cvL< z`}0IzaJkH_f+V%iEtb&V*9WnYwfsi;YW4oroR+1|^%D2~Oa1ROU-Q4acztoTxGrq3 zhs0fWyl^UPuSA97@^>4qH$;jWLq(0Zgm2G$b0)Iqcxcb@;O?Ga&&$E)S3*UvEcJjQ zk)`(sR`a)o?KMeyfnfRG+qPSa!P3sKy^9<;Je72v=<*-rwikEq)cwWI^sX(2zi27z zDmDDD)QGq?h9kQ4(}3Z~f5TVxvgr&@rZa%9=zHp=sea^AeTlrah11O&-KM~-3Xe`p zXH|Js#*&xEd7lNgAAKB|6pU*3S@rkpUN$1^${(c

O$- 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 diff --git a/__pycache__/automated_routing.cpython-313.pyc b/__pycache__/automated_routing.cpython-313.pyc deleted file mode 100644 index 062e6770c1ae88cc5c8dc578b3f636f205a32dc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46304 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 diff --git a/__pycache__/automated_routing.cpython-39.pyc b/__pycache__/automated_routing.cpython-39.pyc deleted file mode 100644 index bf8d01790018a246c55f746583a81f2d5ebe4ffc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26017 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 G@Bcq}CcHQR diff --git a/__pycache__/component_placement.cpython-313.pyc b/__pycache__/component_placement.cpython-313.pyc deleted file mode 100644 index 9867d19a090dfadbdab8943b4f3037da029a7c2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45538 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 diff --git a/__pycache__/component_placement.cpython-39.pyc b/__pycache__/component_placement.cpython-39.pyc deleted file mode 100644 index e93e844c0e54d029d60f83ef8ad47647a6855c51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25142 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≫MtN+z?WqQ4|e-NG%`QfJeSZg@CS#PgwO(9u`lF- zx@=NB{k~O{j!Ur+kyY^PmR*9S-x6*Wv@<70T>TJ*blkO%7;krhux1Ng&Nd@uTW9`+44KLQd%zBEW6MzMZ2StJVr zyjPSK0O)}21K4Yn*N_kAy-R*SW;Q}$-b)ypq|wjK!f&4E0iNgQxFE+TX<*QofB^90 z?g9>faa=V9H5k-lPzOO$9|+FRL$0I&_Hx*(=AksQ+{rvl@N-F;2RL>jsU003xtOFy z2^A`^OoceVZ}BlAv2sbnNRR`G7KldD3}w<^Mjy*cne@Qw;P^x5wY)ztm%B}=Do`*= zq2y6yNi8p~1ltF)&;qPYuU9DD$2GP{X@3kk`5g#epuS+JiX&U)JLN6w+BogHUs|~- z?36aGYhSW{+II5Qt}Ro%toc3rhgI)aVFqWyRSjwRU*u6GmAj6Hn4{rsddJZYFjImy zzifKZv`d%A=<-*uymsxCYjL{ifwk!6=U#kn*IM(jwdTH~V%Kpr<~X|J@T{M`@2uK& zx?@gv!Zz|yqju%5kM8AB7W=N5iJ6%#SKNFwVYa<|{>AgV=IWTadg~ZK_GqfAHc?ZT zsBcV^R^k5+XTn+fxs`Sr*R|g_6L~3_$N57m+|sPPT|;Ma^CTPmpTgF94>vLZWIwm$ zO*oyxs&a4He?t90-ulVLC~w*6vbS)CvL0#U<40Nb!I;;u)~u5FdCRaLm?lxA9r9M5 z&dF*}Xt{;Vc-EsVyQ($dxX2_Wos|WVp4GE-s6c|{ZuwiO5oZk9?HIn33}l z#An{PhU1k+A;)sgnu#^v!rw&J6PD*JbN)g&K;*fVg9wGytOfqdf7>bv%4?di=2p2> zCjDk@L}_;P5G^f`#sZXf7ATi%{tAgg#ljXrt(EE8q!{+)H?v}DsE|zDZ!uDP((hV| z>w|vTe-o{{O08-`xWAJJTJrdsmMvDSH?1`Czp3%NO0kYL?ep4It@wUc^(=KqbCr5l zZQ$+-` z$3p}^4>B!+&f|exU(p_q$d7zw8YY|sN@z?{#Y}&OYyC}4G9Scb*wOu7F<(*}^4|$1 z^~hZSghRGlD3jVE@(qeE1Xj5Q%uyoc5L?B}`JfTdVxcN40r9fPBQcGAoo&2ZD9y^? zzccG6>d0PZ++E1E0rsSJVF@TRE;ryd?ttoqPwEKQ!5t?s-}175i6smMha7mC=}2mC z1s9f*Mt$4CG)4nJ`dknUf_VSF$_yhaqGAfh;|HX z)66ac(5rRh5i<7T*rpRG{jS*^GrJ>oadTUu$hoJjGq`{=C@8*{e>Xp2E8e)X zu$c}4l_ zgL^j0QXn!Emz&ll+7XbY^(ocYhA)-zh}B@+O;t;8xuX!7q^{Bw0Cc4@0stKqZOW*ttC-X z_Mo(VyZ$ddf9~0?iaPr@baJ61G24-?y11p!KaYcK|D^qOJK7&fwb$RY5mmn>o6sRZE3K(Ngz zRzul8g;bNGT{$?Zuql_w9;T(fK~1%gCx?j6wJ9*mR6ISbxl4r&ic!eHD@mgO_5K!M z$iX9pRbd+WnXo?9e-O97F<(cA=|2H;W!M0rF*kmo<_eX7ihAj%TI!__w1?sOP2oJi zZw~7Lm&_#qca2hRvLoJ$R!5kf&W1f>u(xBa#>rJCvlj{?z`@uT0Dj*}4yT+E5q>39C z&RuInY}fds*BSvCQ{DLFQ`Ogxx~s3b35=LgmC%-^GuIl^D8>9un4d6MN$NA)k-t(i zjG$&31)ZDm^f6!MjUd~{2yW$&p~)QCCm9q;@A?qb57apxd=QVTZxC6Ptbf|iC&syVPY z&n9~(d2xHjYPQZ12g9LakHRg9z8pL zadLRDe`;9N_!CY~pVBdL7a%V;jRE2JkTG*x36qvIrS0B)QZ<*frg$+gs`}B8V8*#a zjWscb8|8HY8m5$I17ux+jQNsIEcLB{xlZcHLjh zGb|9%dDAl|)a+*u_htGLk(z-I2OiO$$s@W>$LYQY4(GaQPupW~{IZ~UgB5j0k)n8k zXS*O#UGt;**Xw`SxMBTLLlw4wj;DM*pSn zSFB%1R8+2y|FgR@W~{hjXT-A2J!TqDv*H^dgyX^z9_JQ|?|E}YIo&Ndh zc*E61ZS#ZH&Uc=F^ZCv55lyVTIZ@se@x{tpH^&p@%xmXgIlo)pjNt0pt*NcyNMU3+ za%{WqUF~1z|Cjvev9nR;u`e|0iptOPsEX>(UDT28JrmW`wO60PgeD4|n-!bZJxbMB z4i!Ypj_zqx1)eW78cY73k?QPQA40x3>S~FZTVZ5u6`Rk0Z1p@Ssoi=$R?;1H^gz*L zeGnA)?P;h2C*%Q6nQ*2xF!Ztd-;s;?>yyiHoqyAID z$Z^g4dHpJg|CH{+@bq9Wync3EcUGMbm zcWJ{a;5KwW$gDlPi}0OOTb2hJF5>=x6hC8}z9|M8Fc^@we`^dzz+n2dFqlzKw;#hx zf2O6Zp0T9^alDDoq`T%*vK<~N{(!nB^zfR>gP4jDqBBoi&N zR%n^&<*q|&Qq?P1klsjUW`;v=C=oVIOy|7}!=cO|STUbW-+`Q?OePc{6bO>!4+e0Y z6XE1Ow>`p5q&Nu0P=Vt?%43iRMi0FWX9+LirWK5Wb#%}>IXp4eKRA40czk+FRN?5r z+i?+eGXY>C2t7pt58fju;KeON0OlJQM3TniTw+^AvRaaAffwvniXr3$_kQAfK-Sa1 zeevfY01}&@MPdiz^w5L$?%np`So`q0_GR;n=4i1eMz=hWtTIGh`RO>eaMbhM%`Za%X= zweiiTqRpqG6{q9ozRc9`Mnc=?W3Atbw)96U2IA(yjO1ul+qQjsG1fj5Z5xhOjC^7~ z3na6&=L;KUE86JVEoz7rHSAa$qxo*2cTFA$EFK_w1{)APNiS6vqsunW#_3u#NWnO4 z%*1GBmu`sB4H12uZX^1snwYgFO4kr;Q3iFPVb%zB`5!QU-*zto1IlqrwkxHp1eau#H{b!92<-csLDAM?KK+gE_zWX@lsEi2F=9@HXqAEtPfM}sP7QBKh});npw@P8hL`3 z#z3c_&t+vwQ}dTiFPmpI^B~V&hjAx#-30moGi$vKwtQ{naBhkxxGGuWJte}EY97zT>N(WH499Y=Guql(Gzf?^$DLFJhY!M>J z>7t>K?Q`{xwV+N6T9pf{9mg8%Hn~@tLjhN=v=RkeIf~97=+~^QD{P%p=hTqABWg%y zL2ELrSu?Mho&`NhNY-S4w&c>9jV%owk%l{Llh!HGmJ}Q?wz>2*3d`RCeJ?w3L=|P( z@^HbNI;AnOJ#Ql#6L>2$CKbZp$`t*wI=E`~G=uA+-86%t~X*1_e5qlzWJbNT^Kp zA!Ut{+Pv@#phZq(1}0}*a9?YL?h$3jEZ9&Oa4t;gKG63>srnFFAS+}!P+0=5{L1{? zQ&53m5=Re}9gJX>8v)!?Qe_kh0cCbIT5J$^4GN1kD;=rzGu(NFQf3((IhW9}2xdV( zM1T|Y8LGa&(lX#jLwFUg2@BY8G(pfuA6{VDz>cLS4Qgftn!(Guo;0^>y9S^>%A#RSu=Q(g?<(|bv!V{qiB&X)1P~?+t zVft+>YJ#rG8V)V?6MXof*)mK=Izb$Qyd*)?c$iY|hG@S^YQc-vpEMvUqNPb{5ULY% zTBK3LtUPI7QlDB)3S|fq6J*sgACYmhqz2eePzY7~*|m%eSAk^lS7APZNps3PiO77N zh||4$+D-%WjZ`3IXI1Ox?-v!{>%H5%c{_4ur|9JR(1Wru(2Lj|_s-otw;7IjchH#j zK=P6yjN3DB%tmT|xUlu)w&|}1-_!lqbMKydFC49yj+-xmPNb4qA5WB4uAhJ4Y}j>r zVopzl{Rd~~hW37W&mwFPrV6y_14K9d+T<4%-$8Zx9(XeR~J|c8@hMvdt>#z@%mGs z&Zx-$wEom9#!b!UB{1r3w*S$IUxB*99<4tG9Gs=}a|&{NZUp^CqP+Tz&aJhbn(kuIvTn1lc{%$e>}52_8xt| z$g#1uQ&bl%tlwHdB~3dv+zv__yK}Q-<8;)_e0e3MO8Gwz+n_uD@j@>ujxhCCdrx{Xtxn5&3Vh53rV2&?r64zQ>FxZrHN=6&tJ35fqqpBBOoG}Rc^ z6`bwM`=Do_7d}30*PT77|F9ZBZIM^;Cegd8k%nk5GVCmI=ZmDUsX ziVka$AtDZ7xtMEmPADX^(P_6a);yoLraPcNxQ?n0|nIohhqzU$`{3-DJs+=wTTF7R<>HPXIZ87LPpAAI#V zHT@ZqS8fCX!P*ECC>r01;KiR23M7DZD&dSmHniZ0@k#My0LXR*QCt&cIw}8WEaEj{ zPCPz2JS3PgE*^S-LgZ_te-zGK!dFoWMQXlp_?b30@z#VC2_qWa@8E2^#lo_Wq#Y3} z9V2_tG17`qg*T+znbxAGd?Df3KS;IQc^rls46?*TJaHi!$j32;>@7C|0daXm@6Jht z5D^q5PHrC4G@wP`ej7i>FqpysE$wa_kusC{vT`4#$(u=oFCd=(0`)ya#Wq~RQkNk} z=0QDhLM&+_Gn0}eEvYd{eWubJ-8i4-Tg6Je-6-|UW=zP9-1lV zkqu3v$bquxzdx0zYup(B)b85T1ANb{Dn15+(4h>^2~WG|D7kqpW@`dp$IbbT=cBf| zJ?&`&Lz*nPdafjFu2(xZpWi8KN!S|q3_9Y+nV(@oKcpY0jdGOVyMFij*5w~vfBkx_ zxMO_;&a;4rfcq79w6^EnybshLTHd$pl#YY^ElI__?~Z&h@Zp8`FYJ_0u3z}4V*{_& zY~J3jY>id6ZmV`GJL09CAA!97>B+~y@zk=*bjFy@?S61fjh7$$$hUqWQ$}BlJQ=z0 zuIs(i@3lrBpNUq0k>wh6+i_&8KUQ4#adBV7^KNIXsc(JcpRC2Q=!=e~TjgUIB5rq-^ub##+=?3pW0(f+iJvh2!0t|LLSLWcrQcZJNJtQo+aHx9K3vEm8kRkP&|ki5gmw{p2*td^-bv zrYSnRBKXc(mwY;txX>PSXepQUAj^A1u9cm8(-ps!it-h}B^`trwG~+p+;fwXiU{Vc zRQ$}@6FQ^RBc%C5xn(GfR?4GCtnphqYM3%wiKg$YM;bNIN#xcsE3Af`Qx{vfRGyh{&wq4HX9wP z9}2V2H*aD34E3SvDufzx>4J!vFH=i%h_=`jYfav%zBRUD1vYsH`_|YT2lTiEW&CfA z)p-C`*RO@ORMGR?^F)k?(th!+TVMXQ^;BR#4y-5F3L-7zE*!9Ga_#Ar5`MCR55$== zaHEzZz1hgIT*qK z2=NVDPky(clPgnYy2It_X~x=NYfzg9dd1wMnv0?+cQ+$feu$E_=@DBhJD^;y6;hWj zcR;CJ?NsnDVIw%()eCb*NmN7q3!H!qNH;CPg>K7!v^Rc@u0uLRiS~6qeB>;Q_K&%b%C9OfYh6#RK z-V{RK1W@TW3-6SMMZA>6pG(7%O45Rzp8phfg?%2Cn~pfm$TwPu=KG#FeJl&q8K=84 zK&0G*LdUuu#CgdhQ7n#UV-wQZ*toSi;V4@_E4x49IoN1rPuzTLU%`PmJ(zHm?mC)d zj^-Ul%X<2%4aB^8;*F_D*-l+I=q|QzM_rhGAC5C|`a7T#*e&Udm2~cubg!E;n|<;P zK5}ZO;dr$EMD)aH)O9XSpWlZBl}?GWs@*bAtjx1h)(Vxc>o-a=F_pyWBl}9Cdn$Mx zyw?0m^PjZ5XkE_(4TaJ%bu&k)&5AhPkdZ6uYKqfGGe9}!sqAQE=$)}Q$Dkjv=5x`b z=cBH%IDH|bShNg}#6G#x-XConh`LDglH=@l$1=)qo{DJS zF~4cvz7}g7h&BvHT|;qt_|RF7zcHA?^F*w%Z>RQ5wB|ce7a3+{Yc_k)rQ@CEH=DPG zSku5x{b00iDC!!H(<2W|)|XGccxsdW*mNXgEp6V8o14JX_qFm@%C~ODU9H(?kB1_~ z5&c%nCpPqAC~bo&11}OpW&GGwBcrN{nX9%eadQjI`)j9OITbO+$~w0Pw)7^6*$h_^ec4My>GUr)IoUOdB@xkX^)wk_jHuO34RpH z9}JoPPfewAQ_#63TG9H6xlPuki9ecFJSLtoUijmEV6BYOmEv_UCfIA>{sf{4o`v7M z{GhKsG6fHR20`YfUm!B2a^h*?kjy&da%%u~12JVia27%Rwnj1yqk07Ylduvtmd+{y zpSN%`%X(NHp6yUFd8^v&vz;$BrtXc%6K=^o#uQ$#%lbniEf+@tN&2~|i{oh?X8$!+ zit$Qc_rxPIF-5K*sd|=MgVw^GvUzZd4)pxvLct^%Z3gqRP+KqK&La+GaLoZ9TuN%$ zmBnR|Jm9?v#NiCCj6@p2p%Bg?=g#AR%X_&Aap8SWFpEOPevP>zc>?!zG$g>~M)_2J z;l|NTK5nVmdip-B@6i`WH`sfDyMe9#h!0j095>6a&EBoxP6N=+MqRz1&?mptLx!lO z<|{&DzF*T{qIthW*U#wP>hZ72T7%1>)|_eri25a#}ck8B@{4P?g#SAu#8E-}~VomHe7IET@26cB!HYSI}WI7;_)@P?IC z3|0}0(UhZdlfC=Yo&mqWMXcl@=G=Qi)uVH5vJWYE?JYy2b&jpBh$b=>pZ&p2|;B)VIze>k!u53+5I=8OIs#+gX2-q7@&mp{cGqg3exf*l1 zA5sX|o6ww7>8dvE4=H@_J)t)0PHlzuD0ppazrdHcU~sL>!k_%eTVgdVPPmyIZzZSJ z(3=VuYu3YR-j=Z7T=2E+E@a^@N&btIPhR_NG6uoYWB+9N?0?2IZ`0(QyQN1=ex502ei-i13lAN3a&e+d?pTJTf`t z{vx9vGF)+UB=kd{s+s%GnA_m-K>as@ydQ2xg4<;M-Vj_)C0H+uK+sE&I~t)}o{!w2 zK#Bn;q9fN!!nwR^K$E^@NxXUK8o=E4Bn@W`!7%}F=L7pgj#N(ICtTAA7c+VxmB0vv zP8vy01oBCJs!bf)1e2y4K7L_#Ft{|gFrU;74G&y8%XMI_ga+f}aes-yf4~428i!OH zFJ?kkhEQ+tDp}=|TJ$1;8=U@%B$N8Mq?XjE#e3wrA3{R*El%1+-@+32b4a<4Tn`Vw z{1>Qy))qam6z^JUW0u;4eGIt!{JMvfIzR7)5ui^x)2_B8rUjv`;J&3GVL1v$e4X

(m*9`<{q;YXg=J^w(r{ZavGe!ck37aIILhhhR*ZzBIl))vmX$YN%4e@Xh3_-`Qeaeoh4 zU`bH?JOtpdu2Oxj&R1z4GL)+D7nJcAl<60g;U6jI|E5}YsFr`Ej{Jhkht8`_U#fMg zhCK>`hZ^|Y!_O~m&(Nw3_*momR7?Nf2&^=1DH)9a3mJj% ADF6Tf diff --git a/__pycache__/design_preparation.cpython-313.pyc b/__pycache__/design_preparation.cpython-313.pyc deleted file mode 100644 index 51d6cf8258729c395444e8be45c9f499dbb0ca50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25810 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 L`3@we6Y~E9Xv{x3 diff --git a/__pycache__/design_validation.cpython-312.pyc b/__pycache__/design_validation.cpython-312.pyc deleted file mode 100644 index ef08a455923c69a697ec8b771eaca59261db79c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46911 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 diff --git a/__pycache__/design_validation.cpython-313.pyc b/__pycache__/design_validation.cpython-313.pyc deleted file mode 100644 index d65e6f17222323cb4fda336966a80a1dd681186c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47107 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 IT8;5Hn% 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 diff --git a/__pycache__/elite_pcb_designer.cpython-312.pyc b/__pycache__/elite_pcb_designer.cpython-312.pyc deleted file mode 100644 index aacfe20cf71f23629cb60fbadd76d4ad49217e12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26718 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 diff --git a/__pycache__/elite_pcb_designer.cpython-39.pyc b/__pycache__/elite_pcb_designer.cpython-39.pyc deleted file mode 100644 index ed5779c53374271f475392e06cc6bc9f3890ccbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15174 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 L=x;nRsLB5WE7I>g diff --git a/__pycache__/freerouting_config.cpython-313.pyc b/__pycache__/freerouting_config.cpython-313.pyc deleted file mode 100644 index 1da3910a18f6534ac40e8442401ad4f18a4dbb08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13866 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 F`fplRP!a$D diff --git a/__pycache__/ipc_standards_library.cpython-312.pyc b/__pycache__/ipc_standards_library.cpython-312.pyc deleted file mode 100644 index 8205d7201421b7e00bb02b734c9c3b29472a1123..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33107 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 diff --git a/__pycache__/test_elite_pcb_designer.cpython-312.pyc b/__pycache__/test_elite_pcb_designer.cpython-312.pyc deleted file mode 100644 index 0b8fe3bb599d4292aac8ac17e126bfdf1e58b7e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24105 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 EAFC~O?*IS* diff --git a/agent/dfm/checker.py b/agent/dfm/checker.py index 3eaad2f..a4c0b1d 100644 --- a/agent/dfm/checker.py +++ b/agent/dfm/checker.py @@ -19,12 +19,23 @@ class DFMCheck: """Single DFM check result.""" def __init__(self, rule: str, message: str, status: str = "PASS", severity: str = "INFO"): + """Initializes a new DFM check. + Args: + rule (str): The name of the rule being checked. + message (str): A description of the check. + status (str): The status of the check (PASS or FAIL). + severity (str): The severity of the check (INFO, WARNING, or ERROR). + """ self.rule = rule self.message = message self.status = status # PASS or FAIL self.severity = severity # INFO, WARNING, ERROR def to_dict(self) -> Dict[str, Any]: + """Converts the DFM check to a dictionary. + Returns: + Dict[str, Any]: A dictionary representation of the DFM check. + """ return { "rule": self.rule, "message": self.message, diff --git a/agent/drivers/kicad_cli.py b/agent/drivers/kicad_cli.py index b4d4e44..e714eaf 100644 --- a/agent/drivers/kicad_cli.py +++ b/agent/drivers/kicad_cli.py @@ -20,7 +20,6 @@ class KiCadCLIError(Exception): """Raised when a kicad-cli command fails.""" - pass def _run_cmd(args, description=""): diff --git a/agent/orchestrator/run.py b/agent/orchestrator/run.py index 67ee212..b20fd5e 100644 --- a/agent/orchestrator/run.py +++ b/agent/orchestrator/run.py @@ -35,19 +35,24 @@ class OrchestratorError(Exception): """Raised when orchestrator encounters a fatal error.""" - pass class Phase: """Context manager for tracking phase execution.""" def __init__(self, phase_num, description): + """Initializes a new phase. + Args: + phase_num (int): The number of the phase. + description (str): A description of the phase. + """ self.phase_num = phase_num self.description = description self.start_time = None self.end_time = None def __enter__(self): + """Starts the phase and prints a header.""" self.start_time = datetime.now() print(f"\n{'=' * 70}") print(f"PHASE {self.phase_num}: {self.description}") @@ -55,6 +60,7 @@ def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): + """Ends the phase and prints a summary.""" self.end_time = datetime.now() elapsed = (self.end_time - self.start_time).total_seconds() if exc_type is None: diff --git a/agent/routing/freerouting.py b/agent/routing/freerouting.py index e83b16d..1e1c9f8 100644 --- a/agent/routing/freerouting.py +++ b/agent/routing/freerouting.py @@ -19,7 +19,6 @@ class FreeRoutingError(Exception): """Raised when FreeRouting operation fails.""" - pass def route(jar_path, dsn_file, ses_output, timeout_s=1800, max_retries=1): diff --git a/automated_routing.py b/automated_routing.py index 4d0533b..9de4115 100644 --- a/automated_routing.py +++ b/automated_routing.py @@ -62,7 +62,23 @@ class RoutingStatus(Enum): @dataclass class TraceSpecification: - """Specifications for trace routing""" + """Defines the routing specifications for a single electrical trace. + + Attributes: + net_name: The name of the net this trace belongs to. + net_type: The functional type of the net (e.g., POWER, HIGH_SPEED). + width_mil: The width of the trace in mils. + width_mm: The width of the trace in millimeters. + clearance_mil: The clearance around the trace in mils. + clearance_mm: The clearance around the trace in millimeters. + max_length_mm: The maximum allowed length of the trace in millimeters. + length_match_tolerance_mm: The length matching tolerance for differential pairs. + series_damping_ohm: The value of a series damping resistor, if required. + differential_pair: A flag indicating if this is part of a differential pair. + differential_spacing_mil: The required spacing for a differential pair in mils. + impedance_target_ohm: The target impedance for the trace. + layer_constraint: The specific layer the trace should be routed on. + """ net_name: str net_type: NetType width_mil: float @@ -90,7 +106,14 @@ def clearance_um(self) -> float: @dataclass class ViaSpecification: - """Specifications for via placement""" + """Specifies the properties of a via. + + Attributes: + diameter_mm: The full diameter of the via pad in millimeters. + drill_mm: The diameter of the drill hole in millimeters. + via_type: The type of via (e.g., "through", "blind", "buried"). + thermal_relief: A flag indicating if thermal relief should be applied. + """ diameter_mm: float drill_mm: float via_type: str = "through" # through, blind, buried, thermal @@ -107,7 +130,19 @@ def drill_um(self) -> float: @dataclass class CopperZone: - """Copper zone/plane specification""" + """Defines a copper pour or zone on a specific layer. + + Attributes: + name: The unique name of the copper zone. + net_name: The name of the net this zone is connected to. + layer: The layer on which the zone is placed. + priority: The priority of the zone fill. + clearance_mm: The clearance between the zone and other copper features. + min_width_mm: The minimum width of any part of the filled zone. + thermal_relief: A flag for applying thermal relief to pads. + fill_mode: The fill pattern (e.g., "solid", "hatch"). + hatch_spacing_mm: The spacing for hatched fill patterns. + """ name: str net_name: str layer: str @@ -121,7 +156,17 @@ class CopperZone: @dataclass class ThermalViaArray: - """Thermal via array for component cooling""" + """Defines an array of thermal vias for heat dissipation under a component. + + Attributes: + component_ref: The reference designator of the component. + center_x_mm: The x-coordinate of the center of the via array. + center_y_mm: The y-coordinate of the center of the via array. + num_vias: The total number of vias in the array. + grid_spacing_mm: The spacing between vias in the grid. + via_spec: The `ViaSpecification` for the thermal vias. + pattern: The layout pattern of the vias (e.g., "grid", "circle"). + """ component_ref: str center_x_mm: float center_y_mm: float @@ -133,7 +178,19 @@ class ThermalViaArray: @dataclass class RoutingResult: - """Result of routing operation""" + """Summarizes the results of the automated routing process. + + Attributes: + status: The final status of the routing operation. + nets_routed: The number of nets that were successfully routed. + nets_total: The total number of nets in the design. + vias_placed: The total number of vias placed on the board. + routing_time_sec: The total time taken for routing, in seconds. + drc_violations: The number of Design Rule Check violations found. + messages: A list of informational messages from the routing process. + warnings: A list of warnings generated during routing. + errors: A list of errors that occurred during routing. + """ status: RoutingStatus nets_routed: int nets_total: int @@ -160,7 +217,13 @@ def success(self) -> bool: # ============================================================================= class K1RoutingConfiguration: - """K1 Lightwave specific routing rules and specifications""" + """Provides a centralized configuration for all routing rules and specifications. + + This class contains all the design-specific constraints for the K1 Lightwave + board, including trace widths, clearances, via sizes, copper zones, and + thermal via arrays. It is intended to be a single source of truth for the + automated routing process. + """ # Power nets with current requirements POWER_NETS = { @@ -395,7 +458,15 @@ class K1RoutingConfiguration: @classmethod def get_all_critical_nets(cls) -> Dict[str, TraceSpecification]: - """Get all critical nets that need manual routing""" + """Retrieves a consolidated dictionary of all critical nets. + + This method combines the power, SPI, USB, and I2C/I2S net specifications + into a single dictionary for easy access. + + Returns: + A dictionary where keys are net names and values are their + `TraceSpecification` objects. + """ all_nets = {} all_nets.update(cls.POWER_NETS) all_nets.update(cls.SPI_NETS) @@ -409,16 +480,37 @@ def get_all_critical_nets(cls) -> Dict[str, TraceSpecification]: # ============================================================================= class CriticalNetRouter: - """Manual routing for power and high-speed signals""" + """Handles the manual routing of critical nets, such as power and high-speed signals. + + This class is responsible for loading the KiCad board and applying specific + routing strategies to nets that require careful handling to ensure signal + integrity and power delivery. + + Attributes: + board_path (Path): The file path to the KiCad PCB file. + logger (logging.Logger): A logger for recording operational messages. + board (pcbnew.BOARD): The `pcbnew` board object. + routed_nets (List[str]): A list of nets that have been successfully routed. + """ def __init__(self, board_path: str, logger: Optional[logging.Logger] = None): + """Initializes the CriticalNetRouter. + + Args: + board_path: The file path to the KiCad .kicad_pcb file. + logger: An optional logger instance. + """ self.board_path = Path(board_path) self.logger = logger or logging.getLogger(__name__) self.board = None self.routed_nets = [] def load_board(self) -> bool: - """Load KiCad board""" + """Loads the KiCad board file using the `pcbnew` API. + + Returns: + True if the board is loaded successfully, False otherwise. + """ try: import pcbnew self.board = pcbnew.LoadBoard(str(self.board_path)) @@ -429,11 +521,14 @@ def load_board(self) -> bool: return False def route_power_nets(self) -> Dict[str, Any]: - """ - Route power distribution nets: VBUS, 3V3, LED_5V, GND + """Routes the main power distribution nets. + + This method applies specific trace widths and clearances for the power + nets, as defined in the `K1RoutingConfiguration`. Returns: - Dictionary with routing results + A dictionary containing the results of the power net routing, + including which nets were routed and the overall status. """ self.logger.info("=" * 60) self.logger.info("ROUTING POWER NETS") @@ -464,11 +559,13 @@ def route_power_nets(self) -> Dict[str, Any]: return results def route_spi_signals(self) -> Dict[str, Any]: - """ - Route SPI clock and data signals with series damping + """Routes the high-speed SPI (Serial Peripheral Interface) signals. + + This method handles the routing of SPI clock and data lines, including + any requirements for series damping resistors to maintain signal integrity. Returns: - Dictionary with routing results + A dictionary containing the results of the SPI signal routing. """ self.logger.info("=" * 60) self.logger.info("ROUTING SPI SIGNALS (40 MHz)") @@ -499,11 +596,14 @@ def route_spi_signals(self) -> Dict[str, Any]: return results def route_usb_signals(self) -> Dict[str, Any]: - """ - Route USB differential pair (D+/D-) + """Routes the USB (Universal Serial Bus) differential pair. + + This method ensures that the USB D+ and D- signals are routed as a + length-matched differential pair with the correct spacing to meet + USB 2.0 specifications. Returns: - Dictionary with routing results + A dictionary containing the results of the USB signal routing. """ self.logger.info("=" * 60) self.logger.info("ROUTING USB DIFFERENTIAL PAIR") @@ -533,11 +633,10 @@ def route_usb_signals(self) -> Dict[str, Any]: return results def route_i2c_i2s(self) -> Dict[str, Any]: - """ - Route I2C and I2S signals + """Routes the I2C (Inter-Integrated Circuit) and I2S (Integrated Interchip Sound) signals. Returns: - Dictionary with routing results + A dictionary containing the results of the I2C/I2S signal routing. """ self.logger.info("=" * 60) self.logger.info("ROUTING I2C/I2S SIGNALS") @@ -571,7 +670,20 @@ def route_i2c_i2s(self) -> Dict[str, Any]: # ============================================================================= class FreeRoutingIntegration: - """FreeRouting auto-router integration""" + """Manages the integration with the FreeRouting external autorouter. + + This class handles exporting the KiCad board to the Specctra DSN format, + configuring and running the FreeRouting JAR, and importing the resulting + SES session file back into the KiCad board. + + Attributes: + board_path (Path): The file path to the KiCad PCB file. + work_dir (Path): The directory for storing intermediate routing files. + freerouting_jar (Path): The file path to the FreeRouting executable JAR. + logger (logging.Logger): A logger for recording operational messages. + dsn_file (Path): The path to the exported DSN file. + ses_file (Path): The path to the imported SES session file. + """ def __init__( self, @@ -580,6 +692,14 @@ def __init__( freerouting_jar: Optional[str] = None, logger: Optional[logging.Logger] = None ): + """Initializes the FreeRoutingIntegration class. + + Args: + board_path: The file path to the KiCad .kicad_pcb file. + work_dir: The directory for storing intermediate routing files. + freerouting_jar: The file path to the FreeRouting executable JAR. + logger: An optional logger instance. + """ self.board_path = Path(board_path) self.work_dir = Path(work_dir) if work_dir else self.board_path.parent / "build" / "routing" self.freerouting_jar = Path(freerouting_jar) if freerouting_jar else None @@ -592,7 +712,14 @@ def __init__( self.work_dir.mkdir(parents=True, exist_ok=True) def find_freerouting_jar(self) -> bool: - """Locate FreeRouting JAR file""" + """Locates the FreeRouting JAR file on the local system. + + This method searches for the FreeRouting JAR in common installation + directories and updates the `freerouting_jar` attribute if found. + + Returns: + True if the FreeRouting JAR is found, False otherwise. + """ if self.freerouting_jar and self.freerouting_jar.exists(): self.logger.info(f"Using FreeRouting: {self.freerouting_jar}") return True @@ -616,11 +743,12 @@ def find_freerouting_jar(self) -> bool: return False def export_to_dsn(self) -> bool: - """ - Export board to Specctra DSN format + """Exports the KiCad board to the Specctra DSN file format. + + This DSN file is used as the input for the FreeRouting autorouter. Returns: - True if export successful + True if the DSN file is exported successfully, False otherwise. """ self.logger.info("=" * 60) self.logger.info("EXPORTING TO SPECCTRA DSN") @@ -653,11 +781,10 @@ def export_to_dsn(self) -> bool: return False def configure_freerouting(self) -> Dict[str, Any]: - """ - Configure FreeRouting parameters for K1 board + """Configures the parameters for the FreeRouting autorouter. Returns: - Configuration dictionary + A dictionary of configuration parameters for FreeRouting. """ config = { "threads": 4, @@ -675,14 +802,13 @@ def configure_freerouting(self) -> Dict[str, Any]: return config def run_freerouting(self, timeout: int = 900) -> bool: - """ - Execute FreeRouting auto-router + """Executes the FreeRouting autorouter as a subprocess. Args: - timeout: Maximum routing time in seconds (default 15 minutes) + timeout: The maximum time in seconds to allow for routing. Returns: - True if routing successful + True if the autorouter completes successfully, False otherwise. """ self.logger.info("=" * 60) self.logger.info("RUNNING FREEROUTING AUTO-ROUTER") @@ -752,11 +878,10 @@ def run_freerouting(self, timeout: int = 900) -> bool: return False def import_routing_results(self) -> bool: - """ - Import FreeRouting SES results back into KiCad board + """Imports the routing results from the SES file back into the KiCad board. Returns: - True if import successful + True if the import is successful, False otherwise. """ self.logger.info("=" * 60) self.logger.info("IMPORTING ROUTING RESULTS") @@ -790,11 +915,14 @@ def import_routing_results(self) -> bool: return False def verify_routing(self) -> Tuple[bool, str]: - """ - Validate routing quality and completion + """Validates the quality and completeness of the routing. + + This method checks for unrouted segments, minimum trace widths, clearances, + and other routing-related issues. Returns: - (success, message) tuple + A tuple containing a boolean indicating if the routing is valid, and + a string message summarizing the verification results. """ self.logger.info("=" * 60) self.logger.info("VERIFYING ROUTING") @@ -819,7 +947,22 @@ def verify_routing(self) -> Tuple[bool, str]: # ============================================================================= class AutomatedRouting: - """Complete Phase 3 routing pipeline orchestrator""" + """Orchestrates the entire automated PCB routing pipeline. + + This class coordinates the various stages of the routing process, including + critical net routing, autorouting with FreeRouting, copper zone creation, + thermal via placement, and post-routing validation. + + Attributes: + board_path (Path): The file path to the KiCad PCB file. + kicad_path (str): The path to the KiCad installation directory. + freerouting_jar (str): The file path to the FreeRouting executable JAR. + work_dir (Path): The directory for storing intermediate routing files. + logger (logging.Logger): A logger for recording operational messages. + critical_router (CriticalNetRouter): An instance for routing critical nets. + freerouting (FreeRoutingIntegration): An instance for autorouter integration. + result (RoutingResult): An object to store the final routing results. + """ def __init__( self, @@ -829,6 +972,15 @@ def __init__( work_dir: Optional[str] = None, logger: Optional[logging.Logger] = None ): + """Initializes the AutomatedRouting orchestrator. + + Args: + board_path: The file path to the KiCad .kicad_pcb file. + kicad_path: The path to the KiCad installation directory. + freerouting_jar: The file path to the FreeRouting executable JAR. + work_dir: The directory for storing intermediate routing files. + logger: An optional logger instance. + """ self.board_path = Path(board_path) self.kicad_path = kicad_path self.freerouting_jar = freerouting_jar @@ -869,11 +1021,13 @@ def __init__( ) def route_critical_nets(self) -> Dict[str, Any]: - """ - Step 1: Route power and high-speed nets manually + """Routes the critical power and high-speed nets. + + This is the first step in the routing pipeline, where nets requiring + manual control are routed before the autorouter is run. Returns: - Dictionary with routing results + A dictionary summarizing the results of the critical net routing. """ self.logger.info("\n" + "=" * 70) self.logger.info("PHASE 3: AUTOMATED ROUTING - STEP 1: CRITICAL NETS") @@ -909,11 +1063,10 @@ def route_critical_nets(self) -> Dict[str, Any]: return results def export_for_autorouting(self) -> bool: - """ - Step 2: Export to DSN for FreeRouting + """Exports the board to the DSN format required by FreeRouting. Returns: - True if export successful + True if the export is successful, False otherwise. """ self.logger.info("\n" + "=" * 70) self.logger.info("PHASE 3: AUTOMATED ROUTING - STEP 2: EXPORT TO DSN") @@ -928,11 +1081,10 @@ def export_for_autorouting(self) -> bool: return success def run_autorouter(self) -> bool: - """ - Step 3: Execute FreeRouting + """Executes the FreeRouting autorouter. Returns: - True if routing successful + True if the autorouting process completes successfully, False otherwise. """ self.logger.info("\n" + "=" * 70) self.logger.info("PHASE 3: AUTOMATED ROUTING - STEP 3: AUTO-ROUTE") @@ -961,11 +1113,10 @@ def run_autorouter(self) -> bool: return success def create_copper_zones(self) -> Dict[str, Any]: - """ - Step 4: Create GND/power planes and pour + """Creates and pours the copper zones for power and ground planes. Returns: - Dictionary with zone creation results + A dictionary summarizing the results of the copper zone creation. """ self.logger.info("\n" + "=" * 70) self.logger.info("PHASE 3: AUTOMATED ROUTING - STEP 4: COPPER ZONES") @@ -995,11 +1146,10 @@ def create_copper_zones(self) -> Dict[str, Any]: return results def place_thermal_vias(self) -> Dict[str, Any]: - """ - Step 5: Add thermal vias under high-power components + """Places thermal vias under high-power components for heat dissipation. Returns: - Dictionary with via placement results + A dictionary summarizing the results of the thermal via placement. """ self.logger.info("\n" + "=" * 70) self.logger.info("PHASE 3: AUTOMATED ROUTING - STEP 5: THERMAL VIAS") @@ -1032,11 +1182,11 @@ def place_thermal_vias(self) -> Dict[str, Any]: return results def validate_routing(self) -> Tuple[bool, List[str]]: - """ - Step 6: Verify all constraints met + """Validates the final routed board against all design constraints. Returns: - (success, violations) tuple + A tuple containing a boolean indicating if the validation passed, + and a list of any violation messages. """ self.logger.info("\n" + "=" * 70) self.logger.info("PHASE 3: AUTOMATED ROUTING - STEP 6: VALIDATION") @@ -1062,11 +1212,13 @@ def validate_routing(self) -> Tuple[bool, List[str]]: return len(violations) == 0, violations def execute(self) -> bool: - """ - Run full Phase 3 pipeline + """Executes the full automated routing pipeline. + + This method runs all the routing and post-routing steps in the correct + sequence to produce a fully routed PCB. Returns: - True if all steps successful + True if the entire pipeline completes successfully, False otherwise. """ self.logger.info("\n" + "=" * 80) self.logger.info("ELITE PCB DESIGNER AGENT - PHASE 3: AUTOMATED ROUTING") diff --git a/component_placement.py b/component_placement.py index ced72f9..0b0a040 100644 --- a/component_placement.py +++ b/component_placement.py @@ -28,12 +28,24 @@ @dataclass class Point: - """2D point in mm""" + """Represents a 2D point in millimeters. + + Attributes: + x: The x-coordinate of the point. + y: The y-coordinate of the point. + """ x: float y: float def distance_to(self, other: 'Point') -> float: - """Calculate Euclidean distance to another point""" + """Calculates the Euclidean distance to another point. + + Args: + other: The other point to which the distance is calculated. + + Returns: + The distance between the two points in millimeters. + """ return math.sqrt((self.x - other.x)**2 + (self.y - other.y)**2) def __add__(self, other: 'Point') -> 'Point': @@ -45,7 +57,17 @@ def __sub__(self, other: 'Point') -> 'Point': @dataclass class ComponentInfo: - """Component placement information""" + """Stores placement and metadata for a single component. + + Attributes: + reference: The component's reference designator (e.g., "R1", "U1"). + footprint: The name of the component's footprint. + position: The (x, y) coordinates of the component's center. + rotation: The component's rotation in degrees. + placed: A flag indicating whether the component has been placed. + thermal_zone: The name of the thermal zone the component belongs to. + cluster: The functional group the component is a part of. + """ reference: str footprint: str position: Optional[Point] = None @@ -57,7 +79,17 @@ class ComponentInfo: @dataclass class K1ThermalZone: - """Represents a thermal zone on the K1 board""" + """Defines a thermal zone on the PCB for managing heat-sensitive components. + + Attributes: + name: The unique name of the thermal zone. + center: The center point of the zone. + radius: The radius of the zone in millimeters. + priority: The placement priority for this zone (1 is highest). + max_temp_rise: The maximum allowable temperature rise in degrees Celsius. + power_dissipation: The estimated power dissipation within the zone in milliwatts. + components: A list of components placed within this zone. + """ name: str center: Point radius: float # mm @@ -67,24 +99,54 @@ class K1ThermalZone: components: List[ComponentInfo] = field(default_factory=list) def contains_point(self, point: Point) -> bool: - """Check if point is within thermal zone""" + """Checks if a given point is inside the thermal zone. + + Args: + point: The point to check. + + Returns: + True if the point is within the zone's radius, False otherwise. + """ return self.center.distance_to(point) <= self.radius def add_component(self, comp: ComponentInfo) -> None: - """Add component to this thermal zone""" + """Adds a component to the thermal zone. + + Args: + comp: The component to add. + """ self.components.append(comp) comp.thermal_zone = self.name class ComponentPlacement: - """ - Intelligent component placement engine for K1 Lightwave board. - - Implements multi-phase placement algorithm: - - Phase 2A: Fixed components (board edge connectors) - - Phase 2B: Primary components (MCUs, power) - - Phase 2C: Supporting components (passives) - - Phase 2D: Remaining components + """Orchestrates the automated placement of components on a PCB. + + This class implements a multi-phase placement strategy to intelligently + position components based on thermal zones, functional clusters, and + manufacturing constraints. It is designed to handle the placement process + for the K1 Lightwave board, but can be adapted for other designs. + + The placement process is divided into four main phases: + 1. **Fixed Components**: Placement of connectors and other components with + fixed positions. + 2. **Primary Components**: Placement of core components like MCUs and power + modules within their designated thermal zones. + 3. **Supporting Components**: Placement of passives and other components + that support the primary components. + 4. **Remaining Components**: Placement of all other components in the + remaining available space. + + Attributes: + board_path (Path): The file path to the input KiCad PCB file. + output_path (Path): The destination file path for the modified PCB file. + pcbnew_available (bool): A flag indicating if the `pcbnew` API is available. + board (pcbnew.BOARD): The `pcbnew` board object. + components (Dict[str, ComponentInfo]): A dictionary of all components on the board. + thermal_zones (List[K1ThermalZone]): A list of defined thermal zones. + clusters (Dict[str, List[ComponentInfo]]): A dictionary of component functional clusters. + placement_results (Dict[str, Point]): A dictionary of final component placements. + violations (List[str]): A list of any placement violations found. """ # K1 Board dimensions (mm) @@ -97,12 +159,12 @@ class ComponentPlacement: MIN_EDGE_DISTANCE = 2.0 # mm from board edge def __init__(self, board_path: str, output_path: Optional[str] = None): - """ - Initialize component placement engine. + """Initializes the ComponentPlacement engine. Args: - board_path: Path to KiCad .kicad_pcb file - output_path: Optional output path for modified board + board_path: The file path to the KiCad .kicad_pcb file. + output_path: The optional destination path for the modified board file. + If not provided, the original board file will be overwritten. """ self.board_path = Path(board_path) if output_path: @@ -141,7 +203,13 @@ def __init__(self, board_path: str, output_path: Optional[str] = None): self._load_components() def _load_components(self) -> None: - """Load all components from board""" + """Loads all components from the KiCad board file. + + This method populates the `self.components` dictionary with `ComponentInfo` + objects for each component found on the board. If the `pcbnew` API is not + available, it falls back to creating a dummy set of components for + simulation purposes. + """ if not self.pcbnew_available or self.board is None: # Fallback: Create dummy components for simulation logging.info("Generating simulated component inventory (52 components)") @@ -192,11 +260,14 @@ def _load_components(self) -> None: self.components[ref] = comp def define_thermal_zones(self) -> List[K1ThermalZone]: - """ - Define K1 Lightwave thermal zones. + """Defines the thermal zones for the K1 Lightwave board. + + This method creates a list of `K1ThermalZone` objects, each representing + a specific area on the PCB where heat-generating components should be + placed. Returns: - List of thermal zones with priorities + A list of `K1ThermalZone` objects. """ self.thermal_zones = [ K1ThermalZone( @@ -236,11 +307,14 @@ def define_thermal_zones(self) -> List[K1ThermalZone]: return self.thermal_zones def cluster_components(self) -> Dict[str, List[ComponentInfo]]: - """ - Group components by functional clusters. + """Groups components into functional clusters. + + This method categorizes components based on their function (e.g., power, + USB interface, decoupling) to facilitate logical placement. Returns: - Dictionary of cluster names to component lists + A dictionary where keys are cluster names and values are lists of + `ComponentInfo` objects belonging to that cluster. """ self.clusters = { 'power': [], @@ -307,11 +381,15 @@ def cluster_components(self) -> Dict[str, List[ComponentInfo]]: return self.clusters def place_fixed_components(self) -> Dict[str, Point]: - """ - Phase 2A: Place fixed components at board edges. + """Places components with fixed positions, such as connectors. + + This is the first phase of the placement process, where components + that must be in specific locations (e.g., along the board edges) + are positioned. Returns: - Dictionary of reference to position + A dictionary of the placed components, where keys are component + references and values are their `Point` positions. """ placements = {} @@ -370,11 +448,15 @@ def place_fixed_components(self) -> Dict[str, Point]: return placements def place_primary_components(self) -> Dict[str, Point]: - """ - Phase 2B: Place primary components in thermal zones. + """Places the primary components within their designated thermal zones. + + This is the second phase of placement, focusing on positioning the main + integrated circuits (e.g., MCUs, power management ICs) in thermally + managed areas. Returns: - Dictionary of reference to position + A dictionary of the placed components, where keys are component + references and values are their `Point` positions. """ placements = {} @@ -452,11 +534,15 @@ def place_primary_components(self) -> Dict[str, Point]: return placements def place_supporting_components(self) -> Dict[str, Point]: - """ - Phase 2C: Place supporting components along signal paths. + """Places supporting components, such as passives, along signal paths. + + This third phase of placement positions components like resistors, + capacitors, and diodes in close proximity to the primary components + they support. Returns: - Dictionary of reference to position + A dictionary of the placed components, where keys are component + references and values are their `Point` positions. """ placements = {} @@ -511,11 +597,14 @@ def place_supporting_components(self) -> Dict[str, Point]: return placements def place_remaining_components(self) -> Dict[str, Point]: - """ - Phase 2D: Place remaining components in available space. + """Places all remaining components in the available board space. + + This final placement phase uses a grid-based approach to position any + components that have not yet been placed. Returns: - Dictionary of reference to position + A dictionary of the placed components, where keys are component + references and values are their `Point` positions. """ placements = {} @@ -548,11 +637,14 @@ def place_remaining_components(self) -> Dict[str, Point]: return placements def verify_spacing(self) -> Tuple[bool, List[str]]: - """ - Validate all spacing constraints. + """Validates that all components meet the required spacing constraints. + + This method checks for minimum spacing between components and from the + board edge to ensure manufacturability. Returns: - Tuple of (is_valid, list of violations) + A tuple containing a boolean indicating if all spacing constraints + are met, and a list of violation messages. """ violations = [] @@ -589,11 +681,15 @@ def verify_spacing(self) -> Tuple[bool, List[str]]: return len(violations) == 0, violations def optimize_routing_accessibility(self) -> Dict[str, float]: - """ - Calculate routing accessibility score for each component. + """Calculates a routing accessibility score for each component. + + This score is determined by factors such as the component's distance + from the board edge and the density of nearby components. A higher score + indicates that the component is easier to route to. Returns: - Dictionary of reference to accessibility score (0-1) + A dictionary where keys are component references and values are their + routing accessibility scores (from 0 to 1). """ scores = {} @@ -628,11 +724,13 @@ def optimize_routing_accessibility(self) -> Dict[str, float]: return scores def generate_placement_report(self) -> str: - """ - Generate comprehensive placement report. + """Generates a comprehensive report of the component placement results. + + The report includes information about thermal zones, component clusters, + spacing validation, and routing accessibility. Returns: - Multi-line report string + A formatted string containing the placement report. """ lines = [] lines.append("=" * 80) @@ -715,11 +813,13 @@ def generate_placement_report(self) -> str: return '\n'.join(lines) def generate_ascii_visualization(self) -> str: - """ - Generate ASCII art visualization of component placement. + """Generates an ASCII art visualization of the component placement. + + This method provides a simple, text-based view of the board layout, + showing the positions of components and thermal zones. Returns: - ASCII diagram string + A string containing the ASCII visualization. """ # Create grid (2mm per character) scale = 2.0 # mm per character @@ -791,7 +891,12 @@ def generate_ascii_visualization(self) -> str: return '\n'.join(lines + legend) def apply_placement_to_board(self) -> None: - """Apply calculated placements to KiCad board""" + """Applies the calculated component placements to the KiCad board file. + + This method updates the positions and rotations of all components in the + `pcbnew` board object based on the results of the placement algorithm. + It requires the `pcbnew` API to be available. + """ if not self.pcbnew_available or self.board is None: logging.info("Skipping board update (pcbnew not available)") return @@ -813,11 +918,14 @@ def apply_placement_to_board(self) -> None: ) def execute(self) -> bool: - """ - Execute full Phase 2 placement pipeline. + """Executes the full component placement pipeline. + + This method runs all the placement phases in sequence, from defining + thermal zones to placing all components and verifying the results. Returns: - True if successful, False otherwise + True if the placement is successful and passes all verification + checks, False otherwise. """ try: print("Starting Phase 2: Component Placement") diff --git a/design_preparation.py b/design_preparation.py index 1d22521..3390d5e 100644 --- a/design_preparation.py +++ b/design_preparation.py @@ -42,8 +42,21 @@ class FootprintAssignment: class DesignPreparation: """ - Phase 1: Design Preparation - Load netlist, assign footprints, validate design + Handles the initial design preparation phase for a PCB project. + + This class automates loading a KiCad netlist into a PCB file, assigning + component footprints based on predefined rules, documenting necessary IC + replacements, validating net connectivity, and running Electrical Rule + Checks (ERC). It is designed to prepare a raw schematic and netlist for + the component placement phase. + + Attributes: + netlist_path (Path): The file path to the KiCad netlist (.net). + board_path (Path): The file path to the KiCad PCB file (.kicad_pcb). + output_path (Path): The destination file path for the modified PCB file. + kicad_cli (str): The command-line executable for KiCad. + logger (logging.Logger): A logger for recording operational messages. + results (Dict[str, any]): A dictionary to store the outcomes of the preparation steps. """ # Footprint mapping rules for K1 Lightwave @@ -158,14 +171,14 @@ def __init__( output_path: Optional[Path] = None, kicad_cli: str = '/opt/homebrew/bin/kicad-cli' ): - """ - Initialize Design Preparation + """Initializes the DesignPreparation class. Args: - netlist_path: Path to KiCad netlist (.net) - board_path: Path to KiCad PCB file (.kicad_pcb) - output_path: Optional output path (defaults to board_path) - kicad_cli: Path to kicad-cli executable + netlist_path: The file path to the KiCad netlist (.net). + board_path: The file path to the KiCad PCB file (.kicad_pcb). + output_path: The optional destination path for the modified PCB file. + If not provided, the original board file will be overwritten. + kicad_cli: The path to the KiCad command-line interface executable. """ self.netlist_path = Path(netlist_path) self.board_path = Path(board_path) @@ -196,14 +209,15 @@ def __init__( } def load_netlist(self) -> bool: - """ - Import netlist into KiCad board + """Imports a netlist into a KiCad board file. - Parses netlist, applies footprint rules, and populates board with footprints - using KiCad Python API (pcbnew) + This method reads component information from the netlist file, matches + each component to a predefined footprint, and adds the footprints to the + KiCad board file. It requires the `pcbnew` Python API to be available. Returns: - True if successful + True if the netlist is loaded and at least one component is added + successfully, False otherwise. """ self.logger.info(f"Loading netlist: {self.netlist_path}") @@ -337,14 +351,15 @@ def load_netlist(self) -> bool: return False def assign_footprints(self) -> Dict[str, str]: - """ - Assign missing footprints to Device library components + """Assigns footprints to components that are missing them. - Reads netlist, matches components by reference pattern, - generates footprint assignments. + This method reads the netlist to identify components without an assigned + footprint. It then attempts to match these components against a set of + predefined rules to determine the correct footprint. Returns: - Dictionary of {component_ref: footprint} + A dictionary where keys are component references and values are the + assigned footprint names. """ self.logger.info("Analyzing footprint assignments...") @@ -407,11 +422,15 @@ def assign_footprints(self) -> Dict[str, str]: return {} def replace_ic_placeholders(self) -> Dict[str, Dict]: - """ - Document IC replacements needed + """Documents the necessary integrated circuit (IC) replacements. + + This method logs the ICs that are currently using placeholder symbols + in the schematic and need to be replaced with the correct components. + It serves as a reminder for manual corrections in the schematic. Returns: - Dictionary of IC replacement specifications + A dictionary detailing the required IC replacements, including the + current placeholder, the target component, and the correct footprint. """ self.logger.info("Analyzing IC placeholder replacements...") @@ -435,16 +454,14 @@ def replace_ic_placeholders(self) -> Dict[str, Dict]: return self.IC_REPLACEMENTS def validate_nets(self) -> Tuple[bool, str]: - """ - Validate all nets are properly connected + """Validates the electrical connectivity of nets in the design. - Checks for: - - Floating pins - - Unconnected nets - - Net integrity + This method checks for common net-related issues, such as floating pins + and unconnected nets, by analyzing the netlist file. Returns: - (success, message) + A tuple containing a boolean indicating if the nets are valid and a + string message summarizing the validation results. """ self.logger.info("Validating net connectivity...") @@ -502,17 +519,15 @@ def validate_nets(self) -> Tuple[bool, str]: return False, error def run_erc(self) -> Tuple[bool, str]: - """ - Run Electrical Rule Check - - Uses: kicad-cli erc + """Runs the Electrical Rule Check (ERC) on the schematic. - Acceptance criteria: - - Errors: 0 (must pass) - - Warnings: <= 100 (acceptable for placeholders) + This method uses the `kicad-cli` tool to perform an ERC on the schematic + file associated with the netlist. It checks for electrical errors and + warnings based on KiCad's rules. Returns: - (success, message) + A tuple containing a boolean indicating if the ERC passed and a + string message summarizing the results. """ self.logger.info("Running Electrical Rule Check (ERC)...") @@ -606,11 +621,14 @@ def run_erc(self) -> Tuple[bool, str]: return False, error def execute(self) -> bool: - """ - Run full Phase 1 pipeline + """Executes the full design preparation pipeline. + + This method runs all the steps in the design preparation phase in the + correct order: loading the netlist, assigning footprints, documenting + IC replacements, validating nets, and running the ERC. Returns: - True if all steps successful + True if all steps in the pipeline complete successfully, False otherwise. """ self.logger.info("="*60) self.logger.info("PHASE 1: DESIGN PREPARATION") @@ -682,11 +700,10 @@ def execute(self) -> bool: return overall_success def save_report(self, report_path: Path) -> None: - """ - Save detailed report to JSON + """Saves a detailed report of the design preparation results to a JSON file. Args: - report_path: Path to save report + report_path: The path to the file where the report will be saved. """ with open(report_path, 'w') as f: json.dump(self.results, f, indent=2) diff --git a/design_validation.py b/design_validation.py index 56bb991..f98fd87 100644 --- a/design_validation.py +++ b/design_validation.py @@ -42,7 +42,15 @@ class ValidationSeverity(Enum): @dataclass class ValidationResult: - """Result of a validation check""" + """Represents the outcome of a single validation check. + + Attributes: + check_name: The name of the validation check performed. + severity: The severity level of the result (e.g., PASS, WARNING, ERROR). + passed: A boolean indicating whether the check passed. + message: A human-readable summary of the validation result. + details: A dictionary containing detailed information about the check. + """ check_name: str severity: ValidationSeverity passed: bool @@ -56,7 +64,22 @@ def __str__(self) -> str: @dataclass class DRCRules: - """Design Rule Check constraints (JLCPCB standard 4-layer)""" + """Defines the Design Rule Check (DRC) constraints for the PCB. + + This class centralizes the DRC rules, which are based on the JLCPCB + standard for 4-layer boards. All dimensions are in millimeters unless + otherwise specified. + + Attributes: + trace_width_min: The minimum allowed trace width. + trace_width_max: The maximum allowed trace width. + trace_spacing_min: The minimum allowed spacing between traces. + pad_to_trace_min: The minimum allowed spacing from a pad to a trace. + via_drill_min: The minimum allowed via drill diameter. + via_pad_size_min: The minimum allowed via pad diameter. + annular_ring_min: The minimum allowed annular ring width. + copper_to_edge_min: The minimum allowed distance from copper to the board edge. + """ # All dimensions in mm unless specified trace_width_min: float = 0.1016 # 4 mil trace_width_max: float = 2.54 # 100 mil @@ -68,7 +91,11 @@ class DRCRules: copper_to_edge_min: float = 0.3 # mm (JLCPCB safety margin) def to_dict(self) -> dict: - """Convert rules to dictionary""" + """Converts the DRC rules to a dictionary. + + Returns: + A dictionary representation of the DRC rules. + """ return { 'trace_width': ('min', 4, 'mil', f'{self.trace_width_min}mm'), 'trace_width_max': ('max', 100, 'mil', f'{self.trace_width_max}mm'), @@ -82,13 +109,23 @@ def to_dict(self) -> dict: class DRCValidator: - """Design Rule Check validation using KiCad DRC engine""" + """Performs Design Rule Checks (DRC) using the KiCad DRC engine. + + This class provides methods to execute KiCad's DRC tool, parse the results, + and verify the design against a set of predefined electrical and physical + constraints. + + Attributes: + board_path (Path): The file path to the KiCad PCB file. + board (pcbnew.BOARD): The `pcbnew` board object. + rules (DRCRules): The set of DRC rules to be applied. + """ def __init__(self, board_path: Path): - """Initialize DRC validator + """Initializes the DRCValidator. Args: - board_path: Path to .kicad_pcb file + board_path: The file path to the .kicad_pcb file to be validated. """ self.board_path = Path(board_path) if not self.board_path.exists(): @@ -98,10 +135,15 @@ def __init__(self, board_path: Path): self.rules = DRCRules() def run_kicad_drc(self) -> tuple[int, str]: - """Execute KiCad DRC command line tool + """Executes the KiCad DRC command-line tool. + + This method attempts to use the `kicad-cli` tool to perform a DRC and + generate a JSON report. If `kicad-cli` is not available, it falls back + to a simpler Python-based DRC. Returns: - Tuple of (error_count, report_text) + A tuple containing the number of DRC errors found and the full + text of the DRC report. """ try: # Use kicad-cli for DRC if available (KiCad 7+) @@ -136,10 +178,14 @@ def run_kicad_drc(self) -> tuple[int, str]: return -1, f"DRC execution failed: {str(e)}" def _run_python_drc(self) -> tuple[int, str]: - """Fallback DRC using Python API + """Performs a fallback DRC using the `pcbnew` Python API. + + This method provides a basic DRC implementation for environments where + `kicad-cli` is not available. Returns: - Tuple of (error_count, report_text) + A tuple containing the number of DRC violations found and a + string report of the violations. """ violations = [] @@ -165,10 +211,13 @@ def _run_python_drc(self) -> tuple[int, str]: return len(violations), report def verify_constraints(self) -> ValidationResult: - """Check custom K1 Lightwave constraints + """Verifies the board against the defined DRC constraints. + + This method runs the DRC and returns a `ValidationResult` object + summarizing the outcome. Returns: - ValidationResult with constraint check status + A `ValidationResult` object with the status of the constraint check. """ error_count, report = self.run_kicad_drc() @@ -198,22 +247,31 @@ def verify_constraints(self) -> ValidationResult: class DFMValidator: - """Design for Manufacturing validation (JLCPCB specific)""" + """Performs Design for Manufacturing (DFM) validation, specific to JLCPCB. + + This class checks for common manufacturability issues, such as incorrect + layer stackup, component spacing, and edge clearances, to ensure the design + is suitable for production at JLCPCB. + + Attributes: + board_path (Path): The file path to the KiCad PCB file. + board (pcbnew.BOARD): The `pcbnew` board object. + """ def __init__(self, board_path: Path): - """Initialize DFM validator + """Initializes the DFMValidator. Args: - board_path: Path to .kicad_pcb file + board_path: The file path to the .kicad_pcb file to be validated. """ self.board_path = Path(board_path) self.board = pcbnew.LoadBoard(str(self.board_path)) def validate_layer_stack(self) -> ValidationResult: - """Verify 4-layer configuration for JLCPCB + """Verifies that the board has the correct 4-layer stackup for JLCPCB. Returns: - ValidationResult for layer stack validation + A `ValidationResult` indicating if the layer stack is correct. """ # Get layer count layer_count = self.board.GetCopperLayerCount() @@ -230,10 +288,10 @@ def validate_layer_stack(self) -> ValidationResult: ) def validate_assembly(self) -> ValidationResult: - """Check assembly constraints (component spacing, clearances) + """Checks for assembly constraints, such as component spacing. Returns: - ValidationResult for assembly validation + A `ValidationResult` indicating if assembly constraints are met. """ violations = [] @@ -265,10 +323,10 @@ def validate_assembly(self) -> ValidationResult: ) def validate_manufacturing(self) -> ValidationResult: - """Check fabrication constraints (copper to edge, isolated copper, etc) + """Checks for fabrication constraints, like copper-to-edge clearance. Returns: - ValidationResult for manufacturing validation + A `ValidationResult` indicating if fabrication constraints are met. """ violations = [] @@ -309,10 +367,10 @@ def validate_manufacturing(self) -> ValidationResult: ) def validate_fiducials(self) -> ValidationResult: - """Verify 3 fiducials with diagonal placement + """Verifies that at least three fiducial markers are present. Returns: - ValidationResult for fiducial validation + A `ValidationResult` indicating if the fiducial requirement is met. """ fiducials = [] @@ -347,25 +405,34 @@ def validate_fiducials(self) -> ValidationResult: class SignalIntegrityValidator: - """High-speed signal routing validation""" + """Performs validation of high-speed signal routing. + + This class checks for common signal integrity issues in high-speed interfaces + like SPI, USB, I2C, and I2S, ensuring that the routing meets the required + specifications for reliable operation. + + Attributes: + board_path (Path): The file path to the KiCad PCB file. + board (pcbnew.BOARD): The `pcbnew` board object. + """ def __init__(self, board_path: Path): - """Initialize signal integrity validator + """Initializes the SignalIntegrityValidator. Args: - board_path: Path to .kicad_pcb file + board_path: The file path to the .kicad_pcb file to be validated. """ self.board_path = Path(board_path) self.board = pcbnew.LoadBoard(str(self.board_path)) def _find_net_by_name(self, net_name_pattern: str) -> list[pcbnew.NETINFO_ITEM]: - """Find nets matching pattern + """Finds all nets that match a given name pattern. Args: - net_name_pattern: Net name or pattern to search for + net_name_pattern: The pattern to search for in the net names. Returns: - List of matching nets + A list of `pcbnew.NETINFO_ITEM` objects for the matching nets. """ matching_nets = [] for net_code in range(self.board.GetNetCount()): @@ -375,13 +442,13 @@ def _find_net_by_name(self, net_name_pattern: str) -> list[pcbnew.NETINFO_ITEM]: return matching_nets def _get_track_length_mm(self, net: pcbnew.NETINFO_ITEM) -> float: - """Calculate total track length for a net + """Calculates the total length of all tracks belonging to a specific net. Args: - net: Net to measure + net: The `pcbnew.NETINFO_ITEM` object for the net. Returns: - Total track length in mm + The total length of the net's tracks in millimeters. """ total_length = 0.0 for track in self.board.GetTracks(): @@ -390,10 +457,13 @@ def _get_track_length_mm(self, net: pcbnew.NETINFO_ITEM) -> float: return total_length def validate_spi_routing(self) -> ValidationResult: - """Check 40 MHz SPI traces (SCK, MOSI, MISO) + """Validates the routing of the 40 MHz SPI traces. + + This method checks for the presence of the main SPI signals (SCK, MOSI, MISO) + and provides recommendations for ensuring signal integrity. Returns: - ValidationResult for SPI routing validation + A `ValidationResult` for the SPI routing validation. """ spi_nets = ['SCK', 'MOSI', 'MISO', 'SPI_SCK', 'SPI_MOSI', 'SPI_MISO'] found_nets = {} @@ -436,10 +506,13 @@ def validate_spi_routing(self) -> ValidationResult: ) def validate_usb_routing(self) -> ValidationResult: - """Check USB 2.0 Full-Speed differential pairs + """Validates the routing of the USB 2.0 Full-Speed differential pair. + + This method checks for the presence of the D+ and D- signals and verifies + that their lengths are matched within the required tolerance. Returns: - ValidationResult for USB routing validation + A `ValidationResult` for the USB routing validation. """ usb_dp = self._find_net_by_name('USB_D+') or self._find_net_by_name('D+') usb_dm = self._find_net_by_name('USB_D-') or self._find_net_by_name('D-') @@ -488,10 +561,13 @@ def validate_usb_routing(self) -> ValidationResult: ) def validate_i2c_i2s_routing(self) -> ValidationResult: - """Check I2C/I2S signals (pull-ups, series damping) + """Validates the routing of I2C and I2S signals. + + This method checks for the presence of I2C and I2S signals and provides + recommendations for pull-up resistors and series damping. Returns: - ValidationResult for I2C/I2S routing validation + A `ValidationResult` for the I2C/I2S routing validation. """ i2c_nets = self._find_net_by_name('SDA') + self._find_net_by_name('SCL') i2s_nets = self._find_net_by_name('I2S') @@ -535,7 +611,18 @@ def validate_i2c_i2s_routing(self) -> ValidationResult: @dataclass class ThermalParameters: - """K1 Lightwave thermal parameters""" + """Defines the thermal parameters for the K1 Lightwave board. + + Attributes: + ambient_temp_c: The ambient operating temperature in degrees Celsius. + power_mcu_a_w: The power dissipation of the primary MCU in watts. + power_mcu_b_w: The power dissipation of the secondary MCU in watts. + power_converter_w: The power dissipation of the power converter in watts. + r_thermal_mcu_to_gnd: The thermal resistance from the MCU to the ground plane. + r_thermal_gnd_to_ambient: The thermal resistance from the ground plane to ambient. + thermal_via_benefit_pct: The estimated thermal benefit from thermal vias. + max_junction_temp_c: The maximum allowable junction temperature for the ICs. + """ ambient_temp_c: float = 25.0 power_mcu_a_w: float = 0.3 power_mcu_b_w: float = 0.5 @@ -547,31 +634,47 @@ class ThermalParameters: @property def total_power_w(self) -> float: - """Calculate total power dissipation""" + """Calculates the total power dissipation of the board. + + Returns: + The total power dissipation in watts. + """ return self.power_mcu_a_w + self.power_mcu_b_w + self.power_converter_w class ThermalValidator: - """Thermal analysis and validation""" + """Performs thermal analysis and validation of the PCB design. + + This class estimates the junction temperature of the main components to + ensure they operate within safe limits. It considers factors like power + dissipation, thermal resistance, and the presence of thermal vias. + + Attributes: + board_path (Path): The file path to the KiCad PCB file. + board (pcbnew.BOARD): The `pcbnew` board object. + params (ThermalParameters): The thermal parameters used for the analysis. + """ def __init__(self, board_path: Path, params: ThermalParameters | None = None): - """Initialize thermal validator + """Initializes the ThermalValidator. Args: - board_path: Path to .kicad_pcb file - params: Thermal parameters (uses K1 defaults if None) + board_path: The file path to the .kicad_pcb file. + params: Optional `ThermalParameters` object. If not provided, + defaults for the K1 Lightwave board are used. """ self.board_path = Path(board_path) self.board = pcbnew.LoadBoard(str(self.board_path)) self.params = params or ThermalParameters() def calculate_temperature_rise(self) -> float: - """Estimate maximum junction temperature rise + """Estimates the maximum junction temperature rise of the components. - Formula: T_rise = P_total × (R_thermal_mcu + R_thermal_gnd) × (1 - via_benefit) + This calculation is based on the total power dissipation, thermal + resistance, and the estimated benefit from thermal vias. Returns: - Temperature rise in °C + The estimated temperature rise in degrees Celsius. """ r_total = self.params.r_thermal_mcu_to_gnd + self.params.r_thermal_gnd_to_ambient temp_rise_no_vias = self.params.total_power_w * r_total @@ -580,10 +683,10 @@ def calculate_temperature_rise(self) -> float: return temp_rise def calculate_via_effectiveness(self) -> float: - """Estimate thermal via benefit + """Estimates the temperature reduction benefit provided by thermal vias. Returns: - Temperature reduction in °C from thermal vias + The estimated temperature reduction in degrees Celsius. """ r_total = self.params.r_thermal_mcu_to_gnd + self.params.r_thermal_gnd_to_ambient temp_rise_no_vias = self.params.total_power_w * r_total @@ -592,10 +695,13 @@ def calculate_via_effectiveness(self) -> float: return benefit_temp def _count_thermal_vias(self) -> int: - """Count thermal vias on board + """Counts the number of thermal vias on the board. + + This method identifies vias connected to the ground net, which are + assumed to be thermal vias. Returns: - Number of thermal vias detected + The total number of detected thermal vias. """ thermal_via_count = 0 @@ -615,10 +721,13 @@ def _count_thermal_vias(self) -> int: return thermal_via_count def validate_thermal_design(self) -> ValidationResult: - """Check T_junction < 80°C with >10°C margin + """Validates the thermal design of the board. + + This method checks if the estimated junction temperature is below the + maximum allowable limit with a sufficient margin. Returns: - ValidationResult for thermal validation + A `ValidationResult` for the thermal design validation. """ temp_rise = self.calculate_temperature_rise() t_junction = self.params.ambient_temp_c + temp_rise @@ -650,14 +759,31 @@ def validate_thermal_design(self) -> ValidationResult: class DesignValidation: - """Comprehensive PCB design validation suite""" + """Orchestrates the comprehensive design validation process. + + This class runs a suite of validation checks, including DRC, DFM, signal + integrity, and thermal analysis. It also generates a manufacturing + readiness checklist, exports Gerber and drill files, and produces a + detailed validation report. + + Attributes: + board_path (Path): The file path to the KiCad PCB file. + output_dir (Path): The directory for storing validation outputs. + pcbnew_available (bool): A flag indicating if the `pcbnew` API is available. + drc (DRCValidator): The DRC validator instance. + dfm (DFMValidator): The DFM validator instance. + si (SignalIntegrityValidator): The signal integrity validator instance. + thermal (ThermalValidator): The thermal validator instance. + results (list[ValidationResult]): A list of results from all validation checks. + """ def __init__(self, board_path: Path | str, output_dir: Path | str | None = None): - """Initialize validation suite + """Initializes the DesignValidation suite. Args: - board_path: Path to .kicad_pcb file - output_dir: Directory for validation outputs (defaults to board directory) + board_path: The file path to the .kicad_pcb file to be validated. + output_dir: The directory for storing validation outputs. If not + provided, the board's directory is used. """ self.board_path = Path(board_path) if not self.board_path.exists(): @@ -690,10 +816,13 @@ def __init__(self, board_path: Path | str, output_dir: Path | str | None = None) self.results: list[ValidationResult] = [] def run_all_validations(self) -> dict[str, Any]: - """Execute all validation steps + """Executes all validation checks in the suite. + + This method runs DRC, DFM, signal integrity, and thermal validations + and compiles the results into a summary dictionary. Returns: - Dictionary with all validation results + A dictionary containing the aggregated results of all validation checks. """ self.results = [] @@ -790,10 +919,11 @@ def run_all_validations(self) -> dict[str, Any]: } def manufacturing_readiness_check(self) -> tuple[bool, list[str]]: - """Pre-manufacturing checklist validation + """Performs a final check against a manufacturing readiness checklist. Returns: - Tuple of (ready, issues_list) + A tuple containing a boolean indicating if the board is ready for + manufacturing, and a list of any outstanding issues. """ print("\n[5/6] Manufacturing Readiness Checklist...") @@ -840,10 +970,11 @@ def manufacturing_readiness_check(self) -> tuple[bool, list[str]]: return ready, issues def export_manufacturing_files(self) -> dict[str, Any]: - """Generate all Gerber and drill files + """Generates all necessary manufacturing files, including Gerbers and drill files. Returns: - Dictionary with file generation status + A dictionary containing the status of the file generation and a list + of the generated files. """ print("\n[6/6] Exporting Manufacturing Files...") @@ -921,10 +1052,10 @@ def export_manufacturing_files(self) -> dict[str, Any]: } def generate_validation_report(self) -> str: - """Create comprehensive validation report + """Creates a comprehensive, human-readable report of all validation results. Returns: - Formatted report text + A formatted string containing the validation report. """ report_lines = [] report_lines.append("=" * 80) @@ -961,10 +1092,14 @@ def generate_validation_report(self) -> str: return "\n".join(report_lines) def execute(self) -> bool: - """Run full Phase 4 validation pipeline + """Executes the full design validation pipeline. + + This method runs all validation checks, generates manufacturing files, + and produces a final report. Returns: - True if all validations pass, False otherwise + True if all validations pass and all files are generated + successfully, False otherwise. """ # Run all validations summary = self.run_all_validations() diff --git a/elite_pcb_designer.py b/elite_pcb_designer.py index e60258c..4c87e37 100755 --- a/elite_pcb_designer.py +++ b/elite_pcb_designer.py @@ -17,7 +17,7 @@ # Phase status enumerations class PhaseStatus(Enum): - """Phase execution status""" + """Enumeration for the execution status of a design phase.""" PENDING = "pending" IN_PROGRESS = "in_progress" PASSED = "passed" @@ -26,7 +26,16 @@ class PhaseStatus(Enum): @dataclass class PhaseResult: - """Result from a phase execution""" + """Holds the results from a single phase of the PCB design process. + + Attributes: + phase_name: The name of the phase. + status: The execution status of the phase. + duration: The time taken for the phase to complete, in seconds. + component_count: The number of components processed in the phase. + message: A summary message of the phase's outcome. + errors: A list of any errors that occurred during the phase. + """ phase_name: str status: PhaseStatus duration: float @@ -47,12 +56,33 @@ class PhaseResult: @dataclass class ElitePCBConfig: + """Configuration settings for the Elite PCB Designer. + + Attributes: + netlist_path: The file path to the KiCad netlist (.net). + board_path: The file path to the KiCad PCB file (.kicad_pcb). + output_dir: The directory where all output files will be saved. + verbose: A flag for enabling verbose logging. + """ netlist_path: str board_path: str output_dir: str = "k1_design_output" verbose: bool = False def setup_logging(verbose=False, log_file=None): + """Configures the logging for the application. + + This function sets up a logger that can write to both the console and a + log file, with a verbosity level controlled by the `verbose` parameter. + + Args: + verbose: If True, the logging level is set to DEBUG; otherwise, it is + set to INFO. + log_file: The optional path to a file where logs should be saved. + + Returns: + The configured logger instance. + """ level = logging.DEBUG if verbose else logging.INFO formatter = logging.Formatter('[%(asctime)s] %(levelname)s: %(message)s', datefmt='%H:%M:%S') @@ -76,7 +106,33 @@ def setup_logging(verbose=False, log_file=None): return logger class ElitePCBDesigner: + """Orchestrates the entire PCB design process from netlist to manufacturing. + + This class manages the four main phases of the PCB design workflow: + 1. **Design Preparation**: Loads the netlist and prepares the design. + 2. **Component Placement**: Intelligently places components on the board. + 3. **Automated Routing**: Routes the electrical connections. + 4. **Design Validation**: Verifies the design and generates manufacturing files. + + It can operate in a real mode, using the actual design modules, or in a + simulation mode if the modules are not available. + + Attributes: + config (ElitePCBConfig): The configuration settings for the design process. + logger (logging.Logger): A logger for recording operational messages. + start_time (float): The timestamp when the process started. + end_time (float): The timestamp when the process finished. + all_results (dict): A dictionary to store detailed results from each phase. + phase_results (dict): A dictionary to track the success or failure of each phase. + overall_success (bool): A flag indicating the overall success of the process. + """ def __init__(self, config): + """Initializes the ElitePCBDesigner. + + Args: + config: An `ElitePCBConfig` object containing the configuration + settings for the design process. + """ self.config = config os.makedirs(config.output_dir, exist_ok=True) @@ -89,6 +145,14 @@ def __init__(self, config): self.overall_success = True # Track if all phases passed def execute(self): + """Executes the full PCB design pipeline. + + This method runs each of the four design phases in sequence, records + the results, and generates a final summary and manufacturing files. + + Returns: + True if all phases complete successfully, False otherwise. + """ self.logger.info("\n") self.logger.info("╔════════════════════════════════════════════════════════════╗") self.logger.info("║ ELITE PCB DESIGNER AGENT - K1 LIGHTWAVE ║") @@ -134,7 +198,14 @@ def execute(self): return self.overall_success def _execute_phase_1(self): - """Phase 1: Design Preparation""" + """Executes the design preparation phase. + + This method runs the `DesignPreparation` module to load the netlist, + assign footprints, and perform initial design validation. + + Returns: + True if the phase completes successfully, False otherwise. + """ self.logger.info("=" * 60) self.logger.info("PHASE 1: DESIGN PREPARATION") self.logger.info("=" * 60) @@ -195,7 +266,14 @@ def _execute_phase_1(self): return False def _execute_phase_2(self): - """Phase 2: Component Placement""" + """Executes the component placement phase. + + This method runs the `ComponentPlacement` module to intelligently + position components on the PCB. + + Returns: + True if the phase completes successfully, False otherwise. + """ self.logger.info("=" * 60) self.logger.info("PHASE 2: COMPONENT PLACEMENT") self.logger.info("=" * 60) @@ -252,7 +330,14 @@ def _execute_phase_2(self): return False def _execute_phase_3(self): - """Phase 3: Automated Routing""" + """Executes the automated routing phase. + + This method runs the `AutomatedRouting` module to route the electrical + connections between components. + + Returns: + True if the phase completes successfully, False otherwise. + """ self.logger.info("=" * 60) self.logger.info("PHASE 3: AUTOMATED ROUTING") self.logger.info("=" * 60) @@ -307,7 +392,14 @@ def _execute_phase_3(self): return False def _execute_phase_4(self): - """Phase 4: Design Validation""" + """Executes the design validation phase. + + This method runs the `DesignValidation` module to perform final checks + on the design and generate manufacturing files. + + Returns: + True if the phase completes successfully, False otherwise. + """ self.logger.info("=" * 60) self.logger.info("PHASE 4: DESIGN VALIDATION") self.logger.info("=" * 60) @@ -364,7 +456,12 @@ def _execute_phase_4(self): return False def _save_results(self): - """Save all results to JSON""" + """Saves a master report and all manufacturing files. + + This method generates a comprehensive JSON report of the entire design + process and creates a set of mock manufacturing files, including + Gerbers, a drill file, and a Bill of Materials (BOM). + """ elapsed = self.end_time - self.start_time report = { @@ -441,6 +538,7 @@ def _save_results(self): self.logger.info(f"✓ Manufacturing files: {mfg_dir}/ (8 Gerber + 1 drill + 1 BOM)") def _print_summary(self): + """Prints a summary of the design process to the console.""" elapsed = self.end_time - self.start_time self.logger.info("=" * 60) @@ -499,6 +597,12 @@ def _print_summary(self): self.logger.info("\n") def _count_components(self): + """Counts the number of components in the netlist file. + + Returns: + The number of components found, or a default value of 52 if the + file cannot be read. + """ try: with open(self.config.netlist_path, 'r') as f: return f.read().count('(comp') diff --git a/hardware/k1-lightwave/skidl/__pycache__/k1_motherboard_revA.cpython-312.pyc b/hardware/k1-lightwave/skidl/__pycache__/k1_motherboard_revA.cpython-312.pyc deleted file mode 100644 index 185c3a0807a180445171b7a73d20379182dfc84d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15159 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 R?@wAPqE>dJv^-kM{u_I1q0ayS diff --git a/mcp/mcp-rag/__pycache__/server.cpython-312.pyc b/mcp/mcp-rag/__pycache__/server.cpython-312.pyc deleted file mode 100644 index f2caf1654c5e2b3690fd0c30da5a009603a5b492..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14293 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 diff --git a/tools/elite-pcb-designer/optimizers/__pycache__/placement_optimizer.cpython-312.pyc b/tools/elite-pcb-designer/optimizers/__pycache__/placement_optimizer.cpython-312.pyc deleted file mode 100644 index 96afca063bd4cbffaed7090eb524548a48026634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15702 zcmb_@YfxKPp69*Nm5_u$fP{G3TwVs*1}wiJehGmwHXv+poG6{q$hsFSED*j|#6}Tq zx{|4qdt7VSbQO4eQ|4kp2=fHMQ;T-P(24)K=*lJJQ_E)Ou?B!}=Sxv(?-E zW%vI-S1)9_(>>G2=6}yU?|UA<|Lf=2%@jq(W6*&&!1|&7 zq~H(Dv+a{YaBdcIS%D9DLp;ag7`y?|2BpWZ@WM0{55rJIw*3n44Y8bG6#cVa><^2K z2Cu__Au%NQFVA5r+dl1|Ap>PY0*sxsH0+(3oACNVb2tzf<_whg!YH8C5HE(jm;Epc z^LtsZDDu;n1M}E)|L|Z}|FDy77q9sF01S+WPYLJ2GB`C}E&&*Aa_)^PB96!{v@S&L8aR8yjWYhn*KY9Ja7|sJ{<3z)VO829(5JTe#%nSTBpq zF2FSM;Zg^gg03-~lbOkI>8KD4@uat|{;|Grc^~hCbqzpXSMU5R%*=?bSk`$wGu~<5 z&vcNR3t-&n@m!np22wdi9uF7vL9%Alb*cY?tan`O8+3VKfO0Vm%;R*8j9+jK z$!ZvotaXeyhFk-(Vf2D)yx%!K=o*m?ef>_?#nGX`k%7;smpHM%yWVwCX>u| z(+5KAnoXY)PbRT*c3wbeA*2E#VmpuzsefWxlg6Ek{mHWC#ld7n+v2&Tp=QyUEZMPm zI$7Shcs5zy@}sjtRk~{7t-?a~@82r(T3eA^oH{~oI6+}+`aB8zBss3i84cH-@lRf1 z^G_E!b>WKPAe>$}m`XmL#PCih%m~S5+i_{}NMujGEnGX!PtRhdIf3uUo*Jw>V$%u5 z_+>^UB}htv$i-*+9pj!c*ToCYepxr{>g&JY81I)Erwf)^pIY7iKEaAL$kbG0tTs({ zKt!wog7eEJD>`9TP0fpElEr%#`;ujQe>AAn!V23aGzG=fOAd0f6M7NA-L2*sUc;%5 zK@P8ln3}{ejUlljh-pYn2Qe*)>3If+0q;e5?>c-ZXSO7BLKV=n6_g2B)%pjk-P%_0VRrmxG!kOG(|sq zJ|xPOnZ`Xi_%~uR6kHHB0Hkd4c)T++!4N@P(c>XoS=LMhg5Hoa_Y8bf{-Us$hNKn# z#DhTog8CO`chXex!AR0rx5?Bg(NgmVu4KiIO=d^ZT(zoR?%rhTlXVR-_1*5rOpCH! z*i7N|x&k?W(0bv@DeHwXWxX(_tXC1Q%UdrEM^=hAKp8z*GXp?ZNrn%Sqg2_)Pxxnm zTPa5=#qDGUK}^=%@Bj;vHS@{?-n=)+8$5Jm{rtQL%O?1P$OGll^sX!2L$VtQnR)~mSq-~DS&qEpf&4^3Vu!!XN;D)5B_9kXi_1P3$|t22ODCn$=1rzK zSz7+VaMIH7m}yW}0-M>k5_oPgysQTiCA$*2Tno=n7=$R`T@3Ip26&eSc$d~~03KEh zJj}@H-6blDFXaqeG5phUM&2~Vl6JQdNNw7dKwcoV<<-y#wY zr-{=;pDNNPPHA3%*72kB!la5T`-569hqjGe1*e8~I`bNV*GZbRv+vcMyiuB=4I_;5 zHSIv_`(JGXMrnajet+wgWZsq53$;UY#oza}lNxs|U&mSbdajBuonW}?51EX(x?{e^ zRx4MWvwM1jz);DtA;My~?VOz*0>%Rj7x>3z%w=b<%!`Ovxf0qlMCNCwamtkMjGs(J zo~9%J_vEvSSO`z@Gd!~4az$L3oeQzM6d6%KLHb!U5|p=q4}r8#3Ai#s7ZRK+0S}6R z^B^2Rg5VXlWoaUr)(SlE&lz7@ID{$`*2BM-KL)Zwg@7ty3dfQc`lxqzQq%$+ zp{5Wj@>wA<)->#3)KG1H)DCT>5;AouiG0LV2*Pr&!aO`Cer4_kgA}C}< zf@l8^f{hW5KxtXyc8&Cp33!^xMB7wCFQzldvqbz3mKBh>%T~Zb!pS_)8t|-?MiREY zx|uo)7yS`5Bc1@VNPVZJD%%p4y^k$>qkTzJb;8sjnHpjTKRtf`_#@N4WL4e2FW%Bn zl^x&dsIsPnsZBDqt*Io_p15ug0l*R4&O)dx7x%gx7y3Mx2K&a($VTPmO#k4(nQ_^m zyg4rPJ7m-F;D~4Zg2UOLDq4aG&Y^zC1;+@;JS6|kL5F8-)ZqltRW|nyI6VDhPRD4! zr*Cj815bH9~oEPOjy9_8XfJwKoSW0D`IE`%!6P- zVnRYhCls56G9+dsK0u|OZDP#(pm$t+8uGG3X*H;;!LGd+FHHn zdTyZfR*;9273NiYtat5l(%PD^+9a!O?POw4zqF_S!Og_L52S$~#4F!TR$7yFyApMK zq`E!d6>If|=M|*3Em>h%b;QQjRit*8WbImSNZ1D?`#`+%%~KucR5pi?31kf;+6Jv>CAU* z4bvSZ+Qt5@Kcgva#g4~MVZ@%WX~~pn34w%lSgAqlzF1tscfcR zDC^678@%9`k(oIRkrgU}90p?f0XR%;+IlMX)F2EDJ71=2J(2GrSG8 zghn6`e+T0@m~Bj=#LICxydi6@O0T-mxvj)cumQxbMe1qS(I|7rbj!4=PgL)bs`ot7 zrOuBN^0#dUGz5}Q-hv2xGBuT1dPqox^u{187fa`b2>p4g)`BXcno1iNb4sOK0M-pU z?hj!47Ssz2^p-xqIb|d22$MGF(bVl421ljODUgb$+oUnS_2?bqtb7zKF`m$634X3u-x zfFBHYyix&8o5EZ0-EbDk7DKsBE<QV64zBjQlmY=9+ud{ z->^p|V|}!5X?N0CmM}I*#)cRZn|fljZ>g!q?kydqFG=W{C0+AlT`SbXH&)WIk9AE? zP3Ai{Z{3WiPWQH5jvz&L`G11Q3guUXM~LT#sRFw@z0Y9p9*2F4I~?1~3laJ~S};u_ zXcWvxcz9hNa+`uDLG^j+T){aw3Fm+&d$x4|Ez3E(k-a>hYZ6s<6Nse|ebgP5PvwW!-i0=BDJQ9qRJV&5 zgd-K;`tOG>P^AfUF$`@E$J2d$vK<-(%HTAaLHb)c(U?)qYu>w2Fy?f$g$e&;t$`z7Pf=;@`iPt8>c^M1*^fBo>Lxd#*(WBuy5WNb

I%P#fwXC{bnc6{Wu?BVq^p_tB?Z&j08Okuh2)IQ)q`pw6+26KZ!Gw1cT@(SF zz3vZzVH=DLsFWn%D?H5~IW0#IR!l z@APHPdm?^fFDL-mm-2PZe0b!rr|Bz@kfpGzd{uePXT~gtL;8a+>!BFEVSQl#Z#}>4dDK1p9~$GWhoYtNnvs7pp^sOVJdAIO((!J zgsL?Okqoy=gInea-+^I4v#o~$H6xlZl;c!59*9G|^if#Q0-%D=0`tQ#wuPby6Vc|p z>q5A@Nr-^e51hix7n-y~dO;sT#b3$Qr^f{xeLMx}hK1sY0eXbFSum0q^u170czz>b zwZw5miqHm(v4zsY^BO5hmDFWQnj)nU(}W6O0)_Rw5GkHQ3sGJ`+2Qt^3^h;NwBc^D zr?Z?vBv{~|VZDlhY7X6&;1>0B9hbc#81iS+9=s6&O&I?gP!O&`MSz7C@{nm?4lD>F zB!&+ZI%%ZmwA}hC3j8xvOrgLA{R_k28wd)FgGPk*Ke!D2(Xu=3i_MeEW zJs;g%vq)7P>$Fs5U*{xi&!*{(DD$+uZZ#D1-n}7}w@0;L-HI`>Yxi|hxh<-NrmJ_Z zPD!1;5BnZhosSxSUDFgh_D#*cTZ2*Ok|kMDxymf>jyf@7S>6+MJ}tAX7?usIzL?|g zpiBaN z9ZUQDBK;k(2op}<2!|L!wg6;?GJrXiaSl2jF<~ z!sn@XkWSO1Ir9gN1{pTQ01|H2ya45uZ#zpQ96F*#W|RxH zSukCq-vtwEMnVQPJ_mHw>2e6MsPF)w7wj>jEi^i;L0T?a&~d8Qv<#5VsWU*Uj}%4p z1e^^KT`E=_0`r3sp!Wh$J5`&`&ptWg_@07q%MYQ3bjlym8Zjp2>lD)$PGmn8V(PF~f3hbqbrqIeFb6cWsHz0dU=|J@Lv^E4W zV0nl7(zl>^Hf!);eO|cb;tvJE0X4&W!N5jtOyLy(M167O8ESKa0|}0gh{QItVtVsq z0?v@)LLgoN9J1mm05G5wma&MjA0l}lNmei=+z3q^3UeZkHe^mVqrzY2Aub!TqeTx` zYG6VX^E8m>ot1UzWLf3A0e|zdHaIaM@*&|bvGLnLL_Eo_G7t_@!?r>Uq@aE1e`8BO zCyeB2W9z34_Zt$8N2JChj~lyRQnd9HEj4zpI+E2j_jGr4pSTh&C#04WkE&0+P*YXa z@y70`VT%-d4!orn_z+rcT0b@2Hz}5z$L!IUl&bQm#2#I>C#$MgZY5ezQBUQbFT@>Ffj)gwGdH<$VefWijvR1{}qfz}9Ht-x&f8=w(XzE&GXA`wu zx6T4*sZ3U}G4m(lTKCU>C^a6Est!lN!%?&1S@y)ca8}#kb84xUUzVt2di)WN5xC0F8RV0Vk!<#D2nNS78 zc|>lTP6KaHW?kmhwxV$7n<;~IRtJF_rW^owz&D3?Vp+T%iI-(XUr^u`ltvw8L^ug_ z68GitV1yM;srG|q<$|b^Uz;-S0PY-)i|#M zFc#lX5V_I{a(q>F)ChRQ+P<)?aeo*5ESTtYN}bNl&i+l?>2DeaZn>h4TahJZiTieE z6NvjK@1IOGAC;PqZZ`L9?tEjzvElvNxzV?|)3I#8QpvLV7%i1GE*ZbAYq-~aw>!qI z+3!!TaqITaChrF~XsNY(WBftm*OwlQKWzNvrLR2?uSv&7rPk5Sy7NoAr{=m<-$y5s zmYuQ2W!LiA=fzY*FAaux_6)sM0cQMrC-0t2)a{e%_I*>g|JJ#vbJ@DoxO6^gtX_3U z#vRe2q@{AT{ITWWDtB+{?o?vuL22i~CzgX7#&{u!pI|J3!8auzHUc0v5^Iy~t91kL!r^clN<5JhS)P8ZZ@y)C!ZyOw_i1@H04YI0}HIH`Z#6_-L#kz?A1TM%g4E(9LL++ChBRu&Y$r!oML9aowe z0HA?pPW*O-zBglG$<_o<9_()nFe0X)#iQVA5Yy@rG@%#z3RDKBkmQBe^uQDn>I;eU z6B!E@nC0I?v;0&>z|VG-GaFnA-Zh}iXn}3$LA5F{F0Le^ft4@)IHLs7RH!lCVnmys zBbeXrREwbI6yB$iBJ4n6Dhr0!^k)KAR|b2j99UWfJk1e3XMtyB#6X_bk25wf_|i9k z!A&smql>BL^q8{GtZ#RlF}f<;o^hC7nVa^`bO^kc^Ii_{Ian|7vtWn`pFaL431J&t zPaB0hRwLu==n&jD8pha#{!!P3arj|J?xnkM%{an)u91w`qPQM5Y$Vt9;KvwYzK5N| z6Foi6{^u1|R!vWbYcj~aoi#x{b*FtordwsW-7a$qL>g?n8*8&?J1t24vf8xgs41c zFos)Cm_mXYkgOpdLWP^&!~|w42nP3JqR7Y^_^AW957AzhGL;d3pVAyE?e+s8(9@}Lwiztr7g1n*=r7k3ho405q}DVc$`Wqlg1<9 zPfV7!eW70K`#aZXuFdvi@wVe}+WDx6FoeLsYX>OW6;7W%$yN z*mvsDzEhi(4r$-1HQ==?{$+oxVtG2g?^M(fuXGgfgr?mD2PN~t^>M|`1y1W9-uhw8 zg8CTV)&m}R5IHsYM-ydxrLw&s2+Vvov%&r1>ep8jCtT7ASG;5NN!fW|lHevaP>p*M z>^_Oz_YDiKwEF1a(wuCvB+DvSjLXJVA!du!tvTX5IvVdGoo3YO%v88V_uhQe~Dq^S9<#D>qFI#5q?-S$k>XO#J0h%jq^oE)J3l zqTrzn@Y}p}Xo({1`p2-CD44P^?&o4mjor|{xqUU=0V1HaiT!GCFaou=kXn&Ae$NM8qS;%$nC zfAb|b)NfPQXGozlPAUhxot2a{3rx| zwgkQp$LOH&3Cu>gGy^Xpdz^j$8H!wC4O&u~!b}rf%@IDs6s>J9%Qhpz@1F=Wcv(mI zD@d2=1)07s{53@J$32LQIcf)b9teiYOc1VA$eQc$iw9o#0+MZd#RT+oEb_NVVn{N0 zC>P!ET!qWvoLn@YiqI1xDz`W^5)_EE@?-^+GFhxFX!I#u6n_UPeg!QrQZE=S0@!zD zRDBaT54!GmC7O;%O-DAHy1%LG$x83Pw$`jRu3o;o>!YjDfp2qPlE(5oL$`)j55>$e zO>BIvZLMa#Y5mgr;KrLEp8FmgdD!ysTKxR@!^!x?OYxewo*3WW(o^+sY#Awi=^f)O zn;UCpmc%9r-6ijPa0W7m?#k~;&p2Ec+cxIDPZZ(3R&8(V*)rb=59CCySv^Y4h| z<5#A}-fs1;x;0K!(TJ_8&}C)e2ROqll0QQNXO~ibR)P#(`B@37lZv&E!PuW8*^9)B zWEzPN35SG7@+FdgK!UD1;DK=4lRffo#;Y27laG~KZUFotR1zEYK@ zA=bBMUgOvMHx8{2Nu7?k%^|h)zN8>$Yk!fZI@S`qxxs9_D;+%-Z#yS74ZWlwb*sXl zVL@FxxzYDvhjh#p-{X>Yjc!qpioYZ(SqrTXOI^KjwpXfizEnfX&Sp--3cTfRHU~L-Y6pSLFvgWXj2G7hxWQzBd6?AVovRv!`6mW-&%4 z{s_j%TyCFVS$9nN4dn^p0Te-i7SRT~rKV~6xk^tn|Hn$vP5+bX+@w1HnX3FB6nMOJ zbn6oL9R-i?tQxvwspUHg9&r6kRs0(jq;6pr+$UBQZ;@9k$*DEo3Ls zd@!5Yj8};?o{U#wlSsjuA1lenQ zW};O}aO>8&=bn4+z2~0S?SC#Pa8mG${N($E`ePLJZ}^dZEJkJb22?(yIBJICOk7^X z6wRB-i<)Q5QOk_QMCDPJD9-#5#aX`0(|gQV3Cs#GTLxw$Fgw8L49vdl@HwSlIfo+Q z1kX(R2be)#49~}Sf$3ldhsT&!{hOJK3(OcBTbg4-i6w!Z4MT@zA9Ib3ggG`57o1N2 z0w20Bo^^H*GSLifI5y9O;xREHu;Exjg!X<>VRQPGDmZ^k1R8`WxJ2o zs`eHDCgsn}Nvh6iU^udbjIb2pHA{?*@|raQvjV1;Vo=f||Bx48`9jt#u5jnf@V|SW zFtuV@p@Ny_l|1+|r9W59@MY{YMXgxi3wx4hnR;#-_gMs-qu{^-#Y@PC!e`YiA|IJM ztW88#7<|5e&~;Vh1+hz9>R1fTcIa!t3tbP>k|K6-bJ1YtvvYA-ql3XPtV}Q{Wyx615_hIC zN`X(Y9*PeswcNdC`NW}C)WFM`{&F*GmY){v0tPkivmfX9aj$&GS~#Kfn&JFEWW(Y%rkb<(!@1$E&EpL2zT@Vtd;X|ZCMoBfdb7P z<2ty`XL&%qi@beYH@@f10Po>?Va~^&S)hIbW^nSEnL7o&9LuMDXS9kdJ$M`pl?dWG z1;QmtZC84j(eV5NoQ;P((V?gaM5gt?B^4v+VVGsOFvxd;7mU8iJ{@}@9^o@>IyM`N zEk#&?5upG4Uwn?w^FFD3jD1W9vE;-v0xI7(s5K<><+FpD1JrL^NU*VlRElGU;){!5 z9ujee=jM5X&Oi0RSu2W$V?i>TAeoI;vIj8O)`}4XYzNb9>qyA$9*7_r+y;?b=*B({ z>I?=6gIXyP(s>Cc;z8s^su&~u0lzV@6^t?FJUM3+bx|t7sSaG~XBNYW(1HPf-6y%; zAD(0uS&k9I5^sRzKB=<%RQGYPeDTC0Fp;6Bf?MR}$bsrufa%2>i88vW(pfkkxTIBAmbg-dA+pcROOLQtn5RpJT>JgC4&OoERB z7K?m@!ONhQ(8&Dqg<`rN_rGW)rh_VqzT!@G6qdf6% zY{(MoKH;53gS>&IkFi6(m^C0)Jbcl37uMyP{YmV-=OXLPxyx?)#uC8 zY!P-DOqNy@0v{q6T>@qnBVjlaI*#R{Q7OG>9FpBWqx*0BU<2u;MHHcv-J0WMH`aQ( zyEP{iSnq{84c>=f!|->;eNF+*n^1;DITjUI*rCvhKy?KD6XVl?ss54iz_eE0KRrD( zHZXcK2U<2A7#jDFjOGFZmxrdt`g4IU|HO14INa|KOiWD+ZX9UO*45xA7S-@C{t0Y8 z+PV`vG*x?CK0dg~Z4Js(x09Ybuj)?7CogX`%aZ~5+TCOw`w9?F3~!mY0`l~oWbFrU zL$GXda^QnxZIE<$Z)-rFyeeOxP1c59)t{74y|?9;-zR|j&`uFuW&3bq$4z8n= zrvQFSzO#^Q48N-Ge$lYmw3*ntm8`z`%H8#%aMJ?ZT}irc5W=HdA$j_`d~+^YJHO+w z*4ku?d#9AD?v}fUw+tTKLFkCzgz39UHw$Fto=aOLTf=f7n5@3LW4CyqXVp$Ing5lo zX?Y5WhLRrc6?0lXGbIP$^8@+ry(Dwr;J<%sS)SpO^>gXYsZz>ay)mu0deka+&O2qd zxSc5%Rb8vXUrn9r_8_m$R3TNzsMU1<1tQhXo$8Wu+aHhW`-Hob<4~ZphtKYxLy_xH zaCsk5GsLf*%i}EQ&w`I@=dHNA0I>pu&ViuM3r<89jvXM*90(1NdT`y^5$_C_bcqUD1}TI7WQeBdzc% zQk##!t3Ykts1a}`yZ-@$LR@H?r{*d27@t{IO)DnOf*X4; zvo`QyJS)__%nGDo6qR1PFO4213TP1Fcngi}xWypzgK6L#_B{t_B+^2S9FbY2dCX}c zyrx?upt_p3l9z*#(^mrLCZ{#GKeVoz6ZvW8INOR@f*B`JLde6}SMt&kv;=tRk%31V zqqj7#f{k-P-HEW66KZ4}!OG>Qp|BqqP3(Kp>i}3To!&I%E0B(4jtjbxd*=kCl9}UK zF{}sWnq?A9gMe}mw#_Ccz=Deco)=*Z3au)qCs<&X3&(gd3*`+5cyCY`glX(y8SWn$ z6{esnl_G8C`bgk1bG?6Rd}RF6v@i}05FOk2$KbtiT4gYVnSdZfe_-}9alhs<;H(k- z=QP$BjfSg}(`JtFG0hAPm}Ul-L8}hV^N^naKLB_){4nDrTF6P%>;f->4UOtuWXr2Q&g^u(#qo^9Hz(BAbE z+f9C@$)9W*dPxr-Y#UIT29iyKFX^FgZIs*d^z{09#nYXv>iK*BSN2V(a^_0%#Hdm= zy5>^d&3`R!oPKd$X}_2}+ON3#f92n@%ab$8~gVBq1#^Pmp(cFbv~mqN7gPqx%{=OPAw>ZGV^r-Ku#b;an-$U z@ol&Gl@@=pWeEEj0Il%cIgGP8L zG(r!_7L8({gNlKLFfPUkSCF(H3)Ho~JaUAHx)5;>jPoI222yIuIS-FMC(0iyV4 zP<%+euBcjbrfAAhwoO+nbhTREsMa;EH~&rBFWR=f=N0dH`NFv3o!ItXRlHZ_#%uDm z8?xu7T3N5Uy>Nm&&TlEJBOeb@hJyD1g$czwx$V8Cc(2Kg*X8SXWX}f&C=^n~H8Nd& zP%JS`Ml9)Xq4NJNmK^=e`g;Y_!8w1xamfE2g6T2@vmp04fM6C%HM(G?b#r#YRx0tQ zqZVdbPd*47td?*T3aJzXYL-tt;(5pnK+p|gn80Hz=IEs6{s=^pBE;LF`yFhI>sX9n zu44gg4ikbvNHL|VIpJI0`K)lN;*67!C@ux)} z7pdh(vjnqW@%GCDHx=*9w)d{$y(>4eGAqiS1QE<8wetKp8dsa$%E>=yG9% z`CvfdmLQ#u$TIFy#k7&R=rPsvqn5X;b?4ODE2_JNglw5T@yK+|!A;4i8+7Z?ao5wlkX9si z3KW8wg98t#TCC~mS*#Utn3jdwycO*x9NALo$R)!K+UE-HbBZ+ABxWUy9D~#|xEE?c z%7TF-1nCN}34p`29zWS}vbzONKU}eh>_d!qd{QB~nGtwyDTJ3Pkkp_<;C;=x^E@7rp;SgjM8Gl+)Nv&ge zg$4g0v%Mg*85PFN331SamK#=*qnU4?>J6x#llpgijmNoGlsZEdH^_87IW|H+3?*EILerCE zsD$Uj^C1g>(oaUm-31r?Gl=%@rCYMzhq;og7S6P4U4dH`w3ma_9f;UhZ7Yx#!S9v4 z`(R^4(`bnt;j_ax&qqzH!dl4Ma+lJVj9m`dFtQp$qeQm^1gtkhI`1Z9C zTMcb=hLTIC1m6W%yLU*Oy<+A}>DY6X296vnjuk7$rz_{hXpD@VE~JEEY3h7 zSAmEG_|4nt7g2_*}ZnoDo<7U0}_QH|20# zwPHO3yqA^MY`Q3G#Uu%wm9N%{$;7fDj#*aZ38xyJo{LtHGX)W^5;2lZKYB!qnk)qO zJrF17pa(&Ll1-F4a!&s5LziI`@f;j9q5#UOK5P3~+jgl>DfK~|Yolu6=(^R)x~I{X zmB-eG)uM_g3rbPL`nhCLr`qI`+s-LX=aph6Wu>Y*QceRuzvk&I2AK^<}Wdm!p>TZ;qPblsaU;Su{{km`BAI$RA8;bkpS^@O% zwy8&st4-}2QKjkJ>*m%C&ql$E+ndKW>t*kx>T8obE-1bWn`KJt;O4Y^bVMGxEw|j+ zv6{VwI}Wj>4foQ&V$&Wj94h(29^E32a=wZe`(6%!o*b>GjWrdK-LS?{NcQntXO~0 zOst2^gsWb$K15S->Mf(xz$n#+%xU~>bAo;Gz_onsN*-57=28!exB+&L0Z3yG#0!w7 zY{4r6jl<8Zf$Hw^% z9qABL$F+g^Z9j5)t0%<#k%GuA(T6|dZ`PW2CrjE)3u`k1Mq$%&}|{Mst} zX9N3xQ8blK(w=4Xl&q;mqNhn_7a$ljYY-Cqr$z!J{{B%W>z?rJ_mdre;D;oK#^2zM zX(lI$#-t*KF}!wkqJgIcTu~>(q?rV>`BMaCt}U5MS4ReiMn}enrq2o(P?PNR8`NRK zeWNo>8!`ZA8L1R6E18MOz{uFhOn+cxV*IRBf?049nhX<53xlp;KXYgAoMw6~RraUd z;asFuL@EnlW_VxsKfc*OP(A{p4<4}&{;eVxjYD7ODnfa+mzC_Wa+UryINMYU3Nw( zJM&fPSMP5YCd($)XfSjI6{>4kb(O1yM>p(p_lVN^o_zGmR*&o&QwuAfJbLI``TK%+EDLJw(Y?zWIZEO9itK`$sk4K;OK4sT!pNF5` zlB<0$v8N91+vwT2qqLus+s@0?7hbyFO*fofXE*3y++V*VS0Dezbs}Y_O54F}a1?&( z`q=dw%2EmG4-2F}TsUHlQqsIWwaz9>TK^9t7F9j%`N^tUT=ALfXRfExM&rii=j|JH za^2}~iqE7RRH+X}(FZ0IX2{|+tkbgZyuw`gDkL`yY&OcSLA9`X{f68*th8L(GRw`Q zTm7cvtcEDfxZI{AEw)#$)-+ z6{Txb9=oe_v2y3ETpfDp;$G7Q2bQ4RBYTc1WgQ!{8xN9YJ!}5-D)v4Nt+#z1m+Ly^ z>aLfr?ku?M?N#cJ%W!{ReexUEDR9fmdm*qZF8_4-C#4jy(!OZtir z{fz>|Pn3Y6nJ(?*6l2O*xQPWOTLcU?1&Bu|p%M#nAU?;M8;iZ)9*p287O2+5Cs5#T z54wH>zq9L1xoWIc>w#SgUa2z`)|w5=M&P+~mx5}lv&`z=2)t;1KC??fHPx1H^=u5j zD1ZLmE(O(8O}({Yc>cYF~g)2MOqgLmpIYq%sJ@rn?4DZ*c&!!Ok zdNQz!@6?p(w3S&me@nqjXBJr;_tE4x8k#M!yomWnGI6pFs2=s-3_`T1PiWsvHTt~% zgT!}*F8~GoKJhpdDYMCB+R1a6EZgYTTiq_^$kv$+km5@tt7$z-(fE JLt#lc`X7q9q~8Dl diff --git a/tools/kicad-footprint-hunter/core/__pycache__/__init__.cpython-312.pyc b/tools/kicad-footprint-hunter/core/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 37ddf0b8d8423a386c0d35d736c3c2c213afef79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1005 zcmZ`%&ui2`6rN;%XMbBnyyd#!Zd&jtLc2u^yIYED5#}q|lQy$u@<8bNG1g<>kHaz4v`-w;iD0=l55uMG1f(#<_m>#<&Qy z@c{$?g1`#w&|)^USqYX{8I~;*D}@zSg;iFAHCBgp)_@J>KqvcF4x6k6TbW%6+pGgS ztP8uW2YWhJh5aQ6Y9B3lXI&pO&b~SmI>v$fgmV=O8Y%Z6i4+m;&>eF@+!+s&kVwaw zC8452$rIrd_oT=cMDp;p&OhP8%}Yf@g;Xjza^?gJe?{cxLr50_3rgez_bF8e$-)&R z=8`I&2XPd*iPY&aR+>WOGOYX+jh2q$E>0BJKJ{@Ju3ao8T}C%Nq^nbW&SD;s$h7`x z=^YMAY5Oo|bA*K?BJGc_b7n;004tofi_r6ROa_&-Q|w}9`ltQEf3_Jm-O47NX7jA) zzQD1ry>*n+-ougvMQ}QvkN0(-g^q5511s$oHS=|Arq0oL?>N?!bg9mU^|jxcPw4)1 z0Z}$kF;F#7Gf+3sFksXsng&`1+6For4hLIl4WWSh2&J9P$xxha z=~mseUz{7seAfTAN_#iCt4v5)^RyZJ3zX#3-C~k95z+#Zlt-G1=A;jd&?j)AS%RyV z-m$)$^khtYC9qsaue=vroXQyc1kG@SmxSq)dvkuG-e5tz$l{oj?UH5x e1qSNC8hr!1=V14H=kD9)AG_VO-_^uD{o_B3B{OaS diff --git a/tools/kicad-footprint-hunter/core/__pycache__/footprint_hunter.cpython-312.pyc b/tools/kicad-footprint-hunter/core/__pycache__/footprint_hunter.cpython-312.pyc deleted file mode 100644 index b16a3bcb3307ef7377dd6db9a8e25ef4aa6a8324..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14834 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%0D^CL%M^j1me-{yZBoI199D1le+u`*?Qk z#>bfZmm_O91MNr;{;OYr_bvWej%WPgC7jqfKEYozUFN>c-{ip$9Re5Q{?0tZGcLgd z?6=Lj$=j)$r!J1OGZc!<;4D*7Rrqg+K z{5!9c`^W#oiK}0taTQKf{W4PiS5u5pQ-xFPOYT0NpW^XP)t6AhVw9;-@+(9p#&tqjx83?ofJ~z!QL6og12zXCaCUhc-Wk@jVrI32j^*7soa^Y+__xonYX2?x8D59 zjjt?M@0fRhSGl&_s!cjuQm*oa;cJ8Q0|Xt*mf5btzwbPlDyv+WO_nt;K6R%&+1j(x zdLY?)V7c|+UG2lx^LEdN zW!`-0vWkU0w_3mPwIy2)L z7&DD1fPc<8GqKgLBC=L}HO|SVw|MyGw_wtc#c`+|WD85NGT(-D`}ZtRaXFy0cH-~C zzXbnM#iCd<3av6Iv}}rBC2orbbs$zA8`jCF^AJiR1F3;=0Dll z?d$67+_PE!{?0wV?#{06OujeQ{>Z5jw0~?Cig#cCpl_eIb8^!6LbrF%9)xGQI=x+c zCnr5(yt&U0Z8upo*pT`*3~6J5bz|CCVBMfL6zJ;i-0SP8=la`wx_f-5U>6#W zgk%Ngrtx@Hks>G1?tbVM!mu4+@tz+(-iyDl&v#Y{C{tv0QGBOhCyGP$fIT?bH$r8e z?CRdre)2@TZDY;T!GIcRKkj>BT2Z4DzP)>B-@Ep9b$7)(^QE5|9_hv3cjlDuc=z%4 zGpE|0^>ud7c6&Q%gNI?p2#!xgF*fN8EJrY4_=cYw>K**zi8Gj&Z{O@b+Wt=O{>jOB zeYV8$lgD}ohR^hLw-5LDzIbA2&)#@zHn0E05GD2E-~QzOd;=gO(hX$kO}FRvP`73G zOBdO?Auqd3y7_e9^Ti;rD&e3PmmB|+u>j~sNp38Hyb?Uga9OM4oF!pFxgxq#V6x|n z=Oh@~nzQCLX$flz~qqLNlD$49c9h3r}qSrlc`iRHi*<3uV!tZ_qR z`_U2Inqf@pK_thwX4qM~Q8~k?&>Z?uC6#P~*xE|pxDxf{n)Q)IQm;7i+;bym&OSW^ z0z5V{GH`ZiShp)MWwJ4j#G?+Oq;99yjfQPm)~WMB^)fX>(u+n* zXFvev7YZ<$Nfh$rjIHMTRP&qg3I&+zx|OQ7WL4Ykm+qdrrz}?u&fDqkuf8R$)OIBC zb9SU^8dhq&$r|tNShD5-B%P+6w{8E_)OEwLz%T4eZIu>}-4@N(f84xnvG=yN+}x9DJaE@@w_&M%0Ah+%0Wqb#GA(k=-K4~+nJ;A*UV!fM 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 UGmCzHdzO@Rq~jX`)%a!pAO1CC1ONa4 diff --git a/tools/kicad-footprint-hunter/core/__pycache__/pcb_updater.cpython-312.pyc b/tools/kicad-footprint-hunter/core/__pycache__/pcb_updater.cpython-312.pyc deleted file mode 100644 index 71d2e714558edc8d71081abcab8ff7900751071f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12263 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