DIRECTORY Atom, Pipal, PipalInt, PipalMos, PipalOps, PipalUI, RefTab, Rope, RopeList, TerminalIO; PipalCDCommands: CEDAR PROGRAM IMPORTS Atom, Pipal, PipalInt, PipalMos, PipalOps, PipalUI, RefTab, Rope, RopeList, TerminalIO = BEGIN ROPE: TYPE = Pipal.ROPE; ROPES: TYPE = LIST OF ROPE; expandMethod: Pipal.Method _ Pipal.RegisterMethod["Expand"]; Expand: PipalUI.ReplaceCommandProc = { Each: PipalOps.EachChildProc = { [] _ Expand[design, child, table, data, issuer]; }; refReplaceCommandProc: REF PipalUI.ReplaceCommandProc _ NARROW [Pipal.ObjectMethod[object, expandMethod]]; SELECT TRUE FROM refReplaceCommandProc#NIL => refReplaceCommandProc^[design, object, table, data, issuer]; PipalOps.HasEnumerate[object] => [] _ PipalOps.Enumerate[object, Each]; ENDCASE => {}; }; GenericExpand: PipalUI.ReplaceCommandProc = { [] _ RefTab.Store[table, object, PipalOps.Recast[object]]; }; EditExpressions: PROC [oldExprs: ROPES, prompt: ROPE] RETURNS [allExprs: ROPES _ NIL] = { input: ROPE; noOldExprs: BOOL _ oldExprs=NIL; TerminalIO.PutF["\n"]; WHILE oldExprs#NIL DO input _ TerminalIO.RequestRope[Rope.Cat[" ", prompt, ": ", oldExprs.first, " Replacement: "]]; SELECT TRUE FROM Rope.Equal[input, "-"] => TerminalIO.PutF[" ** Deleted\n"]; Rope.IsEmpty[input] => allExprs _ CONS [oldExprs.first, allExprs]; ENDCASE => allExprs _ CONS [input, allExprs]; oldExprs _ oldExprs.rest; ENDLOOP; IF noOldExprs THEN { input _ TerminalIO.RequestRope[Rope.Cat[" New ", prompt, ": "]]; WHILE ~Rope.IsEmpty[input] AND ~Rope.Equal[input, "-"] DO allExprs _ CONS [input, allExprs]; input _ TerminalIO.RequestRope[Rope.Cat[" New ", prompt, ": "]]; ENDLOOP}; allExprs _ RopeList.Reverse[allExprs]; }; Atomize: PROC [r: ROPE] RETURNS [ATOM _ NIL] = { IF Rope.Length[r]>1 AND Rope.Fetch[r]='$ THEN r _ Rope.Substr[r, 1, Rope.Length[r]-1]; IF ~Rope.IsEmpty[r] THEN RETURN [Atom.MakeAtom[r]] }; RequestValue: PROC [] RETURNS [value: REF _ NIL] = { SELECT TerminalIO.RequestSelection["Annotation value", LIST["NIL", "BOOL", "INT", "ROPE", "ROPES", "ATOM", "Rectangle"]] FROM 1 => RETURN [NIL]; 2 => RETURN [NEW [BOOL _ TerminalIO.Confirm["TRUE"]]]; 3 => RETURN [NEW [INT _ TerminalIO.RequestInt["Integer: "]]]; 4 => RETURN [TerminalIO.RequestRope["Rope: "]]; 5 => RETURN [EditExpressions[NIL, "Rope "]]; 6 => RETURN [Atomize[TerminalIO.RequestRope["Atom: "]]]; 7 => { rect: PipalInt.Rectangle; rect.base.x _ TerminalIO.RequestInt["base.x: "]; rect.base.x _ TerminalIO.RequestInt["base.x: "]; rect.size.y _ TerminalIO.RequestInt["size.y: "]; rect.size.y _ TerminalIO.RequestInt["size.y: "]; RETURN [NEW [PipalInt.Rectangle _ rect]]; }; ENDCASE => {}; }; MakeAnnotation: PipalUI.ReplaceCommandProc = { key: ATOM _ Atomize[TerminalIO.RequestRope["Annotation key: "]]; IF key=NIL THEN { TerminalIO.PutF["*** MakeAnnotation: empty key.\n"]; RETURN; }; [] _ RefTab.Store[table, object, Pipal.CreateAnnotation[object, key, RequestValue[]]]; }; MakeSchematicIcon: PipalUI.ReplaceCommandProc = { choice: NAT _ TerminalIO.RequestSelection["Schematic Icon Type", LIST ["Cell icon", "Wire icon", "Unnamed wire icon"]]; type: PipalMos.SchematicIconType; code: BOOL; expression: Pipal.ROPE; IF choice=0 THEN { TerminalIO.PutF["*** MakeSchematicIcon: aborted.\n"]; -- should do something else that just returning! RETURN; }; type _ VAL [choice]; code _ TerminalIO.Confirm["From Code?"]; expression _ TerminalIO.RequestRope[IF code THEN "Code: " ELSE "Name of the schematic: "]; [] _ RefTab.Store[table, object, PipalMos.CreateSchematicIcon[object, expression, code, type]]; }; MakeSchematicSequence: PipalUI.ReplaceCommandProc = { [] _ RefTab.Store[table, object, PipalMos.CreateSchematicSequence[object, TerminalIO.RequestRope["Repetition factor: "]]]; }; changeLayerMethod: Pipal.Method _ Pipal.RegisterMethod["ChangeLayer"]; ChangeLayer: PipalUI.ReplaceCommandProc = { Each: PipalOps.EachChildProc = { [] _ ChangeLayer[design, child, table, data, issuer]; }; refReplaceCommandProc: REF PipalUI.ReplaceCommandProc _ NARROW [Pipal.ObjectMethod[object, changeLayerMethod]]; SELECT TRUE FROM refReplaceCommandProc#NIL => refReplaceCommandProc^[design, object, table, data, issuer]; PipalOps.HasEnumerate[object] => [] _ PipalOps.Enumerate[object, Each]; ENDCASE => {}; }; ChangeBoxLayer: PipalUI.ReplaceCommandProc = { box: PipalMos.Box = NARROW [object]; [] _ RefTab.Store[table, object, PipalMos.CreateBox[box.size, NARROW [data]]]; }; SchematicIconLayer: PipalUI.ReplaceCommandProc = { marker: PipalMos.Marker = NARROW [object]; [] _ RefTab.Store[table, object, PipalMos.CreateMarker[marker.size, NARROW [data]]]; }; PipalUI.RegisterReplaceSelectionCommand[key: $Expand, proc: Expand, allSelected: TRUE, replaceMethod: alongPath]; Pipal.PutClassMethod[Pipal.annotationClass, expandMethod, NEW [PipalUI.ReplaceCommandProc _ GenericExpand]]; Pipal.PutClassMethod[PipalInt.abutClass, expandMethod, NEW [PipalUI.ReplaceCommandProc _ GenericExpand]]; Pipal.PutClassMethod[PipalMos.starClass, expandMethod, NEW [PipalUI.ReplaceCommandProc _ GenericExpand]]; Pipal.PutClassMethod[PipalMos.routingClass, expandMethod, NEW [PipalUI.ReplaceCommandProc _ GenericExpand]]; Pipal.PutClassMethod[PipalMos.tilingClass, expandMethod, NEW [PipalUI.ReplaceCommandProc _ GenericExpand]]; Pipal.PutClassMethod[PipalMos.schematicIconClass, expandMethod, NEW [PipalUI.ReplaceCommandProc _ GenericExpand]]; Pipal.PutClassMethod[PipalMos.schematicSequenceClass, expandMethod, NEW [PipalUI.ReplaceCommandProc _ GenericExpand]]; PipalUI.RegisterReplaceSelectionCommand[key: $MakeAnnotation, proc: MakeAnnotation, allSelected: FALSE, replaceMethod: alongPath]; PipalUI.RegisterReplaceSelectionCommand[key: $MakeSchematicIcon, proc: MakeSchematicIcon, allSelected: FALSE, replaceMethod: alongPath]; PipalUI.RegisterReplaceSelectionCommand[key: $MakeSchematicSequence, proc: MakeSchematicSequence, allSelected: FALSE, replaceMethod: alongPath]; PipalUI.RegisterReplaceSelectionCommand[key: $ChangeToBlue, proc: ChangeLayer, allSelected: TRUE, replaceMethod: alongPath, data: PipalMos.blueCommentLayer]; PipalUI.RegisterReplaceSelectionCommand[key: $ChangeToBlack, proc: ChangeLayer, allSelected: TRUE, replaceMethod: alongPath, data: PipalMos.commentLayer]; Pipal.PutClassMethod[PipalMos.boxClass, changeLayerMethod, NEW [PipalUI.ReplaceCommandProc _ ChangeBoxLayer]]; Pipal.PutClassMethod[PipalMos.markerClass, changeLayerMethod, NEW [PipalUI.ReplaceCommandProc _ SchematicIconLayer]]; END. pPipalCDCommands.mesa Copyright Σ 1988 by Xerox Corporation. All rights reversed. Created by Bertrand Serlet, May 15, 1988 8:52:39 pm PDT Bertrand Serlet May 15, 1988 10:35:33 pm PDT Prerequisite Expand Make an Annotation Make a Schematic Icon Make a Schematic Sequence Change Layer Expand Initialization Make Objects Initialization Change Layer Initialization Κ ˜™Jšœ<™˜}Lšœœœ˜Lšœœœœ ˜6Lšœœœœ(˜=Lšœœ$˜/Lšœœœ ˜,Lšœœ-˜8šœ˜Lšœ˜Lšœ0˜0Lšœ0˜0Lšœ0˜0Lšœ0˜0Lšœœ˜)Lšœ˜—Lšœ˜—Lšœ˜L˜—šžœ ˜.Jšœœ7˜@šœœœ˜Lšœ4˜4Lšœ˜L˜—JšœV˜VJ˜——™šžœ ˜1Jšœœ6œ2˜wJšœ!˜!Jšœœ˜ Jšœœ˜šœ œ˜Lšœ6Οc0˜fLšœ˜J˜—Jšœœ ˜Jšœ(˜(Jšœ$œœ œ˜ZJšœ_˜_J˜——™šžœ ˜5Jšœz˜zJ˜——™ JšœF˜Fšž œ ˜+šžœ˜ Jšœ5˜5Jšœ˜—Jšœœœ1˜ošœœ˜Jšœœ@˜YJšœG˜GJšœ˜—J˜J˜—šžœ ˜.Jšœœ ˜$Jšœ>œ ˜NJ˜J˜—šžœ ˜2Jšœœ ˜*JšœDœ ˜TJ˜——™šœQœ˜qJ˜—Jšœ:œ/˜lJšœ7œ/˜iJšœ7œ/˜iJšœ:œ/˜lJšœ9œ/˜kJšœ@œ/˜rJšœDœ/˜v—™Jšœaœ˜‚Jšœgœ˜ˆJšœoœ˜—™Jšœ\œ=˜Jšœ]œ9˜šJšœ;œ0˜nJšœ>œ4˜uJ˜—JšœΟb˜—…—* :