<> <> <> <> <> DIRECTORY Core, CoreClasses; CoreFlatten: CEDAR DEFINITIONS = BEGIN <> <> <> Wire: TYPE = Core.Wire; CellType: TYPE = Core.CellType; ROPE: TYPE = Core.ROPE; CellInstance: TYPE = CoreClasses.CellInstance; <> <> InstantiationPath: TYPE = LIST OF CellInstance; -- deeper first <> wireSource: ATOM; WireSource: TYPE = REF WireSourceRec; WireSourceRec: TYPE = RECORD [ instantiationPath: InstantiationPath, wire: Wire, instance: CellInstance]; -- NIL for public and internal wires, not NIL for actual wires instanceSource: ATOM; InstanceSource: TYPE = REF InstanceSourceRec; InstanceSourceRec: TYPE = RECORD [ instantiationPath: InstantiationPath, instance: CellInstance]; GetShallowest: PROC [path: InstantiationPath] RETURNS [shallowest: CellInstance]; AllButShallowest: PROC [path: InstantiationPath] RETURNS [allBut: InstantiationPath]; <> Flatten: PROC [cellType: CellType, control: FlattenControl] RETURNS [flat: CellType]; <> ExpandNonPrimitive: FlattenControl; <> <> <> FlattenControl: TYPE = REF FlattenControlRec; FlattenControlRec: TYPE = RECORD [Decide: FlattenControlProc, data: REF ANY]; FlattenControlProc: TYPE = PROC [data: REF ANY, who: InstantiationPath] RETURNS [ExpandDecision]; ExpandDecision: TYPE = {leaf, expand}; <> CoreFlattenCutSets: ATOM; ControlByCutSet: PROC [cutSetName: ROPE] RETURNS [control: FlattenControl]; <> <<>> ControlByRecognition: PROC [rl: RecognitionList] RETURNS [control: FlattenControl]; RecognitionList: TYPE = LIST OF Recognition; Recognition: TYPE = RECORD [ recognizer: Recognizer, whatToDo: SELECT kind: * FROM immediate => [decision: ExpandDecision], nest => [subControl: FlattenControl], ENDCASE]; Recognizer: TYPE = REF RecognizerRec; RecognizerRec: TYPE = RECORD [ Recognize: PROC [data: REF ANY, ci: CellInstance] RETURNS [IRecognizeYou: BOOL], data: REF ANY]; RecognizeName: PROC [name: ROPE] RETURNS [r: Recognizer]; END.