!******************************************************************************* %routine %spec pla (%string (31) name,%integer ins,outs,feeds,prods, %integerarrayname and,or,%integername phi1y,phi2y, %integerarrayname inx,outx) !******************************************************************************* %constant %string (2) blue ="M", metal ="M", nm="M" %constant %string (2) green ="D", diffusion="D", nd="D" %constant %string (2) red ="P", poly ="P", np="P" %constant %string (2) implant ="I", ni="I" %constant %string (2) glass ="G", ng="G" %constant %string (2) contact ="C", nc="C" %constant %string (2) buried ="B", nb="B" %constant %integer true = 0, false = 1 %external %string (2) %fn %spec contacts %external %routine %spec end symbol %external %routine %spec symbol (%string (31) name) %external %routine %spec box %alias "ILAPBOX" (%integer xl, yl, xu, yu) %external %routine %spec polygon %alias "ILAPPOLYGON" (%real x, y) %external %routine %spec wirex (%integer x, y, l) %external %routine %spec wirey (%integer x, y, l) %external %routine %spec ETPX (%string (31) name, %integer x, y, l) %external %routine %spec ETPY (%string (31) name, %integer x, y, l) %external %routine %spec ETDX (%string (31) name, %integer x, y, l) %external %routine %spec ETDY (%string (31) name, %integer x, y, l) %external %routine %spec DTPX (%string (31) name, %integer x, y, l) %external %routine %spec DTPY (%string (31) name, %integer x, y, l) %external %routine %spec DTDX (%string (31) name, %integer x, y, l) %external %routine %spec DTDY (%string (31) name, %integer x, y, l) %external %routine %spec DTDBX (%string (31) name, %integer x, y, l) %external %routine %spec DTDBY (%string (31) name, %integer x, y, l) %external %routine %spec ax (%integer u) %external %routine %spec ay (%integer v) %external %routine %spec axy (%real x, y) %external %routine %spec dx (%integer u) %external %routine %spec dy (%integer v) %external %routine %spec dxy (%real x, y) %external %routine %spec layer (%string (4) colour) %external %string (4) %function %spec clayer %external %routine %spec width (%integer size) %external %integer %function %spec cwidth %external %routine %spec draw (%string (31) name, %integer x, y) %external %routine %spec drawmx (%string (31) name, %integer x, y) %external %routine %spec drawmy (%string (31) name, %integer x, y) %external %routine %spec drawrot (%string (31) name, %integer x, y, rot) %external %routine %spec draw mx rot (%string (31) name, %integer x, y, rot) %external %routine %spec draw my rot (%string (31) name, %integer x, y, rot) %external %integer %function %spec SX (%string (31) name) %external %integer %function %spec SY (%string (31) name) %external %integer %function %spec LX (%string (31) name) %external %integer %function %spec LY (%string (31) name) %external %integer %function %spec symbol exists (%string (31) name) %external %routine %spec dm (%integer x, y) %external %routine %spec pm (%integer x, y) %external %routine %spec pdms (%integer x, y) %external %routine %spec pdmn (%integer x, y) %external %routine %spec pdmw (%integer x, y) %external %routine %spec pdme (%integer x, y) %external %routine %spec pdbn (%integer x, y) %external %routine %spec pdbs (%integer x, y) %external %routine %spec pdbe (%integer x, y) %external %routine %spec pdbw (%integer x, y) %external %routine %spec pdcn (%integer x, y) %external %routine %spec pdcs (%integer x, y) %external %routine %spec pdce (%integer x, y) %external %routine %spec pdcw (%integer x, y) %external %routine %spec pdbns (%integer x, y) %external %routine %spec pdbew (%integer x, y) !******************************************************************************* %external %routine pla (%string (31) name,%integer ins,outs,feeds,prods, %integerarrayname and,or,%integername phi1y,phi2y, %integerarrayname inx,outx) %integer infs,outfs ;! ins & outs plus feeds %routinespec define plain %integer plainmaxy,plainphi1y,plainvddy,plaingndy, plax, play %routinespec define plaout %integer plaoutmaxy,plaoutphi2y,plaoutvddy,plaoutgndy %routinespec define pdp (%string(11)%name name,%integer n) %routinespec define pup (%string(11)%name name,%integer l) %integer plapupmaxy %integer plainxb,plainyb ;! bases of input buffers %integer plaoutxb,plaoutyb ;! bases of output buffers %integer andpdpyb ;! y-base of and-plane poly/diff/poly lines %integer orpdpxb ;! x-base of or-plane poly/diff/poly lines %integer orpupyb ;! y-base of or-plane pull-up pairs %integer eprods,eoutfs ;! prods and outfs evened up %string(11) andpdp,orpdp ;! for poly/diff/poly symbol names %string(11) andpup,orpup ;! for pullup+metal symbol names %constinteger extragnd=8 %externalstring(11)%fnspec itos(%integer n,m) %integer curx,cury,andp,orp,andt,ort,i,j,k,l %string(11) tran %integerarray ifx,ofx(0:feeds) %string(1) bc infs=ins+feeds outfs=outs+feeds %if contacts=buried %then bc="b" %else bc="" define plain define plaout eprods=(prods+1)&(\1) define pdp(andpdp,eprods) define pup(andpup,14*infs-4) eoutfs=(outfs+1)&(\1) define pdp(orpdp,eoutfs) define pup(orpup,7*eprods+9*((eprods-1)//extragnd)-4) ! start to define the main pla symbol symbol(name) plainxb=plapupmaxy plainyb=plaoutmaxy-plainmaxy-8 %if feeds>1 %then plainyb=plainyb+5*(feeds-1) andpdpyb=plainyb+plainmaxy ! draw input buffers and poly/diff/poly lines curx=plainxb %for i=1,1,infs %cycle draw("plain".bc,curx,plainyb) draw(andpdp,curx,andpdpyb) curx=curx+14 %repeat %if bc="" %then orpdpxb=curx+5 %else orpdpxb=curx+7 layer(poly) box(0,plainyb+plainphi1y,plainxb,plainyb+plainphi1y+2) ;! phi 1 layer(metal) box(4,plainyb+plainvddy,plainxb+14*infs-12,plainyb+plainvddy+4) ;! vdd box(plainxb+14,plainyb+plaingndy,orpdpxb,plainyb+plaingndy+4) ;!gnd box(plainxb+7,andpdpyb,orpdpxb,andpdpyb+4) ! draw and-plane pull-up pairs and metal lines cury=andpdpyb+7 j=extragnd %for i=2,2,eprods %cycle %if j=0 %then %start ;! extra gnd line required layer(metal) box(plainxb+7,cury+2,orpdpxb,cury+6) cury=cury+9 j=extragnd %finish drawrot(andpup,plainxb,cury,1) %if bc="" %then %start pdmw(orpdpxb-6,cury+3) ; pdmw(orpdpxb-6,cury+10) %finish %else %start dm(orpdpxb-9,cury+3) ; pm(orpdpxb-5,cury+3) dm(orpdpxb-9,cury+10) ; pm(orpdpxb-5,cury+10) %finish drawrot(orpdp,orpdpxb,cury+11,-1) layer(poly) box(orpdpxb-3,cury+1,orpdpxb,cury+3) box(orpdpxb-3,cury+9,orpdpxb,cury+11) cury=cury+14 j=j-2 %repeat layer(metal) box(plainxb+7,cury+1,orpdpxb,cury+5) ;! top gnd line ! draw or-plane pull-up pairs and metal lines plaoutxb=orpdpxb+6 curx=plaoutxb orpupyb=cury-3 plaoutyb=andpdpyb+8-plaoutmaxy j=extragnd %for i=2,2,eoutfs %cycle %if j=0 %then %start layer(metal) box(curx+3,plaoutyb+plaoutgndy+4,curx+7,orpupyb-7) layer(poly) box(curx,plaoutyb+plaoutphi2y,curx+9,plaoutyb+plaoutphi2y+2) curx=curx+9 j=extragnd %finish draw("plaout".bc,curx,plaoutyb) draw(orpup,curx+1,orpupyb) curx=curx+14 j=j-2 %repeat plax=curx+6 play=orpupyb+plapupmaxy ! draw metal gnd and vdd lines layer(metal) box(orpdpxb,plaoutyb+plaoutgndy,orpdpxb+4,orpupyb+8) box(orpdpxb-4,plainyb+plaingndy+4,orpdpxb,plaoutyb+plaoutgndy+4) box(orpdpxb+4,plaoutyb+plaoutgndy,plax-4,plaoutyb+plaoutgndy+4) box(plax-4,0,plax,play) layer(poly) box(plax-6,plaoutyb+plaoutphi2y,plax,plaoutyb+plaoutphi2y+2) layer(metal) box(4,plainyb-4,orpdpxb,plainyb) box(orpdpxb-4,plainyb,orpdpxb,plaoutyb+plaoutvddy+4) box(orpdpxb,plaoutyb+plaoutvddy,plax-15,plaoutyb+plaoutvddy+4) box(0,0,4,play) box(4,play-4,plax-17,play) phi1y=plainyb+plainphi1y phi2y=plaoutyb+plaoutphi2y ! work out positions of inputs and outputs curx=plainxb+5 layer(diffusion) %for i=1,1,ins %cycle box(curx,0,curx+2,plainyb) inx(i)=curx curx=curx+14 %repeat %for i=1,1,feeds %cycle ifx(i)=curx curx=curx+14 %repeat curx=plaoutxb+2 j=extragnd %for i=1,1,feeds %cycle %if j=0 %then curx=curx+9 %and j=extragnd ofx(i)=curx curx=curx+7 j=j-1 %repeat layer(diffusion) %for i=1,1,outs %cycle %if j=0 %then curx=curx+9 %and j=extragnd box(curx,0,curx+2,plaoutyb) %unless plaoutyb=0 outx(i)=curx curx=curx+7 j=j-1 %repeat ! draw feedbacks %if feeds>0 %then %start layer(diffusion) box(ifx(feeds),plaoutyb,ofx(1),plaoutyb+2) box(ifx(feeds),plaoutyb+2,ifx(feeds)+2,plainyb) %if feeds>1 %then %start %for i=2,1,feeds %cycle box(ofx(i),plaoutyb-5*(i-1)+2,ofx(i)+2,plaoutyb) box(ifx(feeds-i+1)+2,plaoutyb-5*(i-1), ofx(i)+2,plaoutyb-5*(i-1)+2) box(ifx(feeds-i+1),plaoutyb-5*(i-1), ifx(feeds-i+1)+2,plainyb) ! track(2,ofx(i),plaoutyb) ; dy(-5*(i-1)+2) ! ax(ifx(feeds-i+1)+2) ; ay(plainyb) %repeat %finish %finish ! program the and-plane andp=1 andt=1 cury=andpdpyb+8 j=extragnd %for i=1,1,prods %cycle %if j=0 %then cury=cury+9 %and j=extragnd curx=plainxb %for k=1,1,infs %cycle %if and(andp)#0 %then %start tran="and".itos(andt,0) andt=andt+1 %if and(andp)<0 %then %start etpy(tran,curx+1,cury,4) %if (bc="" %and k=1 %and i&1=0) %or (k>1 %and and(andp-1)<=0) %c %then dm(curx-2,cury+2) %finish %else %start etpy(tran,curx+7,cury,4) %if k0 %then %start tran="or".itos(ort,0) ort=ort+1 %if k&1#0 %then %start etpx(tran,curx,cury+1,4) %if k>1 %and (or(orp-1)<=0 %or l=extragnd) %c %then dm(curx+2,cury-2) %finish %else %start etpx(tran,curx,cury+7,4) %if kskip symbol(name) %if bc="" %then %start etpx("plainphi1",5,2,2) etpy("plainpdb",8,14,8) dtdy("plainpub",2,24,5) etpy("plainpdt",8,38,8) dtdy("plainput",2,35,3) layer(poly) box(0,2,3,4) ; box(9,2,14,4) ; box(8,10,10,12) box(6,27,10,29) ; box(8,29,10,36) box(8,48,10,49) ; box(0,42,2,49) layer(diffusion) box(11,17,13,46) dm(5,8) ; pm(10,8) ; layer (metal); box (7, 6, 8, 10) dm(13,15) ; pdme(3,22) ; dm(4,32) ; pdme(3,40) %finish %else %start etpx("plainphi1",5,2,2) etpx("plainpdb",5,14,5) ; dy(3) dtdby("plainpub",2,20,7) etpy("plainpdt",8,39,8) dtdby("plainput",2,38,-5) layer(poly) box(0,2,3,4) ; box(9,2,14,4) ; box(2,10,4,16) box(6,25,10,27) ; box(8,27,10,37) box(0,42,2,50) ; box(8,49,10,50) layer(diffusion) box(5,6,7,9) ; box(2,17,6,19) box(4,39,6,41) ; box(11,16,13,47) pdce(4,8) ; dm(12,11) ; dm(4,30) ; pdcs(3,43) %finish endsymbol skip:%if bc="" %then %start plainmaxy=49 plainphi1y=2 plainvddy=30 plaingndy=13 %finish %else %start plainmaxy=50 plainphi1y=2 plainvddy=28 plaingndy=9 %finish %end !---------------------------------------------------------------------- %routine define plaout ! define output inverter pair %string(7) name name="plaout".bc %if symbol exists(name)=true %then ->skip symbol(name) %if bc="" %then %start dtdy("plaoutpur",7,26,10) etpx("plaoutpdr",6,40,4) dtdx("plaoutpul",6,16,-4) ; dy(6) etpy("plaoutpdl",3,46,4) etpx("plaoutphi2l",3,58,2) etpx("plaoutphi2r",10,58,2) layer(poly) box(10,6,12,36) ; box(1,6,3,14) ; box(11,40,13,51) box(0,58,1,60) ; box(7,58,8,60) layer(diffusion) box(7,13,9,24) ; box(0,27,2,50) ; box(7,46,10,50) pdmn(2,24) ; pdmn(8,36) ; pdms(3,3) ; pdms(10,3) ; dm(7,11) dm(8,45) ; pdmn(4,54) ; pdmn(11,54) ; dm(4,63) ; dm(11,63) %finish %else %start dtdby("plaoutpur",5,36,-7) ; dx(2) ; dy(-2) etpx("plaoutpdr",6,40,4) dtdby("plaoutpul",2,23,-9) ; dx(2) etpy("plaoutpdl",3,46,4) etpx("plaoutphi2l",3,59,2) etpx("plaoutphi2r",10,59,2) layer(poly) box(10,5,12,33) ; box(1,5,3,12) ; box(11,40,13,52) box(0,59,1,61) ; box(7,59,8,61) layer(diffusion) box(7,11,9,25) ; box(0,24,4,26) ; box(0,26,2,50) box(7,46,10,50) ; box(5,37,10,39) pdcs(3,3) ; pdcs(10,3) ; dm(7,9) ; dm(8,45) pdcn(4,54) ; pdcn(11,54) ; dm(4,64) ; dm(11,64) %finish endsymbol skip:%if bc="" %then %start plaoutmaxy=65 plaoutphi2y=58 plaoutvddy=9 plaoutgndy=43 %finish %else %start plaoutmaxy=66 plaoutphi2y=59 plaoutvddy=7 plaoutgndy=43 %finish %end !------------------------------------------------------------------------------ %routine define pdp(%string(11)%name name,%integer n) ! define symbol for poly/diffusion/poly lines %integer xg,m,i,a,b name="plapdp".itos(n,0) %if symbol exists(name)=true %then %return xg=(n-1)//extragnd symbol(name) layer(diffusion) dm(5,i*(7*extragnd+9)+2) %for i=0,1,xg dm(5,7*n+9*xg+10) box(4,4,6,7*n+9*xg+8) layer(poly) m=n a=0 ; b=0 %cycle box(a,b,a+2,b+5); b=b+5 box(a,b,a+3,b+2); a=a+1; b=b+2 %if m>extragnd %start box(a,b,a+2,b+7*extragnd+1); b=b+7*extragnd-1; a=a-1 box(a,b,a+2,b+3); b=b+3 %finish %else %start box(a,b,a+2,b+7*m) %exit %finish m=m-extragnd %repeat m=n a=8;b=0 %cycle box(a,b,a+2,b+5); b=b+5 box(a-1,b,a+2,b+2); a=a-1; b=b+2 %if m>extragnd %start box(a,b,a+2,b+7*extragnd+1); b=b+7*extragnd-1; a=a+1 box(a,b,a+2,b+3); b=b+3 %finish %else %start box(a,b,a+2,b+7*m) %exit %finish m=m-extragnd %repeat endsymbol %end !------------------------------------------------------------------------------- %routine define pup(%string(11)%name name,%integer l) ! define symbol for pullups and metal lines from them name="plapup".bc.itos(l,0) %if symbol exists(name)=true %then ->skip symbol(name) %if bc="" %then %start dtdy("plapuppul",2,3,6) ; pdms(3,3) dtdy("plapuppur",9,11,6) ; pdms(10,11) layer(diffusion) box(2,11,4,18) ; dm(4,20) ; box(6,19,11,21) layer(metal) box(1,-l,5,0) ; box(8,-l,12,8) %finish %else %start dtdby("plapuppul",2,6,7) dtdby("plapuppur",9,15,7) layer(diffusion) dm(3,2) ; box(2,15,4,21) ; dm(4,23) box(6,23,11,25) ; box(9,4,11,13) ; dm(10,2) layer(metal) box(1,-l,5,0) ; box(8,-l,12,0) %finish endsymbol skip:%if bc="" %then plapupmaxy=22 %else plapupmaxy=25 %end !------------------------------------------------------------------------------- %end %endoffile