MODULE genidn; (*--------------------------------------------------------- File name: genidn.pm Author: AG Date: 5/31/05 Problem: This program generates the identity matrix NxN on an ARRAY of N lines. This program works if N is a power of 2. Example of Execution: ArrLine[1]: 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ArrLine[2]: 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ArrLine[3]: 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ArrLine[4]: 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 Cycles: 1 ID + 1 MOD +2 assignments + (N - 1) shifts. *) (*---------------------------------------------------------- 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; ArrLine: ARRAY[1..N] OF chain OF INTEGER; (*---------------------------------------------------------- MAIN ----------------------------------------------------------*) BEGIN (*Initialize data *) L1:= 0; (*generate master line *) IF ID(chain) MOD N = 1 THEN L1:= 1; (* Put a 1 every N element *) END; (* IF *) ArrLine[1]:= L1; (*copy master line into first line *) (*generate other lines *) FOR i:= 2 TO N DO ArrLine[i] := RECEIVE.right(ArrLine[i-1]); (* shift by one on every following array *) END; (*FOR*) (* Printing *) IF ID(chain) < 16 THEN FOR i:= 1 TO N DO WriteString("ArrLine["); WriteInt(i, 0); WriteString("]:"); WriteInt(ArrLine[i], 2); WriteLn; END; (*FOR*) END; (* display *) END genidn.