From 2feaa84f9add3a3369c2bc91032d5281ac82dd74 Mon Sep 17 00:00:00 2001 From: Luke Kenneth Casson Leighton Date: Fri, 11 Jun 2021 15:29:12 +0100 Subject: [PATCH] add outer leads and pack/qfp drawings --- src/spec/greatek_qfp_128L.png | Bin 0 -> 36931 bytes src/spec/greatek_qfp_128_fp.png | Bin 0 -> 20002 bytes src/spec/ifaceprint.py | 177 +++++++++++++++++++++++++++++--- 3 files changed, 164 insertions(+), 13 deletions(-) create mode 100644 src/spec/greatek_qfp_128L.png create mode 100644 src/spec/greatek_qfp_128_fp.png diff --git a/src/spec/greatek_qfp_128L.png b/src/spec/greatek_qfp_128L.png new file mode 100644 index 0000000000000000000000000000000000000000..7b20a6f0e62e20313d9fd2c1fe4aa077091b688b GIT binary patch literal 36931 zcmV(@K-RyBP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+RdCv;!?)_aTzSq1fHk zrT!47BqJl-9Wb*u7y!ESKmUE*fAOQI>|HLkSvT|i$UXNs_)GJjAD^$m=lAFP5#O)( z@1I_Gd@z2!BlyJE^!bLJ&(|<`y?p;b&0nw2pI>)%ech>jUFho@-!7PRXWeRlJ>=Jg zQvAFgzW(j{=Xw0FABOYwdwzZR-P!;7-?=gwyKub}T|6ly|Ne}hJ0<-NY4FwfGo-*9 zLn{0|rpli=*`Mdn>0ft#-RYMJ{Nr!G%%5Lhuczf2D>-*_Vf&gp&3_*wZ~_m0n1*ujFYG1d^6$3}bxPaac_lL&<3O58kU%qbbcX;Js)Gc~;T#u7g-11|)k zP&Ad$^fU-o&Ltc5)<~h@N-DXOVx^W=dKs21TQRe0!l_YH&9zjkwYJ*pXsP8^nzhuvPd6EId>w_bbey^q07M;=^j@czLIGtM;gEYoJ4ZT2}9>9g`G%T`@&^)+_fX#)Xn z+pfFqzQ+lNR66;TW2c^W`Wcs8yXodzuHAau?RWeUweVH8KSk}=$o=!Eg|Dc^7bv~2 zevcY2*ZS=eL2yzOGa?pqAmUXKAfcmT=3B@)DsqaM?=iWQO5`bvg0q7nMg;Q-vE1-S z?7m0tAI8lwyZ>(7;_o8o6uSRJaBuHkQBs?vwT^JCAXhmz~I^ z&d|zYhFa!`*Z?4vN$>;QRYd^;Gv@>@~hd21K z#keV#kc%KN?VVk*vqsE&ck{XJF)}kU3Xh{Ax3GO%+x%^Ptu-G)_ufE{y%tY9YGwXL zF}L<)(u@=$;2V%7%na`IeVUI(=uXVmhOd<*L2RVv*KXnV9dob6Zise!bhR;rTM20> zWn4ZMx^W?Xr#^g2W00I-x0jr!UVoU}SSR1joy6U7EGE~5)>gJVTRmJJl$zQ4%E4-! zWvy#QzA?iq#~{p|Q#vT77I$Aarafl4Yh@Q#sdb!O834Bmo97QZ$Cp!R8q%w+HfIxJ z@_n*8E#g)P^our9Vixo6^jX`DHg_el%GzfFUQ`!(vC<6b*d;u3)oBcc3`?Y{;{2oy z4-sd-H#ky;#~XX*)+R}RE(zGT=5#jVDE5T;&NcF9GckM3YWotNWPzgeuv}lwg;kAA z^gsdk>9A5_D2s@a{hLJLg_q+7+qRS8)4>RdBQxB1p%u+-a=cmrfbmmtd@mB!X&c+Z zO&|hnoVi+J{(-J~n2|)%@X6v`mO z%1LE%3)BY>uyUeeF1dbpy=kbn&fXyF2A(0*JPt!PJ3Ufsr!>%WULcKm4{d=1rwZ?Q zd4b48hELT#Y+fGiY6R^rOBYNL$tcaM+ZFWRH;%H(B+C!u8FR=5T&kj`PISn#bwMNr zegcp@6{-w!iJse30BN~$W69oDE5OHzmx%(kbSG5K*{zdkq4Nucwz>+YbGJ&Nncp$> zLd~KOiVL|##xP7Ru zl}WL(QsnW&nyvV`9(YuAYurr1nY^WzR5x_hEzj0Hbr2vOtEb%V;H7)hzAcqP7J!#& zEplWo21O3%eu3FWlEpZH`>_K>lS#iu4)FIlV*u_P1-==AhiAY|ZVcoA4?C8zl3hN6 zZ`jN8;1(zpu!pe$aB~sk41PrtFh=xIzX>EONkODgZb-~y022*3qvELy_>(+990MG2 z`85D2u$-CLumb=Rnlq@zd|xx8qqh~Fl2!yDAO>lHkTqNom&@Gh-el8co$dvNzxuU3GB0fG&qxvmyXUQ1?eJM^J%rohb z=?vrC5{~hyQm8dwm(#SgIv};k6Y-m|RTLN*2ahp>@WfsgOZNv?L&lckNmG*%f+q~Q zRa;pIEm9P>8Q`&rKV{&sdkb&{e)ZK7!aYMM$RuH0I%h;mVE_xKK;QOo$VCZ{DWau{ zNfU%x@uRdB88A1<_4qcp|=Py&GYF`#VJ1M`$M@=E2! zCA0|FX=a;&ov;>jTag(MekRJ&oFFCQc7_6*rbBEKX}&W#PDYB-21SgPP0L*rDrlf9 zBWLHiDDzujpI0no3!00Y^MtS?nH9NQjT%-&NSuNmXp<+$LM$X@AN?Q`2@gsolY1Et zrd-cpK?mVHYJzV9_$60zh`AWB@E`!Fkvy>wRB=|GPrgm~;1KRXKzUR&z9zpQH!$kL zsNAd&e&BIVL}pd`DFNY;lQ;$qucr7WkkPwE|fLt49rM!-jzPzH54k?VLM97#gcCkZK%p&CIa z9zY)hp=yv6OM?y!6ZG4;x{QVbj^Urt=W4qy*ab>u;-hjo9dQVl9tkHRqw(+ve25$k z0i~gq2(~|tzhO3j=L$l|rocyw0!1)`1r&;uOS>s%I9`IZ5&Bz*H zqAJ<3O^k*Fqrj+a=stm%6{v>{XGWcu5cGM&bx0 zB~o#rND+ffFX@ZGqJE$SK2cO9^ZfB|^hsV@{N9*~Up@(wN3#_W1{1VPj;Y8zxN zP}s;q6yhNlbx>|R0zwZ($dw$q*${+11CdvEeUBjf>(lOcjDSVwXoqqr=0!+T&(fDu2bRgfp(({2NnE>3~(3}_(L0)R@b-iWY4l-G%; z<-@wnRq_)mZ07l(ABp*r8u7vpDjNVn9)?QT$IhsctXN>ocpB&LM1JXmlrZ3nyCwE* zhktT;P#HS=`ry~cDB52>`QzvQ^r?S*JNMV__pfi~{@VTid^=p67_Cv`xb2CmMV*1~ zi$tFYej*E!0)N9Cj(EAN$4ZIO`cmy*9R&BPEfIMT_71PMvb3Mr7N4uS@1RQ}rVROnHp@bv{hOPGXY_rX9zVMCI{*%hD;%$ydfIE@=a9#X@y z7I2RQI5P4)T-cWeLzXEc*w_>O})42&_jG1j{rt72oHa&#*kHb%|dk{O-sS2 zSBdCaBI-_rBf1_?lWjzzO;)2-MUm~Ou!B$WtDUi+UlIse!`+w;W(6U7C{uk80UZct zmz%_A9gFcb(5kwcBSaMmW)j}c1%AQq$Yx1YC4~m%In>dSe|%_VNI-=86T=8y2q)?p zvN9dZ&YTvXp>6b#Lz!Sjk@yh>w=W|a9lK2y0Ra#i#r2$QAcCkuC>fjBBbZ)DMKsI> z&e3NMlHL3D%EDLA?C*VbT1rabM_D;zLV76MUz0ac%Wy?pzDc7oQ5oHj6p<5EV=fC; zCXZ8O!yPes2D`U-e8M$ggl2$MHJeOzz|C_hpbw#`9!kwx3Ihocg2=9kLgCwh|JdYk z!zX%EYY)W{Aku|+iU?qwmqgjT<7P5`P~dB+JE(;cyB$Cxix`VTR}bcEBOW)obq7*} zw4-{?#^V4_Ts|rp zL#O?cPq_F&=1IaX03{7@8;_2I6qs}jC8-XRCf*>r#_L(JRt9itO5`Z_%w&X!W@4yh z^+{YDaFB)Qn3|yk&>9;4ueA9VuwJVOG+k4Qzhe$~u7Mj327)6!iRx9~Z)+t@+1nis zM-rAI!>}R@&H!OCw91eYd6)!-Q2l@(HH}_6qg={dt3%^?JFEoq#$j5r-i_8*6J(tk z2ip2d}RRu~P za1n5xVAi|mw-?-dMRzL<{ot&N!7xR=r)ZIocTy)YzPq4l;9d?IwGRAR!JEhkfpOCT zx&gL%{mvA4haqcK16Pf;BWou}qhdPzN?Br`z;Dk(%1MB01m*VQ2uZ3lV)X8mIlM)X z9y|20#K^CckkFjHT#%I49n8V))KI}QQPlV%Z!#bsZ=Xlum@#5g=zqHCGY_F&#N`C_cZ5-g4IW%md9FKMfF+xZ|P_F%bV&i@ty3`|DaN z_;ZK)*RSqhz2WO?(-P823zEI{bI}p@$8|+08thognXAQ~tEhpRTkf}ExXI7r zd%!}WEX*ksh(;a-pMsb5hR%?ngk}(wYV_}jZC?>gLI0@XR`G+QpadDhAUp)ZD3J+s z%rcvF-5x2#GV?&6R$My5aPf3WJv-z^f317Ga2v6m^ZCuFJzOJrFd)-7!ny;gPjYljY0Qt zo45p~Tmja?v-u?}{Tlv=IMe{PD>^b1#47-6q!2m+W(`yh9{VJSn#4VF%F$P;>#dL^ z3iIrw<^W${O5R&s)`o*G-|-^nhM}3MfK|cX(YV292L=EE!7$+5AYLX(xew?y zD-O;;YZf~coHQVXesJYa;oJAD5$Em)k20>?<_f@mxvXq zM=@R0C<Kk{h>1O8U6kwTKAFb{jEvw~mF04~hoLc>&xF}jlu&YbV5zt0iYZyb_hp6?) zquw#!Ui09&mea5?vMK+9IfG;F#U2kU>6vdw8EOVTsi8T zn%kO8>K>l&n4{z|7+VzU@_{oE)W?iy_?KX6769TTFEfoFQAY_prdHF#iIW1TFyRGk zLsW3^Ybj(Tr!45u>f2skcNt z7;1f|CUx*V*i6JQL|q{)@ILAoPZucww4(MN5ED>BYi*+g?E~LmwV#96#+B4TZ}2d= z1$<;n7gf*=%f>~yTD9vzMaEcgb18k+wj)ZpI4VUJ;;IEnzIY4(&Xq3$F6!!7O%D#y zGkwS}txW-}HPv+_$p8W{zGztt{?SE9K(7jb&-R!fw6>^bf!0M{ROLLVX6w`34wRPAIpySi+k zH^gn~Gz>iRTmi?uxkS#TLr7@~{0|RaYSlG7#11lOL1{?s_tzQyz%!w1AL02OxPSM( z--EaNdp7pZ;O%~X<%hdf90S_V?l`hFJy?3XD;Qpu`-*DcL$_g*enT1(AX%VpB!yKz z1@RZ5PM{Ef5)P^rI0mq_Mx{kptTYA>g1{_!v35ckE={(!W+pAW`aHC$XWG`DKNwzH zptLMsw8loVD$ban_?GPMdgcbi<-OUF!bi;+#x!Iczvh5!LYu)(7^~$c`NE@|0{m9_ zI%#p0syCRS2!dTQ%y~DfzG0Y?b~zj@bzJ>DGnjs>h#g8w`Uv42C8zPHxVknz&FrZ4+2q!(i8o|*|IknA z1TiiRfn|s>%d9!W1Chz7ml!~2_v41TA=|4=h*qR zoq0eY3Fm=I2xt!E`k?L*EQ?BX@D)$2Bp!x`pxzLtR1#y^T9S+ES@yxqFYPy=5<$sZ zUZa$ilVotRlyt6a^S-6~zJ!yQTA5(~1%a zSt_}x#!_xT0oG>Mt!+U9qAA=Z3A@OMN#BRk&`M0^9;g7|hS}=jbhkwz$DUU~&UI-6 z(bLr~JF?4Q$@BZyA<}QVwPJJM{_;1!4mg^q-Q>Eq@4TDN^-)LZ^OEj2=DupbquUXE zz%IGeZoFO#pJ19cc0%ijRqu9+1tSDlLWjJgX+crS6{|(0P41l=MN^Uhlk<|%%$C|H zkD!P?tUMh2)l!bBRA2yOiEymysewS4jwMB!)dnbrA>CSyDJmquKw3ii$%9mUzxqrn ziV04U@Mz~)F+^k$_(Z%>xv%#Ht$_H*oS&N<9*xXR2MI~N21Bz};BfW|FljFnEG)QH zgG^iKwT|Ic3JY;A^P(xF6$TW%|O7W4^^e zjm$2KSfhyX_Z57>G5n*neBH+%zUBSf8H&wOZn__m^Z)eKeM`599 z%woUfX>C3IL&Aw-wm$$#mN>%5XlE(!U6X9ut;ss#SqetpmwB|a@w^^EdyR4JU=hiA zB)+y~2_NbhO!P?@7{s;J(+kESYe!JS>Zy~L+tRvvMC~k8hXc8!iptx}f|5Pj?Z8xA zT!eNmXgdVM(Ne{FOHm->v~P*MItfe=dvu5eXhz*Gk_5%8a)-Pibt(_=Lnvy6AkOlp z2;@QvYztbVpGD=N{b(yV>J$;aQ98%E|MIbzm!nOkRBr6ZqN3>mEwQv0$lb)`7BFSV zDwjG7yoTo_klN*}o#{Yqyjb5=)zUlH((pw+&Q(m?B7^kS(MCPWl1GJ=ZNE}+SmD#3 zC(c>>i9Az}FjqsA32JIWPMDcs=)eaAHt|T%c@!5htqaxLpc{BCyj~M3OS{`;%ci!M z?znH6b1UB>+I^~@5Hm5G>U!aD!7X%5lP{eqJ2-mgNwm&Rat)FW|{hu#8`bhQuZw-ja;=nQ?~ol;wPTEmsX%S z>VTp;@vS(4hDbrp^yEFJhr*DlbHj{>I^EH(w51(8Us;;9NT_%tts`0(Uew+!ke}K^ zesKvk_dOsX4pY}kXB`|vp1H{ub3p~mGGaxmiB&tR2@&obVmbk7)!XeTOs~DuOUD~7 za6%bHPi9AgT($K-%?o*-9Y1GEkeigsd0hyt)RI$OtIsm%+EA>Eo~Wt5q`I*ROB4-@Wes^tqod`PXmb{`r0W`fc3*WjNnIHgS;J z`RBEVQoA~qvM({Oqi-saQsUZu_Za&U)>dEg=W^=SS}l1g52;?~bu=OAu*!H%=t}rN zTbr$E2QJW`=gMl&VGCr`pG$`~H*`wg?~yvCy?O{dn`teWmckQMV8WQedzyBI0&q~O13+0UaO@zJQBqOUi(2Ym<0rVQC9Kjtuk`I`nC34espv%}As^&dS;ar9CrfpqQ6{ zAR{df+Uh<5#+(cUL&Y_sdTm=o!)Kvg;EB+vd%igg>O|VE0JV133^j8O67Xg%;Op28 zCK<5~4%ghoo7%DKb=F1eYj0)fn?i+3P|)12Z(`I=NZO=~j?x|kBMcD~D6*yKG}&^U zUPGgS6X#$Sq7u_SytA*EfYyQ z;PBkqF`qGF6OP<423qsz{6!sV#m=r{IRpQX7=<(`L})9Px%E>U6d4PAN?K5dxN3@( zvg}%G`JDdAR6cYIm{N{M5l65i(!znO<%z05A`(1gC;}a38`Az#_xS9$1^`7}Z8##* zYLsaqZ{xHZbTlXO2T|b#`&t}dY8^r{13f`Hh_Lt>EvS1IJTizJt}6MalPAk-3z$P% zj@Rw(%)(qH<$S|Zmm21Wea$y*r&Z5JxGzD&!+B^ZP0~R*iJZQuk>usSp4pQ;l|-vL zk~9_<#=yboCBpBuqcGb(Q5$FTP_uxn@D-892VfDM7LZ|X2PyED!HrbIr9xKy=ET*Okl^WP`Bt21BtL&ZzZUDooGWXGvB@H zSefguQ+Zk``E{5949M84#q)OOsL7(Ui(YL$Z8ufVZx8eof!Uz{)C$ws_%-#;H?jyQ zWL)QF^tpC{^N;xUTvIv-z+ z?~IRn)0mHdT_2uX>2#>pFI|7e7~hc(BsgMK_ikszkpIZljxxiG?MdpOIxDb_8Z0{S znu(a&vnaI%)XIn|w>L?o&364Adf);4TdNeWnp_|jK${1+B_1aS@*AbhCpY=f;I-cR z)J9P5LwFXmC4k2mXpsRoA!nIX3pdHPXT(#TFsM4(I_Lv%c4zI8hS1odWI zdfP5M6T0}Bj>?>LTH1_9LB4GQ@Cz`dW19gh(sVqGib2aG>4OfEseM6OK}S_89rN)H z3!_~7qTZvHqwlOdlIWbYTX+yMoAKaGi9`$P4NsXx?GAJx8Gj|Sla8w)#KQ^ziG-Ot zvpT#Wf(_apznNobka*|26k?q_A#sFMuC}Rd^{^e1#k5+60HW}Y{PulIbzr+X$VtcP zF0q$I3Sw70`%xFiuRBOco&(<4>Q!LKftS2H$^lXYzas&BW=}h}26G6zya%Q>K?z(6 zsw_av&M=l^4%1=Msq-n!8B=k@wxEwXPV086 zBi?0PH4Fz*0Y(~a1jC^!X8L_}dQBVbrn#N8sgLL!omQR5Aj-)%ZSq)16V02tIeUqG zhW*ex`uVH-{sOj~>Pv`*z%NifsGl3BjFpba-ly@^+%&ng2+ag7WrFP#A;8wPdX%NG z4B$Ln8zUG`($W-2i?=*Y1+9IUq}n_Yjrsa^WB^RgGlS8HQ5aQQthe?DNZ^f=;16`z zS7!uy6t&f-YEOg}tUxk3Ur3CnYBG!WOoz>w+W$qlqWkwsWq~rSX?YLM)t)+`piYhJ zNFy`OxJfXb;ll_}x#Q~Konz=a;h2Vu42F?Bg$Rpy-D(Zq^KBdd z7W7}rK%0_3dFfCh5QID~p4im4_=`p}LRC{DBTbY9h6IG9_nHTyAKg^#F!d4OnF8(B^qkFz9H%X=j4g z&$JoMYl9TJX6S!+$#A+-0BJPMhIF>}BuH$fl_aUsq&n4Tz=}a;#6le^t*z@nsF37b zcsebOsbNv(89HAD_$O_e(FsmIX8I3|x;Ch0!lu5Xp%AssiPBonEkpsX4sU9KSz8i< zPQP7hP1vEcNL|fFp(s>Kb3P^T~by{G;fO9Ms1Lh*LCOsk63hkl?*(dTG1{|+{S=$ zbaq;ZJ>Mzu!Sw(;SXNycG+5I>(10003bX+uL$ zNkc;*aB^>EX>4Tx04R~2kiSa9P!z_0sZzy%i{elnGPo98%;ZuPf}jv%1*=nbb_$Vd!Bbf(Fo!n~-!+7~<1DmScRx1l&^+ zN)uxBrkbg^5tVXsIS}a!BB)z) zs@7-(?~kxLfc0lsx^Bo?{Qb6u8K<84=NrEO(6CThZ7MXM00009a7bBm000ie000ie z0hKEb8vpga`w3L&8)56dJ()M_L_8Memlkni)yIj8DWcTaa!PY=^=&iNzh z>6t!NUElZle1Du%r!oZ9RGYkM>Jq4?08vc=qM8CkH3f)j3J}#4ARXRbSC>EmQm@Se z0POvix)J~~s!&$he$&HW95U6#P=M6%F!T6}?y|ZV%EeT-Q}7ESA|l1d?=>K=X8-_? z9Z&ng?xC}qJmg*lNC!0s#{u9gx268%cbg4f`T+o+{k@8AyMJ#1`QMlY0QlbXyWXTD zz5pg#ShQ9tNc*=-z#@t9uc!Uwp(c-bhInzE%3?a9WuKnXHF@lXTT5Wfr}>i4LQL-b^NwxqaVx3Xmv9 zU=iUn_5Nmd{EySL8$NQu%YTOd58EF~`N6qcnoaFK3!u5VzFv&8+T2f6kQyEOz=Z(z z{>i?D_2RyAv(|e3^gn!f-j7%P{Ml`9R$YRh>}T`r2%mfdvX46>co9p zn?Aw6dE>UZ@BHw-r7ymk`lByn;mcT<`eVm<K$(cf#?yDdBlETr{ULy{ zlpic(c6YgiT?0t{!R9Z<_@^!e<_ztjc59%vZsP-bUy+JHG5u#BziXVzg}X{=KQ{&< zBI}#Osjtm=)8DgvDj%;-yIG*k)7-g36JL7&Zx(kCeKh@NSAQIbetzZ0Q^yjg;FrMh zJ#&_)Kij6i=l_~`yi7#nf3iinm~hbaVsnYcSG}d)5HFvygqB<*Ms>ROz4-uu2U36V zRII)Fl-aZ|{V_|04_~{bSWbVgPn^a6-!)gcn6SNwKkFMW0juiD{k8NkO7!FO=Xn6Q z^xA8OfSsw$d=9XnMD&fcALPS-&RFV`J%puO_KoehxqCnX61I;c7`TS^jn#`H$8a^3 z=V9oSMX9^DSF(|O-394StyF5}3mw8`g|V@HTTW@>h<7oz&Mp1k15&;&X+(!}={tCp zs2(8YMc7O~1y23xn+iyC?TJ4Ae=`?#yy)EZz!{I_W^^4=@jCX3m%HF=Mv|6?oB zo@+l{H|QS%N<#p8o2sIWjn((*!|P4cghoWPVeZzE;@GugL_~Oa-^j?HoJmAvK{rk7 z>SM{=>jRepJs;lJM9>3Gqg~iFEm>uWcRI4U9b%Blzv7PjDzE2QsquH)yoJV5YT<=D zcC~GqW@ea(23C8fw}+T^}b(C z?dXp^`m+~s7=ABM{HKqu!{Erj1AuvJe^`r>waE zfHu2MZ$HKu(c|#8G;^NoEYmcwkcg;fzHJv=rVNr`nE6mes}v;9{=z0Af=@&RlZeQ& ziHNlOT-&}3L_~K(H_hz&sR@gZv%dMIMYCxulK#Ex=$f5OMZSpVg&>#P)5W+ZET72H zf>?Pa`6-vqVIuLqq|BO7jO1 zAiF{y?C387nJM-WkBD5>_4%%2+w*NAqD*G)-1F8pT|i1}fg8$1e!XLUz|NWmbRwdwyRN$Gs)v~s^#T!jph_NG zB64*iqHOdA(}&@a3P~{~(a91K8BwQpWv3n<{@_(tEzpUGZh~f-_WENrxaoIONKPz+Asc7o_cimu`riQ&lM7Yeh-E9ae9f-sOd)p!+ z(xo@-ikP$>AUWxeH6o&%C1Ds4kz)`MSr!pd)^Z&?m&p?mb-^^v^&e>6MYhZ^0M)fk zomEM#1SE5TH27l@vZV_+^(x?7DH9NFF%i-F1-4yq-UVDBJw3SV&;j+ zmmsJI2>YE;5su_5y-h)nh%p=@BCS9~K71nbFzVX&KsSq6Ow-J5+&0CC#f^Tr8%a7V zk2P7PZS{2jao}I$17R*)>-YG+TW(pp)I1dcir;x--MTOT zx0faW-1^F2-?P4dcoYEEeGLFsZU+G4Zvk9-q6A>@X8^EdKY(6531EZIYq&r!4u(fC z002iS54|O)_PYeKXiWS?Mt?;Ti5&GX93_{y-Sx4-g4u!sW0*dQ%b&mrhl-ZQNFxv)_Lb;-u~s| zGhHYf=P9l9R-nmiU@8)s$=cnvZJIiKB07e%ZQCxeUbJX%%0pE4E0$Feez3ObZQIIRPee2irfJzX97`=A z@#|Z=trW&yIpZ#-{O~{h)4lOr%GTwYjW%gawad0G(}Yh%1S4nX-Lskh$Pp1)S?OO( zBEhMMGn`6;G4+@H11CoE9r-$d_;GJjh`f}{Ulov6ENqjxGWsDzJaq`+9^-ER(2+HasZ>k!2&I!nA7v!U`U>S<$KzAul{5DT8AA#!fev zl>^x5UzvQ?fr}k^J9jRFW#!p9+s=>5u()Xj9BBGo@ zAp$-_U2}*iVA`x#`WQAa+0~b`7R?RcX2X~n&kPG8%m+wR)CR<~!&o+JN1$0@msP%t zF(A1S5)wAL7(dJgSxc&6d9{*TUrILgLM;?>Q3Wg;y{rVpt@)C%lFQYqy0UzU zX+bvfGh9sAFC_((U%OR#Ky zRtQf#U&Xf}MOcO;9oA%nMhJ*C`K29zSqqWUJCFe~ct@!X010eOFVqXPb*rl4Bd&%Q z{jr{pE+2bs#o4!_vScj1+&3~ZR&K_gEeB*}#);SZsyL5*LwShE&NnX! za9(aB| zF~`XqiETt*KcRqFMwK?Z3%lF9lFGkS9SJcflMuIhAZbo0Exvq>C0Ha(q&Etck!aSQ zR2w8C%YZ~#t*kRaye}&k#vQqAMPW576X9 zNFeEs7Is(_&q(hY`3hB&!qsXqVIivguW3ypAfuBC2*1RE#&u*?B-#h?{(a*_Fk~rItwZ{~T?T7XIaJ zE5siy`kyldNMLKGOXI8{!;S6BHzEh(Yx)*+r-n|-v6-kAL=j!itf)9~Wzi)Rg77co zK++Y7MG*OkLL@P^9aoGhKyo#J@hcTYFNA(ZuMjnMqD(K0$ioyQ%;j2YR+>d%L2E?> za=;1^sTJmh|JmeQFj-|iKaVe{81H^~h5%XF>{-lbAZB!#E~#11PUjI{_Dts()kvmp-*PR)&EBwqow9Fy?U zt1E@$RiY|IAihAPmVo5Mr4NY6Kc89mRbc2#BO{+5igsUnvjO4L1LeM5k{=9eB|5h*0U@_LT__NRQ~#?#W@pV+DxgeT;?`pVL`sw(s8 z&g6+qz$ad$fBB&DE5umxG5JV5B#&RHh$I6kcQHcSTA{7|NKs@!yjm1h%8nf>l;%dM zZbcBwX^z4ZHUik!G3<(bx4wXc5nruhbv%QN0>ARuH}AS@M^lxuDFWi2!%QvGlvP`$ zTs$rznJ%YpwkAu6Ezi{Eq;O8EcI3k`Xj$@xLRm&xI}dBde^qE`ag+i z6t-PpH)I--VptVC zt{ps1-7+MfY$^${q`JCkNmDU?Je#R1QA)GWqb>dFjw(uwsT?E54H|`~( zV^?QQ6B!~R^x1a4FCRjshcT@d#xaGcTx;dx)j0`T$;0q36y;&8HX?gex$d4+Kni?N za`!IAEz=PrI|DIDPM5WV$EoGMqV#4H65>irYgmcH%vEGFl8?#e!k4-eAH&QXmK~)Z zuM3MBkS&$X6ADNyGvEP-T~?L$!G=sZpxVW}?r3e8A}8C@t}nhG_dRDg?z z6Ca~I2#I3LZ1^)=BD!p)Wt!a!i0Ht4GiTfBZgoHKUu-+O&?2I3FwN|Ggwb#|EPw=( zh-u+@@zghx5j`IURaRE2qj^&OIEc?rBoGij{J4h>?qjw!1+W( zfNq*y4+c?sep))$Oa!@(aee9kq0-E zujMJQHN%}wK)UC<%$;~Lnq1JhybW)byr3<6zhn|3UmxAByvBu!0M#J!cEBT|u6Y1( zJ`o-JK;CtIdQ+S07H-%@M7sb$het#`8(k4#NP(*6gkgtahrY$uE8J_tg_^M+Y6hzL zSc1vRB*A4kJdJ=9_`z8AR1u)^|M?_A3tvV7S2Wt5UmZ)SYF;p*V2p@c{-B_9=M@#Xk?{t7}OPz>YGJk0wUy^`x#R%ta20ac!aEU2~A@_#)*ic zX&wP!7@#sxxbI{Cjk8pjpRS%vLTuR|M=4;=^j+7<+)hLr0YIO9jEO~CV^P}&?Ij{w zc{%_rBBCI3z3X~TrL$p!q+WDiEg-_r^w&(Pov~4$EFFOtLL0v*O$q`^J+A^;&JNm7Re39C1lcsO|{ysp@1-E_;0u> z^YJP|L?f1iTJT#1$QV`uz~`Ahoo2?u5PmK(@4{UqPj%U;$G+j@B_Gvlx5fhEM@Ymg zA@L;B=Q`pb`DJeeND*7dsr=FIPZJSg2R{O@lZgW|Md32WzeZj2Gp71$*f>2dAg zVTdaVWQE8Na)B%Mm5InlAF>q;C<$qWfDn?Viu+#^(6gY$Sq#r*#EJq@AoHbY#O8T;E{s!c^pld1H$yoGEz0yFP`tEhrux1cRHhp-WkIs`lm@rjC>oDA{2Z#ab_g~s_3_0!RD2> z;AZ5kyQ>oxl;ue|PUp+6(_D)vmlJ&q{igmiem{Fid;(2oLIj=oxvFu6jlC!}3!1(mShWDlT1!+WNCBg_B5nXRro)T_U za~b8xz5MdFNIB%ysG3Tb_QKAFf%=m zRZupin*R!@recXZ|A`f=YJmU z7(p!Q(XMy8+$}(9#SYTR_&vyI)x!h*;ShPSn(xK?0MgYE^}I3lx%|nlh#R6+=jqF0 zQGPjzqlgYFR0QjhZ07Bar(&4QaH%2X3-h`rTvnIHci3fMoSkbnq;-g>3|)`Pji~{cOxCnoifN;HCBIg`gpo8mfatn&0#+ z>m8A;KjPf0Zl7)!9pU0C^RA_MFC$UGSWz==1ARoH35`)Q$Ql@2Rz<31k%TQ)l0x5O znxuQf9kQ1`NZ&r^baafzH?GbangH*-p&b>cq4(hzut2+ClT_71p_6`10gAT z7r>^{%0ZqjZAvqeq1=7g@5(zdiI3oWwUf(=r{5)`B(MEf0SiSMQv%A&*dlzFHS0)m zIMhDzD!H=DuETt(UNs@MGx^Zv_efjK*nx=_(L zB#W^zPhqpuI99=$8YD`?1I`U$Y)Pi%&9+hZXRX1W(IrQ6#1Xi-rx2s-3!z7nPov;g(CO zu}`Nf-6kbZIIwB^uWD2r`Bi}M;>(KN4LnZLx{^%&@=p`@&V>G|-%2P?^s7<~oAYBZJFk@I1e3*0w(&exZ?xA>6O zAHbkYS?lHElb>F;97saF1=4#Y-DT|Q8BU#fdzE$&PicZA!$M{@u-umDHu6 zHggr8AR~XgXk55UyX)#tPn}NR)HF2VEUV+3u4|~AAbe>q6o8wfNK2EK(~f`D{)Hh= z6tJI01EQw(98A#oxcydgm#e`Nl2)-dUoLh*P%C+E>T}$sx2jk79VZF+bx8XPa^6Pj z?j$K$WPy*H<)^Vaqt5r&+Gf$KF3t$T#8#zsQGG{(%l;|c>hruPX^*xw3rBw#q2p`> zZufrKlWTbV*l^4YapBwz_jymZHX#+3J%|PZZ4bsJeYeEp)73L;V1=5pBNiqS$q3kp zFnKcsEQmNxNdPi3GtQ7>%6?x>Wu-{e9eg`tWH`(?+4uyH4eY%1_x_B`RZYTq0C0R8 zOUVRoxRN6e11R6ty4)65(zi7X=;&r=eFF?bLU;HoU!${qOHg>C6-&Q&P^?%9F>w}B z@slsp<*_drs2_Hr*sEav(uo@wN>2sM;FC&o=q#U-B^{me9Jr5M4*3S1b=jiASaK! znmbMeC@!3nLbh4^v3?l#lddE_XpV6tz^UpY?{gZTN`&J`jGlVlh(7d$3`e}5jd^)8 z^I=1FBHKGi?dz$+&pfGzMQQDXu4to7WL`y^VoQ*RNZ9wdgNSLVtZD&Q!n!Tu& zZ;d~{M5$kqq?4A#0g=Na8)~)AGTL6f;!3f@;I!??M~x}!c?zxB;^oJ-e%O#&no+Vj z(2t_6Z}{V3(uaCMwu*{j-fL}Vm5d#!i-yvaH=y5$3g#Y)Cjh-i9W?X#Q1!bH5?7QK z;4>K<%p`7s6Ne@$JO<6EDuBc}kkp|Lt>gl%mBqF7Hx2@^{nRQ$G{w@h>cm&@4?&#x zCPV}vJ2WWkfi%<29ItR~%xXUV8a|6Y2`$)#5OjhrOHXB-E$?>(SR^rTQes2l$XocT zrinO+0cS!aDVjNa^ZV7hRu37viY&_fLxzv~i^R7UIFm4+bDmEmMP9l&Yahj(>j7Ur zCV+NC5oKH8651qc;RGvDwsB-?@lIAVCw&Sja{q;a5!R03vAcELnd=4{7iCpRY!tA4aQR;|W z&o_2fD8iz&hTyJ=#athFMCC=BNUoxu4wg72S&>?N)f;ep&yRx^SC0S=CNst&RqEME z6v^g&U~s1iLuIXl`^1XRB)&u#hbSV->5stOg#K$OL^tZr6Wdkw(v8xKsi~%V4 zBwU&WKG4cV%=&P6Wjfk9A+6Z-h=A zrK>`q5GR^IGP6%u_((L}bq4+!aQSvX!K#FEhMAt0$A@OhiOH2mn@?o$&cwJtQ(@&H zbb)OdR<&|wf8cB(F%I|d9v)eVM&kFfe{$b;AjjS1V1yriC%)N^?~OrtbE||PJ51Te z{t*=R!C*QeLh*h_%Bc_I1?R65gJV0mg-z{n`Kv(O*&D9sbBy?fok9T0*uV#0>>Qdr z3K0pEP;CuOC&ntcd;=hA>5=jMX0UlpX|zSNKlwcl?i3|ki(1ZmC2*K!WVh{(MHH8} zGpv^w(BBndn_-TeUC-}9&jJ6g+)bbQcpvj%2_rsCsfhg6|dx!%+Q zYzBY2eGnCe358wX3x_+wYz+g&yGotJ4_wRTUc<=Cm~$%716K};on0nVUxH00Iy5V( zCpOb#lT0_4aCHESKKmb8b6V%5FiR?0oI6r)R5!MmE9XP+OcS%aVC#U8vvfSW;p^yF z5I*2q3u(>$&A#riHfvduT;FG>(+l9SQ}$4K2jAJ-m-8}8En;b={) zETW0~5YX%?uv1M~1d0Qv=R#^cZt)75B(R!XPBZ~qfq}M6G!Io@GninuI?4rdx=SEV zLuzV1O_(JWciqzm^J#FA5RSnH6H|8I5Kc{-ZIGJyoX%r-&qX0riixJl>ZXPeW-=6U zl7BRHM$4OsKwa z|C${gch*fAIK2mHv>@S<3lbWnmldB$;~We{N9o>1Akx%Di@QZa*ktLH6(v{v zt~cX*{H58^Y$_KmZ5HM;kb3dAKPF(W|2@`pQwIBe-!HX=x|zpAn$2_6NJIOtgtb~l2wl7%oi&Q)7vsJ1Z)-a_oBrKraj7^2dPHwFKxit4!J;8HYao z(qCcP=aZp`U4xJ8x=wjZu5c!Ji^i#k8B-K)6}a!*zwJd<{p`g02M|#kSx)}%b|<&_ zI89RNPdx93Tooj*5bF!Wc9U!uoD7eaU_vXA1Fm!f-ZW<&>H+r$l!n{S9gQlrPCn>P#A07oF(5t1_$OWA4%2Zit@fLFN$wJ`rPk;v<)M#oiA1FNO(Syu^<&eH zXG~}9pfh+**EYs6B%VU@=~UIMzUzdQ<{|>Ke!^bFbU+x^V~cC>P*qdj& zlJ$FXVrYN!+rh3m)(#nn_nbBuY<<2cA?hn_CwRyDpUHX9>thi!Em$d*KSkFXgUJzM zDt3K_qM5}%0^%~Z@ad-|spq?oJ=KmxEuRG00|S9fV0wuH10c^8#I`jz8U1JHRJ>c! zqrUB}t%DktoPiq7;(Z}9%k`{dKSBWf6qm`ndn>AVF0ZdO ztp8T9zdrf!%}g<$Y;5EapJMV~7oQZ(h=_SZ)v;e4Kp}@O#OIxPL7DJY1bDQ|{ZbHo#k~9o zQ_2Dd-#L4>eWiC|uWRAFbrS!wbygOn0Yy#XXxn5F{|F!FA~4Gj!u4!YJ5=iLWi8fv zPI&Q0@%Qd2@PGISaKUso2#SS@?fWt@Z8TREmgrjkxod+1q&E5=O}An}%soywRfxVT9Hu%?K-#v==+4A2Sx z>(BnN2eo`&5UE1HLLO*R5Of*F`VRH@>3@B#267UC_NzY@#Z$)NT7mm2%wZ|2Da~i?M&^ z&+c?r3it|z_VeFmeG{2zspB=H=+KcS0G$A3&9f!ct6Wo~M^nqZ1&VsAL`nwZMGFB3 zIN}k6NoZ)9Y=6q||BU+>u0gUR=Qp@Y00$W2dzEZ|>vnh8rG}22@Qpg&-j%If8yh?e zGY*B#kW18EvrpX^G@oWWij}lbWpVNQfA#D>C1ca2e8^K*pBE6h>F?<;cS*K4b`UKt zn_(^w!#;RIZmIA&WqoCB81W%+u=1O#nL-rNf_k$|@c;a`671qO-1jFavYMSn%z=gy ziW6^>F?r}VB`&eIzU{x;w33N9FNW9F@SLsn{Pxtu+Jf{wvozGA=ueJ8$JeRV(l&v- z@Q)iC$&v51PWAt_2Lz3=LPrAA%aCSb2v-6FlhTR^@}&rN_|3K-%5o;YaXH)f=z0g? zFm6X=jbp9VUUAi&DU+}K2GwN+{?%p`xtxq;h^iy2z+IG{&whm+6Bnz=X&T;68{7<9 zcYoH%4b+FrROHm|Yx?y0@8;eFVzV*xjT!Zym4E0oU6zSGOfl+c*J73(U>>A}{rv{7 zQJ?YQEH=xcWnR|bCP^>t{!vOSeUh_-{s$AH>=V4|O8Zq+ea&!kfsA`B<(SXbcwq}C zVM8osNRxe4VCXb0_K9Hi5h1`-{KmbWs~@L&mRbvuLdwq8o5_(d+BK-I`$dT0yDrw7YX4{c@_4 zO>^^C%)m&z&blHH| z`t=S!EVrZ1D26F<&?95NfL=I*SaI#LW6X;>aY{mT9e>T`O?)sKIhr2Al z|F7Zmp#SU^elWraHuAP#?fg&3iv-1QZ;vA9%C%M0*yQ@K-(G&g<(mSAR&M|C*--UO zpKg_gdB^b0i#+lEp&#K`aooF1|8EZ71B!L8xG#40M}%Hb_ao=n%kVYb=TGXWj(|V1 z$waEIO7Xe&lo=RH>U8kw(pFBCW^nIg;IpW63dh=@u2SVSznZBDtca zDA$U7!a?t9UsF$`a5E$p~`jCkE|r^ByakUQK;P;KD&3B4B%YmeJ+V{o98~dS@~tY^_T9+g&{)yuj?!h zz&|Sw$9qQQY(K0}D&C8+C+|64z|OGE1WSAK)gUT>p$ZFqUQ+cps@srI$-AkMaK>tX zv20(Uj1qur&vX@Y9&X?7bi$z#2#@`JJ7eT+M{7yLezg2+48V zw6gnM0h;PEtt=mBo10Ko;yV?+KyzY~J~ZA@*_rgpYx3JOnF|eaL5VLAR~(T4c`G;7 z5d`yt%LA|LTOqNtx=rj+X)$Y=Zkr~j?8{$=mTE`#IHg4Oqo4d2bdZ;)fVUTAkpsk% zqb)7Ky|BR)F;Lr`8q#G5_%`J{(3Bd~fmB5SaED{lMjZJvb#=Y}_3^ZTF9g{i^Xs+w zngABO_T6u|{6xUwGN<&zp&|G1uY-BSx5=EfzK!YgS!d{J@8!RO!Wu=HI>g^H)6XX_ z#X)~*{$9?k|Eedyq2yhdQ6N$i=<&1*YTl!m%PzfYd9|Fe=vBceyaxYi;42Y z$m)GcfTyL{_oI{mt=0FP^0lpmM$v|mLd-uR4+w~B50iAJuuJKW%C&)=ja7bk|K5(; zlkU5Xd>>r~l>JRxy>FCn^#jN{nm#HK@`!lI%mcs%WQ`RT$gE5DOV_Tg3SI2q253jkS zIbYAn&XCG<-hz?psy;o<(w|jnRyu3w&I96_<~PoWUXQZga66=kA(xSzh&R|pfP*sr z0IyQ7Y^&5ha#D|r=E`i2w-RFH(iUL^fEWVTUBhAecXe;_b+{^LQHaa8zY|)pAmaMk(jHc6_k8^iQtKBYir(2h0!WPnvSkWItJHs+$>>x6 z7&xB|bi57&U>(EzUEV&fS^~nMAblN7SyOkz3)Amj;7aO7ZZLtKuN%<=N>6Uq z)P7Ac0OwvxkV%{Xqli+| zAFUa?SsKUyYku0^!|;|*+N+UWYr$mFvuA!=pMSV-FA^`bVPELo;hp{}1z6*YC;O$H zct%d8sQ3_u0XxCUVnh|6vQ|$H-QE_wfp(}~kJToh+^Epv#^LfGFP1+2aQ}6U@QnI% z-r);!@vKtDOUuU&KKbDfS$~z(+h(xK{&70^IM>9^8gN~oxzQwSIkcB@c*)fHb1J>I zRI^S62kPs-S0~KaxhYefZ%tfky_;K{xDG+j0D@(zJ4mB+Gj@vSUQhU{a}Kl^7x;YB})FvO(eO?Jf&gX8kQ($JN-R*{WA~novJ}E$|r%H zyWr_cOi;c|l7l8*zxC~)I$t!*Gl_phj??nzX<}#0&V1%5Dny77!9h55`p?l4iqWKs zyactq%uI_AN54ER(uQc>**5|r|L2CM-TYs6USEWagwTAa4kJlL-_e=hZK?$)Uss|~ zRb*Zyv%;Fjxv*N<4=^L<_XFu{pB@R%eG&Ovl?W*IXmszEA>~I?)oN4u_c^raO!dDl zDlI)D4pmU+<=!l(wB>wzpDfV>_cqnN&bBG>gRb7i2X{c{8^v+j{Ks6=a6 zS-7d~z7{pL^h`UKQf}_^3Anh?yU0aSPjy@6_hZMc0P~kL@k{oCtPgKew6Q_U>Vu$LhK(TJ~JU8|5R2GnIHd=}`k z{ri%6c1tXSE$l?npYV#QDC(jIoVJIYe{g;~WyF&5w|NWoQsc&K7Tf+FfRRrA`nr*u z^Ln~Y0Lp?JG|i=JYmB%Xl3=M0KLt;r%Z60c%;%xQs%7U5|D^<-gOQ zks+15JM3}Q?oxr7f1K_Lwr;0>am{O(apT9XUcFG9sX<&(KudbB*YG2(Ru@e6^4YA0!D*LCKXTvRNYG4z7yD=9GX~YDo z|F;8z!G>!HCLEoP;c}g^eh5)h@E(xg!GzD>G3&SXI9uZya`?Q|5D0QhqIg!Qg znF(p!WtX3_WxD4_9K^t1;n2?D2nKDlUG@}<^m z;XYa9nrC&+!h%jXXjXxwQkaU}XH01Q;P`whQC&)H4@vcAH1L~$nVOpH&!hH0UY1jmRj z@-N<*J4+S$;z~NCkHL-qpt;hWt#}^>Mk?oyPLOeJiF*kCT3XCMYQMZidMod^_z@q-ACO zKdcA?tWuKVC!8BP!sNgLYfTAvK87eCaYVJI)EGzZ`p@cBKbQS5jnq2U7Jolw8hl1> zO74fpg^@I_NFXAzc_alv>Ko^eQP02B;LJp}T<_~+&M}E$RtxCGOL7-uOjG8X=1V$_ z6_F#XpqHHNPy$ZBgNz#C(Emb2_fi@+X*FQyG5RzS!WLBtL!#i~+K8@waH3tLDF2mn z8-?&AdQv3Af@dWPx+*tC9_^&kG~K(TK~HWFZ2nZ3SW~$u(pP4ASAETuV*+fAN&hn! zgU>L4hQYi!Twk&E$=PYA;tU7(gcU!U7?wb|rMt77PBfLk3EM9LaT^RqCNxL=v|)q; zc;7p)OGA;*Z+WJQ0geo~xb}%SF11|bL*?dkFvkwSA+G9{IMJOnUu4Q`rgge==n~C~ z-3GF32gGlEz{Rz;Kk5A2z$endTnacq5OM-*7P0vL1$eyE!czet+_v z3PQiyX=mdF{b?gtT@9C?HKVULLs4wVp!2uEa^mya%hGZVV_rAA>-*5~{%)aGsfLjK z52zQgRsJcLEfks&qGMI!4bb*xulR*)n|m2|+ooM%_IZ_|U+RDO69|v&&>G13z79()|Mt8^+B7RB`kA14DXOQ=r49rrTifwy7A0OoyXu69MC9{CWYv z+FLxPP2hJ3G}B&zuQxv7S75M=#6%eksuKZmNIoIPa4b%9lX?gCuddUjXqhoPDK2Cv zz_0^&RW1sH+5)hEWG~+ozC!g=NDtlJ$pE>cA#nN?vcRBXh^Ar+z4!PQu^Of)Klt(p z(>mkQFPO;!r?DVkzS?-@BGE+idrl=N-LHrZv|rqKyK-yX1wN^B0_ujoFxqnd!GipU zQyVt?SQn~eZoDgXaYzF|{!J^)&F)Q9e2MLxQ^>wR(vo79U1pUviX}cw-ZU!vKP^D} zfyQsBje^e4nk0|lHMYuwSQrIL8P}tu-JNSz(Aqb}CuBwNi2=|HHJA2+hS^woYA_u^ zCDUwzbri}55B8UaU5b`oR^u+9ff*?BFcKVIatBOZVlxQezWgogAwL^l@6zHwj5`>P ztk8&c!Y=K>%r3%1*iivEeF{0=O?RLnR+m9z=gA>oZ7e*ulEBh}A87s25(ucn#mTg4vAbl*j@S4e;0*< zk!((32EqsG5;P2fA~ab!o{6k{yz-oSjKz^rhKXF<@xgk;3$fJ7KgRsTjB=2$bqOeN^|! z3b-*wVL(_Luv(GfX7lH`mX7oAUgY!&h_Mm9X0(oP1-7DLl$$o2HUXtL9Xir?J%bh>}3>0Sv`23st+4d%Y|~d7Zc++(eNK`(5aB7sNez9 z@HE{RpGBPqohYVGVb;e7QYLF2=#j-uk*3)q1?TjpWWHv<_YUV@pnV!vOpS%d8w#^L z*UDb|Km?;^*+2x^!V{P^k{=~;hcdSIMvkMw3w;7hO4g$D&>`gAPo#;;&i{h`V_T`6 zd5yU)B%x3{yr~bkFU9WA{(wzjrluS=irK@tq6&EIo084{f+`fx?y*4^9$iuWVTqh> zrM&8Pys35_;`}qp1RsLnH@Pjt|6$8J7K1V50Tz!wN1-`eVt6TdaB{^hGE7twn!VlK zZ3wKPFen>iFtWC-F~iBtU}eP4M6`BK^#}C#^FcW{c&2|E-nm>moJF11l`}h+Qw#Ek z8&rYBcxnO1TINMm6$!OE{xJhXwISRrT02d}qr@N6C))`A*#7#@Pe;LRrFyC)psXrL zyf@KHjAl2K0`tabZ12X7>#mnQ2ulf*(v2G0F6_Wa=yy2FbXp2?A@&ShrVo82MEJN< z?Hb~D|3(zkIThk1@9@m(Bw5`-Dt2B#YB4zz@N;}@`JLCR#;b`>na9@GG{hTe!_>OnJ5vM7|+V?_XP~ zAM$>c!={xR^xcMN!lJh%cXF(;xw?T5VtaJUvLgRm$8#b7KefT&w%NUE`pBw+qoI)v z0JkMK^psvWb+!>!3ocDZd{98!0|)DHaBN|b2pHJtjq6O9nlAG{PLxND1d1YHx>(Mg zgT2@mJb?S3$&umEL~5z^hzGa4tNjGQX&r0}mZQ&H4#@kTc*C8_g+*8$!xVncLZL_l z67}Dsg5ilMh0-YhhYknn6?Z14G2vWbtj??w0i7Rhdm_WA%v@%jtCnDWVF%qV3WIKV zY11ij?UBmic1A}6J?mfU~XyEjW-99%_nS?THYf9GYdl_VYU}smKhp!+cJQ9Y=#iIY^P(E4C23)7? z<+$NMUjMpjtziR3jC7r+Xg>?d0%b4C9tM)(#V_*cVY)X4qPOEt=byy%=FoaObl}Tm z=ci8qkHMw~FTi9@^FylpC)njh-R$H4iv_Glr;=k-~>@tad1IEA1#G|urqoNW3KK9Yq4QS7LB|Gz8$q@ z?Nhu)Cruc1xZ&HrcQ%yw^?dYai9(@;%Q9J991bT-QblJsu7S{*kT6L9yKj^rZZZ;_F)>DyrELkQzMpL3Er@>)? zWDs=#1=Cz}D7ikhO_|*Z+A=JK0h9ZLA)L5`>+-FVWSk9EJI(f0zW`|x;;sU6d{UB) zmBsF*cGHPFn{~Qo5tk$E@l=Y{6ZU<432e@G7$Cxrh`^zNPtz)XwMrZYY0mr&hPMHf?wY5 zmt=Un-AP?~s&CC5cC5uZ>~W}0EH*mj@Zgee9qaoq{~3nlNh!kwTX|i^Lzvt1@K9GM za(7A+Zc+8a&mY0i2fPpE2xjiei9VAX8p9DY3#6j;JT$!#mQ7gCL~z{>(=IIcj+2g4 zLmDngghlvqp|cfolEEh^pHl@$h&o)EBmU)NBi5_TFOr37IhWx!ll;-H$TsD z9%~wl#H$wx*hc?#0t6t)ZE&2bvHR>d8p-MEdU$(@S^%0^JQSTgIF9-RCa}^enT!K< z1?j6ckt~<>49t18371W$9@uKO(Rc0f-(nmOhZJX9AYe8WDIm*sVU)5F`go)peCOHY zJJztsY`6G3@`<+r6s2CxHOmFpQUGa$y8CY2MaqX&2FR2MIPaw=DvzM?4)q$s7IX$A$2M#6(z0;uBn^YEtjEMVP z7)~I={rSTi|F$Vr1g2=JXA93RZ^&;OcRvc-&#|^Beqk)V0Apz@+2N1oi1yH{ zNh*B{Ru0Z)FkME(XDpP`gY+$ar(6H{p_GCLulCmgqo83k-K;KNZ61>qrFmLZdaaH5wu`Y_`me}qO**_}1=+yp=NWTulzeyuwh&U( z9;$}T$2w&uN!?+Y9yU6g5PDX7=HbiVebcShfZk{ziSy8egm)YP^+_+XbqJH^rY@%> zJWo`oqaFs-FC4{RkZQEniSUXi=U0DlX0dZxGA|iw3CTOX`!^!!E;qi=Emhis%>{m zKxMbS22X}Ax-H!bo#4RaMj9j4q_Kn#L>B|<=*L#SdD8?}+P9OqcJSHMa;ufwe3yA6 z_aG$S-Q*J*A_p4eyR;Jafq(F|s6Q6jY| zK%kq{`Q0_cFmBPQdineb)%zhiS8#Z441ucowmR6~>kcl$nWW;%WDT|e4=9;>Yw6mD z#XSUw-g(QC5aX**M#M3!L>eQ7%kYdCH=b2$Hzf+w$fBbB3#wGZyKquMPfg#s-cc=n z7~ZhXNb@lQ>G{X~<0|9rf5W$VE87XqUp9v7@MS)4w#+vQ$D*owV9nU#1mpxaERM6z zx6vtGN)TGbkTjINf|7q+ti0znmj^bbn>G|U=wCWyCu3Vz*Y!f5Ziq)tOg~Q#&4%*N zztm+5KUHDSY!NCD1lGKMQ8uqg?uHGcYGK83>CKBO&v8%(U&~*UFFFU`p~3{ z`gDj@Oz_L$2h=ANsWRo_VwBiJWwI_>(-+P1I9Fs9yc_#%fAPJB_=1{8WM0VxZ=}Xx zV_eg{?$+9|SHb*dZX(Yh$wBF_jF25%LoOl4+^!>YVH&1N6I3L9NuL$_wAsL7Yinyy+2n6R{ugs3EHedXaS%m7Q?Idejb+5J}D~(F$0RBUp$|?YJYMQ zEY4ZzX*-^Cog8^#!<4F7G$27C1xL@_K1;%y$wf~v7`116NQ;D!Y|Zk@TVZhL4y6&* z03&B2MM{d&AL^F(DJn$3_s!&1C|vqnk*1^#^9!2zaha^+C&8Qn>SM8(p%(n)5eD{m z4uatiAeI|UF%}|Lo8{SUAphs>LtC*e6%{%^j&Mp$%=neUD zK(9#RGDj=%LZXSeyJSGNJV}IpAR(V7c62%E$0pb-VBgFRyU*J^*3%K=rYGchm=y*%_qZB{^QG12>l@ei?I^tkgORq|5|a8R)&-D%@e0TnXE<&wO5& zuJUYM`qJ}RG<{w;z7>JH2j#3=#=%oUOlZ0e3^xCo*&e2>h>L?4t8i^5)*~#hjp7u} zG`Nxs>vMwNf_t{Sy8di~@}>m1V6#1*2T`CbnZhTJgfIs>j2WW++|?EtmjL<-(N_e6 zy{nGL)%JcAp`m;RNAQ{P=Ts%4Q$NrV-Z|%xM;=BxX*#S!6R_il$`4yGn#s=?Gxmqm zXU*dp3w%7AT$sJFy)Rnb7Q_0B2_fpXFP-Sr)$cFsd~|_Me>#oC@*1JkTM6ccNjQEd zeI9itx)ToRiVc5h=s}XXA4mcghBz3FyEDfFh-Xls<yVCf84SBTT!NbX#$3 zxQL4na^h&ylp&Rwi+n+0n>@u;$?LQ>tqv`w*MNBBHt~D*)9`><@;Kdyz z$O_xTV2eZ0d?D_U~Z*Bt>{_KduXPe*qke%~m1}MLvcyZ=ZWKRQMYSzR*x_$FJ10wE;8_`v3PF$) zpZ*Lrpl{#8lQ%#1*p(m{{J=y>Uf=FP3V4S(li#Wj!3EYb`-U0#?lRd%oS=~7{ea@?_wk{nO?RIdgeKU`HKlJ0cAU$F*)JHRPg!V&N;Uz%Esaaoj|*lPnIR&wI1 zpJj#3-j_jCe#o>rv znlMLkN!ey|wCgi*ak1a+O?TSS4fN35DXuavk` z?+WdfPXiLeA}BnU$8TF@!8t+p>2rZV9myzZJet``n<6fKAz}8M%h7ZIoj%@Hzfy0) zpQwVy%&2_0yk!;LGP@c@H6sOZ7dfoZRP=x!RrP(Uo#ohr5pAB`hxyS(5ls(76XLNj zH6zJ;qgtwGZ95@-jD&6DUjnNT$0V(UX{!AH7H7 zbL;BY8A#)1z>Y^RF?T#!LF48hlW)Ly&L8$+zGeEh%X@+z@leg%w8FN7n3&wHb1xyA zbXcmw*crFWErcjN$u1aHXoiE@ew7uL2b`^L_0=ClqjqX$%YLKo{~m&}3Dp`#IAfFC zW#(XPgQb~MZO$`;XjsV%J_kYJY-{bjUtu-Va?>ns59?hes7SaJDH?F6`lHO3$8E!) zmmhHvb*Z1nbt0i~1S}kZNpg}k&V<1O#WC8lnsHJ=2L_39|3+zx)frvs^mX^}LlPgF zSMwoNu^&kLDzoiya1T6boLy;XXqCa^whdpGJ$^vwZfQqU$eZwh60RWPFcYh#Tj|wYon^Q;^MkD+51(00{;Ryo(j|C!Jl5A zh7vU{!}8*vTmk=ZrKVXSAY!)_asr zsq(ceRSA)LJ@6nbpoIMhCH9K|w)`Z)Gzt_0@rwN!ZE1>32k(x%R)!%Lv}XQe9}9Pp zq3M(&iWIQF^a(uR-e@2B`&|D!G4~kUe|1xQ1CAaQ7B0AAJFd0; z*I7R;NfhYBC5>lC!oZi8&H63ikDEoNVBk+{k{KLjfdal>YpH3+!Y_EKKMJ!QN9n|+ z*m$D7tgBRvBeMPqPkrX$%D4Dos@k2#mF4`8sAcyrpGZoje``Za$Lg|>^+bZn(A{g? z?d|Q!srT8FZ^zl4x5FLAj?~$YcWI&G*G6{e)D)_ii8U8oN+g7#ou#~qNilowDH`U? z2^n6%4e|t;O6HQ@-Ypi5C4MDma)2g;t{ge3Nt^p9G2}J#HXw84;Vx<75$k<$M8djU zktrHCa;mG;N6nwQ;cGn^7%-Me9&f+Y>5QEk+0Nm+NmBPm6vh zs4;e#P0r--{8g}?oS;cYolv&NUr zN+#iMP|CmFSK+Z@JSZ@ZtN`RO6{XETw~;WqOz{PZXK&6$_hoFuLn+h+8An}qPG$&o zLb+@LR_6D{5Ji*)>=rD3_#TAw5^}1pm`#eh*s4q`J-p}3gp!-if%I&6(_i;Bk#4ws z>>oVjKIkd(MQ~ZkK*<@~*4xoW9FGD(v_&7FX{qRWpFApxs>uBPWhcIU2D z8G;TjwK^ZmrQmwp&4;~irOw+$acbL_nC+9lVavvIxc^YdQ!6+sbx;t#F^{^LQx{Et zT36x!Cw5J3$3&MIp+y}aC&7efUXw1ht`DDYiL4`p9!uWbxIW-YS$`Q)gGX)OWD3V! zS@k6U6{-$#y-y(mx$ttgg*E7miPoPUnKaQzF(N(&^Kk>BM*(H;0HZ!iF%;ko1{A=S z0CD^ygAjJmq4x}k{w%Ik45L)QSfWD2xXt9D#fb($YYMp?KZ~J|s<2C=Q(X(`lL+r; z43NgPzsi*<~ z6rz9-W3M6rQIUj7xRR^&rxR8lIvxJD zw}cuA9vBNGhfo_vm;?i?0h5~vK*Z;WcPRyVxk8W*X;K~n&LNZ!28NJzq8`>zNTjbk zcr>jkQX)F2qC_eizcP;i+0};uHu`q|RqX3DUB^lnO^9olqeTegI#wF(2}EXz3@C$JBWyLc|Xb+bb_$85CkO3XM}8PKt%FvPCzE|tWKD+WY{8*tYMN3S|Jl; z+TX~4Ujrb*wpkAzEhr@C<;Mab%@aWSCMtDu*R7TK_pQ=(EFI!{%T-$DK-^zyMIgG{ zv_H`~F|9>)M`~j%L_-@Du(}>pZPnRgI2R&pU5v6VTu1~U!Jz_M5=(=D-VG>9=uv?R zSD?BO1nkn&7$E4sl0rgsdrhj^Gzk-;5cAJX%?>=0B+6bP$>Nq8T2*n!*gTOKlLLuU z=8`&ej}*jT4TpRn@??fOAH|9oE)iddv`F3wi%!8Pk_$vFH}X}{k8`snU*rfJieSc2 zTi#FTNr9@Hr)6qhG+xq4oM3B5A$pEue6}7Am^p)NA=x3ss1;^h1|R|sHz$#lv0hE9B3 zTM%)rjBW>;STvSG3N0x_b4P#g&j%p97t4@2NHz|(J#69}IBsGBQ9(y&voXCjD7FLh zlX=ymjCxg=Fr=TcRM?pmnub1>8`2Sd8by@wE{3#%AWI1)oi6xytie)hN+0WOLnN&! zBxWgyu{^6t7Sq<9KPP~&QK`)6xKi43J|Ww5Xl4ZB$yGPPx8dzTu1aW_EG5IaDntEF zfR%W8;?yzU|PCK-8k9YP=YLmLW(UZ#7!YL>+edK6M)c_zg%JRt1$#}G_|>?l$#UU zLl1RWs1~BeXUwh?ArpOwjAx>;Zxk!>3XxkRdPrCQ?msFX#kWj5ge2&bq zmc$r{OrBO>vQdf_7&~0E000OkNkl%qYYSFv}23d(hVm^%F*F2 z39PgLNF-`eX(3grVXl&4mAI-&e1s^_+jf;o-RFSY4cd&^-zqer7CXUv0fHDP8hN+!{fx7CaQB5>s7qCrX! zOI1wNss*_|Xgc_6`}o)Coyn>&~}0|0s-Sx5jm>+>@tkXzdz zzpS5Anp_3|OP7-5=T@k)2MVE1CD}_Wj#_(@q7cfY`8&xHf|UwBj}*lOi=`syQ6OEl zZ52uG>;Zt~Ig)(sK!+>6LKHHI=gihI-~-pJ_=N$a?p;6t`E9WtvMqrCyJto$2PR2! zWC;N1--5U9u7+a+li7Bnh#B;!Pnww^9z1Ck4Qm5OBX=|*(soGKJdmIr=2DV8x<}1| zsthQkn!{@E!S%xOI>~|EjX%KbMY|T}xa_OG_sa7o^!D}kP@5x1@A-|X>Cd-j=+`d> zfXCk^t7^|p0Km_!O{Ly_#u@{seP%5?bN<0eyld4See*j?BjYAim ze5XE8Jg#r!lWSj9wN+-XwJ`(WswaBBj8|uE{N@}WSo2*EBDL@BX?4*1ehO@Qef7GR zlAU_!MgYJ&WK}(L2mtog&rhXN|1<~yZ}!%J=dlLBcY6Wgn69=SK+Oi=_2bz94#*Q9 z4>k{&?*aS}0M=?e)Bs%a7680=5;#7wVn2Y(uq2gAJzWKWZ~nb1le_}}E}jig$g+LO zrvM!PWai=0;lSoL{NULWCtlip^$izc+3a15^HHif3|8AI5dU^Qc=8vkjE#Nm2uYp+ zz{;*7$t$)h&tH_A^$EjzHKa@(f4)DYU=&$>5G1*+Ck^0?oh14A*x1;-bZF6X_2RtH zT*$^0kXliJHL#!(Wjdi_W2lV+2>`pQle5=btJ}XGC&_jC)*j8(V;z8XO<3&)&fGV1CNb z;fW8O-$sF~pFFd29)J@+=;Z7lKk}VS>=ze7U-Msqiy~Jlj_g=ZvV>mrky=c zOd$h&a8^f-r$qT|oj8dE&&WXNC#Wn*fGC`-Q~_5Y{WTj_N%Ej#OA17_Ob{9VoR| z&x$5d6^Y8`97!&}zgC-rj<3N&jk^XW-jDjC14!-0UH}+=F?rPoJ#V>uVjj^vTIZok zV$ymNA0B<=T)a3ZzI}A0Q77x*2o@cK)O}5~H*wuB1%j$RZ+Py*1snnTFa3J5iaSyO z4%UD<_#yh@7Bi%a5Fj60w!cA=m4W18ZV4ReOqn$*4c0nxOe4b>VWV&K>BLO%;*NW3 zWPL86e1A`aapal5 z1^PeIKL?$dnYj9C;&&dxd0)@W+DTJ9B>?in5Af2Q{ay!n=O0)Putp-utOk!m4-OsbAcB;j^pfq8|@qb!K+Yc!~f7-@fTB z0Kl$05_8&#_a8##tpQ;Dg-<4H`zsd!xMSr+MspY)ko5>pU#XFW>^=~hrp1E$UgI+k?37KzR`z^B) zW#ajz@W0dSKI;Rxj05N!`EcL(Axg&W1w7^Pgk+-j1*|)`?!%4~_sYVZgho1V{n#B$f>-5D3 zes7>cl8yb#oTOEIwgWivnH8%SeJ7pH43e5OPd)tk)6XTW`jE5qs>V||w(|EM?lQ>Y zZTmi>VaDD`T6OzvQ+uDzOsvF1V_gPWwB@!3Fns08*S`0o)b}q>TzTpU&O0q=_A~~_ ziNDY@XT5*372VPWNNiT($H(mTtGh7h0;F5IBDGt(0O^)4K)R(1kZ$P$q+7ZG>6X)? Z{6C#zr_vg`R1E+C002ovPDHLkV1f=vpj!X{ literal 0 HcmV?d00001 diff --git a/src/spec/greatek_qfp_128_fp.png b/src/spec/greatek_qfp_128_fp.png new file mode 100644 index 0000000000000000000000000000000000000000..39baa640ea97717736feffaa3a5c4d9ada69677f GIT binary patch literal 20002 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 g^8d+p3;F#09&v7= 29: - return 'N', pin+6, 67-(pin-29) + return 'N', 35+(31-pin), 67-(31-pin) if pin <= 2: return 'S', pin+35, 36+pin - return 'E', pin-3, 39+(pin-3) + return 'E', 28-pin, 39+(28-pin) def create_sv(fname, pins): @@ -60,7 +66,9 @@ def create_sv(fname, pins): bondmap = {'N': {}, 'S': {}, 'E': {}, 'W': {} } padside = {'pads.north': 'N', 'pads.east': 'E', 'pads.south': 'S', 'pads.west': 'W'} + sidepad = {} for pinpad, bank in padside.items(): + sidepad[bank] = pinpad for ipin in range(len(pins[pinpad])): eside, enum, epinnum = bond_int_to_ext(ipin, bank) bondmap[eside][enum] = (epinnum, ipin, bank) @@ -71,6 +79,8 @@ def create_sv(fname, pins): f.write(" %d %d -> %s %d\n" % (enum, epinnum, bank, ipin)) scale = 15 + outerscale = scale * 2.0 + width = len(pins['pads.north']) * scale height = len(pins['pads.east']) * scale woffs = scale*40#-width/2 @@ -83,20 +93,15 @@ def create_sv(fname, pins): stroke=svgwrite.rgb(16, 255, 16, '%'), stroke_width=scale/10.0)) - dwg.add(dwg.text("Libre-SOC ls180 QFP-128", - insert=(woffs+width/2-scale*5, woffs+height/2), - fill='white')) - dwg.add(dwg.text("In collaboration with LIP6.fr", - insert=(woffs+width/2-scale*5, woffs+height/2+scale), - fill='white')) - dwg.add(dwg.text("Cell Libraries by Chips4Makers", - insert=(woffs+width/2-scale*5, woffs+height/2+scale*2), - fill='white')) + # record the inner line (iopad) position so that the outer one can + # match with it + innerpos = {'N': {}, 'S': {}, 'E': {}, 'W': {} } - outerpos = {'N': {}, 'S': {}, 'E': {}, 'W': {} } + # create the inner diagram for i, pin in enumerate(pins['pads.west']): ht = hoffs + height - (i * scale) + scale*0.5 endline = (woffs-scale*4.5, ht-scale*0.5) + innerpos['W'][i] = endline dwg.add(dwg.line((woffs-scale*2, ht-scale*0.5), endline, stroke=svgwrite.rgb(16, 255, 16, '%'), @@ -110,6 +115,7 @@ def create_sv(fname, pins): ht = hoffs + height - (i * scale) + scale*0.5 wd = width + woffs + scale*2 endline = (wd+scale*4.5, ht-scale*0.5) + innerpos['E'][i] = endline dwg.add(dwg.line((wd+scale*2, ht-scale*0.5), endline, stroke=svgwrite.rgb(16, 255, 16, '%'), @@ -122,6 +128,7 @@ def create_sv(fname, pins): for i, pin in enumerate(pins['pads.north']): wd = woffs + i * scale + scale*1.5 endline = (wd, hoffs-scale*4.5) + innerpos['N'][i] = endline dwg.add(dwg.line((wd, hoffs-scale*2), endline, stroke=svgwrite.rgb(16, 255, 16, '%'), @@ -139,6 +146,7 @@ def create_sv(fname, pins): wd = woffs + i * scale + scale*1.5 ht = hoffs + height + scale*2 endline = (wd, ht+scale*4.5) + innerpos['S'][i] = endline dwg.add(dwg.line((wd, ht+scale*2), endline, stroke=svgwrite.rgb(16, 255, 16, '%'), @@ -152,6 +160,149 @@ def create_sv(fname, pins): txt.rotate(90, pos) dwg.add(txt) + nepads = bondmap['N'].keys() + nepads.sort() + wepads = bondmap['W'].keys() + wepads.sort() + eepads = bondmap['E'].keys() + eepads.sort() + sepads = bondmap['S'].keys() + sepads.sort() + + owoffs = woffs + (width/2) - len(nepads)/2 * outerscale + ohoffs = hoffs + (height/2) - len(wepads)/2 * outerscale + + # north outer pads + for i in nepads: + (epinnum, ipin, bank) = pad = bondmap['N'][i] + wd = owoffs + i * outerscale + outerscale*1.5 + endline = (wd, ohoffs-outerscale*2) + startline = innerpos[bank][ipin] + dwg.add(dwg.line(startline, + endline, + stroke=svgwrite.rgb(255, 16, 16, '%'), + stroke_width=scale/10.0)) + pin = pins[sidepad[bank]][ipin] + pos=(wd, ohoffs-outerscale*4.0) + txt = dwg.text("%s (%s%d)" % (pin.upper(), bank, ipin+1), + insert=pos, fill='black') + txt.rotate(-90, pos) + dwg.add(txt) + pos=(wd, ohoffs-outerscale*2.5) + txt = dwg.text("%d N" % epinnum, insert=pos, fill='blue') + txt.rotate(-90, pos) + dwg.add(txt) + + # west outer pads + for i in wepads: + (epinnum, ipin, bank) = pad = bondmap['W'][i] + ht = ohoffs + (i * outerscale) + outerscale*1.5 + endline = (owoffs+outerscale*0.5, ht) + startline = innerpos[bank][ipin] + dwg.add(dwg.line(startline, + endline, + stroke=svgwrite.rgb(255, 16, 16, '%'), + stroke_width=scale/10.0)) + pin = pins[sidepad[bank]][ipin] + pos = (owoffs-outerscale*6.0, ht) + dwg.add(dwg.text("%s (%s%d)" % (pin.upper(), bank, ipin+1), + pos, + fill='black')) + pos = (owoffs-outerscale*1.0, ht) + dwg.add(dwg.text("%d W" % epinnum, insert=pos, + fill='blue')) + + # south outer pads + for i in sepads: + (epinnum, ipin, bank) = pad = bondmap['S'][i] + wd = owoffs + i * outerscale + outerscale*1.5 + ht = ohoffs + len(wepads)*outerscale + outerscale*4 + endline = (wd, ht) + startline = innerpos[bank][ipin] + dwg.add(dwg.line(startline, + endline, + stroke=svgwrite.rgb(255, 16, 16, '%'), + stroke_width=scale/10.0)) + pin = pins[sidepad[bank]][ipin] + pos=(wd-outerscale*0.25, ht+outerscale*1.5) + txt = dwg.text("%s (%s%d)" % (pin.upper(), bank, ipin+1), + insert=pos, fill='black') + txt.rotate(90, pos) + dwg.add(txt) + pos=(wd-outerscale*0.25, ht+outerscale*0.5) + txt = dwg.text("%d S" % epinnum, insert=pos, fill='blue') + txt.rotate(90, pos) + dwg.add(txt) + + # east outer pads + for i in eepads: + (epinnum, ipin, bank) = pad = bondmap['E'][i] + ht = ohoffs + (i * outerscale) + outerscale*1.5 + wd = owoffs+len(nepads)*outerscale + endline = (wd+outerscale*0.5, ht) + startline = innerpos[bank][ipin] + dwg.add(dwg.line(startline, + endline, + stroke=svgwrite.rgb(255, 16, 16, '%'), + stroke_width=scale/10.0)) + pin = pins[sidepad[bank]][ipin] + pos = (wd+outerscale*2.5, ht) + dwg.add(dwg.text("%s (%s%d)" % (pin.upper(), bank, ipin+1), + pos, + fill='black')) + pos = (wd+outerscale*1.0, ht) + dwg.add(dwg.text("%d E" % epinnum, insert=pos, + fill='blue')) + + # add QFP pack image in top-right + image_data = open(pack_drawing, "rb").read() + encoded = base64.b64encode(image_data).decode() + data = 'data:image/png;base64,{}'.format(encoded) + pos=(0, 0) + leads = svgwrite.image.Image(data, pos, + size=(327,300)) + dwg.add(leads) + + # add QFP lead image in centre + image_data = open(lead_drawing, "rb").read() + encoded = base64.b64encode(image_data).decode() + data = 'data:image/png;base64,{}'.format(encoded) + pos=(woffs+scale*3.5, hoffs+scale*3.5) + leads = svgwrite.image.Image(data, pos, + size=(400,400)) + leads.rotate(-90, (pos[0]+200, pos[1]+200)) + dwg.add(leads) + + dwg.add(dwg.text("GREATEK ELECTRONICS INC.", + insert=(woffs+width/2-scale*5, woffs+height/2-scale*6), + fill='black')) + dwg.add(dwg.text("INNER LEAD DRAWING", + insert=(woffs+width/2-scale*5, woffs+height/2-scale*5), + fill='black')) + dwg.add(dwg.text("QFP 128L OPEN STAMPING", + insert=(woffs+width/2-scale*5, woffs+height/2-scale*4), + fill='black')) + dwg.add(dwg.text("BODY 14x20x2.75mm", + insert=(woffs+width/2-scale*5, woffs+height/2-scale*3), + fill='black')) + dwg.add(dwg.text("L/F PAD SIZE 236x236mil^2", + insert=(woffs+width/2-scale*5, woffs+height/2-scale*2), + fill='black')) + + # add attribution + dwg.add(dwg.text("Libre-SOC ls180 QFP-128", + insert=(woffs+width/2-scale*5, woffs+height/2), + fill='black')) + dwg.add(dwg.text("In collaboration with LIP6.fr", + insert=(woffs+width/2-scale*5, woffs+height/2+scale), + fill='black')) + dwg.add(dwg.text("Cell Libraries by Chips4Makers", + insert=(woffs+width/2-scale*5, woffs+height/2+scale*2), + fill='black')) + dwg.add(dwg.text("IMEC TSMC 180nm", + insert=(woffs+width/2-scale*5, woffs+height/2+scale*3), + fill='black')) + dwg.save() -- 2.30.2