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 [
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.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.