DIRECTORY Atom, CD, CDCommandOps, CDEnvironment, CDLayers, CDOps, CDPopUpMenus, CDPrivate, CDProperties, CDSequencer, CDSequencerExtras, CDViewer, Commander, IO, PopUpMenus, Process, RefTab, Rope, TerminalIO; CDCommandOpsImpl: CEDAR MONITOR IMPORTS Atom, CD, CDEnvironment, CDLayers, CDOps, CDPopUpMenus, CDProperties, CDSequencer, CDSequencerExtras, CDViewer, IO, PopUpMenus, Process, RefTab, Rope, TerminalIO EXPORTS CDCommandOps = BEGIN reCheck: CONDITION _ [timeout: Process.MsecToTicks[1000]]; EnterResource: ENTRY PROC [resource: REF, wait: BOOL, design: REF] RETURNS [ok: BOOL] = { IF design=NIL THEN design _ $NIL; DO ok _ RefTab.Insert[resourceTab, resource, design]; IF ok OR ~wait THEN EXIT; WAIT reCheck; ENDLOOP }; LeaveResource: ENTRY PROC [resource: REF] = { [] _ RefTab.Delete[resourceTab, resource]; BROADCAST reCheck }; DoWithResource: PUBLIC PROC [proc: CDSequencer.CommandProc, comm: CDSequencer.Command, resource: REF _ NIL, waitIfBusy: BOOL _ FALSE, messageIfSkipped: BOOL _ TRUE] RETURNS [skipped: BOOL_TRUE] = { design: CD.Design = IF comm#NIL THEN comm.design ELSE NIL; IF skipped _ ~EnterResource[resource, waitIfBusy, design] THEN { IF messageIfSkipped THEN TerminalIO.PutRope[" not reentrant; skipped\n"] } ELSE { Protected: PROC [] = { ENABLE UNWIND => LeaveResource[resource]; proc[comm]; LeaveResource[resource]; }; Protected[] } }; unique: INT _ 0; RegisterWithMenu: PUBLIC PROC [menu: REF_NIL, entry: Rope.ROPE_NIL, doc: Rope.ROPE_NIL, key: ATOM_NIL, proc: CDSequencer.CommandProc_NIL, queue: CDSequencer.QueueMethod_doQueue, tech: CD.Technology_NIL] = { IF key=NIL THEN key _ Atom.MakeAtom[IO.PutFR1["a%g", IO.int[unique _ unique+1]]]; IF proc#NIL THEN CDSequencerExtras.RegisterCommand[key: key, proc: proc, queue: queue, technology: tech]; IF menu#NIL THEN [] _ PopUpMenus.Entry[CDPopUpMenus.GetMenu[menu], entry, NIL, key, doc]; }; currentLayerReg: CD.PropRef _ CD.InitPropRef[]; SetCurrentLayer: PROC [comm: CDSequencer.Command] = { x: REF _ CDProperties.GetPropProp[currentLayerReg, comm.design.technology.key, comm.key]; IF x=NIL THEN x _ CDProperties.GetPropProp[currentLayerReg, $all, comm.key]; WITH x SELECT FROM lora: LIST OF REF ANY => { lay: CD.Layer _ CD.errorLayer; w: INT _ -1; WITH lora.first SELECT FROM l: REF CD.Layer => lay _ l^; ENDCASE => NULL; IF lora.rest#NIL THEN WITH lora.rest.first SELECT FROM i: REF INT => w _ i^ ENDCASE => NULL; SELECT TRUE FROM w>=0 => CDLayers.SetLayerWidth[comm.design, lay, w]; w=-2 => CDLayers.SetLayerWidth[comm.design, lay, CDLayers.LayerWidth[comm.design, CD.commentLayer]]; ENDCASE => NULL; --don't change current width of layer CDLayers.SetCurrentLayer[comm.design, lay]; TerminalIO.PutRopes["set default layer: ", CDOps.LayerRope[lay], "\n"]; }; ENDCASE => TerminalIO.PutF["command %g failed\n", [atom[comm.key]]]; }; RegisterCurrentLayerCommand: PUBLIC PROC [key: ATOM, layer: CD.Layer, tech: CD.Technology, w: CD.Number_-1] = { tKey: ATOM _ IF tech#NIL THEN tech.key ELSE $all; CDProperties.PutPropProp[currentLayerReg, tKey, key, LIST[NEW[CD.Layer_layer], NEW[INT_w]]]; CDSequencer.ImplementCommand[key: key, proc: SetCurrentLayer, queue: doQueue, technology: tech]; }; IncludeOb: PUBLIC PROC [comm: CDSequencer.Command, ob: CD.Object, failMessage: Rope.ROPE] = { msg: Rope.ROPE _ failMessage; IF ob=NIL THEN { IF msg=NIL THEN failMessage _ "failed"; } ELSE { i: CD.Instance _ CDOps.IncludeObjectI[design: comm.design, ob: ob, location: comm.pos]; msg _ Rope.Cat["include: ", CDOps.InstRope[i]]; }; TerminalIO.PutRopes[msg, "\n"] }; NewDesign: Commander.CommandProc = { IF cmd#NIL AND cmd.procData#NIL THEN WITH cmd.procData.clientData SELECT FROM t: CD.Technology => { design: CD.Design _ CDOps.CreateDesign[t]; CDOps.SetMutability[design, editable]; [] _ CDViewer.CreateViewer[design]; cmd.out.PutRope[Rope.Cat[t.name, " design created\n"]]; RETURN }; ENDCASE => NULL; cmd.out.PutRope[" bad command data\n"]; }; PseudoLoadTechnology: Commander.CommandProc = { cmd.out.PutRope[" technology is loaded\n"]; }; RegisterCommanderNewDesign: PUBLIC PROC [technology: CD.Technology] = { CDEnvironment.RegisterCommander[ key: Rope.Cat["CDNew", technology.name], proc: NewDesign, doc: Rope.Cat["Creates new ", technology.name, " ChipNDale design"], clientData: technology, technology: technology ]; CDEnvironment.RegisterCommander[ key: Rope.Cat["CD", technology.name], proc: PseudoLoadTechnology, doc: Rope.Cat["Loads ", technology.name, " ChipNDale technology [but is already loaded]"], technology: technology ]; }; resourceTab: RefTab.Ref ~ RefTab.Create[7]; END. „CDCommandOpsImpl.mesa Copyright c 1984, 1986, 1987 by Xerox Corporation. All rights reserved. Created by Christian Jacobi, July 12, 1984 3:49:16 pm PDT Last Edited by: Christian Jacobi, September 3, 1987 12:00:29 pm PDT The purpose of this procedure is to make load files look as if they did succeed; When this procedure is registered [or called] the technology is already loaded Κ<˜codešœ™Kšœ Οmœ=™HKšœ:™:K™CK˜—šΟk ˜ Kšœ˜Kšžœ˜Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ ˜ K˜ K˜ K˜Kšœ ˜ Kšœ ž˜ Kšœ˜Kšœ ˜ Kšœ˜Kšœ˜K˜K˜ —K˜šΟnœžœž˜Kšžœžœfžœ/˜©Kšžœ˜—Kšž˜K˜Kšœ ž œ(˜:K˜šŸ œžœžœ žœžœ žœžœžœ˜YKšžœžœžœ˜!šž˜Kšœ2˜2Kšžœžœžœžœ˜Kšžœ ˜ Kšž˜—K˜—K˜šŸ œžœžœ žœ˜-Kšœ*˜*Jšž œ˜K˜—K˜šŸœžœžœFžœžœžœžœžœžœžœ žœžœ˜ΕKš œžœ žœžœžœ žœžœ˜:šžœ8žœ˜AKšžœžœ1˜IK˜—šžœ˜šŸ œžœ˜Kšžœžœ˜)Kšœ ˜ Kšœ˜K˜—Kšœ ˜ Kšœ˜—Kšœ˜—K˜Kšœžœ˜šŸœž œžœžœžœžœ žœžœžœžœ žœ0žœ žœ˜ΞKš žœžœžœžœžœ˜Qšžœžœžœ˜KšœX˜X—šžœžœžœ˜Kšœ9žœ ˜H—K˜—K˜Kšœžœ žœ˜/K˜šŸœžœ ˜5JšœžœS˜YJšžœžœžœ?˜Lšžœžœž˜š œžœžœžœžœ˜Kšœžœ žœ ˜Kšœžœ˜ šžœ žœž˜Kšœžœžœ˜Kšžœžœ˜—šžœ žœž˜šžœžœž˜ Kšœžœžœ ˜Kšžœžœ˜——šžœžœž˜Kšœ4˜4KšœRžœ˜dKšžœžœΟc%˜6—Kšœ+˜+KšœG˜GK˜—Kšžœ=˜D—K˜—K˜š Ÿœž œžœ žœžœžœ˜oKš œžœžœžœžœ žœ˜1Jš œ5žœžœžœžœžœ˜\Kšœ`˜`K˜—K˜š Ÿ œžœžœ!žœžœ˜]Kšœ žœ˜šžœžœžœ˜Kšžœžœžœ˜'K˜—šžœ˜KšœžœR˜WKšœ/˜/K˜—Kšœ˜K˜—K˜šŸ œ˜$š žœžœžœžœž˜$šžœžœž˜(šœžœ˜Kšœžœ ˜*Kšœ&˜&K˜#Kšœ7˜7Kšž˜K˜—Kšžœžœ˜——Kšœ'˜'Kšœ˜—K˜šŸœ˜/KšœP™PK™NKšœ+˜+Kšœ˜—K˜šŸœžœžœžœ˜Gšœ"˜"Kšœ)˜)K˜KšœD˜DKšœ˜Kšœ˜Kšœ˜—šœ"˜"Kšœ&˜&K˜KšœZ˜ZKšœ˜Kšœ˜—K˜—K˜Kšœ+˜+Kšžœ˜K˜J˜—…—κͺ