DIRECTORY Ascii, CD, CDCells, CDCommandOps, CDDirectory, CDDirectoryOps, CDOps, CDSequencer, TerminalIO, Rope; CDCellCommands: CEDAR PROGRAM IMPORTS Ascii, CDOps, CDCells, CDCommandOps, CDDirectory, CDDirectoryOps, CDSequencer, Rope, TerminalIO = BEGIN orientForTest: CD.Orientation _ 0; obCSystemForTest: CDCells.CoordSystem _ interrestCoords; DrawCellComm: PROC [comm: CDSequencer.Command] = BEGIN name: Rope.ROPE; cellOb: CD.Object; found: BOOLEAN; TerminalIO.WriteRope["Include cell; "]; DO name _ TerminalIO.RequestRope["type name\n"! TerminalIO.UserAbort => {GOTO aborted}]; [found, cellOb] _ CDDirectory.Fetch[comm.design, name]; IF found THEN { inst: CD.Instance = CDCells.IncludeOb[design: comm.design, ob: cellOb, position: comm.pos, obCSystem: obCSystemForTest, orientation: orientForTest ].newInst; CDCommandOps.RedrawInstance[comm.design, inst, FALSE]; TerminalIO.WriteRope[name]; TerminalIO.WriteRope[" inserted\n"]; RETURN }; TerminalIO.WriteRope[name]; TerminalIO.WriteRope[" not found\n"]; IF NOT TerminalIO.UserSaysYes[label: "another try ?" ! TerminalIO.UserAbort => {GOTO aborted}] THEN RETURN; ENDLOOP EXITS aborted => NULL; END; DeleteCellComm: PROC [comm: CDSequencer.Command] = BEGIN name, msg: Rope.ROPE_NIL; done: BOOL; ob: CD.Object; TerminalIO.WriteRope["remove object from directory; "]; name _ TerminalIO.RequestRope["type name\n"]; [done, ob] _ CDDirectory.Fetch[comm.design, name]; IF ~done OR ob=NIL THEN { TerminalIO.WriteRope[name]; TerminalIO.WriteRope[" not found\n"]; RETURN }; [done, msg] _ CDDirectoryOps.RemoveObjectFromDirectory[comm.design, ob]; TerminalIO.WriteRope[msg]; IF ~done THEN TerminalIO.WriteRope[" not "]; TerminalIO.WriteRope["done\n"]; END; DisplayCellNames: PROC [comm: CDSequencer.Command] = BEGIN EachEntryDisplay: CDDirectory.EachEntryAction --[name: Rope.ROPE, ob: CD.Object] RETURNS [quit: BOOL] -- = BEGIN quit _ FALSE; count _ count+1; IF comm.a=$RestricedDisplayCellNames THEN { IF Rope.Length[name]<=0 THEN RETURN ELSE { ch: CHAR = Rope.Fetch[name]; IF ~Ascii.Letter[ch] AND ~Ascii.Digit[ch] THEN RETURN } }; displayed _ displayed+1; WITH ob.specificRef SELECT FROM cp: CD.CellPtr => { TerminalIO.WriteRope[" "]; TerminalIO.WriteRope[cp.name]; }; ENDCASE => { TerminalIO.WriteRope[" ("]; TerminalIO.WriteRope[name]; TerminalIO.WriteRope[") "]; TerminalIO.WriteRope[CDOps.Info[ob]]; }; TerminalIO.WriteLn[]; END; count: INT _ 0; displayed: INT _ 0; TerminalIO.WriteRope["Display object names\n"]; IF CDDirectory.Enumerate[comm.design, EachEntryDisplay] THEN TerminalIO.WriteRope["stopped\n"]; TerminalIO.WriteInt[count]; TerminalIO.WriteRope[" objects counted "]; IF count#displayed THEN { TerminalIO.WriteInt[displayed]; TerminalIO.WriteRope[" displayed"]; }; TerminalIO.WriteLn[] END; CreateCellAndName: PROC [comm: CDSequencer.Command] = BEGIN done: BOOL; TerminalIO.WriteRope["Create cell "]; [done: done] _ CDCells.CreateCellSelected[comm.design]; IF ~done THEN TerminalIO.WriteRope[" not done\n"]; END; CreateCellDefaultName: PROC [comm: CDSequencer.Command] = BEGIN done: BOOL; TerminalIO.WriteRope["Create cell without name\n"]; [done: done] _ CDCells.CreateCellSelected[comm.design, "-no name-"]; IF ~done THEN TerminalIO.WriteRope[" not done\n"]; END; PushIntoCellS: PROC [comm: CDSequencer.Command] = BEGIN Expand: PROC [inst: CD.Instance] RETURNS [ob: CD.Object] = BEGIN ob _ CDDirectory.Expand[inst.ob, comm.design, comm.design]; IF ob=NIL THEN TerminalIO.WriteRope["expand failed\n"] ELSE TerminalIO.WriteRope["object expanded\n"]; END; inst: CD.Instance _ CDCommandOps.TheInstance[comm: comm, text: "Push into cell "]; IF inst#NIL THEN { WHILE ~CDCells.IsCell[inst.ob] DO TerminalIO.WriteRope[CDOps.Info[inst.ob]]; TerminalIO.WriteRope[" is not cell;"]; IF ~ inst.ob.class.inDirectory THEN CDSequencer.QuitCommand[" not done"]; SELECT TerminalIO.RequestSelection[label: "convert to cell?", choice: LIST["all instances", "this instance"], text: " convert to cell?\n", default: 1] FROM 1 => {--all instances ob: CD.Object _ Expand[inst]; IF ob=NIL THEN RETURN; CDSequencer.MarkChanged[comm.design]; CDDirectory.ReplaceObject[design: comm.design, old: inst.ob, new: ob] }; 2 => {--this instance ob: CD.Object _ Expand[inst]; IF ob=NIL THEN RETURN; CDSequencer.MarkChanged[comm.design]; inst.ob _ ob; }; ENDCASE => CDSequencer.QuitCommand["no expansion; not done"]; ENDLOOP; IF CDCells.PushInCellInstance[comm.design, inst] THEN TerminalIO.WriteRope["done\n"] ELSE TerminalIO.WriteRope["not done\n"]; }; END; PopFromCellMenu: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["pop\n"]; IF ~CDCells.PopFromCell[comm.design, interactive] THEN TerminalIO.WriteRope[" not done\n"]; END; PopFromCellFlush: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["pop and flush\n"]; IF ~CDCells.PopFromCell[comm.design, flush] THEN TerminalIO.WriteRope[" not done\n"]; END; PopFromCellReplace: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["pop and replace\n"]; IF ~CDCells.PopFromCell[comm.design, replace] THEN TerminalIO.WriteRope[" not done\n"]; END; PopFromCellNew: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["pop and new\n"]; IF ~CDCells.PopFromCell[comm.design, newcell] THEN TerminalIO.WriteRope[" not done\n"]; END; CleanUpDirectoryComm: PROC [comm: CDSequencer.Command] = BEGIN autoOnly: BOOL; TerminalIO.WriteRope["Clean up directory\n"]; autoOnly _ comm.a#$DeleteUnUsedObjects; CDDirectoryOps.CleanUpDirectory[design: comm.design, autoOnly: autoOnly, askFirst: TRUE]; END; SetSimplification: PROC [comm: CDSequencer.Command] = BEGIN ap: CD.Instance; multiple: BOOL; TerminalIO.WriteRope["Set cell simplification\n"]; [ap, multiple] _ CDOps.SelectedInstance[comm.design]; IF multiple THEN TerminalIO.WriteRope[" multiple selection; not done\n"] ELSE IF ap=NIL THEN TerminalIO.WriteRope[" no selection; not done\n"] ELSE { TerminalIO.WriteRope[ap.ob.class.describe[ap.ob]]; IF ISTYPE[ap.ob.specificRef, CD.CellPtr] THEN { cptr: CD.CellPtr ~ NARROW[ap.ob.specificRef]; TerminalIO.WriteRope[" [currently: simplification if height < "]; TerminalIO.WriteInt[cptr.simplifyOn]; cptr.simplifyOn _ MIN[ MAX[ TerminalIO.RequestInt[" pixels] type > "], 0], LAST[NAT] ]; TerminalIO.WriteRope[" done\n"] } ELSE TerminalIO.WriteRope[" not a cell; not done\n"]; } END; RenameComm: PROC [comm: CDSequencer.Command] = BEGIN RenameAppOb: PROC[design: CD.Design, ap: CD.Instance] = BEGIN done: BOOL _ FALSE; IF ap=NIL THEN TerminalIO.WriteRope[" no object;\n"] ELSE { TerminalIO.WriteRope[ap.ob.class.describe[ap.ob]]; IF NOT ap.ob.class.inDirectory THEN TerminalIO.WriteRope[" object can not have name;\n"] ELSE { newName: Rope.ROPE _ TerminalIO.RequestRope[" new name > "]; IF Rope.IsEmpty[newName] THEN newName _ "-"; done _ CDDirectory.Rename[design, ap.ob, newName]; }; }; IF done THEN TerminalIO.WriteRope["done\n"] ELSE TerminalIO.WriteRope[" not done\n"] END; ap: CD.Instance = CDCommandOps.TheInstance[comm]; IF ap#NIL THEN RenameAppOb[comm.design, ap] END; ReplaceComm: PROC [comm: CDSequencer.Command] = BEGIN name: Rope.ROPE; old, new: CD.Object; found: BOOLEAN; TerminalIO.WriteRope["replace an entry allover in the design\n"]; name _ TerminalIO.RequestRope[" replace (name) > "]; [found, old] _ CDDirectory.Fetch[comm.design, name]; IF found THEN { name _ TerminalIO.RequestRope[" by (name) > "]; [found, new] _ CDDirectory.Fetch[comm.design, name]; }; IF ~found THEN { TerminalIO.WriteRope[" "]; TerminalIO.WriteRope[name]; TerminalIO.WriteRope[" not found\n"]; } ELSE { offset: CD.Position_ [0, 0]; TerminalIO.WriteRope[" do you want to specify an offset?\n"]; IF TerminalIO.UserSaysYes[label: "offset", default: FALSE] THEN { offset.x _ TerminalIO.RequestInt[" x in lambda >"]*CD.lambda; offset.y _ TerminalIO.RequestInt[" y in lambda >"]*CD.lambda; }; CDDirectory.ReplaceObject[design: comm.design, old: old, new: new, off: offset]; TerminalIO.WriteRope[" end replace\n"]; } END; CDSequencer.ImplementCommand[$PopMenu, PopFromCellMenu,, doQueue]; CDSequencer.ImplementCommand[$PopNew, PopFromCellNew,, doQueue]; CDSequencer.ImplementCommand[$PopFlush, PopFromCellFlush,, doQueue]; CDSequencer.ImplementCommand[$PopReplace, PopFromCellReplace,, doQueue]; CDSequencer.ImplementCommand[$PushS, PushIntoCellS,, doQueue]; CDSequencer.ImplementCommand[$CreateCellSAndName, CreateCellAndName]; CDSequencer.ImplementCommand[$CreateCellSUnNamed, CreateCellDefaultName]; CDSequencer.ImplementCommand[$DisplayCellNames, DisplayCellNames,, doQueue]; CDSequencer.ImplementCommand[$RestricedDisplayCellNames, DisplayCellNames,, doQueue]; CDSequencer.ImplementCommand[$DrawCell, DrawCellComm]; CDSequencer.ImplementCommand[$RemoveCell, DeleteCellComm,, doQueue]; CDSequencer.ImplementCommand[$DeleteUnUsedObjects, CleanUpDirectoryComm,, doQueue]; CDSequencer.ImplementCommand[$DeleteUnUsedAutoObs, CleanUpDirectoryComm,, doQueue]; CDSequencer.ImplementCommand[$CellSimplification, SetSimplification,, doQueue]; CDSequencer.ImplementCommand[$RenameS, RenameComm,, doQueue]; CDSequencer.ImplementCommand[$Replace, ReplaceComm]; END. ÞCDCellCommands.mesa (part of ChipNDale) Copyright c 1983, 1985 by Xerox Corporation. All rights reserved. by Christian Jacobi, July 11, 1983 3:42 pm last edited by Christian Jacobi, July 1, 1985 12:08:09 pm PDT Ê û˜šœ)™)Jšœ Ïmœ7™BJšœ+™+Jšœ>™>—J˜šÏk ˜ Jšœž˜Jšžœ˜J˜J˜ J˜ Jšœ˜J˜J˜ J˜ J˜J˜—šÏnœžœž˜Jšžœc˜j—Jšž˜J˜Jšœžœ˜"Jšœžœ˜8J˜šŸ œžœ˜0Jšž˜Jšœ žœ˜Jšœžœ˜Jšœžœ˜J˜'šž˜JšœFžœ ˜UJ˜7šžœžœ˜šœžœ3˜;Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ ˜ —Jšœ/žœ˜6J˜J˜$Jšž˜Jšœ˜—J˜Ašžœžœ.˜4Jšœžœ žœžœ˜6—Jšž˜—šž˜Jšœ žœ˜—Jšžœ˜J˜—šŸœžœ˜2Jšž˜Jšœžœžœ˜Jšœžœ˜ J˜J˜7Jšœ-˜-Jšœ2˜2šžœžœžœžœ˜J˜AJšž˜Jšœ˜—JšœH˜HJšœ˜Jšžœžœ ˜-Jšœ˜Jšžœ˜—J˜J˜šŸœžœ˜4Jšž˜J˜šÏbœ˜.JšÏc:œ˜Jšœžœ#˜/Jšœ˜Jšœ ž˜šœ¡˜Jšœžœ˜Jšžœžœžœžœ˜Jšœ%˜%JšœE˜EJ˜—šœ¡˜Jšœžœ˜Jšžœžœžœžœ˜Jšœ%˜%Jšœ ˜ Jšœ˜—Jšžœ6˜=—Jšžœ˜—Jšžœ/žœ ˜UJšžœ$˜(Jšœ˜—Jšžœ˜J˜—šŸœžœ˜3Jšž˜Jšœ˜šžœ0žœ˜7J˜%—Jšžœ˜J˜—šŸœžœ˜4Jšž˜Jšœ(˜(šžœ*žœ˜1J˜%—Jšžœ˜J˜—šŸœžœ˜6Jšž˜Jšœ*˜*šžœ,žœ˜3J˜%—Jšžœ˜J˜—šŸœžœ˜2Jšž˜Jšœ&˜&šžœ,žœ˜3J˜%—Jšžœ˜J˜—J˜J˜šŸœžœ˜8Jšž˜Jšœ žœ˜J˜.Jšœ'˜'JšœSžœ˜YJšžœ˜J˜—J˜šŸœžœ˜5Jšž˜Jšœžœ ˜Jšœ žœ˜J˜3Jšœ5˜5Jšžœ žœ;˜KJšžœžœžœ5˜Hšžœž˜Jšœ2˜2šžœžœžœ ž˜/Jšœžœ žœ˜-JšœC˜CJšœ%˜%šœžœ˜šžœ˜Jšœ+˜+Jšœ˜—Jšžœžœ˜ Jšœ˜—Jšœ!˜!J˜—Jšžœ4˜8—Jšžœ˜J˜—šŸ œžœ˜.Jšž˜J˜šŸ œžœ žœ žœ ˜7Jšž˜Jšœžœžœ˜Jšžœžœžœ)˜7šžœ˜Jšœ2˜2Jšžœžœžœ5˜Xšžœ˜Jšœžœ*˜˜>šžœ2žœžœ˜AJšœ>˜>Jšœ>˜>J˜—JšœP˜PJ˜(Jšœ˜—Jšžœ˜—J˜JšœB˜BJšœ@˜@JšœD˜DJšœH˜HJšœ>˜>JšœE˜EJšœI˜IJšœL˜LJšœU˜UJšœ6˜6JšœD˜DJšœS˜SJšœS˜SJšœO˜OJšœ=˜=Jšœ4˜4Jšžœ˜J˜J˜—…—#².‹