DIRECTORY CardHashTableThreaded, IO, Rope, StructuralComparisonDataStructure, StructuralComparisonOps, TiogaOps, ViewerClasses, ViewerForkers, ViewerIO; StructuralComparisonLog: CEDAR PROGRAM IMPORTS CardHashTableThreaded, IO, Rope, StructuralComparisonDataStructure, TiogaOps, ViewerForkers, ViewerIO EXPORTS StructuralComparisonOps SHARES StructuralComparisonDataStructure = BEGIN OPEN StructuralComparisonDataStructure; log: IO.STREAM _ NIL; viewer: ViewerClasses.Viewer _ NIL; EnsureLog: PROC = { IF log = NIL OR viewer = NIL OR viewer.destroyed THEN { log _ ViewerIO.CreateViewerStreams["Structural Comparison Debug Log"].out; viewer _ ViewerIO.GetViewerFromStream[log]; IF viewer = NIL THEN ERROR; TiogaOps.SetNodeStyle["Ascii", TiogaOps.ViewerDoc[viewer]]; viewer.newVersion _ FALSE; ViewerForkers.ForkPaint[viewer: viewer, hint: caption, tryShortCuts: TRUE]; }; }; Log: PUBLIC PROC [format: ROPE, v1, v2, v3, v4, v5: IO.Value _ [null[]]] = { EnsureLog[]; log.PutF[format, v1, v2, v3, v4, v5]}; FlushLog: PUBLIC PROC = {EnsureLog[]; log.Flush[]}; WriteAll: PUBLIC PROC [when: ROPE, descriptions: RealGraphDescriptions, a, b: CellType, oldColorData, curColorData: ColorTable] = BEGIN Log["\n%g\n", IO.rope[when]]; WriteColorTable[curColorData, descriptions]; WriteParts[descriptions[A], a]; WriteParts[descriptions[B], b]; Log["\nDone %g\n", IO.rope[when]]; END; WriteColorTable: PUBLIC PROC [colorTable: ColorTable, descriptions: RealGraphDescriptions] = BEGIN WriteColor: PROC [key: CARD, value: REF ANY] RETURNS [quit: BOOL _ FALSE] --CardHashTableThreaded.EachPairAction-- = { color: Color = key; ccd: ColorData = NARROW[value]; Log["%08x %4g %4g", IO.card[color], IO.card[ccd.count[A]], IO.card[ccd.count[B]]]; Log[" %5g", IO.bool[ccd.suspect]]; FOR g: RealGraphID IN RealGraphID DO first: BOOL _ TRUE; FOR v: Vertex _ ccd.firstVertex, GetColorNext[v] WHILE v # NIL DO IF GetGraph[v]=g THEN { Log[" "]; IF first THEN {Log["%g: {", [rope[descriptions[g]]]]; first _ FALSE}; Log[VerboseVName[v]]; }; ENDLOOP; IF NOT first THEN Log["}"]; ENDLOOP; Log["\n"]; }; Log["\nColorTable:\n"]; Log["Color, number of %g vertices, num %g, suspect, vertex list\n", [rope[descriptions[A]]], [rope[descriptions[B]]]]; [] _ colorTable.Pairs[WriteColor]; Log["\n"]; END; WriteParts: PROC [description: ROPE, ct: CellType] = BEGIN WriteVertex: PROC [v: Vertex] = { Log["%08x %08x %5g %5g %12g", IO.card[OldColor[v]], IO.card[CurColor[v]], IO.bool[GetUnique[v]], IO.bool[GetSuspect[v]], IO.rope[VerboseVName[v]]]; IF GetEquiv[v] # NIL THEN Log["\t%g\n", IO.rope[VerboseVName[GetEquiv[v]]]] ELSE Log["\n"]; }; Log["\n%g vertices:\n", IO.rope[description]]; Log["OldColor CurColor Unique Suspect Name\t\tPartner\n"]; EnumerateParts[ct, WriteVertex, TRUE]; END; VerboseVName: PUBLIC PROC [v: Vertex] RETURNS [name: ROPE] = { name _ IF VName[v].Length[] # 0 THEN VName[v] ELSE IO.PutFR["%bB^", [cardinal[LOOPHOLE[v]]]]; }; PrintCellType: PROC [to: IO.STREAM, ct: CellType] = { PrintIfNet: PROC [v: Vertex] = { SELECT v.class FROM net => {to.PutChar[' ]; to.PutRope[VerboseVName[v]]}; cell => NULL; ENDCASE => ERROR; }; PrintIfCI: PROC [v: Vertex] = { SELECT v.class FROM net => NULL; cell => PrintCI[to, v]; ENDCASE => ERROR; }; to.PutF["%g: CellType\n\tNets:", [rope[ct.name]]]; EnumerateParts[ct, PrintIfNet, FALSE]; to.PutRope["\n\tChildren:"]; EnumerateParts[ct, PrintIfCI, TRUE]; to.PutRope["\n\tEndCellType\n"]; }; PrintCI: PROC [to: IO.STREAM, v: Vertex] = { first: BOOL _ TRUE; pi: PortIndex _ 0; to.PutF["\n\t\t%g: %g[", [rope[VerboseVName[v]]], [rope[v.type.name]]]; FOR e: Edge _ v.firstEdge, e.sides[cell].next WHILE e # NIL DO portName: ROPE = v.type.ports[pi].name; netName: ROPE = VerboseVName[e.sides[net].v]; IF NOT portName.Equal[netName] THEN { IF first THEN first _ FALSE ELSE to.PutRope[", "]; to.PutF["%g: %g", [rope[portName]], [rope[netName]]]; }; pi _ pi + 1; ENDLOOP; to.PutF["]"]; }; END. StructuralComparisonLog.Mesa Bertrand Serlet June 4, 1986 4:16:24 pm PDT Last tweaked by Mike Spreitzer on March 26, 1987 12:54:09 pm PST ΚŒ– "cedar" style˜code™K™+K™@—K˜KšΟk œœu˜˜K˜šΡbnxœœ˜&KšœœL˜mKšœ˜Kšœ"˜(Kšœ˜K˜Kšœœ#˜-K˜Kšœœœœ˜Kšœœ˜#K˜šΟn œœ˜š œœœ œœœ˜7KšœJ˜JKšœ+˜+Kšœ œœœ˜Kšœ;˜;Kšœœ˜K•StartOfExpansion{[viewer: ViewerClasses.Viewer, hint: ViewerClasses.PaintHint, clearClient: BOOL _ TRUE, whatChanged: REF ANY _ NIL]šœEœ˜KK˜—K˜—K˜š Ÿœœœ œœ˜LKšœ ˜ Kšœ&˜&—K˜KšŸœœœ˜3K˜šŸœœœœ`˜Kš˜Kšœœ ˜Kšœ,˜,Kšœ˜Kšœ˜Kšœœ ˜"Kšœ˜—K˜šŸœœœ@˜\Kš˜šŸ œœœ œœœœœΟc(œ˜vK˜Kšœœ˜Kšœœœœ˜RKšœ œ˜"šœœ ˜$Kšœœœ˜šœ.œœ˜Ašœœ˜Kšœ ˜ Kšœœ1œ˜EKšœ˜K˜—Kšœ˜—Kšœœœ ˜Kšœ˜—K˜ K˜—K˜Kšœv˜vKšœ"˜"K˜ Kšœ˜—K˜šŸ œœœ˜4Kš˜šŸ œœ˜!Kš œ#œœœœœ˜˜Kš œœœœ"œ ˜[Kšœ˜—Kšœœ˜.K˜Kš œœœ œœœ˜]K˜—K˜šŸ œœœœ˜5šŸ œœ˜ šœ ˜Kšœ5˜5Kšœœ˜ Kšœœ˜—K˜—šŸ œœ˜šœ ˜Kšœœ˜ Kšœ˜Kšœœ˜—K˜—K˜2Kšœœ˜&K˜Kšœœ˜$K˜ K˜—K˜šŸœœœœ˜,Kšœœœ˜K˜KšœG˜Gšœ+œœ˜>Kšœ œ˜'Kšœ œ ˜-šœœœ˜%Kšœœ œœ˜2Kšœ5˜5K˜—K˜ Kšœ˜—K˜ K˜—K˜Kšœ˜——…—Tp