From 960066735c0fc739ed776913dca6737512b9c82a Mon Sep 17 00:00:00 2001 From: xsxx03-art <你的邮箱@example.com> Date: Thu, 4 Jun 2026 15:17:02 +0800 Subject: [PATCH] update --- GDS_SVG_GENERATION_LOGIC.md | 2 + INTRANET_DEPLOYMENT.md | 5 +- README.md | 5 +- backend/__pycache__/database.cpython-311.pyc | Bin 0 -> 9761 bytes backend/__pycache__/database.cpython-39.pyc | Bin 5977 -> 5984 bytes .../__pycache__/gds_builder.cpython-311.pyc | Bin 0 -> 3935 bytes .../__pycache__/gds_builder.cpython-39.pyc | Bin 2331 -> 2357 bytes .../__pycache__/pdk_access.cpython-311.pyc | Bin 0 -> 4390 bytes backend/__pycache__/pdk_access.cpython-39.pyc | Bin 2438 -> 2464 bytes .../routed_layout_preview.cpython-311.pyc | Bin 0 -> 2866 bytes .../routed_layout_preview.cpython-39.pyc | Bin 1621 -> 1647 bytes .../router_dependency.cpython-311.pyc | Bin 0 -> 4519 bytes .../router_dependency.cpython-39.pyc | Bin 2451 -> 2497 bytes .../technology_manifest.cpython-311.pyc | Bin 0 -> 2696 bytes .../technology_manifest.cpython-39.pyc | Bin 1516 -> 1542 bytes backend/router_dependency.py | 12 +- .../mxpic_project_1.gds | Bin 0 -> 5474 bytes .../mxpic_project_1/mxpic_project_1.svg | 681 ++++++++++++++++-- .../mxpic_project_1/mxpic_project_1.yml | 39 +- .../layout/mxpic_project_1/canvas_1.svg | 21 + .../layout/mxpic_project_1/canvas_1.yml | 100 +++ .../layout/mxpic_project_1/canvas_2.svg | 24 + .../layout/mxpic_project_1/canvas_2.yml | 136 ++++ .../mxpic_project_1/mxpic_project_1.svg | 132 ++-- .../mxpic_project_1/mxpic_project_1.yml | 112 ++- database/mxpic_data.db | Bin 131072 -> 176128 bytes frontend/canvas-helpers.js | 21 +- frontend/canvas.html | 183 ++--- tests/layout-backend-static.test.js | 6 +- work _log.md | 8 +- 30 files changed, 1172 insertions(+), 315 deletions(-) create mode 100644 backend/__pycache__/database.cpython-311.pyc create mode 100644 backend/__pycache__/gds_builder.cpython-311.pyc create mode 100644 backend/__pycache__/pdk_access.cpython-311.pyc create mode 100644 backend/__pycache__/routed_layout_preview.cpython-311.pyc create mode 100644 backend/__pycache__/router_dependency.cpython-311.pyc create mode 100644 backend/__pycache__/technology_manifest.cpython-311.pyc create mode 100644 database/_exports/3ff6e2b43f0d43dab8e169a0b8d6c3d0/mxpic_project_1.gds create mode 100644 database/engineer/layout/mxpic_project_1/canvas_1.svg create mode 100644 database/engineer/layout/mxpic_project_1/canvas_1.yml create mode 100644 database/engineer/layout/mxpic_project_1/canvas_2.svg create mode 100644 database/engineer/layout/mxpic_project_1/canvas_2.yml diff --git a/GDS_SVG_GENERATION_LOGIC.md b/GDS_SVG_GENERATION_LOGIC.md index b1f106b..f50aad4 100644 --- a/GDS_SVG_GENERATION_LOGIC.md +++ b/GDS_SVG_GENERATION_LOGIC.md @@ -25,6 +25,8 @@ Important functions: `../mxpic_router` checkout to `sys.path` when present. - `require_router_stack` (`backend/router_dependency.py` line 31) imports `mxpic_router`, `nazca`, and the route backend used by `mxpic_router`. + The preferred route backend is `mxpic_forge.Route`; if it is absent, + `mxpic_router` falls back to Nazca `interconnects.Interconnect`. `gdstk` is checked only when SVG preview generation requests it. ## Generated Files diff --git a/INTRANET_DEPLOYMENT.md b/INTRANET_DEPLOYMENT.md index 5b5fb4a..b135af9 100644 --- a/INTRANET_DEPLOYMENT.md +++ b/INTRANET_DEPLOYMENT.md @@ -10,8 +10,9 @@ Organization : OptiHK Limited The Flask server can launch for login, dashboard, canvas editing, YAML generation, and PDK browsing without importing `mxpic_router` or `mxpic_forge`. -Build actions require the matched `mxpic_router` and `mxpic_forge` checkouts; -SVG preview generation also requires `gdstk`. +Build actions require `mxpic_router` and Nazca. When `mxpic_forge.Route` is not +available, routing falls back to Nazca `interconnects.Interconnect`; SVG preview +generation also requires `gdstk`. ## Start on the office LAN diff --git a/README.md b/README.md index cae8cf4..79af408 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,9 @@ flask ## Build-Time Router Stack Login, dashboard, canvas editing, YAML generation, and PDK browsing run without -importing `mxpic_router` or `mxpic_forge`. Build actions require the matched -`mxpic_router` and `mxpic_forge` checkouts; SVG preview generation also requires +importing `mxpic_router` or `mxpic_forge`. Build actions require `mxpic_router` +and Nazca. When `mxpic_forge.Route` is unavailable, routing falls back to +Nazca `interconnects.Interconnect`; SVG preview generation also requires `gdstk`. ## PDK and Technology Roots diff --git a/backend/__pycache__/database.cpython-311.pyc b/backend/__pycache__/database.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e1cc630b17fb898dbeb219c4d59c47a646def75 GIT binary patch literal 9761 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 delta 35 pcmaE$cT~c diff --git a/backend/__pycache__/gds_builder.cpython-311.pyc b/backend/__pycache__/gds_builder.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0debd9ad5c95083e7ea43b42426d318644aabbb2 GIT binary patch literal 3935 zcma)9|8En?6`x)2uGjIGjfo+SxhM;P5_7qnNDh>8=%iA<90`|Jg{uxL)oSsK6Nk0e z%&spaa!zi=4-rBFolYV;wW@z9rGk_4{jhzzRW?nr5<^jS8a|X(=H*atSKEoFR znE=Py0YfN=8L=Q`B(KdG!AubP1w$@`G9eBTo<|oE7H=agJ>(I343A$P!t3!)17-R` zD1`7nER!$}!P5s%7@i1;;3(m0jcgw}nj18;=r^go%>lhuZpc0*=FY zKjyBW^uT{u|6H1PLs+-gZm2FyLv@7dW@=>P=%!Fl zope$s8>y4k&)4z&sk`~Qa1yHHQDErc&KF#8!zF4ik*uxZJf+N8U8RI?Xr=OX19m}8 z({__K$u1U6!(3R=3VJc0BbM!(Mk!H}1GwhOhM~bOU5OIAOp93&6z!BCFbut~7J)oK zb{mTbRZuTF*TjlwDfSN5K^}9x5`W_CF5MMW;VOJ3P!S$N@8k9epp##n^U$g4>SCTy zon{yFS=~^#x9j0EN6mt2>0cA9G9anfe)Yv=HJ3Mtr7q{~Mb)>Y?~)U%AJ3V422PUJ~ZRRW*f2Dx;*<+c(f@Gcy+KTt4(?EWmt+xuMv=(XpXWHS_Pmx@$lzPYPlp~Ce>|2-weckhWk zC4&p-|I{hJEBPe!5We$q`&$8(eXDclh(Q)~o9w{EL*fE~xamb6)iwb|MBTm+AUNKF z3!wflN?#)1^7j(rK{^Ge@AmgBc%3Vd!%s-Fp1U#)4W}=*V>Sij*BZ z{RJZoO!K-@crH7buMm~ne`Wp}rui}s+ zq#8o1E~J{mOue^mMUU2_N1KTeR^vm>L%(b$kF~;5OnQlc0AOQM^}^3F6d7zLQV(Xn zo!MA>bi+xUZX`}OmHqct@2qZ&)#e;!s-aAEB(6J&6OF`)W_<8L>f6-D%p=~3f7pnB z*b0de&cLQN>&^w3z@UJz#!q=E% z?JB))wTElG6GkoW?s2=lIzmhB&{<<)Wmf^$6$sdHI-Rtn#KAd1D#Cuf>u{(T9z`dRB`ou|0@u(o$DwP8gP*;BM;lxu zVvT`&R{=NgUFXOiyN>Ld3LUWLp4m9qNt}8|)+7jDT*XU{?mn-u^iN)$z6`;C*OdV& zN4Y?XwxxR4kKT?0Z~?$flwPJ|ttA^OGiN@;ht4%aqe_!1~;i~uBLX-90+L90- zZt)U#3X+gr1R_3n3L-vt>SX}rZV&mADRea5{NPY4ypMx`4Wt=Qv;y#k1iK}&P6-_t zY6Tf5qmjd{5aasLfs{Wbf~0sW%KF&kE^>TuTNk`NUGN57%Dz^RalS6b`MMbA>tY=0 eC7*=3c3-$weHK E0fQGumS;CqsQl+X7`{os03GGwQz2jdR9=7V( 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 literal 0 HcmV?d00001 diff --git a/backend/__pycache__/pdk_access.cpython-39.pyc b/backend/__pycache__/pdk_access.cpython-39.pyc index 3be826e835d159b5a5ee14d86a50384c54c952ac..9c788b4eeaf1daf96bda43d7bf011acf9e50bb74 100644 GIT binary patch delta 706 zcmYjPO>fgc5UsoM#))xL5&EG?W2LoW4kX#AiOb(JF4*meeCq z-fSQ-0wEO8udDNc<1FZVs9=h zr4zb;pj%<9)P=tTsmqmr09H08?)fAXJbZrlzVH3G?|#*O)ZEbXDr4$9++H|y|5f}_ z9429(f`4}VzfKe(tv;|ky%+=3-Oq?S<4t2ig)IUFUj~}802t$7{@on+3}Zrc$-5?! z;31R|uv&vF&dDopMx9&ZT40J>@_7RbR0avC6|r`a`%76!oelq0RUVpx*WH;Y-4Rj0ZWHkG;HYSVHK(Y|tx-1LP$JWEWwCISnm#dv1~Q$AQHF^Z_kc z<`;PmNl}MRd!J!d#_l6)LK==86@(0o(?VE7Vvg zMXP{I)Xi9=xTYJLv05vXRlT%A%maZ$g_0FmdZnsqg;i|20wq?J>P6u|Z`OfLP!QV7 zMu6GC;ux`8F!wm{5XO)CG!Ee)<~6P^SfL&lLhDT4FE$$HuW%()4_j=HgJOr9ha`Jc zgmCC}Nh}Og>LTnN)`W7nE^){j9muZt*SF+DRR7-DxEUQ#2bj$buMgUa55WeHpmhuE za(Cqo`;U$qB9X?Y%X2+U`>@i?|2Cq|lAu{=`!0q5Iw8e4g7UH1Vetg`ye2Eg(B8sXjH~#*) z0xrB+B3sG|HOh(~Dp>hEe?wU%MwwW&28d252w-Korj&12O2vbS%H4!0i}#`o+~3-u z>}s#MysnmsD`;vB!V8#2m#ZZW7kWVjtUwgW?Ggl%vEhy#T9tA62Py!Iz~ZZP`wpLD zA_5J=>XdmmW!FVT2AFHQvZc~hVik%60+DTg=hSr;^|-GdQ)x{#72QxQqw+_MY!Xdj z?Aa7$(dCAG1zet`2UjxH6;jX)6}v&xqHYitcVmZ+Nhxy?H(;2qSXMU(GRoyC;$!C-r z)Rneq$sz@Fb2U3cd8YEf0=_}|W}s;{%i_V6`j+S()IW=#&AJ#U>xQ+`GCPy&Z_NZu zlL;$B<@djQc46tSf4h14iz`cC{$mLe4dgRifjiuJaVSx8A$PT&3n_ zioVBn-3IpF_gvIK14r%IeSY(R*L-U2Vs+ zop`nt|I_~U#{6?Rb$@<$VP|1)vzjE6Ys3imuY**bo?om}W7 z7h16eM;yKX-o4l}aq_7+x%aQOINcGaTjI1g0f+QY>Vsd{nSW(qKzkGR>eZ_^k-bS2 zJJRCE%@o|uj}xCp^0UDwvwZ%1_{jwhV6p#V!8~(H|AqSzkl`0@z0dc?my5HxX8$z+ z;eNrdy&deGYxZBkJ{uszxi*i!nyd%xz*|;*?X|6NtEe8dgEYwA-5coMam>R%MCi_? zJb_2wQnuEJwMM9-DqXKuZhi9QRRtTxY8n0>6!sUPmUOe1HH?tN{ zs*E{9j321Hh#N>maVDqclRB=etu4oEJ#KHL?Fxnvt%Y)vzY(@ D%Bnl{ diff --git a/backend/__pycache__/router_dependency.cpython-311.pyc b/backend/__pycache__/router_dependency.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..801b363a15ff170c623c83c9b608fb947de7dbcb GIT binary patch literal 4519 zcmb6cZEO?Cb@t0%eV5 zjVHZ5355M+;T^vp;%O53Z;FTvz^Ktr`ib>W}_2f=cLq_06oE*fBXN zv$JpB&b*m<^WK~H-hLK|1QC>fcD-@qQ^5XBKk7xQAuoOf$bFd<>BY3^?0Gdbj50sV}oe${zIPgG# zF?hX_4r($E&G1^_wwMlU5iNux&?C=?TKKk^zC5=B0BiIL+KrtR+Kb9Yh4>;fr zUazDBIEZ~c^-l!U5~bFBz?0u?zibw4Os)V!a{%muRs8;yLO!pOCB>Xk?CV$|j6$&} ziITmJvvZb`HS_a1Y-3HCF^Qro(*-@JDQec%O(W&<=A0Yyre%m}+Hk&@hG*15&d$sL zkx79%w+PWR>)C2oXNabP;<2reIXlZ((p~3Gw1PC zesNyUX0WDCO~d)Hp-t5o*YG@iVI#YgnqMM*x*P>jc&%{&s}0XH@q!~>cqWHe$5zLF zGFEBtbVOQ9VrQji|JvS%w$n3G>KQ5bjI55{xq7ef!)uN>0=2{-AY^ZSgC--WtMNq# z3~w0$H35wW1qyCgg96_*)SIfFQ>Syd_|9cjw?ID&*RiopL5hK~W-;C3MNqz>=9-l} zU9c4$s->vY7B=kEctRv$%3y>7DgqLtppyc|c^AdvbX_1bAOe!|CrM8_;^WQI`i=-@K;vG1~4xOIK?tJJ3=SYAH5zL0)(B z_0l+a_y;iS(dNu%ij|$X^0jOO9m}YBHc2fbn+m*Ewj^+qBg*SX)~N(riYCC?O%9HO z-N1&#;@BxoW9DG#(>dLkRlG}4yZG#)f)7w^Q_=JDCb1QQEi+f3SI@JrdFY^aQsh%9 zH{3XzP(39A;1VoXoLBAZt{-fQA>s{FH(bA_g8}9-bpkUwyZDlBK_}ekCCl~chJ^`u z5E6ieEUJHnP-AmDuwfMl1_whOScWc14#L2B`7-uQyP_ zPPNiXX$( zwCvkvh5nt+*|e5l3u>X}yr_9^4((D3;oVAMSs;U2Wc~GyRcPjBMYd@Os}(J}EVo+s z2b|qrr+|zpw#+T_kK3Bh2oAKpczROJ>5$c7FJUSeww}kejH%`ayiAGZNpG>yns@bb zCM!ku!A`|!qwhSbjJuMd7PD&6&zhr(D=~Lc^t0xuQtWJ;kYdYY;_l6Oj@omMnObJ! zhHD7Rwu%wPfl})$#+p81Y5tf}{MTjAi)qavfi#^E@`S=x=8;lPHzb1=#0usIn-)ka zyTxV+Bl?>vsk%IeYygfCCxt>sq(e~UOsCY2F}{bjGD_)zEcX51Itu$ zmRaA+ll7I!Q3V3iO&u>Nv)I6d<%%igEVdy@vW_ZO69S?BkA)VNFeU;lgt!4ud^vsE zjnpLRrKPSl3A++MfQBJXDs49C@g|=R!$70NgmN*7qD@ z0hob0-L3UK_io+0wHbRM{5ID5hC^&aB=4;vNlI3EF_7E{?=6S>)<;X>WI3F4!pTZ_ z&qw2T$JdUO!hJB}u=;8v7KaT3$t_T)JGp*k?d00YQut6ge8_33wXFk5wzW?>ywTHJ z?m6syXSCEaR_+dM^ECxGotXMH-7r0@Z_Wf_|stG z%m{iq5wNEmhkP?+3Ge>_Xjwo# literal 0 HcmV?d00001 diff --git a/backend/__pycache__/router_dependency.cpython-39.pyc b/backend/__pycache__/router_dependency.cpython-39.pyc index 5d1181b4a64808f0a9f0ef035a10355c9cb7e857..c8af590a640a5d4fefa82c7236f526658d6b4e9f 100644 GIT binary patch delta 462 zcmY*V%}T>S5YBAUB(26)ia!UHQBYba#ghm1CMZ_)U_qgm60_SHZIilP|3ZpTZ-Sug zQG|+5AijW}d<(yHvXr8rPr?15exMc^9T|nET$Xv0{IQH?H z&+81gM{ndt9OB1TWXUXKD*Yq=E|jNctvCu9m?Ju*fB+%nQ~T0%o{MJk Yu$oWvnOI^h4pTom1IZ1@$=&4gH(cw3RsaA1 delta 384 zcmX>oJXx4Gk(ZZ?0SNZrk;!u3$jiVQ?GrxcfDPrl6F zD#%f!2n>cIb`Ze{ByLU4PHXfc*y2*7=>h`ZgfIs_LSPeiyT?g(MmIELdT~V2)f_Rc^OPF2^#1vUEXiA{p-WUzO@gK3 z4ACV;vRVexT*E@jD!Oi1(iD+$MnT7tL8ZJx!6&hIFWj7(qa|SMGjPH=; zPYR0Gki=ve8(CTY5pA$NzZg7!a`MXP_=OKIPL6y$iOD?Cj69i~TgalV7AfEaD9vz?gersI>YTKU(8Q*Lb0FjV9D;7y>IkDq?eEdY_rWaV~?t#=Gp^-~cPSr@Jlx)j0i*s73`+`2N zXeun*MkiY|9dkp5>GF(sW6G52G5oBd>Tbfc6l$486+~f^^n+4u_^Q2c+}Ss7i`N|STIF0liaK_Brtf_J=68p_e9sosj+m|^ zE;7WeClA&Rowk!_oaC9BaAr;1QMu?LIsnor?7;)+6Cb24$id|z2903(0U&My>}-p# zz64ysYX%U+!C#{R=mH?W#aS$JjaG&tgu_4aLI3^eCcha-vrt(5R_24NCJ^keOA%YuHkoHiD; zgVVl>Hz8>C%HHBZJ4mny`wW!MUNRIcDNu&Jlu#_f_^6N3!PX|_p#5SlU6%BeLrx`_;qoqi}${l_;&A9^6 zvj$f6>C0|>!G!#WPmEc5YdeRkDb1;-3A$2C(-knuDFw|kOTGVL(^O20UP4lK8D1j0 zQL><#mgyIM9zHC(%P%T(nj1Hj9Fa8$pqo&^F_Z{BOWg1@v0NUjSt}jgQXl*Uc~+KO zp&3z=+s6aJ3>7SB2VrOPnqU3Hniuq5S5_9ypJ9OTa9ll!xI`t+`V%Bpyk3unxOg4?d$_MYWwX!PqJ+ThTnX0^kOx_h i{AzmSu}?gH(~#=qb~Ak-Odkl-2lCkR$V&(BIR5}p7Jg>{ literal 0 HcmV?d00001 diff --git a/backend/__pycache__/technology_manifest.cpython-39.pyc b/backend/__pycache__/technology_manifest.cpython-39.pyc index 8f6c75d0dd936785c3584402c1cdacbb33456dad..a833997c6585bd69feda2e5c0fd051b15c397a74 100644 GIT binary patch delta 82 zcmaFE-NwV6$ji&c00fE5vKzTw8Ko`KtYV5%3-XIIOY(~{Q;TDAD+)4`<6T`GV>Sme iu4HDsHTgG-Es(Ti4PaE9+{LQJCI{4Bq&RsOs}TUp$ru&@ delta 56 zcmZqUdBe?}$ji&c00c2UG8?&F85!j^XEUy3W{jFF%4!QFgINO@ RouterStackStatus: try: router_builder = importlib.import_module("mxpic_router.builder") - route_factory = getattr(router_builder, "_import_mxpic_forge_route") - route_factory() - checked.append("mxpic_forge Route") + route_factory = getattr(router_builder, "_import_route_backend") + route_backend = route_factory() + checked.append(getattr(route_backend, "backend_name", "route backend")) except Exception as exc: - missing.append(f"mxpic_forge Route: {exc}") + missing.append(f"route backend: {exc}") if missing: details = "; ".join(missing) raise RouterStackUnavailable( "Required mxpic_router runtime stack is unavailable. " - "Build actions require the matched mxpic_router and mxpic_forge checkouts, " - f"Nazca, and gdstk for SVG preview generation. Details: {details}" + "Build actions require mxpic_router, Nazca, and either mxpic_forge Route " + f"or the Nazca Interconnect fallback. gdstk is also required for SVG preview generation. Details: {details}" ) return RouterStackStatus(ok=True, router_root=router_root, checked=checked) diff --git a/database/_exports/3ff6e2b43f0d43dab8e169a0b8d6c3d0/mxpic_project_1.gds b/database/_exports/3ff6e2b43f0d43dab8e169a0b8d6c3d0/mxpic_project_1.gds new file mode 100644 index 0000000000000000000000000000000000000000..ad6500b185841a61eaddd54e46f0fd4b75c1b6ef GIT binary patch literal 5474 zcmeI0Yj9Q76~`Ah;lNNzL%MieOhP2cOAIGB4~>r$LxQ;pNh1V7>g14wR|td{B2p3s zf}sQ`4+$z7H35s%2ZWh6gLVcx(Bk++kTPQ3h@y_oAmWUmwhpWReNIkp968r z%kSQG)@!e|_P+as4D$J=Q%nzEuMWazVv44O?w={jXB3nyD=UdN6Vnoth&ZBW#;uLl z=N)?bTzb~NaV?L{D5992-u8)xkyB(PrJ9qiDdmNQh1R50)3lOI^S3$qR@T(~{5!4N z@3aDDAk9o6itJ5f{L&ZMMn*p$5si(Ckc(d~5ZSzwB6`hoNz~e*7U+@+S2hduc|t|kf`CEq7!Lrf`fWP(- ze#x###Q~94CThxXNmP7BAa`lYJ*q15YA#Vhyhvgnmm+&lX}L=+_v*^!+7qR=>o`P5 zF1WPgLGIF)d*pw)_9As-L=KO2*wiG_j(WOu<%h?5ufH92HjimLq6+Mgx-lWTa`Tv% zJy8&SgMXV%O+>4X>-Y{`xp#c6r{g=Uz)lQi==cs@xf}mdyF%xSzp%T)SrxQ;`;FOE zIDI_!n3IL$E!^(WId^)i^!6sQZHe7`J8GcBE2`GBXT{Mg_0l7nv$o4$rMEw=*X6G= z5XPUq3a55IfA)&qCD&rfUn5I-BK?L}OEe%jOCKgDOq@lV|!BI4O{ zm&n5_f9Tn9U>_pl*>ac2!_z*unP}Qax_%+z*VV7(F7Z69{TuAqyFAtG*t>*0jJ!>vPP^r%j~ zxt@AX@qYT-0UO4`rB&r+R#o+)`LoMvEPaE*bg6?7Exp85^o$Q>e^cHAEL%I5pS9)YIGa%X80R*1bjx+$P2^|P6OkK zxBNoXhyw7SsB7wpo9aakf01}=wy1=!i680*-UPlUYS;tB5AP9m^-{1zNe{P<_0Vw;JdI0eQKKlzTRnC-+ZN5OH#t#66C z>HzU}&AW(qyp8%@Bz_8dLv|AX33fxK67TE)`w~BW9-VxZ_|FmGM&f7sgTEtwb{GhM z&n1I>h@Zzg2A?6`Jsmtwyr%+unYe8^`2D_c8`h8h@SYm55q5LIN8o1$xEp?TUtdR@ z3E&rqn~r>Ak%tN1PP}V0xE}c>fNvt-c&u+Q@*fJ$!+JFTj`iVr>`<&1`mv~MYXF45 zmJHNu7V3jIaVJr)64Vp(@c6yp$EfFK)O#`N+=luas5|O+bqo6N4f=z**oFxo_6hn^ zguXq9el?<>6VShd;D13M`rMBGPDJ0AqTd@a2N~%9Nz4c8wFPw>^)BXP1LkHA=H)Er z2zA&z6>~KQ^K<}nmIJ0@?h-L)yD^7Y-^N7DWlzlEUqH;)hD^+B2j=uR=J$iHx%Qm< zdCj7NTZlFD(C6|I4(Fr3dHKW@`5^LKfO*avMZB;YM81`)MCGC`i?)C-5Layn8;I}5 zoaW{dSN{#{O}zM@@Q;4iybe|p--EgZ2NEy&m#Cb5#P@1WCSD5pZSeQ|H^6G*W!Og( zzb3BT2clkeyF_K5Bff7dSVnyReWJ1s6E80XQ;An#-4nJFuZ$Cwc^13?W)j!GBI?#n z#H$_>HU0$g0~UyV(11Dk%?$7ZQ5oph>PJQ0a)|g3SnthWg8u{Kh}Y~8brbs7m?i2) z%ts^kL;4EhwM#_Zu#I?KPf^!D529~r`*B`GiAsG9TrVo+80z0cRPw*UML1thcJ-s{ zoLP4m@?_YTL2nHFo`W6YuEpG?{tEHF0>1^T;2-m~<}~7AAFL@v{N2d29r>&S2O+=N zSjXMS_eQMi5b{T#8U}#ae|p`wG@}k!Pew87@*&ng1iT77f_lNfd1BksQ;3B z@I3n8fc_R?9#(_TVLtSCtgm_{=3pY`rw&|$dBQo6a}e`|b3f-R%p3X~gujJ|6U07P hkOyL4RAAo*>xk!@AnH(_0CvtZXwN - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Parameters: +x = 0.0 +y = 4.475 +a = 180.0 +width = 0.7 +name = a1 +Parameters: +x = 0.0 +y = -4.475 +a = 180.0 +width = 0.7 +name = a2 +Parameters: +x = 1660.0 +y = 4.475 +a = 360.0 +width = 0.7 +name = b1 +Parameters: +x = 1660.0 +y = -4.475 +a = 360.0 +width = 0.7 +name = b2 +Parameters: +x = 1660.0 +y = 25.0 +a = 0.0 +width = 5 +name = pin_p +Parameters: +x = 1660.0 +y = 55.0 +a = 0.0 +width = 5 +name = pin_n +Parameters: +x = 1660.0 +y = -25.0 +a = 0.0 +width = 5 +name = ht_s +Parameters: +x = 1660.0 +y = -55.0 +a = 0.0 +width = 5 +name = ht_g + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - + \ No newline at end of file diff --git a/database/admin/layout/mxpic_project_1/mxpic_project_1.yml b/database/admin/layout/mxpic_project_1/mxpic_project_1.yml index 8512327..0607770 100644 --- a/database/admin/layout/mxpic_project_1/mxpic_project_1.yml +++ b/database/admin/layout/mxpic_project_1/mxpic_project_1.yml @@ -25,21 +25,10 @@ pins: # 2. Instances (The sub-components dropped onto this canvas) instances: - MMI_1: - component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2 - x: 557.2 - y: -1888.3 - rotation: 0.0 - flip: 0 - flop: 0 - mirror: false - settings: - length: - - MMI_2: - component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2 - x: 689.2 - y: -1797.5 + MZM_1: + component: Silterra/EMO1_2ML_CU_Al_RDL/composites/Mach_Zender_modulators/MZI_SiN400_Si220_PIN_mod_1310_L1300_QY_202603 + x: 222.2 + y: -473.8 rotation: 0.0 flip: 0 flop: 0 @@ -48,19 +37,6 @@ instances: length: elements: - port: - type: port - x: 50.0 - y: -150.0 - angle: 180.0 - pin_number: 1 - pitch: 10 - layer: WG_CORE - width: 0.5 - description: "" - pins: - - name: port_io1 - role: io1 port: type: port x: 50.0 @@ -80,10 +56,3 @@ bundles: output_bus: routing_type: euler_bend links: - - from: MMI_1:b1 - to: MMI_2:a1 - xsection: strip - family: optical - width: 0.45 - radius: 10 - routing_type: euler_bend \ No newline at end of file diff --git a/database/engineer/layout/mxpic_project_1/canvas_1.svg b/database/engineer/layout/mxpic_project_1/canvas_1.svg new file mode 100644 index 0000000..da409e3 --- /dev/null +++ b/database/engineer/layout/mxpic_project_1/canvas_1.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/database/engineer/layout/mxpic_project_1/canvas_1.yml b/database/engineer/layout/mxpic_project_1/canvas_1.yml new file mode 100644 index 0000000..f890271 --- /dev/null +++ b/database/engineer/layout/mxpic_project_1/canvas_1.yml @@ -0,0 +1,100 @@ +# ============================================= +# mxPIC Cell/Project Definition File +# ============================================= +schema_version: "2.0.0" +kind: cell +coordinate_system: gds_y_up +canvas_size: + width: 5000 + height: 5000 +project: mxpic_project_1 +name: canvas_1 +type: composite +version: "1.0.0" + +# 1. External Ports (How this cell connects to the outside world) +pins: +- name: port_io1 + layer: WG_CORE + element: port + pin: io1 + x: 50.0 + y: -150.0 + angle: 180.0 + width: 0.5 + +# 2. Instances (The sub-components dropped onto this canvas) +instances: + waveguide_1: + component: waveguide + x: 686.5 + y: -1027.9 + rotation: 0.0 + flip: 0 + flop: 0 + mirror: false + settings: + length: 100 + width: 0.5 + xsection: "strip" + + circle_1: + component: circle + x: 877.2 + y: -1093.7 + rotation: 0.0 + flip: 0 + flop: 0 + mirror: false + settings: + radius: 10 + width: 0.5 + xsection: "strip" + + waveguide_2: + component: waveguide + x: 858.0 + y: -1029.6 + rotation: 0.0 + flip: 0 + flop: 0 + mirror: false + settings: + length: 100 + width: 0.5 + xsection: "strip" + +elements: + port: + type: port + x: 50.0 + y: -150.0 + angle: 0.0 + pin_number: 1 + pitch: 10 + layer: WG_CORE + width: 0.5 + description: "" + pins: + - name: port_io1 + role: io1 + +# 3. Bundles (Grouped links for multi-bus/parallel routing) +bundles: + output_bus: + routing_type: euler_bend + links: + - from: waveguide_1:b1 + to: waveguide_2:a1 + xsection: strip + family: optical + width: 0.5 + radius: 10 + routing_type: euler_bend + - from: waveguide_2:b1 + to: circle_1:a1 + xsection: strip + family: optical + width: 0.5 + radius: 10 + routing_type: euler_bend \ No newline at end of file diff --git a/database/engineer/layout/mxpic_project_1/canvas_2.svg b/database/engineer/layout/mxpic_project_1/canvas_2.svg new file mode 100644 index 0000000..30ca134 --- /dev/null +++ b/database/engineer/layout/mxpic_project_1/canvas_2.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/database/engineer/layout/mxpic_project_1/canvas_2.yml b/database/engineer/layout/mxpic_project_1/canvas_2.yml new file mode 100644 index 0000000..6d415b5 --- /dev/null +++ b/database/engineer/layout/mxpic_project_1/canvas_2.yml @@ -0,0 +1,136 @@ +# ============================================= +# mxPIC Cell/Project Definition File +# ============================================= +schema_version: "2.0.0" +kind: cell +coordinate_system: gds_y_up +canvas_size: + width: 5000 + height: 5000 +project: mxpic_project_1 +name: canvas_2 +type: composite +version: "1.0.0" + +# 1. External Ports (How this cell connects to the outside world) +pins: +- name: port_io1 + layer: WG_CORE + element: port + pin: io1 + x: 50.0 + y: -150.0 + angle: 0.0 + width: 0.5 +- name: port_2_io1 + layer: WG_CORE + element: port_2 + pin: io1 + x: 1442.1 + y: -1470.0 + angle: 180.0 + width: 10 +- name: port_3_io1 + layer: WG_CORE + element: port_3 + pin: io1 + x: 2024.3 + y: -1609.0 + angle: 180.0 + width: 0.5 + +# 2. Instances (The sub-components dropped onto this canvas) +instances: + waveguide_3: + component: waveguide + x: 1581.0 + y: -1633.5 + rotation: 0.0 + flip: 0 + flop: 0 + mirror: false + settings: + length: 100 + width: 15 + xsection: "strip" + +elements: + port: + type: port + x: 50.0 + y: -150.0 + angle: 0.0 + pin_number: 1 + pitch: 10 + layer: WG_CORE + width: 0.5 + description: "" + pins: + - name: port_io1 + role: io1 + port: + type: port + x: 50.0 + y: -150.0 + angle: 180.0 + pin_number: 1 + pitch: 10 + layer: WG_CORE + width: 0.5 + description: "" + pins: + - name: port_io1 + role: io1 + port_2: + type: port + x: 1442.1 + y: -1470.0 + angle: 0.0 + pin_number: 1 + pitch: 10 + layer: WG_CORE + width: 10 + description: "" + pins: + - name: port_2_io1 + role: io1 + port_3: + type: port + x: 2024.3 + y: -1609.0 + angle: 0.0 + pin_number: 1 + pitch: 10 + layer: WG_CORE + width: 0.5 + description: "" + pins: + - name: port_3_io1 + role: io1 + +# 3. Bundles (Grouped links for multi-bus/parallel routing) +bundles: + output_bus: + routing_type: euler_bend + links: + - from: waveguide_3:a1 + to: port_2:port_2_io1 + xsection: strip + family: optical + width: 15 + radius: 10 + routing_type: euler_bend + - from: waveguide_3:b1 + to: port_2:port_2_io1 + xsection: strip + family: optical + width: 15 + radius: 10 + routing_type: euler_bend + - from: port_3:port_3_io1 + to: port_2:port_2_io1 + xsection: strip + family: optical + width: 0.5 + radius: 10 + routing_type: euler_bend \ No newline at end of file diff --git a/database/engineer/layout/mxpic_project_1/mxpic_project_1.svg b/database/engineer/layout/mxpic_project_1/mxpic_project_1.svg index ba8ac45..66cda4e 100644 --- a/database/engineer/layout/mxpic_project_1/mxpic_project_1.svg +++ b/database/engineer/layout/mxpic_project_1/mxpic_project_1.svg @@ -1,87 +1,71 @@ - + - - - - - -a1 -b1 -b2 -a0 -b0 + + + + + + + + + + +a1 +a2 +b1 +b2 +pin_p +pin_n +ht_s +ht_g +a0 +b0 - - - - - -a1 -b1 -b2 -a0 -b0 + + + + + + +a0 +b0 +a1 +b1 + + + + + +a1 +b1 +a0 +b0 + + + + + + +a1 +b1 +b2 +a0 +b0 - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + \ No newline at end of file diff --git a/database/engineer/layout/mxpic_project_1/mxpic_project_1.yml b/database/engineer/layout/mxpic_project_1/mxpic_project_1.yml index a4bc821..0fdff0b 100644 --- a/database/engineer/layout/mxpic_project_1/mxpic_project_1.yml +++ b/database/engineer/layout/mxpic_project_1/mxpic_project_1.yml @@ -13,14 +13,79 @@ type: project version: "1.0.0" # 1. External Ports (How this cell connects to the outside world) -ports: [] +pins: +- name: port_1_io1 + layer: WG_CORE + element: port_1 + pin: io1 + x: 1699.6 + y: -1844.2 + angle: 180.0 + width: 0.5 # 2. Instances (The sub-components dropped onto this canvas) instances: + circle_1: + component: circle + x: 1877.6 + y: -1816.7 + rotation: 90.0 + flip: 0 + flop: 0 + mirror: false + settings: + radius: 10 + width: 0.5 + xsection: "strip" + + BD_1: + component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/bendings/SiN_EUB_1310_H400_w2500_L45_QY_202604 + x: 1926.2 + y: -1813.9 + rotation: 90.0 + flip: 0 + flop: 0 + mirror: false + settings: + length: + + DC_1: + component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/directional_couplers/DC_SiN400_99_1_1310_jyh_quantex_202603 + x: 1766.5 + y: -1945.3 + rotation: 0.0 + flip: 0 + flop: 0 + mirror: false + settings: + length: + + MZM_1: + component: Silterra/EMO1_2ML_CU_Al_RDL/composites/Mach_Zender_modulators/MZI_SiN400_Si220_PIN_mod_1310_L1300_QY_202603 + x: 1341.6 + y: -2103.8 + rotation: 0.0 + flip: 0 + flop: 0 + mirror: false + settings: + length: + + phase_shifter_1: + component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/phase_shifters/HT_150R_SiPPP_L500_100OHM_DUMMY_QY_202604 + x: 2695.0 + y: -2275.0 + rotation: 90.0 + flip: 0 + flop: 0 + mirror: false + settings: + length: + MMI_1: component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2 - x: 1511.5 - y: -2531.5 + x: 2849.0 + y: -1988.6 rotation: 0.0 flip: 0 flop: 0 @@ -28,10 +93,10 @@ instances: settings: length: - MMI_2: - component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2 - x: 1716.4 - y: -2293.8 + DC_2: + component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/directional_couplers/DC_SiN400_99_1_1310_jyh_quantex_202603 + x: 2656.9 + y: -1992.8 rotation: 0.0 flip: 0 flop: 0 @@ -39,17 +104,34 @@ instances: settings: length: -elements: {} + PD_1: + component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/photodetectors/PD_1310_Monitor_Si220_Ge500_NPN_XHN_202604 + x: 3151.7 + y: -2032.1 + rotation: 0.0 + flip: 0 + flop: 0 + mirror: false + settings: + length: + +elements: + port_1: + type: port + x: 1699.6 + y: -1844.2 + angle: 0.0 + pin_number: 1 + pitch: 10 + layer: WG_CORE + width: 0.5 + description: "" + pins: + - name: port_1_io1 + role: io1 # 3. Bundles (Grouped links for multi-bus/parallel routing) bundles: output_bus: routing_type: euler_bend links: - - from: MMI_2:a1 - to: MMI_1:b2 - xsection: strip - family: optical - width: 0.45 - radius: 10 - routing_type: euler_bend \ No newline at end of file diff --git a/database/mxpic_data.db b/database/mxpic_data.db index 25ac96b020d27d4b2b3008244f8557a65e1a127b..d29e512f4172091ccb222f8c95d15b402e6d5b91 100644 GIT binary patch delta 17940 zcmcgUYfxP0b^Glu>;u@<14)3i1{Q%H3uy1%2fHgk#-In1K?qictWhz7MZ%T<@zBFI zlGn-o))SALFx&LjvD=Bq=?_n*PSi{rxAr*pc+#p#UB{hvGHo-h+? zd(L<7w|iOkUKZJjty#-FAL?XNh1knS3jChu}A@W4mrne(6xP z<#`9O>>x`E$@v9y3H*7Zy9qu`zD)Vu!R_v|?os!B?g964caOW%9dV29W_MHO?FYY* z`P%iCZ`rzPUH8D@{pl+B+?Te(=UzGopL=KmKAUJ4d^S=aeD0=O;Il!Rg-@?E0H5_z z7(VNyyFP#Z2V*$%9aP zd>)e)s%|2%S$i;;2uZu-Q+~3iCi~;Im>5Z1m3AV0gU@%kQT}ls>FfvwgyuT$!sT<` zSl!Ihg$v6ikj6ZIyZu%Ef#1?q>f9~WhTcC zU?a7ZdHubE9w8LWa^andjgHPI=VlkC7iZ_ElMC|S|BQ^6g)gaIQ zjFc)r^b3hOX@~sG^W+|LBq-lbk-ONRmIq>?D1xMhr0ueAf_zs2Vn6nW0MoV{Cir0l zekCqRmGUzw(*5noPsuH3qyiqc$~0$kCtNowzFGbs<>9h3&M(^k%l@401KY9EH%gC{ ze5WL8%~-csE|~w_yi7hJPnh1tCys2tB!y8@KA)#s^H}oR50XYA%A}g?Z{n{bhGSwh zk*bqIWdPCQ^Q1glkavbiEvSVJ!0zrM!&#+3Fh8&yG^VqoP4u2w7R0tzKm03XUzI7A zg5$arKpdcsV;aJ$IwIZrO45{h@uMwT+CnrjD~T%YLmD`K$J;NHO8Fl$q;eHhIPtI~ zsMHE5KT=!yYvRq^`so&}fP_FI<(2$gK=oRB8Uc}RB4#STpR*jepx{qjmkz9Z!HAX| zCAEmuha{+J` zsol~(yuJ_2v|4_tpB$C@C&`hVkc5~B#?>P2<)?g_H~GqQq%)G}8x!D?-hm$Fzw^n3 z=>@Rry#GT%c<0WKFC@nn&QDJ*CgsgBvQ2weQ1iI72bo{%`x?Tco^A^^oDu3;Iu#V-nYSO>ntcuMdjU|! zlTstz0-fd+`F-%+d&Hn9=G><4MdaiCWJrq*-}bb$o4?v4>}_k0#m9t@e{gJQdSGB+ z?B0;yKPLG7Cy(`w^_=eO`&{M+y)|W;Hs5l1? z4~+#F*36r|p4zMcmIA-Gy9}GjsBK zg}kYo96!#jObO{2VQNg{CifTJ6|QK-tqOPf(`C2I9(2CyJmL6?qt@PM`zzb2(!VR6 zDtXTOBdf#GW4>WFlMd6rn8sI9jXS`o2Xu`3fvg1uA$kYFf=(8;pg{K8a1gwDs!Qs} z%QV1crcu`#G5Uz&Bi^&u7LyC`JYq2FFH-dmWPTvA2=a4MRnJ0BAQ}sWAPDp+d>6`q zvO&N#m2*n~7Zj1XdySbBqLIKIFjvKy6B&^czf2-+u@DeBDIHgc2xrX9#<=1^=yY>QNIFS;iE`9+P0oVm<@-MJDD(HA{Er*bJ z%t?2v9Cqb%xNQxGvy11~3K*)H)L!Wj=kEYIc*b9KK7XgW$NIVkPaGc1-2C$z3m{|B z4}XJEPs^AP0nv39FS_ZO$)$i^Qj1*H@=*WMb$~Di^m*|sMT1hT{0QL97>kLRyPM?Ke_BtQ} z^2)s|2p@2e&-KJ$3b8v z5cfm!En*nGCe5e_v_47?!6h&0!pucMAjJF-g=(aWC}hlBHfx_MTT}()nIUotWyZk# z!B{X11=R&r)>^vRiZOr{BP*ylOaQ!rS9*w(DwHJINI>TGTb4^8hw1Mw=|K*>SwggG!(UrUdD%VzItdKuMULz5DR+J4eXYOnHIhcC|Dxs1OtpS3SB@0$Wrg~3jALk( z#HITSD^?(P5E@=>a4?~B5LtngI1~%P(?Z3xNBSHWTz+?|Lq6F>j;ZYi1pwZJNF#`P zpKnzI1ltX~GJ&HZ%yZ(>unrT*t-?eoCL*`@t#=R<(T@jDuX`}0v{d7T4>kk~SRi91 z=#L3VVW==5lQ2IBQ7kSE>Ks&?wosf2SlNW6Q>f!4qV`ror@v$^8X)i|gyI zhKj$aSgN?I{LjkoDf`#5Zs-dIU3Rizr~maJAa=GxD)>hiN%)gCU?4GzZrB1j+>0{tX(GhPlG zhZ;oMKK9;_5sqLaF-$jc`DjtpO*9%($Dm-RZiTupkNSN#bctfw9ZW>13n6zvAlDGR zFbjS7f*o*nXFt1hoK|ptHGybieCG1_f*P?eUdbpRf1FTT@QhQd* zG?H4QWqD4M!DAbA7qxNtqMRlJ#6G8&mU6(NoTdVZ@+#4h7rHh@UP`xzP%EC)b8X5| z$j_i{NiBtO8a$qeW*?{K!hjm}5Mu!m4w7{bLPr`L5jE)?RHG@#0RlP1$bRXDq7E>i zVZFwts90>jXDBNx>`Q=d5$QUTHIx+`g)kYHmUS4+S_B*vFl~Bt-GeM>#id7d4x;a6 z&lC_bu!N+CneWXJf**ryrE5Cyxm!Y$86BZ?6;B%9(vLnfE?v>VnIjI*Ai%-PMI3}G zJ1#91KB%u_5LyDr%3@)_oQ}akFsbX(0v;?pA7bOm-8db}3I!TD*hMRm<`uAlgA68q zI4Pi3qV5|(b&rpHb0Gp;{zZLOFof3y5p z*)8XX&Sl5z4!iwJwzq6YOJ6RzT@tt6vbI~kY1wPOPX5yLiRtl`)UoYXC?B{S)PxO8 zh(m0~0SzUczyk?*7#}s&Pxqs3;Z)^Zqx{GHHhNQ* zx3(K#z~N~k)kN8(1~F_~g8`DyuwJ|c-T?#DZ&u1?FsS5O1d!1U8pDEt*l82j1r01@ z3ila|h6{PgFwM>=uCX_MQSXkB zNP&UD3;Xxk|pTVR9n6ytO+bQqQV?}-r-H^|*!D%F;_ zOxYR(fFIR7D$aky2h|=G4*T@Y0`9Mjw?fpTn1v_Ry_%7{nbE3(FscrF<`=xWmZy*a z4UEuToJ8+x5}DU}_pj=yb#dm`#VaN*QMOb8GU&*YL0gCoK-arHJi`#J;jG=rV@(}6 zwHiJJXwWjPRYy6p*!$OtgWP# z%c>eyx@4j zQE&fUd$p~z^lZs9*4HfmZD}-*kY(sZz5qqx_F>wE?~XkzjcA}8Y1Gp^s9Tw*yh7DZ zyl+iVJlt(){eS^dB1rXzsoIA3rBsKh=eZOR5LhqmM1f%(J;O}qh#bA2Bn;tjq%uI& zwz@C%kP7$P4ic67ZDg-8Fep$rZRbQ4cX>nxHyMFPetm@O)CU)WtkpV9)qZ*r*Mzw; zrsCZ+R)AvMfE2(%P#B?V>)e-mM7ic2P53*tBPt^=3kd=cW=|R646hUWf{^*)N*TmH z)_;ezBG2XAr>A-hR1gx^sJdh2JET=w$j8`@4K5#*>UlhDiDK>vSxrbMe)bCno{que zl;jW%@*690<;a?N5-lR0DEQ#%x@myp($RQ~kbqi&95=ZibA9X@thiaxR{k4hKPl^R zKH+%F(QVJz{@FHM`c`RU$+GorYp>;LONDuiJZt*MbR0^TRsW=R(*zR7jDB-g|INvH zr6@28uF!c^8hA}K+ttkvWF0aV1$q)-7|@{}q9a@adg|X@g!%(Mh$awP_tRm1sr(?# z`phvsgJu}e1=%U<5*P3%dSRG>iV#(r>1j^9aFu0995ZSwWew#*HIgB9^dx)f5T~A> z=`863Lr(2G`ozH)kk2#s6d2(4zTRi z*m}~2UJXIntFe8hjn~GEICM(k-TU~}H~Q|t18zFl>Ah+c$q!=s7KEU1^AKgrMp%S> z#;2Ff;z5L3R{ z=Q3)e+?-*;VO=dfs=TFVO`ju&30<3BY+;z7q`E@0dqvv2VRb9-Z6j_2lZ5UAn1hEN z=A7i4WR4SKHw|)zVH3!?hhxgu&m1O{vw?{MCdhUO?N;=3;}aVu7nq?gQ??w0dlnkG ztSL41DisAySglk}o7`7j|K@U4oG5>??E7Wi&Wz&^9sBGr+J0e+m#)AVtJ-?la@qWK z@-EqJI=zyrcco6yITQw_{^M#2|Gi(3Q9V0@1#tH5321iAayZ4#j^y* z8yiTk=-dbw?%76SJ7qf?2wYg+cOVBpG_FC5gLInTC!nZ6X7!?hObVPs0UI67bc$ohH*%%LtLLy33?azD`Bq3?4&K?hPA5vi z0HM@Q*^WqoC~PQD_=-g;K_|FCl_u5^zAfEqcy-*$Xr^p$L_dP-`!)EI4}Mw0O2^gs zt9453%MC_V9Atg~56{<5vl}FZmG#p(2cQG{7GP2BlU#O}u#C6W8FGxV4F%0V}37;TZB$C#7Q2H(lfbM1CS|LJauQ z#f1mx{Gl7}r)*G+aN1#(0X^vI0>>ltI;Zz5=}y6O!FMR(x!UP6CtTRd?;s>0YH)vt z=%XC9p7j+oRsdFES|0>o&PLZD+I(NW-c*5O0Q-HIbChqt1}_BE;bpt&H4dw7Lg~Ya z%6i=Zy~^P>kT4)H`0xb1!hwrt7-nv`p4Lk*bJ$|~!7Nz|FsHf1;q;!Z7^kV=12q_? ziyYrNt!xH@+kpdgfrD&7W{}ikzhQ*VbKqZ*DFI;|C->7!oUqpR^;|T&E!aK|;44j+ zOzuI~pH}?1!UJn;bIxZS-?M*g5856meZ1s5)_1{0cbfmmTuu&~F0G`xT&aO{6{l6S zgkXgn3=>s3%_dRkq_nE6=T-p@OaOdEQ(B!nZFF9)V1S3Urnl+jB!hZ}q`-np?oYD` zQ}M19wyt2`2t>sONeEZ8s9-Yzn)hIU!)dk{h`{SAFM^=kOK;{+^Xcpd@L|P~NN?i! ziuVC9vJbGkyE&}p?&Es021g0CD7;g5+Qs3t8e#~C3DSvl1&1p#Y{C{RR&nWa4yQF8 zLwaa(1L-mjr@5c;?226y3;+JKlLHq?6oytzC)jRaQ92P&=3KpLw)ux3#ra}LLr|V0 zX}0l)a2xPtQ>$iFYfJZ4e{5L4BO9Pb_H?OE?yBcAK*-Qt0ZrPUE6c=1`_pV)MVD#aakzp3oKU2N#BKU2H&iH+`|4^jE)wuE!tLi^>s3NcIjN*s&9(p7pxEK*)I5V_*)tvKj}}a z3ogZ_$^ZvG4Y(Uft6M9p{JE}AQ{cedhtoT`xv%5O6%f$-k+iynvLW-+ehHj?FRtjB ZF(Ztvm_)jo^P2DTYjq5T!9wTY{{gq!Z 1) { - const entries = []; - Array.from({ length: portNumber }, (_, index) => { - const y = elementPortOffset(index, portNumber, pitch); - entries.push([`a${index + 1}`, { x: 0, y, a: 180, width }]); - entries.push([`b${index + 1}`, { x: 0, y, a: 0, width }]); - }); - return Object.fromEntries(entries); - } - return JSON.parse(JSON.stringify(element.ports)); + const entries = []; + Array.from({ length: portNumber }, (_, index) => { + const y = elementPortOffset(index, portNumber, pitch); + entries.push([`a${index + 1}`, { x: 0, y, a: 180, width }]); + entries.push([`b${index + 1}`, { x: 0, y, a: 0, width }]); + }); + return Object.fromEntries(entries); }; // Generate port metadata for built-in primitive components. diff --git a/frontend/canvas.html b/frontend/canvas.html index 1b40d3b..a33f56e 100644 --- a/frontend/canvas.html +++ b/frontend/canvas.html @@ -1721,7 +1721,7 @@ Organization : OptiHK Limited }; const componentSize = normalizeBoxSize({ box_size: data.boxSize }, DEFAULT_COMPONENT_BOX_SIZE); const portHandles = useMemo( - () => buildPortHandles(data.ports, { rotation: data.rotation || 0, flip: Boolean(data.flip), flop: Boolean(data.flop), boxSize: componentSize }), + () => buildPortHandles(data.ports, { rotation: 0, flip: Boolean(data.flip), flop: Boolean(data.flop), boxSize: componentSize }), [data.ports, data.rotation, data.flip, data.flop, componentSize] ); const portDirectionMap = useMemo( @@ -1735,16 +1735,17 @@ Organization : OptiHK Limited const iconSize = createComponentSymbolMetrics(componentSize); const portLabelStyle = (portHandle) => { const base = { ...portHandle.style }; + const unrotate = `rotate(${-(data.rotation || 0)}deg) scaleX(${data.flop ? -1 : 1}) scaleY(${data.flip ? -1 : 1})`; if (portHandle.position === 'left') { - return { ...base, left: 'auto', right: 'calc(100% + 8px)', transform: 'translateY(-50%)', textAlign: 'right' }; + return { ...base, left: 'auto', right: 'calc(100% + 8px)', transform: `translateY(-50%) ${unrotate}`, textAlign: 'right' }; } if (portHandle.position === 'right') { - return { ...base, left: 'calc(100% + 8px)', right: 'auto', transform: 'translateY(-50%)', textAlign: 'left' }; + return { ...base, left: 'calc(100% + 8px)', right: 'auto', transform: `translateY(-50%) ${unrotate}`, textAlign: 'left' }; } if (portHandle.position === 'top') { - return { ...base, top: 'auto', bottom: 'calc(100% + 8px)', transform: 'translateX(-50%)', textAlign: 'center' }; + return { ...base, top: 'auto', bottom: 'calc(100% + 8px)', transform: `translateX(-50%) ${unrotate}`, textAlign: 'center' }; } - return { ...base, top: 'calc(100% + 8px)', bottom: 'auto', transform: 'translateX(-50%)', textAlign: 'center' }; + return { ...base, top: 'calc(100% + 8px)', bottom: 'auto', transform: `translateX(-50%) ${unrotate}`, textAlign: 'center' }; }; return ( @@ -1758,79 +1759,85 @@ Organization : OptiHK Limited {data.componentName} )} -
- {isAnchorElement ? ( - A - ) : ( -
- {!data.hideIcon && data.category && ( -
- +
+
+ {isAnchorElement ? ( + A + ) : ( +
+ {!data.hideIcon && data.category && ( +
+ +
+ )} + {!data.category &&
}
)} - {!data.category &&
} -
- )} -
+
+ +
+ {portHandles.map((portHandle) => ( + + + + + ))} +
-
{portHandles.map((portHandle) => ( - - - + + + {portHandle.name} + ))}
- - {portHandles.map((portHandle) => ( - - - {portHandle.name} - - - ))}
); }, (prevProps, nextProps) => { @@ -1985,29 +1992,22 @@ Organization : OptiHK Limited const name = String(portName || ''); return name.startsWith('a') || name.startsWith('left') ? 'left' : 'right'; }; - const anchorHandleVisualStyle = (portHandle, zIndex) => { - const visualSide = anchorPortVisualSide(portHandle.name); - const localLeft = visualSide === 'left' ? 0 : elementSize.width; - const localTop = portHandle.style?.top || '50%'; - return { - ...baseHandleStyle, - zIndex, - left: localLeft, - top: localTop, - right: 'auto', - bottom: 'auto', - transform: 'translate(-50%, -50%)' - }; - }; + const anchorHandleVisualStyle = (portHandle, zIndex) => ({ + ...baseHandleStyle, + zIndex, + left: portHandle.style?.left, + top: portHandle.style?.top || '50%', + right: portHandle.style?.right || 'auto', + bottom: portHandle.style?.bottom || 'auto', + transform: portHandle.style?.transform || 'translate(-50%, -50%)' + }); const pinLabelStyle = (portHandle) => { const visualSide = anchorPortVisualSide(portHandle.name); - const localLeft = visualSide === 'left' ? 0 : elementSize.width; - const localTop = portHandle.style?.top || '50%'; return { - left: localLeft, - top: localTop, - right: 'auto', - bottom: 'auto', + left: portHandle.style?.left, + top: portHandle.style?.top || '50%', + right: portHandle.style?.right || 'auto', + bottom: portHandle.style?.bottom || 'auto', transform: visualSide === 'left' ? 'translate(calc(-100% - 5px), -50%)' : 'translate(5px, -50%)' }; }; @@ -3359,6 +3359,7 @@ Organization : OptiHK Limited const forge = isForgeComponent(componentName); onUpdateNode(selectedNode.id, { data: { + ...selectedNode.data, componentName, label: componentName, ports: forge ? {} : undefined, diff --git a/tests/layout-backend-static.test.js b/tests/layout-backend-static.test.js index a2d1582..9721715 100644 --- a/tests/layout-backend-static.test.js +++ b/tests/layout-backend-static.test.js @@ -132,7 +132,7 @@ assert( routerDependencyPy.includes('require_gdstk: bool = False') && routerDependencyPy.includes('importlib.import_module("nazca")') && routerDependencyPy.includes('mxpic_router.builder') && - routerDependencyPy.includes('_import_mxpic_forge_route'), + routerDependencyPy.includes('_import_route_backend'), 'router dependency gate should validate mxpic_router, Nazca, optional gdstk, and route backend imports' ); @@ -151,7 +151,9 @@ if (fs.existsSync(routerDir)) { routerBuilderPy.includes('_port_element_pin_entries') && routerBuilderPy.includes('_anchor_element_pin_entries') && routerBuilderPy.includes('_metadata_pins') && - routerBuilderPy.includes('link.src_pin'), + routerBuilderPy.includes('link.src_pin') && + routerBuilderPy.includes('_NazcaInterconnectRoute') && + routerBuilderPy.includes('_import_route_backend'), 'mxpic_router builder should register named element pins and route through pin endpoints' ); } diff --git a/work _log.md b/work _log.md index 5d5dc75..7ae6fa2 100644 --- a/work _log.md +++ b/work _log.md @@ -2,4 +2,10 @@ 1.Fixed an issue where switching between different tabs would automatically reset the zoom level. -2.Fixed an port width mismatch in YAML bundles. \ No newline at end of file +2.Fixed an port width mismatch in YAML bundles. + +3.Fixed the issue where SVG were displaying in incorrect positions. + +4.Fixed the abnormal port shift after rotation. + +5.Fixed the abnormal position of individual ports. \ No newline at end of file