DIRECTORY CD, CDApplications, CDBasics, CDDraw, CDExtras, CDOps, CDValue, CDViewer, CDVPrivate, CDPanel, CDVScale, CDVTicks, CDSequencer, TerminalIO, ViewerOps USING [PaintViewer], ViewerClasses USING [Viewer]; CDVCommands: CEDAR PROGRAM IMPORTS CDApplications, CDDraw, CDExtras, CDOps, CDValue, CDViewer, CDVScale, CDVTicks, CDPanel, CDSequencer, TerminalIO, CDBasics, ViewerOps = BEGIN MyGraphicRef: TYPE = CDVPrivate.MyGraphicRef; lambda: CD.DesignNumber = CD.lambda; RepaintViewer: PROC[mySheet: MyGraphicRef] = INLINE BEGIN ViewerOps.PaintViewer[mySheet.viewer, client, FALSE, NIL] END; WriteLnScale: PROC [me: MyGraphicRef] = BEGIN TerminalIO.WriteRope[" (scale: "]; TerminalIO.WriteInt[me.scale.nscale]; TerminalIO.WriteRope[")\n"]; END; ChangeScale: PROC [me: MyGraphicRef, newScale: INT] = BEGIN newScale _ MIN[MAX[0, newScale], CDVScale.scaleNum-1]; IF me.scale.nscale = newScale THEN TerminalIO.WriteRope["No scale change"] ELSE { oldDesignCenterOffset, newDesignCenterOffset: CD.DesignPosition; viewerCenterOffset: CD.Position _ [me.viewer.cw/2, me.viewer.ch/2]; off: CD.DesignPosition _ me.scale.off; dscale: CDVScale.ScaleRec; TerminalIO.WriteRope["Change scale"]; dscale _ CDVScale.MakeScale[nscale: me.scale.nscale, grid: me.scale.grid]; oldDesignCenterOffset _ CDVScale.ViewerToDesignPosition[dscale, viewerCenterOffset]; dscale _ CDVScale.MakeScale[nscale: newScale, grid: me.scale.grid]; newDesignCenterOffset _ CDVScale.ViewerToDesignPosition[dscale, viewerCenterOffset]; off _ CDBasics.SubPoints[ CDBasics.AddPoints[off, oldDesignCenterOffset], newDesignCenterOffset ]; dscale _ CDVScale.MakeScale[off: off, nscale: newScale, grid: me.scale.grid]; me.scale _ dscale; RepaintViewer[me]; }; WriteLnScale[me]; END; ScaleUp: PROC [comm: CDSequencer.Command] = BEGIN mySheet: MyGraphicRef = NARROW[comm.ref]; i: CARDINAL _ IF mySheet.scale.nscale>0 THEN mySheet.scale.nscale-1 ELSE 0; ChangeScale[mySheet, i]; END; ScaleDown: PROC [comm: CDSequencer.Command] = BEGIN mySheet: MyGraphicRef = NARROW[comm.ref]; ChangeScale[mySheet, mySheet.scale.nscale+1]; END; MoveScreen: PROC [comm: CDSequencer.Command] = BEGIN mySheet: MyGraphicRef = NARROW[comm.ref]; off: CD.DesignPosition; TerminalIO.WriteRope["Move window\n"]; off.x _ mySheet.scale.off.x-(comm.pos.x-comm.sPos.x); off.y _ mySheet.scale.off.y-(comm.pos.y-comm.sPos.y); mySheet.scale _ CDVScale.MakeScale[ off: off, nscale: mySheet.scale.nscale, grid: mySheet.scale.grid ]; RepaintViewer[mySheet]; END; GridInfoComm: PROC [comm: CDSequencer.Command] = BEGIN mySheet: MyGraphicRef = NARROW[comm.ref]; g: INTEGER _ 1; n: INT; TerminalIO.WriteRope["input grid info (currently"]; TerminalIO.WriteRope[CDExtras.ToLambda[mySheet.scale.grid]]; TerminalIO.WriteRope[")\n"]; n _ TerminalIO.RequestSelection[ choice: LIST["1/2", "1", " 2", " 4", " 8", "16", "32", "type"], label: "grid"]; SELECT n FROM 1 => g _ lambda/2; 2 => g _ lambda; 3 => g _ 2*lambda; 4 => g _ 4*lambda; 5 => g _ 8*lambda; 6 => g _ 16*lambda; 7 => g _ 32*lambda; 8 => g _ MIN[INT[1300], TerminalIO.RequestInt["grid: "]]*lambda; ENDCASE => g _ CDValue.FetchInt[boundTo: mySheet.actualDesign, key: $CDxInitGrid, propagation: global]; IF g>0 AND g<=2600 THEN { mySheet.scale _ CDVScale.MakeScale[ off: mySheet.scale.off, nscale: mySheet.scale.nscale, grid: g ]; RepaintViewer[mySheet]; TerminalIO.WriteRope[" set to"]; TerminalIO.WriteRope[CDExtras.ToLambda[mySheet.scale.grid]]; TerminalIO.WriteLn[]; } ELSE TerminalIO.WriteRope["value out of range\n"]; END; SetSimplificationComm: PROC[comm: CDSequencer.Command] = BEGIN mySheet: MyGraphicRef = NARROW[comm.ref]; n: INT; TerminalIO.WriteRope["input viewer simplification profile\n"]; n _ TerminalIO.RequestSelection[ choice: LIST["very simplified", "simplified", "standard", "detailed", "very detailed", "all"], label: "simplification treshold" ]; SELECT n FROM 1 => mySheet.suppressFactorForCells _ 0.4; 2 => mySheet.suppressFactorForCells _ 0.7; 3 => mySheet.suppressFactorForCells _ 1; 4 => mySheet.suppressFactorForCells _ 1.6; 5 => mySheet.suppressFactorForCells _ 2.4; 6 => mySheet.suppressFactorForCells _ 0; ENDCASE => mySheet.suppressFactorForCells _ 1; RepaintViewer[mySheet] END; TicksInfoComm: PROC[comm: CDSequencer.Command] = BEGIN mySheet: MyGraphicRef = NARROW[comm.ref]; n: INT; ticks: INT _ 0; TerminalIO.WriteRope["input ticks info\n"]; n _ TerminalIO.RequestSelection[ choice: LIST["off", " 4", " 8", " 16", " 32", "type"], label: "Ticks" ]; SELECT n FROM 1 => ticks _ 0; 2 => ticks _ 4*lambda; 3 => ticks _ 8*lambda; 4 => ticks _ 16*lambda; 5 => ticks _ 32*lambda; 6 => BEGIN n: INT _ TerminalIO.RequestInt["Ticks: "]; IF n>=0 AND n<=LAST[INTEGER]/lambda-1 THEN ticks _ n*lambda ELSE TerminalIO.WriteRope["value out of range\n"]; END; ENDCASE; CDVTicks.ShowTicks[mySheet, ticks]; END; InstanceNames: PROC [comm: CDSequencer.Command] = BEGIN v: ViewerClasses.Viewer = GetViewer[comm]; TerminalIO.WriteRope["display instance names\n"]; IF v#NIL THEN ViewerOps.PaintViewer[v, client, FALSE, $DrawInstanceNames] END; SignalNames: PROC [comm: CDSequencer.Command] = BEGIN v: ViewerClasses.Viewer = GetViewer[comm]; TerminalIO.WriteRope["display signal names\n"]; IF v#NIL THEN ViewerOps.PaintViewer[v, client, FALSE, $DrawSignalNames] END; GetViewer: PROC[comm: CDSequencer.Command] RETURNS [v: ViewerClasses.Viewer _ NIL] = BEGIN IF comm#NIL THEN WITH comm.ref SELECT FROM my: MyGraphicRef => RETURN [my.viewer] ENDCASE => NULL END; GetOppositViewer: PROC[comm: CDSequencer.Command] RETURNS [ViewerClasses.Viewer] = BEGIN vl: CDViewer.ViewerList = CDViewer.ViewersOf[comm.design]; viewer: ViewerClasses.Viewer = GetViewer[comm]; onColor: BOOL = (viewer=NIL OR viewer.column=color); FOR l: CDViewer.ViewerList _ vl, l.rest WHILE l#NIL DO IF ~l.first.iconic THEN IF (l.first.column=color)#onColor THEN RETURN [l.first]; ENDLOOP; FOR l: CDViewer.ViewerList _ vl, l.rest WHILE l#NIL DO IF ~l.first.iconic THEN IF l.first.column#viewer.column THEN RETURN [l.first]; ENDLOOP; FOR l: CDViewer.ViewerList _ vl, l.rest WHILE l#NIL DO IF ~l.first.iconic THEN IF l.first#viewer THEN RETURN [l.first]; ENDLOOP; RETURN [viewer]; END; SmallScale: PROC [comm: CDSequencer.Command] RETURNS [BOOL] = BEGIN min: CD.DesignNumber = 30; RETURN [min>ABS[comm.pos.x-comm.sPos.x] AND min>ABS[comm.pos.y-comm.sPos.y]] END; ShowRectX: PROC [comm: CDSequencer.Command] = BEGIN viewer: ViewerClasses.Viewer = GetOppositViewer[comm]; TerminalIO.WriteRope["Position a viewer\n"]; IF viewer#NIL THEN IF SmallScale[comm] THEN CDViewer.ShowPosition[viewer: viewer, pos: comm.sPos] ELSE CDViewer.ShowAndScale[viewer: viewer, rect: CDBasics.ToRect[comm.pos, comm.sPos]]; END; ShowRect: PROC [comm: CDSequencer.Command] = BEGIN mySheet: MyGraphicRef = NARROW[comm.ref]; TerminalIO.WriteRope["Scale viewer"]; IF SmallScale[comm] THEN CDViewer.ShowPosition[viewer: mySheet.viewer, pos: comm.sPos] ELSE CDViewer.ShowAndScale[viewer: mySheet.viewer, rect: CDBasics.ToRect[comm.pos, comm.sPos]]; WriteLnScale[mySheet]; END; ResetScaleComm: PROC [comm: CDSequencer.Command] = BEGIN ResetScale: PROC [mySheet: MyGraphicRef] = BEGIN b: CD.DesignRect; TerminalIO.WriteRope["reset scale (view all)"]; b _ CDExtras.BoundingBox[mySheet.actualDesign]; IF CDBasics.NonEmpty[b] THEN CDViewer.ShowAndScale[viewer: mySheet.viewer, rect: b]; WriteLnScale[mySheet]; END; mySheet: MyGraphicRef = NARROW[comm.ref]; ResetScale[mySheet]; END; ResetScaleToSelectedComm: PROC [comm: CDSequencer.Command] = BEGIN b: CD.DesignRect; mySheet: MyGraphicRef = NARROW[comm.ref]; TerminalIO.WriteRope["reset scale to selection"]; b _ CDApplications.BoundingRectO[list: CDOps.AppList[comm.design], selectedOnly: TRUE]; IF CDBasics.NonEmpty[b] THEN { CDViewer.ShowAndScale[viewer: mySheet.viewer, rect: b]; WriteLnScale[mySheet]; } ELSE TerminalIO.WriteRope[" no selection\n"]; END; ResetScaleToPushedComm: PROC [comm: CDSequencer.Command] = BEGIN b: CD.DesignRect; mySheet: MyGraphicRef = NARROW[comm.ref]; TerminalIO.WriteRope["reset scale (to view all of pushed cell)"]; b _ CDApplications.BoundingRectO[list: CDOps.AppList[comm.design], selectedOnly: FALSE]; IF CDBasics.NonEmpty[b] THEN CDViewer.ShowAndScale[viewer: mySheet.viewer, rect: b]; WriteLnScale[mySheet]; END; DrawModeComm: PROC [comm: CDSequencer.Command] = BEGIN mySheet: MyGraphicRef = NARROW[comm.ref]; n: INT; TerminalIO.WriteRope["input drawing modes\n"]; n _ TerminalIO.RequestSelection[ choice: LIST["draw environment", "dont draw env.", "draw symbolic ob", "dont draw sym."], label: "drawing modes" ]; SELECT n FROM 1 => mySheet.environment _ TRUE; 2 => mySheet.environment _ FALSE; 3 => mySheet.symbolics _ TRUE; 4 => mySheet.symbolics _ FALSE; ENDCASE => TerminalIO.WriteRope["skipped\n"]; IF n#0 THEN RepaintViewer[mySheet] END; ShowViewers: PROC [comm: CDSequencer.Command] = BEGIN mySheet: MyGraphicRef = NARROW[comm.ref]; TerminalIO.WriteRope["show viewers\n"]; CDDraw.InsertCommand[mySheet.ct, CDDraw.Comm[cmd: ref, erase: FALSE, rect: CDBasics.universe, ref: $ShowViewers]] END; SplitViewer: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["split viewer\n"]; [] _ CDViewer.CreateViewer[comm.design] END; CDPanel.DefineButton[tech: NIL, name: "new view", proc: SplitViewer, queue: dontQueue, topLine: TRUE]; CDSequencer.ImplementCommand[$ScaleLessDetail, ScaleDown,, dontQueue]; CDSequencer.ImplementCommand[$ScaleMoreDetail, ScaleUp,, dontQueue]; CDSequencer.ImplementCommand[$MoveScreen, MoveScreen,, dontQueue]; CDSequencer.ImplementCommand[$DisplayNames, SignalNames,, doQueue]; CDSequencer.ImplementCommand[$DisplayInstanceNames, InstanceNames,, doQueue]; CDSequencer.ImplementCommand[$ShowRectX, ShowRectX,, dontQueue]; CDSequencer.ImplementCommand[$ShowRect, ShowRect,, dontQueue]; CDSequencer.ImplementCommand[$ResetScaleAll, ResetScaleComm,, dontQueue]; CDSequencer.ImplementCommand[$ResetScaleTop, ResetScaleToPushedComm,, dontQueue]; CDSequencer.ImplementCommand[$ResetScaleSel, ResetScaleToSelectedComm,, dontQueue]; CDSequencer.ImplementCommand[$DisplayViewers, ShowViewers,, doQueue]; CDSequencer.ImplementCommand[$SplitViewer, SplitViewer,, dontQueue]; CDSequencer.ImplementCommand[$GridInfo, GridInfoComm,, dontQueue]; CDSequencer.ImplementCommand[$TicksInfo, TicksInfoComm,, doQueue]; CDSequencer.ImplementCommand[$DrawMode, DrawModeComm,, doQueue]; CDSequencer.ImplementCommand[$SetSimplification, SetSimplificationComm,, dontQueue]; END. ”CDVCommands.mesa (part of ChipNDale) Copyright c 1983, 1985 by Xerox Corporation. All rights reserved. by Christian Jacobi, June 29, 1983 4:44 pm last edited Christian Jacobi, January 16, 1985 4:01:39 pm PST --gets viewer on different screen if possible, --else different viewer, if possible... 5 => mySheet.b1 _ TRUE; 6 => mySheet.b1 _ FALSE; 6 => mySheet.b2 _ TRUE; 7 => mySheet.b2 _ FALSE; Ê x˜šœ&™&Jšœ Ïmœ7™BJšœ+™+Jšœ=™=J˜—šÏk ˜ Jšžœ˜J˜J˜ J˜J˜ Jšœ˜Jšœ˜J˜ Jšœ ˜ J˜J˜ Jšœ ˜ Jšœ ˜ J˜ Jšœ žœ˜Jšœžœ ˜J˜—šÏb œžœž˜Jšžœ‰˜—Jšž˜Jšœžœ˜-Jšœžœžœ˜$J˜šÏn œžœ˜-Jšžœž˜ Jšœ.žœžœ˜9Jšžœ˜J˜—š  œžœ˜'Jšž˜J˜"Jšœ%˜%J˜Jšžœ˜—J˜š  œžœžœ˜5Jšž˜Jšœ žœžœ%˜7Jšžœžœ(˜Jšžœ˜Jšœ.žœ˜@Jšœžœ-˜CJšœžœ˜&Jšœ˜J˜%JšœJ˜JJšœT˜TJšœC˜CJšœT˜Tšœ˜Jšœ0˜0Jšœ˜Jšœ˜—JšœM˜MJšœ˜Jšœ˜Jšœ˜—Jšœ˜Jšžœ˜J˜—š œžœ˜+Jšž˜Jšœžœ ˜)Jš œžœžœžœžœ˜KJ˜Jšžœ˜J˜—š  œžœ˜-Jšž˜Jšœžœ ˜)Jšœ.˜.Jšžœ˜J˜—š  œžœ˜.Jšž˜Jšœžœ ˜)J˜J˜&J˜5J˜6šœ#˜#Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜—Jšœ˜Jšžœ˜J˜—š  œžœ˜0Jšžœ˜Jšœžœ ˜)Jšœžœ˜Jšœžœ˜Jšœ3˜3Jšœ<˜˜>šœ ˜ JšœžœR˜^J˜ J˜—šžœž˜ Jšœ*˜*Jšœ+˜+Jšœ)˜)Jšœ*˜*Jšœ*˜*Jšœ(˜(Jšžœ'˜.—Jšœ˜Jšžœ˜J˜—š  œžœ˜0Jšžœ˜ Jšœžœ ˜)Jšœžœ˜Jšœžœ˜Jšœ+˜+šœ ˜ Jšœžœ,˜8J˜J˜—šžœž˜ J˜J˜J˜J˜J˜šœž˜ Jšœžœ$˜*Jš žœžœžœžœ žœ˜;Jšžœ/˜3Jšžœ˜—Jšžœ˜—Jšœ#˜#Jšžœ˜J˜—š  œžœ˜1Jšžœ˜Jšœ*˜*Jšœ2˜2šžœžœžœ˜Jšœ!žœ˜;—Jšžœ˜J˜—š  œžœ˜/Jšžœ˜Jšœ*˜*Jšœ0˜0šžœžœžœ˜Jšœ!žœ˜9—Jšžœ˜J˜—š  œžœžœžœ˜TJšž˜šžœžœž˜šžœ žœž˜Jšœžœ ˜&Jšžœž˜——Jšžœ˜J˜—š œžœžœ˜RJšœ.™.Jšœ'™'Jšž˜Jšœ:˜:Jšœ/˜/Jšœ žœ žœžœ˜4šžœ%žœžœž˜6Jš žœžœžœ žœžœ ˜PJšžœ˜—šžœ%žœžœž˜6Jš žœžœžœžœžœ ˜NJšžœ˜—šžœ%žœžœž˜6Jš žœžœžœžœžœ ˜@Jšžœ˜—Jšžœ ˜Jšžœ˜J˜—š  œžœžœžœ˜=Jšž˜Jšœžœ˜Jšžœžœžœžœ˜LJšžœ˜—J˜šÐbn œžœ˜-Jšž˜Jšœ6˜6Jšœ,˜,šžœžœžœ˜Jšžœžœ6˜NJšžœS˜W—Jšžœ˜—J˜š œžœ˜,Jšž˜Jšœžœ ˜)Jšœ%˜%Jšžœžœ>˜VJšžœ[˜_Jšœ˜Jšžœ˜—J˜š¡œžœ˜2Jšž˜J˜š¡ œžœ˜*Jšž˜Jšœžœ ˜Jšœ/˜/Jšœ/˜/Jšžœžœ8˜TJšœ˜Jšžœ˜J˜—Jšœžœ ˜)Jšœ˜Jšžœ˜—J˜š¡œžœ˜žœ.˜qJšžœ˜—J˜š¡ œžœ˜/Jšž˜Jšœ'˜'J˜'Jšžœ˜—J˜J˜JšœžœBžœ˜fJšœF˜FJšœD˜DJšœB˜BJšœC˜CJšœM˜MJšœ@˜@Jšœ>˜>JšœI˜IJšœQ˜QJšœS˜SJšœE˜EJšœD˜DJšœB˜BJšœB˜BJšœ@˜@JšœT˜TJšžœ˜J˜—…—(Ü5è