// ************************************************************************** //
//                                                                            //
//    eses                   eses                                             //
//   eses                     eses                                            //
//  eses    eseses  esesese    eses   Embedded Systems Group                  //
//  ese    ese  ese ese         ese                                           //
//  ese    eseseses eseseses    ese   Department of Computer Science          //
//  eses   eses          ese   eses                                           //
//   eses   eseses  eseseses  eses    University of Kaiserslautern            //
//    eses                   eses                                             //
//                                                                            //
// ************************************************************************** //
// The algorithm below solves a linear equation system given as a NxM matrix  //
// a in that it applies the Gauss Jordan algorithm.                           //
// ************************************************************************** //

macro N = 3;
macro M = 4;

module LinearEquGaussJordan([N][M]real ?a,b,event !rdy) {

    // store input matrix a in matrix b
    for(i=0..N-1)
        for(j=0..M-1)
            b[i][j] = a[i][j];

    // perform Gaussian-Jordan algorithm
    for(k=0..N-1) {
        for(i=0..N-1) {
            let(lambda = b[i][k]/b[k][k]) {
            for(j=0..M-1)
                if(i==k)
                    next(b[i][j]) = b[i][j]/b[k][k];
                else
                    next(b[i][j]) = b[i][j] - lambda * b[k][j];
            }
        }
        pause;
    }
    emit(rdy);
}
drivenby {
    a[0][0] = 1.0;
    a[0][1] = 1.0;
    a[0][2] = 1.0;
    a[0][3] = 0.0;
    a[1][0] = 4.0;
    a[1][1] = 2.0;
    a[1][2] = 1.0;
    a[1][3] = 1.0;
    a[2][0] = 9.0;
    a[2][1] = 3.0;
    a[2][2] = 1.0;
    a[2][3] = 3.0;
    await(rdy);
}