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.STREAM _ NARROW [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 BOOL _ ALL[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 BOOL _ ALL[FALSE]; sinkUsed: ARRAY Sinks OF BOOL _ ALL[FALSE]; FOR search: TileIndex IN [FIRST[TileIndex]..index] DO IF tiles[search] THEN { IF sinkUsed[sink[search]] THEN RETURN; 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. άSoftHdwCheckTiles.mesa Copyright Σ 1988 by Xerox Corporation. All rights reserved. Barth, January 20, 1989 1:07:02 pm PST SELECT sink[search] FROM RU => IF sourceUsed[RU] THEN RETURN; L => L, LD => LD ENDCASE; Κϋ˜codešœ™K™Kšœ˜Kšœ˜K˜—Kšœœœœ@˜WKšœ œ˜&Kšœœ˜Kšœ œR˜aKšœ œ œœf˜Kš œ œ œœ œœ˜5Kšœœ œ8˜RKšœœ œ,˜DKš œœ œœœœ˜,Kšœœ˜Kšœœœ˜Kšœœ˜ Kšœœ ˜Kšœœ ˜š žœœ œ œœ˜BKš œ œ œœœœ˜/Kš œ œœœœœ˜+šœœœ˜5šœœ˜Kšœœœ˜&šœ™Kšœ$™$Kšœ™Kšœ™Kšœ™—Kšœœ˜"Kšœœ˜K˜—Kšœ˜—Kšœœ œ˜2šœ˜Kšœœ˜Kšœœ˜Kšœ˜Kšœœ˜Kšœ˜K˜—K˜—š ž œœ œ œœ˜8Kšœœ ˜Kšœœ˜šœœ ˜$Kšœœ˜%Kšœ˜—šœœ˜K˜Kšœ œ ˜šœœ ˜$šœœ˜Kšœœ˜/šœ˜Kšœ'˜'Kšœœ˜2KšœG˜GKšœ<˜Kšœœ5˜>K˜—Kšœ˜K˜—Kšœ˜—Kšœ ˜ K˜—K˜—Kšœœ œ˜5Kšœ&˜&šœœ ˜$Kšœœ˜6Kšœ˜—Kšœœ˜Kšœ˜Kšœœ˜Kšœ˜Kšœ'œ ˜8Kšœœœ˜Kšœ˜K™—…— jA