Abstract Cut Sets
Cut: 
TYPE = 
RECORD [
MembershipTester: CutMembershipTester,
data: REF ANY ← NIL];
CutMembershipTester: TYPE = PROC [cutData: REF ANY, root: CellType, cellType: CellType, flatCell: FlatCellTypeRec, instance: CellInstance] RETURNS [BOOL];
Includes: 
PROC [cut: Cut, root: CellType, cellType: CellType, flatCell: FlatCellTypeRec, instance: CellInstance] 
RETURNS [
BOOL]
= INLINE {RETURN [cut.MembershipTester[cut.data, root, cellType, flatCell, instance]]};
 
SetCut: PROC [CutSet] RETURNS [Cut];
leaves: Cut;
 
Flat printing
FlatPrint: 
PROC [
root: CellType,
filter: Filter ← NIL,
to: IO.STREAM,
Annotator: PROC [subject: Descendant, to: IO.STREAM] ← NIL,
leaves: Cut
];
 
Filter: TYPE ~ PROC [cellType: CellType, flatCell: FlatCellTypeRec, instance: CellInstance, bindings: Bindings] RETURNS [BOOL];
PrintNeighborhood: 
PROC [
root: CellType,
of: DescendantListList,
to: IO.STREAM,
Annotator: PROC [subject: Descendant, to: IO.STREAM] ← NIL,
leaves: Cut
];
 
MakeNeighborhoodFilter: PROC [of: DescendantListList, Consume: PROC [Filter]];
DescendantListList: TYPE = LIST OF DescendantList;
DescendantList: TYPE = LIST OF Descendant;
Descendant: TYPE = REF ANY--actually UNION [FlatWire, FlatCellType, REF InstancePath]--;
 
Helpful things for CoreFlat
LowerInstancePath: 
PROC [path, by: InstancePath] 
RETURNS [lower: InstancePath];
Concatenates path after by.
 
LowerFlatCell: 
PROC [fc: FlatCellTypeRec, by: FlatCellTypeRec] 
RETURNS [lower: FlatCellTypeRec];
 
LowerFlatWire: 
PROC [fw: FlatWireRec, by: FlatCellTypeRec] 
RETURNS [lower: FlatWireRec];
 
 
}.