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.highLightError]; appl: CD.Instance _ CDCells.IncludeOb[design: design, cell: obj, ob: ro, position: CDBasics.BaseOfRect[ir], cellCSystem: cdCoords, obCSystem: interrestCoords].newInst; CDProperties.PutPropOnInstance[appl, $SignalName, message]; CDProperties.PutPropOnInstance[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, May 22, 1985 5:29:08 pm PDT 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™3K˜šฯ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šœœ?œ˜XšœœB˜JJšœ$˜$Jšœ˜Jšœ$˜$—Kšœ;˜;Kšœ8˜8Kšœœ˜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˜——…—