DrcDebugImpl.mesa
Copyright Ó 1987, 1988 by Xerox Corporation. All rights reserved.
Written by gbb, January 12, 1987 11:47:17 am PST
gbb January 16, 1988 3:25:33 pm PST
DIRECTORY
CD USING [LayerKey],
CDBasicsInline USING [MapRect, Rect],
CDProperties USING [RegisterProperty],
Core USING [Wire],
CoreGeometry USING [Decoration, EachInstanceProc, EnumerateGeometry, FlattenInstance, InlineBBox, Transformation],
CoreProperties USING [RegisterProperty],
CoreOps USING [GetShortWireName],
DrcDebug,
IO USING [atom, card, int, noWhereStream, PutF, refAny, rope, STREAM],
MessageWindow USING [Append, Blink, Clear],
Rope USING [ROPE],
UserProfile USING [Boolean, CallWhenProfileChanges, ProfileChangedProc],
ViewerIO USING [CreateViewerStreams],
ViewerTools USING [FindExistingViewer, Viewer];
DrcDebugImpl: CEDAR PROGRAM
IMPORTS CD, CDBasicsInline, CDProperties, CoreGeometry, CoreOps, CoreProperties, IO, MessageWindow, UserProfile, ViewerIO, ViewerTools
EXPORTS DrcDebug
~ BEGIN OPEN DrcDebug;
debug: PUBLIC BOOL ← UserProfile.Boolean [key: "Genista.Debug", default: FALSE];
trace: PUBLIC ATOM ← CoreProperties.RegisterProperty [$DrcTrace];
pause: PUBLIC ATOM ← CoreProperties.RegisterProperty [$break];
break: PUBLIC SIGNAL ~ CODE;
dLog: PUBLIC IO.STREAM ← IO.noWhereStream;
Note: Output to noWhereStream passes all I/O code, and hence is very slow !
ActivateDebug: UserProfile.ProfileChangedProc ~ BEGIN
profile: BOOL ~ UserProfile.Boolean [key: "Genista.Debug", default: FALSE];
IF debug THEN {IF (debug # profile) THEN debug ← FALSE}
ELSE {IF (debug # profile) THEN Debug}
END; -- ActivateDebug
Debug: PUBLIC PROC ~ BEGIN
For convenience in debugging. Call this procedure in the Interpreter.
viewerName: Rope.ROPE ~ "Genista debug";
viewer: ViewerTools.Viewer ← ViewerTools.FindExistingViewer [viewerName];
debug ← TRUE; -- Get all in one
dLog ← ViewerIO.CreateViewerStreams [viewerName, viewer].out
END; -- Debug
PrintWire: PUBLIC PROC [w: Core.Wire] ~ BEGIN
dLog.PutF ["%g %g %g\n", IO.rope [CoreOps.GetShortWireName[w]], IO.card [LOOPHOLE[w]], IO.refAny [w]];
FOR i: NAT IN [0 .. w.size) DO
dLog.PutF ["\t(%g) %g %g %g\n", IO.card [i], IO.rope [CoreOps.GetShortWireName[w[i]]], IO.card [LOOPHOLE[w[i]]], IO.refAny [w[i]]]
ENDLOOP
END; -- PrintWire
GeometryInWire: PUBLIC PROC [w: Core.Wire, transf: CoreGeometry.Transformation, handle: CoreGeometry.Decoration] ~ BEGIN
ListRect: CoreGeometry.EachInstanceProc ~ BEGIN
PROC [instance: CdInsts] RETURNS [quit: BOOLFALSE]
SELECT instance.obj.class.objectType FROM
$Rect, $WellRect => BEGIN
r: CDBasicsInline.Rect ← CDBasicsInline.MapRect [CoreGeometry.InlineBBox [instance], transf];
dLog.PutF ["\t%g [x1: %g, y1: %g, x2: %g, y2: %g]\n",
IO.atom [CD.LayerKey [instance.obj.layer]],
IO.int [r.x1], IO.int [r.y1], IO.int [r.x2], IO.int [r.y2]]
END;
$AlignmentMarkOb, $SymbolicSegment, $PinOb0 => NULL;
ENDCASE => quit ← CoreGeometry.FlattenInstance [instance, ListRect]
END; -- ListRect
dLog.PutF ["Wire %g:\n", IO.rope [CoreOps.GetShortWireName [w]]];
[] ← handle.EnumerateGeometry [w, ListRect]; dLog.PutF ["\n"]
END; -- GeometryInWire
ImportantMessage: PUBLIC PROC [msg: Rope.ROPE] ~ BEGIN
Displays the message in the message viewer and blinks it.
MessageWindow.Clear []; MessageWindow.Append [msg]; MessageWindow.Blink []
END; -- ImportantMessage
[] ← CDProperties.RegisterProperty [trace, $gbb];
[] ← CDProperties.RegisterProperty [pause, $gbb];
IF debug THEN Debug[];
UserProfile.CallWhenProfileChanges [ActivateDebug]
END.