DIRECTORY CD, PW, CDIO, CDSymbolicObjects, Core, CoreClasses, CoreFlat, CoreGeometry, CoreOps, CoreProperties, GC, PWCore, PWPins, Rope, RTCoreUtil, RTStructure, Sinix, Sisyph, DABasics, GCHybrid; GCPWCore: CEDAR PROGRAM IMPORTS CDSymbolicObjects, CoreGeometry, CoreOps, CoreProperties, GC, PWCore, PWPins, RTCoreUtil, Sisyph, PW, GCHybrid = BEGIN EachInstanceProc : TYPE = PROC [decoration: CoreGeometry.Decoration, cellInstance: CoreClasses.CellInstance] RETURNS [quit: BOOL _ FALSE]; EnumerateInstances: PUBLIC PROC [decoration: CoreGeometry.Decoration, cellType: Core.CellType, EachInstance: EachInstanceProc] RETURNS [quit: BOOL _ FALSE] ~ { rct: CoreClasses.RecordCellType _ NARROW[cellType.data]; IF rct.size # 0 THEN { FOR i: NAT IN [0..rct.size) DO [] _ EnumerateInstances[decoration, CoreOps.Recast[me: rct[i].type], EachInstance]; [] _ EachInstance[decoration, rct[i]]; ENDLOOP; }; }; HybridLayoutAtom: ATOM _ PWCore.RegisterLayoutAtom[$Hybrid, HybridLayout, HybridDecorate, HybridAttributes]; HybridLayout: PWCore.LayoutProc = { result: GC.Result; context: GC.Context; structure: RTStructure.Structure; name: Rope.ROPE _ CoreOps.GetCellTypeName[cellType]; hMaterial: Rope.ROPE _ "metal"; vMaterial: Rope.ROPE _ "metal2"; design: CD.Design _ PW.OpenDesign["SimpleBPCTest.dale"]; rules: GC.DesignRules _ GC.CreateDesignRules[technologyKey, rulesKey, hMaterial, vMaterial]; structure _ GC.CreateStructure[cellType, RTCoreUtil.defaultFlatten, extractMode.decoration]; GCHybrid.DiddleCells[design, structure]; GC.InitialPlace[structure]; context _ GC.CreateContext["BPCAutoLayout", structure, rules]; GC.DoInitialGlobalRoute[context, none, goodInternal]; result _ GC.DoDetailRoute[context, hybrid]; RETURN[result.object]}; HybridDecorate: PUBLIC PWCore.DecorateProc = { EachPublicPin: PWPins.InstanceEnumerator = { name: Rope.ROPE _ CDSymbolicObjects.GetName[inst]; wire: Core.Wire _ CoreOps.FindWire[cellType.public, name]; pins: LIST OF CoreGeometry.Instance; IF wire=NIL THEN RETURN; pins _ CoreGeometry.GetPins[extractMode.decoration, wire]; CoreGeometry.PutPins[extractMode.decoration, wire, CONS [[inst.ob, inst.trans], pins]]; }; CoreOps.VisitRootAtomics[cellType.public, SmashPins]; [] _ PWPins.EnumerateEdgePins[obj, EachPublicPin]; }; HybridAttributes: PUBLIC PWCore.AttributesProc = {-- [cellType: Core.CellType] FindSideForEachPin: CoreGeometry.EachWirePinProc = { PushPropOnAtomic: PROC [wire: Core.Wire] ~ { CoreProperties.PutWireProp[wire, GC.sideProp, ref]; }; ref: REF _ SELECT side FROM bottom => GC.bottomSideValue, top => GC.topSideValue, right => GC.rightSideValue, left => GC.leftSideValue, ENDCASE => GC.noSideValue; IF wire.size=0 THEN CoreProperties.PutWireProp[wire, GC.sideProp, ref] ELSE CoreOps.VisitRootAtomics[wire, PushPropOnAtomic]; }; EachInstance: EachInstanceProc = {-- [decoration: CoreGeometry.Decoration, cellInstance: CoreClasses.CellInstance] object: CD.Object _ CoreGeometry.GetObject[decoration, cellInstance.type]; box: DABasics.Rect _ object.bbox; trans: DABasics.Position _ CoreGeometry.GetTrans[decoration, cellInstance].off; CoreProperties.PutCellInstanceProp[cellInstance, GC.originProp, NEW[DABasics.Position _ [x: trans.x, y: trans.y]]]; CoreProperties.PutCellInstanceProp[cellInstance, GC.sizeProp, NEW[DABasics.Position _ [x: box.x2-box.x1, y: box.y2-box.y1]]]; CoreProperties.PutCellTypeProp[cellInstance.type, GC.sizeProp, NEW[DABasics.Position _ [x: box.x2-box.x1, y: box.y2-box.y1]]]; }; decoration: CoreGeometry.Decoration _ Sisyph.mode.decoration; DO IF CoreGeometry.HasObject[decoration, cellType] THEN { [] _ CoreGeometry.EnumerateWireSides[decoration, cellType, FindSideForEachPin]; [] _ EnumerateInstances[decoration, cellType, EachInstance]; EXIT}; IF cellType.class.recast = NIL THEN EXIT; cellType _ CoreOps.Recast[cellType]; ENDLOOP; }; GCLayoutAtom: ATOM _ PWCore.RegisterLayoutAtom[$GC, GCLayout, GCDecorate, GCAttributes]; GCLayout: PWCore.LayoutProc = { result: GC.Result; context: GC.Context; structure: RTStructure.Structure; name: Rope.ROPE _ CoreOps.GetCellTypeName[cellType]; hMaterial: Rope.ROPE _ "metal"; vMaterial: Rope.ROPE _ "metal2"; rules: GC.DesignRules _ GC.CreateDesignRules[technologyKey, rulesKey, hMaterial, vMaterial]; structure _ GC.CreateStructure[cellType, RTCoreUtil.defaultFlatten, extractMode.decoration]; GC.InitialPlace[structure]; context _ GC.CreateContext["BPCAutoLayout", structure, rules]; GC.DoInitialGlobalRoute[context, power, goodInternal]; result _ GC.DoDetailRoute[context, generalCell]; RETURN[result.object]}; GCDecorate: PUBLIC PWCore.DecorateProc = { EachPublicPin: PWPins.InstanceEnumerator = { name: Rope.ROPE _ CDSymbolicObjects.GetName[inst]; wire: Core.Wire _ CoreOps.FindWire[cellType.public, name]; pins: LIST OF CoreGeometry.Instance; IF wire=NIL THEN RETURN; pins _ CoreGeometry.GetPins[extractMode.decoration, wire]; CoreGeometry.PutPins[extractMode.decoration, wire, CONS [[inst.ob, inst.trans], pins]]; }; CoreOps.VisitRootAtomics[cellType.public, SmashPins]; [] _ PWPins.EnumerateEdgePins[obj, EachPublicPin]; }; GCAttributes: PUBLIC PWCore.AttributesProc = {-- [cellType: Core.CellType] FindSideForEachPin: CoreGeometry.EachWirePinProc = { PushPropOnAtomic: PROC [wire: Core.Wire] ~ { CoreProperties.PutWireProp[wire, GC.sideProp, ref]; }; ref: REF _ SELECT side FROM bottom => GC.bottomSideValue, top => GC.topSideValue, right => GC.rightSideValue, left => GC.leftSideValue, ENDCASE => GC.noSideValue; IF wire.size=0 THEN CoreProperties.PutWireProp[wire, GC.sideProp, ref] ELSE CoreOps.VisitRootAtomics[wire, PushPropOnAtomic]; }; EachInstance: EachInstanceProc = {-- [decoration: CoreGeometry.Decoration, cellInstance: CoreClasses.CellInstance] object: CD.Object _ CoreGeometry.GetObject[decoration, cellInstance.type]; box: DABasics.Rect _ object.bbox; trans: DABasics.Position _ CoreGeometry.GetTrans[decoration, cellInstance].off; CoreProperties.PutCellInstanceProp[cellInstance, GC.originProp, NEW[DABasics.Position _ [x: trans.x, y: trans.y]]]; CoreProperties.PutCellInstanceProp[cellInstance, GC.sizeProp, NEW[DABasics.Position _ [x: box.x2-box.x1, y: box.y2-box.y1]]]; CoreProperties.PutCellTypeProp[cellInstance.type, GC.sizeProp, NEW[DABasics.Position _ [x: box.x2-box.x1, y: box.y2-box.y1]]]; }; decoration: CoreGeometry.Decoration _ Sisyph.mode.decoration; DO IF CoreGeometry.HasObject[decoration, cellType] THEN { [] _ CoreGeometry.EnumerateWireSides[decoration, cellType, FindSideForEachPin]; [] _ EnumerateInstances[decoration, cellType, EachInstance]; EXIT}; IF cellType.class.recast = NIL THEN EXIT; cellType _ CoreOps.Recast[cellType]; ENDLOOP; }; technologyKey: ATOM _ $cmosB; -- $cmosA or $cmosB rulesKey: ATOM _ $Hybrid; -- $Hybrid or $cmosB libName: Rope.ROPE _ "CMOSB"; extractMode: Sinix.Mode _ PWCore.extractMode; SmashPins: PROC [wire: Core.Wire] = {CoreGeometry.PutPins[extractMode.decoration, wire, NIL]}; END. ˜GCPWCore.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Preas, July 11, 1986 10:15:48 am PDT Massoud Pedram March 11, 1988 6:25:40 pm PST HybridProcs IPMainViewer.BuildViewer["GCTest2"]; IPMainViewer.SetTopTo[NARROW[context.topology], structure.name, FALSE]; CoreGeometry.PutIR[extractMode.decoration, cellType, CD.InterestRect[obj]]; -- Puts on public wires a property indicating their side [wire: Core.Wire, instance: CD.Instance, min: INT, max: INT, side: CoreGeometry.Side, layer: CD.Layer] RETURNS [quit: BOOL _ FALSE] -- Need to decompose coordinates later.-- GCProcs The cellType to layout is a record cellType containing elements to be routed; the layout proc flattens the Core description and calls the general cell router. IPMainViewer.BuildViewer["GCTest2"]; IPMainViewer.SetTopTo[NARROW[context.topology], structure.name, FALSE]; CoreGeometry.PutIR[extractMode.decoration, cellType, CD.InterestRect[obj]]; -- Puts on public wires a property indicating their side [wire: Core.Wire, instance: CD.Instance, min: INT, max: INT, side: CoreGeometry.Side, layer: CD.Layer] RETURNS [quit: BOOL _ FALSE] -- Need to decompose coordinates later.-- Κ – "cedar" style˜codešœ ™ Kšœ Οmœ1™Jšžœ3˜5Jšœ$™$Jšœžœ$žœ™GJšœ žœ ˜+Jšžœ˜K˜—šŸœžœ˜.K˜šŸ œ˜,Kšœ žœ#˜2Kšœ:˜:Kšœžœžœ˜$Kšžœžœžœžœ˜Kšœ:˜:Kšœ3žœ ˜WKšœ˜K˜—Kšœ5˜5KšœK™KKšœ2˜2Kšœ˜—K˜K–6 -- [cellType: Core.CellType] RETURNS [obj: CD.Object]šΟc8™8KšŸœžœ ˜N˜šŸœ"˜4Kšœžœžœžœ"žœžœžœžœ™ƒ–‡ -- [wire: Core.Wire, instance: CD.Instance, min: INT, max: INT, side: CoreGeometry.Side, layer: CD.Layer] RETURNS [quit: BOOL _ FALSE]šŸœžœ˜,Kšœ!žœ˜3K˜—šœžœžœž˜Kšœ žœ˜Kšœžœ˜Kšœ žœ˜Kšœžœ˜Kšžœžœ ˜—Kšžœ žœ"žœ˜GKšžœ2˜6Kšœ˜—K˜šŸ œΠciQ˜sKšœžœ@Οi˜LK˜!K˜OKš‘)™)Kšœ1žœ žœ0˜sKš’1Πik’ £’<˜}Kšœ2žœ žœ<˜~Kšœ˜K˜—Kšœ=˜=šž˜šžœ.žœ˜6KšœO˜OKšœ<˜Jšžœ4˜6Jšœ$™$Jšœžœ$žœ™GJšœ žœ%˜0Jšžœ˜K˜—šŸ œžœ˜*K˜šŸ œ˜,Kšœ žœ#˜2Kšœ:˜:Kšœžœžœ˜$Kšžœžœžœžœ˜Kšœ:˜:Kšœ3žœ ˜WKšœ˜K˜—Kšœ5˜5KšœK™KKšœ2˜2Kšœ˜—K˜K–6 -- [cellType: Core.CellType] RETURNS [obj: CD.Object]š 8™8šŸ œžœ ˜JšŸœ"˜4Kšœžœžœžœ"žœžœžœžœ™ƒ–‡ -- [wire: Core.Wire, instance: CD.Instance, min: INT, max: INT, side: CoreGeometry.Side, layer: CD.Layer] RETURNS [quit: BOOL _ FALSE]šŸœžœ˜,Kšœ!žœ˜3K˜—šœžœžœž˜Kšœ žœ˜Kšœžœ˜Kšœ žœ˜Kšœžœ˜Kšžœžœ ˜—Kšžœ žœ"žœ˜GKšžœ2˜6Kšœ˜—K˜šŸ œ‘Q˜sKšœžœ@’˜LK˜!K˜OKš‘)™)Kšœ1žœ žœ0˜sKš’1£’ £’<˜}Kšœ2žœ žœ<˜~K˜Kšœ˜K˜—Kšœ=˜=šž˜šžœ.žœ˜6KšœO˜OKšœ<˜