DIRECTORY CD, CDBasics, CDCleanUp, CDDirectory, CDInstances, CDIO, CDOps, CDProperties, CDRects, CDSimpleRules, CDTexts, CDValue, Core, CoreClasses, CoreIO, CoreOps, CoreProperties, HashTable, IO, LayoutCheckpoint, PW, PWCore, Sinix; LayoutCheckpointImpl: CEDAR PROGRAM IMPORTS CD, CDBasics, CDCleanUp, CDDirectory, CDInstances, CDIO, CDOps, CDProperties, CDRects, CDSimpleRules, CDTexts, CDValue, CoreClasses, CoreIO, CoreOps, CoreProperties, HashTable, IO, PW, PWCore, Sinix EXPORTS LayoutCheckpoint SHARES CDRects, PWCore = BEGIN OPEN LayoutCheckpoint; Store: PUBLIC PROC [cellType: CellType, withCuteFonts: BOOL _ FALSE] = { props: LIST OF ATOM; classes: LIST OF Core.CellClass; name: ROPE _ CoreOps.GetCellTypeName[cellType]; PW.WriteF["Saving the Core for cell %g ...\n", IO.rope[name]]; [props, classes] _ CoreIO.ReportSaveCellType[cellType]; PW.WriteF["... core stored in %g.core ...\n", IO.rope[name]]; Checkpoint[cellType, withCuteFonts]; }; Retrieve: PUBLIC PROC [name: ROPE] RETURNS [cellType: CellType] = { PW.WriteF["Retrieving the Core for cell %g ...\n", IO.rope[name]]; cellType _ CoreIO.RestoreCellType[name]; PW.WriteF["... core retrieved in %g.core ...\n", IO.rope[name]]; SetFromCheckpoint[cellType]; }; Checkpoint: PUBLIC PROC [cellType: CellType, withCuteFonts: BOOL _ FALSE] = { font: CDTexts.CDFont _ CDTexts.MakeFont["Xerox/TiogaFonts/Helvetica8", 4]; fontTable: HashTable.Table _ HashTable.Create[equal: HashTable.RopeEqual, hash: HashTable.HashRope]; CreateText: PROC [name: ROPE] RETURNS [obj: CD.Object] = { obj _ NARROW [HashTable.Fetch[fontTable, name].value]; IF obj#NIL THEN RETURN; obj _ CDTexts.CreateText[name, font]; [] _ HashTable.Store[fontTable, name, obj]; }; EachWirePin: PWCore.EachWirePinProc = { minW: INT _ CDSimpleRules.MinWidth[layer]; wireName: ROPE _ CoreOps.GetFullWireName[cellType.public, wire]; pos: CD.Position _ SELECT side FROM left => [0, min], right => [iSize.x-minW, min], top => [min, iSize.y-minW], bottom => [min, 0], ENDCASE => ERROR; inst: CD.Instance _ PW.IncludeInCell[shell, CDSimpleRules.Rect[IF side=left OR side=right THEN [minW, max-min] ELSE [max-min, minW], layer], pos]; inst.properties _ CDProperties.DCopyProps[instance.properties]; CDProperties.PutInstanceProp[inst, $InstanceName, wireName]; IF withCuteFonts THEN [] _ PW.IncludeInCell[ shell, CreateText[wireName], SELECT side FROM left => [pos.x-300, pos.y], right => [pos.x+minW+10, pos.y], top => [pos.x, pos.y+minW+10], bottom => [pos.x, pos.y-300], ENDCASE => ERROR, SELECT side FROM left, right => 0, top, bottom => 2, ENDCASE => ERROR ]; }; sourceObj: CD.Object _ PWCore.Layout[cellType]; iSize: CD.Position _ CD.InterestSize[sourceObj]; name: ROPE _ CoreOps.GetCellTypeName[cellType]; layoutFileName: ROPE _ IO.PutFR["%gLayout", IO.rope[name]]; shellFileName: ROPE _ IO.PutFR["%gShell", IO.rope[name]]; layoutDesign: CD.Design _ CDOps.CreateDesign[CD.FetchTechnology[$cmosB]]; shellDesign: CD.Design _ CDOps.CreateDesign[CD.FetchTechnology[$cmosB]]; shell: CD.Object _ PW.CreateEmptyCell[]; PW.WriteF["Making shell for cell %g ...\n", IO.rope[name]]; [] _ PWCore.EnumerateWirePins[cellType, EachWirePin]; PW.SetInterestRect[shell, iSize]; PW.RepositionCell[shell]; layoutDesign.name _ layoutFileName; shellDesign.name _ shellFileName; [] _ CDDirectory.Include[layoutDesign, sourceObj, name]; [] _ CDDirectory.Include[shellDesign, shell, name]; CDOps.IncludeObjectI[layoutDesign, sourceObj]; CDOps.IncludeObjectI[shellDesign, shell]; CDValue.Store[layoutDesign, $KeepObjects, $KeepObjects]; -- to avoid finalization!!! Have you ever seen objects of class: GCollected?? CDValue.Store[shellDesign, $KeepObjects, $KeepObjects]; -- to avoid finalization!!! Have you ever seen objects of class: GCollected?? CDCleanUp.CleanUp[layoutDesign]; CDCleanUp.CleanUp[shellDesign]; [] _ CDIO.WriteDesign[layoutDesign, layoutFileName]; [] _ CDIO.WriteDesign[shellDesign, shellFileName]; FlushLayoutProperties[cellType]; PW.FlushSharedCache[]; SetFromCheckpoint[cellType]; PW.WriteF["... layout checkpoint stored in %gLayout.dale and %gShell.dale\n", IO.rope[name], IO.rope[name]]; }; SetFromCheckpoint: PUBLIC PROC [cellType: CellType] = { PWCore.SetLayout[cellType, $RetrieveLayout]; }; RetrieveLayout: PWCore.LayoutProc = { name: ROPE _ CoreOps.GetCellTypeName[cellType]; layoutFileName: ROPE _ IO.PutFR["%gLayout", IO.rope[name]]; layoutDesign: CD.Design _ PW.OpenDesign[layoutFileName]; obj _ PW.Get[layoutDesign, name]; }; RetrieveDecorate: PWCore.DecorateProc = { name: ROPE _ CoreOps.GetCellTypeName[cellType]; shellFileName: ROPE _ IO.PutFR["%gShell", IO.rope[name]]; shellDesign: CD.Design _ PW.OpenDesign[shellFileName]; shell: CD.Object _ PW.Get[shellDesign, name]; cellPtr: CD.CellPtr _ NARROW [shell.specificRef]; offset: CD.Position _ CDBasics.SubPoints[CDBasics.BaseOfRect[CD.InterestRect[obj]], CDBasics.BaseOfRect[CD.InterestRect[shell]]]; IF CD.InterestSize[shell]#CD.InterestSize[obj] THEN ERROR; FOR list: LIST OF CD.Instance _ cellPtr.contents, list.rest WHILE list#NIL DO wireName: ROPE _ NARROW [CDProperties.GetInstanceProp[list.first, $InstanceName]]; wire: Wire; instance: CD.Instance _ CDInstances.Copy[list.first]; IF list.first.ob.class#CDRects.bareRectClass THEN LOOP; wire _ CoreOps.FindWire[cellType.public, wireName]; IF wireName=NIL OR wire=NIL THEN ERROR; CDInstances.Translate[instance, offset]; Sinix.AddPinsProp[PWCore.extractMode, wire, instance]; ENDLOOP; }; FlushLayoutProperties: PUBLIC PROC [cellType: CellType] = { FlushPin: PROC [wire: Wire] = {Sinix.PutPinsProp[PWCore.extractMode, wire, NIL]}; IF ~PWCore.HasLayout[cellType] THEN RETURN; IF CoreProperties.GetCellTypeProp[cellType, PWCore.layoutAtomProp]=NIL THEN RETURN; CoreOps.VisitAtomicWires[cellType.public, FlushPin]; PWCore.CancelLayout[cellType]; SELECT TRUE FROM cellType.class=CoreClasses.recordCellClass => { data: CoreClasses.RecordCellType _ NARROW [cellType.data]; FlushGeometry: PROC [wire: Wire] = { Sinix.PutWireGeometryProp[PWCore.extractMode, wire, NIL]; }; CoreOps.VisitAtomicWires[cellType.public, FlushGeometry]; FOR i: NAT IN [0 .. data.size) DO CoreProperties.PutCellInstanceProp[data[i], PWCore.extractMode.instanceProp, NIL]; FlushLayoutProperties[data[i].type]; ENDLOOP; }; CoreOps.Recast[cellType]#NIL => FlushLayoutProperties[CoreOps.Recast[cellType]]; ENDCASE => PWCore.Signal[]; }; [] _ PWCore.RegisterLayoutAtom[$RetrieveLayout, RetrieveLayout, RetrieveDecorate]; END. φLayoutCheckpointImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reversed. Bertrand Serlet June 3, 1986 11:21:55 pm PDT Storing and retrieving entire Core + Layout Storing and retrieving layout CleanUp[layoutDesign]; CleanUp[shellDesign]; CleanUpOb: PROC [cleaned: HashTable.Table, obj: CD.Object] RETURNS [clean: CD.Object] = { clean _ NARROW [HashTable.Fetch[cleaned, obj].value]; SELECT TRUE FROM clean#NIL => RETURN; CDCells.IsCell[obj] => { FOR instList: CD.InstanceList _ NARROW [obj.specificRef, CD.CellPtr].contents, instList.rest WHILE instList#NIL DO instList.first.ob _ CleanUpOb[cleaned, instList.first.ob]; ENDLOOP; clean _ obj; }; obj.class.internalWrite#NIL => RETURN [obj]; ENDCASE => { clean _ CDDirectory.Expand[obj].new; IF clean=NIL THEN ERROR; clean _ CleanUpOb[cleaned, clean]; }; [] _ HashTable.Insert[cleaned, obj, clean]; }; CleanUp: PROC [design: CD.Design] = { cleaned: HashTable.Table _ HashTable.Create[]; FOR instList: CD.InstanceList _ CDOps.InstList[design], instList.rest WHILE instList#NIL DO instList.first.ob _ CleanUpOb[cleaned, instList.first.ob]; ENDLOOP; }; Flushing Layout Properties Warning: it is dangerous to use this function without being aware of PWCore implementation details. Initialization Κ¦˜– "Cedar" stylešœ™Jšœ Οmœ1™Jšœ7˜7Kšžœ,žœ ˜=Jšœ$˜$J˜J™—š  œžœžœžœžœ˜CJšžœ1žœ ˜BJšœ(˜(Kšžœ/žœ ˜@Jšœ˜J˜——™š   œžœžœ%žœžœ˜MJšœJ˜JJšœd˜dš   œžœžœžœžœ ˜:Jšœžœ*˜6Jšžœžœžœžœ˜Jšœ%˜%Jšœ+˜+J˜—š  œ˜'Kšœžœ!˜*Jšœ žœ2˜@šœžœ žœž˜#Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšžœžœ˜—Kš œžœ žœ)žœ žœ žœžœ˜’Kšœ?˜?Kšœ<˜<šžœžœžœ˜,Kšœ˜Kšœ˜Kšžœžœ{žœžœ˜Kšžœžœ%žœž˜EKšœ˜—J˜—Kšœ žœ"˜/Kšœžœ žœ˜0Jšœžœ%˜/Jšœžœžœžœ ˜;Jšœžœžœžœ ˜9Jšœžœžœ˜IJšœ žœžœ˜HJšœžœ žœ˜(Jšžœ*žœ ˜;Jšœ5˜5Jšžœ˜!Jšžœ˜Kšœ#˜#Kšœ!˜!Kšœ8˜8Kšœ3˜3Kšœ.˜.Kšœ)˜)Jšœ9ΟcM˜†Jšœ8‘M˜…Kšœ!˜!Kšœ ˜ Kšœ™Kšœ™Kšœžœ+˜4Kšœžœ)˜2Kšœ ˜ Kšžœ˜Kšœ˜KšžœLžœ žœ ˜lJ˜J™—š   œžœ!žœ žœ žœ ™YJšœžœ'™5šžœžœž™Jšœžœžœ™šœ™š žœ žœžœžœ"žœ žœž™rJšœ:™:Jšžœ™—Jšœ ™ J™—Jšœžœžœ™,šžœ™Jšœ$™$Jšžœžœžœžœ™Jšœ"™"J™——Jšœ+™+™J™——š œžœ žœ ™%Jšœ.™.š žœ žœ6žœ žœž™[Jšœ:™:Jšžœ™—J™J™—š œžœžœ˜7Jšœ,˜,J˜J˜—š œ˜%Jšœžœ%˜/Jšœžœžœžœ ˜;Jšœžœ žœ˜8Jšœžœ˜!J˜J˜—š œ˜)Jšœžœ%˜/Jšœžœžœžœ ˜9Jšœ žœ žœ˜6Jšœžœ žœ˜-Jšœ žœ žœ˜1Jšœžœ3žœ)žœ˜Jš žœžœžœžœžœ˜:šžœžœžœžœ(žœžœžœ˜NJšœ žœžœ;˜RJšœ ˜ Jšœ5˜5Jšžœ+žœžœ˜7Jšœ3˜3Jš žœ žœžœžœžœžœ˜'Jšœ(˜(Jšœ6˜6Jšžœ˜—Jšœ˜——™J™cš œžœžœ˜;Jš œžœ=žœ˜QJšžœžœžœ˜+JšžœAžœžœžœ˜SJšœ4˜4Jšœ˜šžœžœž˜šœ/˜/Jšœ#žœ˜:š  œžœ˜$Jšœ4žœ˜9J˜—Jšœ9˜9šžœžœžœžœ˜"JšœMžœ˜RJšœ$˜$Jšžœ˜—J˜—Jšœžœ4˜PJšžœ˜—J˜——™JšœR˜R—J˜Jšžœ˜J˜—…—(%Δ