CoreFrame.mesa
Copyright c 1985 by Xerox Corporation. All rights resersed.
Last Edited by: Curry, July 17, 1986 1:04:22 am PDT
DIRECTORY CD, CMosB, Core, CoreBlock, CoreClasses, PWPins, PWRoute, IO, Rope;
CoreFrame: CEDAR DEFINITIONS =
BEGIN
frameCellClass: Core.CellClass;
Frame:   TYPE = REF FrameRec;
FrameSeq:  TYPE = RECORD[SEQUENCE size: CARDINAL OF CT];
FrameRec:  TYPE = RECORD[
pos:   CD.Position   ← [0,0],
size:   Size     ← TameSize[],
orient:  CD.Orientation  ← CD.original,
first:   Side     ← left,
father:  CT      ← NIL,
data:   REF     ← NIL,
cell:   CT      ← NIL,
public:  LIST OF ROPE  ← NIL,
intOnly:  LIST OF ROPE  ← NIL,
seq:   REF FrameSeq  ← NIL ];
ROPE:   TYPE = Core.ROPE;
CT:   TYPE = Core.CellType;
NewFrameCell: PROC[size: INT,   name: ROPE, rec: FrameRec] RETURNS [new: CT];
NewFrameCells: PROC[cells: LIST OF CT, name: ROPE, rec: FrameRec] RETURNS [new: CT];
Fetch:    PROC[cell: CT, subCellName: ROPE] RETURNS[subCell: CT];
FCT:     PROC[ct: CT] RETURNS[Frame] = INLINE {RETURN[NARROW[ct.data]]};
ExpandType: TYPE = {soft, hard};
SetFrameExpandProc: PROC[type: ExpandType, on: REF,    proc: REF ExpandProc];
GetFrameExpandProc: PROC[type: ExpandType, on: REF]RETURNS[ proc: REF ExpandProc];
ExpandProc: TYPE = PROC[type: ExpandType, frameCT: CT];
Expand:      PROC[type: ExpandType, frameCT: CT];
NameFrame:    PROC[cell: CT, root: ROPE ← NIL];
CellTypeProc: TYPE = PROC RETURNS[cellType: Core.CellType];
RecastFrameSoft:   PROC[frameCT: CT] RETURNS [new: CT];
RecastFrameHard:   PROC[frameCT: CT] RETURNS [new: CT];
RecastWithLayout:  PROC[me: CT] RETURNS [new: CT];
FrameInst:    PROC[frameCT: CT] RETURNS [instance: CoreClasses.CellInstance←NIL];
CountTransistors:   PROC[cell: CT] RETURNS[count: INT ← 0];
ReadFrameCache:  PROC[name:  ROPE] RETURNS[frameCT: CT];
WriteFrameCache: PROC[frameCT: CT];
EnumProc:  TYPE = PROC[fCT: CT]    RETURNS[kids, continue: BOOLTRUE];
EnumFrame: PROC[fCT: CT, proc: EnumProc] RETURNS[kids, continue: BOOLTRUE];
Side5:    TYPE = PWPins.Side;
Side:    TYPE = Side5[bottom..none);
SideRope:   ARRAY Side OF ROPE;
NextSide:  PROC[side: Side] RETURNS [next: Side];
PrevSide:  PROC[side: Side] RETURNS [prev: Side];
OppSide:  PROC[side: Side] RETURNS [opp: Side];
SideSides: ARRAY Side OF CoreBlock.Sides = [bottom: bottom, right: right, top: top, left: left];
Size:    TYPE = RECORD[x, y: INT, xfree, yfree: Freedom];
Freedom:   TYPE = {fixed, tame, wild};
lambda:   INT = CMosB.lambda;
minSize:   CD.Position = [14*lambda, 16*lambda];
TameSize:  PROC[pair: CD.Position ← minSize] RETURNS[size:Size] = INLINE
{RETURN[[pair.x, pair.y, tame, tame]]};
WildSize:  PROC[pair: CD.Position ← minSize] RETURNS[size:Size] = INLINE
{RETURN[[pair.x, pair.y, wild, wild]]};
FixedSize:  PROC[pair: CD.Position ← minSize] RETURNS[size:Size] = INLINE
{RETURN[[pair.x, pair.y, fixed, fixed]]};
FlipSize:  PROC[size: Size] RETURNS[Size] = INLINE
{RETURN[[size.y, size.x, size.yfree, size.xfree]]};
GetSize:    PROC[frameCT: CT];
ReSize:    PROC[frameCT: CT];
RePos:    PROC[frameCT: CT, new:  CD.Position  ← [0, 0]];
RotateFrame:  PROC[frameCT: CT, orient: CD.Orientation ← CD.original];
RotateCellType: PROC[cell:  CT, orient:  CD.Orientation] RETURNS[new: CT];
FixOneSize:  PROC[frameCT: CT] RETURNS[fixed1: BOOLFALSE];
GetLog:    PROC RETURNS[IO.STREAM];
LogFCT:    PROC[frameCT: CT, indent: INT, lim: INT, out: IO.STREAMNIL];
LogFrameData: PROC[frame: Frame, indent: INT, cr: BOOL, out: IO.STREAMNIL];
FullFrameName: PROC[frameCT: CT] RETURNS[name: ROPE];
DrawFrame:  PROC[frameCT: CT, detailed: BOOLTRUE] RETURNS[cell: CD.Object];
FlattenOnce:  PROC[frameCT: CT] RETURNS[new: CT];
TestMergeProc: TYPE = PROC[frameCT: CT] RETURNS[merge: BOOL];
TestMergeNodes: PROC[frameCT: CT, testProc: TestMergeProc ← NIL -- TRUE -- ]
RETURNS[new: CT];
TellKidsAboutDad:  PROC[frameCT: CT];
Neighbor:    PROC[frameCT: CT, side: Side] RETURNS[neighborCT: CT, ok: BOOL]; 
END.