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
Last edited by: Christian Jacobi, November 4, 1986 5:38:08 pm PST
Jacobi, March 19, 1986 5:39:56 pm PST
DIRECTORY
CD,
CStitching,
CDCells,
CDCommandOps,
CDSequencer,
CDInstances,
CDDirectory,
TerminalIO,
OverlapRemover;
OverlapRemoverImpl: CEDAR PROGRAM
IMPORTS CStitching, CDCells, CDCommandOps, CDInstances, CDDirectory, 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.specific SELECT FROM
cp: CD.CellSpecific => {
OverlapRemoverCell[design, cellOb];
[] ← CDCells.ResizeCell[design, cellOb];
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.PutRope["Overlap removal on all levels\n"];
OverlapAllLevels[design: comm.design];
TerminalIO.PutRope["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 {
keepPlane: CStitching.Tesselation ← CStitching.NewTesselation[];
FillPlaneFromWires[cellOb, layerList.first.keepLayer, keepPlane];
CompareWiresAgainstPlane[design, cellOb, layerList.first.throwAwayLayer, keepPlane];
};
ENDLOOP;
END;
FillPlaneFromWires: PROC [cellOb: CD.Object, layer: CD.Layer, plane: CStitching.Tesselation] =
BEGIN
EachInstance: CDCells.InstEnumerator = {
IF inst.ob.class.wireTyped AND inst.ob.layer = layer THEN
CStitching.ChangeRect[plane: plane, rect: CDInstances.InstRectI[inst], new: $cover];
};
[] ← CDCells.EnumerateInstances[cellOb, EachInstance];
END;
CompareWiresAgainstPlane: PROC [design: CD.Design, cellOb: CD.Object, layer: CD.Layer, plane: CStitching.Tesselation] =
BEGIN
removeList: CD.InstanceList ← NIL;
EachInstance: CDCells.InstEnumerator = {
IF inst.ob.class.wireTyped AND inst.ob.layer = layer AND RectCoveredCompletely[CDInstances.InstRectI[inst], plane] THEN
removeList ← CONS[inst, removeList];
};
[] ← CDCells.EnumerateInstances[cellOb, EachInstance];
FOR il: CD.InstanceList ← removeList, il.rest WHILE il #NIL DO
[] ← CDCells.RemoveInstance[design: design, cell: cellOb, inst: il.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.PutRope["Overlap removal on top level\n"];
OverlapRemover[comm.design.actual.first.dummyCell.ob, comm.design];
TerminalIO.PutRope["Removal Finished\n"];
END;
CDMenus.CreateEntry[menu: $ProgramMenu, entry: "Overlap Remover Top", key: $OverlapTop];
CDSequencer.ImplementCommand[key: $OverlapTop, p: OverlapTopCommand, queue: doQueue];
CDCommandOps.RegisterWithMenu[menu: $ProgramMenu, entry: "Overlap Remover All", key: $OverlapAll];
CDSequencer.ImplementCommand[key: $OverlapAll, proc: OverlapAllCommand, queue: doQueue];
END.