<> <> DIRECTORY Basics, Core, CoreClasses, CoreFlat, RefTab, Rope, SymTab; CoreStructuralComparison: CEDAR DEFINITIONS = { ROPE: TYPE ~ Rope.ROPE; Role: TYPE ~ {A, B}; RoleNames: TYPE ~ ARRAY Role OF ROPE; CellTypePair: TYPE ~ ARRAY Role OF Core.CellType; SubtreeSpecPair: TYPE ~ ARRAY Role OF SubtreeSpec; MergeSpecPair: TYPE ~ ARRAY Role OF MergeSpec; FlattenAndCompare: PROC [ roleNames: RoleNames, cts: CellTypePair, stss: SubtreeSpecPair _ ALL[ToLeaves], mss: MergeSpecPair _ ALL[MergeNothing], GiveHints: HintsGiver _ NIL, PerPair: AssociationPairConsumer _ NIL, PerMismatch: MismatchConsumer _ NIL, PerDroppedConnection: DroppedConnectionConsumer _ NIL, PerBogusMerge: BogusMergeConsumer _ NIL, Querier: AssociationQuerier _ NIL, trace: Trace _ NIL, automorphismHack, mayQuitEarly: BOOL _ FALSE, didQuitEarly, abort: REF BOOL, ttols: TransistorTolerances, vsp: ViewStatsPair _ [NIL, NIL], data: REF ANY _ NIL ] RETURNS [isomorphic: BOOL]; ViewStatsPair: TYPE ~ ARRAY Role OF ViewStats; ViewStats: TYPE ~ REF ViewStatsPrivate; ViewStatsPrivate: TYPE; CreateViewStatsPair: PROC RETURNS [ViewStatsPair]; FmtViewStatsPair: PROC [ViewStatsPair, RoleNames] RETURNS [ROPE]; 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 [data: REF ANY, instance: CoreClasses.CellInstance, path: DescendantCellInstancePrivate, ttols: TransistorTolerances] RETURNS [SubtreeAns]; SubtreeAns: TYPE ~ RECORD [ leafType: Core.CellType, publicInvMapEnumerator: MapEnumerator, Pop: PROC [data: REF ANY] _ NIL ]; <> <> MapEnumerator: TYPE ~ RECORD [ Enumerate: PROC [data: REF ANY, Consume: MapConsumer], data: REF ANY _ NIL]; MapConsumer: TYPE ~ PROC [from: REF ANY, ProduceTos: ToProducer]; ToProducer: TYPE ~ PROC [Consume: ToConsumer]; ToConsumer: TYPE ~ PROC [to: REF ANY]; CreateParallelMapper: PROC [from, to: Core.CellType] RETURNS [MapEnumerator]; CreateIdentityMapper: PROC [ct: Core.CellType] RETURNS [MapEnumerator] ~ INLINE {RETURN CreateParallelMapper[ct, ct]}; ToLeaves: SubtreeSpec; <> DontFlatten: SubtreeSpec; <> MergeSpec: TYPE = PROC [ data: REF ANY, parent: Core.CellType, recastOfSubroot: BOOL, 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, Depublicize: Depublicizer]; <> <> <> 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 ]; DroppedConnectionConsumer: TYPE ~ PROC [role: Role, subroot: Core.CellType, public, actual: DescendantWire]; BogusMergeConsumer: TYPE ~ PROC [role: Role, subroot: Core.CellType, w1, w2: DescendantWire, from: DescendantCellInstance]; Depublicizer: TYPE ~ PROC [Core.Wire]; <> MismatchKind: TYPE = {stuck, difference, transistorShape}; <> wideTransistorTolerances: READONLY TransistorTolerances; tightTransistorTolerances: READONLY TransistorTolerances; TransistorTolerances: TYPE ~ REF TransistorTolerancesPrivate; TransistorTolerancesPrivate: TYPE ~ ARRAY TransistorDim OF Tolerance; TransistorDim: TYPE ~ {length, width}; Tolerance: TYPE ~ RECORD [min, max: REAL--a/b--]; TransistorDimName: READONLY ARRAY TransistorDim OF ROPE; FormatTolerances: PROC [TransistorTolerances] RETURNS [ROPE]; Trace: TYPE ~ SymTab.Ref --that contains names of Descendants to be traced--; HashDescendant: PROC [ra: REF ANY] RETURNS [hash: CARDINAL]; DescendantEqual: PROC [key1, key2: REF ANY] RETURNS [equal: BOOL]; RefHash: PROC [ra: REF ANY] RETURNS [CARDINAL] = INLINE { ln: Basics.LongNumber = [lc[LOOPHOLE[ra]]]; RETURN [ln.lo + ln.hi]; }; DisplayStats: PROC; GetConstraints: PROC [subroot: Core.CellType] RETURNS [RefTab.Ref]; PushTimer: PROC [ATOM]; PopTimer: PROC [ATOM]; }.