OverlapRemoverImpl.mesa
Last Edited by: Gbier, July 11, 1985 12:181:45 pm PDT
Last Edited by: Gbier, August 8, 1985 2:21:51 pm PDT
Jacobi, March 19, 1986 5:39:56 pm PST
DIRECTORY
CD,
CStitching,
CDCells,
CDMenus,
CDSequencer,
CDInstances,
CDDirectory,
TerminalIO,
OverlapRemover;
OverlapRemoverImpl: CEDAR PROGRAM
IMPORTS CStitching, CDCells, CDInstances, CDDirectory, CDMenus, CDSequencer, TerminalIO
EXPORTS OverlapRemover =
BEGIN
OverlapLayerRec: TYPE = RECORD [
technology: CD.Technology,
keepLayer: CD.Layer,
throwAwayLayer: CD.Layer
];
overlapLayerList: LIST OF REF OverlapLayerRec ← NIL; --contains registered abstract Layers
RegionList: TYPE = LIST OF REF CStitching.Region;
OverlapRemover: PUBLIC PROC [cellOb: CD.Object, design: CD.Design] =
BEGIN
WITH cellOb.specificRef SELECT FROM
cp: CD.CellPtr => {
OverlapRemoverCell[design, cellOb];
[] ← CDCells.RepositionCell[cellOb, design];
CDDirectory.PropagateChange[cellOb, design];
};
ENDCASE => NULL;
END;
OverlapAllLevels: PROC [design: CD.Design] =
BEGIN
DoIt: CDDirectory.EachEntryAction = {
OverlapRemover[cellOb: ob, design: design]
};
[] ← CDDirectory.Enumerate[design, DoIt];
OverlapRemover[design.actual.first.dummyCell.ob, design];
END;
OverlapAllCommand: PROC [comm: CDSequencer.Command] =
BEGIN
TerminalIO.WriteRope["Overlap removal on all levels\n"];
OverlapAllLevels[design: comm.design];
TerminalIO.WriteRope["Removal Finished\n"];
END;
OverlapRemoverCell: PROC [design: CD.Design, cellOb: CD.Object] =
BEGIN
FOR layerList: LIST OF REF OverlapLayerRec ← overlapLayerList, layerList.rest WHILE layerList #NIL DO
IF layerList.first.technology = design.technology THEN {
cellPtr: CD.CellPtr ← NARROW[cellOb.specificRef];
keepPlane: CStitching.Tesselation ← CStitching.NewTesselation[];
FillPlaneFromWires[cellPtr, layerList.first.keepLayer, keepPlane];
CompareWiresAgainstPlane[design, cellOb, cellPtr, layerList.first.throwAwayLayer, keepPlane];
};
ENDLOOP;
END;
FillPlaneFromWires: PROC [cellPtr: CD.CellPtr, layer: CD.Layer, plane: CStitching.Tesselation] =
BEGIN
FOR instanceList: CD.InstanceList ← cellPtr.contents, instanceList.rest WHILE instanceList #NIL DO
IF instanceList.first.ob.class.wireTyped AND instanceList.first.ob.layer = layer THEN
CStitching.ChangeRect[plane: plane, rect: CDInstances.InstRectI[instanceList.first], new: $cover];
ENDLOOP;
END;
CompareWiresAgainstPlane: PROC [design: CD.Design, cellOb: CD.Object, cellPtr: CD.CellPtr, layer: CD.Layer, plane: CStitching.Tesselation] =
BEGIN
FOR instanceList: CD.InstanceList ← cellPtr.contents, instanceList.rest WHILE instanceList #NIL DO
IF instanceList.first.ob.class.wireTyped AND instanceList.first.ob.layer = layer AND RectCoveredCompletely[CDInstances.InstRectI[instanceList.first], plane] THEN
[] ← CDCells.RemoveInstance[design: design, cell: cellOb, inst: instanceList.first];
ENDLOOP;
END;
RectCoveredCompletely: PROC [rect: CD.Rect, plane: CStitching.Tesselation] RETURNS [BOOLTRUE] =
BEGIN
FOR rectList: RegionList ← CStitching.ListArea[plane: plane, rect: rect, skip: $none], rectList.rest WHILE rectList #NIL DO
IF rectList.first.value = NIL THEN
RETURN[FALSE];
ENDLOOP;
END;
RegisterOverlapLayers: PUBLIC PROC [technology: CD.Technology, keepLayer: CD.Layer, throwAwayLayer: CD.Layer] =
BEGIN
overlapLayerList ← CONS[NEW[OverlapLayerRec ← [technology, keepLayer, throwAwayLayer]], overlapLayerList];
END;
--Its not clear that an Overlap Remover on the Top level is a useful command, but if someone wants it just uncomment the below
OverlapTopCommand: PROC [comm: CDSequencer.Command] =
BEGIN
TerminalIO.WriteRope["Overlap removal on top level\n"];
OverlapRemover[comm.design.actual.first.dummyCell.ob, comm.design];
TerminalIO.WriteRope["Removal Finished\n"];
END;
CDMenus.CreateEntry[menu: $ProgramMenu, entry: "Overlap Remover Top", key: $OverlapTop];
CDSequencer.ImplementCommand[key: $OverlapTop, p: OverlapTopCommand, queue: doQueue];
CDMenus.CreateEntry[menu: $ProgramMenu, entry: "Overlap Remover All", key: $OverlapAll];
CDSequencer.ImplementCommand[key: $OverlapAll, proc: OverlapAllCommand, queue: doQueue];
END.