CDSimplifyStructureImpl.mesa (a ChipNDale module)
Copyright © 1986, 1987 by Xerox Corporation. All rights reserved.
Created by Christian October 28, 1986 10:47:15 am PST
Last edited by: Christian Jacobi, February 13, 1987 1:16:44 pm PST
DIRECTORY
CD,
CDBottomUp,
CDCells,
CDCommandOps,
CDInstances,
CDOps,
CDProperties,
CDSequencer,
CDSimplifyStructure,
IO,
Rope,
TerminalIO;
CDSimplifyStructureImpl: CEDAR PROGRAM
IMPORTS CD, CDBottomUp, CDCells, CDCommandOps, CDInstances, CDOps, CDProperties, IO, Rope, TerminalIO
EXPORTS CDSimplifyStructure =
BEGIN
Simplify: PUBLIC PROC [design: CD.Design, root: CD.Object, log: IO.STREAMNIL] = {
IF log=NIL THEN log ← TerminalIO.TOS[];
[] ← CDBottomUp.StartRecurse[simplifyClass, root, design, log];
};
CellSingleInst: PROC [ob: CD.Object] RETURNS [instOrNil: CD.Instance←NIL] = INLINE {
WITH ob.specific SELECT FROM
cp: CD.CellSpecific => {
IF cp.sequence=NIL OR cp.sequence.length=0 THEN {
IF cp.contents#NIL AND cp.contents.rest=NIL THEN RETURN [cp.contents.first]
}
ELSE IF cp.sequence.length=1 THEN {
IF cp.contents=NIL THEN RETURN [cp.sequence[0]]
}
};
ENDCASE => NULL;
};
DoSimplify: CDBottomUp.DoProc = {
IF CDCells.IsCell[ob] THEN {
cnt: INT ← 0;
EachInst: CDCells.InstEnumerator = {
subInst: CD.Instance ← CellSingleInst[inst.ob];
IF subInst#NIL THEN {
stream: IO.STREAMNARROW[handle.data];
composed: CD.Instance ← CDInstances.Composed[subInst, inst.trans];
composed.properties ← CDProperties.DAppendProps[winner: inst.properties, looser: composed.properties];
IF (cnt𡤌nt+1)=1 THEN
IO.PutRope[stream, Rope.Cat["in ", CD.Describe[ob], "\n"]];
IO.PutRope[stream, Rope.Cat[" instance of ", CD.Describe[inst.ob], " replaced by ", CD.Describe[composed.ob], "\n"]];
inst^ ← composed^;
}
};
[] ← CDCells.EnumerateInstances[ob, EachInst];
};
};
HierarchicalSimplificationComm: PROC [comm: CDSequencer.Command] = {
inst: CD.Instance ← CDOps.TheInstance[comm.design, "hierarchical simplification\n"];
IF inst#NIL THEN {
Simplify[comm.design, inst.ob];
TerminalIO.PutRope["--finished\n"]
}
};
simplifyClass: CDBottomUp.Class ← CDBottomUp.Register[DoSimplify, NIL, NIL, $CDSimplify, $CDSimplify];
--use the CDBottomUp mechanism because we want to deal every object just once but
--some silly user didn't include the objects in the directory.
CDCommandOps.RegisterWithMenu[menu: $ProgramMenu, entry: "Hierarchical Simplification", proc: HierarchicalSimplificationComm, key: $CDSimplify];
END.