<> <> <> <> 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.STREAM_NIL] = { 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.STREAM _ NARROW[handle.data]; composed: CD.Instance _ CDInstances.Composed[subInst, inst.trans]; composed.properties _ CDProperties.DAppendProps[winner: inst.properties, looser: composed.properties]; IF (cnt_cnt+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.