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 [
BOOL ←
TRUE] =
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;
RegisterOver
lapLayers:
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.