ChipmonkNMosWrite.mesaCopyrightc1984byXeroxCorporation.Allrightsreserved.LastEditedby:Jacobi,February20,198412:06pmLastEditedby:Jacobi,March25,19865:05:06pmPSTLastEditedby:RossJuly18,19861:49:46pmPDTDIRECTORYAscii,Atom,BasicsUSING[BITOR,BITSHIFT],CD,CDInstances,CDBasics,CDDirectory,CDIO,CDMarks,CDSimpleOps,CDOrient,CDPrivate,CDProperties,CDRects,CDRepetitions,CDSequencer,CDTexts,CDViewer,FileNames,FS,IO,NMos,NMosContacts,NMosTransistors,Rope,RuntimeError,TerminalIO;ChipmonkNMosWrite:CEDARMONITORIMPORTSAscii,Atom,Basics,CDInstances,CDBasics,CDDirectory,CDIO,CDMarks,CDSimpleOps,CDProperties,CDSequencer,FileNames,FS,IO,NMos,Rope,RuntimeError,TerminalIO=BEGINlambdaInChipmonk:INTEGER=2;--InChipndalewemustmakenoassumptionsaboutthe--valueoflambda.Itcan(anddoes)changefromtimetotime;--butweknowthatchipndaleslambdais>=2lambdaFactor:INT=NMos.lambda/lambdaInChipmonk;codeWordForDataFile:CARDINAL=123751B;instanceCode:INTEGER=1;transistorCode:INTEGER=2;contactCode:INTEGER=3;wireCode:INTEGER=4;p_, g]xq]p] (N*.d[x."|$'+Z5x.!#W&+-Xx.iN #(+rU? gsSxQxPHxrPHPHusPHr=PHPHsPHPHrPHPH_s PHPH!FrNxs)NNLx KRxIx HxF[xDx C xAdx ?x >xsd Ijxrjjsj#%x rds)xr~s sx r s s@s s xr& s TVm$2rectangleCode:INTEGER=5;textCode:INTEGER=6;busCode:INTEGER=7;repeatCode:INTEGER=8;stream:IO.STREAM;PushedState:ERROR=CODE;gMark:INT;OutWord:PROC[w:INT]=BEGINi:INTEGER=w;--trapsifnecessaryc:CARDINAL_LOOPHOLE[i,CARDINAL];IO.PutChar[stream,LOOPHOLE[c/256,CHAR]];IO.PutChar[stream,LOOPHOLE[cMOD256,CHAR]];END;OutNumber:PROC[n:CD.Number]=--doesalambdacorrectionBEGINi:INTEGER=n/lambdaFactor;--trapsifnecessaryc:CARDINAL=LOOPHOLE[i];IO.PutChar[stream,LOOPHOLE[c/256,CHAR]];IO.PutChar[stream,LOOPHOLE[cMOD256,CHAR]];END;OutCard:PROC[c:CARDINAL]=BEGINIO.PutChar[stream,LOOPHOLE[c/256]];IO.PutChar[stream,LOOPHOLE[cMOD256]];END;OutRope:PROC[r:Rope.ROPE]=BEGINleng:[0..256)=MIN[Rope.Length[r],255];IO.PutChar[stream,LOOPHOLE[leng,CHAR]];FORi:CARDINALIN[0..leng)DOIO.PutChar[stream,Rope.Fetch[base:r,index:i]];ENDLOOP;IFlengMOD2=0THENIO.PutChar[stream,LOOPHOLE[0,CHAR]];END;OutRopeUpper:PROC[r:Rope.ROPE]=BEGINleng:[0..256)=MIN[Rope.Length[r],255];IO.PutChar[stream,LOOPHOLE[leng,CHAR]];FORi:CARDINALIN[0..leng)DOIO.PutChar[stream,Ascii.Upper[Rope.Fetch[base:r,index:i]]];ENDLOOP;IFlengMOD2=0THENIO.PutChar[stream,LOOPHOLE[0,CHAR]];END;ug/Es_,x r_,_,]s_,]xr]]8s]x[xr[[s[rWZ5x rFZ5Z5sZ5 V gtSVVrFVVtVVsU> g rU>U>]sU>:rU>U>seU>U>S grPSSs[SStPH gs PHPHr PHPHsPHrPHPHsPHPHrNxsLxrLLCsLpLL{RsKQxrKQKQsKQrYKQKQsKQKQ r JKQKQ!s&KQKQ&rIxsIIr7IIs II "#=r&*II&s)II)rHxsHHr7HHs HH r"HH#sH%`r(NHH)s+HH, rFZxsFZFZtC gsxC C rvC C sC rDC C sC C L"8AcxI3 r?xs>xr>>Cs> "p$D>>$()s{cellCount_cellCount+1};ENDCASE=>NULL;END;EachEntryOutput:CDDirectory.EachEntryAction=--ignoresnameparameter,takesnamefromcell-dataitselfBEGINIFob.marked=gMarkTHENRETURN;ob.marked_gMark;WITHob.specificRefSELECTFROMcptr:CD.CellPtr=>{FORl:CD.InstanceList_cptr.contents,l.restWHILEl#NILDOIFl.first.ob.class.inDirectoryTHEN[]_EachEntryOutput[name:NIL,ob:l.first.ob];ENDLOOP;outputedCellCount_outputedCellCount+1;cellNameA[outputedCellCount]_ob;ug/Et_, gs_,_,r_,_,s_,r_,_,us[_,_, r]xs[xrZ5xsZ5Z5tV gs;VVr9VVsVrVVsvVV}rU?xsSxQxrPHxsPHPHtL gs}LLr{LL#sL"rLLsLLrKRxsIxHxF[xDxrC xsC C ? g r!?? s??> gr>>sS>>s4)d0 grz00N0E0s00r00 s0!&r'00(s*0r0+0/s1^001r5006}s07r00>/2 g r/2/2/2s/2dr,/2/2-/2.s/25r-xs4-r-s->r'--(q-)s/--0It*< g sC*<*<A*r(x&xs& r &&&s%Er%E%Es%E%E, $% r#s#r!## sa##r!xs!!t gs*px= "{&)\.rXxxsrE s$ xraxsa r aaasrs,rsrs "* *r-/s2[r456kskSr%kk&sk)*,r;kk<s=kk> rsM t % &'CTVm$?4OutCard[outputedCellCount];OutRopeUpper[cptr.name];OutSize[ob.size];OutCard[20000];--count???makeitbig,justincaseitissomekindofreferencecountOutList[cptr.contents];};rp:CDRepetitions.RepPtr=>NULL;ENDCASE=>IFob.class.inDirectoryTHEN{TerminalIO.WriteRope["?"];unKnowns_unKnowns+1;};END;sig:SIGNAL=CODE;OutputDesign:ENTRYPROC[d:CD.Design,s:IO.STREAM]=BEGINDoit:PROC[mark:CDMarks.MarkRange]=BEGINMOutputDesign[d,s,mark]END;CDMarks.DoWithMark[d,Doit];END;MOutputDesign:PROC[d:CD.Design,s:IO.STREAM,mark:INT]=BEGINENABLE{UNWIND=>cellNameA_NIL;PushedState=>{GOTOPushed};RuntimeError.BoundsFault=>{TerminalIO.WriteRope["BoundsFault,maybesomefeatureisnotrepresentableforchipmonk;proceedissecure\n"];SIGNALsig;GOTOFailed};RuntimeError.UNCAUGHT=>{TerminalIO.WriteRope["unknownerror,maybesomefeatureisnotrepresentableforchipmonk;proceedissecure\n"];SIGNALsig;GOTOFailed};};gMark_mark;freeAtom_1;auxAtom[0]_[older:0,younger:0];stream_s;design_d;unKnowns_unknownObjects_unknownAtoms_0;cellCount_outputedCellCount_0;ug/Es_,][Z5pZ5Z5":$l()p,.0O3>469k<>,XmsVU?S r#_SS$Hs&SSrQsQrPIsPIBr sPIPI!,sPI$8NLKRrIxsIID grDDsDrDDsDDtAe g sAeAerAeAenAe;sAer AeAe s!AeAe"'r(AeAe(s)AerAe*2s.AeAe/r?xt>xs#>>r!>>s>8(Yr< &#%P r%Es%Er#s#! O rY O O?s O"%R)-15:2;> #%P rXsXh bxux.kx yv#GxuxT uxu !# -. xE"B#TVm$o5[]_CDDirectory.Enumerate[design,EachEntryCount];OutCard[codeWordForDataFile];OutCard[8];--versionnumberOutCard[cellCount];cellNameA_NEW[ARRAY[0..maxnum)OFCD.Object_ALL[NIL]];[]_CDDirectory.Enumerate[design,EachEntryOutput];IFoutputedCellCount#cellCountTHENERROR;OutPushedLevels[];OutCard[0];--pushedlayer0OutCard[0];--anychangesOutList[design.actual.first.specific.contents];cellNameA_NIL;IFunKnowns#0THEN{TerminalIO.WriteRope["**unknownfeatures:"];TerminalIO.WriteInt[unKnowns];TerminalIO.WriteLn[];};IFunknownObjects#0THEN{TerminalIO.WriteRope["**unknownobjects:"];TerminalIO.WriteInt[unknownObjects];TerminalIO.WriteLn[];};IFunknownAtoms#0THEN{TerminalIO.WriteRope["**unknownpropertiesorpropertynames:"];TerminalIO.WriteInt[unknownAtoms];TerminalIO.WriteLn[];};EXITSPushed=>{TerminalIO.WriteRope["OutputFailed(pushedincell)\n"]};Failed=>{TerminalIO.WriteRope["OutputFailed\n"]};END;OutPushedLevels:PROC[]=BEGINIFdesign.actual.rest#NILTHEN{TerminalIO.WriteRope["designisinpushedstate\n"];ERRORPushedState};END;freeAtom:INTEGER_1;AuxEntry:TYPE=RECORD[older,younger:INTEGER--doubly-linkedLRUlist--];auxAtom:REFARRAY[0..atomTableSize]OFAuxEntry=NEW[ARRAY[0..atomTableSize]OFAuxEntry];atomTableSize:INTEGER=256;atomTable:REFARRAY[1..atomTableSize]OFRope.ROPE--forshortI/O--=NEW[ARRAY[1..atomTableSize]OFRope.ROPE];ToRope:PROC[a:REFANY]RETURNS[r:Rope.ROPE]=BEGINIFa=NILTHENRETURN[NIL];WITHaSELECTFROMug/Es_,xP$]x[x p$[[0sZ5xXxr/XXsXrXOsX r&XX'X)s*XX+/r1 XX1s3QXrX3s5XX6#VxP$rU>xsU>r#9U>U>#U>&s+U>U>SxQx pQQ"sPHx pPHPH" sNx/Lx r'LLs2LLrKQxsKQ r.KQKQsKQI!l'-%HFZDrC xsC rC C nsC zAc!l',?$>UU> grsNr%&s'.'rxs4rs>r!"s# ^ g r$^^s^ g rjsr&z'Ws(r,,sp060137?:"s;rxs4rs>r!"s#r'I(s*Z*t gs%r#srs*rs$&r)*^s,-rx pxs pr& p p p p{s prJ p p3s V p p r xs  rJ  vTVm$@6rp:Rope.ROPE=>r_rp;at:ATOM=>r_Atom.GetPName[at];ENDCASE=>{r_"?Unknown?";unknownAtoms_unknownAtoms+1};END;OutAtom:PROC[a:REFANY]=BEGINi:INTEGER;r:Rope.ROPE=ToRope[a];BEGINFORi_auxAtom[0].older,auxAtom[i].olderWHILEi#0DOIFRope.Equal[r,atomTable[i]]THEN{OutCard[LOOPHOLE[-i,CARDINAL]];--re-arrangeLRUqueueauxAtom[auxAtom[i].older].younger_auxAtom[i].younger;auxAtom[auxAtom[i].younger].older_auxAtom[i].older;GOTOTouchi;};ENDLOOP;--addanewatomIFfreeAtom{auxAtom[i].older_auxAtom[0].older;auxAtom[i].younger_0;auxAtom[auxAtom[0].older].younger_i;auxAtom[0].older_i;};END;END;HasSurround:PROC[ob:CD.Object]RETURNS[yes:BOOL_FALSE]=INLINEBEGINyes_FALSERETURN[ob.layer=NMos.pdif]END;AngleExt:PROC[tob:CD.Object]RETURNS[CD.Number]={--copiedfromcmostransistorsimpltp:NMosTransistors.TransistorPtr=NARROW[tob.specificRef];RETURN[tp.width+tp.length+tp.wExt-tob.size.x]};ug/Es_7rZ_7_7.s_7]r]]os]/8r[s[!g %rZ@xsZ@Z@tV gsVVrVVsVrVVvVlsVVrUIxsSxrSSCsSSQxrQQVsQ rPSNsNw_!r+NN,sN0 r3NN3MsMB  r%rMM&+sM)8K\rFK\K\s K\K\ r"K\K\#|s(K\K\)KpI#  ;sH !*,0Fe!*,0rDsDCrAnss>1r!>>"s>%''(/V57 rRETURN[aptr.location];ENDCASE=>RETURN[CDBasics.BaseOfRect[CDInstances.InstRectI[aptr]]];END;OutList:PROC[list:CD.InstanceList]=BEGINOutProps:PROC[props:CD.PropList]=BEGINcount:CARDINAL_0;FORpl:CD.PropList_props,pl.restWHILEpl#NILDOIFISTYPE[pl.first.key,ATOM]AND(pl.first.key=$InstanceNameORpl.first.key=$SignalName)THENcount_count+1ENDLOOP;OutCard[count];FORpl:CD.PropList_props,pl.restWHILEpl#NILDOIFISTYPE[pl.first.key,ATOM]THEN{IFpl.first.key=$InstanceNameORpl.first.key=$SignalNameTHEN{OutCard[1];OutRope[ToRope[pl.first.val]]}ELSE{OutCard[2];OutAtom[pl.first.key];OutAtom[pl.first.val];}}ENDLOOP;END;cnt:NAT_0;FORl:CD.InstanceList_list,l.restWHILEl#NILDOcnt_cnt+1ENDLOOP;OutCard[cnt];FORl:CD.InstanceList_list,l.restWHILEl#NILDOOutSize[AppLocation[l.first]];OutOrient[l.first.orientation];OutObject[l.first.ob,l.first];OutProps[l.first.properties]ENDLOOP;ug/Et_, gs_,_,r_,_,s_,ro_,_,9s_,_,wrK_,_,s_,#Vr#_,_,$s%j_,_,%+qr]xs[xr[[s[[OrZ5xsZ5rZ5Z5msZ5r7Z5Z5Z5s! Z5Z5rXxsXrVxsVVtS g sSSrSSsSrkSS6sSSsr$ESS%sS*Qr*SS+s,eSS,2lrQxQPHxsPHPHrPHPHH"asNrNNsNNr9NN sN!rLsLr!LLsL3rKRxsKRKRtH gsHHr HHs/HHrIHHsHHQ "arF[xtC xs3C C r1C C sC C !rpC C ;s!C C y%vrAds?r??s?"r>s>wr>>j s>+!r& >>'#s>*jr,>>->/s>rr9 {cellNum:NAT_0;OutCard[instanceCode];FORi:NATIN[1..cellCount]DOIFob=cellNameA[i]THEN{cellNum_i;EXIT}ug/Er_lxs_l_lt\ gs\\r\\Bs\Ar^\\(s\\f #rZuxsXxrXXsXrXX sX#/W&x rU~xsU~U~tR/ gsR/R/rR/R/XsR/R/7rR/R/sgR/R/ r-R/R/.s/jR/R//r5R/R/6s7R/R/8rPxtM8xsgM8M8reM8M8 sM8M8 mr#M8M8$s'M8rM8(s*M8M8+,rKK1sK3rKK CsK#OI( HAtDx sDDrDD,sDD rDDUs ;DD %f'KCKr7CKCK sCK,.2rAsA1rDAAsA ?>T<;r9]s9]764f21t/px s/p/pr/p/pos/p/pNr/p/ps~/p/p$(57r-r7-- s-,.2, r, , s, ,  *y('*%r#xs#r###s#X"3 r<srExsE rqEE+sE7rKs (0r9F:s>.>vxp) vOp&v)X*#p.#.rOxsO r OOOsrs,rs8Xr s r  s  r$ % s Sr! "Cs %O r- .<s03 QTVm$9ENDLOOP;IFcellNum=0THEN{TerminalIO.WriteRope["**badcell\n"];unKnowns_unKnowns+1};OutCard[cellNum];};rp:CD.RectPtr=>{OutRectObject[ob]};--wrp:REFNMos.WellRectRep=>{OutRectObject[ob]};tp:NMosTransistors.TransistorPtr=>{j:CARDINAL;OutCard[transistorCode];OutNumber[tp.width];OutNumber[tp.length];IFtp.lExt/lambdaFactor>63ORtp.wExt/lambdaFactor>63THENERROR;j_tp.lExt/lambdaFactor+tp.wExt/lambdaFactor*64;IFtp.pullupTHENj_Basics.BITOR[j,40000B];IFtp.implant>0THENj_Basics.BITOR[j,100000B];IFtp.angleTHENj_Basics.BITOR[j,20000B];IFHasSurround[ob]THENj_Basics.BITOR[j,10000B];OutCard[j];IFtp.angleTHEN{s:CD.Position=Size[ob];qq:INTEGER_MAX[s.y-tp.wExt-tp.length-2*tp.lExt,0];--maybeoutofrangeOutNumber[qq];--angleextension};IFtp.implant>0THENOutCard[tp.implant];};cp:NMosContacts.ContactPtr=>{j:CARDINAL;s:CD.Position=Size[ob];ss:CARDINAL_s.y;OutCard[contactCode];j_contactTab[cp.typ];j_Basics.BITOR[j,Basics.BITSHIFT[ss,8]];OutCard[j];OutLevel[ob.layer];OutCard[0];--surround...IFcp.typ=burrTHEN{OutNumber[s.x];OutCard[Basics.BITOR[Basics.BITSHIFT[cp.wExt,8],cp.lExt]];};};tp:CDTexts.TextPtr=>{OutRope[tp.text];TerminalIO.WriteRope["text;fontinformationlost\n"];};rp:CDRepetitions.RepPtr=>{OutCard[repeatCode];OutObject[rp.ob];OutCard[0];--wOutCard[0];--lOutSize[rp.offset];OutCard[rp.count];ug/Er_esM_e_er]s]Br]]s]3}\mZoXW rW W sW W qpUxvUxUxapUxX#&sS%}(R)rR)R)s2R)R)PNM2rKsKBr#KK$sK%r6KK6K9s=KKI-rH;sH;Br5H;H;sH; or$ZH;H;%s'H;H;(J)rFsFB rFFFsF "r&kFF'$s)FF*Z+rDsDBrxDD1sD>%r#DD$Vs')DD'(rCEsCEBrCECEsCE"#%8r)#CECE)s,CECE-.RA r?s?Brx??1s?>>Nr.>N>Ns>N>N6g<r7<<s<r<<s!A<OutUnknownObject["?"];END;COutputDesign:PROC[comm:CDSequencer.Command]=BEGINname,fileName:Rope.ROPE;s:IO.STREAM;wDir:Rope.ROPE_CDIO.GetWorkingDirectory[comm.design];TerminalIO.WriteRope["ChipmonkOutputDesign\n"];IFRope.IsEmpty[wDir]THENwDir_FileNames.CurrentWorkingDirectory[];TerminalIO.WriteRope["Chipmonkoutputfilename"];IF~Rope.IsEmpty[wDir]THEN{TerminalIO.WriteRopes["(",wDir,")"];};name_TerminalIO.RequestRope[">"];fileName_CDIO.MakeName[name,"chip"];IF~Rope.IsEmpty[wDir]THENfileName_FS.ExpandName[fileName,wDir].fullFName;s_FS.StreamOpen[fileName,create!FS.Error=>IFerror.group#bugTHEN{TerminalIO.WriteRope[error.explanation];GOTOFileIOOpenFailed;}];CDSimpleOps.SelectAll[comm.design];CDSimpleOps.TransformSelected[comm.design,CDOrient.rotate180X];OutputDesign[comm.design,s];IO.Close[s];CDSimpleOps.TransformSelected[comm.design,CDOrient.rotate180X];CDSimpleOps.DeselectAll[comm.design];TerminalIO.WriteRope["endoutput\n"];EXITSFileIOOpenFailed=>{TerminalIO.WriteRope["OpenFailed\n"]};END;levelTab[NMos.cut]_0;levelTab[NMos.dif]_1;levelTab[NMos.pol]_2;levelTab[NMos.met]_3;levelTab[NMos.imp]_4;levelTab[NMos.ovg]_5;levelTab[NMos.bur]_6;levelTab[NMos.cut2]_8;levelTab[NMos.met2]_11;levelTab[NMos.cut2]_15;contactTab[burr]_4;contactTab[mDif]_1;contactTab[butt]_3;contactTab[mPol]_2;contactTab[mm2]_5;ug/Es_,]r[s[!rZ5xsZ5Z5tU? g sU?U?rU?U?PsU?OZ/ rSxsQx rQQfsQQPHxrPHPHds@PHrPHsbPHPHNxzrNNsN%&Lx$O) rKRxsKRrKRKRsKR $D%$Ix$O(++rHxsHrHHsH!F[ "&vDC x8$%Aexy%r?xs?r??s?!'r)R??* s*??+9>xr>>sf>> $rDatools>ChipmonkNmosWrite.mesa!Friday, July 18, 1986 1:54 pm PDT