<> <> DIRECTORY IO, OrderedSymbolTableRef, Rope; ComparePrivate: CEDAR DEFINITIONS = BEGIN ROPE: TYPE = Rope.ROPE; SymbolTable: TYPE = OrderedSymbolTableRef.Table; Color: TYPE = HashTableIndex; noColor: Color = LAST[Color]; HashTableIndex: TYPE = CARDINAL; NullIndex: HashTableIndex = LAST[HashTableIndex]; VertexClass: TYPE = {net, component}; NetVertex: TYPE = REF VertexRep[net]; ComponentVertex: TYPE = REF VertexRep[component]; Vertex: TYPE = REF VertexRep; VertexRep: TYPE = RECORD [ name: ROPE, QNext: Vertex _ notInQ, colorNext, equiv: Vertex _ NIL, oldColor, curColor: Color _ noColor, graph: GraphID, unique, suspect: BOOL _ FALSE, variant: SELECT class: VertexClass FROM net => [used: CARDINAL, neighbors: SEQUENCE length: CARDINAL OF NetNeighbor], component => [ ports: PortS, neighbors: SEQUENCE length: CARDINAL OF NetVertex], ENDCASE ]; notInQ: Vertex = NIL--but you're not supposed to know that--; endOfQ: Vertex; NetNeighbor: TYPE = RECORD [v: ComponentVertex, color: Color--of edge--]; ComponentType: TYPE = REF ComponentTypeRep; ComponentTypeRep: TYPE = RECORD [ name, file: ROPE, ports: PortS _ NIL]; PortS: TYPE = REF PortSeq; PortSeq: TYPE = RECORD [ports: SEQUENCE length: CARDINAL OF Port]; Port: TYPE = RECORD [name: ROPE, color: Color]; HashTable: TYPE = REF HashTableRep; HashTableRep: TYPE = RECORD [ firstNonEmpty: HashTableIndex _ NullIndex, entries: SEQUENCE length: HashTableIndex OF HashTableEntry]; GraphID: TYPE = {A, B}; HashTableEntry: TYPE = RECORD [ v: Vertex _ NIL, nextNonEmpty: HashTableIndex _ NullIndex, count: ARRAY GraphID OF CARDINAL _ [0, 0], newColor: Color _ noColor, suspect, multicolored: BOOL _ FALSE ]; <> MinHashSize: CARDINAL = 511; graphIDToRope: ARRAY GraphID OF ROPE; HashRope: PROC [r: ROPE, hashTableSize: CARDINAL] RETURNS [Color]; CompareCDs: PROC [vertices: SymbolTablePair]; SymbolTablePair: TYPE = ARRAY GraphID OF SymbolTable; Log: PROC [format: ROPE, v1, v2, v3, v4, v5: IO.Value _ [null[]]]; WriteAll: PROC [when: ROPE, vertices: SymbolTablePair, hashTable: HashTable]; END.