DIRECTORY CD, CDAtomicObjects, CDBasics, CDCommandOps, CDOps, CDStretchyExtras, CMosB, Rope; CMosBObsImpl: CEDAR PROGRAM IMPORTS CD, CDAtomicObjects, CDBasics, CDCommandOps, CDOps, CDStretchyExtras, CMosB, Rope = BEGIN lambda: CD.Number = CMosB.lambda; wellSurround: CD.Number = CMosB.wellSurround; MatchTrans: PROC [me: CD.Object, r: CD.Rect, layer: CD.Layer, prim: BOOL, horz: BOOL] RETURNS [BOOL] = BEGIN RETURN [layer=me.layer OR layer=CMosB.pol] END; wellTransClass: CD.ObjectClass; transClass: CD.ObjectClass; FillTransistor: PROC [ob: CD.Object] RETURNS [mustFail: BOOL_FALSE] = BEGIN dExt: CD.Number = 3*lambda; pExt: CD.Number = 2*lambda; wellSurr: CD.Number _ 0; innerX: CD.Number _ 0; dif: CD.Layer; ob.size _ CDBasics.MaxPoint[ob.size, [2*lambda+2*pExt, 2*lambda+2*dExt]]; IF ob.layer=CMosB.wpdif OR ob.layer=CMosB.wndif THEN { ob.class _ wellTransClass; wellSurr _ wellSurround; innerX _ wellSurround-pExt; IF ob.layer=CMosB.wpdif THEN dif _ CMosB.pdif ELSE dif _ CMosB.ndif; ob.size.x _ ob.size.x + 2*wellSurround-2*pExt; ob.size.y _ ob.size.y + 2*wellSurround; } ELSE { IF ob.layer=CMosB.pdif THEN dif _ CMosB.pdif ELSE dif _ CMosB.ndif; }; IF wellSurr#0 THEN CDAtomicObjects.Incorporate[ob: ob, r: [x1: 0, x2: ob.size.x, y1: 0, y2: ob.size.y], lev: (IF dif=CMosB.pdif THEN CMosB.nwell ELSE CMosB.pwell), inside: FALSE ]; CDAtomicObjects.Incorporate[ob: ob, r: [x1: innerX+pExt, x2: ob.size.x-pExt-innerX, y1: wellSurr, y2: ob.size.y-wellSurr], lev: dif ]; CDAtomicObjects.Incorporate[ob: ob, r: [x1: innerX, x2: ob.size.x-innerX, y1: wellSurr+dExt, y2: ob.size.y-wellSurr-dExt], lev: CMosB.pol ]; END; DescribeT: PROC[me: CD.Object] RETURNS [Rope.ROPE] = BEGIN dExt: CD.Number = 3*lambda; pExt: CD.Number = 2*lambda; sz: CD.Position = CD.InterestSize[me]; RETURN [ Rope.Cat[ "transistor ", CDOps.LayerName[me.layer], Rope.Cat[ " [", CDCommandOps.LambdaRope[sz.x-2*pExt, lambda], CDCommandOps.LambdaRope[sz.y-2*dExt, lambda], "]" ] ] ] END; lTransClass: CD.ObjectClass; wellLTransClass: CD.ObjectClass; oldBadWellLTransClass: CD.ObjectClass; OldBadFillLTransistor: PROC [ob: CD.Object] RETURNS [mustFail: BOOL_FALSE] = { ob.class _ lTransClass; RETURN [FillLTransistor[ob]] }; FillLTransistor: PROC [ob: CD.Object] RETURNS [mustFail: BOOL_FALSE] = BEGIN pExt: CD.Number = 2*lambda; --poly extends gate dExt: CD.Number = 3*lambda; --diffusion extends gate dW: CD.Number = 2*lambda; --witdth of diffusion in gate (not width of gate) pW: CD.Number = 2*lambda; --witdth of poly in gate (not width of gate) minSz: CD.Number = pExt+2*dExt+dW; wellSurr: CD.Number _ 0; innerX: CD.Number _ 0; dif: CD.Layer; ob.size _ CDBasics.MaxPoint[ob.size, [minSz, minSz]]; IF ob.layer=CMosB.wpdif OR ob.layer=CMosB.wndif THEN { ob.class _ wellLTransClass; wellSurr _ wellSurround; innerX _ wellSurround-pExt; ob.size.x _ ob.size.x + 2*wellSurround-pExt; ob.size.y _ ob.size.y + 2*wellSurround-pExt; IF ob.layer=CMosB.wpdif THEN dif _ CMosB.pdif ELSE dif _ CMosB.ndif; } ELSE { IF ob.layer=CMosB.pdif THEN dif _ CMosB.pdif ELSE dif _ CMosB.ndif; }; IF wellSurr#0 THEN { wR: CD.Rect; CDAtomicObjects.Incorporate[ob: ob, r: [x1: 0, x2: ob.size.x, y1: 0, y2: 2*wellSurr+dW+2*dExt], lev: (IF dif=CMosB.pdif THEN CMosB.nwell ELSE CMosB.pwell), inside: FALSE ]; wR _ [x1: ob.size.x-(2*wellSurr+dW+2*dExt), x2: ob.size.x, y1: 2*wellSurr+dW+2*dExt, y2: ob.size.y]; IF CDBasics.NonEmpty[wR] THEN CDAtomicObjects.Incorporate[ob: ob, r: wR, lev: (IF dif=CMosB.pdif THEN CMosB.nwell ELSE CMosB.pwell), inside: FALSE ]; }; CDAtomicObjects.Incorporate[ob: ob, r: [x1: innerX+pExt, x2: ob.size.x-wellSurr, y1: wellSurr, y2: wellSurr+2*dExt+dW], lev: dif ]; IF wellSurr+2*dExt+dW < ob.size.y-innerX-pExt THEN CDAtomicObjects.Incorporate[ob: ob, r: [x1: ob.size.x-wellSurr-2*dExt-dW, x2: ob.size.x-wellSurr, y1: wellSurr+2*dExt+dW, y2: ob.size.y-innerX-pExt ], lev: dif ]; CDAtomicObjects.Incorporate[ob: ob, r: [x1: innerX, x2: ob.size.x-wellSurr-dExt, y1: wellSurr+dExt, y2: wellSurr+dExt+pW], lev: CMosB.pol ]; CDAtomicObjects.Incorporate[ob: ob, r: [x1: ob.size.x-wellSurr-pW-dExt, x2: ob.size.x-wellSurr-dExt, y1: wellSurr+pW+dExt, y2: ob.size.y-innerX], lev: CMosB.pol ]; END; simpleContactClass: CD.ObjectClass; wellSimpleContactClass: CD.ObjectClass; largeContactClass: CD.ObjectClass; wellLargeContactClass: CD.ObjectClass; FillSimpleCon: PROC [ob: CD.Object] RETURNS [mustFail: BOOL_FALSE] = BEGIN rimW: CD.Number = lambda; -- therefore NOT large wellSurr: CD.Number _ 0; dif: CD.Layer; IF ob.layer=CMosB.wpdif OR ob.layer=CMosB.wndif THEN { ob.class _ wellSimpleContactClass; wellSurr _ wellSurround; dif _ (IF ob.layer=CMosB.wpdif THEN CMosB.pdif ELSE CMosB.ndif); } ELSE { dif _ ob.layer }; ob.size _ [2*lambda+2*rimW+2*wellSurr, 2*lambda+2*rimW+2*wellSurr]; IF wellSurr#0 THEN CDAtomicObjects.Incorporate[ob: ob, r: [x1: 0, x2: ob.size.x, y1: 0, y2: ob.size.y], lev: (IF dif=CMosB.pdif THEN CMosB.nwell ELSE CMosB.pwell), inside: FALSE ]; CDAtomicObjects.Incorporate[ob: ob, r: [x1: wellSurr, x2: ob.size.x-wellSurr, y1: wellSurr, y2: ob.size.y-wellSurr], lev: dif ]; CDAtomicObjects.Incorporate[ob: ob, r: [x1: wellSurr, x2: ob.size.x-wellSurr, y1: wellSurr, y2: ob.size.y-wellSurr], lev: CMosB.met ]; CDAtomicObjects.Incorporate[ob: ob, r: [x1: wellSurr+rimW, x2: ob.size.x-rimW-wellSurr, y1: wellSurr+rimW, y2: ob.size.y-rimW-wellSurr], lev: CMosB.cut ]; END; FillLargeSimpleCon: PROC [ob: CD.Object] RETURNS [mustFail: BOOL_FALSE] = BEGIN rimW: CD.Number = 2*lambda; -- therefore large wellSurr: CD.Number _ 0; dif: CD.Layer; IF ob.layer=CMosB.wpdif OR ob.layer=CMosB.wndif THEN { ob.class _ wellLargeContactClass; wellSurr _ wellSurround; dif _ (IF ob.layer=CMosB.wpdif THEN CMosB.pdif ELSE CMosB.ndif); } ELSE { dif _ ob.layer }; ob.size.x _ MAX[ob.size.x, 2*lambda+2*rimW+2*wellSurr]; ob.size.y _ MAX[ob.size.y, 2*lambda+2*rimW+2*wellSurr]; IF wellSurr#0 THEN CDAtomicObjects.Incorporate[ob: ob, r: [x1: 0, x2: ob.size.x, y1: 0, y2: ob.size.y], lev: (IF dif=CMosB.pdif THEN CMosB.nwell ELSE CMosB.pwell), inside: FALSE ]; CDAtomicObjects.Incorporate[ob: ob, r: [x1: wellSurr, x2: ob.size.x-wellSurr, y1: wellSurr, y2: ob.size.y-wellSurr], lev: dif ]; CDAtomicObjects.Incorporate[ob: ob, r: [x1: wellSurr, x2: ob.size.x-wellSurr, y1: wellSurr, y2: ob.size.y-wellSurr], lev: CMosB.met ]; CDAtomicObjects.Incorporate[ob: ob, r: [x1: wellSurr+rimW, x2: ob.size.x-rimW-wellSurr, y1: wellSurr+rimW, y2: ob.size.y-rimW-wellSurr], lev: CMosB.cut ]; END; DescribeC: PROC[me: CD.Object] RETURNS [Rope.ROPE] = BEGIN RETURN [Rope.Cat["contact ", CDOps.LayerName[me.layer]]] END; DescribeLargeC: PROC[me: CD.Object] RETURNS [Rope.ROPE] = BEGIN RETURN [Rope.Cat["large contact ", CDOps.LayerName[me.layer]]] END; wellDifShortContactClass: CD.ObjectClass; FillDifShortCon: PROC [ob: CD.Object] RETURNS [mustFail: BOOL_FALSE] = BEGIN dif: CD.Layer; wellSurr: CD.Number _ 0; inr: CD.Rect; innerW: CD.Number = 4*lambda; innerH: CD.Number = 8*lambda; h: CD.Number = innerH/2; IF ob.layer=CMosB.wpdif OR ob.layer=CMosB.wndif THEN { ob.class _ wellDifShortContactClass; wellSurr _ wellSurround; IF ob.layer=CMosB.wpdif THEN dif _ CMosB.pdif ELSE dif _ CMosB.ndif; inr _ [x1: wellSurr, y1: wellSurr, x2: wellSurr+innerW, y2: wellSurr+innerH]; ob.size _ [innerW+2*wellSurr, innerH+2*wellSurr-h]; } ELSE { IF ob.layer=CMosB.pdif THEN dif _ CMosB.pdif ELSE dif _ CMosB.ndif; inr _ [x1: 0, y1: 0, x2: innerW, y2: innerH]; ob.size _ [innerW, innerH]; }; IF wellSurr#0 THEN CDAtomicObjects.Incorporate[ob: ob, r: [x1: 0, x2: ob.size.x, y1: 0, y2: ob.size.y], lev: (IF dif=CMosB.pdif THEN CMosB.nwell ELSE CMosB.pwell), inside: FALSE ]; CDAtomicObjects.Incorporate[ob: ob, r: inr, lev: CMosB.met]; CDAtomicObjects.Incorporate[ob: ob, r: [x1: inr.x1, x2: inr.x2, y1: inr.y1, y2: inr.y1+h], lev: dif ]; CDAtomicObjects.Incorporate[ob: ob, r: [x1: inr.x1, x2: inr.x2, y1: inr.y1+h, y2: inr.y2], lev: (IF dif=CMosB.pdif THEN CMosB.nwellCont ELSE CMosB.pwellCont) ]; CDAtomicObjects.Incorporate[ob: ob, r: [x1: inr.x1+lambda, x2: inr.x2-lambda, y1: inr.y1+lambda, y2: inr.y2-lambda], lev: CMosB.cut ]; END; FillVia: PROC [ob: CD.Object] RETURNS [mustFail: BOOL_FALSE] = BEGIN viaRimWidth: CD.Number = lambda; cut2min: CD.Number = 2*lambda; ob.size _ [cut2min+2*viaRimWidth, cut2min+2*viaRimWidth]; ob.layer _ CMosB.met2; CDAtomicObjects.Incorporate[ob: ob, r: [x1: 0, x2: ob.size.x, y1: 0, y2: ob.size.y], lev: CMosB.met2 ]; CDAtomicObjects.Incorporate[ob: ob, r: [x1: 0, x2: ob.size.x, y1: 0, y2: ob.size.y], lev: CMosB.met ]; CDAtomicObjects.Incorporate[ob: ob, r: [x1: viaRimWidth, x2: ob.size.x-viaRimWidth, y1: viaRimWidth, y2: ob.size.y-viaRimWidth], lev: CMosB.cut2 ]; END; FillLargeVia: PROC [ob: CD.Object] RETURNS [mustFail: BOOL_FALSE] = BEGIN viaRimWidth: CD.Number = 2*lambda; cut2min: CD.Number = 2*lambda; ob.size.x _ MAX[ob.size.x, cut2min+2*viaRimWidth]; ob.size.y _ MAX[ob.size.y, cut2min+2*viaRimWidth]; ob.layer _ CMosB.met2; CDAtomicObjects.Incorporate[ob: ob, r: [x1: 0, x2: ob.size.x, y1: 0, y2: ob.size.y], lev: CMosB.met2 ]; CDAtomicObjects.Incorporate[ob: ob, r: [x1: 0, x2: ob.size.x, y1: 0, y2: ob.size.y], lev: CMosB.met ]; CDAtomicObjects.Incorporate[ob: ob, r: [x1: viaRimWidth, x2: ob.size.x-viaRimWidth, y1: viaRimWidth, y2: ob.size.y-viaRimWidth], lev: CMosB.cut2 ]; END; MatchSimpleCon: PROC [me: CD.Object, r: CD.Rect, layer: CD.Layer, prim: BOOL, horz: BOOL] RETURNS [BOOL] = BEGIN RETURN [layer=me.layer OR layer=CMosB.met] END; Init: PROC [] = BEGIN Register: PROC [key: ATOM, creator: CDAtomicObjects.FillObjectProc, desc: Rope.ROPE, match: CDStretchyExtras.MatchProc_NIL] RETURNS [p: CD.ObjectClass] = BEGIN p _ CDAtomicObjects.RegisterAtomicObClass[key, creator, desc, CMosB.cmosB]; IF p=NIL THEN ERROR; IF match=NIL THEN match _ MatchSimpleCon; CDStretchyExtras.InstallMatch[p, match]; END; transClass _ Register[$C2Trans, FillTransistor, "transistor", MatchTrans]; transClass.describe _ DescribeT; wellTransClass _ Register[$C2WellTrans, FillTransistor, "transistor", MatchTrans]; wellTransClass.describe _ DescribeT; lTransClass _ Register[$C2LTrans, FillLTransistor, "L-transistor", MatchTrans]; oldBadWellLTransClass _ Register[$CLWellTrans, OldBadFillLTransistor, "L-transistor", MatchTrans]; wellLTransClass _ Register[$C2LWellTrans, FillLTransistor, "L-transistor", MatchTrans]; simpleContactClass _ Register[$C2SimpleCon, FillSimpleCon, "contact"]; simpleContactClass.describe _ DescribeC; wellSimpleContactClass _ Register[$C2WellSimpleCon, FillSimpleCon, "contact"]; wellSimpleContactClass.describe _ DescribeC; largeContactClass _ Register[$C2LargeSimpleCon, FillLargeSimpleCon, "large contact"]; largeContactClass.describe _ DescribeLargeC; wellLargeContactClass _ Register[$C2LargeWellSimpleCon, FillLargeSimpleCon, "large contact"]; wellLargeContactClass.describe _ DescribeLargeC; [] _ Register[$C2DifShortCon, FillDifShortCon, "dif short contact"]; wellDifShortContactClass _ Register[$C2WellDifShortCon, FillDifShortCon, "dif short contact"]; [] _ Register[$C2Via, FillVia, "via"]; [] _ Register[$C2LargeVia, FillLargeVia, "large via"]; END; Init[]; END. CMosBObsImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Christian Jacobi, March 22, 1985 11:09:09 am PST last edited Christian Jacobi, March 25, 1986 3:56:17 pm PST gbb May 30, 1986 12:37:21 pm PDT -- straight transistors -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --poly, dif, welldif, via -- Don't care about different diffusions and such -- L transistors -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --horizontal piece of nwell --vertical piece of nwell if ~empty -- simple contacts -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- DifShort -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --via -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --poly, dif, welldif, via -- Don't care about different diffusions and such --transistors --contacts ʘšœ™Jšœ Ïmœ1™Jšžœ˜—J˜JšœZ™ZJ˜Jšœžœ ˜)J˜š  œžœžœ žœ žœžœ˜HJšž˜Jšœžœ˜Jšœ žœ ˜Jšœžœ˜Jšœžœ˜Jšœžœ˜Jšœžœ˜šžœžœžœ˜6Jšœ$˜$Jšœ˜Jšžœžœžœ˜DJšœM˜MJšœ3˜3J˜—šžœ˜Jšžœžœžœ˜CJšœ-˜-Jšœ˜J˜—šžœ ž˜šœ$˜$Jšœ1˜1Jšœžœžœ žœ˜;Jšœž˜ Jšœ˜——Jšœ<˜<šœ$˜$šœ˜Jšœ ˜ Jšœ ˜ Jšœ˜—Jšœ˜Jšœ˜—šœ$˜$šœ˜Jšœ ˜ Jšœ˜Jšœ ˜ —Jšœžœžœžœ˜BJšœ˜—šœ$˜$šœ˜Jšœ˜Jšœ˜Jšœ˜—Jšœ˜Jšœ˜—Jšžœ˜J˜J˜—J˜Jšœ`™`J˜š  œžœžœ žœ žœžœ˜@Jšž˜Jšœ žœ˜ Jšœ žœ˜Jšœ9˜9Jšœ˜šœ$˜$Jšœ1˜1Jšœ˜Jšœ˜—šœ$˜$Jšœ1˜1Jšœ˜Jšœ˜—šœ$˜$šœ˜Jšœ˜Jšœ˜Jšœ˜—Jšœ˜Jšœ˜—Jšžœ˜J˜—š   œžœžœ žœ žœžœ˜EJšž˜Jšœ žœ˜"Jšœ žœ˜Jšœ žœ#˜2Jšœ žœ#˜2Jšœ˜šœ$˜$Jšœ1˜1Jšœ˜Jšœ˜—šœ$˜$Jšœ1˜1Jšœ˜Jšœ˜—šœ$˜$šœ˜Jšœ˜Jšœ˜Jšœ˜—Jšœ˜Jšœ˜—Jšžœ˜J˜—JšœZ™ZJ˜š œžœžœ žœžœžœžœžœžœ˜jJšœ™Jšž˜Jšœ1™1Jšžœžœ˜*Jšžœ˜—J˜š œžœ˜Jšž˜J˜š œžœžœ6žœ$žœžœžœ˜™Jšž˜JšœK˜KJšžœžœžœžœ˜Jšžœžœžœ˜*Jšœ(˜(Jšžœ˜—J™Jšœ ™ JšœJ˜JJšœ ˜ JšœR˜RJšœ$˜$JšœO˜OJšœb˜bJšœW˜WJ˜Jšœ ™ JšœF˜FJšœ(˜(JšœN˜NJšœ,˜,J˜JšœU˜UJšœ,˜,Jšœ]˜]Jšœ0˜0J˜JšœD˜DJšœ^˜^J˜Jšœ&˜&Jšœ6˜6Jšžœ˜J˜—J˜Jšžœ˜J˜—…—+Ò?