// ************************************************************************** //
//                                                                            //
//    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                                             //
//                                                                            //
// ************************************************************************** //

package ComputerArchitecture.SystolicArrays.TransitiveClosure.KuLL87aSpiralSFG;

macro N = 3;

// ----------------------------------------------------------------
// The module below shows the spiral array that is constructed by
// wiring NxN processing elements of the above kind. Note that
// in case (j==0), we can use any value for c_in, since in this
// case the PE uses t_in instead, and similarly, we can use any
// value for r_in in case (i==0).
// ----------------------------------------------------------------

module SpiralArraySFG([N][N]bool ?a, t) {
    event [N][N]bool c, r;
    for(i=0..(N-1)) do ||
        for(j=0..(N-1)) do ||
            PE(a,i,j,
                    ((j==0)?false:c[i][abs ((-1+j)%N)]),
                    ((i==0)?false:r[abs ((-1+i)%N)][j]),
                    t[i][j],
                    c[i][j],
                    r[i][j],
                    t[abs ((-1+i)%N)][abs ((-1+j)%N)]);
}