DIRECTORY CD, CDBasics, CDDirectory, CDInstances, CDSimpleRules, CDSymbolicObjects, CMosB, Core, CoreClasses, CoreGeometry, CoreOps, CoreProperties, HashTable, IO, OnionCore, PW, PWCore, PWPins, Rope, TerminalIO; CRPadFrame: CEDAR PROGRAM IMPORTS CD, CDBasics, CDDirectory, CDInstances, CDSimpleRules, CDSymbolicObjects, CMosB, CoreGeometry, CoreOps, CoreProperties, HashTable, IO, OnionCore, PW, PWCore, PWPins, Rope, TerminalIO SHARES PW = 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: CoreGeometry.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 [OnionCore.SegRec _ [max, min, side, side]], bottom, right => NEW [OnionCore.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.InterestRect[innerCT]; [] _ CoreGeometry.EnumerateSides[PWCore.extractMode.decoration, innerCT, wire, EachPin]; [] _ HashTable.Store[nets, name, net]; }; EachOuterPin: CDSymbolicObjects.InstEnumerator = { seg: Seg; name: ROPE _ CDSymbolicObjects.GetName[inst]; layer: CD.Layer _ CDSymbolicObjects.GetLayer[inst]; sides: CoreGeometry.Sides _ CoreGeometry.GetSides[CD.InterestRect[outer], [inst.ob, inst.trans]]; pos: CD.Position _ CDBasics.BaseOfRect[CDInstances.InstRectO[inst]]; min, max: INT; net: Net _ NARROW [HashTable.Fetch[nets, name].value]; IF layer#CMosB.met THEN { TerminalIO.PutF["*** 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 { TerminalIO.PutF["*** Outer pin %g discarded (no corresponding inner pin)\n", IO.rope[name]]; RETURN; }; FOR side: CoreGeometry.Side IN CoreGeometry.Side DO size: CD.Position = CD.InterestSize[inst.ob]; IF NOT sides[side] THEN LOOP; SELECT side FROM top, bottom => {min _ pos.x-outerBase.x; max _ min + size.x}; left, right => {min _ pos.y-outerBase.x; max _ min + size.y}; ENDCASE => ERROR; seg _ SELECT side FROM top, left => NEW [OnionCore.SegRec _ [max, min, side, side]], bottom, right => NEW [OnionCore.SegRec _ [min, max, side, side]], ENDCASE => ERROR; net.outerSegs _ CONS [seg, net.outerSegs]; ENDLOOP; }; PutDummyPins: PROC [wire: Wire] = {CoreGeometry.PutPins[PWCore.extractMode.decoration, wire, LIST [[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.VisitRootAtomics[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 TerminalIO.PutF["*** Did not finish properly!\n"]; PW.RepositionCell[obj]; CoreOps.VisitRootAtomics[cellType.public, PutDummyPins]; }; DecorateCRPadFrame: PWCore.DecorateProc = { }; [] _ PWCore.RegisterLayoutAtom[$CRPadFrame, LayoutCRPadFrame, DecorateCRPadFrame]; END. ΐCRPadFrame.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Barth, February 26, 1987 5:23:01 pm PST Bertrand Serlet June 1, 1986 8:58:37 pm PDT TerminalIO.PutF["*** 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]; Κh˜codešœ™Kšœ Οmœ1™Jšœžœ-˜AJšžœžœ˜—Jšœžœ˜*J˜—Jšœžœ1˜;Jšœ žœ%˜6Jšžœžœžœžœ#˜Jšœžœžœ˜=Jšžœžœžœ™BJšœ"˜"JšœX˜XJšœ&˜&J˜—š  œ&˜2J˜ Jšœžœ#˜-Jšœžœ*˜3Jšœ2žœ-˜aJšœžœ=˜DJšœ žœ˜Jšœ žœ%˜6šžœžœ˜JšœJžœ žœžœ˜vJšžœ˜J˜—šžœžœžœ˜JšœMžœ ˜\Jšžœ˜J˜—šžœžœž˜3Jšœ-˜-Jšžœžœ žœžœ˜šžœž˜Jšœ>˜>Jšœ>˜>Jšžœžœ˜—šœžœž˜Jšœžœ-˜>Jšœžœ-˜AJšžœžœ˜—Jšœžœ˜*Jšžœ˜—J˜—Jš  œžœ~˜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š žœžœ/žœžœžœ3˜œJšžœ˜Jšœ8˜8J˜J˜—š œ˜+Jšœ˜—J˜JšœR˜RJ˜Kšžœ˜—…—Μτ