<> <> DIRECTORY Basics, Core, CoreClasses, CoreFlat, HashTable, Rope; CoreStructuralComparison: CEDAR DEFINITIONS = { ROPE: TYPE ~ Rope.ROPE; Role: TYPE ~ {A, B}; RoleNames: TYPE ~ ARRAY Role OF ROPE; CellTypePair: TYPE ~ ARRAY Role OF Core.CellType; FlattenAndCompare: PROC [ roleNames: ARRAY Role OF ROPE, cts: CellTypePair, stss: ARRAY Role OF SubtreeSpec _ ALL[ToLeaves], mss: ARRAY Role OF MergeSpec _ ALL[MergeNothing], GiveHints: HintsGiver _ NIL, PerPair: AssociationPairConsumer _ NIL, PerMismatch: MismatchConsumer _ NIL, Querier: AssociationQuerier _ NIL, automorphismHack, mayQuitEarly: BOOL _ FALSE, didQuitEarly, abort: REF BOOL ] RETURNS [isomorphic: BOOL]; HintsGiver: TYPE = PROC [Consume: HintConsumer]; HintConsumer: TYPE = PROC [ds: ARRAY Role OF Descendant]; <> <> AssociationPairConsumer: TYPE = PROC [Pair]; <> AssociationQuerier: TYPE = PROC [Ans: QueryAnswerer]; QueryAnswerer: TYPE = PROC [Role, Descendant] RETURNS [Pair]; <> ColorElts: TYPE ~ ARRAY Role OF ElementList; ElementList: TYPE ~ LIST OF Element; Pair: TYPE ~ ARRAY Role OF Element; Element: TYPE ~ LIST OF Descendant; Descendant: TYPE = REF ANY--actually UNION [DescendantWire, DescendantCellInstance]--; DescendantWire: TYPE = REF DescendantWirePrivate; DescendantWirePrivate: TYPE = CoreFlat.FlatWireRec; DescendantCellInstance: TYPE = REF DescendantCellInstancePrivate; DescendantCellInstancePrivate: TYPE = CoreFlat.InstancePath; SubtreeSpec: TYPE = PROC [instance: CoreClasses.CellInstance, path: CoreFlat.InstancePath] RETURNS [leafType: Core.CellType]; <> <> <> ToLeaves: SubtreeSpec; <> DontFlatten: SubtreeSpec; <> MergeSpec: TYPE = PROC [ original, parent: Core.CellType, path: CoreFlat.InstancePath, EnumerateInstances: PROC [Consume: PROC [ci: CoreClasses.CellInstance] RETURNS [stop: BOOL _ FALSE]], IdentifyActual: PROC [ci: CoreClasses.CellInstance, actual: Core.Wire, describe: BOOL _ FALSE] RETURNS [ActualID], Consume: MergeConsumer]; <> <> MergeConsumer: TYPE = PROC [ds: Element]; <> ActualID: TYPE = RECORD [id: REF ANY, description: ROPE]; MergeNothing: MergeSpec; MismatchConsumer: TYPE = PROC [ msg: ROPE _ NIL, kind: MismatchKind, cts: CellTypePair, colorElts: ColorElts, Ans: QueryAnswerer ]; MismatchKind: TYPE = {stuck, difference, transistorShape}; <> HashDescendant: PROC [ra: REF ANY] RETURNS [hash: CARDINAL]; DescendantEqual: PROC [r1, r2: REF ANY] RETURNS [equal: BOOL]; RefHash: PROC [ra: REF ANY] RETURNS [CARDINAL] = INLINE { ln: Basics.LongNumber = [lc[LOOPHOLE[ra]]]; RETURN [ln.lo + ln.hi]; }; }.