DIRECTORY Asserting, Rope, StructuralComparisonDataStructure, StructuralComparisonOps; StructuralComparisonDataStructureImpl: CEDAR PROGRAM IMPORTS Asserting, Rope, StructuralComparisonDataStructure EXPORTS StructuralComparisonDataStructure, StructuralComparisonOps = BEGIN OPEN StructuralComparisonDataStructure; graphIDToRope: PUBLIC GraphDescriptions _ [A: "A", B: "B", Unspecified: "Unspecified"]; transistorTolerancesKey: PUBLIC ATOM _ $StructuralComparisonTransistorTolerances; defaultTransistorTolerances: PUBLIC TransistorTolerances ~ NEW [TransistorTolerancesPrivate _ ALL[[1.0E-6, 1.0E6]]]; TransistorDimName: PUBLIC ARRAY TransistorDim OF ROPE _ ["length", "width"]; endOfQ: PUBLIC Vertex _ NEW [VertexRep]; initialNetColor: Color _ 1; mirrorColor: Color _ 2; InitialColor: PUBLIC PROC [v: Vertex] RETURNS [initialColor: Color] = { SELECT v.class FROM net => initialColor _ initialNetColor; cell => initialColor _ IF IsMirror[v] THEN mirrorColor ELSE v.type.color; ENDCASE => ERROR; initialColor _ FilterColor[initialColor]; }; MergeVertices: PUBLIC PROC [parent: CellType, v1, v2: Vertex] RETURNS [merged, doomed: Vertex] = BEGIN MoveToMerged: PROC [e: Edge] = { e.sides[net].v _ merged; }; IF v1 = v2 THEN RETURN [v1, NIL]; merged _ v1; doomed _ v2; IF merged.deleted OR doomed.deleted THEN ERROR; IF merged.class # doomed.class THEN ERROR; doomed.better _ merged; merged.name _ UnionNames[merged.name, doomed.name]; SELECT merged.class FROM net => { EnumerateFullEdges[doomed, MoveToMerged, FALSE]; IF doomed.firstEdge # NIL THEN { IF merged.lastEdge # NIL THEN merged.lastEdge.sides[net].next _ doomed.firstEdge ELSE merged.firstEdge _ doomed.firstEdge; merged.lastEdge _ doomed.lastEdge; doomed.firstEdge.sides[net].prev _ merged.lastEdge; doomed.firstEdge _ NIL; doomed.lastEdge _ NIL; }; }; cell => -- If they're cells, the caller asserts that they are connected identically  i.e., nothing needs to be done but delete the doomed vertex and the edges touching it.-- NULL; ENDCASE => ERROR; DeleteVertex[parent, doomed]; merged.other _ Asserting.Union[merged.other, doomed.other]; END; UnionNames: PROC [n1, n2: ROPE] RETURNS [un: ROPE] = { un _ IF n1.Length[] = 0 THEN n2 ELSE IF n2.Length[] = 0 THEN n1 ELSE n1.Cat["|", n2]; }; DeleteVertex: PUBLIC PROC [parent: CellType, v: Vertex] = { Killit: PROC [e: Edge] = { RemoveEdge[e]; }; EnumerateFullEdges[v, Killit, FALSE]; v.deleted _ TRUE; SELECT v.class FROM cell => parent.cellCount _ parent.cellCount - 1; net => parent.netCount _ parent.netCount - 1; ENDCASE => ERROR; parent.size _ parent.size - 1; }; RemoveEdge: PUBLIC PROC [e: Edge] = { FOR dir: VertexClass IN VertexClass DO [e.sides[dir].v.firstEdge, e.sides[dir].v.lastEdge] _ UnlinkEdge[e.sides[dir].v.firstEdge, e.sides[dir].v.lastEdge, e, dir]; ENDLOOP; }; UnlinkEdge: PROC [head, tail, e: Edge, dir: VertexClass] RETURNS [newHead, newTail: Edge] = { newHead _ head; newTail _ tail; IF e.sides[dir].next # NIL THEN e.sides[dir].next.sides[dir].prev _ e.sides[dir].prev ELSE newTail _ e.sides[dir].prev; IF e.sides[dir].prev # NIL THEN e.sides[dir].prev.sides[dir].next _ e.sides[dir].next ELSE newHead _ e.sides[dir].next; }; END. rStructuralComparisonDataStructureImpl.Mesa Last tweaked by Mike Spreitzer on March 24, 1987 2:51:44 pm PST Κ’– "cedar" style˜code™*K™?—K˜KšΟk œM˜VK˜šΠbx%œœ˜4Kšœ3˜:Kšœ=˜D—K˜Kšœœ#˜-K˜Kšœœœœ#˜WK˜Kšœœœ-˜QK˜Kšœœœ œ˜tK˜Kš Οnœœœœœ˜LK˜Kšœœ œ ˜(K˜K˜K˜K˜šŸ œœœ œ˜Gšœ ˜Kšœ&˜&Kšœœ œ œ˜IKšœœ˜—Kšœ)˜)K˜—K˜šŸ œœœ$œ˜`Kš˜šŸ œœ˜ Kšœ˜K˜—Kšœ œœœ˜!Kšœ ˜ K˜ Kšœœœœ˜/Kšœœœ˜*K˜K˜3šœ˜˜Kšœ)œ˜0šœœœ˜ Kšœœœ4œ%˜zKšœ"˜"Kšœ3˜3Kšœœ˜Kšœœ˜K˜—K˜—KšœΟc¦œœ˜΄Kšœœ˜—K˜Kšœ;˜;Kšœ˜—K˜š Ÿ œœ œœœ˜6Kš œœœœœœœ˜UK˜—K˜šŸ œœœ"˜;šŸœœ˜Kšœ˜Kšœ˜—Kšœœ˜%Kšœ œ˜šœ ˜Kšœ0˜0Kšœ-˜-Kšœœ˜—Kšœ˜K˜—K˜šŸ œœœ˜%šœœ ˜&K˜|Kšœ˜—K˜—K˜šŸ œœ)œ˜]K˜Kšœœœ7œ˜wKšœœœ7œ˜wK˜—K˜Kšœ˜—…— l€