MODULE matrixarraymult1; (*--------------------------------------------------------- File name: matrixarraymult1pm Author: AG Date: 9/28/05 Problem: Multiplies many different matrices 2 x 2 by many different arrays 2 x 1 resulting in an array 2 x 1 ArrLine:= | 1 2 | | 5 | | (5*1 + 6*2) | | 17 | | 3 4 | x | 6 | = | (5*3 + 6*4) | = | 39 | Example of Execution: Initial Matrix and array: ArrLine[0]: 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ArrLine[1]: 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 L1arr: 5 6 5 6 5 6 5 6 5 6 5 6 5 6 5 Result: L2res: 17 39 17 39 17 39 17 39 17 39 17 39 17 39 17 Cycles: 2 Shift + 2 Mult + 2 assignments + 2 add + 2 tests. Observation: Used 2 temporary lines. *) (*---------------------------------------------------------- CONFIGURATION ----------------------------------------------------------*) CONST MAXCELLS=1024; (* MAXCELLS cells in one line *) CONST N=2; CONFIGURATION chain[0..(MAXCELLS - 1)]; CONNECTION left: chain [i] -> chain[(i-1) MOD MAXCELLS]; right: chain[i] -> chain[(i+1) MOD MAXCELLS]; (*---------------------------------------------------------- VARIABLES ----------------------------------------------------------*) VAR ArrLine: ARRAY[0..(N-1)] OF chain OF INTEGER; L0id, L1arr, L2res, L3temp, L4temp: chain OF INTEGER; i: INTEGER; (*---------------------------------------------------------- MAIN ----------------------------------------------------------*) BEGIN L0id:= ID(chain); (*Initialize data *) ArrLine[0]:= (ID(chain)-1) MOD N +1; ArrLine[1]:= ArrLine[0] + 2; L1arr:= ArrLine[1] + 2; (* ArrLine[0]:= 1 2 1 2 1 2... ArrLine[1]:= 3 4 3 4 3 4... L1arr:= 5 6 5 6 5 6... *) (* print initial matrices *) WriteString("Initial Matrix and array: "); WriteLn; WriteLn; IF L0id < 16 THEN FOR i:=0 TO (N-1) DO WriteString("ArrLine["); WriteInt(i,0); WriteString("]: "); WriteInt(ArrLine[i], 2); WriteLn; END; (* FOR *) WriteString("L1arr: "); WriteInt(L1arr,0); WriteLn; END; (*display*) (* start algorithm*) L3temp:= ArrLine[0] * L1arr; (* M[1,1] x Vt[1] M[1,2] x V[2]*) IF L0id MOD N = 1 THEN L4temp:= RECEIVE.left(L3temp); (* shift vector to the left *) L4temp:= L4temp + L3temp; (* Sum both results *) L2res := L4temp; (* record answer *) END; (*IF *) L3temp:= ArrLine[1] * L1arr; (*M[2,1] x Vt[1] M[2,2] x V[2]*) IF L0id MOD N = 0 THEN L4temp:= RECEIVE.left(L3temp); (* shift vector to the left *) L4temp:= L4temp + L3temp; (* Sum both results *) L2res:= L4temp; (* record answer *) END; (* IF *) (* printing *) WriteString("Result: "); WriteLn; WriteLn; IF L0id < 16 THEN WriteString("L2res: "); WriteInt(L2res,0); WriteLn; END; (*display*) END matrixarraymult1.