From 0e07c0167d17ac7e9200437dcc1c2398609a4dfc Mon Sep 17 00:00:00 2001 From: Yi-Hsuan Shih Date: Tue, 15 Mar 2022 01:20:17 -0700 Subject: [PATCH 1/2] added tia --- OA/bag3_analog/buf_cmos_cell/data.dm | Bin 0 -> 4004 bytes .../buf_cmos_cell/schematic/data.dm | Bin 0 -> 5420 bytes .../buf_cmos_cell/schematic/master.tag | 2 + OA/bag3_analog/buf_cmos_cell/schematic/sch.oa | Bin 0 -> 41196 bytes .../schematic/thumbnail_128x128.png | Bin 0 -> 1071 bytes OA/bag3_analog/buf_cmos_cell/symbol/data.dm | 0 .../buf_cmos_cell/symbol/master.tag | 2 + OA/bag3_analog/buf_cmos_cell/symbol/symbol.oa | Bin 0 -> 29692 bytes .../symbol/thumbnail_128x128.png | Bin 0 -> 851 bytes OA/bag3_analog/tia/data.dm | Bin 0 -> 4004 bytes OA/bag3_analog/tia/schematic/data.dm | Bin 0 -> 3524 bytes OA/bag3_analog/tia/schematic/master.tag | 2 + OA/bag3_analog/tia/schematic/sch.oa | Bin 0 -> 36036 bytes .../tia/schematic/thumbnail_128x128.png | Bin 0 -> 1066 bytes OA/bag3_analog/tia/symbol/data.dm | 0 OA/bag3_analog/tia/symbol/master.tag | 2 + OA/bag3_analog/tia/symbol/symbol.oa | Bin 0 -> 25756 bytes .../tia/symbol/thumbnail_128x128.png | Bin 0 -> 1009 bytes OA/bag3_analog/tia_res/data.dm | Bin 0 -> 3924 bytes OA/bag3_analog/tia_res/schematic/data.dm | Bin 0 -> 3332 bytes OA/bag3_analog/tia_res/schematic/master.tag | 2 + OA/bag3_analog/tia_res/schematic/sch.oa | Bin 0 -> 30436 bytes .../tia_res/schematic/thumbnail_128x128.png | Bin 0 -> 766 bytes OA/bag3_analog/tia_res/symbol/data.dm | 0 OA/bag3_analog/tia_res/symbol/master.tag | 2 + OA/bag3_analog/tia_res/symbol/symbol.oa | Bin 0 -> 23412 bytes .../tia_res/symbol/thumbnail_128x128.png | Bin 0 -> 778 bytes OA/bag3_analog/tia_term/data.dm | Bin 0 -> 4044 bytes OA/bag3_analog/tia_term/schematic/data.dm | Bin 0 -> 3668 bytes OA/bag3_analog/tia_term/schematic/master.tag | 2 + OA/bag3_analog/tia_term/schematic/sch.oa | Bin 0 -> 38708 bytes .../tia_term/schematic/thumbnail_128x128.png | Bin 0 -> 1114 bytes OA/bag3_analog/tia_term/symbol/data.dm | 0 OA/bag3_analog/tia_term/symbol/master.tag | 2 + OA/bag3_analog/tia_term/symbol/symbol.oa | Bin 0 -> 25884 bytes .../tia_term/symbol/thumbnail_128x128.png | Bin 0 -> 935 bytes src/bag3_analog/layout/tia/buf_cmos_cell.py | 515 ++++++++ src/bag3_analog/layout/tia/tia.py | 403 +++++++ src/bag3_analog/layout/tia/util.py | 1061 +++++++++++++++++ src/bag3_analog/schematic/buf_cmos_cell.py | 91 ++ .../netlist_info/buf_cmos_cell.symbol.yaml | 920 ++++++++++++++ .../schematic/netlist_info/buf_cmos_cell.yaml | 983 +++++++++++++++ .../schematic/netlist_info/tia.symbol.yaml | 789 ++++++++++++ .../schematic/netlist_info/tia.yaml | 907 ++++++++++++++ .../netlist_info/tia_res.symbol.yaml | 255 ++++ .../schematic/netlist_info/tia_res.yaml | 381 ++++++ .../netlist_info/tia_term.symbol.yaml | 686 +++++++++++ .../schematic/netlist_info/tia_term.yaml | 858 +++++++++++++ src/bag3_analog/schematic/tia.py | 88 ++ src/bag3_analog/schematic/tia_res.py | 89 ++ src/bag3_analog/schematic/tia_term.py | 82 ++ 51 files changed, 8124 insertions(+) create mode 100644 OA/bag3_analog/buf_cmos_cell/data.dm create mode 100644 OA/bag3_analog/buf_cmos_cell/schematic/data.dm create mode 100644 OA/bag3_analog/buf_cmos_cell/schematic/master.tag create mode 100644 OA/bag3_analog/buf_cmos_cell/schematic/sch.oa create mode 100644 OA/bag3_analog/buf_cmos_cell/schematic/thumbnail_128x128.png create mode 100644 OA/bag3_analog/buf_cmos_cell/symbol/data.dm create mode 100644 OA/bag3_analog/buf_cmos_cell/symbol/master.tag create mode 100644 OA/bag3_analog/buf_cmos_cell/symbol/symbol.oa create mode 100644 OA/bag3_analog/buf_cmos_cell/symbol/thumbnail_128x128.png create mode 100644 OA/bag3_analog/tia/data.dm create mode 100644 OA/bag3_analog/tia/schematic/data.dm create mode 100644 OA/bag3_analog/tia/schematic/master.tag create mode 100644 OA/bag3_analog/tia/schematic/sch.oa create mode 100644 OA/bag3_analog/tia/schematic/thumbnail_128x128.png create mode 100644 OA/bag3_analog/tia/symbol/data.dm create mode 100644 OA/bag3_analog/tia/symbol/master.tag create mode 100644 OA/bag3_analog/tia/symbol/symbol.oa create mode 100644 OA/bag3_analog/tia/symbol/thumbnail_128x128.png create mode 100644 OA/bag3_analog/tia_res/data.dm create mode 100644 OA/bag3_analog/tia_res/schematic/data.dm create mode 100644 OA/bag3_analog/tia_res/schematic/master.tag create mode 100644 OA/bag3_analog/tia_res/schematic/sch.oa create mode 100644 OA/bag3_analog/tia_res/schematic/thumbnail_128x128.png create mode 100644 OA/bag3_analog/tia_res/symbol/data.dm create mode 100644 OA/bag3_analog/tia_res/symbol/master.tag create mode 100644 OA/bag3_analog/tia_res/symbol/symbol.oa create mode 100644 OA/bag3_analog/tia_res/symbol/thumbnail_128x128.png create mode 100644 OA/bag3_analog/tia_term/data.dm create mode 100644 OA/bag3_analog/tia_term/schematic/data.dm create mode 100644 OA/bag3_analog/tia_term/schematic/master.tag create mode 100644 OA/bag3_analog/tia_term/schematic/sch.oa create mode 100644 OA/bag3_analog/tia_term/schematic/thumbnail_128x128.png create mode 100644 OA/bag3_analog/tia_term/symbol/data.dm create mode 100644 OA/bag3_analog/tia_term/symbol/master.tag create mode 100644 OA/bag3_analog/tia_term/symbol/symbol.oa create mode 100644 OA/bag3_analog/tia_term/symbol/thumbnail_128x128.png create mode 100644 src/bag3_analog/layout/tia/buf_cmos_cell.py create mode 100644 src/bag3_analog/layout/tia/tia.py create mode 100644 src/bag3_analog/layout/tia/util.py create mode 100644 src/bag3_analog/schematic/buf_cmos_cell.py create mode 100644 src/bag3_analog/schematic/netlist_info/buf_cmos_cell.symbol.yaml create mode 100644 src/bag3_analog/schematic/netlist_info/buf_cmos_cell.yaml create mode 100644 src/bag3_analog/schematic/netlist_info/tia.symbol.yaml create mode 100644 src/bag3_analog/schematic/netlist_info/tia.yaml create mode 100644 src/bag3_analog/schematic/netlist_info/tia_res.symbol.yaml create mode 100644 src/bag3_analog/schematic/netlist_info/tia_res.yaml create mode 100644 src/bag3_analog/schematic/netlist_info/tia_term.symbol.yaml create mode 100644 src/bag3_analog/schematic/netlist_info/tia_term.yaml create mode 100644 src/bag3_analog/schematic/tia.py create mode 100644 src/bag3_analog/schematic/tia_res.py create mode 100644 src/bag3_analog/schematic/tia_term.py diff --git a/OA/bag3_analog/buf_cmos_cell/data.dm b/OA/bag3_analog/buf_cmos_cell/data.dm new file mode 100644 index 0000000000000000000000000000000000000000..6106c011290fb7b1bc6cd34e5948b1a90a1a488e GIT binary patch literal 4004 zcmeH~OK;Oa5XYUqfdZuzC@--x1tkcg5TIN^4X70rREosoR9t(LtZ;10cB&qFLfp9U z5%?eoA;h7F9zf#ILq7l?fIH0C|4BPXISclI%}?<6QM5iE7V({4@TfB_zm&`b*nEgwBW!i z@b%$bKZSO&BkP;Rc+m^R-w~M~Tt%R!P#2D&qm1tvwpZPYz+MFYs|Zxf)hkh@a#e+~ za+bnn-Cf;~HDo!IZ>rVubfsLW-at!UPbw8ox+J~{IxCBDOZ(H6#p&y+>AH*4H~}65kAsuoDUiXb zkJBjM9-QYmg>(MrRLkjaA3dD!56~liQL!tME4zwaE^v%EK74ij$vR{l$CSsi+qh0F zc|R9fNg{o3QCZ#r>sef{QFBtqnwy_DNt)~AzF5bEeBbgMavzHwxv{1HfOJ4Z0qg_& zWdQp1gX7Q-fMWL}41ESSz)kQA_!X2-h*8Wl0ZxLK;pj-uz1a0XUw*caxG4K&C(1o6 z<0r75P1qAXrrpCoiU7YByc#(xYuj|cEW_nBCZ8+LT|Abzoa84eX2NaRwU~`^VPdv8UGIRd;qiHQ+XZr4N&avM2U~s!LXmeeu}TirP-d~yMv^=KX@H) z`G*XCBFa6*or+N$wxjfs@zRzGjISC-``)ZJ%~rZq-)dg!q-hx3iz!a#Q`krO*@o$5Hr+Q?wUIa?Lmp{MjzcG6jLP3(3|YO6q}J~_+_(q1Rl$_Wy(J3}KDV$&{>8#A8&Puw88b@KFC wI^+0$NhOhXQ*tm1&R-1yMZct4Nn~7I+x?ZZb&?-m3UsumJ$m?DH0l5OccwN;iU0rr literal 0 HcmV?d00001 diff --git a/OA/bag3_analog/buf_cmos_cell/schematic/data.dm b/OA/bag3_analog/buf_cmos_cell/schematic/data.dm new file mode 100644 index 0000000000000000000000000000000000000000..65edcd93bdc04f8aa419102cd3745c243c874873 GIT binary patch literal 5420 zcmeHLOHUI~6uyO0MDc~FprB*%(JItw!TMG-F=|3|tE*aOnzl(_X$z6Wm2qd>`(s!b z!-5417cN-1HSq_y*YnMMXDm(e5lLJ)C;9T-=eg&eIk)%R7Vk|(228(EDN13VAi{?8 zyV$R^O4prcgH7I`BXquw4>|Ne=z-7!p$9?_gdPYzuyY>B zq%t!N+fG~crj=i;FBbyUF%vWSK4UVORMt+}nM>^P>n+>9>^D@(wWa5|W~org+PUnU zRdk$OHZ_~loCc$=bMEJ{mrqd~dj0+xc(35GK=UNjAxyi>e!prCkPnha$cMFI;n`D&-;(WpKl`MKC;I90P8XGAX($L``qaLtM@U^B1Gd7cO*prpV7GV zTYsEq+_8TnJVt>EHCy9+l|8t_am2J=eXsL%eD{8J{yXYfBYV!5@&@ahWYx1BtAAG2 z5YFo+bnB4L_~6%Fhy9Z>0Are%EDdj@GNF^CDUpb`TUF;#Ivcm*HK&wYsw}s2)x0Cs z)=G7;UWq4@GU)D|`?*H5T*atry*1~J>l~BZ5jED9l^Q))>Sc`>-C@jDEj{hsI^_2k fYPIt literal 0 HcmV?d00001 diff --git a/OA/bag3_analog/buf_cmos_cell/schematic/master.tag b/OA/bag3_analog/buf_cmos_cell/schematic/master.tag new file mode 100644 index 0000000..26be1be --- /dev/null +++ b/OA/bag3_analog/buf_cmos_cell/schematic/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +sch.oa diff --git a/OA/bag3_analog/buf_cmos_cell/schematic/sch.oa b/OA/bag3_analog/buf_cmos_cell/schematic/sch.oa new file mode 100644 index 0000000000000000000000000000000000000000..27cc839cac9a22feb81b1c409500148ea25d5dd2 GIT binary patch literal 41196 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 literal 0 HcmV?d00001 diff --git a/OA/bag3_analog/buf_cmos_cell/schematic/thumbnail_128x128.png b/OA/bag3_analog/buf_cmos_cell/schematic/thumbnail_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..063aed702ba51141c8ff03b40f5e9f9938453b94 GIT binary patch literal 1071 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9Gmi6G3l!hU%s0|WCz zPZ!6KiaBrRdQW;}AmHLHT&!aDrSEishTh@6n+57$nPyMu%}G{Sa_VG_U{{>O>`i}S zekpV(q+Mjut*>HN_@%^nVj{y64~8NY21}s^8BT{j7KP{e?-{Blo~vuk3;fb<#C&GC z-OS}qFIggX-B=^UqHJ4k%EF`Xl4n$6jRqcxl9(6L#UvyZ>da`%3@x>KMo!zP)7PYrg~!FTJPs@vl!L z@wA^dsaw9|48!at1;0{V!)vvK?us2H?+?1oF8g+&LCj%_ zGUJIxu?Nqkc7NY+@w%uJx56ompmJxLaQVsU1=su^)xG{4HP`+0udI2D*PfmEX0!VH zyXx$-7jI*je1Nho2PfD ze5+iVr+ZUt?X^3HPF_-t+c~3J_d?HoJwwgt_qK75Zy%4XdOz>{>Owiwq&&g;btWen z)(YR=Znyqw<(4)2yv!%DIj;F@#*Lomi*L#%cci5)zffEGYq(z1Zp1-_*?`X7*HP^oMW+tRu!bzUw!Te~S>Ivp-R*ndKDx{G!Y@Jd6vKnshM;5J=c+!Q zJ;5q)#Mhzf(w^`3nQSwp{VUmdE^uxr*%+xBAe?Z=mtif#BgR-^g=MHI7Z@EtzhMgq zW?hEYQU7K+U_>I{mrVs<-bUIi;BnyF!XQ`1?arRvF7Sa@(iWIFI3Cp1#1-luxW+u^ z70a~CwIUm~3V%Oudh4you6JVp>@UYQn8q0$$WhNrZ77QAXL1Ts<55b97v5c{$hCgz>IMb7ci$~FxupZ_XDk51j%#|r#H^y5PAxU eA&4*P7!RK5oSY=>e;il>FnGH9xvX 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 literal 0 HcmV?d00001 diff --git a/OA/bag3_analog/tia/data.dm b/OA/bag3_analog/tia/data.dm new file mode 100644 index 0000000000000000000000000000000000000000..b7bba22729a6dcab308783f2d825716d5ad00af8 GIT binary patch literal 4004 zcmeH~y>1gh5XaAnodgJ9!JveISREg-QLv10qLh(h5RojfWC^G+=exCi;(T{HpCcEP zlsp8lKuIM|Tb##>R(tpB<2PPi)A3RVhl<>zqP4t(~BU^Y|%x#4f6iisZnN;)p7;F8hf6BX`2z?uW7SMkXh?xm;Is@t zziDs*`ZOr(e!@bZ!9DN`_!ayHN?^`oo-DWsuE5aZ*nKy$A5IZj;^i>P{VM&l*iRY? z(TlGqJRT45XThhDv$AtQ_uD!w-eGbWaqi-=9CDJMsG1aROMWwAu@pE3O1x(v&w#U_ z#P9gIkuxiKl+Pj;iA&CHT;%tv#N|*s%!^zf``IeZe@q;sQGYR8;`}{YIQMc6miDpZ zndIrDD<+iv%J>gSqhWjm6X#QX7xEq`>mEk&Pj1|Bj2Ez-Vk>fK5)*uPP#MJs@8bu* zXuUM8f^=XY-q+9Mlna@l`%XJ?|j*e8$+zxzG(L1E~lS+l(^*U=@ztK$?f=NF& zH1o&mhFg^i&?vG35s=ci5o&wl|mBw8r| literal 0 HcmV?d00001 diff --git a/OA/bag3_analog/tia/schematic/data.dm b/OA/bag3_analog/tia/schematic/data.dm new file mode 100644 index 0000000000000000000000000000000000000000..d25e9a08d6894a0841b981b9da470eef1abc82bf GIT binary patch literal 3524 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 literal 0 HcmV?d00001 diff --git a/OA/bag3_analog/tia/schematic/thumbnail_128x128.png b/OA/bag3_analog/tia/schematic/thumbnail_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..ad921c82c539abbc2941cc5b210ff9ba1b5aa110 GIT binary patch literal 1066 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9Gmi6G3l!hU%s0|WCN zPZ!6KiaBrRI2PSe5O9rNDU)e-?%ed5&Sz8i6q^;RS0-vt)ZCD4aNYY_Z}@m4Ofz{M%K-)Ii-51Z>cm)WQM>5JuEXa3$_a59c_ zD??gu{Hh;czUyk&SWh#%d0D07;KyEuOx0zg(z@y&vcB9pr?kk{nU-N&uY9UfvP(QmN<-=X@tfD?taUm6@xH~Y6>SZ*Kg@fX zejodGg3-4T_<099d&8{ zNuJ2pZx!n&eg2VMI@7xRoVb#cF(aRJlK)HZxe9AvxIU?W`bJx;Hr89~jhJKE{&*Lc zs5RMFN+zuTe#L8rki+MxbvYapYc{1DtPON!;I49On3eJK>#ndvFWVSGSvD+4XE`Ao zuJTNvpsV(=%gkc;!xou+hP-z!FPbhVn=i5@TU>O7K8q=DPTc2@g6kMNOm+sX5@Sfy z+;Q}NWTHmn`>X{IzpUq8?83!bx4LoXsW*Ffm4$Ab=VbCq=j=LW9@n)MaTix6rgv_a zx-oezld0%V)uhP+SyDUh$^BjI^W-QY^Lkd&RQ*JMX7*#R_>{RA&Xx54irmQM zcIY%mz=5n;qO#CbXOghw?Ym`S54@ab*q#uavyxTexQ{LGmszKJO^GP{(Q zUhLX1t1G|Iy#IP(Z$bPG1MQbg=PsUKEI+;5@rf2J39Daw{4nf^S<8#P-xJP1j!W=k z+@ob%k^Fo{FvEJ^dF*#$s{9y>q7R*^xx;P1$pX&@XQs1E+g3F9>khUZ>pe`h<5m|m zhX220bp0;_=jsoA3zV0gW85S6PU7XlNg&5Ta!s&$;}Z!tDr6vdE}X-EAyW6m`HE~A QVCHA=boFyt=akR{03;l|W&i*H literal 0 HcmV?d00001 diff --git a/OA/bag3_analog/tia/symbol/data.dm b/OA/bag3_analog/tia/symbol/data.dm new file mode 100644 index 0000000..e69de29 diff --git a/OA/bag3_analog/tia/symbol/master.tag b/OA/bag3_analog/tia/symbol/master.tag new file mode 100644 index 0000000..e1024da --- /dev/null +++ b/OA/bag3_analog/tia/symbol/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +symbol.oa diff --git a/OA/bag3_analog/tia/symbol/symbol.oa b/OA/bag3_analog/tia/symbol/symbol.oa new file mode 100644 index 0000000000000000000000000000000000000000..de8bb46b344710dbe72e65b0f210aeaa620cc1c7 GIT binary patch literal 25756 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

KQpnCksjjTG-^RTM${`6z>r%@ zEc~SS_wwsC&!xs$DqrhD>qO-xL+OS5Y|NSbGFMjeV@0*2c2!^NM*r^2dr`f-+Eu?o z)st???rGezlkme4gsL}Pj9Q!g6~o|I-0ug$mvmaZqcyILyxl6=?L+^(lX8UZg6}|5 zW+AejMdeG`FEt>$rS^BR;k`ty|NW%X#D1de+gqe%$4bdpV;B1Kruq$R*M>GD0nMpN z-yX4pQLm$M@0^hje$kHf8EFVe$NZ?1nX(%*^&CKB2a7WiG=9z3N+v9{#_@_k{i&S4 z?&I`S=K%SO+Hd{yLgAdij-=1}{k7hkh_4nhvYM#(3hPPhJFjh|_Yu>?UZUPhWJ%|U z$B4&?=Q-dDM9C=*wH|zXCOWQOTzU)TqI}KAOw9ds+Ccx}!C!wxdCnIo`u5b(IO|x* zPY@ru9%tWMLTnEMr^3v?=+;)bEg}eVgCu1Uv^6CR^(=#dV;5-Naho*U85X z;w|DB@jmerVlDe!O!U{ce$T0K#-Y}gQ2UTj=|Z*BL_Yk@;-Qp3n>(;UR^&rCk%~Rw z4#pOtLG88hb_WhR=n5AzqDi*W@^9l&sWpk@5C3!KW=|k{^O$b;5-|`Q5Mnf u*Wd37jvDn=^)IlUi^NOB%S6~p1oaz-(py$@{D>#ixAafV`(gY4lKd}((rnZK literal 0 HcmV?d00001 diff --git a/OA/bag3_analog/tia/symbol/thumbnail_128x128.png b/OA/bag3_analog/tia/symbol/thumbnail_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..f67e22e77f395a74e92612a5e8b17b475db57eee GIT binary patch literal 1009 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#Vf4nJ z@XY~XM)oPecNrL%Cwsa$hE&XXJ2$&;v4H^F*{r@T>8BQc^Vuo=B!xvYk13zExW!$^tRJHf#wJ-XW7-TpZ+?ftcWGL9c zq_b~t{O$WL8<;xyg&6u+8k89ycraKH!94efVw6o6QOAQJ`yXGaWg1 zYpP80CgYm&4Z04iFR!nYS-|nFpXFHJ>FILEcP?g`yyi=?3=2oBLc^}!S3h|k{@hp` zzv4c}O3SVCjB~QZS=SvaeYc&X+)q{dc|mHx1u^ZNAGLg@*W4A^DR@vI`@!C~i+`2H zRPdUF@2V|6Q~lpwwSVSwxy#?rbKCAeVisy4K4I2n!ypI!b>DvMzUp$!k|UvP5ZrFAGyPm>)3xYZMpILz0aSN8)6GWU$FcAnfGb+AHLOhHD_rx zxnu)<1B*czbE9rUm(%LxXa>>Nu;bep&TXB_pwaYpvZF1>RmOReOXL*V-yS(2m9efw zdZkKEJfGOF`9ZfAPcmqJ5~F`%b=FRXN~S9(I{o7}m(DvE**)dPGCtAs#Y-Ec%AZ;+ zZ@eRt@PJRTcu9lYLsRu9?Z4QQdR9G{_T(BnpV7<5;jG(l{a)C*a2soe<s-Iv)HvZUYuGcct+^wwQ1*QNoPC$xFLkzMFlL>S)O5ulol8L4 z(p2t_$b?(dCM`{Ovlm~=keIVx+1!=kq7*oAUVb+%*t9uI`Evb7=IDyZEH6e-nnVvb zNJ_;jI_GGuS93wk-pog9i$oFGqB)kOi@%GZ;2*O|)d4}lO~<|f^DKj>tDnm{r-UW| DhGw4= literal 0 HcmV?d00001 diff --git a/OA/bag3_analog/tia_res/data.dm b/OA/bag3_analog/tia_res/data.dm new file mode 100644 index 0000000000000000000000000000000000000000..5d0fa40bd9c4278a60a790e063d1ef9d6cd58405 GIT binary patch literal 3924 zcmeH~J8u&~5XaAXI6T5D1QcFkbp&K1u#5rIBE_IYGQm>BqYLM|wSD4zce*=ADFPJ* zB_D*6G7=ONDN;~Sq@bkW15nYx%-w&S$WjnO5G3T4&cB_R-JRLJ-Pv>d&V}5#F=|M; zMU}(!~ zB+EO1$*`SP%}Oj|pRPa@7h{frGVr^_4iQ`sAY# z>6W{y%*Uo8cisDuqa#%??=37oSTdE_sHb>XtC>Y*)3hl{KUt)X%8YwW+l}m=o0!Vi ziAMqQ1hmtOw6gq|{LE30M&x#j#v16im*j+_#mJ_Q|l} z26>6ROytg6D6V@!{cgG4Y6bP$otiWSW27hV z-~9?;pa1@G4TP*gW2IA+xm3&1e+qwWIqhKP$a(S%St8Gp=g0-}0trC+AfvcF;1?th z`VXmvP9C)n^!~VgeTxlV~(AaByq7i0J1$bSY$w(@2YbsuYdiSOf) zYFEss{5KImdMHKs&FrK{{@qAF@hziBUzL~8I28T9RbIN*{qLD+ujWIOpV4TZ+*Y1{U=K7H zTC9G>Uh_46{Cze56W94nrop%MUD|u3)|o`b=Q+nu0{oP(2lIoc>vDo)u3I+jBaOAy vv{b8=hYy|vgQUArDOZwc7z{U?y|9^t)*NnatoP%}%8D_e9j(3E_Wz$h9b09{ literal 0 HcmV?d00001 diff --git a/OA/bag3_analog/tia_res/schematic/master.tag b/OA/bag3_analog/tia_res/schematic/master.tag new file mode 100644 index 0000000..26be1be --- /dev/null +++ b/OA/bag3_analog/tia_res/schematic/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +sch.oa diff --git a/OA/bag3_analog/tia_res/schematic/sch.oa b/OA/bag3_analog/tia_res/schematic/sch.oa new file mode 100644 index 0000000000000000000000000000000000000000..b99df19dc2e64c53fd35f93d9307d81a4740caba GIT binary patch literal 30436 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 a;nZ&&N^V)r@j*19zNKF`@5k-`Z~K23VwTPT literal 0 HcmV?d00001 diff --git a/OA/bag3_analog/tia_res/schematic/thumbnail_128x128.png b/OA/bag3_analog/tia_res/schematic/thumbnail_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..c87ee672ca075e16bdc668d91868883560a5e27f GIT binary patch literal 766 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9Gmi6G3l!hU%s0|V0r zPZ!6KiaBrZI_BLr5O8}Kcu~3Z^1CWY`Bl?TZj!#Q8O!1pdc8~~=u*ayd+Z#J6BMSM zy?=P2LVK{wp7ss{rq$)I>HF?7 zf4He2-4wH%E#c*ZFy4dTx35b7cYPgWgw^re+)q5?SuK9-EaN}0nz8J|XW1Y|nHQgn zBsr$<;|W>!C3OMg$*KFeIt*B5?%`vYzKbX3Q}J8vQppz&o?E-}FR+PYZxTO|DC_T z=-lFF#v6xhIF33M+<4B^RwDf)so5@_A&SS~gLxcRTz1^M_tgzeZy2jY=lxe+!*E+G zLhub^lt}&c^O20#w0`K-AC+5hy*bOE-tm0h*2`QQmNs2ID7WBfmt4YI^^W@gHrvuH zSl4V#_@M2}C@BB@^~ItX{h!Y-RNi1d01U6{2Dk6}QLQ`w32HOUVQesFC}3M~QAE)G z-o3rr5nB-f3YB9x#{kj=4&^ z2Ftfu;Y_m~Ivh{cw}>X}ZF>JH927wJZSQC%cwawVAKWzCz5m5zxdlP28`y#R**>V% zvcKNczPo+370~g*H(va6wXWX$y+;)0z6&Sr9yVoxCLc`yfZS-_av+is>{w7Z)iZb= X&vWbF|N9IuK{I%|`njxgN@xNAO_Dzu literal 0 HcmV?d00001 diff --git a/OA/bag3_analog/tia_res/symbol/data.dm b/OA/bag3_analog/tia_res/symbol/data.dm new file mode 100644 index 0000000..e69de29 diff --git a/OA/bag3_analog/tia_res/symbol/master.tag b/OA/bag3_analog/tia_res/symbol/master.tag new file mode 100644 index 0000000..e1024da --- /dev/null +++ b/OA/bag3_analog/tia_res/symbol/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +symbol.oa diff --git a/OA/bag3_analog/tia_res/symbol/symbol.oa b/OA/bag3_analog/tia_res/symbol/symbol.oa new file mode 100644 index 0000000000000000000000000000000000000000..4b4d3ec9ff92c43c69f8eee2aae7879278dda1a0 GIT binary patch literal 23412 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 PO6?4uu6{1-oD!Mh z@Kv}X4jef2&;th!J@5he09-i1jQyXqic|zhv=Zt{_HSqQF|*^{*`)jMYGJ|{H>BLB z%1L?(P}~47ftSG|I04RqCGZ+J30?t@fm2`^Y{*2AWqt*@2l`+HZh${fUPCs<@=6a5 zya6{)<@$NFiyc|t62^;ODE=Oi`N0hYY96xi0XoX~kzt48VFV5%@LxrsR;}HNEbF!k zV`Z;~YkIi4l2I~j$~U!IwQg0d+C8-7a$;GWbgB4WFj!xSd)lvCEA_jo>o_a*>Yb{U zH)n6juW#pGzFT0`o4a(sti$C^Cg&B-T|Abzoa85}W`*0b-$c~$l$=Qb|#yH@sPuFdlz*GGQdO7m|M$7tAJ+?IX*9xa@EIabm> zay+v-N$ed8c`Gkfveqh&$~lJ7L^k4!pD# zhfX%g4Ff$CB0IMGI@NKKwUNPybG9n?Ls$DvdsX{wohs8*Vblt}AlcUDtbrse%fg8yWM7um+8I8tSE<~ zKu!ngW12^q$zav-VrSr`rV4cGlfS$k?G9qC>>weti!`DYd;JP|vFQ2-;RTs(lcTTF wMcel)Dv7j{l7Crf{$&6t^cB@hBG1u{eP1^lr}Ecd598?oxb*P(>C*rBpEXritN;K2 literal 0 HcmV?d00001 diff --git a/OA/bag3_analog/tia_term/schematic/data.dm b/OA/bag3_analog/tia_term/schematic/data.dm new file mode 100644 index 0000000000000000000000000000000000000000..db9eccc979514a0536ea5c21877c1da4e4dd8212 GIT binary patch literal 3668 zcmeH~J#Q015Qf)I?C=pFgn$x0gyjSjBd{(Gm^KASAf-T1(Qus4hi&P6XZdU^ky23b z2k7_#l$4Yd6ci~^P*9}c2ZWv;X1wp~SQZH&A&`()IzKx*yR);id$Z@--NjVKOc<8i zQaLG43Jur5i{K@263l=LU>3XrPJx%fW8gHn4Bnw3$h4n>Tn9t21#W@gP+mYbXl@rI&q$?$CMBNRyT@S*tpQE z6zwysKT;mgJbj{k_$cs{C*;u_%RHsB7Nk3K%8F(NJPp#`8OU?sS@0Y<51t1Vn))=2 z>g}O(^h>IP!kjs1_{$ZIk;X@_j^9}a$7xJ;th$Zs#9UB8 z%2kX0zUUll@=ynrsRpeess@q2Y5aO4thR&5++SaBBpn-1?Y9HNdhhDIyq7s2Z*JZ* zlk5OR3QU6&9Dsfk;4IoFLC*UT6MX`A!O!3x_!Z=*#5C;8f%D*XIQnMfejNC(i*N@vO v(XE2|RyfrBAM!&&wd#727sfT~rUb3sY(!qC5sw7wCoWed{@lBo{Ga>|R&LiM literal 0 HcmV?d00001 diff --git a/OA/bag3_analog/tia_term/schematic/master.tag b/OA/bag3_analog/tia_term/schematic/master.tag new file mode 100644 index 0000000..26be1be --- /dev/null +++ b/OA/bag3_analog/tia_term/schematic/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +sch.oa diff --git a/OA/bag3_analog/tia_term/schematic/sch.oa b/OA/bag3_analog/tia_term/schematic/sch.oa new file mode 100644 index 0000000000000000000000000000000000000000..b4d1f0945ef93cc74019c6110d9236593a0ca949 GIT binary patch literal 38708 zcmeHw4RDp$ncjD={;vLoB>u#YF9P#pK$bxK8rvWV8##a#fmy}lsSwfyDb}B*3&9!c z++e2lq)wKyp2Y2@8_y1t(k+!$^w{anij?M;s=eB7Q`7hV%k5@C>n@40>stt;?5P`A0h zZnVCBi;oJ^{e6SSPj-&H98{66CUTn+%p<*ksQp@$cDnX$xums!%O|aUT#U5#b48?! ziBs+GDwr<3&#Pj%_IqTvvp|I`3Rtwv%Li5lxxf{GLL;F z&LEbW$C*Oh{4(>k=9imaVg7FO*e<{nK6C(%;RGkw27(9OM*E^48(WpqKa}QRUARRsVF6)lD0qFUUhDPsk{q zlc$ry$>T}kc3Az*g{fGJzUux-T z?Fl-2j+|&dvA1h9d9ZIFaUj_>FueO@lELYqpyxpamt z)R{~S4EJ{>6Qgx#Yxls=XeXN5d7`0i^yz^kL;V3E96h;&;Lw2sR{wBtVrVcp)Y7uc zUX17)4EhE~lU;+|iRIR%wvnOX=C1z!BVFB3Zr|S1H`;ZiKM}OvtVJV<(azE1N4kdw z2i2I2pdgtT8EA0N`k=KT=FZ7=dVm>-p1d){aDS^x=`Ai28tToOOAZVluyN|@N9TgJzQK5{b-Ok`G#FRct|;*Nf&=Z%J|Fltt&FT?c>0NLcxI4zaywc#+^hqx9TmLj#HA$kUn9(KA|iY@n{8t}!z~X35<>N7@r7`kXkKRzTE&t`mtK z*Pg^k(7JK*JgXZR8tCpC)|Bv6FkpL)(O}qwH)w6dH0&I}-1E=%`vPOhay%OF*g#>M zBoVERS;yE_5FXShn=Edv8)sJdgyiYMCl0c8v^I`Gw!yVQ#wa(`ZM8Ry zayY3?NhEEk+t{#SlS?UiXlvaM4K&){c=NNeQ(3c$9FB;R@=6G&4VX4-M8cM^&8ipTDyK%@ACV1^)4G3+yf!ph({wH zoAB6-#}+)c;;{{nhI%~foy^u#Xd&V^6T{Kop%I&`@wA|{K@Vq@+M6f8S>X`Fo2R~M z;n|bBNtv}UH(5U>b~tnLOzb2kLAEwxA<9^H!Wj`csdI;#9(yS0Xy1LHA?Rq{)mHDG zP7t?cQyfUwkXexyxU8cvDaXX7-Hf-&GO59?lF16kHGam8ny|D?uTjV{sZqxgW)386 zJxTOD)OXBg5{-Z`{-W(8@i}tQ+ju zdGNu<+j_U|ZF*$W!AHKlp*=A3ZN2FZtZ(snYxAy_L;D)G)-|l(+<2tUv~}IqIBhD} zwq_&_43pLZ*s&?Ib!wG0G-%uV*nwbQ>wbG$xx4o_@9u1V?7+cC_jNWuy8pnz_Fb*} z4|cZfeyFp@8PTnSN#n^3lD5tu?V+G!bI`FRIB82rg6nf<_s~c}4fgDFK|WE?u{CIT zVAZ{~b@!|?HuRr-VAZBIJGQK@yXWq;%QvjwzM^sCmiisbx70t--{CZ2Lr}}Hh+FUD z-YTz+ANM9oe6-K(>o^RRxY;7!Qi+e6DPhatV}qkl4|WG;9QBMB61L}ORAP7klbs_c zZSycP5Oi$A2yN`_GW&PvSRG^t;eCTTU5mVf#%EYkY7h89!=9ZjbFe;2TOv z!)f2I^hyvuw^liC`E0@4#OuTxM4g*nXGJPE8y;l73q++OISEo0(#BApL5xLiv$NvI zz@KQaA@Y3WUq)VuT#vjPc`x!oBpNM>9*TZ9`u*q+qd$uNUd}gj{z>eO*k8xqiM;TsDV)NHM3t9iU;xTd#eA&!0n@#_r^D9(g&HZ|2a>;6Fk5TPJMi8&Gs7NmO% zo%iK4zJypo%q6NlZ?aw2h;I?!ChGg470kDj_yqAJ@f7hQJ6w%}GIMbVwYeL_3lMa3 z;!8HvcUd?GhZ7w}<=1^eFZrSSm)CsuK&bQ#z5_GlK-|*njx9aEEi4k5Q<)oy=H*w# z3X6(MO3VBKu$!lak*ksK}cw0D@J?we0!HW${nns3?e2eZvv9g(`Td@EP?nz(O*^T+P2+h|S~7l()B z7k5{)ah$H{BG}Dz`MN(udvGt7UXa8O=A@cXchmW$hjj12?^shRm)X;xeyP9W2gU); zi<7@+11&wEd^1Iri?U|o(0%lUvhQR>yhL0)qcEmPSy0O2uAq(Z5xWFYd(RsU2X%=t zMHz6}_$o##pVsAzK3i~!c$uhrvZ2;@CZ7c0J3QK^`Hp$ z1!;h|AH{ts5b2TTIm`P6!)ML6nMd2sn}_>V@j>$DTXFLz#zf;HUVy$H`G*|z0q)nm zACND}nEH@$ualO`_n8P|kGY~e>c3=O{hrERk=>D}j4V)kRQ5^%<731^qT2HT^L-d< zP%ax*LOe)3MLbWG-Sa+a**Dcw2igGP@tj!;nRC@(K!ziz+Hh<^>CvE-SdJ;ojy&EgLHqZ@cgQ2X}74 zwYp0;FNo&Y>TlLWS#f^6xU_I?b!GXS#q*Yw)+|~&e<41ppuO<%n+v52A|GE~g>`x_ z+Gif3akp_ozaWJ-JpJ1^PD~-nrM5EQFn8PeZgjGnMunzP`u{JDF&c_(AA3PG@jJnsq|5pe=1P=NcE*y(HY`%#OH~czt>5>OKfDr zQbg$;?YGpgY$$yKnS=||3Kyyzwa4e0{WE1nw3vq+H<~w>)(hxr)FdR|T36)104a4J zOJTv^ysIvlyTZPiszsi(TjEODYTqgCuy2z#G{yZVQ4`AaQ?xvUye2 z^CRnPRxFvjxL{6fL45h$D_5;vbI;m!_vEZ!xU8VIzHaThqPvS%maHl*yK8kJ*x~fU zqAae;hsPJiss^oF`78qLYc&CScp&yN)p#>!2Rl@*til*Z>S ztSp-|w|rjpoQjG$b1EyVs^%`Ns;XQve|~ZNuDfb#7A;!5c*)YaORML>R(in-^t^*^ zD7>jR+bK03Db8tZsH7Isb|1}=KO(o^B}q>Ab0 z66X=sFX^9b=RG&b=nsk2%)gGU|h4u zSeMgfr6p!wRYaj<^UEV;IGyu44vAuR6zwuaF)A*6E{vEQ+sa`>V8#@}@n%k#vUhox zXZgP>Eh#Q9tjd{NmX{k8J2QxB493%fxL}j*pdr|Y!ofE9A^TZM`vK(@V)Qf}hxaww@06o$=4N^>gz?REp=JiTj11dvJdSlT zf+TKO4fUOT9D%pN-KzMLy^~s?aP{jlJB<12Mbl?dz1jGo^Ql`MPmNo6JT=Z?{awn2 ztG()&`XPM++ZGOU7fyO8?kNA=I9^wiUPr7aHWKZK$+;cGox~R69-{2WHqvU(RH$}N zmF{-Miw|t(XBHrr8e4P%Yn#Cp$Z2G!Jxt5pg1-Xsf()U2C;Rw^1Wd@q|3(++_fBqU z)x=;pA*-FE`J(gOf8!UG)HR~Yx9TT2)jwVNmK;ldm47M>%cFR#d=nZq4Fc?8AKlId z2NTjg?6V8UT?oSQT^POq10Pkly-pZk(B@K><_cak1PD_*weQ4w0M<@5E;>(>U8(%2 z1TNdY^*rNMZ#I#AbeF|u#ezG1dANjyo^`REzaFA^^hFA<%Bvi`XXJ;Ukl zC$2O98)TUHmJKCmvPU$R6dtCtm6I*}=NzDyHBi=<&w@k$;lWO_bd2rxwsvuDP&&6t zW~2*?lt)V|iegYB6VgV__{+n2Js(%<`iCX#D`c9IrHv%%^(7e9-t#rPs3Uk2G$oU(HmzVhqqaFFhbWYn_sv z7-#wwM94DSIuGtE0KBUFPYYT7BmkS$M?}&tOxf$ldbL~M<1DufGdZ_PUtF@F2r){` zCE5nwxqM;)QU8vRJ8`uX?!>?_ha1jZVjeM{7$ds#Vw6ldlYS^*y!v&R0;hAOUeY>W z(z(*}4F5LqBJmaCYs5E**NATu+t{zyh}VcWi0>2CuWGjQW#Sm|4Ivc-vt^YxjlJYp z@*PH{%Z5qt(ws1yKO24CXG`0zYOfZXJ&gZN0}P*ZJm=&XdEiW;Ul#wYn)Iin@$Q=#1c={8`kK9?yqL|wl%I!VhmHQ)KYa8N{$09qqoaqGtZLZq)JwH@PS*@rf_ssQ?p)s4)AgrU zo~u85HTsjH)AN5>^vnEnMW;)TEIe1bp`bnIbZ%|Ix!iy6-hL80mm5*g$7PJ1jouZV zUwPNrNVNR){K|6CR%ef|*UN%avIW6!o3Q}iq4)3@irqVR@7%R>=gt=MyLOr^dS@}- zL0{aKb4^b8u>RNjkZm2n#W-Aq7}o!@wYxO;{4s<7J^}SfKT&N2U~PyEsT4>ke%j&k52 zUvT1|(r4SBYP}E3hwOo{e8?_Pg<99OA5godyD$AV8?62AIySt8xR=;QJV@*yhV6%M zQ(n{k_UuUWP2n+yW1hijU6q}waHUheFoxr|vOl-`zTUU;(|=;G01tMPwPS3B({Tks zP9z%3vyX7>s~$g@$Ns|f|2gwmYnsfjFpst2o0f4a=_hQxz?w2>VZh78#|^Ppz`BHR zd~6TI`UZT-5Ni(Nfv*`_kZa3R1AYJEclX^tG}^rT;Yab0r+DY$@`I8x=nU=K>{b0p z*?XoBeqo9BSRjT{J`xX7yW$OTYg!8Lk@)!Ua4`P6?%uBl`UP~5r)s=&qH4Zqf2Dae z-TiYwK@88^sr0($yXLX%`y!S%TfMIN!ER5|N7C2R-A`*CLeJd}N4240m{cUE@1*eQ z2B`mgInKBob>Dt#+*y$7QG1k6@}P0mIBVY)9$(d?_Ng4{rJ3%lb+4pyW{c9NDo5>{ zE`n|Dyn-2Qx?{elGQFj_l6j`?W-b0^z+a*wt=JgsAmedf16ky-Op;TzSL>$EZJi=S zJ`SADJ#hq#w`kf?Ls7f4?wUL(Fme4BWksP8|( zzf70zr}YUgOiPa9E;b0VVK`ry{#AW1!Di1Iux`MkU$j}Ze)#nzFE=L|iQqq55dD)w z?c&QT@*^=UV)+#o9aIzB=gEQr`^wd<}IjA9F{iXI! zS8p9=M|z1@#NuAzcTsn+#DZ{CJdVK_|GuL1vU7X_`EBK`J#BB9}ctdf~bU_zBRi|-( zpAEts2mi9QPwA(c=i&LQ0ySS%-*o@JCQe3aez%eCA*w#vG3j=an_*h>$?bhCjqE|u z!tUIXZEE{_VT({Niul`NdCv`mXDtJ9~yyMD0_|TwAU3Z8eBS z+-aGg&;IXdD<_<-=0(i*zz*D(VQSzj@J6NJ!}RajzWIs;=Gq?oKU#ut{7mURR?boL z9VR3A_gwec`;hr|qw)9K;qtz2hE&|@#SlBOO1a}{d*T;Cc*>%jgFWK-hQ#J(t7m4b zPkbwG-!qp*y}|i~@6)k2W_LY*j1KP;r_u}Izk|v4-C{Wl*7@5U($%Vv4Us-kJKtn` zv+X;y-*}(tv`M*gF*iR$`*-&~&=MT4v2RUA0RQakO za{rs?pn~8rY~;ll`QY@|J3;iP98&5tyV>yxZi%+7mPB*P{9!#bTiTjEHrq17`9G;L z!D9T463)}WZ%)fpkTL?E4)bEdc@+mo=Tc(!bk8Zn`;yzGe>J_>4>kX`qvo^pQ?1p2 zK7{M1OiSj2uzuG5H&+Q+fcPo?>N|6t4@n>E{7LQD!*a6Sk37%#*N7hyuk-NY2JsXX z*CiS!`u|p~;6OFO+R-!|+q|2O74%p<1PYsbD-%=ny;!!{1fzKME{ud2VKg#{0y#sOYhVq{>MEUp@19xTD%pNx~ z0HVA`BJSbdHu^_~e{cAXVZULs;VHuoL)iC^Ti#(J?E5E-e$uet@P~$fVrhZ6=X==@ z_i|%~f5mX{2=U+%;{VDJ@$Va6Hy*SZ#!MFgZy5bshPeCgGDKdq6L^NW)yf5Zm{>to5ME~2&qyGu>KePQ3?liGq`my03 z8vO^B_I1NQF~olA0O`YqKeG0Z5#KZXBa6pA_Xmb6NE$=}! zkAFL+_*+FT%jxVGgG`r8LiR+F(J_SC*g3}x%BNtJtNgMrFsI;Do~Op2O7H5hU^hmF z7%#ZEd!}vsG+&f28!ErzScee4bx@==xKPHemEm>XSW!hh>dWW-8L->YK^*?I}w};o}CbJIrvY( zs}n*TVW&l9k?P1Iw*(eCm+|ka811R_OC;jbSYB($GGm(hjnbNGUX4ZbB26{R?0LH2 z)n)eY!nId`Xs>WFrwguDTG-XKm3aO~pvx*q(3H>BgqH2GL#7B1=?R{`ttO zIXRW(Pgz)AQ%!q~VN=c3m4LmKMFy{K-{qc;_^&QkwCO1(DP9jCwW4;wl~W`AAcKQ_bg* zzNzM1BkIX}%60tQHY3_A&Y`QuqaO2+3E8)pKiE%AC4br>mX?6T8K{&lf-Ott?+uEJ$;`0ZPE*};3fiTyi}brh-H*TqgJlRS5AhDOIerLnIzPR-IsdX@nun*y~ z;dvjO^@;5}JlN?Z$7Bk2BLI>F2mS`k?WD8(6eqvHdL@W+R8(&DDYkJ{*kdTFHf#%Vp$+>^o;+&@mV`__UbY zd!_>qoUO*n!tx!KH|3=`q~)F2({_&1O@**K;3OB4OUw)CwyEk#+hUj>EFk+g28 z-V`g$HXmMK`~~7G#0tu}=EGvrr`Rt29gX^#4Jnh8trpOn;$DGDXXaTkuJ>siCX(R%BcODv(Ak{kKx@lB^H>x7L*i=wokb6$qv|p zczktc|4wc}erZ{0zGXsK)dXh&oIihO_h48@kyrVHlo2WSw3qA-`or1gyC zZuOj2^Ml8L>HB}K%jtaq_y7m}0Y{$cuG0tFQ{$)a{-yuY32yO4^OItkE`@AK*SnYj zXsnITfsO)o$@s`=_t^34YuD-CNmBs_#}Y&46jXp!@8Lv*ob4CQu%C?9R@STfFOj}Xe3>YH_8RGH#Gey$ zIq=eNTK6w8{0s%+IpS2~qj?}X*Z77}@n;-2?M#QL@_X1m2G1JME_m&W?RAWWI^Ad5 z%>Dr>_g5dz_I{xBOQk!@=9T@d^it`(vIj8zUHFRVisLsI}H!t_U3EHL zk$>CpxpUj1<#<&Fz13`lk!lyp+CyzQa14t$j+LP2Xvq)&5_6Q-QP9Z#UR5 z>ACkwOW(!V!E`&>(=ZL40VjPWRJc&#%Kvkp?N|1Me88hURNZ52Oj_U7c%#PA_D_V) zU1WBdxpcY->5YJ4_@8aQX&*9SzA>=?e1X?^-s*h2UGqronki~L_fmeqva}6s@0us% zvEw)D$R_uackxAXE;~#0w6VT}MC}KjAg%SWpY$oB&beM7eSU^=?#9g8FL{Pt1SdXJ zu-w%|A3OagvMH-AS?=tYxyM4NLdWp8*SNRScXo(C`%sSfk1#ldJDZ%9+^XDZ(rEvD zyW~)Pca6Ob5A|Q;Be??)+*m4s_`y0A9F|+jq3nH?7jCNRlf1Y+nI+05H%dQK4A(my z8ePrgGvzF0!70`6EH?|7XMQ$+M=ZNs^IGeg)-&1f`nv-)O!Hp~|-eIMhT^qT)CIjkI2zydWd<1A41x`DP5-e9^niP}$J zC;fBchr|-rt8>Kg{N6Fm`KEa#l%5qTT&QkUvmIJoJr_RxCz`>g=uE}2RLujMp7%t! zsgr0V!=BHaD+4+lHYs?4IFzOHHhXmraks-RkUcQldBtX>c|tK!@NGlM!FiUbeF6EN sb^gfyQ3B<^z;Z4UFA*;jp)283Z#If695C8xG literal 0 HcmV?d00001 diff --git a/OA/bag3_analog/tia_term/schematic/thumbnail_128x128.png b/OA/bag3_analog/tia_term/schematic/thumbnail_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..cd9b74a8be9775cdc75caade674e8d464ab64cf2 GIT binary patch literal 1114 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9Gmi6G3l!hU%s0|N_> zr;B4q#hkZu9E)xn@VGAY>wnU_J4^4e^G~CDOK0EljNS4|V~qs2iATea|7QzkdFFO1 z$~$^Y+0k)Ai)C8=JyC^y0SpBi3>G2`GF%LNtPJf;4bF@Q7BV~_UD%=ZHS^4Q>NPYPM&KZs1S8&Yt5ZKs|{KVm;_|Qn4j%F8JM;p)g^mh@y^%%@(ePJE+uon z6k7lP*}1&iAo##n)i^1z38N7TG-dz3A&5*iSKJ~7$RLtbJ`SZmkr8&>>&1kdw>Czx|>)Zy5{%19} z)3>+Dhu;6Y)BIGiIp4I)OeOn0Zky+As=Ow1*o>=KQbTFJdzg#TmD3dsKkjqhF<*84 z#C5Y(>9*VJdtW`!Zg77dJ@>M*l+4+m`rBr&XV|K;>|?)H_=$V>r=2(V$+FMZ*dOi_ z{rah%eOJ|=SCzAWAI-Sn+OS-<@W{V5pU3i{W?weRZnt@+Em`t&@7jCy_4_+IzP$Ue zNlqWAO5fUPiJj2Qzx8L01Iz!{n+YvF#TXLYAga8)A>H!8yXTuHYJ~DFn8mb4!j^T4 z%NfR5H_G|)*{*&(#rVx}?dihUl@6t}+zgYA7@mo)K{6BSk?fvIlkDF5YPVch~iAeZM;4*pe=WJDEQIT8v5`{uL+k zIXp{zC-WfZ#QVQI_h*{VXMVg->1xa=(cOzh_Xw`8`dvI{W$*%^eRFJ>&U~8}FHpoG zP+Pw7z>!MZKcZGS^IDwxI0}xu$k^~UJK&$p92r4}BlS=Gr3#BUE+l?dnQY~w;L67c zRCgt&{p32g8O#lnm6WUMAqJOq0J}#(w?{TZshN+@x zOXC-n50wnbN;cD19If@ewT304`u)DkorNbSvP?<~;@se8^4$&S@&yUo(myFr&|(s> q1!p+FRWc1P5?Lt8b%?C{++6CU_s@03lSF}q1%s!npUXO@geCx)v(N$n literal 0 HcmV?d00001 diff --git a/OA/bag3_analog/tia_term/symbol/data.dm b/OA/bag3_analog/tia_term/symbol/data.dm new file mode 100644 index 0000000..e69de29 diff --git a/OA/bag3_analog/tia_term/symbol/master.tag b/OA/bag3_analog/tia_term/symbol/master.tag new file mode 100644 index 0000000..e1024da --- /dev/null +++ b/OA/bag3_analog/tia_term/symbol/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +symbol.oa diff --git a/OA/bag3_analog/tia_term/symbol/symbol.oa b/OA/bag3_analog/tia_term/symbol/symbol.oa new file mode 100644 index 0000000000000000000000000000000000000000..7bfaabe8a0c621b57437cb6e9630e12a4d5802ef GIT binary patch literal 25884 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 LHSYWE|BLc}u~Bv4 literal 0 HcmV?d00001 diff --git a/OA/bag3_analog/tia_term/symbol/thumbnail_128x128.png b/OA/bag3_analog/tia_term/symbol/thumbnail_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..88feed7d94c91cd81f8076f584f7aaaee25101c7 GIT binary patch literal 935 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9Gmi6G3l!hU%s0|RrU zr;B4q#hkZuqx%*c2ryW$w!Jh*vwfCv;qo``M|2b$IGaB%UZt{R;t7GtdVdxfZttjQ zN%$GOiy=siwc+#j5=O6$SKi&#(|4_0!}vghL58(qF+;%yraQ-Scl`h3%c9+26Ubn} z#o&&R6k+INI)F=XyT-?i8wLCSXwQE5`uC;v+TRmS996%?!m7tJ8*0o47LTo)qkmh! z*|Uko;79%jmI>w+Of|Lo@n;X$)@JP5y1uZ2X-R~z%GULPzoHeNykc0oZ++ve$Av%5 z?wppd{DR z9u!kx(r<*jw#~ZAZo&R)M)w*1T&0%|-fm{<@oBa@#USv|wP7neOTpdX~i%&XSSxxFRq|4#Ei5jP*bS-b4_ zlj=U(JOAtR-hNJ>VtBZ6SyGnphNG86??(!MP-0lOdAnPd$b}0V3`K*p8#L$h{MX|9 zrLN(?l6A-4ol$8*qkQJ$IEQn8YzsapM+qt%QaR_dMcJW6C}n{zqtcWIDX(6!)Ct{a zQ;*MDq{sNI{2@<4*(;%hl=E*REL*KuB^uQ-V?6IN`E0B_;Uvvevun}uiOJ5bSod*+*E&ho@M7!lZ|dS)E)YEe)sRc zdFao7$yA%)Hsv0X^csPeFC None: + MOSBase.__init__(self, temp_db, params, **kwargs) + + @classmethod + def get_schematic_class(cls) -> Optional[Type[Module]]: + return bag3_analog__buf_cmos_cell + + @classmethod + def get_params_info(cls) -> Dict[str, str]: + return dict( + pinfo='The MOSBasePlaceInfo object.', + seg_p='segments of pmos', + seg_n='segments of nmos', + w_p='pmos width.', + w_n='nmos width.', + ridx_p='pmos row index.', + ridx_n='nmos row index.', + show_pins='True to show pins', + flip_tile='True to flip all tiles', + draw_taps='LEFT or RIGHT or BOTH or NONE', + sig_locs='Signal locations for top horizontal metal layer pins', + ndum='number of dummy at one side, need even number' + ) + + @classmethod + def get_default_param_values(cls) -> Dict[str, Any]: + return dict( + seg_p=-1, + seg_n=-1, + w_p=0, + w_n=0, + ridx_p=-1, + ridx_n=0, + show_pins=False, + flip_tile=False, + draw_taps='NONE', + sig_locs={}, + ndum=0, + ) + + def draw_layout(self) -> None: + pinfo = MOSBasePlaceInfo.make_place_info(self.grid, self.params['pinfo']) + self.draw_base(pinfo, flip_tile=self.params['flip_tile']) + + seg_p: int = self.params['seg_p'] + seg_n: int = self.params['seg_n'] + ridx_p: int = self.params['ridx_p'] + ridx_n: int = self.params['ridx_n'] + ndum: int = self.params['ndum'] + draw_taps: DrawTaps = DrawTaps[self.params['draw_taps']] + sig_locs: Dict[str, TrackType] = self.params['sig_locs'] + + for val in [seg_p, seg_n, ndum]: + if val % 2: + raise ValueError(f'This generator does not support odd number of segments ') + + tr_manager = self.tr_manager + hm_layer = self.conn_layer + 1 + vm_layer = hm_layer + 1 + xm_layer = vm_layer + 1 + + inv_params = self.params.copy(append=dict(is_guarded=True, show_pins=False, vertical_out=False)) + inv_master = self.new_template(InvCore, params=inv_params) + inv_ncol = inv_master.num_cols + + # taps + sub_sep = self.sub_sep_col + 2 + sup_info = self.get_supply_column_info(xm_layer) + num_taps = 0 + tap_offset = 0 + tap_left = tap_right = False + if draw_taps in DrawTaps.RIGHT | DrawTaps.BOTH: + num_taps += 1 + tap_right = True + if draw_taps in DrawTaps.LEFT | DrawTaps.BOTH: + num_taps += 1 + tap_offset += sup_info.ncol + sub_sep // 2 + tap_left = True + + # set total number of columns + # Total width can be limited by either transistor size or by vertical metal size + seg_max = 2 * max(seg_p, seg_n) + seg_tot = seg_max + (sup_info.ncol + sub_sep // 2) * num_taps + 2 * ndum + + + # --- Placement --- # + cur_col = tap_offset + if ndum > 0: + nmos_dum_p = self.add_mos(ridx_n, cur_col, ndum, tile_idx=0) + pmos_dum_p = self.add_mos(ridx_p, cur_col, ndum, tile_idx=0) + cur_col += ndum + inst_p = self.add_tile(inv_master, 0, cur_col) + cur_col += 2 * inv_ncol + mid_idx = self.arr_info.col_to_track(vm_layer, cur_col - inv_ncol, mode=RoundMode.NEAREST) + inst_n = self.add_tile(inv_master, 0, cur_col, flip_lr=True) + if ndum > 0: + cur_col += ndum + nmos_dum_n = self.add_mos(ridx_n, cur_col, ndum, tile_idx=0, flip_lr=True) + pmos_dum_n = self.add_mos(ridx_p, cur_col, ndum, tile_idx=0, flip_lr=True) + # add taps + lay_range = range(self.conn_layer, xm_layer + 1) + vdd_table: Dict[int, List[WireArray]] = {lay: [] for lay in lay_range} + vss_table: Dict[int, List[WireArray]] = {lay: [] for lay in lay_range} + if tap_left: + self.add_supply_column(sup_info, 0, vdd_table, vss_table) + if tap_right: + self.add_supply_column(sup_info, seg_tot, vdd_table, vss_table, flip_lr=True) + self.set_mos_size() + + # --- Routing --- # + # 1. supplies + vdd_table[hm_layer].append(inst_p.get_pin('VDD', layer=hm_layer)) + vdd_table[hm_layer].append(inst_n.get_pin('VDD', layer=hm_layer)) + self.add_pin('VDD_conn', vdd_table[self.conn_layer], hide=True) + self.add_pin('VDD_hm', vdd_table[hm_layer], hide=True) + self.add_pin('VDD_vm', vdd_table[vm_layer], hide=True) + self.add_pin('VDDA', self.connect_wires(vdd_table[xm_layer])) + + vss_table[hm_layer].append(inst_p.get_pin('VSS', layer=hm_layer)) + vss_table[hm_layer].append(inst_n.get_pin('VSS', layer=hm_layer)) + self.add_pin('VSS_conn', vss_table[self.conn_layer], hide=True) + self.add_pin('VSS_hm', vss_table[hm_layer], hide=True) + self.add_pin('VSS_vm', vss_table[vm_layer], hide=True) + self.add_pin('VSS', self.connect_wires(vss_table[xm_layer])) + + vdd = self.connect_wires(vdd_table[hm_layer])[0] + vss = self.connect_wires(vss_table[hm_layer])[0] + tr_w_h = self.tr_manager.get_width(hm_layer, 'sig') + tr_w_v = self.tr_manager.get_width(vm_layer, 'sig') + if ndum > 0: + # connect dummy + pmos_port, nmos_port = [], [] + for pmos, nmos in zip([pmos_dum_n, pmos_dum_p], [nmos_dum_n, nmos_dum_p]): + pmos_port += [pmos.s] + nmos_port += [nmos.s] + self.connect_to_track_wires(pmos_port, vdd) + self.connect_to_track_wires(nmos_port, vss) + # connect g&d to VDD/VSS with M3 + nout_tidx = sig_locs.get('nout', self.get_track_index(ridx_n, MOSWireType.DS_GATE, + wire_name='sig', wire_idx=-1)) + pout_tidx = sig_locs.get('pout', self.get_track_index(ridx_p, MOSWireType.DS_GATE, + wire_name='sig', wire_idx=0)) + nout_tid = TrackID(hm_layer, nout_tidx, tr_w_h) + pout_tid = TrackID(hm_layer, pout_tidx, tr_w_h) + # left (p) + pmos_p_hm = self.connect_to_tracks([pmos_dum_p.g, pmos_dum_p.d], pout_tid, min_len_mode=MinLenMode.LOWER) + nmos_p_hm = self.connect_to_tracks([nmos_dum_p.g, nmos_dum_p.d], nout_tid, min_len_mode=MinLenMode.LOWER) + tidx_p_vm = self.grid.coord_to_track(vm_layer, pmos_p_hm.lower, mode=RoundMode.NEAREST) + self.connect_to_tracks([pmos_p_hm, vdd], TrackID(vm_layer, tidx_p_vm, width=tr_w_v)) + self.connect_to_tracks([nmos_p_hm, vss], TrackID(vm_layer, tidx_p_vm, width=tr_w_v)) + pmos_n_hm = self.connect_to_tracks([pmos_dum_n.g, pmos_dum_n.d], pout_tid, min_len_mode=MinLenMode.UPPER) + nmos_n_hm = self.connect_to_tracks([nmos_dum_n.g, nmos_dum_n.d], nout_tid, min_len_mode=MinLenMode.UPPER) + tidx_n_vm = self.grid.coord_to_track(vm_layer, pmos_n_hm.upper, mode=RoundMode.NEAREST) + self.connect_to_tracks([pmos_n_hm, vdd], TrackID(vm_layer, tidx_n_vm, width=tr_w_v)) + self.connect_to_tracks([nmos_n_hm, vss], TrackID(vm_layer, tidx_n_vm, width=tr_w_v)) + + # 2. export inp, inn + inp_vm = inst_p.get_pin('in') + inn_vm = inst_n.get_pin('in') + self.add_pin('vip', inp_vm) + self.add_pin('vin', inn_vm) + + # 3. export von, vop and connect to multiple wires on vm_layer + von_upper_idx = tr_manager.get_next_track(vm_layer, mid_idx, 'sig', 'sig', up=False) + von_upper = self.grid.track_to_coord(vm_layer, von_upper_idx) + + von_hm = inst_p.get_all_port_pins('out') + von_lower_idx = tr_manager.get_next_track(vm_layer, inp_vm.track_id.base_index, 'sig', 'sig', up=True) + von_lower = self.grid.track_to_coord(vm_layer, von_lower_idx) + von_vm_idx = tr_manager.get_next_track(vm_layer, inp_vm.track_id.base_index, 'sig', 'sig', up=False) + try: von_vm = max_conn_wires(self, tr_manager, 'sig', von_hm, start_coord=von_lower, end_coord=von_upper) + except: von_vm = self.connect_to_tracks(von_hm, TrackID(vm_layer, von_vm_idx, width=tr_w_v)) + vop_upper_idx = tr_manager.get_next_track(vm_layer, inn_vm.track_id.base_index, 'sig', 'sig', up=False) + vop_upper = self.grid.track_to_coord(vm_layer, vop_upper_idx) + vop_lower_idx = tr_manager.get_next_track(vm_layer, mid_idx, 'sig', 'sig', up=True) + vop_lower = self.grid.track_to_coord(vm_layer, vop_lower_idx) + vop_hm = inst_n.get_all_port_pins('out') + vop_vm_idx = tr_manager.get_next_track(vm_layer, inn_vm.track_id.base_index, 'sig', 'sig', up=True) + try: vop_vm = max_conn_wires(self, tr_manager, 'sig', vop_hm, start_coord=vop_lower, end_coord=vop_upper) + except: vop_vm = self.connect_to_tracks(vop_hm, TrackID(vm_layer, vop_vm_idx, width=tr_w_v)) + + self.add_pin('von', von_vm) + self.add_pin('vop', vop_vm) + sch_params = inv_master.sch_params + w_n = sch_params['w_n'] + w_p = sch_params['w_p'] + lch = sch_params['lch'] + if ndum > 0: + dum_info = [(('nch', w_n, lch, sch_params['th_n'], 'VSS', 'VSS'), ndum * 2), + (('pch', w_p, lch, sch_params['th_p'], 'VDDA', 'VDDA'), ndum * 2)] + sch_params = sch_params.copy(append=dict(dum_info=dum_info)) + # set + + + + + + self.sch_params = sch_params + + +class BufCMOSRow(MOSBase): + """The core of the pseudo differential inverters + """ + + def __init__(self, temp_db: TemplateDB, params: Param, **kwargs: Any) -> None: + MOSBase.__init__(self, temp_db, params, **kwargs) + + @classmethod + def get_schematic_class(cls) -> Optional[Type[Module]]: + return bag3_analog__buf_cmos_cell + + @classmethod + def get_params_info(cls) -> Dict[str, str]: + return dict( + pinfo='The MOSBasePlaceInfo object.', + seg_p='segments of pmos', + seg_n='segments of nmos', + w_p='pmos width.', + w_n='nmos width.', + ridx_p='pmos row index.', + ridx_n='nmos row index.', + show_pins='True to show pins', + flip_tile='True to flip all tiles', + sig_locs='Signal locations for top horizontal metal layer pins', + ndum='number of dummy at one side, need even number' + ) + + @classmethod + def get_default_param_values(cls) -> Dict[str, Any]: + return dict( + seg_p=-1, + seg_n=-1, + w_p=0, + w_n=0, + ridx_p=-1, + ridx_n=0, + show_pins=False, + flip_tile=False, + sig_locs={}, + ndum=0, + ) + + def draw_layout(self) -> None: + pinfo = MOSBasePlaceInfo.make_place_info(self.grid, self.params['pinfo']) + self.draw_base(pinfo, flip_tile=self.params['flip_tile']) + + # core_tile + _pinfo = self.get_tile_pinfo(tile_idx=1) + + seg_p: int = self.params['seg_p'] + seg_n: int = self.params['seg_n'] + w_p: int = self.params['w_p'] + w_n: int = self.params['w_n'] + ridx_p: int = self.params['ridx_p'] + ridx_n: int = self.params['ridx_n'] + ndum: int = self.params['ndum'] + sig_locs: Dict[str, TrackType] = self.params['sig_locs'] + + for val in (seg_p, seg_n, ndum): + if val % 2: + raise ValueError(f'This generator does not support odd number of segments ') + + hm_layer = self.conn_layer + 1 + vm_layer = hm_layer + 1 + xm_layer = vm_layer + 1 + + inv_params = self.params.copy(append=dict(is_guarded=True, show_pins=False, vertical_sup=True, + vertical_out=False), + remove=['pinfo']) + inv_master = self.new_template(InvCore, params=dict(pinfo=_pinfo, **inv_params)) + inv_ncol = inv_master.num_cols + + # set total number of columns + seg_max = 2 * max(seg_p, seg_n) + seg_tot = seg_max + 2 * ndum + + # taps + sub_vss = self.add_substrate_contact(0, 0, tile_idx=0, seg=seg_tot, port_mode=SubPortMode.BOTH) + sub_vdd = self.add_substrate_contact(0, 0, tile_idx=2, seg=seg_tot, port_mode=SubPortMode.BOTH) + + # --- Placement --- # + cur_col = 0 + if ndum > 0: + nmos_dum_p = self.add_mos(ridx_n, cur_col, ndum, tile_idx=1, w=w_n) + pmos_dum_p = self.add_mos(ridx_p, cur_col, ndum, tile_idx=1, w=w_p) + cur_col += ndum + inst_p = self.add_tile(inv_master, 1, cur_col) + cur_col += 2 * inv_ncol + mid_idx = self.arr_info.col_to_track(vm_layer, cur_col - inv_ncol, mode=RoundMode.NEAREST) + inst_n = self.add_tile(inv_master, 1, cur_col, flip_lr=True) + if ndum > 0: + cur_col += ndum + nmos_dum_n = self.add_mos(ridx_n, cur_col, ndum, tile_idx=1, flip_lr=True, w=w_n) + pmos_dum_n = self.add_mos(ridx_p, cur_col, ndum, tile_idx=1, flip_lr=True, w=w_p) + + # set size + self.set_mos_size() + + # --- Routing --- # + tr_manager = self.tr_manager + hm_layer = self.conn_layer + 1 + # 1. supplies + vdd_tidx = self.get_track_index(0, MOSWireType.DS, wire_name='sup', wire_idx=-1, tile_idx=2) + vss_tidx = self.get_track_index(0, MOSWireType.DS, wire_name='sup', wire_idx=-1, tile_idx=0) + w_sup_hm = tr_manager.get_width(hm_layer, 'sup') + + inst_vss, inst_vdd = [sub_vss], [sub_vdd] + for inst in (inst_p, inst_n): + inst_vss.extend(inst.get_all_port_pins('VSS', layer=self.conn_layer)) + inst_vdd.extend(inst.get_all_port_pins('VDD', layer=self.conn_layer)) + if ndum > 0: + # connect dummy + for pmos, nmos in zip([pmos_dum_n, pmos_dum_p], [nmos_dum_n, nmos_dum_p]): + inst_vdd.extend([pmos.g, pmos.d, pmos.s]) + inst_vss.extend([nmos.g, nmos.d, nmos.s]) + self.connect_wires(inst_vss) + self.connect_wires(inst_vdd) + vss = self.connect_to_tracks([sub_vss[0::2]], TrackID(hm_layer, vss_tidx, width=w_sup_hm), min_len_mode=MinLenMode.MIDDLE) + vdd = self.connect_to_tracks([sub_vdd[0::2]], TrackID(hm_layer, vdd_tidx, width=w_sup_hm), min_len_mode=MinLenMode.MIDDLE) + self.add_pin('VDDA', vdd, connect=True) + self.add_pin('VSS', vss, connect=True) + + # 2. export inp, inn + inp_vm = inst_p.get_pin('in') + inn_vm = inst_n.get_pin('in') + self.add_pin('vip', inp_vm) + self.add_pin('vin', inn_vm) + + # 3. export von, vop and connect to multiple wires on vm_layer + # mid_idx = self.grid.coord_to_track(vm_layer, inst_p.bound_box.xh, mode=RoundMode.NEAREST) + von_upper_idx = tr_manager.get_next_track(vm_layer, mid_idx, 'sig', 'sig', up=False) + von_upper = self.grid.track_to_coord(vm_layer, von_upper_idx) + vop_lower_idx = tr_manager.get_next_track(vm_layer, mid_idx, 'sig', 'sig', up=True) + vop_lower = self.grid.track_to_coord(vm_layer, vop_lower_idx) + von_hm = inst_p.get_all_port_pins('out') + von_lower_idx = tr_manager.get_next_track(vm_layer, inp_vm.track_id.base_index, 'sig', 'sig', up=True) + von_lower = self.grid.track_to_coord(vm_layer, von_lower_idx) + von_vm = max_conn_wires(self, tr_manager, 'sig', von_hm, start_coord=von_lower, end_coord=von_upper) + vop_upper_idx = tr_manager.get_next_track(vm_layer, inn_vm.track_id.base_index, 'sig', 'sig', up=False) + vop_upper = self.grid.track_to_coord(vm_layer, vop_upper_idx) + vop_hm = inst_n.get_all_port_pins('out') + vop_vm = max_conn_wires(self, tr_manager, 'sig', vop_hm, start_coord=vop_lower, end_coord=vop_upper) + + self.add_pin('von', von_vm) + self.add_pin('vop', vop_vm) + sch_params = dict(**inv_master.sch_params) + lch = sch_params['lch'] + if ndum > 0: + dum_info = [(('nch', sch_params['w_n'], lch, sch_params['th_n'], 'VSS', 'VSS'), ndum * 2), + (('pch', sch_params['w_p'], lch, sch_params['th_p'], 'VDDA', 'VDDA'), ndum * 2)] + sch_params['dum_info'] = dum_info + # set properties + self.sch_params = sch_params + + +class BufCMOSGR(GuardRing): + def __init__(self, temp_db: TemplateDB, params: Param, **kwargs: Any) -> None: + GuardRing.__init__(self, temp_db, params, **kwargs) + + @classmethod + def get_params_info(cls) -> Dict[str, str]: + ans = BufCMOS.get_params_info() + ans.update( + pmos_gr='pmos guard ring tile name.', + nmos_gr='nmos guard ring tile name.', + edge_ncol='Number of columns on guard ring edge. Use 0 for default.', + ) + return ans + + @classmethod + def get_default_param_values(cls) -> Dict[str, Any]: + ans = BufCMOSV1.get_default_param_values() + ans.update( + pmos_gr='pgr', + nmos_gr='ngr', + edge_ncol=0, + ) + return ans + + def get_layout_basename(self) -> str: + return self.__class__.__name__ + + def draw_layout(self) -> None: + params = self.params + pmos_gr: str = params['pmos_gr'] + nmos_gr: str = params['nmos_gr'] + edge_ncol: int = params['edge_ncol'] + + core_params = params.copy(remove=['pmos_gr', 'nmos_gr', 'edge_ncol']) + master = self.new_template(BufCMOSV1, params=core_params) + + sub_sep = master.sub_sep_col + gr_sub_sep = master.gr_sub_sep_col + sep_ncol_left = sep_ncol_right = sub_sep + draw_taps: DrawTaps = DrawTaps[params['draw_taps']] + if draw_taps in DrawTaps.RIGHT | DrawTaps.BOTH: + sep_ncol_right = gr_sub_sep - sub_sep // 2 + if draw_taps in DrawTaps.LEFT | DrawTaps.BOTH: + sep_ncol_left = gr_sub_sep - sub_sep // 2 + sep_ncol = (sep_ncol_left, sep_ncol_right) + + inst, sup_list = self.draw_guard_ring(master, pmos_gr, nmos_gr, sep_ncol, edge_ncol) + vdd_hm_list, vss_hm_list = [], [] + for (vss_list, vdd_list) in sup_list: + vss_hm_list.extend(vss_list) + vdd_hm_list.extend(vdd_list) + + self.connect_to_track_wires(vss_hm_list, inst.get_all_port_pins('VSS_vm')) + self.connect_to_track_wires(vdd_hm_list, inst.get_all_port_pins('VDD_vm')) + + +class BufCMOSRowGR(GuardRing): + def __init__(self, temp_db: TemplateDB, params: Param, **kwargs: Any) -> None: + GuardRing.__init__(self, temp_db, params, **kwargs) + + @classmethod + def get_params_info(cls) -> Dict[str, str]: + ans = BufCMOSV1Row.get_params_info() + ans.update( + pmos_gr='pmos guard ring tile name.', + nmos_gr='nmos guard ring tile name.', + edge_ncol='Number of columns on guard ring edge. Use 0 for default.', + ) + return ans + + @classmethod + def get_default_param_values(cls) -> Dict[str, Any]: + ans = BufCMOSV1Row.get_default_param_values() + ans.update( + pmos_gr='pgr', + nmos_gr='ngr', + edge_ncol=0, + ) + return ans + + def get_layout_basename(self) -> str: + return self.__class__.__name__ + + def draw_layout(self) -> None: + params = self.params + pmos_gr: str = params['pmos_gr'] + nmos_gr: str = params['nmos_gr'] + edge_ncol: int = params['edge_ncol'] + + core_params = params.copy(remove=['pmos_gr', 'nmos_gr', 'edge_ncol']) + master = self.new_template(BufCMOSV1Row, params=core_params) + + gr_sub_sep = master.gr_sub_sep_col + sep_ncol_left = sep_ncol_right = gr_sub_sep + sep_ncol = (sep_ncol_left, sep_ncol_right) + + inst, sup_list = self.draw_guard_ring(master, pmos_gr, nmos_gr, sep_ncol, edge_ncol) + vdd_hm_list, vss_hm_list = [], [] + for (vss_list, vdd_list) in sup_list: + vss_hm_list.extend(vss_list) + vdd_hm_list.extend(vdd_list) + + self.add_pin('VSS', vss_hm_list, connect=True) + self.add_pin('VDDA', vdd_hm_list, connect=True) diff --git a/src/bag3_analog/layout/tia/tia.py b/src/bag3_analog/layout/tia/tia.py new file mode 100644 index 0000000..17e0b9a --- /dev/null +++ b/src/bag3_analog/layout/tia/tia.py @@ -0,0 +1,403 @@ +"""This module defines delay_res_unit.""" + +from typing import Mapping, Any, Optional, Type, cast, Dict + +from bag.util.immutable import Param +from bag.design.module import Module +from bag.design.database import ModuleDB +from bag.layout.template import TemplateDB, TemplateBase +from bag.layout.routing.base import TrackID, WireArray + +from pybag.enum import RoundMode, Orientation, Direction +from pybag.core import Transform, BBox + +from xbase.layout.res.base import ResBasePlaceInfo, ResArrayBase +from xbase.layout.mos.top import GenericWrapper +from xbase.layout.array.top import ArrayBaseWrapper +from xbase.layout.cap.core import MOMCapCore +from bag3_analog.layout.res.termination import Termination +from .buf_cmos_cell import BufCMOSGR, BufCMOS +from ...schematic.tia_res import bag3_analog__tia_res + +import numpy as np +from .util import round_to_blk_pitch, draw_stack_wire, extend_matching_wires + +class TIARes(ResArrayBase): + def __init__(self, temp_db: TemplateDB, params: Param, **kwargs: Any) -> None: + ResArrayBase.__init__(self, temp_db, params, **kwargs) + + @classmethod + def get_schematic_class(cls) -> Optional[Type[Module]]: + return bag_vco__res + + @classmethod + def get_params_info(cls) -> Mapping[str, str]: + return dict( + pinfo='The ResBasePlaceInfo object.', + nx_dum='Number of dummies on each side, X direction', + ny_dum='Number of dummies on each side, Y direction', + ) + + @classmethod + def get_default_param_values(cls) -> Mapping[str, Any]: + return dict(nx_dum=0, ny_dum=0) + + def draw_layout(self) -> None: + pinfo = cast(ResBasePlaceInfo, ResBasePlaceInfo.make_place_info(self.grid, self.params['pinfo'])) + self.draw_base(pinfo) + + sub_type = pinfo.res_config['sub_type_default'] + if sub_type != 'ntap': + raise ValueError(f'This generator does not support sub_type={sub_type}. Only ntap is supported.') + + # Get hm_layer and vm_layer WireArrays + warrs, bulk_warrs = self.connect_hm_vm() + + # Connect all dummies + self.connect_dummies(warrs, bulk_warrs) + + # Supply connections on xm_layer + self.connect_bulk_xm(bulk_warrs) + + unit_params = dict( + w=pinfo.w_res, + l=pinfo.l_res, + intent=pinfo.res_type, + ) + nx, ny = pinfo.nx, pinfo.ny + nx_dum: int = self.params['nx_dum'] + ny_dum: int = self.params['ny_dum'] + npar = nx - 2 * nx_dum + nser = ny - 2 * ny_dum + num_dum = nx * ny - npar * nser + + # --- Routing of unit resistors --- # + hm_layer = self.conn_layer + 1 + vm_layer = hm_layer + 1 + xm_layer = vm_layer + 1 + r_bot, r_top = self.connect_units(warrs, nx_dum, nx - nx_dum, ny_dum, ny - ny_dum) + + # connect top vm_layers to xm_layer + w_xm_sig = self.tr_manager.get_width(xm_layer, 'sig') + xm_idx0 = self.grid.coord_to_track(xm_layer, r_top.middle, RoundMode.NEAREST) + xm_tid0 = TrackID(xm_layer, xm_idx0, w_xm_sig) + xm_idx1 = self.grid.coord_to_track(xm_layer, r_bot.middle, RoundMode.NEAREST) + xm_tid1 = TrackID(xm_layer, xm_idx1, w_xm_sig) + self.add_pin('PLUS', self.connect_to_tracks(r_top, xm_tid0)) + self.add_pin('MINUS', self.connect_to_tracks(r_bot, xm_tid1)) + + self.sch_params = dict( + res_params=dict( + unit_params=unit_params, + nser=nser, + npar=npar, + ), + dum_params=dict( + unit_params=unit_params, + nser=1, + npar=num_dum, + ), + sub_type=sub_type, + ) + + +class TIA(TemplateBase): + def __init__(self, temp_db: TemplateDB, params: Param, **kwargs: Any) -> None: + TemplateBase.__init__(self, temp_db, params, **kwargs) + self._sup_wire = {} + self._decap_w = 0 + + @property + def sup_wire(self) -> Dict[WireArray, Any]: + return self._sup_wire + + @property + def decap_w(self) -> int: + return self._decap_w + + def get_schematic_class_inst(self) -> Optional[Type[Module]]: + if self.params['res_term_params']: + # noinspection PyTypeChecker + return ModuleDB.get_schematic_class('bag3_analog', 'tia_term') + else: + # noinspection PyTypeChecker + return ModuleDB.get_schematic_class('bag3_analog', 'tia') + + + @classmethod + def get_params_info(cls) -> Mapping[str, str]: + return dict( + buf_params='Parameters for buffer', + res_params='Parameters for feedback resistor', + cap_params='Parameters for mom cap, if not specified, removed the mom cap', + res_term_params='Parameters for termination resistor', + decap_params='Parameters for DC decoupling cap', + do_power_fill='True to do power fill from M4 to M6', + guard_ring='True to draw guard ring', + ) + + @classmethod + def get_default_param_values(cls) -> Dict[str, Any]: + return dict( + do_power_fill=False, + cap_params=None, + res_term_params=None, + decap_params=None, + guard_ring=True, + ) + + def draw_layout(self) -> None: + do_power_fill = self.params['do_power_fill'] + # make masters + buf_params: Mapping[str, Any] = self.params['buf_params'] + guard_ring: bool = self.params['guard_ring'] + + buf_gen = BufCMOSGR if guard_ring else BufCMOS + buf_master = self.new_template(GenericWrapper, params=dict(cls_name=buf_gen.get_qualified_name(), + params=buf_params)) + + res_params: Mapping[str, Any] = self.params['res_params'] + res_master = self.new_template(ArrayBaseWrapper, params=dict(cls_name=TIARes.get_qualified_name(), + params=res_params)) + + cap_params: Optional[Mapping[str, Any]] = self.params.get('cap_params', None) + if cap_params: + cap_master = self.new_template(MOMCapCore, params=cap_params) + + res_term_params: Optional[Mapping[str, Any]] = self.params.get('res_term_params', None) + if res_term_params: + res_term_master = self.new_template(ArrayBaseWrapper, params=dict(cls_name=Termination.get_qualified_name(), + params=res_term_params)) + + decap_params: Optional[Mapping[str, Any]] = self.params.get('decap_params', None) + if decap_params: + decap_master = self.new_template(MOMCapCore, params=decap_params) + + # --- Placement --- # + w_blk, h_blk = self.grid.get_block_size(buf_master.size[0]) + buf_w, buf_h = buf_master.bound_box.w, buf_master.bound_box.h + res_w, res_h = res_master.bound_box.w, res_master.bound_box.h + if cap_params: + cap_w, cap_h = cap_master.bound_box.w, cap_master.bound_box.h + else: + cap_w, cap_h = 0, 0 + + if res_term_params: + res_term_w, res_term_h = res_term_master.bound_box.w, res_term_master.bound_box.h + else: + res_term_w, res_term_h = 0, 0 + + if decap_params: + decap_w, decap_h = decap_master.bound_box.w, decap_master.bound_box.h + else: + decap_w, decap_h = 0, 0 + + self._decap_w = decap_w + + tot_w = max(buf_w + 2 * res_w, 2 * cap_w + res_term_w) + decap_w + tot_h = max(cap_h + max(buf_h, res_h) + res_term_h, decap_h) + + buf_xl = (tot_w - buf_w + decap_w) // 2 + buf_yl = cap_h + res_term_h + buf_xl, buf_yl = round_to_blk_pitch(buf_xl, buf_yl, w_blk, h_blk) + buf_inst = self.add_instance(buf_master, xform=Transform(dx=buf_xl, dy=buf_yl)) + tr_manager = buf_master.core.tr_manager + + res_xl = buf_xl - res_w + res_yl = cap_h + (max(buf_h, res_h) - res_h) // 2 + res_term_h + res_xl, res_yl = round_to_blk_pitch(res_xl, res_yl, w_blk, h_blk) + resp_inst = self.add_instance(res_master, xform=Transform(dx=res_xl, dy=res_yl)) + resn_inst = self.add_instance(res_master, xform=Transform(dx=res_xl + res_w + buf_w, dy=res_yl)) + + if cap_params: + cap_xl = (tot_w - 2 * cap_w + decap_w) // 2 + cap_yh = cap_h + cap_xl, cap_yh = round_to_blk_pitch(cap_xl, cap_yh, w_blk, h_blk) + capp_inst = self.add_instance(cap_master, xform=Transform(dx=cap_xl + cap_w, dy=cap_yh, mode=Orientation.R180)) + capn_inst = self.add_instance(cap_master, xform=Transform(dx=cap_xl + cap_w, dy=cap_yh, mode=Orientation.MX)) + + if res_term_params: + res_term_xl = (tot_w - res_term_w + decap_w) // 2 + res_term_yl = 0 + res_term_xl, res_term_yl = round_to_blk_pitch(res_term_xl, res_term_yl, w_blk, h_blk) + res_term_inst = self.add_instance(res_term_master, xform=Transform(dx=res_term_xl, dy=res_term_yl)) + + if decap_params: + decap_xl = decap_w + decap_yl = 0 + decap_xl, decap_yl = round_to_blk_pitch(decap_xl, decap_yl, w_blk, h_blk) + decap_inst = self.add_instance(decap_master, xform=Transform(dx=decap_xl, dy=decap_yl, mode=Orientation.MY),) + + # # --- Routing --- # + xm_layer = resp_inst.get_pin('MINUS').layer_id + ym_layer = xm_layer + 1 + zm_layer = ym_layer + 1 + w_sig_xm = tr_manager.get_width(xm_layer, 'sig') + w_sig_ym = tr_manager.get_width(ym_layer, 'sig') + + # vip/ vin + if cap_params: + self.reexport(capp_inst.get_port('minus'), net_name='vip') + self.reexport(capn_inst.get_port('minus'), net_name='vin') + if res_term_params: + # export to zm_layer + stack = draw_stack_wire(self, res_term_inst.get_pin('PLUS'), zm_layer, tr_list=[1, 4], sp_list=[3, 4]) + vip_zm = stack[-1] + stack = draw_stack_wire(self, res_term_inst.get_pin('MINUS'), zm_layer, tr_list=[1, 4], sp_list=[3, 4]) + vin_zm = stack[-1] + stack = draw_stack_wire(self, res_term_inst.get_pin('MID'), zm_layer, tr_list=[1, 4], sp_list=[3, 4]) + mid_zm = stack[-1] + vdd_res = res_term_inst.get_all_port_pins('VDD', xm_layer) + vdd_zm = [] + for vdd in vdd_res: + stack = draw_stack_wire(self, vdd, zm_layer, tr_list=[1, 4], sp_list=[3, 4]) + vdd_zm += stack[-1] + + self.add_pin('VDD', vdd_zm, connect=True) + # mid + mid_xm = [res_term_inst.get_pin('MID')] + if decap_params: + mid_ym_tidx = decap_inst.get_pin('plus', layer=ym_layer).track_id.base_index + mid_ym_tidx = tr_manager.get_next_track(ym_layer, mid_ym_tidx, 'sig', 'sig') + mid_ym_tidx = tr_manager.get_next_track(ym_layer, mid_ym_tidx, 'sig', 'sig') + mid_ym_tidx = tr_manager.get_next_track(ym_layer, mid_ym_tidx, 'sig', 'sig') + mid_xm += decap_inst.get_all_port_pins('plus', xm_layer) + self.connect_to_tracks(mid_xm + mid_zm, TrackID(ym_layer, mid_ym_tidx, width=w_sig_ym)) + self.add_pin('VDD', decap_inst.get_all_port_pins('minus', zm_layer), connect=True) + + # vip_m/ vin_m + + vlay = (buf_inst.get_port('vip').get_single_layer(), 'drawing') + vdir = Direction.LOWER + vip_m_buf = buf_inst.get_pin('vip') + vin_m_buf = buf_inst.get_pin('vin') + vip_m_res = resp_inst.get_pin('MINUS') + vin_m_res = resn_inst.get_pin('MINUS') + + vm_layer = xm_layer - 1 + ym_layer = xm_layer + 1 + vip_passive =[vip_m_res] + vin_passive =[vin_m_res] + if cap_params: + vip_m_cap_xm, vip_m_cap_vm, vip_m_cap_ym = capp_inst.get_all_port_pins('plus', xm_layer)[0], \ + capp_inst.get_all_port_pins('plus', vm_layer)[0],\ + capp_inst.get_all_port_pins('plus', ym_layer)[0] + vin_m_cap_xm, vin_m_cap_vm, vin_m_cap_ym = capn_inst.get_all_port_pins('plus', xm_layer)[0], \ + capn_inst.get_all_port_pins('plus', vm_layer)[0], \ + capn_inst.get_all_port_pins('plus', ym_layer)[0] + + vip_xm_idx = tr_manager.get_next_track(xm_layer, vip_m_cap_xm.track_id.base_index, 'sig', 'sig', up=True) + vip_xm_idx = tr_manager.get_next_track(xm_layer, vip_xm_idx, 'sig', 'sig', up=True) + vin_xm_idx = tr_manager.get_next_track(xm_layer, vin_m_cap_xm.track_id.base_index, 'sig', 'sig', up=True) + vin_xm_idx = tr_manager.get_next_track(xm_layer, vin_xm_idx, 'sig', 'sig', up=True) + vip_m_cap = self.connect_to_tracks([vip_m_cap_vm, vip_m_cap_ym], TrackID(xm_layer, vip_xm_idx, width=w_sig_xm)) + vin_m_cap = self.connect_to_tracks([vin_m_cap_vm, vin_m_cap_ym], TrackID(xm_layer, vin_xm_idx, width=w_sig_xm)) + vip_passive += [vip_m_cap] + vin_passive += [vin_m_cap] + vip_m = self.connect_bbox_to_track_wires(vdir, vlay, vip_m_buf, vip_passive) + vin_m = self.connect_bbox_to_track_wires(vdir, vlay, vin_m_buf, vin_passive) + vip_name = 'vip_m' if cap_params else 'vip' + vin_name = 'vin_m' if cap_params else 'vin' + + + # connect vip/ vin on M7 + if res_term_params: + stack_p = draw_stack_wire(self, vip_m[0], zm_layer, tr_list=[1, 4], sp_list=[3, 4]) + stack_n = draw_stack_wire(self, vin_m[0], zm_layer, tr_list=[1, 4], sp_list=[3, 4]) + buf_vip = stack_p[-1] + buf_vin = stack_n[-1] + # vip_m7_tidx = self.grid.coord_to_track(zm_layer + 1, buf_vip[0].middle, mode=RoundMode.GREATER) + # vin_m7_tidx = self.grid.coord_to_track(zm_layer + 1, buf_vin[0].middle, mode=RoundMode.LESS_EQ) + # vip_m7 = self.connect_to_tracks(buf_vip + vip_zm, TrackID(zm_layer + 1, vip_m7_tidx, width=1)) + # vin_m7 = self.connect_to_tracks(buf_vin + vin_zm, TrackID(zm_layer + 1, vin_m7_tidx, width=1)) + # vip_m7, vin_m7 = extend_matching_wires(self,[vip_m7, vin_m7]) + self.add_pin(vip_name, buf_vip + vip_zm, connect=True) + self.add_pin(vin_name, buf_vin + vin_zm, connect=True) + else: + self.add_pin(vip_name, vip_m) + self.add_pin(vin_name, vin_m) + + + # vop/ von + vop_m_buf = buf_inst.get_all_port_pins('vop') + von_m_buf = buf_inst.get_all_port_pins('von') + vop_m_res = resn_inst.get_pin('PLUS') + von_m_res = resp_inst.get_pin('PLUS') + for bbox in vop_m_buf: + vop = self.connect_bbox_to_track_wires(vdir, vlay, bbox, vop_m_res) + for bbox in von_m_buf: + von = self.connect_bbox_to_track_wires(vdir, vlay, bbox, von_m_res) + self.add_pin('vop', vop_m_res) + self.add_pin('von', von_m_res) + + # VDD/VSS + vdd_xm_buf = buf_inst.get_all_port_pins('VDDA') + vdd_xm_left = resp_inst.get_all_port_pins('VDD') + vdd_xm_right = resn_inst.get_all_port_pins('VDD') + vdd_xm = vdd_xm_buf + vdd_xm_left + vdd_xm_right + vss_xm = buf_inst.get_all_port_pins('VSS') + top_idx = np.argmax([vdd.track_id.base_index for vdd in vdd_xm]) + sup_xm = vdd_xm + vss_xm + bot_idx = np.argmin([vdd.track_id.base_index for vdd in sup_xm]) + # self._sup_wire.update(top_wire=vdd_xm[top_idx], bot_wire=sup_xm[bot_idx], left_wire=vdd_xm[1], right_wire=vdd_xm[-1]) + self._sup_wire.update(top_wire=vdd_xm[top_idx], bot_wire=sup_xm[bot_idx]) + + # set size + xm_layer = vdd_xm[0].layer_id + ym_layer = xm_layer + 1 + zm_layer = ym_layer + 1 + self.set_size_from_bound_box(zm_layer, BBox(0, 0, tot_w, tot_h)) + + if not do_power_fill: + self.add_pin('VDD_xm_buf', vdd_xm_buf, label='VDD:') + self.add_pin('VDD_xm_right', vdd_xm_right, label='VDD:') + self.add_pin('VDD_xm_left', vdd_xm_left, label='VDD:') + self.add_pin('VSS_xm', vss_xm, label='VSS:') + else: + sup_w_xm = tr_manager.get_width(xm_layer, 'sup') + bbox = self.bound_box + bb_xl, bb_xh, bb_yl, bb_yh = bbox.xl, bbox.xh, bbox.yl, bbox.yh + + # M5 + sup_w_ym = tr_manager.get_width(ym_layer, 'sup') + wl, wh = self.grid.get_wire_bounds(ym_layer, 0, width=sup_w_ym) + w_ym = int((wh - wl) / 2) + via_ext_xm, via_ext_ym = self.grid.get_via_extensions(Direction.LOWER, xm_layer, sup_w_xm, sup_w_ym) + dx =via_ext_xm + w_ym + # dy = self.bound_box.yl - vss_xm[0].bound_box.yl + via_ext_ym + bb = BBox(xl=bb_xl - dx, xh=bb_xh - dx, yl=capp_inst.bound_box.yh, yh=bb_yh + via_ext_ym) + vdd_ym, vss_ym = self.do_power_fill(ym_layer, tr_manager, vdd_xm, vss_xm, bound_box=bb) + # self.add_pin('VDD_ym', vdd_ym, label='VDD:') + # self.add_pin('VSS_ym', vss_ym, label='VSS:') + + # M6 + sup_w_zm = tr_manager.get_width(zm_layer, 'sup') + wl, wh = self.grid.get_wire_bounds(zm_layer, 0, width=sup_w_zm) + w_zm = int((wh - wl) / 2) + via_ext_zm, via_ext_zm_x = self.grid.get_via_extensions(Direction.LOWER, ym_layer, sup_w_ym, sup_w_zm) + dx = self.bound_box.xl - vss_ym[0].bound_box.xl + via_ext_zm_x + bb = bb.expand(dy=- via_ext_zm - w_zm, dx=dx) + vdd_zm, vss_zm = self.do_power_fill(zm_layer, tr_manager, vdd_ym, vss_ym, bound_box=bb) + self.add_pin('VDD_zm', vdd_zm, label='VDD:') + self.add_pin('VSS_zm', vss_zm, label='VSS:') + + # set size + self.set_size_from_bound_box(6, BBox(0, 0, tot_w, tot_h)) + + # set schematic parameters + if res_term_params: + self.sch_params = dict( + buf_cmos_cell_params=buf_master.sch_params, + res_params=res_master.sch_params, + res_term_params=res_term_master.sch_params, + decap_params=decap_master.sch_params, + + ) + else: + + self.sch_params = dict( + buf_cmos_cell_params=buf_master.sch_params, + res_params=res_master.sch_params, + cap_params=cap_master.sch_params if cap_params else None, + with_cap=True if cap_params else False, + ) diff --git a/src/bag3_analog/layout/tia/util.py b/src/bag3_analog/layout/tia/util.py new file mode 100644 index 0000000..b460599 --- /dev/null +++ b/src/bag3_analog/layout/tia/util.py @@ -0,0 +1,1061 @@ +from __future__ import (absolute_import, division, + print_function, unicode_literals) +# noinspection PyUnresolvedReferences,PyCompatibility +from builtins import * + +from typing import Any, Set, Dict, Optional, Union, List, Tuple + +from bag.layout.routing import TrackID, WireArray +from pybag.enum import RoundMode, MinLenMode, Orient2D, Direction + +from bag.layout.template import TemplateDB +from bag.layout.util import BBox +from bag.util.math import HalfInt + +from xbase.layout.mos.base import MOSBasePlaceInfo, MOSBase, TrackManager +from bag.layout.template import TemplateBase +import math + + +def via_maker(template, l1, l2, object, coordx, coordy, width): + base = object + layers = [] + width = [0]*l1+ width + for i in range(l1, l2): + if (i + 1) % 2 == 0: + out_track = TrackID(i + 1, template.grid.coord_to_nearest_track(i + 1, coordy, half_track=True, mode=0, + unit_mode=True), width=width[i]) + else: + out_track = TrackID(i + 1, template.grid.coord_to_nearest_track(i + 1, coordx, half_track=True, mode=0, + unit_mode=True), width=width[i]) + layers.append(template.connect_to_tracks([base], out_track, min_len_mode=0)) + base = layers[-1] + + return layers + + +def get_mos_conn_layer(self): + return self.grid.tech_info.tech_params['layout']['mos_tech_class'].get_mos_conn_layer() + + +def max_conn_wires(self, tr_manager, wire_type, wire_list, start_coord=None, end_coord=None): + max_coord, min_coord = 0, math.inf + for w in wire_list: + max_coord = max_coord if max_coord > w.upper else w.upper + min_coord = min_coord if min_coord < w.lower else w.lower + + start_coord = start_coord if start_coord is not None else min_coord + end_coord = end_coord if end_coord is not None else max_coord + if end_coord < start_coord: + raise ValueError("[Util Error:] End points smaller than start point, please check") + conn_layer = wire_list[0].layer_id+1 + conn_w = tr_manager.get_width(conn_layer, wire_type) + cur_tidx = self.grid.coord_to_track(conn_layer, start_coord, mode=RoundMode.NEAREST) + res_wire_list = [] + while self.grid.track_to_coord(conn_layer, cur_tidx) <= end_coord: + res_wire_list.append(self.connect_to_tracks(wire_list, TrackID(conn_layer, cur_tidx, conn_w))) + cur_tidx = tr_manager.get_next_track(conn_layer, cur_tidx, wire_type, wire_type) + if len(res_wire_list) < 1: + raise ValueError("[Util Error:] Targeted connection have no effect") + return res_wire_list + + +def round_to_blk_pitch(x_loc, y_loc, blk_w, blk_h): + return (math.ceil(x_loc / blk_w) * blk_w, math.ceil(y_loc / blk_h) * blk_h) + + +def draw_stack_wire(self: TemplateBase, wire: WireArray, top_layid: int, x0: Optional[Union[int, float]] = None, + y0: Optional[Union[int, float]] = None, x1: Optional[Union[int, float]] = None, + y1: Optional[Union[int, float]] = None, tr_list: Optional[List[Union[int, float]]] = None, + sp_list: Optional[List[Union[HalfInt, int]]] = None, max_mode: bool = True, + min_len_mode: MinLenMode = MinLenMode.NONE, + mode: int = 1, sep_margin: bool = False, + sp_margin_list: Optional[List[Union[HalfInt, int]]] = None) -> List[List[WireArray]]: + """ + create WireArray from bot_layid to top_layid-1 within the given coordinates + Parameters + ---------- + self: TemplateBase + template database. + wire: WireArray + wire to be connected. + top_layid: Int + top layer id. + x0: Union[Int, float] + bottom left, x coordinate. + y0: Union[Int, float] + bottom left, y coordinate. + x1: Union[Int, float] + top right, x coordinate. + y1: Union[Int, float] + top right, y coordinate. + x_mode: Int + x direction mode. + If negative, the result wire will have width less than or equal to the given width. + If positive, the result wire will have width greater than or equal to the given width. + y_mode: Int + y direction mode. + If negative, the result wire will have width less than or equal to the given width. + If positive, the result wire will have width greater than or equal to the given width. + half_track: Bool + True to get half track. + tr_list: List[Union[Int, float]] + Wire array track list. + sp_list: List[Union[HalfInt]] + Wire array track separation list. + max_mode: Bool + True to draw wire with max width from coordinates and tr_list + track_mode: + ####### + min_len_mode: Int + Mininum length mode. See connect_to_tracks for details. + mode: Int + draw stack mode. + Returns + ------- + wire_arr_list: List[WireArray] + stack wire list. + """ + bot_layid = wire.layer_id + # get wire layer + if top_layid > bot_layid: + layer_flip = False + else: + layer_flip = True + + if tr_list is not None: + if len(tr_list) != top_layid - bot_layid: + raise ValueError('If given tr_list, its length should same as layers(top_layid-bot_layid)') + + # get coordinate + if x0 is None: + x0 = wire.bound_box.xl + if y0 is None: + y0 = wire.bound_box.yl + if x1 is None: + x1 = wire.bound_box.xh + if y1 is None: + y1 = wire.bound_box.yh + + # check coordinates + if x1 <= x0 or y1 <= y0: + raise ValueError("If given coordinates," + "we need left coord smaller than right coordinate\n" + "and bottom coordinate smaller than top coordinate") + if bot_layid == top_layid: + raise ValueError("Need top_layer != wire layer. It can be larger or smaller than it.") + + # draw stack wires + wire_arr_list = [wire] + if not layer_flip: + swp_list = list(range(bot_layid, top_layid)) + else: + swp_list = list(range(top_layid, bot_layid))[::-1] + + for i in swp_list: + if self.grid.get_direction(i + 1) == Orient2D.y: + if mode == 0: + tr, tr_w = self.grid.interval_to_track(i + 1, (x0, x1)) + if tr_w is None: + tr_w = 1 + # could specify tr from outside and choose the larger one + if tr_list is not None: + if tr_list[i - bot_layid] is not None: + if max_mode: + tr_w = max(tr_w, tr_list[i - bot_layid]) + else: + tr_w = tr_list[i - bot_layid] + + tr_tid = TrackID(i + 1, tr, width=tr_w) + wire_n = self.connect_to_tracks(wire_arr_list[-1], tr_tid, track_lower=y0, track_upper=y1, + min_len_mode=min_len_mode) + elif mode == 1: + # get wire width and space + if tr_list is not None: + w_ntr = tr_list[i - bot_layid] + else: + w_ntr = wire.bound_box.w + if sp_list is not None: + sp_ntr = sp_list[i - bot_layid] + else: + sp_ntr = self.grid.get_sep_tracks(i + 1, ntr1=w_ntr, ntr2=w_ntr) + if sp_margin_list is not None: + sp_margin_ntr = sp_margin_list[i - bot_layid] + else: + sp_margin_ntr = sp_ntr // 2 + tid_lower = self.grid.coord_to_track(i + 1, x0, mode=RoundMode.GREATER_EQ) + tid_upper = self.grid.coord_to_track(i + 1, x1, mode=RoundMode.LESS_EQ) + if tid_lower == tid_upper: + tr_idx = [tid_upper] + else: + tr_idx = self.get_available_tracks(i + 1, tid_lower, tid_upper, y0 - 170, y1 + 170, w_ntr, sep=sp_ntr, + sep_margin=sp_margin_ntr if sep_margin else None) + if tid_upper - tid_lower < w_ntr and len(tr_idx) > 0: + tr_idx = [(tid_upper + tid_lower) / 2] + wire_n = [] + for idx in tr_idx: + tr_tid = TrackID(i + 1, idx, width=w_ntr) + wire_n.append(self.connect_to_tracks(wire_arr_list[-1], tr_tid, min_len_mode=min_len_mode)) + else: + raise ValueError("For now, only support two modes.") + else: + if mode == 0: + tr, tr_w = self.grid.interval_to_track(i + 1, (y0, y1)) + if tr_w is None: + tr_w = 1 + # could specify tr from outside and choose the larger one + if tr_list is not None: + if tr_list[i - bot_layid] is not None: + if max_mode: + tr_w = max(tr_w, tr_list[i - bot_layid]) + else: + tr_w = tr_list[i - bot_layid] + tr_tid = TrackID(i + 1, tr, width=tr_w) + wire_n = self.connect_to_tracks(wire_arr_list[-1], tr_tid, track_lower=x0, track_upper=x1, + min_len_mode=min_len_mode) + elif mode == 1: + # get wire width and space + if tr_list is not None: + w_ntr = tr_list[i - bot_layid] + else: + w_ntr = wire.bound_box.w + if sp_list is not None: + sp_ntr = sp_list[i - bot_layid] + else: + sp_ntr = self.grid.get_sep_tracks(i + 1, ntr1=w_ntr, ntr2=w_ntr) + if sp_margin_list is not None: + sp_margin_ntr = sp_margin_list[i - bot_layid] + else: + sp_margin_ntr = sp_ntr // 2 + tid_lower = self.grid.coord_to_track(i + 1, y0, mode=RoundMode.GREATER_EQ) + tid_upper = self.grid.coord_to_track(i + 1, y1, mode=RoundMode.LESS_EQ) + if tid_upper == tid_lower: + tr_idx = [tid_lower] + else: + tr_idx = self.get_available_tracks(i + 1, tid_lower, tid_upper, x0 - 150, x1 + 150, w_ntr, sep=sp_ntr, + sep_margin=sp_margin_ntr if sep_margin else None) + if tid_upper - tid_lower < w_ntr and len(tr_idx) > 0: + tr_idx = [(tid_upper + tid_lower) / 2] + + + wire_n = [] + for idx in tr_idx: + tr_tid = TrackID(i + 1, idx, width=w_ntr) + wire_n.append(self.connect_to_tracks(wire_arr_list[-1], tr_tid, min_len_mode=min_len_mode, track_lower=x0, track_upper=x1)) + else: + raise ValueError("For now, only support two modes.") + + wire_arr_list.append(wire_n) + + return wire_arr_list + + + # def do_power_fill_poly(self, # type: TemplateBase + # layer_id, # type: int + # space, # type: Union[float, int] + # space_le, # type: Union[float, int] + # vdd_warrs=None, # type: Optional[Union[WireArray, List[WireArray]]] + # vss_warrs=None, # type: Optional[Union[WireArray, List[WireArray]]] + # bound_box_list=None, # type: Optional[BBox] + # exclude_box_list=[], + # fill_width=1, # type: int + # fill_space=0, # type: int + # tr_offset=0, # type: Union[float, int] + # min_len=0, # type: Union[float, int] + # flip=False, # type: bool + # unit_mode=False, # type: bool + # vss_only=False, + # vdd_only=False, + # ): + # # type: (...) -> Tuple[List[WireArray], List[WireArray]] + # """Draw power fill on the given layer.""" + # res = self.grid.resolution + # if not unit_mode: + # space = int(round(space / res)) + # space_le = int(round(space_le / res)) + # x_margin = int(round(x_margin / res)) + # y_margin = int(round(y_margin / res)) + # tr_offset = int(round(tr_offset / res)) + # min_len = int(round(min_len / res)) + # + # min_len_process = self.grid.get_min_length(layer_id, fill_width, unit_mode=True) + # min_len_global = max(min_len, min_len_process) + # + # if bound_box_list is None: + # bound_box_list = [self.bound_box] + # + # cut_out_bound_box_list = self.bbox_list_subtract(bound_box_list, exclude_box_list) + # + # # get absolute 0 half track index + # tr_off = self.grid.coord_to_track(layer_id, tr_offset, unit_mode=True) + # htr0 = int(tr_off * 2) + 1 + fill_width + fill_space + # htr_pitch = 2 * (fill_width + fill_space) + # is_horizontal = (self.grid.get_direction(layer_id) == 'x') + # + # top_vdd, top_vss = [], [] + # + # for bound_box in cut_out_bound_box_list: + # + # if is_horizontal: + # cl, cu = bound_box.bottom_unit, bound_box.top_unit + # lower, upper = bound_box.left_unit, bound_box.right_unit + # if bound_box.width_unit < min_len_global: + # min_len = min_len_process + # print("warning, bbbox is less wide than min_len, overriding min_len") + # else: + # min_len = min_len_global + # else: + # cl, cu = bound_box.left_unit, bound_box.right_unit + # lower, upper = bound_box.bottom_unit, bound_box.top_unit + # if bound_box.height_unit < min_len_global: + # min_len = min_len_process + # print("warning, bbbox is less tall than min_len, overriding min_len") + # else: + # min_len = min_len_global + # + # # get max and min track + # tr_bot = self.grid.find_next_track(layer_id, cl, tr_width=fill_width, half_track=True, + # mode=1, unit_mode=True) + # tr_top = self.grid.find_next_track(layer_id, cu, tr_width=fill_width, half_track=True, + # mode=-1, unit_mode=True) + # + # # go thru each track and get the open intervals + # n0 = - (-(int(tr_bot * 2) + 1 - htr0) // htr_pitch) + # n1 = (int(tr_top * 2) + 1 - htr0) // htr_pitch + # + # for ncur in range(n0, n1 + 1): + # tr_idx = (htr0 + ncur * htr_pitch - 1) / 2 + # tid = TrackID(layer_id, tr_idx, width=fill_width) + # + # cur_list = top_vss if (ncur % 2 == 0) != flip else top_vdd + # + # # vdd_only or vdd_only + # cur_list = top_vss if vss_only else cur_list + # cur_list = top_vdd if vdd_only else cur_list + # if vss_only and vdd_only: + # raise ValueError("only one of 'vss_only' and 'vdd_only' could be True.") + # + # for tl, tu in self.open_interval_iter(tid, lower, upper, sp=space, sp_le=space_le, + # min_len=min_len): + # cur_list.append(WireArray(tid, tl, tu, res=res, unit_mode=True)) + # + # # draw the grid rects for each interval + # for warr in chain(top_vdd, top_vss): + # for lay, box_arr in warr.wire_arr_iter(self.grid): + # self.add_rect(lay, box_arr) + # + # # drop vias + # if vdd_warrs: + # self.draw_vias_on_intersections(vdd_warrs, top_vdd) + # if vss_warrs: + # self.draw_vias_on_intersections(vss_warrs, top_vss) + # + # return top_vdd, top_vss + # + # def bbox_list_subtract(self, bbox_a_list, bbox_b_list): + # bbox_results = bbox_a_list + # + # for bbox_b in bbox_b_list: + # bbox_results_new = [] + # + # for bbox_a in bbox_results: + # # // h +-+-+-+ + # # // . |6|7|8| + # # // g +-+-+-+ + # # // . |3|4|5| + # # // f +-+-+-+ + # # // . |0|1|2| + # # // e +-+-+-+ + # # // . a b c d + # + # a = min(bbox_a.left_unit, bbox_b.left_unit) + # if (bbox_a.right_unit > bbox_b.left_unit) and (bbox_b.right_unit > bbox_a.left_unit): + # b = max(bbox_a.left_unit, bbox_b.left_unit) + # c = min(bbox_a.right_unit, bbox_b.right_unit) + # x_overlap = True + # else: + # c = max(bbox_a.left_unit, bbox_b.left_unit) + # b = min(bbox_a.right_unit, bbox_b.right_unit) + # x_overlap = False + # d = max(bbox_a.right_unit, bbox_b.right_unit) + # + # e = min(bbox_a.bottom_unit, bbox_b.bottom_unit) + # if (bbox_a.top_unit > bbox_b.bottom_unit) and (bbox_b.top_unit > bbox_a.bottom_unit): + # f = max(bbox_a.bottom_unit, bbox_b.bottom_unit) + # g = min(bbox_a.top_unit, bbox_b.top_unit) + # y_overlap = True + # else: + # g = max(bbox_a.bottom_unit, bbox_b.bottom_unit) + # f = min(bbox_a.top_unit, bbox_b.top_unit) + # y_overlap = False + # h = max(bbox_a.top_unit, bbox_b.top_unit) + # + # if y_overlap and x_overlap: + # + # colA_trivial = (a == b) + # colB_trivial = (b == c) + # colC_trivial = (c == d) + # + # rowA_trivial = (e == f) + # rowB_trivial = (f == g) + # rowC_trivial = (g == h) + # + # BRect0 = BBox(left=a, bottom=e, right=b, top=f, resolution=self.grid.resolution, + # unit_mode=True) if not (rowA_trivial or colA_trivial) else None + # BRect1 = BBox(left=b, bottom=e, right=c, top=f, resolution=self.grid.resolution, + # unit_mode=True) if not (rowA_trivial or colB_trivial) else None + # BRect2 = BBox(left=c, bottom=e, right=d, top=f, resolution=self.grid.resolution, + # unit_mode=True) if not (rowA_trivial or colC_trivial) else None + # BRect3 = BBox(left=a, bottom=f, right=b, top=g, resolution=self.grid.resolution, + # unit_mode=True) if not (rowB_trivial or colA_trivial) else None + # BRect4 = BBox(left=b, bottom=f, right=c, top=g, resolution=self.grid.resolution, + # unit_mode=True) if not (rowB_trivial or colB_trivial) else None + # BRect5 = BBox(left=c, bottom=f, right=d, top=g, resolution=self.grid.resolution, + # unit_mode=True) if not (rowB_trivial or colC_trivial) else None + # BRect6 = BBox(left=a, bottom=g, right=b, top=h, resolution=self.grid.resolution, + # unit_mode=True) if not (rowC_trivial or colA_trivial) else None + # BRect7 = BBox(left=b, bottom=g, right=c, top=h, resolution=self.grid.resolution, + # unit_mode=True) if not (rowC_trivial or colB_trivial) else None + # BRect8 = BBox(left=c, bottom=g, right=d, top=h, resolution=self.grid.resolution, + # unit_mode=True) if not (rowC_trivial or colC_trivial) else None + # + # if not (BRect0 is None): + # if (bbox_a.left_unit < bbox_b.left_unit) and (bbox_a.bottom_unit < bbox_b.bottom_unit): + # bbox_results_new.append(BRect0) + # + # if not (BRect1 is None): + # if (bbox_a.bottom_unit < bbox_b.bottom_unit) and x_overlap: + # bbox_results_new.append(BRect1) + # + # if not (BRect2 is None): + # if (bbox_a.right_unit > bbox_b.right_unit) and (bbox_a.bottom_unit < bbox_b.bottom_unit): + # bbox_results_new.append(BRect2) + # + # if not (BRect3 is None): + # if (bbox_a.left_unit < bbox_b.left_unit) and y_overlap: + # bbox_results_new.append(BRect3) + # + # if not (BRect4 is None): + # if False: + # bbox_results_new.append(BRect4) + # + # if not (BRect5 is None): + # if (bbox_a.right_unit > bbox_b.right_unit) and y_overlap: + # bbox_results_new.append(BRect5) + # + # if not (BRect6 is None): + # if (bbox_a.left_unit < bbox_b.left_unit) and (bbox_a.top_unit > bbox_b.top_unit): + # bbox_results_new.append(BRect6) + # + # if not (BRect7 is None): + # if (bbox_a.top_unit > bbox_b.top_unit) and x_overlap: + # bbox_results_new.append(BRect7) + # + # if not (BRect8 is None): + # if (bbox_a.right_unit > bbox_b.right_unit) and (bbox_a.top_unit > bbox_b.top_unit): + # bbox_results_new.append(BRect8) + # else: + # bbox_results_new.append(bbox_a) + # + # bbox_results = bbox_results_new + # + # for bbox in bbox_results: + # if (bbox.left_unit >= bbox.right_unit) or (bbox.bottom_unit >= bbox.top_unit): + # raise Exception('bbox subtraction screwed up, max dim must be greater than min dim') + # + # return bbox_results + # + # def draw_bump_rv(self, pad_diameter, pad_center, bump_layer, wing_size, rv_land_width, rv_land_space, + # remove_wings=[0, 0, 0, 0], bump_net=None, show_pins=False): + # + # pad_radius = int(np.floor(pad_diameter / 2)) + # pad_half_side = int(np.floor(0.5 * pad_diameter / (1 + np.sqrt(2)))) + # pad_layer_name = self.grid.get_layer_name(bump_layer, 0) + # pad_center_x = pad_center[0] + # pad_center_y = pad_center[1] + # + # draw_left_wing = not (bool(remove_wings[0])) + # draw_bot_wing = not (bool(remove_wings[1])) + # draw_right_wing = not (bool(remove_wings[2])) + # draw_top_wing = not (bool(remove_wings[3])) + # + # wire_drops = [] + # wire_drop_boxes = [] + # + # bot_layer = self.grid.get_layer_name(bump_layer - 1, 0) + # top_layer = self.grid.get_layer_name(bump_layer, 0) + # + # rv_land_pitch = rv_land_width + rv_land_space + # + # if draw_top_wing: + # top_pad_wing = self.add_rect(pad_layer_name, BBox( + # left=pad_center_x - pad_half_side, bottom=pad_center_y + pad_radius, + # right=pad_center_x + pad_half_side, top=pad_center_y + pad_radius + wing_size, + # resolution=self.grid.resolution, unit_mode=True + # )) + # + # wire_drop_boxes.append(top_pad_wing.bbox) + # top_wing_lower_index = self.grid.coord_to_nearest_track( + # layer_id=bump_layer - 1, + # coord=top_pad_wing.bbox.left_unit, + # mode=1, + # half_track=False, + # unit_mode=True, + # ) + # top_wing_upper_index = self.grid.coord_to_nearest_track( + # layer_id=bump_layer - 1, + # coord=top_pad_wing.bbox.right_unit, + # mode=-1, + # half_track=False, + # unit_mode=True, + # ) + # + # top_wing_span = np.floor( + # (top_wing_upper_index - top_wing_lower_index - rv_land_width) / rv_land_pitch) * rv_land_pitch + 1 + # top_wing_center = (top_wing_upper_index + top_wing_lower_index) / 2 + # top_wing_lower_range = int(np.ceil(top_wing_center - top_wing_span / 2)) + # top_wing_upper_range = int(np.floor(top_wing_center + top_wing_span / 2)) + 1 + # + # for track_index in range(top_wing_lower_range, top_wing_upper_range, rv_land_pitch): + # temp_warr = self.add_wires( + # layer_id=bump_layer - 1, + # track_idx=track_index, + # lower=top_pad_wing.bbox.bottom_unit, + # upper=top_pad_wing.bbox.top_unit, + # width=rv_land_width, + # unit_mode=True, + # ) + # self.add_via(bbox=temp_warr.get_bbox_array(self.grid).get_bbox(0), extend=False, bot_layer=bot_layer, + # top_layer=top_layer, bot_dir='y') + # wire_drops.append(temp_warr) + # + # if draw_bot_wing: + # bottom_pad_wing = self.add_rect(pad_layer_name, BBox( + # left=pad_center_x - pad_half_side, bottom=pad_center_y - pad_radius - wing_size, + # right=pad_center_x + pad_half_side, top=pad_center_y - pad_radius, + # resolution=self.grid.resolution, unit_mode=True + # )) + # + # wire_drop_boxes.append(bottom_pad_wing.bbox) + # bottom_wing_lower_index = self.grid.coord_to_nearest_track( + # layer_id=bump_layer - 1, + # coord=bottom_pad_wing.bbox.left_unit, + # mode=1, + # half_track=False, + # unit_mode=True, + # ) + # bottom_wing_upper_index = self.grid.coord_to_nearest_track( + # layer_id=bump_layer - 1, + # coord=bottom_pad_wing.bbox.right_unit, + # mode=-1, + # half_track=False, + # unit_mode=True, + # ) + # + # bottom_wing_span = np.floor( + # (bottom_wing_upper_index - bottom_wing_lower_index - rv_land_width) / rv_land_pitch) * rv_land_pitch + 1 + # bottom_wing_center = (bottom_wing_upper_index + bottom_wing_lower_index) / 2 + # bottom_wing_lower_range = int(np.ceil(bottom_wing_center - bottom_wing_span / 2)) + # bottom_wing_upper_range = int(np.floor(bottom_wing_center + bottom_wing_span / 2)) + 1 + # + # for track_index in range(bottom_wing_lower_range, bottom_wing_upper_range, rv_land_pitch): + # temp_warr = self.add_wires( + # layer_id=bump_layer - 1, + # track_idx=track_index, + # lower=bottom_pad_wing.bbox.bottom_unit, + # upper=bottom_pad_wing.bbox.top_unit, + # width=rv_land_width, + # unit_mode=True, + # ) + # self.add_via(bbox=temp_warr.get_bbox_array(self.grid).get_bbox(0), extend=False, bot_layer=bot_layer, + # top_layer=top_layer, bot_dir='y') + # wire_drops.append(temp_warr) + # + # if draw_left_wing: + # left_pad_wing = self.add_rect(pad_layer_name, BBox( + # left=pad_center_x - pad_radius - wing_size, bottom=pad_center_y - pad_half_side, + # right=pad_center_x - pad_radius, top=pad_center_y + pad_half_side, + # resolution=self.grid.resolution, unit_mode=True + # )) + # + # wire_drop_boxes.append(left_pad_wing.bbox) + # left_wing_lower_index = self.grid.coord_to_nearest_track( + # layer_id=bump_layer - 1, + # coord=left_pad_wing.bbox.left_unit, + # mode=1, + # half_track=False, + # unit_mode=True, + # ) + # left_wing_upper_index = self.grid.coord_to_nearest_track( + # layer_id=bump_layer - 1, + # coord=left_pad_wing.bbox.right_unit, + # mode=-1, + # half_track=False, + # unit_mode=True, + # ) + # + # left_wing_lower_range = left_wing_lower_index + # left_wing_upper_range = left_wing_upper_index + 2 - rv_land_width + # for left_index in range(left_wing_lower_range, left_wing_upper_range, rv_land_pitch): + # track_index = left_index + np.ceil(rv_land_width / 2 - .5) + # temp_warr = self.add_wires( + # layer_id=bump_layer - 1, + # track_idx=track_index, + # lower=left_pad_wing.bbox.bottom_unit, + # upper=left_pad_wing.bbox.top_unit, + # width=rv_land_width, + # unit_mode=True, + # ) + # self.add_via(bbox=temp_warr.get_bbox_array(self.grid).get_bbox(0), extend=False, bot_layer=bot_layer, + # top_layer=top_layer, bot_dir='y') + # wire_drops.append(temp_warr) + # + # if draw_right_wing: + # right_pad_wing = self.add_rect(pad_layer_name, BBox( + # left=pad_center_x + pad_radius, bottom=pad_center_y - pad_half_side, + # right=pad_center_x + pad_radius + wing_size, top=pad_center_y + pad_half_side, + # resolution=self.grid.resolution, unit_mode=True + # )) + # + # wire_drop_boxes.append(right_pad_wing.bbox) + # right_wing_lower_index = self.grid.coord_to_nearest_track( + # layer_id=bump_layer - 1, + # coord=right_pad_wing.bbox.left_unit, + # mode=1, + # half_track=False, + # unit_mode=True, + # ) + # right_wing_upper_index = self.grid.coord_to_nearest_track( + # layer_id=bump_layer - 1, + # coord=right_pad_wing.bbox.right_unit, + # mode=-1, + # half_track=False, + # unit_mode=True, + # ) + # + # right_wing_lower_range = right_wing_upper_index + # right_wing_upper_range = right_wing_lower_index - 2 + rv_land_width + # for right_index in range(right_wing_lower_range, right_wing_upper_range, -1 * rv_land_pitch): + # track_index = right_index - np.floor(rv_land_width / 2) + # temp_warr = self.add_wires( + # layer_id=bump_layer - 1, + # track_idx=track_index, + # lower=right_pad_wing.bbox.bottom_unit, + # upper=right_pad_wing.bbox.top_unit, + # width=rv_land_width, + # unit_mode=True, + # ) + # self.add_via(bbox=temp_warr.get_bbox_array(self.grid).get_bbox(0), extend=False, bot_layer=bot_layer, + # top_layer=top_layer, bot_dir='y') + # wire_drops.append(temp_warr) + # + # return wire_drops, wire_drop_boxes + # + # def floorplan_bbox_transform(self, base_box_list, position, orient): + # new_box_list = [] + # for base_box in base_box_list: + # if orient == 'R0': + # rotated_box = base_box + # elif orient == 'MY': + # rotated_box = [-base_box[2], base_box[1], -base_box[0], base_box[3]] + # elif orient == 'MX': + # rotated_box = [base_box[0], -base_box[3], base_box[2], -base_box[1]] + # elif orient == 'R180': + # rotated_box = [-base_box[2], -base_box[3], -base_box[0], -base_box[1]] + # else: + # raise ("bad rotation value") + # + # new_box = [rotated_box[0] + position[0], rotated_box[1] + position[1], rotated_box[2] + position[0], + # rotated_box[3] + position[1]] + # new_box_list.append(new_box) + # return new_box_list + # + # def create_global_grid(self, tr_manager, moved_macro_grid_poly_phrb, phrb_width, phrb_height, top_layer, + # glob_min_grid_layer, glob_max_grid_layer, + # macro_instance_list, bump_grid_vdd_list, bump_grid_vss_list, show_pins=True, + # pin_missed_rails=True): + # + # # Create global Grid + # top_global_vdd_warrs = [] + # top_global_vss_warrs = [] + # power_island_box_list = [] + # + # for power_island_points in moved_macro_grid_poly_phrb: + # power_island_box = BBox( + # left=power_island_points[0] * phrb_width, bottom=power_island_points[1] * phrb_height, + # right=power_island_points[2] * phrb_width, top=power_island_points[3] * phrb_height, + # resolution=self.grid.resolution, unit_mode=True + # ) + # power_island_box_list.append(power_island_box) + # self.add_rect(('ref', 'drawing'), power_island_box) + # + # [blk_w, blk_h] = self.grid.get_block_size(top_layer, unit_mode=True) + # + # warr_vdd = [] + # warr_vss = [] + # for power_layer in range(glob_min_grid_layer, glob_max_grid_layer + 1): + # + # power_grid_width_tracks = tr_manager.get_width(layer_id=power_layer, track_type='supply') + # power_grid_supply_space_tracks = tr_manager.get_space(layer_id=power_layer, type_tuple=('supply', 'supply')) + # power_grid_sig_space_tracks = tr_manager.get_space(layer_id=power_layer, type_tuple=('supply', '')) + # + # blk_snap = (power_grid_width_tracks + power_grid_supply_space_tracks) * self.grid.get_track_pitch( + # power_layer, unit_mode=True) + # + # # exclude_boxes = [] + # exclude_boxes_snapped = [] + # # exclude_boxes = master_serdes_rx.grid_exclude_boxes_per_layer.get(power_layer,[]) + # + # for macro_instance in macro_instance_list: + # macro_master = macro_instance.master + # exclude_boxes = macro_master.grid_exclude_boxes_per_layer.get(power_layer, []) if hasattr(macro_master, + # 'grid_exclude_boxes_per_layer') else [] + # + # for old_box in exclude_boxes: + # relocate_box = old_box[0].transform(loc=macro_instance.location_unit, + # orient=macro_instance.orientation, unit_mode=True) + # + # self.add_rect(('DMEXCL', 'dummy' + str(power_layer)), relocate_box) + # + # blk_snap_left = -1 * blk_snap * old_box[1][0] if not (old_box[1][0] == 0) else 1 + # blk_snap_bottom = -1 * blk_snap * old_box[1][1] if not (old_box[1][1] == 0) else 1 + # blk_snap_right = -1 * blk_snap * old_box[1][2] if not (old_box[1][2] == 0) else 1 + # blk_snap_top = -1 * blk_snap * old_box[1][3] if not (old_box[1][3] == 0) else 1 + # + # exclude_boxes_snapped.append(BBox( + # left=relocate_box.left_unit // blk_snap_left * blk_snap_left, + # bottom=relocate_box.bottom_unit // blk_snap_bottom * blk_snap_bottom, + # right=relocate_box.right_unit // blk_snap_right * blk_snap_right, + # top=relocate_box.top_unit // blk_snap_top * blk_snap_top, + # resolution=self.grid.resolution, unit_mode=True, + # )) + # + # print('adding grind on %d' % power_layer) + # # pdb.set_trace() + # + # # if power_layer == 8: + # # exclude_boxes_snapped_test = [] + # # exclude_boxes_snapped_test.append(BBox( + # # left = 211680, bottom = 705600, + # # right = 330120, top = 813960, + # # resolution=self.grid.resolution, unit_mode=True, + # # )) + # # exclude_boxes_snapped_test.append(BBox( + # # left = 483840, bottom = 695520, + # # right = 624960, top = 824040, + # # resolution=self.grid.resolution, unit_mode=True, + # # )) + # # exclude_boxes_snapped_test.append(BBox( + # # left = 211680, bottom = 740880, + # # right = 388080, top = 778680, + # # resolution=self.grid.resolution, unit_mode=True, + # # )) + # # exclude_boxes_snapped_test.append(BBox( + # # left = 388080, bottom = 720720, + # # right = 624960, top = 796320, + # # resolution=self.grid.resolution, unit_mode=True, + # # )) + # + # # elif power_layer == 9: + # + # # exclude_boxes_snapped_test = [] + # # exclude_boxes_snapped_test.append(BBox( + # # left = 388080, bottom = 727215, + # # right = 624960, top = 791505, + # # resolution=self.grid.resolution, unit_mode=True, + # # )) + # # exclude_boxes_snapped_test.append(BBox( + # # left = 211680, bottom = 740880, + # # right = 374865, top = 777840, + # # resolution=self.grid.resolution, unit_mode=True, + # # )) + # # exclude_boxes_snapped_test.append(BBox( + # # left = 211680, bottom = 746955, + # # right = 388080, top = 770925, + # # resolution=self.grid.resolution, unit_mode=True, + # # )) + # # exclude_boxes_snapped_test.append(BBox( + # # left = 211680, bottom = 705600, + # # right = 330120, top = 813960, + # # resolution=self.grid.resolution, unit_mode=True, + # # )) + # # exclude_boxes_snapped_test.append(BBox( + # # left = 483840, bottom = 695520, + # # right = 624960, top = 824040, + # # resolution=self.grid.resolution, unit_mode=True, + # # )) + # # exclude_boxes_snapped = exclude_boxes_snapped_test + # + # if power_layer == top_layer: + # min_len = 1.5 * (tr_manager.get_width(layer_id=power_layer, track_type='supply') + tr_manager.get_space( + # layer_id=power_layer, type_tuple=('supply', 'supply'))) * self.grid.get_track_pitch(power_layer, + # unit_mode=True) + # print('wiring gird on top layer') + # else: + # min_len = 1.5 * ( + # tr_manager.get_width(layer_id=power_layer + 1, track_type='supply') + tr_manager.get_space( + # layer_id=power_layer + 1, type_tuple=('supply', 'supply'))) * self.grid.get_track_pitch( + # power_layer + 1, unit_mode=True) + # + # warr_vdd, warr_vss = self.do_power_fill_poly( + # layer_id=power_layer, + # space=power_grid_sig_space_tracks * self.grid.get_track_pitch(power_layer, unit_mode=True), + # space_le=3 * self.grid.get_line_end_space(power_layer, power_grid_width_tracks, unit_mode=True), + # vdd_warrs=warr_vdd, + # vss_warrs=warr_vss, + # bound_box_list=power_island_box_list, + # exclude_box_list=exclude_boxes_snapped, + # fill_width=power_grid_width_tracks, + # fill_space=power_grid_supply_space_tracks, + # unit_mode=True, + # min_len=min_len + # ) + # + # if power_layer == glob_max_grid_layer - 1: + # if bump_grid_vdd_list: + # self.draw_vias_on_intersections(warr_vdd, bump_grid_vdd_list) + # + # if bump_grid_vss_list: + # self.draw_vias_on_intersections(warr_vss, bump_grid_vss_list) + # + # if True: + # sub_block_upper_vdd_warrs = [] + # sub_block_upper_vss_warrs = [] + # for macro_instance in macro_instance_list: + # sub_block_upper_vdd_warrs.extend(macro_instance.get_all_port_pins('VDD', layer=power_layer - 1)) + # sub_block_upper_vss_warrs.extend(macro_instance.get_all_port_pins('VSS', layer=power_layer - 1)) + # + # if sub_block_upper_vdd_warrs: + # sub_block_vdd_conns_made = self.draw_vias_on_intersections(sub_block_upper_vdd_warrs, warr_vdd) + # + # print('vdd') + # for y, x in zip(sub_block_vdd_conns_made, sub_block_upper_vdd_warrs): + # if not (y): + # print(x.get_bbox_array(self.grid)) + # if pin_missed_rails: + # self.add_pin('VDD', x, label='VDD:') + # else: + # for lay, box_arr in x.wire_arr_iter(self.grid): + # self.add_rect(lay, box_arr) + # + # if sub_block_upper_vss_warrs: + # sub_block_vss_conns_made = self.draw_vias_on_intersections(sub_block_upper_vss_warrs, warr_vss) + # + # print('vss') + # for y, x in zip(sub_block_vss_conns_made, sub_block_upper_vss_warrs): + # if not (y): + # print(x.get_bbox_array(self.grid)) + # if pin_missed_rails: + # self.add_pin('VSS', x, label='VSS:') + # else: + # for lay, box_arr in x.wire_arr_iter(self.grid): + # self.add_rect(lay, box_arr) + # + # top_global_vdd_warrs.extend(warr_vdd) + # top_global_vss_warrs.extend(warr_vss) + # + # if pin_missed_rails: + # self.add_pin('VDD', top_global_vdd_warrs, label='VDD:') + # self.add_pin('VSS', top_global_vss_warrs, label='VSS:') + # else: + # self.add_pin('VDD', top_global_vdd_warrs) + # self.add_pin('VSS', top_global_vss_warrs) + # + # def add_bump_hookup(self, top_layer, pad_diameter, wing_size, rv_land_width, rv_land_space, bump_x, bump_y, + # bump_net, remove_wings, show_pins): + # + # pad_radius = int(np.floor(pad_diameter / 2)) + # pad_half_side = int(np.floor(0.5 * pad_diameter / (1 + np.sqrt(2)))) + # + # pad_layer_name = self.grid.get_layer_name(top_layer, 0) + # + # horz_neg_offset = pad_half_side if remove_wings[0] == 1 else pad_radius + wing_size + # vert_neg_offset = pad_half_side if remove_wings[1] == 1 else pad_radius + wing_size + # horz_pos_offset = pad_half_side if remove_wings[2] == 1 else pad_radius + wing_size + # vert_pos_offset = pad_half_side if remove_wings[3] == 1 else pad_radius + wing_size + # + # self.add_rect(pad_layer_name, BBox( + # left=bump_x - pad_half_side, bottom=bump_y - vert_neg_offset, + # right=bump_x + pad_half_side, top=bump_y + vert_pos_offset, + # resolution=self.grid.resolution, unit_mode=True + # )) + # + # self.add_rect(pad_layer_name, BBox( + # left=bump_x - horz_neg_offset, bottom=bump_y - pad_half_side, + # right=bump_x + horz_pos_offset, top=bump_y + pad_half_side, + # resolution=self.grid.resolution, unit_mode=True + # )) + # + # self.add_rect(pad_layer_name, BBox( + # left=bump_x - pad_half_side, bottom=bump_y - pad_half_side, + # right=bump_x + pad_half_side, top=bump_y + pad_half_side, + # resolution=self.grid.resolution, unit_mode=True + # )) + # + # ap_pin = self.add_rect(pad_layer_name, BBox( + # left=bump_x - pad_diameter // 32, bottom=bump_y - pad_diameter // 32, + # right=bump_x + pad_diameter // 32, top=bump_y + pad_diameter // 32, + # resolution=self.grid.resolution, unit_mode=True + # )) + # + # # if not((bump_net == 'ANALOG_OUT_N') or (bump_net == 'ANALOG_OUT_P')): + # if True: + # self.add_pin_primitive(bump_net, pad_layer_name, ap_pin.bbox) + # + # wire_drops, wire_drop_boxes = self.draw_bump_rv(pad_diameter, [bump_x, bump_y], top_layer, wing_size, + # rv_land_width, rv_land_space, remove_wings) + # + # return wire_drops, wire_drop_boxes + # + +def draw_multiple_stack_wire(self: TemplateBase, tr_manager, warr_list: List[WireArray], top_layid: int, wire_type: str, + sep_type: (str, str), y0=None, y1=None, x0=None, x1=None, stack_idx=-1): + + stack_wire = [] + cur_lay = warr_list[0].layer_id + layer_range = range(cur_lay + 1, top_layid + 1) + for warr in warr_list: + stack = draw_stack_wire(self, warr, top_layid, x0=x0, x1=x1, y0=y0, y1=y1, + tr_list=[tr_manager.get_width(lay, wire_type) for lay in layer_range], + sp_list=[tr_manager.get_sep(lay, sep_type) for lay in layer_range]) + stack_wire += stack[stack_idx] + return stack_wire + + +def extend_matching_wires(self, warrs: List[WireArray], lower: Optional[Union[int, float]]=None, + upper: Optional[Union[int, float]]=None)-> List[WireArray]: + + warr_lower = lower if lower!=None else warrs[0].lower + warr_upper = upper if upper!=None else warrs[0].upper + + lay_id = warrs[0].layer_id + width = warrs[0].track_id.width + warr_lower = warr_lower if warrs[0].lower > warr_lower else warrs[0].lower + warr_upper = warr_upper if warrs[0].upper < warr_upper else warrs[0].upper + + for warr in warrs[1:]: + # inspect layer id + assert lay_id == warr.layer_id + # find max width + width = warr.track_id.width if width < warr.track_id.width else width + # find min lower + warr_lower = warr_lower if warr.lower > warr_lower else warr.lower + # find max upper + warr_upper = warr_upper if warr.upper < warr_upper else warr.upper + + extended_warrs = [] + for warr in warrs: + new_warr = self.add_wires(lay_id, warr.track_id.base_index, warr_lower, warr_upper, width=width) + extended_warrs.append(new_warr) + + return extended_warrs + +def power_fill_helper(self, layer_id: int, tr_manager: TrackManager, + vdd_warrs: List[WireArray], vss_warrs: List[WireArray], bbox_overwrite=False, + bound_box: Optional[BBox] = None, top_wire: Optional[WireArray] = None, + bot_wire: Optional[WireArray] = None, left_wire: Optional[WireArray] = None, + right_wire: Optional[WireArray] = None, **kwargs) -> Tuple[List[WireArray], List[WireArray]]: + """Calculate via extention to do power fill. + Parameters + ---------- + layer_id: int + the layer to draw power lines + vdd_warrs: List[WireArray] + vdd wires (layer_id-1) to be connected. [] if no vdd wires + vss_warrs: List[WireArray] + vss wires (layer_id-1) to be connected. [] if no vss wires + bbox_overwrite: bool + True to overwrite with bound_box + bound_box: Optional[BBox] + The region to draw power lines + (takes the largest margin among bound_box and vdd_warrs/vss_warrs in layer_id direction + takes the smallest margin among bound_box and vdd_warrs/vss_warrs in layer_id-1 direction) + top_wire: Optional[WireArray] + The topmost wire in among vss_warrs/vdd_warrs if not specified, the last element in vdd_warrs or vss_warrs + would be assigned if vdd_warrs + vss_warrs is even or odd + bot_wire: Optional[WireArray] + The bottommost wire in among vss_warrs/vdd_warrs if not specified, the first element in vss_warrs or + vdd_warrs (if vss_warrs = []) + left_wire: Optional[WireArray] + The leftmost wire in among vss_warrs/vdd_warrs if not specified, the first element in vss_warrs or + vdd_warrs (if vss_warrs = []) + right_wire: Optional[WireArray] + The rightmost wire in among vss_warrs/vdd_warrs if not specified, the last element in vdd_warrss or vss_warrs + would be assigned if vdd_warrs + vss_warrs is even or odd + + Returns + ------- + (vdd, vss) : Tuple[List[WireArray], List[WireArray]] + list of created wires on layer_id + + """ + sup_w = tr_manager.get_width(layer_id, 'sup') + sup_w_lower = tr_manager.get_width(layer_id - 1, 'sup') + wl, wh = self.grid.get_wire_bounds(layer_id, 0, width=sup_w) + w_mid = int((wh - wl) / 2) + via_ext_lower, via_ext_cur = self.grid.get_via_extensions(Direction.LOWER, layer_id - 1, sup_w_lower, sup_w) + + is_horizontal = (self.grid.get_direction(layer_id) == 0) + num_vss = len(vss_warrs) + num_vdd = len(vdd_warrs) + if num_vdd + num_vss == 0: + raise ValueError("need at least vss_warrs or vdd_wars") + + top_wire, bot_wire, left_wire, right_wire = get_boundary_wires(self, vdd_warrs + vss_warrs) + # if not top_wire: + # top_wire = vss_warrs[-1] if ((num_vss + num_vdd) & 1) and (num_vss > 0) else vdd_warrs[-1] + # if not bot_wire: + # bot_wire = vss_warrs[0] if num_vss > 0 else vdd_warrs[0] + # if not right_wire: + # right_wire = vss_warrs[-1] if ((num_vss + num_vdd) & 1) and (num_vss > 0) else vdd_warrs[-1] + # if not left_wire: + # left_wire = vss_warrs[0] if num_vss > 0 else vdd_warrs[0] + # layer_id is horizontal + if is_horizontal: + dx = via_ext_cur + dy = - via_ext_lower - w_mid + + # layer_id is vertical + else: + dx = - via_ext_lower - w_mid + dy = via_ext_cur + xl, xh, yl, yh = left_wire.bound_box.xl, right_wire.bound_box.xh, bot_wire.bound_box.yl, top_wire.bound_box.yh + xl = xl if is_horizontal else xl - dx + xh = xh if is_horizontal else xh + dx + yl = yl if not is_horizontal else yl - dy + yh = yh if not is_horizontal else yh + dy + + xl = bound_box.xl if (bound_box and ((bound_box.xl < xl) or bbox_overwrite)) else xl + xh = bound_box.xh if (bound_box and ((bound_box.xh > xh) or bbox_overwrite)) else xh + yl = bound_box.yl if ( + bound_box and ((bound_box.yl < yl) or bbox_overwrite)) else yl + yh = bound_box.yh if ( + bound_box and ((bound_box.yh > yh) or bbox_overwrite)) else yh + # bb = bound_box.expand(dy=dy, dx=dx) + bb = BBox(xl=xl, yl=yl, xh=xh, yh=yh) + if num_vss == 0: + sup_type = 'vdd' + elif num_vdd == 0: + sup_type = 'vss' + else: + sup_type = 'both' + vdd, vss = self.do_power_fill(layer_id, tr_manager, vdd_warrs, vss_warrs, bound_box=bb, sup_type=sup_type, + **kwargs) + return vdd, vss + + +def get_boundary_wires(self, warrs: List[WireArray]) -> Tuple[WireArray, WireArray, WireArray, WireArray]: + # return topmost, bottommost, leftmost, and rightmost wire in a list of wires + # initialize + wire_top, wire_bot, wire_left, wire_right = [warrs[0]] * 4 + for wire in warrs: + if wire.bound_box.yh > wire_top.bound_box.yh: + wire_top = wire + if wire.bound_box.yl < wire_bot.bound_box.yl: + wire_bot = wire + if wire.bound_box.xl < wire_left.bound_box.xl: + wire_left = wire + if wire.bound_box.xh > wire_right.bound_box.xh: + wire_right = wire + + return wire_top, wire_bot, wire_left, wire_right diff --git a/src/bag3_analog/schematic/buf_cmos_cell.py b/src/bag3_analog/schematic/buf_cmos_cell.py new file mode 100644 index 0000000..b8a8952 --- /dev/null +++ b/src/bag3_analog/schematic/buf_cmos_cell.py @@ -0,0 +1,91 @@ +# BSD 3-Clause License +# +# Copyright (c) 2018, Regents of the University of California +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# -*- coding: utf-8 -*- + +from typing import Mapping, Any, List, Tuple + +import pkg_resources +from pathlib import Path + +from bag.design.module import Module +from bag.design.database import ModuleDB +from bag.util.immutable import Param + + +# noinspection PyPep8Naming +class bag3_analog__buf_cmos_cell(Module): + """Module for library bag3_analog cell buf_cmos_cell. + + Fill in high level description here. + """ + + yaml_file = pkg_resources.resource_filename(__name__, + str(Path('netlist_info', + 'buf_cmos_cell.yaml'))) + + def __init__(self, database: ModuleDB, params: Param, **kwargs: Any) -> None: + Module.__init__(self, self.yaml_file, database, params, **kwargs) + + @classmethod + def get_params_info(cls) -> Mapping[str, str]: + """Returns a dictionary from parameter names to descriptions. + + Returns + ------- + param_info : Optional[Mapping[str, str]] + dictionary from parameter names to descriptions. + """ + return dict( + lch='channel length, in meters.', + w_n='pmos/nmos width, in meters/number of fins.', + seg_n='nmos number of fingers.', + w_p='pmos/nmos width, in meters/number of fins.', + seg_p='nmos number of fingers.', + th_p='pmos transistor threshold', + th_n='nmos transistor threshold', + dum_info='dummy information', + ) + + @classmethod + def get_default_param_values(cls) -> Mapping[str, Any]: + return dict( + dum_info=None, + ) + + def design(self, lch: int, w_n: int, w_p: int, seg_n: int, seg_p: int, th_p: str, th_n: str, + dum_info: List[Tuple]) -> None: + self.instances['XN0'].design(w=w_n, l=lch, nf=seg_n, intent=th_n) + self.instances['XN1'].design(w=w_n, l=lch, nf=seg_n, intent=th_n) + self.instances['XP0'].design(w=w_p, l=lch, nf=seg_p, intent=th_p) + self.instances['XP1'].design(w=w_p, l=lch, nf=seg_p, intent=th_p) + + # dummy + self.design_dummy_transistors(dum_info, 'XDUM', 'VDDA', 'VSS') diff --git a/src/bag3_analog/schematic/netlist_info/buf_cmos_cell.symbol.yaml b/src/bag3_analog/schematic/netlist_info/buf_cmos_cell.symbol.yaml new file mode 100644 index 0000000..5151f02 --- /dev/null +++ b/src/bag3_analog/schematic/netlist_info/buf_cmos_cell.symbol.yaml @@ -0,0 +1,920 @@ +lib_name: bag3_analog +cell_name: buf_cmos_cell +view_name: symbol +bbox: + - -44 + - -4 + - 264 + - 384 +terminals: + VDDA: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 106 + - 376 + - 114 + - 384 + stype: 1 + ttype: 2 + VSS: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 106 + - -4 + - 114 + - 4 + stype: 2 + ttype: 2 + vin: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 256 + - 176 + - 264 + - 184 + stype: 1 + ttype: 0 + vip: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - -44 + - 176 + - -36 + - 184 + stype: 0 + ttype: 0 + von: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - -44 + - 206 + - -36 + - 214 + stype: 1 + ttype: 1 + vop: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 256 + - 206 + - 264 + - 214 + stype: 1 + ttype: 1 +shapes: + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 110 + - 0 + - + - 110 + - 40 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 100 + - 6 + alignment: 1 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VSS + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 0 + - 210 + - + - 10 + - 210 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 254 + - 220 + alignment: 1 + orient: MY + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vop + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 110 + - 0 + - + - 110 + - 80 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 50 + - 270 + - + - 40 + - 275 + - + - 50 + - 280 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 30 + - 210 + - + - 60 + - 210 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 190 + - 210 + - + - 160 + - 210 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 180 + - 105 + - + - 180 + - 135 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 180 + - 245 + - + - 160 + - 245 + - + - 160 + - 230 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 20 + - 120 + - + - 35 + - 120 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 35 + - 135 + - + - 35 + - 105 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 40 + - 105 + - + - 40 + - 135 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 40 + - 105 + - + - 60 + - 105 + - + - 60 + - 90 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 40 + - 135 + - + - 60 + - 135 + - + - 60 + - 150 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 50 + - 110 + - + - 60 + - 105 + - + - 50 + - 100 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 200 + - 120 + - + - 185 + - 120 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 185 + - 135 + - + - 185 + - 105 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 180 + - 135 + - + - 160 + - 135 + - + - 160 + - 150 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 170 + - 110 + - + - 160 + - 105 + - + - 170 + - 100 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 200 + - 260 + - + - 185 + - 260 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 20 + - 260 + - + - 20 + - 120 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 60 + - 90 + - + - 60 + - 80 + - + - 160 + - 80 + - + - 160 + - 90 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 160 + - 230 + - + - 160 + - 190 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 60 + - 150 + - + - 60 + - 190 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 220 + - 210 + - + - 210 + - 210 + - + - 2 + - layer: 231 + purpose: 4294967295 + net: "" + ang_start: 0 + ang_stop: 3.1415926535897931 + bbox: + - 190 + - 210 + - 210 + - 220 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - -10 + - 340 + - + - 220 + - 340 + - + - 220 + - 40 + - + - -10 + - 40 + - + - -10 + - 340 + - + - 8 + - layer: 236 + purpose: 237 + net: "" + origin: + - 0 + - 350 + alignment: 1 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: "[@instanceName]" + evaluator: cdsNLPEvalText + - + - 0 + - layer: 236 + purpose: 4294967295 + net: "" + bbox: + - -40 + - 0 + - 260 + - 380 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 160 + - 150 + - + - 160 + - 190 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 180 + - 275 + - + - 160 + - 275 + - + - 160 + - 290 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 185 + - 245 + - + - 185 + - 275 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 180 + - 105 + - + - 160 + - 105 + - + - 160 + - 90 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 110 + - 380 + - + - 110 + - 340 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 170 + - 270 + - + - 180 + - 275 + - + - 170 + - 280 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 180 + - 275 + - + - 180 + - 245 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 200 + - 260 + - + - 200 + - 120 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 110 + - 340 + - + - 110 + - 300 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - -40 + - 180 + - + - 20 + - 180 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 20 + - 260 + - + - 35 + - 260 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 35 + - 245 + - + - 35 + - 275 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 40 + - 275 + - + - 40 + - 245 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 60 + - 290 + - + - 60 + - 300 + - + - 160 + - 300 + - + - 160 + - 290 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 40 + - 245 + - + - 60 + - 245 + - + - 60 + - 230 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 40 + - 275 + - + - 60 + - 275 + - + - 60 + - 290 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - -40 + - 210 + - + - 0 + - 210 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - -34 + - 220 + alignment: 1 + orient: MX + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: von + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 60 + - 230 + - + - 60 + - 190 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - -40 + - 210 + - + - 0 + - 210 + - + - 8 + - layer: 231 + purpose: 237 + net: "" + origin: + - 50 + - 335 + alignment: 4 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: "[@partName]" + evaluator: cdsNLPEvalText + - + - 2 + - layer: 231 + purpose: 4294967295 + net: "" + ang_start: 0 + ang_stop: 3.1415926535897931 + bbox: + - 10 + - 210 + - 30 + - 220 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 260 + - 210 + - + - 220 + - 210 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 260 + - 210 + - + - 220 + - 210 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 110 + - 380 + - + - 110 + - 340 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 100 + - 374 + alignment: 1 + orient: R270 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDDA + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - -34 + - 190 + alignment: 1 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vip + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 260 + - 180 + - + - 200 + - 180 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 254 + - 190 + alignment: 1 + orient: MY + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vin +instances: + {} +props: + instNamePrefix: + - 3 + - X + interfaceLastChanged: + - 4 + - time_val: 1623362299 + partName: + - 3 + - buf_cmos_cell + pin#: + - 0 + - 26 + portOrder: + - 5 + - name: ILList + bin_val: ("von" "vop" "VDDA" "VSS" "vin" "vip") + vendorName: + - 3 + - "" +app_defs: + _dbLastSavedCounter: + - 0 + - 1160 + _dbvCvTimeStamp: + - 0 + - 1160 + cdbRevision: + - 0 + - 227612 + cdnSPDesignMajorVersion: + - 0 + - 2 diff --git a/src/bag3_analog/schematic/netlist_info/buf_cmos_cell.yaml b/src/bag3_analog/schematic/netlist_info/buf_cmos_cell.yaml new file mode 100644 index 0000000..d5cf591 --- /dev/null +++ b/src/bag3_analog/schematic/netlist_info/buf_cmos_cell.yaml @@ -0,0 +1,983 @@ +lib_name: bag3_analog +cell_name: buf_cmos_cell +view_name: schematic +bbox: + - -247 + - -320 + - 247 + - 306 +terminals: + VDDA: + obj: + - 1 + - inst: + lib_name: basic + cell_name: iopin + view_name: symbolr + xform: + - 0 + - 280 + - MX + bbox: + - -61 + - 270 + - 10 + - 306 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -25 + - 280 + alignment: 7 + orient: MX + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 1 + ttype: 2 + VSS: + obj: + - 1 + - inst: + lib_name: basic + cell_name: iopin + view_name: symbolr + xform: + - 0 + - -80 + - R0 + bbox: + - -61 + - -106 + - 10 + - -70 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -25 + - -80 + alignment: 7 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 2 + ttype: 2 + vin: + obj: + - 1 + - inst: + lib_name: basic + cell_name: ipin + view_name: symbol + xform: + - 190 + - 100 + - MY + bbox: + - 190 + - 74 + - 247 + - 110 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - 220 + - 100 + alignment: 7 + orient: MY + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 1 + ttype: 0 + vip: + obj: + - 1 + - inst: + lib_name: basic + cell_name: ipin + view_name: symbol + xform: + - -190 + - 100 + - R0 + bbox: + - -247 + - 74 + - -190 + - 110 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -220 + - 100 + alignment: 7 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 0 + ttype: 0 + von: + obj: + - 1 + - inst: + lib_name: basic + cell_name: opin + view_name: symbol + xform: + - -60 + - 100 + - R0 + bbox: + - -60 + - 74 + - -3 + - 110 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -35 + - 100 + alignment: 1 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 1 + ttype: 1 + vop: + obj: + - 1 + - inst: + lib_name: basic + cell_name: opin + view_name: symbol + xform: + - 70 + - 100 + - MY + bbox: + - 13 + - 74 + - 70 + - 110 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - 45 + - 100 + alignment: 1 + orient: MY + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 1 + ttype: 1 +shapes: + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VSS + points: + - + - -90 + - -50 + - + - -90 + - -30 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VSS + points: + - + - -90 + - -50 + - + - 0 + - -50 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VSS + points: + - + - 90 + - -50 + - + - 90 + - -30 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vop + points: + - + - 90 + - 100 + - + - 90 + - 170 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: von + points: + - + - -90 + - 100 + - + - -90 + - 170 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VSS + points: + - + - 0 + - -50 + - + - 90 + - -50 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VSS + points: + - + - 0 + - -80 + - + - 0 + - -50 + - + - 4 + - layer: 228 + purpose: 4294967295 + net: "" + bbox: + - -5 + - -55 + - 5 + - -45 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vin + points: + - + - 150 + - 0 + - + - 150 + - 100 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VSS + points: + - + - -90 + - 0 + - + - -50 + - 0 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vip + points: + - + - -150 + - 0 + - + - -130 + - 0 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: von + points: + - + - -90 + - 100 + - + - -60 + - 100 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vip + points: + - + - -150 + - 100 + - + - -150 + - 200 + - + - 7 + - layer: 228 + purpose: 237 + net: VSS + origin: + - -70 + - 7 + alignment: 5 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VSS + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VSS + points: + - + - 50 + - 0 + - + - 90 + - 0 + - + - 7 + - layer: 228 + purpose: 237 + net: VSS + origin: + - 70 + - 7 + alignment: 5 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VSS + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vin + points: + - + - 130 + - 0 + - + - 150 + - 0 + - + - 4 + - layer: 228 + purpose: 4294967295 + net: "" + bbox: + - 85 + - 95 + - 95 + - 105 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VSS + points: + - + - -170 + - -250 + - + - -130 + - -250 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vip + points: + - + - -150 + - 0 + - + - -150 + - 100 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vin + points: + - + - 130 + - 200 + - + - 150 + - 200 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VSS + points: + - + - -90 + - -220 + - + - -90 + - -180 + - + - 7 + - layer: 228 + purpose: 237 + net: VSS + origin: + - -150 + - -243 + alignment: 5 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VSS + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VSS + points: + - + - -90 + - -250 + - + - -50 + - -250 + - + - 7 + - layer: 228 + purpose: 237 + net: VSS + origin: + - -97 + - -300 + alignment: 5 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VSS + - + - 7 + - layer: 228 + purpose: 237 + net: VSS + origin: + - -97 + - -200 + alignment: 5 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VSS + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VSS + points: + - + - -90 + - -320 + - + - -90 + - -280 + - + - 7 + - layer: 228 + purpose: 237 + net: VSS + origin: + - -70 + - -243 + alignment: 5 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VSS + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vip + points: + - + - -150 + - 200 + - + - -130 + - 200 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vop + points: + - + - 70 + - 100 + - + - 90 + - 100 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDDA + points: + - + - -90 + - 200 + - + - -50 + - 200 + - + - 7 + - layer: 228 + purpose: 237 + net: VDDA + origin: + - -70 + - 213 + alignment: 5 + orient: MX + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDDA + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vip + points: + - + - -190 + - 100 + - + - -150 + - 100 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDDA + points: + - + - -90 + - 250 + - + - -90 + - 230 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: von + points: + - + - -90 + - 30 + - + - -90 + - 100 + - + - 4 + - layer: 228 + purpose: 4294967295 + net: "" + bbox: + - -155 + - 95 + - -145 + - 105 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDDA + points: + - + - -90 + - 250 + - + - 0 + - 250 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDDA + points: + - + - 0 + - 280 + - + - 0 + - 250 + - + - 4 + - layer: 228 + purpose: 4294967295 + net: "" + bbox: + - -95 + - 95 + - -85 + - 105 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vin + points: + - + - 190 + - 100 + - + - 150 + - 100 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vin + points: + - + - 150 + - 100 + - + - 150 + - 200 + - + - 4 + - layer: 228 + purpose: 4294967295 + net: "" + bbox: + - 145 + - 95 + - 155 + - 105 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDDA + points: + - + - 0 + - 250 + - + - 90 + - 250 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDDA + points: + - + - 90 + - 250 + - + - 90 + - 230 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vop + points: + - + - 90 + - 30 + - + - 90 + - 100 + - + - 4 + - layer: 228 + purpose: 4294967295 + net: "" + bbox: + - -5 + - 245 + - 5 + - 255 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDDA + points: + - + - 50 + - 200 + - + - 90 + - 200 + - + - 7 + - layer: 228 + purpose: 237 + net: VDDA + origin: + - 70 + - 213 + alignment: 5 + orient: MX + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDDA +instances: + XDUM: + lib_name: BAG_prim + cell_name: nmos4_lvt + view_name: symbol + xform: + - -130 + - -250 + - R0 + bbox: + - -198 + - -284 + - 2 + - -205 + connections: + B: VSS + D: VSS + G: VSS + S: VSS + params: + nf: + - 3 + - 4 + is_primitive: true + XN0: + lib_name: BAG_prim + cell_name: nmos4_standard + view_name: symbol + xform: + - -130 + - 0 + - R0 + bbox: + - -198 + - -34 + - 2 + - 45 + connections: + B: VSS + D: von + G: vip + S: VSS + params: + {} + is_primitive: true + XN1: + lib_name: BAG_prim + cell_name: nmos4_standard + view_name: symbol + xform: + - 130 + - 0 + - MY + bbox: + - -2 + - -34 + - 198 + - 45 + connections: + B: VSS + D: vop + G: vin + S: VSS + params: + {} + is_primitive: true + XP0: + lib_name: BAG_prim + cell_name: pmos4_standard + view_name: symbol + xform: + - -130 + - 200 + - R0 + bbox: + - -198 + - 113 + - 1 + - 287 + connections: + B: VDDA + D: von + G: vip + S: VDDA + params: + {} + is_primitive: true + XP1: + lib_name: BAG_prim + cell_name: pmos4_standard + view_name: symbol + xform: + - 130 + - 200 + - MY + bbox: + - -1 + - 113 + - 198 + - 287 + connections: + B: VDDA + D: vop + G: vin + S: VDDA + params: + {} + is_primitive: true +props: + connectivityLastUpdated: + - 0 + - 30174 + lastSchematicExtraction: + - 4 + - time_val: 1623362313 + net#: + - 0 + - 12 + pin#: + - 0 + - 14 + schGeometryLastUpdated: + - 0 + - 30174 + schGeometryVersion: + - 3 + - sch.ds.gm.1.4 + schXtrVersion: + - 3 + - sch.10.0 +app_defs: + _dbLastSavedCounter: + - 0 + - 30174 + _dbvCvTimeStamp: + - 0 + - 30174 + cdbRevision: + - 0 + - 227612 + cdnSPDesignMajorVersion: + - 0 + - 2 diff --git a/src/bag3_analog/schematic/netlist_info/tia.symbol.yaml b/src/bag3_analog/schematic/netlist_info/tia.symbol.yaml new file mode 100644 index 0000000..3b594c0 --- /dev/null +++ b/src/bag3_analog/schematic/netlist_info/tia.symbol.yaml @@ -0,0 +1,789 @@ +lib_name: bag3_analog +cell_name: tia +view_name: symbol +bbox: + - 16 + - -124 + - 224 + - 104 +terminals: + VDD: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 116 + - 96 + - 124 + - 104 + stype: 1 + ttype: 2 + VSS: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 116 + - -124 + - 124 + - -116 + stype: 2 + ttype: 2 + vin: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 16 + - -34 + - 24 + - -26 + stype: 0 + ttype: 0 + vin_m: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 216 + - 36 + - 224 + - 44 + stype: 0 + ttype: 2 + vip: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 16 + - 6 + - 24 + - 14 + stype: 0 + ttype: 0 + vip_m: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 216 + - -64 + - 224 + - -56 + stype: 0 + ttype: 2 + von: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 216 + - 6 + - 224 + - 14 + stype: 0 + ttype: 1 + vop: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 216 + - -34 + - 224 + - -26 + stype: 0 + ttype: 1 +shapes: + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 20 + - 10 + - + - 60 + - 10 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 26 + - 20 + alignment: 1 + orient: MX + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vip + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 20 + - -30 + - + - 60 + - -30 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 26 + - -20 + alignment: 1 + orient: MX + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vin + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 220 + - -30 + - + - 180 + - -30 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 214 + - -20 + alignment: 7 + orient: MX + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vop + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 220 + - 10 + - + - 180 + - 10 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 214 + - 20 + alignment: 7 + orient: MX + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: von + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 220 + - -60 + - + - 180 + - -60 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 214 + - -50 + alignment: 1 + orient: R180 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vip_m + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 220 + - 40 + - + - 180 + - 40 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 214 + - 50 + alignment: 1 + orient: R180 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vin_m + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 120 + - -120 + - + - 120 + - -80 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 110 + - -114 + alignment: 1 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VSS + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 120 + - 100 + - + - 120 + - 60 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 110 + - 94 + alignment: 1 + orient: R270 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDD + - + - 0 + - layer: 236 + purpose: 4294967295 + net: "" + bbox: + - 20 + - -120 + - 220 + - 100 + - + - 8 + - layer: 236 + purpose: 237 + net: "" + origin: + - 60 + - 70 + alignment: 1 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: "[@instanceName]" + evaluator: cdsNLPEvalText + - + - 8 + - layer: 231 + purpose: 237 + net: "" + origin: + - 105 + - -70 + alignment: 4 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: "[@partName]" + evaluator: cdsNLPEvalText + - + - 0 + - layer: 231 + purpose: 4294967295 + net: "" + bbox: + - 60 + - -80 + - 180 + - 60 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 100 + - 10 + - + - 120 + - 10 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 100 + - -30 + - + - 120 + - -30 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 120 + - 20 + - + - 120 + - 0 + - + - 140 + - 10 + - + - 120 + - 20 + - + - 4 + - layer: 231 + purpose: 4294967295 + net: "" + bbox: + - 140 + - 5 + - 150 + - 15 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 150 + - 10 + - + - 160 + - 10 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 120 + - -20 + - + - 120 + - -40 + - + - 140 + - -30 + - + - 120 + - -20 + - + - 4 + - layer: 231 + purpose: 4294967295 + net: "" + bbox: + - 140 + - -35 + - 150 + - -25 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 150 + - -30 + - + - 160 + - -30 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 110 + - 40 + - + - 100 + - 40 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 159 + - 40 + - + - 147 + - 40 + - + - 144 + - 30 + - + - 138 + - 50 + - + - 132 + - 30 + - + - 126 + - 50 + - + - 120 + - 30 + - + - 114 + - 50 + - + - 111 + - 40 + - + - 99 + - 40 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 110 + - -60 + - + - 100 + - -60 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 160 + - 40 + - + - 160 + - 10 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 159 + - -60 + - + - 147 + - -60 + - + - 144 + - -70 + - + - 138 + - -50 + - + - 132 + - -70 + - + - 126 + - -50 + - + - 120 + - -70 + - + - 114 + - -50 + - + - 111 + - -60 + - + - 99 + - -60 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 160 + - -30 + - + - 160 + - -60 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 100 + - -60 + - + - 100 + - -30 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 100 + - 40 + - + - 100 + - 10 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 180 + - 10 + - + - 160 + - 10 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 82 + - 10 + - + - 60 + - 10 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 110 + - 10 + - + - 88 + - 10 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 88 + - 0 + - + - 88 + - 20 + - + - 2 + - layer: 231 + purpose: 4294967295 + net: "" + ang_start: 5.4875823736151279 + ang_stop: 0.78539810975524382 + bbox: + - 78 + - 0 + - 82 + - 20 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 88 + - -40 + - + - 88 + - -20 + - + - 2 + - layer: 231 + purpose: 4294967295 + net: "" + ang_start: 5.4875823736151279 + ang_stop: 0.78539810975524382 + bbox: + - 78 + - -40 + - 82 + - -20 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 82 + - -30 + - + - 60 + - -30 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 110 + - -30 + - + - 88 + - -30 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 180 + - -30 + - + - 160 + - -30 +instances: + {} +props: + interfaceLastChanged: + - 4 + - time_val: 1583356556 + partName: + - 3 + - tia + pin#: + - 0 + - 11 + portOrder: + - 5 + - name: ILList + bin_val: ("von" "vop" "VDD" "VSS" "vin_m" "vip_m" "vin" "vip") + vendorName: + - 3 + - "" +app_defs: + _dbLastSavedCounter: + - 0 + - 365 + _dbvCvTimeStamp: + - 0 + - 365 + cdbRevision: + - 0 + - 227612 diff --git a/src/bag3_analog/schematic/netlist_info/tia.yaml b/src/bag3_analog/schematic/netlist_info/tia.yaml new file mode 100644 index 0000000..aaa81e1 --- /dev/null +++ b/src/bag3_analog/schematic/netlist_info/tia.yaml @@ -0,0 +1,907 @@ +lib_name: bag3_analog +cell_name: tia +view_name: schematic +bbox: + - -610 + - -410 + - 600 + - 310 +terminals: + VDD: + obj: + - 1 + - inst: + lib_name: basic + cell_name: iopin + view_name: symbolr + xform: + - -540 + - 180 + - R0 + bbox: + - -601 + - 154 + - -530 + - 190 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -565 + - 180 + alignment: 7 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 1 + ttype: 2 + VSS: + obj: + - 1 + - inst: + lib_name: basic + cell_name: iopin + view_name: symbolr + xform: + - -540 + - 160 + - R0 + bbox: + - -601 + - 134 + - -530 + - 170 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -565 + - 160 + alignment: 7 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 2 + ttype: 2 + vin: + obj: + - 1 + - inst: + lib_name: basic + cell_name: ipin + view_name: symbol + xform: + - -540 + - 10 + - R0 + bbox: + - -597 + - -16 + - -540 + - 20 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -570 + - 10 + alignment: 7 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 0 + ttype: 0 + vin_m: + obj: + - 1 + - inst: + lib_name: basic + cell_name: iopin + view_name: symbolr + xform: + - -540 + - 90 + - R0 + bbox: + - -601 + - 64 + - -530 + - 100 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -565 + - 90 + alignment: 7 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 0 + ttype: 2 + vip: + obj: + - 1 + - inst: + lib_name: basic + cell_name: ipin + view_name: symbol + xform: + - -540 + - 30 + - R0 + bbox: + - -597 + - 4 + - -540 + - 40 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -570 + - 30 + alignment: 7 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 0 + ttype: 0 + vip_m: + obj: + - 1 + - inst: + lib_name: basic + cell_name: iopin + view_name: symbolr + xform: + - -540 + - 110 + - R0 + bbox: + - -601 + - 84 + - -530 + - 120 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -565 + - 110 + alignment: 7 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 0 + ttype: 2 + von: + obj: + - 1 + - inst: + lib_name: basic + cell_name: opin + view_name: symbol + xform: + - -560 + - -60 + - R0 + bbox: + - -560 + - -86 + - -503 + - -50 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -535 + - -60 + alignment: 1 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 0 + ttype: 1 + vop: + obj: + - 1 + - inst: + lib_name: basic + cell_name: opin + view_name: symbol + xform: + - -560 + - -40 + - R0 + bbox: + - -560 + - -66 + - -503 + - -30 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -535 + - -40 + alignment: 1 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 0 + ttype: 1 +shapes: + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vin_m + points: + - + - 210 + - 70 + - + - 250 + - 70 + - + - 7 + - layer: 228 + purpose: 237 + net: vin_m + origin: + - 214 + - 77 + alignment: 2 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vin_m + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vop + points: + - + - 210 + - 100 + - + - 250 + - 100 + - + - 7 + - layer: 228 + purpose: 237 + net: vop + origin: + - 214 + - 107 + alignment: 2 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vop + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDD + points: + - + - 60 + - 270 + - + - 60 + - 310 + - + - 7 + - layer: 228 + purpose: 237 + net: VDD + origin: + - 53 + - 274 + alignment: 2 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDD + - + - 5 + - layer: 228 + purpose: 4294967295 + net: von + points: + - + - -130 + - 100 + - + - -90 + - 100 + - + - 7 + - layer: 228 + purpose: 237 + net: von + origin: + - -94 + - 107 + alignment: 8 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: von + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vip_m + points: + - + - -130 + - 70 + - + - -90 + - 70 + - + - 7 + - layer: 228 + purpose: 237 + net: vip_m + origin: + - -104 + - 77 + alignment: 8 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vip_m + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VSS + points: + - + - 60 + - -150 + - + - 60 + - -110 + - + - 7 + - layer: 228 + purpose: 237 + net: VSS + origin: + - 53 + - -114 + alignment: 8 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VSS + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vip + points: + - + - -100 + - -410 + - + - -100 + - -370 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vip_m + points: + - + - -100 + - -190 + - + - -100 + - -160 + - + - 7 + - layer: 228 + purpose: 237 + net: vip + origin: + - -107 + - -390 + alignment: 5 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vip + - + - 7 + - layer: 228 + purpose: 237 + net: vip_m + origin: + - -107 + - -170 + alignment: 5 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vip_m + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDD + points: + - + - -440 + - 90 + - + - -400 + - 90 + - + - 7 + - layer: 228 + purpose: 237 + net: VDD + origin: + - -420 + - 97 + alignment: 5 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDD + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vip_m + points: + - + - -310 + - -70 + - + - -310 + - -30 + - + - 7 + - layer: 228 + purpose: 237 + net: vip_m + origin: + - -317 + - -50 + alignment: 5 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vip_m + - + - 5 + - layer: 228 + purpose: 4294967295 + net: von + points: + - + - -310 + - 210 + - + - -310 + - 250 + - + - 7 + - layer: 228 + purpose: 237 + net: von + origin: + - -317 + - 230 + alignment: 5 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: von + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vin + points: + - + - 210 + - -410 + - + - 210 + - -370 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vin_m + points: + - + - 210 + - -190 + - + - 210 + - -150 + - + - 7 + - layer: 228 + purpose: 237 + net: vin + origin: + - 203 + - -390 + alignment: 5 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vin + - + - 7 + - layer: 228 + purpose: 237 + net: vin_m + origin: + - 203 + - -170 + alignment: 5 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vin_m + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vop + points: + - + - 470 + - 200 + - + - 470 + - 240 + - + - 7 + - layer: 228 + purpose: 237 + net: vop + origin: + - 457 + - 220 + alignment: 5 + orient: MXR90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vop + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vin_m + points: + - + - 470 + - -80 + - + - 470 + - -40 + - + - 7 + - layer: 228 + purpose: 237 + net: vin_m + origin: + - 457 + - -60 + alignment: 5 + orient: MXR90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vin_m + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDD + points: + - + - 600 + - 80 + - + - 560 + - 80 + - + - 7 + - layer: 228 + purpose: 237 + net: VDD + origin: + - 564 + - 87 + alignment: 8 + orient: MY + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDD +instances: + XBUF: + lib_name: bag_vco + cell_name: buf_cmos_cell_v1 + view_name: symbol + xform: + - -50 + - -110 + - R0 + bbox: + - -94 + - -114 + - 214 + - 274 + connections: + VDDA: VDD + VSS: VSS + vin: vin_m + vip: vip_m + von: von + vop: vop + params: + {} + is_primitive: false + XCAP0: + lib_name: xbase + cell_name: momcap_core + view_name: symbol + xform: + - 150 + - -190 + - R270 + bbox: + - 150 + - -374 + - 270 + - -186 + connections: + minus: vin + plus: vin_m + params: + {} + is_primitive: false + XCAP1: + lib_name: xbase + cell_name: momcap_core + view_name: symbol + xform: + - -160 + - -190 + - R270 + bbox: + - -160 + - -374 + - -40 + - -186 + connections: + minus: vip + plus: vip_m + params: + {} + is_primitive: false + XRES0: + lib_name: bag_vco + cell_name: res + view_name: symbol + xform: + - 380 + - -40 + - R0 + bbox: + - 380 + - -44 + - 564 + - 204 + connections: + MINUS: vin_m + PLUS: vop + VDD: VDD + params: + {} + is_primitive: false + XRES1: + lib_name: bag_vco + cell_name: res + view_name: symbol + xform: + - -220 + - -30 + - MY + bbox: + - -404 + - -34 + - -220 + - 214 + connections: + MINUS: vip_m + PLUS: von + VDD: VDD + params: + {} + is_primitive: false +props: + connectivityLastUpdated: + - 0 + - 5517 + instance#: + - 0 + - 9 + lastSchematicExtraction: + - 4 + - time_val: 1623362357 + net#: + - 0 + - 0 + pin#: + - 0 + - 14 + schGeometryLastUpdated: + - 0 + - 5517 + schGeometryVersion: + - 3 + - sch.ds.gm.1.4 + schXtrVersion: + - 3 + - sch.10.0 +app_defs: + _dbLastSavedCounter: + - 0 + - 5517 + _dbvCvTimeStamp: + - 0 + - 5517 + cdbRevision: + - 0 + - 227612 diff --git a/src/bag3_analog/schematic/netlist_info/tia_res.symbol.yaml b/src/bag3_analog/schematic/netlist_info/tia_res.symbol.yaml new file mode 100644 index 0000000..66276ee --- /dev/null +++ b/src/bag3_analog/schematic/netlist_info/tia_res.symbol.yaml @@ -0,0 +1,255 @@ +lib_name: bag3_analog +cell_name: tia_res +view_name: symbol +bbox: + - 0 + - -4 + - 184 + - 244 +terminals: + MINUS: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 86 + - -4 + - 94 + - 4 + stype: 0 + ttype: 2 + PLUS: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 86 + - 236 + - 94 + - 244 + stype: 0 + ttype: 2 + VDD: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 176 + - 116 + - 184 + - 124 + stype: 0 + ttype: 2 +shapes: + - + - 0 + - layer: 231 + purpose: 4294967295 + net: "" + bbox: + - 40 + - 40 + - 140 + - 200 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 90 + - 200 + - + - 90 + - 180 + - + - 60 + - 160 + - + - 120 + - 140 + - + - 60 + - 120 + - + - 120 + - 100 + - + - 60 + - 80 + - + - 90 + - 60 + - + - 90 + - 40 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 90 + - 200 + - + - 90 + - 240 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 90 + - 40 + - + - 90 + - 0 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 140 + - 120 + - + - 180 + - 120 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 80 + - 241 + alignment: 7 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: PLUS + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 80 + - 51 + alignment: 7 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: MINUS + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 180 + - 120 + - + - 140 + - 120 + - + - 0 + - layer: 236 + purpose: 4294967295 + net: "" + bbox: + - 0 + - 0 + - 180 + - 240 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 174 + - 130 + alignment: 1 + orient: R180 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDD + - + - 8 + - layer: 236 + purpose: 237 + net: "" + origin: + - 0 + - 230 + alignment: 1 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: "[@instanceName]" + evaluator: cdsNLPEvalText + - + - 8 + - layer: 231 + purpose: 237 + net: "" + origin: + - 90 + - 180 + alignment: 5 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: "[@cellName]" + evaluator: cdsNLPEvalText +instances: + {} +props: + interfaceLastChanged: + - 4 + - time_val: 1623188730 + pin#: + - 0 + - 4 + portOrder: + - 5 + - name: ILList + bin_val: ("MINUS" "PLUS" "VDD") +app_defs: + _dbLastSavedCounter: + - 0 + - 131 + _dbvCvTimeStamp: + - 0 + - 131 + cdbRevision: + - 0 + - 227612 diff --git a/src/bag3_analog/schematic/netlist_info/tia_res.yaml b/src/bag3_analog/schematic/netlist_info/tia_res.yaml new file mode 100644 index 0000000..b4f6ca2 --- /dev/null +++ b/src/bag3_analog/schematic/netlist_info/tia_res.yaml @@ -0,0 +1,381 @@ +lib_name: bag3_analog +cell_name: tia_res +view_name: schematic +bbox: + - -222 + - -210 + - 130 + - 110 +terminals: + MINUS: + obj: + - 1 + - inst: + lib_name: basic + cell_name: iopin + view_name: symbolr + xform: + - -150 + - 80 + - R0 + bbox: + - -211 + - 54 + - -140 + - 90 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -175 + - 80 + alignment: 7 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 0 + ttype: 2 + PLUS: + obj: + - 1 + - inst: + lib_name: basic + cell_name: iopin + view_name: symbolr + xform: + - -150 + - 100 + - R0 + bbox: + - -211 + - 74 + - -140 + - 110 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -175 + - 100 + alignment: 7 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 0 + ttype: 2 + VDD: + obj: + - 1 + - inst: + lib_name: basic + cell_name: iopin + view_name: symbolr + xform: + - -150 + - 60 + - R0 + bbox: + - -211 + - 34 + - -140 + - 70 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -175 + - 60 + alignment: 7 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 0 + ttype: 2 +shapes: + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDD + points: + - + - 20 + - 20 + - + - 60 + - 20 + - + - 7 + - layer: 228 + purpose: 237 + net: VDD + origin: + - 24 + - 27 + alignment: 2 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDD + - + - 5 + - layer: 228 + purpose: 4294967295 + net: MINUS + points: + - + - 0 + - -40 + - + - 0 + - 0 + - + - 7 + - layer: 228 + purpose: 237 + net: MINUS + origin: + - -7 + - -4 + alignment: 8 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: MINUS + - + - 5 + - layer: 228 + purpose: 4294967295 + net: PLUS + points: + - + - 0 + - 60 + - + - 0 + - 100 + - + - 7 + - layer: 228 + purpose: 237 + net: PLUS + origin: + - -7 + - 64 + alignment: 2 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: PLUS + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDD + points: + - + - 0 + - -110 + - + - 0 + - -70 + - + - 7 + - layer: 228 + purpose: 237 + net: VDD + origin: + - -7 + - -106 + alignment: 2 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDD + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDD + points: + - + - 0 + - -210 + - + - 0 + - -170 + - + - 7 + - layer: 228 + purpose: 237 + net: VDD + origin: + - -7 + - -174 + alignment: 8 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDD + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDD + points: + - + - 20 + - -150 + - + - 60 + - -150 + - + - 7 + - layer: 228 + purpose: 237 + net: VDD + origin: + - 24 + - -143 + alignment: 2 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDD +instances: + XDUM: + lib_name: BAG_prim + cell_name: res_standard + view_name: symbol + xform: + - -40 + - -100 + - R0 + bbox: + - -132 + - -174 + - 130 + - -100 + connections: + BULK: VDD + MINUS: VDD + PLUS: VDD + params: + l: + - 3 + - 400n + w: + - 3 + - 400n + is_primitive: true + XRES: + lib_name: BAG_prim + cell_name: res_standard + view_name: symbol + xform: + - -40 + - 70 + - R0 + bbox: + - -132 + - -4 + - 130 + - 70 + connections: + BULK: VDD + MINUS: MINUS + PLUS: PLUS + params: + l: + - 3 + - 400n + w: + - 3 + - 400n + is_primitive: true +props: + connectivityLastUpdated: + - 0 + - 506 + instance#: + - 0 + - 1 + lastSchematicExtraction: + - 4 + - time_val: 1623188759 + net#: + - 0 + - 0 + pin#: + - 0 + - 6 + schGeometryLastUpdated: + - 0 + - 506 + schGeometryVersion: + - 3 + - sch.ds.gm.1.4 + schXtrVersion: + - 3 + - sch.10.0 +app_defs: + _dbLastSavedCounter: + - 0 + - 506 + _dbvCvTimeStamp: + - 0 + - 506 + cdbRevision: + - 0 + - 227612 diff --git a/src/bag3_analog/schematic/netlist_info/tia_term.symbol.yaml b/src/bag3_analog/schematic/netlist_info/tia_term.symbol.yaml new file mode 100644 index 0000000..aadce65 --- /dev/null +++ b/src/bag3_analog/schematic/netlist_info/tia_term.symbol.yaml @@ -0,0 +1,686 @@ +lib_name: bag3_analog +cell_name: tia_term +view_name: symbol +bbox: + - 16 + - -124 + - 224 + - 104 +terminals: + VDD: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 116 + - 96 + - 124 + - 104 + stype: 1 + ttype: 2 + VSS: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 116 + - -124 + - 124 + - -116 + stype: 2 + ttype: 2 + vin: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 16 + - -34 + - 24 + - -26 + stype: 0 + ttype: 0 + vip: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 16 + - 6 + - 24 + - 14 + stype: 0 + ttype: 0 + von: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 216 + - 6 + - 224 + - 14 + stype: 0 + ttype: 1 + vop: + obj: + - 0 + - layer: 229 + purpose: 4294967295 + net: "" + bbox: + - 216 + - -34 + - 224 + - -26 + stype: 0 + ttype: 1 +shapes: + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 20 + - 10 + - + - 60 + - 10 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 26 + - 20 + alignment: 1 + orient: MX + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vip + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 20 + - -30 + - + - 60 + - -30 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 26 + - -20 + alignment: 1 + orient: MX + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vin + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 220 + - -30 + - + - 180 + - -30 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 214 + - -20 + alignment: 7 + orient: MX + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vop + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 220 + - 10 + - + - 180 + - 10 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 214 + - 20 + alignment: 7 + orient: MX + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: von + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 120 + - -120 + - + - 120 + - -80 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 110 + - -114 + alignment: 1 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VSS + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 120 + - 100 + - + - 120 + - 60 + - + - 7 + - layer: 229 + purpose: 237 + net: "" + origin: + - 110 + - 94 + alignment: 1 + orient: R270 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDD + - + - 0 + - layer: 236 + purpose: 4294967295 + net: "" + bbox: + - 20 + - -120 + - 220 + - 100 + - + - 8 + - layer: 236 + purpose: 237 + net: "" + origin: + - 60 + - 70 + alignment: 1 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: "[@instanceName]" + evaluator: cdsNLPEvalText + - + - 8 + - layer: 231 + purpose: 237 + net: "" + origin: + - 105 + - -70 + alignment: 4 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: "[@partName]" + evaluator: cdsNLPEvalText + - + - 0 + - layer: 231 + purpose: 4294967295 + net: "" + bbox: + - 60 + - -80 + - 180 + - 60 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 100 + - 10 + - + - 120 + - 10 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 100 + - -30 + - + - 120 + - -30 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 120 + - 20 + - + - 120 + - 0 + - + - 140 + - 10 + - + - 120 + - 20 + - + - 4 + - layer: 231 + purpose: 4294967295 + net: "" + bbox: + - 140 + - 5 + - 150 + - 15 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 150 + - 10 + - + - 160 + - 10 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 120 + - -20 + - + - 120 + - -40 + - + - 140 + - -30 + - + - 120 + - -20 + - + - 4 + - layer: 231 + purpose: 4294967295 + net: "" + bbox: + - 140 + - -35 + - 150 + - -25 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 150 + - -30 + - + - 160 + - -30 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 110 + - 40 + - + - 100 + - 40 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 159 + - 40 + - + - 147 + - 40 + - + - 144 + - 30 + - + - 138 + - 50 + - + - 132 + - 30 + - + - 126 + - 50 + - + - 120 + - 30 + - + - 114 + - 50 + - + - 111 + - 40 + - + - 99 + - 40 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 110 + - -60 + - + - 100 + - -60 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 160 + - 40 + - + - 160 + - 10 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 159 + - -60 + - + - 147 + - -60 + - + - 144 + - -70 + - + - 138 + - -50 + - + - 132 + - -70 + - + - 126 + - -50 + - + - 120 + - -70 + - + - 114 + - -50 + - + - 111 + - -60 + - + - 99 + - -60 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 160 + - -30 + - + - 160 + - -60 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 100 + - -60 + - + - 100 + - -30 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 100 + - 40 + - + - 100 + - 10 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 180 + - 10 + - + - 160 + - 10 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 82 + - 10 + - + - 60 + - 10 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 110 + - 10 + - + - 68 + - 10 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 80 + - 10 + - + - 80 + - 0 + - + - 90 + - -10 + - + - 70 + - -10 + - + - 90 + - -20 + - + - 80 + - -20 + - + - 80 + - -30 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 82 + - -30 + - + - 60 + - -30 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 110 + - -30 + - + - 68 + - -30 + - + - 5 + - layer: 231 + purpose: 4294967295 + net: "" + points: + - + - 180 + - -30 + - + - 160 + - -30 +instances: + {} +props: + interfaceLastChanged: + - 4 + - time_val: 1634030250 + partName: + - 3 + - tia_term + pin#: + - 0 + - 11 + portOrder: + - 5 + - name: ILList + bin_val: ("von" "vop" "VDD" "VSS" "vin" "vip") + vendorName: + - 3 + - "" +app_defs: + _dbLastSavedCounter: + - 0 + - 418 + _dbvCvTimeStamp: + - 0 + - 418 + cdbRevision: + - 0 + - 227612 diff --git a/src/bag3_analog/schematic/netlist_info/tia_term.yaml b/src/bag3_analog/schematic/netlist_info/tia_term.yaml new file mode 100644 index 0000000..2c97fcb --- /dev/null +++ b/src/bag3_analog/schematic/netlist_info/tia_term.yaml @@ -0,0 +1,858 @@ +lib_name: bag3_analog +cell_name: tia_term +view_name: schematic +bbox: + - -601 + - -460 + - 600 + - 310 +terminals: + VDD: + obj: + - 1 + - inst: + lib_name: basic + cell_name: iopin + view_name: symbolr + xform: + - -540 + - 180 + - R0 + bbox: + - -601 + - 154 + - -530 + - 190 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -565 + - 180 + alignment: 7 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 1 + ttype: 2 + VSS: + obj: + - 1 + - inst: + lib_name: basic + cell_name: iopin + view_name: symbolr + xform: + - -540 + - 160 + - R0 + bbox: + - -601 + - 134 + - -530 + - 170 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -565 + - 160 + alignment: 7 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 2 + ttype: 2 + vin: + obj: + - 1 + - inst: + lib_name: basic + cell_name: ipin + view_name: symbol + xform: + - -540 + - 10 + - R0 + bbox: + - -597 + - -16 + - -540 + - 20 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -570 + - 10 + alignment: 7 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 0 + ttype: 0 + vip: + obj: + - 1 + - inst: + lib_name: basic + cell_name: ipin + view_name: symbol + xform: + - -540 + - 30 + - R0 + bbox: + - -597 + - 4 + - -540 + - 40 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -570 + - 30 + alignment: 7 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 0 + ttype: 0 + von: + obj: + - 1 + - inst: + lib_name: basic + cell_name: opin + view_name: symbol + xform: + - -560 + - -60 + - R0 + bbox: + - -560 + - -86 + - -503 + - -50 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -535 + - -60 + alignment: 1 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 0 + ttype: 1 + vop: + obj: + - 1 + - inst: + lib_name: basic + cell_name: opin + view_name: symbol + xform: + - -560 + - -40 + - R0 + bbox: + - -560 + - -66 + - -503 + - -30 + connections: + {} + params: + {} + is_primitive: true + attr: + layer: 229 + purpose: 237 + net: "" + origin: + - -535 + - -40 + alignment: 1 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + attr_type: 0 + format: 1 + stype: 0 + ttype: 1 +shapes: + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vin + points: + - + - 210 + - 70 + - + - 250 + - 70 + - + - 7 + - layer: 228 + purpose: 237 + net: vin + origin: + - 214 + - 77 + alignment: 2 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vin + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vop + points: + - + - 210 + - 100 + - + - 250 + - 100 + - + - 7 + - layer: 228 + purpose: 237 + net: vop + origin: + - 214 + - 107 + alignment: 2 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vop + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDD + points: + - + - 60 + - 270 + - + - 60 + - 310 + - + - 7 + - layer: 228 + purpose: 237 + net: VDD + origin: + - 53 + - 274 + alignment: 2 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDD + - + - 5 + - layer: 228 + purpose: 4294967295 + net: von + points: + - + - -130 + - 100 + - + - -90 + - 100 + - + - 7 + - layer: 228 + purpose: 237 + net: von + origin: + - -94 + - 107 + alignment: 8 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: von + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vip + points: + - + - -130 + - 70 + - + - -90 + - 70 + - + - 7 + - layer: 228 + purpose: 237 + net: vip + origin: + - -104 + - 77 + alignment: 8 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vip + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VSS + points: + - + - 60 + - -150 + - + - 60 + - -110 + - + - 7 + - layer: 228 + purpose: 237 + net: VSS + origin: + - 53 + - -114 + alignment: 8 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VSS + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDD + points: + - + - -40 + - -300 + - + - 0 + - -300 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vin + points: + - + - -130 + - -460 + - + - -130 + - -420 + - + - 7 + - layer: 228 + purpose: 237 + net: VDD + origin: + - -36 + - -293 + alignment: 2 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDD + - + - 7 + - layer: 228 + purpose: 237 + net: vin + origin: + - -137 + - -424 + alignment: 8 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vin + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDD + points: + - + - -440 + - 90 + - + - -400 + - 90 + - + - 7 + - layer: 228 + purpose: 237 + net: VDD + origin: + - -420 + - 97 + alignment: 5 + orient: R0 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDD + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vip + points: + - + - -310 + - -70 + - + - -310 + - -30 + - + - 7 + - layer: 228 + purpose: 237 + net: vip + origin: + - -317 + - -50 + alignment: 5 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vip + - + - 5 + - layer: 228 + purpose: 4294967295 + net: von + points: + - + - -310 + - 210 + - + - -310 + - 250 + - + - 7 + - layer: 228 + purpose: 237 + net: von + origin: + - -317 + - 230 + alignment: 5 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: von + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDD + points: + - + - 210 + - -420 + - + - 210 + - -380 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: mid + points: + - + - 210 + - -200 + - + - 210 + - -160 + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vip + points: + - + - -130 + - -180 + - + - -130 + - -140 + - + - 7 + - layer: 228 + purpose: 237 + net: VDD + origin: + - 203 + - -400 + alignment: 5 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDD + - + - 7 + - layer: 228 + purpose: 237 + net: mid + origin: + - 203 + - -180 + alignment: 5 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: mid + - + - 7 + - layer: 228 + purpose: 237 + net: vip + origin: + - -137 + - -176 + alignment: 2 + orient: R90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vip + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vop + points: + - + - 470 + - 200 + - + - 470 + - 240 + - + - 7 + - layer: 228 + purpose: 237 + net: vop + origin: + - 457 + - 220 + alignment: 5 + orient: MXR90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vop + - + - 5 + - layer: 228 + purpose: 4294967295 + net: vin + points: + - + - 470 + - -80 + - + - 470 + - -40 + - + - 7 + - layer: 228 + purpose: 237 + net: vin + origin: + - 457 + - -60 + alignment: 5 + orient: MXR90 + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: vin + - + - 5 + - layer: 228 + purpose: 4294967295 + net: VDD + points: + - + - 600 + - 80 + - + - 560 + - 80 + - + - 7 + - layer: 228 + purpose: 237 + net: VDD + origin: + - 564 + - 87 + alignment: 8 + orient: MY + font: 5 + height: 10 + overbar: false + visible: true + drafting: true + text: VDD +instances: + XBUF: + lib_name: bag_vco + cell_name: buf_cmos_cell_v1 + view_name: symbol + xform: + - -50 + - -110 + - R0 + bbox: + - -94 + - -114 + - 214 + - 274 + connections: + VDDA: VDD + VSS: VSS + vin: vin + vip: vip + von: von + vop: vop + params: + {} + is_primitive: false + XDECAP: + lib_name: xbase + cell_name: momcap_core + view_name: symbol + xform: + - 150 + - -200 + - R270 + bbox: + - 150 + - -384 + - 270 + - -196 + connections: + minus: VDD + plus: mid + params: + {} + is_primitive: false + XRES0: + lib_name: bag_vco + cell_name: res + view_name: symbol + xform: + - 380 + - -40 + - R0 + bbox: + - 380 + - -44 + - 564 + - 204 + connections: + MINUS: vin + PLUS: vop + VDD: VDD + params: + {} + is_primitive: false + XRES1: + lib_name: bag_vco + cell_name: res + view_name: symbol + xform: + - -220 + - -30 + - MY + bbox: + - -404 + - -34 + - -220 + - 214 + connections: + MINUS: vip + PLUS: von + VDD: VDD + params: + {} + is_primitive: false + XTERM: + lib_name: bag3_analog + cell_name: res_termination + view_name: symbol + xform: + - -220 + - -420 + - R0 + bbox: + - -220 + - -424 + - -36 + - -176 + connections: + BULK: VDD + MINUS: vin + PLUS: vip + params: + {} + is_primitive: false +props: + connectivityLastUpdated: + - 0 + - 6590 + instance#: + - 0 + - 10 + lastSchematicExtraction: + - 4 + - time_val: 1634030416 + net#: + - 0 + - 0 + pin#: + - 0 + - 14 + schGeometryLastUpdated: + - 0 + - 6590 + schGeometryVersion: + - 3 + - sch.ds.gm.1.4 + schXtrVersion: + - 3 + - sch.10.0 +app_defs: + _dbLastSavedCounter: + - 0 + - 6590 + _dbvCvTimeStamp: + - 0 + - 6590 + cdbRevision: + - 0 + - 227612 diff --git a/src/bag3_analog/schematic/tia.py b/src/bag3_analog/schematic/tia.py new file mode 100644 index 0000000..7d2b764 --- /dev/null +++ b/src/bag3_analog/schematic/tia.py @@ -0,0 +1,88 @@ +# BSD 3-Clause License +# +# Copyright (c) 2018, Regents of the University of California +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# -*- coding: utf-8 -*- + +from typing import Mapping, Any + +import pkg_resources +from pathlib import Path + +from bag.design.module import Module +from bag.design.database import ModuleDB +from bag.util.immutable import Param + + +# noinspection PyPep8Naming +class bag3_analog__tia(Module): + """Module for library bag3_analog cell tia. + + Fill in high level description here. + """ + + yaml_file = pkg_resources.resource_filename(__name__, + str(Path('netlist_info', + 'tia.yaml'))) + + def __init__(self, database: ModuleDB, params: Param, **kwargs: Any) -> None: + Module.__init__(self, self.yaml_file, database, params, **kwargs) + + @classmethod + def get_params_info(cls) -> Mapping[str, str]: + """Returns a dictionary from parameter names to descriptions. + + Returns + ------- + param_info : Optional[Mapping[str, str]] + dictionary from parameter names to descriptions. + """ + return dict( + buf_cmos_cell_params='buffer cmos cell parameters ', + res_params='resistor parameters', + cap_params='capacitor parameters', + with_cap='True to have cap', + ) + + def design(self, buf_cmos_cell_params: Param, res_params: Param, cap_params: Param, with_cap: bool) -> None: + self.instances['XBUF'].design(**buf_cmos_cell_params) + self.instances['XRES0'].design(**res_params) + self.instances['XRES1'].design(**res_params) + if with_cap: + self.instances['XCAP0'].design(**cap_params) + self.instances['XCAP1'].design(**cap_params) + else: + self.delete_instance('XCAP0') + self.delete_instance('XCAP1') + self.reconnect_instance_terminal('XBUF', 'vip', 'vip') + self.reconnect_instance_terminal('XBUF', 'vin', 'vin') + self.reconnect_instance_terminal('XRES1', 'MINUS', 'vip') + self.reconnect_instance_terminal('XRES0', 'MINUS', 'vin') + self.remove_pin('vip_m') + self.remove_pin('vin_m') \ No newline at end of file diff --git a/src/bag3_analog/schematic/tia_res.py b/src/bag3_analog/schematic/tia_res.py new file mode 100644 index 0000000..02c2f1c --- /dev/null +++ b/src/bag3_analog/schematic/tia_res.py @@ -0,0 +1,89 @@ +# BSD 3-Clause License +# +# Copyright (c) 2018, Regents of the University of California +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# -*- coding: utf-8 -*- + +from typing import Mapping, Any + +import pkg_resources +from pathlib import Path + +from bag.design.module import Module +from bag.design.database import ModuleDB +from bag.util.immutable import Param + + +# noinspection PyPep8Naming +class bag3_analog__tia_res(Module): + """Module for library bag3_analog cell tia_res. + + Fill in high level description here. + """ + + yaml_file = pkg_resources.resource_filename(__name__, + str(Path('netlist_info', + 'tia_res.yaml'))) + + def __init__(self, database: ModuleDB, params: Param, **kwargs: Any) -> None: + Module.__init__(self, self.yaml_file, database, params, **kwargs) + + @classmethod + def get_params_info(cls) -> Mapping[str, str]: + """Returns a dictionary from parameter names to descriptions. + + Returns + ------- + param_info : Optional[Mapping[str, str]] + dictionary from parameter names to descriptions. + """ + return dict( + res_params='Parameters for feedback resistors', + dum_params='Optional Parameters for dummy resistors', + sub_type='"ntap" or "ptap"', + ) + + @classmethod + def get_default_param_values(cls) -> Mapping[str, Any]: + return dict(dum_params=None) + + def design(self, res_params: Mapping[str, Any], dum_params: Mapping[str, Any], sub_type: str) -> None: + if sub_type == 'ptap': + for inst_name in ('XRES', 'XDUM'): + self.reconnect_instance_terminal(inst_name, 'BULK', 'VSS') + self.rename_pin('VDD', 'VSS') + + if dum_params: + self.design_resistor('XDUM', **dum_params, mid='dum') + else: + self.remove_instance('XDUM') + + self.design_resistor('XRES', **res_params, mid='mid') + + diff --git a/src/bag3_analog/schematic/tia_term.py b/src/bag3_analog/schematic/tia_term.py new file mode 100644 index 0000000..53b3d53 --- /dev/null +++ b/src/bag3_analog/schematic/tia_term.py @@ -0,0 +1,82 @@ +# BSD 3-Clause License +# +# Copyright (c) 2018, Regents of the University of California +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# -*- coding: utf-8 -*- + +from typing import Mapping, Any + +import pkg_resources +from pathlib import Path + +from bag.design.module import Module +from bag.design.database import ModuleDB +from bag.util.immutable import Param + + +# noinspection PyPep8Naming +class bag3_analog__tia_term(Module): + """Module for library bag3_analog cell tia_term. + + Fill in high level description here. + """ + + yaml_file = pkg_resources.resource_filename(__name__, + str(Path('netlist_info', + 'tia_term.yaml'))) + + def __init__(self, database: ModuleDB, params: Param, **kwargs: Any) -> None: + Module.__init__(self, self.yaml_file, database, params, **kwargs) + + @classmethod + def get_params_info(cls) -> Mapping[str, str]: + """Returns a dictionary from parameter names to descriptions. + + Returns + ------- + param_info : Optional[Mapping[str, str]] + dictionary from parameter names to descriptions. + """ + return dict( + buf_cmos_cell_params='buffer cmos cell parameters ', + res_params='resistor parameters', + res_term_params='termination resistor parameters', + decap_params='decoupling capacitor parameters', + ) + + def design(self, buf_cmos_cell_params: Param, res_params: Param, res_term_params: Param, + decap_params: Param) -> None: + self.instances['XBUF'].design(**buf_cmos_cell_params) + self.instances['XRES0'].design(**res_params) + self.instances['XRES1'].design(**res_params) + self.instances['XTERM'].design(**res_term_params) + self.instances['XDECAP'].design(**decap_params) + + self.reconnect_instance_terminal('XTERM', 'MID', 'mid') + self.reconnect_instance_terminal('XTERM', 'VDD', 'VDD') From 0ec260227d59c3f0ee23e3c921cd711b14ecc193 Mon Sep 17 00:00:00 2001 From: Yi-Hsuan Shih Date: Fri, 18 Mar 2022 10:32:33 -0700 Subject: [PATCH 2/2] resolve pull request comments --- src/bag3_analog/layout/tia/tia.py | 2 +- src/bag3_analog/layout/tia/util.py | 657 ----------------------------- 2 files changed, 1 insertion(+), 658 deletions(-) diff --git a/src/bag3_analog/layout/tia/tia.py b/src/bag3_analog/layout/tia/tia.py index 17e0b9a..0325480 100644 --- a/src/bag3_analog/layout/tia/tia.py +++ b/src/bag3_analog/layout/tia/tia.py @@ -28,7 +28,7 @@ def __init__(self, temp_db: TemplateDB, params: Param, **kwargs: Any) -> None: @classmethod def get_schematic_class(cls) -> Optional[Type[Module]]: - return bag_vco__res + return bag3_analog__tia_res @classmethod def get_params_info(cls) -> Mapping[str, str]: diff --git a/src/bag3_analog/layout/tia/util.py b/src/bag3_analog/layout/tia/util.py index b460599..74cd093 100644 --- a/src/bag3_analog/layout/tia/util.py +++ b/src/bag3_analog/layout/tia/util.py @@ -250,663 +250,6 @@ def draw_stack_wire(self: TemplateBase, wire: WireArray, top_layid: int, x0: Opt return wire_arr_list - # def do_power_fill_poly(self, # type: TemplateBase - # layer_id, # type: int - # space, # type: Union[float, int] - # space_le, # type: Union[float, int] - # vdd_warrs=None, # type: Optional[Union[WireArray, List[WireArray]]] - # vss_warrs=None, # type: Optional[Union[WireArray, List[WireArray]]] - # bound_box_list=None, # type: Optional[BBox] - # exclude_box_list=[], - # fill_width=1, # type: int - # fill_space=0, # type: int - # tr_offset=0, # type: Union[float, int] - # min_len=0, # type: Union[float, int] - # flip=False, # type: bool - # unit_mode=False, # type: bool - # vss_only=False, - # vdd_only=False, - # ): - # # type: (...) -> Tuple[List[WireArray], List[WireArray]] - # """Draw power fill on the given layer.""" - # res = self.grid.resolution - # if not unit_mode: - # space = int(round(space / res)) - # space_le = int(round(space_le / res)) - # x_margin = int(round(x_margin / res)) - # y_margin = int(round(y_margin / res)) - # tr_offset = int(round(tr_offset / res)) - # min_len = int(round(min_len / res)) - # - # min_len_process = self.grid.get_min_length(layer_id, fill_width, unit_mode=True) - # min_len_global = max(min_len, min_len_process) - # - # if bound_box_list is None: - # bound_box_list = [self.bound_box] - # - # cut_out_bound_box_list = self.bbox_list_subtract(bound_box_list, exclude_box_list) - # - # # get absolute 0 half track index - # tr_off = self.grid.coord_to_track(layer_id, tr_offset, unit_mode=True) - # htr0 = int(tr_off * 2) + 1 + fill_width + fill_space - # htr_pitch = 2 * (fill_width + fill_space) - # is_horizontal = (self.grid.get_direction(layer_id) == 'x') - # - # top_vdd, top_vss = [], [] - # - # for bound_box in cut_out_bound_box_list: - # - # if is_horizontal: - # cl, cu = bound_box.bottom_unit, bound_box.top_unit - # lower, upper = bound_box.left_unit, bound_box.right_unit - # if bound_box.width_unit < min_len_global: - # min_len = min_len_process - # print("warning, bbbox is less wide than min_len, overriding min_len") - # else: - # min_len = min_len_global - # else: - # cl, cu = bound_box.left_unit, bound_box.right_unit - # lower, upper = bound_box.bottom_unit, bound_box.top_unit - # if bound_box.height_unit < min_len_global: - # min_len = min_len_process - # print("warning, bbbox is less tall than min_len, overriding min_len") - # else: - # min_len = min_len_global - # - # # get max and min track - # tr_bot = self.grid.find_next_track(layer_id, cl, tr_width=fill_width, half_track=True, - # mode=1, unit_mode=True) - # tr_top = self.grid.find_next_track(layer_id, cu, tr_width=fill_width, half_track=True, - # mode=-1, unit_mode=True) - # - # # go thru each track and get the open intervals - # n0 = - (-(int(tr_bot * 2) + 1 - htr0) // htr_pitch) - # n1 = (int(tr_top * 2) + 1 - htr0) // htr_pitch - # - # for ncur in range(n0, n1 + 1): - # tr_idx = (htr0 + ncur * htr_pitch - 1) / 2 - # tid = TrackID(layer_id, tr_idx, width=fill_width) - # - # cur_list = top_vss if (ncur % 2 == 0) != flip else top_vdd - # - # # vdd_only or vdd_only - # cur_list = top_vss if vss_only else cur_list - # cur_list = top_vdd if vdd_only else cur_list - # if vss_only and vdd_only: - # raise ValueError("only one of 'vss_only' and 'vdd_only' could be True.") - # - # for tl, tu in self.open_interval_iter(tid, lower, upper, sp=space, sp_le=space_le, - # min_len=min_len): - # cur_list.append(WireArray(tid, tl, tu, res=res, unit_mode=True)) - # - # # draw the grid rects for each interval - # for warr in chain(top_vdd, top_vss): - # for lay, box_arr in warr.wire_arr_iter(self.grid): - # self.add_rect(lay, box_arr) - # - # # drop vias - # if vdd_warrs: - # self.draw_vias_on_intersections(vdd_warrs, top_vdd) - # if vss_warrs: - # self.draw_vias_on_intersections(vss_warrs, top_vss) - # - # return top_vdd, top_vss - # - # def bbox_list_subtract(self, bbox_a_list, bbox_b_list): - # bbox_results = bbox_a_list - # - # for bbox_b in bbox_b_list: - # bbox_results_new = [] - # - # for bbox_a in bbox_results: - # # // h +-+-+-+ - # # // . |6|7|8| - # # // g +-+-+-+ - # # // . |3|4|5| - # # // f +-+-+-+ - # # // . |0|1|2| - # # // e +-+-+-+ - # # // . a b c d - # - # a = min(bbox_a.left_unit, bbox_b.left_unit) - # if (bbox_a.right_unit > bbox_b.left_unit) and (bbox_b.right_unit > bbox_a.left_unit): - # b = max(bbox_a.left_unit, bbox_b.left_unit) - # c = min(bbox_a.right_unit, bbox_b.right_unit) - # x_overlap = True - # else: - # c = max(bbox_a.left_unit, bbox_b.left_unit) - # b = min(bbox_a.right_unit, bbox_b.right_unit) - # x_overlap = False - # d = max(bbox_a.right_unit, bbox_b.right_unit) - # - # e = min(bbox_a.bottom_unit, bbox_b.bottom_unit) - # if (bbox_a.top_unit > bbox_b.bottom_unit) and (bbox_b.top_unit > bbox_a.bottom_unit): - # f = max(bbox_a.bottom_unit, bbox_b.bottom_unit) - # g = min(bbox_a.top_unit, bbox_b.top_unit) - # y_overlap = True - # else: - # g = max(bbox_a.bottom_unit, bbox_b.bottom_unit) - # f = min(bbox_a.top_unit, bbox_b.top_unit) - # y_overlap = False - # h = max(bbox_a.top_unit, bbox_b.top_unit) - # - # if y_overlap and x_overlap: - # - # colA_trivial = (a == b) - # colB_trivial = (b == c) - # colC_trivial = (c == d) - # - # rowA_trivial = (e == f) - # rowB_trivial = (f == g) - # rowC_trivial = (g == h) - # - # BRect0 = BBox(left=a, bottom=e, right=b, top=f, resolution=self.grid.resolution, - # unit_mode=True) if not (rowA_trivial or colA_trivial) else None - # BRect1 = BBox(left=b, bottom=e, right=c, top=f, resolution=self.grid.resolution, - # unit_mode=True) if not (rowA_trivial or colB_trivial) else None - # BRect2 = BBox(left=c, bottom=e, right=d, top=f, resolution=self.grid.resolution, - # unit_mode=True) if not (rowA_trivial or colC_trivial) else None - # BRect3 = BBox(left=a, bottom=f, right=b, top=g, resolution=self.grid.resolution, - # unit_mode=True) if not (rowB_trivial or colA_trivial) else None - # BRect4 = BBox(left=b, bottom=f, right=c, top=g, resolution=self.grid.resolution, - # unit_mode=True) if not (rowB_trivial or colB_trivial) else None - # BRect5 = BBox(left=c, bottom=f, right=d, top=g, resolution=self.grid.resolution, - # unit_mode=True) if not (rowB_trivial or colC_trivial) else None - # BRect6 = BBox(left=a, bottom=g, right=b, top=h, resolution=self.grid.resolution, - # unit_mode=True) if not (rowC_trivial or colA_trivial) else None - # BRect7 = BBox(left=b, bottom=g, right=c, top=h, resolution=self.grid.resolution, - # unit_mode=True) if not (rowC_trivial or colB_trivial) else None - # BRect8 = BBox(left=c, bottom=g, right=d, top=h, resolution=self.grid.resolution, - # unit_mode=True) if not (rowC_trivial or colC_trivial) else None - # - # if not (BRect0 is None): - # if (bbox_a.left_unit < bbox_b.left_unit) and (bbox_a.bottom_unit < bbox_b.bottom_unit): - # bbox_results_new.append(BRect0) - # - # if not (BRect1 is None): - # if (bbox_a.bottom_unit < bbox_b.bottom_unit) and x_overlap: - # bbox_results_new.append(BRect1) - # - # if not (BRect2 is None): - # if (bbox_a.right_unit > bbox_b.right_unit) and (bbox_a.bottom_unit < bbox_b.bottom_unit): - # bbox_results_new.append(BRect2) - # - # if not (BRect3 is None): - # if (bbox_a.left_unit < bbox_b.left_unit) and y_overlap: - # bbox_results_new.append(BRect3) - # - # if not (BRect4 is None): - # if False: - # bbox_results_new.append(BRect4) - # - # if not (BRect5 is None): - # if (bbox_a.right_unit > bbox_b.right_unit) and y_overlap: - # bbox_results_new.append(BRect5) - # - # if not (BRect6 is None): - # if (bbox_a.left_unit < bbox_b.left_unit) and (bbox_a.top_unit > bbox_b.top_unit): - # bbox_results_new.append(BRect6) - # - # if not (BRect7 is None): - # if (bbox_a.top_unit > bbox_b.top_unit) and x_overlap: - # bbox_results_new.append(BRect7) - # - # if not (BRect8 is None): - # if (bbox_a.right_unit > bbox_b.right_unit) and (bbox_a.top_unit > bbox_b.top_unit): - # bbox_results_new.append(BRect8) - # else: - # bbox_results_new.append(bbox_a) - # - # bbox_results = bbox_results_new - # - # for bbox in bbox_results: - # if (bbox.left_unit >= bbox.right_unit) or (bbox.bottom_unit >= bbox.top_unit): - # raise Exception('bbox subtraction screwed up, max dim must be greater than min dim') - # - # return bbox_results - # - # def draw_bump_rv(self, pad_diameter, pad_center, bump_layer, wing_size, rv_land_width, rv_land_space, - # remove_wings=[0, 0, 0, 0], bump_net=None, show_pins=False): - # - # pad_radius = int(np.floor(pad_diameter / 2)) - # pad_half_side = int(np.floor(0.5 * pad_diameter / (1 + np.sqrt(2)))) - # pad_layer_name = self.grid.get_layer_name(bump_layer, 0) - # pad_center_x = pad_center[0] - # pad_center_y = pad_center[1] - # - # draw_left_wing = not (bool(remove_wings[0])) - # draw_bot_wing = not (bool(remove_wings[1])) - # draw_right_wing = not (bool(remove_wings[2])) - # draw_top_wing = not (bool(remove_wings[3])) - # - # wire_drops = [] - # wire_drop_boxes = [] - # - # bot_layer = self.grid.get_layer_name(bump_layer - 1, 0) - # top_layer = self.grid.get_layer_name(bump_layer, 0) - # - # rv_land_pitch = rv_land_width + rv_land_space - # - # if draw_top_wing: - # top_pad_wing = self.add_rect(pad_layer_name, BBox( - # left=pad_center_x - pad_half_side, bottom=pad_center_y + pad_radius, - # right=pad_center_x + pad_half_side, top=pad_center_y + pad_radius + wing_size, - # resolution=self.grid.resolution, unit_mode=True - # )) - # - # wire_drop_boxes.append(top_pad_wing.bbox) - # top_wing_lower_index = self.grid.coord_to_nearest_track( - # layer_id=bump_layer - 1, - # coord=top_pad_wing.bbox.left_unit, - # mode=1, - # half_track=False, - # unit_mode=True, - # ) - # top_wing_upper_index = self.grid.coord_to_nearest_track( - # layer_id=bump_layer - 1, - # coord=top_pad_wing.bbox.right_unit, - # mode=-1, - # half_track=False, - # unit_mode=True, - # ) - # - # top_wing_span = np.floor( - # (top_wing_upper_index - top_wing_lower_index - rv_land_width) / rv_land_pitch) * rv_land_pitch + 1 - # top_wing_center = (top_wing_upper_index + top_wing_lower_index) / 2 - # top_wing_lower_range = int(np.ceil(top_wing_center - top_wing_span / 2)) - # top_wing_upper_range = int(np.floor(top_wing_center + top_wing_span / 2)) + 1 - # - # for track_index in range(top_wing_lower_range, top_wing_upper_range, rv_land_pitch): - # temp_warr = self.add_wires( - # layer_id=bump_layer - 1, - # track_idx=track_index, - # lower=top_pad_wing.bbox.bottom_unit, - # upper=top_pad_wing.bbox.top_unit, - # width=rv_land_width, - # unit_mode=True, - # ) - # self.add_via(bbox=temp_warr.get_bbox_array(self.grid).get_bbox(0), extend=False, bot_layer=bot_layer, - # top_layer=top_layer, bot_dir='y') - # wire_drops.append(temp_warr) - # - # if draw_bot_wing: - # bottom_pad_wing = self.add_rect(pad_layer_name, BBox( - # left=pad_center_x - pad_half_side, bottom=pad_center_y - pad_radius - wing_size, - # right=pad_center_x + pad_half_side, top=pad_center_y - pad_radius, - # resolution=self.grid.resolution, unit_mode=True - # )) - # - # wire_drop_boxes.append(bottom_pad_wing.bbox) - # bottom_wing_lower_index = self.grid.coord_to_nearest_track( - # layer_id=bump_layer - 1, - # coord=bottom_pad_wing.bbox.left_unit, - # mode=1, - # half_track=False, - # unit_mode=True, - # ) - # bottom_wing_upper_index = self.grid.coord_to_nearest_track( - # layer_id=bump_layer - 1, - # coord=bottom_pad_wing.bbox.right_unit, - # mode=-1, - # half_track=False, - # unit_mode=True, - # ) - # - # bottom_wing_span = np.floor( - # (bottom_wing_upper_index - bottom_wing_lower_index - rv_land_width) / rv_land_pitch) * rv_land_pitch + 1 - # bottom_wing_center = (bottom_wing_upper_index + bottom_wing_lower_index) / 2 - # bottom_wing_lower_range = int(np.ceil(bottom_wing_center - bottom_wing_span / 2)) - # bottom_wing_upper_range = int(np.floor(bottom_wing_center + bottom_wing_span / 2)) + 1 - # - # for track_index in range(bottom_wing_lower_range, bottom_wing_upper_range, rv_land_pitch): - # temp_warr = self.add_wires( - # layer_id=bump_layer - 1, - # track_idx=track_index, - # lower=bottom_pad_wing.bbox.bottom_unit, - # upper=bottom_pad_wing.bbox.top_unit, - # width=rv_land_width, - # unit_mode=True, - # ) - # self.add_via(bbox=temp_warr.get_bbox_array(self.grid).get_bbox(0), extend=False, bot_layer=bot_layer, - # top_layer=top_layer, bot_dir='y') - # wire_drops.append(temp_warr) - # - # if draw_left_wing: - # left_pad_wing = self.add_rect(pad_layer_name, BBox( - # left=pad_center_x - pad_radius - wing_size, bottom=pad_center_y - pad_half_side, - # right=pad_center_x - pad_radius, top=pad_center_y + pad_half_side, - # resolution=self.grid.resolution, unit_mode=True - # )) - # - # wire_drop_boxes.append(left_pad_wing.bbox) - # left_wing_lower_index = self.grid.coord_to_nearest_track( - # layer_id=bump_layer - 1, - # coord=left_pad_wing.bbox.left_unit, - # mode=1, - # half_track=False, - # unit_mode=True, - # ) - # left_wing_upper_index = self.grid.coord_to_nearest_track( - # layer_id=bump_layer - 1, - # coord=left_pad_wing.bbox.right_unit, - # mode=-1, - # half_track=False, - # unit_mode=True, - # ) - # - # left_wing_lower_range = left_wing_lower_index - # left_wing_upper_range = left_wing_upper_index + 2 - rv_land_width - # for left_index in range(left_wing_lower_range, left_wing_upper_range, rv_land_pitch): - # track_index = left_index + np.ceil(rv_land_width / 2 - .5) - # temp_warr = self.add_wires( - # layer_id=bump_layer - 1, - # track_idx=track_index, - # lower=left_pad_wing.bbox.bottom_unit, - # upper=left_pad_wing.bbox.top_unit, - # width=rv_land_width, - # unit_mode=True, - # ) - # self.add_via(bbox=temp_warr.get_bbox_array(self.grid).get_bbox(0), extend=False, bot_layer=bot_layer, - # top_layer=top_layer, bot_dir='y') - # wire_drops.append(temp_warr) - # - # if draw_right_wing: - # right_pad_wing = self.add_rect(pad_layer_name, BBox( - # left=pad_center_x + pad_radius, bottom=pad_center_y - pad_half_side, - # right=pad_center_x + pad_radius + wing_size, top=pad_center_y + pad_half_side, - # resolution=self.grid.resolution, unit_mode=True - # )) - # - # wire_drop_boxes.append(right_pad_wing.bbox) - # right_wing_lower_index = self.grid.coord_to_nearest_track( - # layer_id=bump_layer - 1, - # coord=right_pad_wing.bbox.left_unit, - # mode=1, - # half_track=False, - # unit_mode=True, - # ) - # right_wing_upper_index = self.grid.coord_to_nearest_track( - # layer_id=bump_layer - 1, - # coord=right_pad_wing.bbox.right_unit, - # mode=-1, - # half_track=False, - # unit_mode=True, - # ) - # - # right_wing_lower_range = right_wing_upper_index - # right_wing_upper_range = right_wing_lower_index - 2 + rv_land_width - # for right_index in range(right_wing_lower_range, right_wing_upper_range, -1 * rv_land_pitch): - # track_index = right_index - np.floor(rv_land_width / 2) - # temp_warr = self.add_wires( - # layer_id=bump_layer - 1, - # track_idx=track_index, - # lower=right_pad_wing.bbox.bottom_unit, - # upper=right_pad_wing.bbox.top_unit, - # width=rv_land_width, - # unit_mode=True, - # ) - # self.add_via(bbox=temp_warr.get_bbox_array(self.grid).get_bbox(0), extend=False, bot_layer=bot_layer, - # top_layer=top_layer, bot_dir='y') - # wire_drops.append(temp_warr) - # - # return wire_drops, wire_drop_boxes - # - # def floorplan_bbox_transform(self, base_box_list, position, orient): - # new_box_list = [] - # for base_box in base_box_list: - # if orient == 'R0': - # rotated_box = base_box - # elif orient == 'MY': - # rotated_box = [-base_box[2], base_box[1], -base_box[0], base_box[3]] - # elif orient == 'MX': - # rotated_box = [base_box[0], -base_box[3], base_box[2], -base_box[1]] - # elif orient == 'R180': - # rotated_box = [-base_box[2], -base_box[3], -base_box[0], -base_box[1]] - # else: - # raise ("bad rotation value") - # - # new_box = [rotated_box[0] + position[0], rotated_box[1] + position[1], rotated_box[2] + position[0], - # rotated_box[3] + position[1]] - # new_box_list.append(new_box) - # return new_box_list - # - # def create_global_grid(self, tr_manager, moved_macro_grid_poly_phrb, phrb_width, phrb_height, top_layer, - # glob_min_grid_layer, glob_max_grid_layer, - # macro_instance_list, bump_grid_vdd_list, bump_grid_vss_list, show_pins=True, - # pin_missed_rails=True): - # - # # Create global Grid - # top_global_vdd_warrs = [] - # top_global_vss_warrs = [] - # power_island_box_list = [] - # - # for power_island_points in moved_macro_grid_poly_phrb: - # power_island_box = BBox( - # left=power_island_points[0] * phrb_width, bottom=power_island_points[1] * phrb_height, - # right=power_island_points[2] * phrb_width, top=power_island_points[3] * phrb_height, - # resolution=self.grid.resolution, unit_mode=True - # ) - # power_island_box_list.append(power_island_box) - # self.add_rect(('ref', 'drawing'), power_island_box) - # - # [blk_w, blk_h] = self.grid.get_block_size(top_layer, unit_mode=True) - # - # warr_vdd = [] - # warr_vss = [] - # for power_layer in range(glob_min_grid_layer, glob_max_grid_layer + 1): - # - # power_grid_width_tracks = tr_manager.get_width(layer_id=power_layer, track_type='supply') - # power_grid_supply_space_tracks = tr_manager.get_space(layer_id=power_layer, type_tuple=('supply', 'supply')) - # power_grid_sig_space_tracks = tr_manager.get_space(layer_id=power_layer, type_tuple=('supply', '')) - # - # blk_snap = (power_grid_width_tracks + power_grid_supply_space_tracks) * self.grid.get_track_pitch( - # power_layer, unit_mode=True) - # - # # exclude_boxes = [] - # exclude_boxes_snapped = [] - # # exclude_boxes = master_serdes_rx.grid_exclude_boxes_per_layer.get(power_layer,[]) - # - # for macro_instance in macro_instance_list: - # macro_master = macro_instance.master - # exclude_boxes = macro_master.grid_exclude_boxes_per_layer.get(power_layer, []) if hasattr(macro_master, - # 'grid_exclude_boxes_per_layer') else [] - # - # for old_box in exclude_boxes: - # relocate_box = old_box[0].transform(loc=macro_instance.location_unit, - # orient=macro_instance.orientation, unit_mode=True) - # - # self.add_rect(('DMEXCL', 'dummy' + str(power_layer)), relocate_box) - # - # blk_snap_left = -1 * blk_snap * old_box[1][0] if not (old_box[1][0] == 0) else 1 - # blk_snap_bottom = -1 * blk_snap * old_box[1][1] if not (old_box[1][1] == 0) else 1 - # blk_snap_right = -1 * blk_snap * old_box[1][2] if not (old_box[1][2] == 0) else 1 - # blk_snap_top = -1 * blk_snap * old_box[1][3] if not (old_box[1][3] == 0) else 1 - # - # exclude_boxes_snapped.append(BBox( - # left=relocate_box.left_unit // blk_snap_left * blk_snap_left, - # bottom=relocate_box.bottom_unit // blk_snap_bottom * blk_snap_bottom, - # right=relocate_box.right_unit // blk_snap_right * blk_snap_right, - # top=relocate_box.top_unit // blk_snap_top * blk_snap_top, - # resolution=self.grid.resolution, unit_mode=True, - # )) - # - # print('adding grind on %d' % power_layer) - # # pdb.set_trace() - # - # # if power_layer == 8: - # # exclude_boxes_snapped_test = [] - # # exclude_boxes_snapped_test.append(BBox( - # # left = 211680, bottom = 705600, - # # right = 330120, top = 813960, - # # resolution=self.grid.resolution, unit_mode=True, - # # )) - # # exclude_boxes_snapped_test.append(BBox( - # # left = 483840, bottom = 695520, - # # right = 624960, top = 824040, - # # resolution=self.grid.resolution, unit_mode=True, - # # )) - # # exclude_boxes_snapped_test.append(BBox( - # # left = 211680, bottom = 740880, - # # right = 388080, top = 778680, - # # resolution=self.grid.resolution, unit_mode=True, - # # )) - # # exclude_boxes_snapped_test.append(BBox( - # # left = 388080, bottom = 720720, - # # right = 624960, top = 796320, - # # resolution=self.grid.resolution, unit_mode=True, - # # )) - # - # # elif power_layer == 9: - # - # # exclude_boxes_snapped_test = [] - # # exclude_boxes_snapped_test.append(BBox( - # # left = 388080, bottom = 727215, - # # right = 624960, top = 791505, - # # resolution=self.grid.resolution, unit_mode=True, - # # )) - # # exclude_boxes_snapped_test.append(BBox( - # # left = 211680, bottom = 740880, - # # right = 374865, top = 777840, - # # resolution=self.grid.resolution, unit_mode=True, - # # )) - # # exclude_boxes_snapped_test.append(BBox( - # # left = 211680, bottom = 746955, - # # right = 388080, top = 770925, - # # resolution=self.grid.resolution, unit_mode=True, - # # )) - # # exclude_boxes_snapped_test.append(BBox( - # # left = 211680, bottom = 705600, - # # right = 330120, top = 813960, - # # resolution=self.grid.resolution, unit_mode=True, - # # )) - # # exclude_boxes_snapped_test.append(BBox( - # # left = 483840, bottom = 695520, - # # right = 624960, top = 824040, - # # resolution=self.grid.resolution, unit_mode=True, - # # )) - # # exclude_boxes_snapped = exclude_boxes_snapped_test - # - # if power_layer == top_layer: - # min_len = 1.5 * (tr_manager.get_width(layer_id=power_layer, track_type='supply') + tr_manager.get_space( - # layer_id=power_layer, type_tuple=('supply', 'supply'))) * self.grid.get_track_pitch(power_layer, - # unit_mode=True) - # print('wiring gird on top layer') - # else: - # min_len = 1.5 * ( - # tr_manager.get_width(layer_id=power_layer + 1, track_type='supply') + tr_manager.get_space( - # layer_id=power_layer + 1, type_tuple=('supply', 'supply'))) * self.grid.get_track_pitch( - # power_layer + 1, unit_mode=True) - # - # warr_vdd, warr_vss = self.do_power_fill_poly( - # layer_id=power_layer, - # space=power_grid_sig_space_tracks * self.grid.get_track_pitch(power_layer, unit_mode=True), - # space_le=3 * self.grid.get_line_end_space(power_layer, power_grid_width_tracks, unit_mode=True), - # vdd_warrs=warr_vdd, - # vss_warrs=warr_vss, - # bound_box_list=power_island_box_list, - # exclude_box_list=exclude_boxes_snapped, - # fill_width=power_grid_width_tracks, - # fill_space=power_grid_supply_space_tracks, - # unit_mode=True, - # min_len=min_len - # ) - # - # if power_layer == glob_max_grid_layer - 1: - # if bump_grid_vdd_list: - # self.draw_vias_on_intersections(warr_vdd, bump_grid_vdd_list) - # - # if bump_grid_vss_list: - # self.draw_vias_on_intersections(warr_vss, bump_grid_vss_list) - # - # if True: - # sub_block_upper_vdd_warrs = [] - # sub_block_upper_vss_warrs = [] - # for macro_instance in macro_instance_list: - # sub_block_upper_vdd_warrs.extend(macro_instance.get_all_port_pins('VDD', layer=power_layer - 1)) - # sub_block_upper_vss_warrs.extend(macro_instance.get_all_port_pins('VSS', layer=power_layer - 1)) - # - # if sub_block_upper_vdd_warrs: - # sub_block_vdd_conns_made = self.draw_vias_on_intersections(sub_block_upper_vdd_warrs, warr_vdd) - # - # print('vdd') - # for y, x in zip(sub_block_vdd_conns_made, sub_block_upper_vdd_warrs): - # if not (y): - # print(x.get_bbox_array(self.grid)) - # if pin_missed_rails: - # self.add_pin('VDD', x, label='VDD:') - # else: - # for lay, box_arr in x.wire_arr_iter(self.grid): - # self.add_rect(lay, box_arr) - # - # if sub_block_upper_vss_warrs: - # sub_block_vss_conns_made = self.draw_vias_on_intersections(sub_block_upper_vss_warrs, warr_vss) - # - # print('vss') - # for y, x in zip(sub_block_vss_conns_made, sub_block_upper_vss_warrs): - # if not (y): - # print(x.get_bbox_array(self.grid)) - # if pin_missed_rails: - # self.add_pin('VSS', x, label='VSS:') - # else: - # for lay, box_arr in x.wire_arr_iter(self.grid): - # self.add_rect(lay, box_arr) - # - # top_global_vdd_warrs.extend(warr_vdd) - # top_global_vss_warrs.extend(warr_vss) - # - # if pin_missed_rails: - # self.add_pin('VDD', top_global_vdd_warrs, label='VDD:') - # self.add_pin('VSS', top_global_vss_warrs, label='VSS:') - # else: - # self.add_pin('VDD', top_global_vdd_warrs) - # self.add_pin('VSS', top_global_vss_warrs) - # - # def add_bump_hookup(self, top_layer, pad_diameter, wing_size, rv_land_width, rv_land_space, bump_x, bump_y, - # bump_net, remove_wings, show_pins): - # - # pad_radius = int(np.floor(pad_diameter / 2)) - # pad_half_side = int(np.floor(0.5 * pad_diameter / (1 + np.sqrt(2)))) - # - # pad_layer_name = self.grid.get_layer_name(top_layer, 0) - # - # horz_neg_offset = pad_half_side if remove_wings[0] == 1 else pad_radius + wing_size - # vert_neg_offset = pad_half_side if remove_wings[1] == 1 else pad_radius + wing_size - # horz_pos_offset = pad_half_side if remove_wings[2] == 1 else pad_radius + wing_size - # vert_pos_offset = pad_half_side if remove_wings[3] == 1 else pad_radius + wing_size - # - # self.add_rect(pad_layer_name, BBox( - # left=bump_x - pad_half_side, bottom=bump_y - vert_neg_offset, - # right=bump_x + pad_half_side, top=bump_y + vert_pos_offset, - # resolution=self.grid.resolution, unit_mode=True - # )) - # - # self.add_rect(pad_layer_name, BBox( - # left=bump_x - horz_neg_offset, bottom=bump_y - pad_half_side, - # right=bump_x + horz_pos_offset, top=bump_y + pad_half_side, - # resolution=self.grid.resolution, unit_mode=True - # )) - # - # self.add_rect(pad_layer_name, BBox( - # left=bump_x - pad_half_side, bottom=bump_y - pad_half_side, - # right=bump_x + pad_half_side, top=bump_y + pad_half_side, - # resolution=self.grid.resolution, unit_mode=True - # )) - # - # ap_pin = self.add_rect(pad_layer_name, BBox( - # left=bump_x - pad_diameter // 32, bottom=bump_y - pad_diameter // 32, - # right=bump_x + pad_diameter // 32, top=bump_y + pad_diameter // 32, - # resolution=self.grid.resolution, unit_mode=True - # )) - # - # # if not((bump_net == 'ANALOG_OUT_N') or (bump_net == 'ANALOG_OUT_P')): - # if True: - # self.add_pin_primitive(bump_net, pad_layer_name, ap_pin.bbox) - # - # wire_drops, wire_drop_boxes = self.draw_bump_rv(pad_diameter, [bump_x, bump_y], top_layer, wing_size, - # rv_land_width, rv_land_space, remove_wings) - # - # return wire_drops, wire_drop_boxes - # def draw_multiple_stack_wire(self: TemplateBase, tr_manager, warr_list: List[WireArray], top_layid: int, wire_type: str, sep_type: (str, str), y0=None, y1=None, x0=None, x1=None, stack_idx=-1):