DIRECTORY CD, CDBasics, CDDirectory, CDFeedback, CDOps, CDProperties, CDRects, CDViewer, CDCells, ImagerTransformation, Real, Rope; CDFeedbackImpl: CEDAR PROGRAM IMPORTS CDBasics, CDDirectory, CDOps, CDProperties, CDRects, CDViewer, CDCells, ImagerTransformation, Real EXPORTS CDFeedback = {OPEN CDFeedback; Showing: TYPE = REF ShowingRep; ShowingRep: PUBLIC TYPE = RECORD [ design: CD.Design, insts: InstanceList _ NIL]; InstanceList: TYPE = LIST OF Instance; Instance: TYPE = RECORD [ in: CD.Object, appl: CD.Instance]; feedbackKey: PUBLIC ATOM _ $Feedback; EmptyShow: PUBLIC SIGNAL = CODE; NoneVisible: PUBLIC SIGNAL = CODE; Show: PUBLIC PROC [ design: CD.Design, rect: CD.Rect, message: Rope.ROPE _ NIL, flag: ATOM _ $feedback, in: CellType, EnumerateSomeInstances: PROC [ cellType: CellType, to: PROC [transform: Transform, parent: CellType] RETURNS [stop: BOOL] ] ] RETURNS [showing: Showing] = { AddRect: PROC [r: CD.Rect, obj: CD.Object] = { ir: CD.Rect _ IF obj # NIL THEN CDBasics.Intersection[r, CDBasics.RectAt[pos: [0,0], size: obj.size]] ELSE r; ro: CD.Object _ CDRects.CreateRect[size: CDBasics.SizeOfRect[ir], l: CD.errorLayer]; appl: CD.Instance _ CDCells.IncludeOb[design: design, cell: obj, ob: ro, position: CDBasics.BaseOfRect[ir], cellCSystem: cdCoords, obCSystem: interrestCoords].newInst; CDProperties.PutInstanceProp[appl, $SignalName, message]; CDProperties.PutInstanceProp[appl, feedbackKey, flag]; showing.insts _ CONS[[obj, appl], showing.insts]; madeMarks _ TRUE; }; someVisibleBounds: CD.Rect; madeMarks, foundVisible: BOOL _ FALSE; FindTop: PROC [r: CD.Rect, ct: CellType] = { IF ct = top THEN { IF foundVisible THEN ERROR ELSE someVisibleBounds _ r; foundVisible _ TRUE} ELSE { TryInstance: PROC [transform: Transform, parent: CellType] RETURNS [stop: BOOL] = { FindTop[TransformRect[r, transform], parent]; stop _ foundVisible }; EnumerateSomeInstances[ct, TryInstance]; }; }; Mark: PROC [r: CD.Rect, ct: CellType] = { IF ct = top THEN { AddRect[r, NIL]; IF NOT foundVisible THEN FindTop[r, top]; } ELSE { MarkInInstance: PROC [transform: Transform, parent: CellType] RETURNS [stop: BOOL] = { Mark[TransformRect[r, transform], parent]; stop _ FALSE; }; shownHere: BOOL -- in names a ChipNDale object that is a cell in design--; found: BOOL; obj: CD.Object; [found, obj] _ CDDirectory.Fetch[design, ct]; shownHere _ found AND ISTYPE[obj.specificRef, CD.CellPtr]; IF shownHere THEN { AddRect[r, obj]; IF NOT foundVisible THEN FindTop[r, ct] } ELSE { EnumerateSomeInstances[ct, MarkInInstance]; } }; }; showing _ NEW [ShowingRep _ [design]]; Mark[rect, in]; IF foundVisible THEN {--scroll to show someVisibleBounds vl: CDViewer.ViewerList _ CDViewer.ViewersOf[design]; FOR vl _ vl, vl.rest WHILE vl # NIL DO IF CDViewer.DesignOf[vl.first].design = design THEN CDViewer.ShowAndScale[viewer: vl.first, rect: someVisibleBounds]; ENDLOOP; } ELSE IF madeMarks THEN NoneVisible[] ELSE EmptyShow[]; }; UnShow: PUBLIC PROC [showing: Showing] = { FOR il: InstanceList _ showing.insts, il.rest WHILE il # NIL DO [] _ CDCells.RemoveInstance[design: showing.design, cell: il.first.in, inst: il.first.appl] ENDLOOP; CDOps.Redraw[showing.design]; }; TransformRect: PROC [r: CD.Rect, t: Transform] RETURNS [s: CD.Rect] = { tr: ImagerTransformation.Rectangle _ ImagerTransformation.TransformRectangle[ t, [x: r.x1, y: r.y1, w: r.x2 - r.x1, h: r.y2 - r.y1]]; s _ CD.Rect[ x1: Real.Round[tr.x], y1: Real.Round[tr.y], x2: Real.Round[tr.x + tr.w], y2: Real.Round[tr.y + tr.h] ]; }; Start: PROC = { [] _ CDProperties.RegisterProperty[feedbackKey]; }; Start[]; }. ΤCDFeedbackImpl.Mesa Last Edited by: Spreitzer, December 13, 1984 6:17:18 pm PST Last Edited by: Jacobi, March 25, 1986 5:27:09 pm PST Will be clipped to bounding box of containing cells. Goes on the application as value of $SignalName property. Goes on the application as value of feedbackKey property. EnumerateSomeInstances may enumerate as many or as few (even none, if you're willing to live with the consequences) of the instances of cellType as it wishes. Κ'– "cedar" style˜Icode™J™;J™5K˜šΟk ˜ Kšœw˜y—K˜š Πbxœœœœdœ ˜Kšœœ ˜K˜Kšœ œœ ˜šœ œœœ˜"Kšœœ˜Kšœœ˜—K˜Kšœœœœ ˜&šœ œœ˜Kšœœ˜Kšœœ ˜—K˜Kšœ œœ ˜%K˜KšΠbl œœœœ˜ K˜KšŸ œœœœ˜"K˜šΟnœ˜š œ˜ Kšœœ˜šœœ˜K™4—šœœœ˜K™9—šœœ ˜K™9—Kšœ ˜ š œœ˜Kšœ˜Kšœœ*œœ˜FKšœ˜Kšœž™ž—Kšœ˜—Kšœ˜K˜š œœœ œ ˜.Kš œœœœœGœ˜mKšœœ?œ ˜TšœœB˜JJšœ$˜$Jšœ˜Jšœ$˜$—Kšœ9˜9Kšœ6˜6Kšœœ˜1Kšœ œ˜K˜—Kšœœ˜Kšœœœ˜&š œœœ˜,šœ œ˜Kšœœœœ˜6Kšœœ˜—šœ˜š  œœ*œœ˜SKšœ-˜-Kšœ˜K˜—Kšœ(˜(K˜—K˜—š œœœ˜)šœ œ˜Kšœ œ˜Kšœœœ˜)Kšœ˜—šœ˜š œœ*œœ˜VKšœ*˜*Kšœœ˜ K˜—Kšœ œΟc9œ˜JKšœœ˜ Kšœœ˜K˜-Kšœœœœ ˜:šœ œ˜K˜Kšœœœ˜'Kšœ˜—šœ˜K˜+Kšœ˜—K˜—K˜—Kšœ œ˜&Kšœ˜šœœ‘"˜8K˜5šœœœ˜&Kšœ-œB˜uKšœ˜—Kšœ˜—Kšœœ œ˜$Kšœ ˜K˜—K˜š œœœ˜*šœ+œœ˜?Kšœ[˜[Kšœ˜—K˜K˜—K˜š   œœœœœ ˜GšœM˜MKšœ7˜7—šœœ˜ Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜—K˜—K˜š œœ˜Kšœ0˜0K˜—K˜K˜K˜K˜——…—