SoftHdwCheckTiles.mesa
Copyright Ó 1988 by Xerox Corporation. All rights reserved.
Barth, January 20, 1989 1:07:02 pm PST
DIRECTORY CD, CDBasics, CDInstances, CDOps, Commander, DABasics, IO, ProcessProps, PW, Rope;
SoftHdwCheckTiles: CEDAR PROGRAM
IMPORTS CD, CDBasics, CDInstances, CDOps, IO, ProcessProps, PW
EXPORTS
= BEGIN
out: IO.STREAMNARROW [ProcessProps.GetProp[$CommanderHandle], Commander.Handle].out;
Sources: TYPE = {OLD, RU, ORU, LD, L};
Sinks: TYPE = {I, RU, L, LD};
TileIndex: TYPE = {OLDToI, RUToRU, ORUToI, OLDToL, LDToLD, OLDToRU, RUToI, ORUToLD, LToI, LDToI};
tileNames: ARRAY TileIndex OF Rope.ROPE ← ["OLDToI", "RUToRU", "ORUToI", "OLDToL", "LDToLD", "OLDToRU", "RUToI", "ORUToLD", "LToI", "LDToI"];
tileObjects: ARRAY TileIndex OF CD.Object ← ALL[NIL];
source: ARRAY TileIndex OF Sources ← [OLD, RU, ORU, OLD, LD, OLD, RU, ORU, L, LD];
sink: ARRAY TileIndex OF Sinks ← [I, RU, I, L, LD, RU, I, LD, I, I];
tiles: ARRAY TileIndex OF BOOLALL[FALSE];
count: INT ← 0;
il: CD.InstanceList ← NIL;
y: INT ← 0;
ySpace: INT ← 4*8*8;
xSpace: INT ← 5*8*8;
Check: PROC [tiles: ARRAY TileIndex OF BOOL, index: TileIndex] = {
sourceUsed: ARRAY Sources OF BOOLALL[FALSE];
sinkUsed: ARRAY Sinks OF BOOLALL[FALSE];
FOR search: TileIndex IN [FIRST[TileIndex]..index] DO
IF tiles[search] THEN {
IF sinkUsed[sink[search]] THEN RETURN;
SELECT sink[search] FROM
RU => IF sourceUsed[RU] THEN RETURN;
L => L,
LD => LD
ENDCASE;
sourceUsed[source[search]] ← TRUE;
sinkUsed[sink[search]] ← TRUE;
};
ENDLOOP;
IF index=LAST[TileIndex] THEN PrintAssembly[tiles]
ELSE {
index ← SUCC[index];
tiles[index] ← FALSE;
Check[tiles, index];
tiles[index] ← TRUE;
Check[tiles, index];
};
};
PrintAssembly: PROC [tiles: ARRAY TileIndex OF BOOL] = {
x: INT ← xSpace;
used: INT ← 0;
FOR index: TileIndex IN TileIndex DO
IF tiles[index] THEN used ← used + 1;
ENDLOOP;
IF used>1 THEN {
count ← count + 1;
IO.Put[out, IO.rope["\n"]];
FOR index: TileIndex IN TileIndex DO
IF tiles[index] THEN {
IO.PutF[out, "%g ", IO.rope[tileNames[index]]];
{
object: CD.Object ← tileObjects[index];
base: DABasics.Position ← CD.InterestBase[object];
tbase: DABasics.Position ← CDBasics.MapPoint[base, [[0, 0], original]];
toff1: DABasics.Position ← CDBasics.SubPoints[[x,y], tbase];
toff2: DABasics.Position ← CDBasics.SubPoints[[0, y], tbase];
il ← CONS[CDInstances.NewInst[object, [toff1, original]], il];
il ← CONS[CDInstances.NewInst[object, [toff2, original]], il];
};
x ← x + xSpace;
};
ENDLOOP;
y ← y+ySpace;
};
};
design: CD.Design ← PW.OpenDesign["SoftHdwPgm.dale"];
CDOps.SetMutability[design, readonly];
FOR index: TileIndex IN TileIndex DO
tileObjects[index] ← PW.Get[design, tileNames[index]];
ENDLOOP;
tiles[OLDToI] ← FALSE;
Check[tiles, OLDToI];
tiles[OLDToI] ← TRUE;
Check[tiles, OLDToI];
IO.PutF[out, "\nTotal assemblies: %g\n", IO.int[count]];
[] ← PW.Draw[PW.CreateCell[il]]
END.