MODULE checkid; (*--------------------------------------------------------- File name: checkid.pm Author: AG Date: 6/07/05 Problem: This program cheks if an ARRAY of of chains of size N contains an identity matrix for N x N. Example of Execution 1: ArrLine[0]: 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ArrLine[1]: 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ArrLine[2]: 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ArrLine[3]: 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 Res:TRUE Example of Execution 2: ArrLine[0]: 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ArrLine[1]: 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ArrLine[2]: 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 ArrLine[3]: 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 Res:FALSE Cycles: 1 Shift + 1 ID + 4 assignments + 3 tests. *) (*---------------------------------------------------------- CONFIGURATION ----------------------------------------------------------*) CONST MAXCELLS=1024; (* MAXCELLS cells in one line *) CONST N=4; CONFIGURATION chain[0..(MAXCELLS - 1)]; CONNECTION left: chain [i] -> chain[(i-1) MOD MAXCELLS]; right: chain[i] -> chain[(i+1) MOD MAXCELLS]; (*---------------------------------------------------------- VARIABLES ----------------------------------------------------------*) VAR L1: chain OF INTEGER; i:INTEGER; Res: BOOLEAN; ArrLine: ARRAY[0..(N-1)] OF chain OF INTEGER; (*---------------------------------------------------------- MAIN ----------------------------------------------------------*) BEGIN (* initialize data *) (*--------------------------------------------------------- GENERATE IDENTITY MATRIX FOR TEST file: genidn.pm ----------------------------------------------------------*) L1:= 0; (*generate master line *) IF ID(chain) MOD N = 1 THEN L1:= 1; (* Put a 1 every N element *) END; (* IF *) ArrLine[0]:= L1; (* copy master line into first line *) (* generate other lines *) FOR i:= 1 TO (N-1) DO ArrLine[i] := RECEIVE.right(ArrLine[i-1]); (* shift by one on every following array *) END; (*FOR*) (* ArrLine[2]<< 4>> := 1; TO MAKE FALSE *) (* Printing *) IF ID(chain) < 16 THEN FOR i:= 0 TO (N-1) DO WriteString("ArrLine["); WriteInt(i, 0); WriteString("]:"); WriteInt(ArrLine[i], 2); WriteLn; END; (*FOR*) END; (* display *) (*--------------------------------------------------------- START ALGORITHM ----------------------------------------------------------*) (* generate master line for N = 4 , L1 = 1 0 0 0 1 0 0 0 1 0 0 0 1.. *) L1:= 0; IF ID(chain) MOD N = 1 THEN L1:= 1; (* Put a 1 every N element *) END; (* IF *) Res:= TRUE; FOR i:= 0 TO (N-1) DO IF ArrLine[i] # L1 THEN Res := FALSE; END; (* IF *) L1 := MOVE.right(L1); END; (* FOR *) (* printing *) WriteString("Res:" ); WriteBool(Res, 2); WriteLn; END checkid.