DIRECTORY CD, CDBasics, CDDirectory, CDInstances, CDSimpleRules, CDSymbolicObjects, CMosB, Core, CoreClasses, CoreOps, CoreProperties, HashTable, IO, OnionCore, OnionCoreArc, PW, PWCore, PWPins, Rope, Sinix; CRPadFrame: CEDAR PROGRAM IMPORTS CD, CDBasics, CDDirectory, CDInstances, CDSimpleRules, CDSymbolicObjects, CMosB, CoreOps, CoreProperties, HashTable, IO, OnionCore, PW, PWCore, PWPins, Rope, Sinix = BEGIN Wire: TYPE = Core.Wire; CellType: TYPE = Core.CellType; ROPE: TYPE = Rope.ROPE; Net: TYPE = OnionCore.Net; Seg: TYPE = OnionCore.Seg; LayoutCRPadFrame: PWCore.LayoutProc = { AddInnerPinsToNets: PROC [wire: Wire] = { EachPin: PWCore.EachPinProc = { seg: Seg; IF layer#CMosB.met THEN { RETURN; }; SELECT side FROM top, bottom => {min _ min + innerPos.x; max _ max + innerPos.x}; left, right => {min _ min + innerPos.y; max _ max + innerPos.y}; ENDCASE => ERROR; seg _ SELECT side FROM top, left => NEW [OnionCoreArc.SegRec _ [max, min, side, side]], bottom, right => NEW [OnionCoreArc.SegRec _ [min, max, side, side]], ENDCASE => ERROR; net.innerSegs _ CONS [seg, net.innerSegs]; }; name: ROPE _ CoreOps.GetFullWireName[innerCT.public, wire]; net: Net _ NARROW [HashTable.Fetch[nets, name].value]; IF net=NIL THEN net _ NEW [OnionCore.NetRec _ [name: name]]; IF Rope.Equal[name, "Vdd"] THEN net.width _ 200*CMosB.lambda; IF Rope.Equal[name, "Gnd"] THEN net.width _ 96*CMosB.lambda; [] _ PWCore.EnumeratePins[innerCT, wire, EachPin]; [] _ HashTable.Store[nets, name, net]; }; EachOuterPin: PWPins.InstanceEnumerator = { seg: Seg; name: ROPE _ CDSymbolicObjects.GetName[inst]; layer: CD.Layer _ CDSymbolicObjects.GetLayer[inst]; side: PWPins.Side _ PWPins.GetSide[outer, inst]; pos: CD.Position _ CDBasics.BaseOfRect[CDInstances.InstRectO[inst]]; min, max: INT; net: Net _ NARROW [HashTable.Fetch[nets, name].value]; IF layer#CMosB.met THEN { PW.WriteF["*** Outer pin %g not made of met but of %g discarded\n", IO.rope[name], IO.atom[CD.LayerKey[layer]]]; RETURN; }; IF net=NIL THEN { PW.WriteF["*** Outer pin %g discarded (no corresponding inner pin)\n", IO.rope[name]]; RETURN; }; SELECT side FROM top, bottom => {min _ pos.x-outerBase.x; max _ min + inst.ob.size.x}; left, right => {min _ pos.y-outerBase.x; max _ min + inst.ob.size.y}; ENDCASE => ERROR; seg _ SELECT side FROM top, left => NEW [OnionCoreArc.SegRec _ [max, min, side, side]], bottom, right => NEW [OnionCoreArc.SegRec _ [min, max, side, side]], ENDCASE => ERROR; net.outerSegs _ CONS [seg, net.outerSegs]; }; PutDummyPins: PROC [wire: Wire] = {Sinix.PutPinsProp[PWCore.extractMode, wire, LIST [PWPins.NewInstance[CDSimpleRules.Rect[[16, 16], CMosB.met]]]]}; design: CD.Design _ NARROW [CoreProperties.GetCellTypeProp[cellType, $PWCoreSourceDesign]]; recordData: CoreClasses.RecordCellType = NARROW [cellType.data]; innerCT, outerCT: CellType; inner, outer: CD.Object; nets: HashTable.Table _ HashTable.Create[5, HashTable.RopeEqual, HashTable.HashRope]; innerPos, outerBase: CD.Position; IF Rope.Equal[CoreOps.GetCellTypeName[recordData[0].type], "CrossRAMInner"] THEN {innerCT _ recordData[0].type; outerCT _ recordData[1].type} ELSE {outerCT _ recordData[0].type; innerCT _ recordData[1].type}; inner _ PWCore.Layout[innerCT]; outer _ CDDirectory.Fetch[design, "CrossRAMPadFrame.mask"].object; outerBase _ CDBasics.BaseOfRect[CD.InterestRect[outer]]; innerPos _ [107*CMosB.lambda, 27*CMosB.lambda]; obj _ PW.CreateEmptyCell[]; CoreOps.VisitAtomicWires[innerCT.public, AddInnerPinsToNets]; [] _ PWPins.EnumerateDeepPins[outer, EachOuterPin]; [] _ PW.IncludeInCell[obj, inner, innerPos]; [] _ PW.IncludeInCell[obj, outer]; IF NOT OnionCore.IncludeInOuter[obj, nets, innerPos, CD.InterestSize[inner], CD.InterestSize[outer]] THEN PW.WriteF["*** Did not finish properly!\n"]; PW.RepositionCell[obj]; CoreOps.VisitAtomicWires[cellType.public, PutDummyPins]; }; DecorateCRPadFrame: PWCore.DecorateProc = {}; [] _ PWCore.RegisterLayoutAtom[$CRPadFrame, LayoutCRPadFrame, DecorateCRPadFrame]; END. ¸CRPadFrame.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Barth, March 27, 1986 9:56:04 am PST Bertrand Serlet June 1, 1986 8:58:37 pm PDT PW.WriteF["*** Inner pin %g not made of met but of %g discarded\n", IO.rope[name], IO.atom[CD.LayerKey[layer]]]; IF Rope.Equal[name, "Net3"] THEN {net.routeEveryOuterSeg _ FALSE}; innerPos _ OnionCore.Center[inner, outer]; innerPos _ [107*CMosB.lambda, 2722*CMosB.lambda]; ʘcodešœ™Kšœ Ïmœ1™Jšœžœžœ˜=Jšžœžœžœ™BJšœ2˜2Jšœ&˜&J˜—š  œ˜+J˜ Jšœžœ#˜-Jšœžœ*˜3Jšœ0˜0Jšœžœ=˜DJšœ žœ˜Jšœ žœ%˜6šžœžœ˜JšžœBžœ žœžœ˜pJšžœ˜J˜—šžœžœžœ˜JšžœEžœ ˜VJšžœ˜J˜—šžœž˜JšœF˜FJšœF˜FJšžœžœ˜—šœžœž˜Jšœžœ0˜AJšœžœ0˜DJšžœžœ˜—Jšœžœ˜*J˜—Jš  œžœ=žœA˜”Jšœžœ žœA˜[Jšœ)žœ˜@Jšœ˜Jšœžœ˜JšœU˜UJšœžœ ˜!šžœJ˜LJšžœ>˜BJšžœ>˜B—Jšœ˜JšœB˜BJšœ*™*Jšœ žœ˜8Jšœ/˜/Jšœ1™1Jšœžœ˜Jšœ=˜=J˜3Jšœžœ%˜,Jšœžœ˜"Jš žœžœ/žœžœžœžœ*˜–Jšžœ˜J˜8J˜J˜—Jš œ˜-J˜JšœR˜RJ˜Kšžœ˜—…—¨r