TilingClass.mesa
Copyright Ó 1986, 1987 by Xerox Corporation. All rights reversed.
Created by Bertrand Serlet September 19, 1986 1:48:15 pm PDT
Bertrand Serlet July 13, 1987 10:47:24 pm PDT
DIRECTORY Core, CoreCreate, CoreGeometry;
TilingClass: CEDAR DEFINITIONS ~ BEGIN
Purpose
TilingClass is a way to represent efficiently large regular structures such as PLAs, or RAMs. The basic observation behing TilingClass is that it is much more expensive to represent two-dimensional structures by vectors of vectors (lines * columns public wires versus lines + columns public wires).
Conveniences
CellType : TYPE = Core.CellType;
Properties : TYPE = Core.Properties;
ROPE: TYPE = Core.ROPE;
Wire: TYPE = Core.Wire;
WireSeq: TYPE = Core.WireSeq;
Wires: TYPE = Core.Wires;
PA: TYPE = CoreCreate.PA;
WR: TYPE = CoreCreate.WR;
Tiles
Tile: TYPE ~ REF TileRec;
TileRec: TYPE ~ RECORD [
type: CellType,   -- type of the tile.
renaming: LIST OF PANIL,  -- binding [public of the tile -> public of the whole array]. There is no implicit renaming (contrarily to CoreCreate).
flatten: BOOLFALSE,   -- if flatten, the tile's type should be a record cell, and is flattened once at Recast time. All the internals of the tile's type should be public. No impact on layout. Non-wizards: default is fine!
properties: Core.Properties ← NIL  -- to store arbitrary information. implementation uses it.
];
TileRow: TYPE ~ REF TileRowRec;
TileRowRec: TYPE ~ RECORD [
tiles: SEQUENCE size: NAT OF Tile  -- tiles, from left to right.
];
TileArray: TYPE ~ REF TileArrayRec;
TileArrayRec: TYPE ~ RECORD [
tileRows: SEQUENCE size: NAT OF TileRow -- rows, from bottom to top.
];
NeighborProc: TYPE = PROC [ct1, ct2: CellType] RETURNS [publicPairs: LIST OF CoreGeometry.WirePair ← NIL];
cellType is of class tilingClass.
ct1 and ct2 are the two neighbors.
For 2 tiles, abutted in X or in Y, indicates their stitches.
Creation of Tiling
The LayoutProc associated to tilingClass assumes that:
there is the same number of tiles in every row,
all tiles in a given row have the same height (of the IR),
all tiles in a given column have the same width (of the IR),
no two tiles in the array are shared (ref-equal).
CreateTiling: PROC [public: WireSeq, tileArray: TileArray, neighborX, neighborY: NeighborProc, name: ROPENIL, props: Properties ← NIL] RETURNS [tiling: CellType];
public is the resulting public of the whole tiling.
tileArray gives the tiles.
neighborX, neighborY are used to compute the stitches.
name, if non NIL, has precedence over props.
tiling is of class tilingClass.
Predefined NeighborProcs
LayoutNeighborX: NeighborProc;
LayoutNeighborY: NeighborProc;
Those functions call PWCore.Layout on their arguments, and use the PWCore.extractMode.decoration to compute which public is in front of which public.
SchematicsNeighborX: NeighborProc;
SchematicsNeighborY: NeighborProc;
Those functions assume that their arguments are schematics cells, and use the Sisyph.mode.decoration to compute which public is in front of which public.
Private data structures
tilingClass: PRIVATE Core.CellClass;
TilingData: PRIVATE TYPE = REF TilingDataRec;
TilingDataRec: PRIVATE TYPE = RECORD [
tileArray: TileArray,
neighborX, neighborY: NeighborProc
];
END.