Index: trunk/platforms/tsar_generic_xbar/top.cpp
===================================================================
--- trunk/platforms/tsar_generic_xbar/top.cpp	(revision 874)
+++ trunk/platforms/tsar_generic_xbar/top.cpp	(revision 885)
@@ -654,32 +654,81 @@
 
    // Horizontal inter-clusters DSPIN signals
-   DspinSignals<dspin_cmd_width>*** signal_dspin_h_cmd_inc =
-      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_cmd_inc", X_SIZE-1, Y_SIZE, 3);
-   DspinSignals<dspin_cmd_width>*** signal_dspin_h_cmd_dec =
-      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_cmd_dec", X_SIZE-1, Y_SIZE, 3);
-   DspinSignals<dspin_rsp_width>*** signal_dspin_h_rsp_inc =
-      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_h_rsp_inc", X_SIZE-1, Y_SIZE, 2);
-   DspinSignals<dspin_rsp_width>*** signal_dspin_h_rsp_dec =
-      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_h_rsp_dec", X_SIZE-1, Y_SIZE, 2);
+   DspinSignals<dspin_cmd_width>** signal_dspin_h_cmd_inc =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_cmd_inc", X_SIZE-1, Y_SIZE);
+   DspinSignals<dspin_cmd_width>** signal_dspin_h_cmd_dec =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_cmd_dec", X_SIZE-1, Y_SIZE);
+
+   DspinSignals<dspin_rsp_width>** signal_dspin_h_rsp_inc =
+      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_h_rsp_inc", X_SIZE-1, Y_SIZE);
+   DspinSignals<dspin_rsp_width>** signal_dspin_h_rsp_dec =
+      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_h_rsp_dec", X_SIZE-1, Y_SIZE);
+
+   DspinSignals<dspin_cmd_width>** signal_dspin_h_m2p_inc =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_m2p_inc", X_SIZE-1, Y_SIZE);
+   DspinSignals<dspin_cmd_width>** signal_dspin_h_m2p_dec =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_m2p_dec", X_SIZE-1, Y_SIZE);
+
+   DspinSignals<dspin_rsp_width>** signal_dspin_h_p2m_inc =
+      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_h_p2m_inc", X_SIZE-1, Y_SIZE);
+   DspinSignals<dspin_rsp_width>** signal_dspin_h_p2m_dec =
+      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_h_p2m_dec", X_SIZE-1, Y_SIZE);
+
+   DspinSignals<dspin_cmd_width>** signal_dspin_h_cla_inc =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_cla_inc", X_SIZE-1, Y_SIZE);
+   DspinSignals<dspin_cmd_width>** signal_dspin_h_cla_dec =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_h_cla_dec", X_SIZE-1, Y_SIZE);
 
    // Vertical inter-clusters DSPIN signals
-   DspinSignals<dspin_cmd_width>*** signal_dspin_v_cmd_inc =
-      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_cmd_inc", X_SIZE, Y_SIZE-1, 3);
-   DspinSignals<dspin_cmd_width>*** signal_dspin_v_cmd_dec =
-      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_cmd_dec", X_SIZE, Y_SIZE-1, 3);
-   DspinSignals<dspin_rsp_width>*** signal_dspin_v_rsp_inc =
-      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_v_rsp_inc", X_SIZE, Y_SIZE-1, 2);
-   DspinSignals<dspin_rsp_width>*** signal_dspin_v_rsp_dec =
-      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_v_rsp_dec", X_SIZE, Y_SIZE-1, 2);
-
-   // Mesh boundaries DSPIN signals
-   DspinSignals<dspin_cmd_width>**** signal_dspin_false_cmd_in =
-         alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_false_cmd_in" , X_SIZE, Y_SIZE, 4, 3);
-   DspinSignals<dspin_cmd_width>**** signal_dspin_false_cmd_out =
-         alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_false_cmd_out", X_SIZE, Y_SIZE, 4, 3);
-   DspinSignals<dspin_rsp_width>**** signal_dspin_false_rsp_in =
-         alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_false_rsp_in" , X_SIZE, Y_SIZE, 4, 2);
-   DspinSignals<dspin_rsp_width>**** signal_dspin_false_rsp_out =
-         alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_false_rsp_out", X_SIZE, Y_SIZE, 4, 2);
+   DspinSignals<dspin_cmd_width>** signal_dspin_v_cmd_inc =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_cmd_inc", X_SIZE, Y_SIZE-1);
+   DspinSignals<dspin_cmd_width>** signal_dspin_v_cmd_dec =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_cmd_dec", X_SIZE, Y_SIZE-1);
+
+   DspinSignals<dspin_rsp_width>** signal_dspin_v_rsp_inc =
+      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_v_rsp_inc", X_SIZE, Y_SIZE-1);
+   DspinSignals<dspin_rsp_width>** signal_dspin_v_rsp_dec =
+      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_v_rsp_dec", X_SIZE, Y_SIZE-1);
+
+   DspinSignals<dspin_cmd_width>** signal_dspin_v_m2p_inc =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_m2p_inc", X_SIZE, Y_SIZE-1);
+   DspinSignals<dspin_cmd_width>** signal_dspin_v_m2p_dec =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_m2p_dec", X_SIZE, Y_SIZE-1);
+
+   DspinSignals<dspin_rsp_width>** signal_dspin_v_p2m_inc =
+      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_v_p2m_inc", X_SIZE, Y_SIZE-1);
+   DspinSignals<dspin_rsp_width>** signal_dspin_v_p2m_dec =
+      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_v_p2m_dec", X_SIZE, Y_SIZE-1);
+
+   DspinSignals<dspin_cmd_width>** signal_dspin_v_cla_inc =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_cla_inc", X_SIZE, Y_SIZE-1);
+   DspinSignals<dspin_cmd_width>** signal_dspin_v_cla_dec =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_v_cla_dec", X_SIZE, Y_SIZE-1);
+
+   // Mesh boundaries DSPIN signals (Most of those signals are not used...)
+   DspinSignals<dspin_cmd_width>*** signal_dspin_bound_cmd_in =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_cmd_in" , X_SIZE, Y_SIZE, 4);
+   DspinSignals<dspin_cmd_width>*** signal_dspin_bound_cmd_out =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_cmd_out", X_SIZE, Y_SIZE, 4);
+
+   DspinSignals<dspin_rsp_width>*** signal_dspin_bound_rsp_in =
+      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_bound_rsp_in" , X_SIZE, Y_SIZE, 4);
+   DspinSignals<dspin_rsp_width>*** signal_dspin_bound_rsp_out =
+      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_bound_rsp_out", X_SIZE, Y_SIZE, 4);
+
+   DspinSignals<dspin_cmd_width>*** signal_dspin_bound_m2p_in =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_m2p_in" , X_SIZE, Y_SIZE, 4);
+   DspinSignals<dspin_cmd_width>*** signal_dspin_bound_m2p_out =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_m2p_out", X_SIZE, Y_SIZE, 4);
+
+   DspinSignals<dspin_rsp_width>*** signal_dspin_bound_p2m_in =
+      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_bound_p2m_in" , X_SIZE, Y_SIZE, 4);
+   DspinSignals<dspin_rsp_width>*** signal_dspin_bound_p2m_out =
+      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_bound_p2m_out", X_SIZE, Y_SIZE, 4);
+
+   DspinSignals<dspin_cmd_width>*** signal_dspin_bound_cla_in =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_cla_in" , X_SIZE, Y_SIZE, 4);
+   DspinSignals<dspin_cmd_width>*** signal_dspin_bound_cla_out =
+      alloc_elems<DspinSignals<dspin_cmd_width> >("signal_dspin_bound_cla_out", X_SIZE, Y_SIZE, 4);
+
 
    ////////////////////////////
@@ -794,87 +843,128 @@
 
    // Inter Clusters horizontal connections
-   if (X_SIZE > 1){
-      for (size_t x = 0; x < (X_SIZE-1); x++){
-         for (size_t y = 0; y < Y_SIZE; y++){
-            for (size_t k = 0; k < 3; k++){
-               clusters[x][y]->p_cmd_out[EAST][k]      (signal_dspin_h_cmd_inc[x][y][k]);
-               clusters[x+1][y]->p_cmd_in[WEST][k]     (signal_dspin_h_cmd_inc[x][y][k]);
-               clusters[x][y]->p_cmd_in[EAST][k]       (signal_dspin_h_cmd_dec[x][y][k]);
-               clusters[x+1][y]->p_cmd_out[WEST][k]    (signal_dspin_h_cmd_dec[x][y][k]);
-            }
-
-            for (size_t k = 0; k < 2; k++){
-               clusters[x][y]->p_rsp_out[EAST][k]      (signal_dspin_h_rsp_inc[x][y][k]);
-               clusters[x+1][y]->p_rsp_in[WEST][k]     (signal_dspin_h_rsp_inc[x][y][k]);
-               clusters[x][y]->p_rsp_in[EAST][k]       (signal_dspin_h_rsp_dec[x][y][k]);
-               clusters[x+1][y]->p_rsp_out[WEST][k]    (signal_dspin_h_rsp_dec[x][y][k]);
-            }
-         }
-      }
-   }
-   std::cout << std::endl << "Horizontal connections established" << std::endl;
+   if (X_SIZE > 1) {
+       for (size_t x = 0; x < (X_SIZE-1); x++) {
+           for (size_t y = 0; y < (Y_SIZE); y++) {
+               clusters[x][y]->p_cmd_out[EAST]      (signal_dspin_h_cmd_inc[x][y]);
+               clusters[x+1][y]->p_cmd_in[WEST]     (signal_dspin_h_cmd_inc[x][y]);
+               clusters[x][y]->p_cmd_in[EAST]       (signal_dspin_h_cmd_dec[x][y]);
+               clusters[x+1][y]->p_cmd_out[WEST]    (signal_dspin_h_cmd_dec[x][y]);
+
+               clusters[x][y]->p_rsp_out[EAST]      (signal_dspin_h_rsp_inc[x][y]);
+               clusters[x+1][y]->p_rsp_in[WEST]     (signal_dspin_h_rsp_inc[x][y]);
+               clusters[x][y]->p_rsp_in[EAST]       (signal_dspin_h_rsp_dec[x][y]);
+               clusters[x+1][y]->p_rsp_out[WEST]    (signal_dspin_h_rsp_dec[x][y]);
+
+               clusters[x][y]->p_m2p_out[EAST]      (signal_dspin_h_m2p_inc[x][y]);
+               clusters[x+1][y]->p_m2p_in[WEST]     (signal_dspin_h_m2p_inc[x][y]);
+               clusters[x][y]->p_m2p_in[EAST]       (signal_dspin_h_m2p_dec[x][y]);
+               clusters[x+1][y]->p_m2p_out[WEST]    (signal_dspin_h_m2p_dec[x][y]);
+
+               clusters[x][y]->p_p2m_out[EAST]      (signal_dspin_h_p2m_inc[x][y]);
+               clusters[x+1][y]->p_p2m_in[WEST]     (signal_dspin_h_p2m_inc[x][y]);
+               clusters[x][y]->p_p2m_in[EAST]       (signal_dspin_h_p2m_dec[x][y]);
+               clusters[x+1][y]->p_p2m_out[WEST]    (signal_dspin_h_p2m_dec[x][y]);
+
+               clusters[x][y]->p_cla_out[EAST]      (signal_dspin_h_cla_inc[x][y]);
+               clusters[x+1][y]->p_cla_in[WEST]     (signal_dspin_h_cla_inc[x][y]);
+               clusters[x][y]->p_cla_in[EAST]       (signal_dspin_h_cla_dec[x][y]);
+               clusters[x+1][y]->p_cla_out[WEST]    (signal_dspin_h_cla_dec[x][y]);
+           }
+       }
+   }
+   std::cout << std::endl << "Horizontal connections done" << std::endl;
 
    // Inter Clusters vertical connections
    if (Y_SIZE > 1) {
-      for (size_t y = 0; y < (Y_SIZE-1); y++){
-         for (size_t x = 0; x < X_SIZE; x++){
-            for (size_t k = 0; k < 3; k++){
-               clusters[x][y]->p_cmd_out[NORTH][k]     (signal_dspin_v_cmd_inc[x][y][k]);
-               clusters[x][y+1]->p_cmd_in[SOUTH][k]    (signal_dspin_v_cmd_inc[x][y][k]);
-               clusters[x][y]->p_cmd_in[NORTH][k]      (signal_dspin_v_cmd_dec[x][y][k]);
-               clusters[x][y+1]->p_cmd_out[SOUTH][k]   (signal_dspin_v_cmd_dec[x][y][k]);
-            }
-
-            for (size_t k = 0; k < 2; k++){
-               clusters[x][y]->p_rsp_out[NORTH][k]     (signal_dspin_v_rsp_inc[x][y][k]);
-               clusters[x][y+1]->p_rsp_in[SOUTH][k]    (signal_dspin_v_rsp_inc[x][y][k]);
-               clusters[x][y]->p_rsp_in[NORTH][k]      (signal_dspin_v_rsp_dec[x][y][k]);
-               clusters[x][y+1]->p_rsp_out[SOUTH][k]   (signal_dspin_v_rsp_dec[x][y][k]);
-            }
-         }
-      }
-   }
-   std::cout << "Vertical connections established" << std::endl;
+       for (size_t y = 0; y < (Y_SIZE-1); y++) {
+           for (size_t x = 0; x < X_SIZE; x++) {
+               clusters[x][y]->p_cmd_out[NORTH]     (signal_dspin_v_cmd_inc[x][y]);
+               clusters[x][y+1]->p_cmd_in[SOUTH]    (signal_dspin_v_cmd_inc[x][y]);
+               clusters[x][y]->p_cmd_in[NORTH]      (signal_dspin_v_cmd_dec[x][y]);
+               clusters[x][y+1]->p_cmd_out[SOUTH]   (signal_dspin_v_cmd_dec[x][y]);
+
+               clusters[x][y]->p_rsp_out[NORTH]     (signal_dspin_v_rsp_inc[x][y]);
+               clusters[x][y+1]->p_rsp_in[SOUTH]    (signal_dspin_v_rsp_inc[x][y]);
+               clusters[x][y]->p_rsp_in[NORTH]      (signal_dspin_v_rsp_dec[x][y]);
+               clusters[x][y+1]->p_rsp_out[SOUTH]   (signal_dspin_v_rsp_dec[x][y]);
+
+               clusters[x][y]->p_m2p_out[NORTH]     (signal_dspin_v_m2p_inc[x][y]);
+               clusters[x][y+1]->p_m2p_in[SOUTH]    (signal_dspin_v_m2p_inc[x][y]);
+               clusters[x][y]->p_m2p_in[NORTH]      (signal_dspin_v_m2p_dec[x][y]);
+               clusters[x][y+1]->p_m2p_out[SOUTH]   (signal_dspin_v_m2p_dec[x][y]);
+
+               clusters[x][y]->p_p2m_out[NORTH]     (signal_dspin_v_p2m_inc[x][y]);
+               clusters[x][y+1]->p_p2m_in[SOUTH]    (signal_dspin_v_p2m_inc[x][y]);
+               clusters[x][y]->p_p2m_in[NORTH]      (signal_dspin_v_p2m_dec[x][y]);
+               clusters[x][y+1]->p_p2m_out[SOUTH]   (signal_dspin_v_p2m_dec[x][y]);
+
+               clusters[x][y]->p_cla_out[NORTH]     (signal_dspin_v_cla_inc[x][y]);
+               clusters[x][y+1]->p_cla_in[SOUTH]    (signal_dspin_v_cla_inc[x][y]);
+               clusters[x][y]->p_cla_in[NORTH]      (signal_dspin_v_cla_dec[x][y]);
+               clusters[x][y+1]->p_cla_out[SOUTH]   (signal_dspin_v_cla_dec[x][y]);
+           }
+       }
+   }
+   std::cout << std::endl << "Vertical connections done" << std::endl;
 
    // East & West boundary cluster connections
-   for (size_t y = 0; y < Y_SIZE; y++)
-   {
-      for (size_t k = 0; k < 3; k++)
-      {
-         clusters[0][y]->p_cmd_in[WEST][k]        (signal_dspin_false_cmd_in [0][y][WEST][k]);
-         clusters[0][y]->p_cmd_out[WEST][k]       (signal_dspin_false_cmd_out[0][y][WEST][k]);
-         clusters[X_SIZE-1][y]->p_cmd_in[EAST][k] (signal_dspin_false_cmd_in [X_SIZE-1][y][EAST][k]);
-         clusters[X_SIZE-1][y]->p_cmd_out[EAST][k](signal_dspin_false_cmd_out[X_SIZE-1][y][EAST][k]);
-      }
-
-      for (size_t k = 0; k < 2; k++)
-      {
-         clusters[0][y]->p_rsp_in[WEST][k]        (signal_dspin_false_rsp_in [0][y][WEST][k]);
-         clusters[0][y]->p_rsp_out[WEST][k]       (signal_dspin_false_rsp_out[0][y][WEST][k]);
-         clusters[X_SIZE-1][y]->p_rsp_in[EAST][k] (signal_dspin_false_rsp_in [X_SIZE-1][y][EAST][k]);
-         clusters[X_SIZE-1][y]->p_rsp_out[EAST][k](signal_dspin_false_rsp_out[X_SIZE-1][y][EAST][k]);
-      }
-   }
+   for (size_t y = 0; y < (Y_SIZE); y++) {
+       clusters[0][y]->p_cmd_in[WEST]           (signal_dspin_bound_cmd_in[0][y][WEST]);
+       clusters[0][y]->p_cmd_out[WEST]          (signal_dspin_bound_cmd_out[0][y][WEST]);
+       clusters[X_SIZE-1][y]->p_cmd_in[EAST]    (signal_dspin_bound_cmd_in[X_SIZE-1][y][EAST]);
+       clusters[X_SIZE-1][y]->p_cmd_out[EAST]   (signal_dspin_bound_cmd_out[X_SIZE-1][y][EAST]);
+
+       clusters[0][y]->p_rsp_in[WEST]           (signal_dspin_bound_rsp_in[0][y][WEST]);
+       clusters[0][y]->p_rsp_out[WEST]          (signal_dspin_bound_rsp_out[0][y][WEST]);
+       clusters[X_SIZE-1][y]->p_rsp_in[EAST]    (signal_dspin_bound_rsp_in[X_SIZE-1][y][EAST]);
+       clusters[X_SIZE-1][y]->p_rsp_out[EAST]   (signal_dspin_bound_rsp_out[X_SIZE-1][y][EAST]);
+
+       clusters[0][y]->p_m2p_in[WEST]           (signal_dspin_bound_m2p_in[0][y][WEST]);
+       clusters[0][y]->p_m2p_out[WEST]          (signal_dspin_bound_m2p_out[0][y][WEST]);
+       clusters[X_SIZE-1][y]->p_m2p_in[EAST]    (signal_dspin_bound_m2p_in[X_SIZE-1][y][EAST]);
+       clusters[X_SIZE-1][y]->p_m2p_out[EAST]   (signal_dspin_bound_m2p_out[X_SIZE-1][y][EAST]);
+
+       clusters[0][y]->p_p2m_in[WEST]           (signal_dspin_bound_p2m_in[0][y][WEST]);
+       clusters[0][y]->p_p2m_out[WEST]          (signal_dspin_bound_p2m_out[0][y][WEST]);
+       clusters[X_SIZE-1][y]->p_p2m_in[EAST]    (signal_dspin_bound_p2m_in[X_SIZE-1][y][EAST]);
+       clusters[X_SIZE-1][y]->p_p2m_out[EAST]   (signal_dspin_bound_p2m_out[X_SIZE-1][y][EAST]);
+
+       clusters[0][y]->p_cla_in[WEST]           (signal_dspin_bound_cla_in[0][y][WEST]);
+       clusters[0][y]->p_cla_out[WEST]          (signal_dspin_bound_cla_out[0][y][WEST]);
+       clusters[X_SIZE-1][y]->p_cla_in[EAST]    (signal_dspin_bound_cla_in[X_SIZE-1][y][EAST]);
+       clusters[X_SIZE-1][y]->p_cla_out[EAST]   (signal_dspin_bound_cla_out[X_SIZE-1][y][EAST]);
+   }
+
+   std::cout << std::endl << "West & East boundaries connections done" << std::endl;
 
    // North & South boundary clusters connections
-   for (size_t x = 0; x < X_SIZE; x++)
-   {
-      for (size_t k = 0; k < 3; k++)
-      {
-         clusters[x][0]->p_cmd_in[SOUTH][k]        (signal_dspin_false_cmd_in [x][0][SOUTH][k]);
-         clusters[x][0]->p_cmd_out[SOUTH][k]       (signal_dspin_false_cmd_out[x][0][SOUTH][k]);
-         clusters[x][Y_SIZE-1]->p_cmd_in[NORTH][k] (signal_dspin_false_cmd_in [x][Y_SIZE-1][NORTH][k]);
-         clusters[x][Y_SIZE-1]->p_cmd_out[NORTH][k](signal_dspin_false_cmd_out[x][Y_SIZE-1][NORTH][k]);
-      }
-
-      for (size_t k = 0; k < 2; k++)
-      {
-         clusters[x][0]->p_rsp_in[SOUTH][k]        (signal_dspin_false_rsp_in [x][0][SOUTH][k]);
-         clusters[x][0]->p_rsp_out[SOUTH][k]       (signal_dspin_false_rsp_out[x][0][SOUTH][k]);
-         clusters[x][Y_SIZE-1]->p_rsp_in[NORTH][k] (signal_dspin_false_rsp_in [x][Y_SIZE-1][NORTH][k]);
-         clusters[x][Y_SIZE-1]->p_rsp_out[NORTH][k](signal_dspin_false_rsp_out[x][Y_SIZE-1][NORTH][k]);
-      }
-   }
-   std::cout << "North, South, West, East connections established" << std::endl;
+   for (size_t x = 0; x < X_SIZE; x++) {
+       clusters[x][0]->p_cmd_in[SOUTH]          (signal_dspin_bound_cmd_in[x][0][SOUTH]);
+       clusters[x][0]->p_cmd_out[SOUTH]         (signal_dspin_bound_cmd_out[x][0][SOUTH]);
+       clusters[x][Y_SIZE-1]->p_cmd_in[NORTH]   (signal_dspin_bound_cmd_in[x][Y_SIZE-1][NORTH]);
+       clusters[x][Y_SIZE-1]->p_cmd_out[NORTH]  (signal_dspin_bound_cmd_out[x][Y_SIZE-1][NORTH]);
+
+       clusters[x][0]->p_rsp_in[SOUTH]          (signal_dspin_bound_rsp_in[x][0][SOUTH]);
+       clusters[x][0]->p_rsp_out[SOUTH]         (signal_dspin_bound_rsp_out[x][0][SOUTH]);
+       clusters[x][Y_SIZE-1]->p_rsp_in[NORTH]   (signal_dspin_bound_rsp_in[x][Y_SIZE-1][NORTH]);
+       clusters[x][Y_SIZE-1]->p_rsp_out[NORTH]  (signal_dspin_bound_rsp_out[x][Y_SIZE-1][NORTH]);
+
+       clusters[x][0]->p_m2p_in[SOUTH]          (signal_dspin_bound_m2p_in[x][0][SOUTH]);
+       clusters[x][0]->p_m2p_out[SOUTH]         (signal_dspin_bound_m2p_out[x][0][SOUTH]);
+       clusters[x][Y_SIZE-1]->p_m2p_in[NORTH]   (signal_dspin_bound_m2p_in[x][Y_SIZE-1][NORTH]);
+       clusters[x][Y_SIZE-1]->p_m2p_out[NORTH]  (signal_dspin_bound_m2p_out[x][Y_SIZE-1][NORTH]);
+
+       clusters[x][0]->p_p2m_in[SOUTH]          (signal_dspin_bound_p2m_in[x][0][SOUTH]);
+       clusters[x][0]->p_p2m_out[SOUTH]         (signal_dspin_bound_p2m_out[x][0][SOUTH]);
+       clusters[x][Y_SIZE-1]->p_p2m_in[NORTH]   (signal_dspin_bound_p2m_in[x][Y_SIZE-1][NORTH]);
+       clusters[x][Y_SIZE-1]->p_p2m_out[NORTH]  (signal_dspin_bound_p2m_out[x][Y_SIZE-1][NORTH]);
+
+       clusters[x][0]->p_cla_in[SOUTH]          (signal_dspin_bound_cla_in[x][0][SOUTH]);
+       clusters[x][0]->p_cla_out[SOUTH]         (signal_dspin_bound_cla_out[x][0][SOUTH]);
+       clusters[x][Y_SIZE-1]->p_cla_in[NORTH]   (signal_dspin_bound_cla_in[x][Y_SIZE-1][NORTH]);
+       clusters[x][Y_SIZE-1]->p_cla_out[NORTH]  (signal_dspin_bound_cla_out[x][Y_SIZE-1][NORTH]);
+   }
+
+   std::cout << std::endl << "North & South boundaries connections done" << std::endl;
    std::cout << std::endl;
 
@@ -955,22 +1045,35 @@
    signal_resetn = false;
 
-   // network boundaries signals
-   for (size_t x = 0; x < X_SIZE ; x++){
-      for (size_t y = 0; y < Y_SIZE ; y++){
-         for (size_t a = 0; a < 4; a++){
-            for (size_t k = 0; k < 3; k++){
-               signal_dspin_false_cmd_in [x][y][a][k].write = false;
-               signal_dspin_false_cmd_in [x][y][a][k].read  = true;
-               signal_dspin_false_cmd_out[x][y][a][k].write = false;
-               signal_dspin_false_cmd_out[x][y][a][k].read  = true;
-            }
-            for (size_t k = 0; k < 2; k++){
-               signal_dspin_false_rsp_in [x][y][a][k].write = false;
-               signal_dspin_false_rsp_in [x][y][a][k].read  = true;
-               signal_dspin_false_rsp_out[x][y][a][k].write = false;
-               signal_dspin_false_rsp_out[x][y][a][k].read  = true;
-            }
-         }
-      }
+   // set network boundaries signals default values
+   // for all boundary clusters
+   for (size_t x = 0; x < X_SIZE ; x++) {
+       for (size_t y = 0; y < Y_SIZE ; y++) {
+           for (size_t face = 0; face < 4; face++) {
+               signal_dspin_bound_cmd_in [x][y][face].write = false;
+               signal_dspin_bound_cmd_in [x][y][face].read  = true;
+               signal_dspin_bound_cmd_out[x][y][face].write = false;
+               signal_dspin_bound_cmd_out[x][y][face].read  = true;
+
+               signal_dspin_bound_rsp_in [x][y][face].write = false;
+               signal_dspin_bound_rsp_in [x][y][face].read  = true;
+               signal_dspin_bound_rsp_out[x][y][face].write = false;
+               signal_dspin_bound_rsp_out[x][y][face].read  = true;
+
+               signal_dspin_bound_m2p_in [x][y][face].write = false;
+               signal_dspin_bound_m2p_in [x][y][face].read  = true;
+               signal_dspin_bound_m2p_out[x][y][face].write = false;
+               signal_dspin_bound_m2p_out[x][y][face].read  = true;
+
+               signal_dspin_bound_p2m_in [x][y][face].write = false;
+               signal_dspin_bound_p2m_in [x][y][face].read  = true;
+               signal_dspin_bound_p2m_out[x][y][face].write = false;
+               signal_dspin_bound_p2m_out[x][y][face].read  = true;
+
+               signal_dspin_bound_cla_in [x][y][face].write = false;
+               signal_dspin_bound_cla_in [x][y][face].read  = true;
+               signal_dspin_bound_cla_out[x][y][face].write = false;
+               signal_dspin_bound_cla_out[x][y][face].read  = true;
+           }
+       }
    }
 
@@ -1037,5 +1140,4 @@
 
                      clusters[x][y]->proc[proc]->print_trace();
-                     
                      std::ostringstream proc_signame;
                      proc_signame << "[SIG]PROC_" << x << "_" << y << "_" << proc ;
@@ -1121,5 +1223,5 @@
    }
 
-   
+
    // Free memory
    for (size_t i = 0; i  < (X_SIZE * Y_SIZE); i++)
@@ -1130,16 +1232,48 @@
    }
 
-   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cmd_inc, X_SIZE - 1, Y_SIZE, 3);
-   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cmd_dec, X_SIZE - 1, Y_SIZE, 3);
-   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_rsp_inc, X_SIZE - 1, Y_SIZE, 2);
-   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_rsp_dec, X_SIZE - 1, Y_SIZE, 2);
-   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cmd_inc, X_SIZE, Y_SIZE - 1, 3);
-   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cmd_dec, X_SIZE, Y_SIZE - 1, 3);
-   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_rsp_inc, X_SIZE, Y_SIZE - 1, 2);
-   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_rsp_dec, X_SIZE, Y_SIZE - 1, 2);
-   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_false_cmd_in, X_SIZE, Y_SIZE, 4, 3);
-   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_false_cmd_out, X_SIZE, Y_SIZE, 4, 3);
-   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_false_rsp_in, X_SIZE, Y_SIZE, 4, 2);
-   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_false_rsp_out, X_SIZE, Y_SIZE, 4, 2);
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cmd_inc, X_SIZE-1, Y_SIZE);
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cmd_dec, X_SIZE-1, Y_SIZE);
+
+   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_rsp_inc, X_SIZE-1, Y_SIZE);
+   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_rsp_dec, X_SIZE-1, Y_SIZE);
+
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_m2p_inc, X_SIZE-1, Y_SIZE);
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_m2p_dec, X_SIZE-1, Y_SIZE);
+
+   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_p2m_inc, X_SIZE-1, Y_SIZE);
+   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_p2m_dec, X_SIZE-1, Y_SIZE);
+
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cla_inc, X_SIZE-1, Y_SIZE);
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cla_dec, X_SIZE-1, Y_SIZE);
+
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cmd_inc, X_SIZE, Y_SIZE-1);
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cmd_dec, X_SIZE, Y_SIZE-1);
+
+   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_rsp_inc, X_SIZE, Y_SIZE-1);
+   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_rsp_dec, X_SIZE, Y_SIZE-1);
+
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_m2p_inc, X_SIZE, Y_SIZE-1);
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_m2p_dec, X_SIZE, Y_SIZE-1);
+
+   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_p2m_inc, X_SIZE, Y_SIZE-1);
+   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_p2m_dec, X_SIZE, Y_SIZE-1);
+
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cla_inc, X_SIZE, Y_SIZE-1);
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cla_dec, X_SIZE, Y_SIZE-1);
+
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_cmd_in, X_SIZE, Y_SIZE, 4);
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_cmd_out, X_SIZE, Y_SIZE, 4);
+
+   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_bound_rsp_in, X_SIZE, Y_SIZE, 4);
+   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_bound_rsp_out, X_SIZE, Y_SIZE, 4);
+
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_m2p_in, X_SIZE, Y_SIZE, 4);
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_m2p_out, X_SIZE, Y_SIZE, 4);
+
+   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_bound_p2m_in, X_SIZE, Y_SIZE, 4);
+   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_bound_p2m_out, X_SIZE, Y_SIZE, 4);
+
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_cla_in, X_SIZE, Y_SIZE, 4);
+   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_bound_cla_out, X_SIZE, Y_SIZE, 4);
 
    return EXIT_SUCCESS;
Index: trunk/platforms/tsar_generic_xbar/tsar_xbar_cluster/caba/metadata/tsar_xbar_cluster.sd
===================================================================
--- trunk/platforms/tsar_generic_xbar/tsar_xbar_cluster/caba/metadata/tsar_xbar_cluster.sd	(revision 874)
+++ trunk/platforms/tsar_generic_xbar/tsar_xbar_cluster/caba/metadata/tsar_xbar_cluster.sd	(revision 885)
@@ -56,8 +56,8 @@
                 flit_width      = parameter.Reference('dspin_rsp_width')),
 
-        Uses('caba:virtual_dspin_router', 
+        Uses('caba:dspin_router', 
                 flit_width      = parameter.Reference('dspin_cmd_width')),
 
-        Uses('caba:virtual_dspin_router', 
+        Uses('caba:dspin_router', 
                 flit_width      = parameter.Reference('dspin_rsp_width')),
 
@@ -95,14 +95,31 @@
         Port('caba:bit_in', 'p_resetn', auto = 'resetn'),
         Port('caba:clock_in', 'p_clk', auto = 'clock'),
-        Port('caba:dspin_output', 'p_cmd_out', [4, 3], 
-                dspin_data_size = parameter.Reference('dspin_cmd_width')),
-        Port('caba:dspin_input', 'p_cmd_in', [4, 3], 
-                dspin_data_size = parameter.Reference('dspin_cmd_width')),
-        Port('caba:dspin_output', 'p_rsp_out', [4, 2], 
-                dspin_data_size = parameter.Reference('dspin_rsp_width')), 
-        Port('caba:dspin_input', 'p_rsp_in', [4, 2], 
-                dspin_data_size = parameter.Reference('dspin_rsp_width')),
+
+        Port('caba:dspin_output', 'p_cmd_out', [4], 
+              dspin_data_size = parameter.Reference('dspin_cmd_width')),
+        Port('caba:dspin_input', 'p_cmd_in', [4], 
+              dspin_data_size = parameter.Reference('dspin_cmd_width')),
+
+        Port('caba:dspin_output', 'p_rsp_out', [4], 
+              dspin_data_size = parameter.Reference('dspin_rsp_width')), 
+        Port('caba:dspin_input', 'p_rsp_in', [4], 
+              dspin_data_size = parameter.Reference('dspin_rsp_width')),
+
+        Port('caba:dspin_output', 'p_m2p_out', [4], 
+              dspin_data_size = parameter.Reference('dspin_cmd_width')), 
+        Port('caba:dspin_input', 'p_m2p_in', [4], 
+              dspin_data_size = parameter.Reference('dspin_cmd_width')),
+
+        Port('caba:dspin_output', 'p_p2m_out', [4], 
+              dspin_data_size = parameter.Reference('dspin_rsp_width')), 
+        Port('caba:dspin_input', 'p_p2m_in', [4], 
+              dspin_data_size = parameter.Reference('dspin_rsp_width')),
+
+        Port('caba:dspin_output', 'p_cla_out', [4], 
+              dspin_data_size = parameter.Reference('dspin_cmd_width')), 
+        Port('caba:dspin_input', 'p_cla_in', [4], 
+              dspin_data_size = parameter.Reference('dspin_cmd_width')),
         ],
-        )
+)
 
 
Index: trunk/platforms/tsar_generic_xbar/tsar_xbar_cluster/caba/source/include/tsar_xbar_cluster.h
===================================================================
--- trunk/platforms/tsar_generic_xbar/tsar_xbar_cluster/caba/source/include/tsar_xbar_cluster.h	(revision 874)
+++ trunk/platforms/tsar_generic_xbar/tsar_xbar_cluster/caba/source/include/tsar_xbar_cluster.h	(revision 885)
@@ -27,5 +27,5 @@
 #include "vci_dspin_initiator_wrapper.h"
 #include "vci_dspin_target_wrapper.h"
-#include "virtual_dspin_router.h"
+#include "dspin_router.h"
 #include "vci_multi_tty.h"
 #include "vci_multi_nic.h"
@@ -56,8 +56,19 @@
     sc_in<bool>                                     p_clk;
     sc_in<bool>                                     p_resetn;
-    soclib::caba::DspinOutput<dspin_cmd_width>      **p_cmd_out;
-    soclib::caba::DspinInput<dspin_cmd_width>       **p_cmd_in;
-    soclib::caba::DspinOutput<dspin_rsp_width>      **p_rsp_out;
-    soclib::caba::DspinInput<dspin_rsp_width>       **p_rsp_in;
+
+    soclib::caba::DspinOutput<dspin_cmd_width>      *p_cmd_out;
+    soclib::caba::DspinInput<dspin_cmd_width>       *p_cmd_in;
+
+    soclib::caba::DspinOutput<dspin_rsp_width>      *p_rsp_out;
+    soclib::caba::DspinInput<dspin_rsp_width>       *p_rsp_in;
+
+    soclib::caba::DspinOutput<dspin_cmd_width>      *p_m2p_out;
+    soclib::caba::DspinInput<dspin_cmd_width>       *p_m2p_in;
+
+    soclib::caba::DspinOutput<dspin_rsp_width>      *p_p2m_out;
+    soclib::caba::DspinInput<dspin_rsp_width>       *p_p2m_in;
+
+    soclib::caba::DspinOutput<dspin_cmd_width>      *p_cla_out;
+    soclib::caba::DspinInput<dspin_cmd_width>       *p_cla_in;
 
     // interrupt signals
@@ -143,5 +154,5 @@
     VciFrameBuffer<vci_param_int>*                fbuf;
 
-    VciMultiNic<vci_param_int>*                  mnic;
+    VciMultiNic<vci_param_int>*                   mnic;
 
     VciChbufDma<vci_param_int>*                   chbuf;
@@ -161,6 +172,9 @@
     DspinLocalCrossbar<dspin_cmd_width>*          xbar_clack_c;
 
-    VirtualDspinRouter<dspin_cmd_width>*          router_cmd;
-    VirtualDspinRouter<dspin_rsp_width>*          router_rsp;
+    DspinRouter<dspin_cmd_width>*                 router_cmd;
+    DspinRouter<dspin_rsp_width>*                 router_rsp;
+    DspinRouter<dspin_cmd_width>*                 router_m2p;
+    DspinRouter<dspin_rsp_width>*                 router_p2m;
+    DspinRouter<dspin_cmd_width>*                 router_cla;
 
     TsarXbarCluster( sc_module_name                     insname,
Index: trunk/platforms/tsar_generic_xbar/tsar_xbar_cluster/caba/source/src/tsar_xbar_cluster.cpp
===================================================================
--- trunk/platforms/tsar_generic_xbar/tsar_xbar_cluster/caba/source/src/tsar_xbar_cluster.cpp	(revision 874)
+++ trunk/platforms/tsar_generic_xbar/tsar_xbar_cluster/caba/source/src/tsar_xbar_cluster.cpp	(revision 885)
@@ -91,9 +91,22 @@
     n_procs = nb_procs;
 
-    // Vectors of ports definition
-    p_cmd_in  = alloc_elems<DspinInput<dspin_cmd_width> >  ("p_cmd_in",  4, 3);
-    p_cmd_out = alloc_elems<DspinOutput<dspin_cmd_width> > ("p_cmd_out", 4, 3);
-    p_rsp_in  = alloc_elems<DspinInput<dspin_rsp_width> >  ("p_rsp_in",  4, 2);
-    p_rsp_out = alloc_elems<DspinOutput<dspin_rsp_width> > ("p_rsp_out", 4, 2);
+    /////////////////////////////////////////////////////////////////////////////
+    // Vectors of ports definition and allocation
+    /////////////////////////////////////////////////////////////////////////////
+
+    p_cmd_in  = alloc_elems<DspinInput<dspin_cmd_width> >  ("p_cmd_in",  4);
+    p_cmd_out = alloc_elems<DspinOutput<dspin_cmd_width> > ("p_cmd_out", 4);
+
+    p_rsp_in  = alloc_elems<DspinInput<dspin_rsp_width> >  ("p_rsp_in",  4);
+    p_rsp_out = alloc_elems<DspinOutput<dspin_rsp_width> > ("p_rsp_out", 4);
+
+    p_m2p_in  = alloc_elems<DspinInput<dspin_cmd_width> >  ("p_m2p_in",  4);
+    p_m2p_out = alloc_elems<DspinOutput<dspin_cmd_width> > ("p_m2p_out", 4);
+
+    p_p2m_in  = alloc_elems<DspinInput<dspin_rsp_width> >  ("p_p2m_in",  4);
+    p_p2m_out = alloc_elems<DspinOutput<dspin_rsp_width> > ("p_p2m_out", 4);
+
+    p_cla_in  = alloc_elems<DspinInput<dspin_cmd_width> >  ("p_cla_in",  4);
+    p_cla_out = alloc_elems<DspinOutput<dspin_cmd_width> > ("p_cla_out", 4);
 
     /////////////////////////////////////////////////////////////////////////////
@@ -174,5 +187,5 @@
                      32,                                // number of hard IRQs
                      32,                                // number of soft IRQs
-                     nb_procs*irq_per_processor);                         // number of output IRQs
+                     nb_procs * irq_per_processor);     // number of output IRQs
 
 
@@ -262,17 +275,47 @@
 
     /////////////////////////////////////////////////////////////////////////////
-    router_cmd = new VirtualDspinRouter<dspin_cmd_width>(
-                     "router_cmd",
+    std::ostringstream s_router_cmd;
+    s_router_cmd << "router_cmd_" << x_id << "_" << y_id;
+    router_cmd = new DspinRouter<dspin_cmd_width>(
+                     s_router_cmd.str().c_str(),
                      x_id,y_id,                    // coordinate in the mesh
                      x_width, y_width,             // x & y fields width
-                     3,                            // nb virtual channels
                      4,4);                         // input & output fifo depths
 
     /////////////////////////////////////////////////////////////////////////////
-    router_rsp = new VirtualDspinRouter<dspin_rsp_width>(
-                     "router_rsp",
+    std::ostringstream s_router_rsp;
+    s_router_rsp << "router_rsp_" << x_id << "_" << y_id;
+    router_rsp = new DspinRouter<dspin_rsp_width>(
+                     s_router_rsp.str().c_str(),
                      x_id,y_id,                    // coordinates in mesh
                      x_width, y_width,             // x & y fields width
-                     2,                            // nb virtual channels
+                     4,4);                         // input & output fifo depths
+
+    /////////////////////////////////////////////////////////////////////////////
+    std::ostringstream s_router_m2p;
+    s_router_m2p << "router_m2p_" << x_id << "_" << y_id;
+    router_m2p = new DspinRouter<dspin_cmd_width>(
+                     s_router_m2p.str().c_str(),
+                     x_id,y_id,                    // coordinate in the mesh
+                     x_width, y_width,             // x & y fields width
+                     4,4,                          // input & output fifo depths
+                     true);                        // broadcast supported
+
+    /////////////////////////////////////////////////////////////////////////////
+    std::ostringstream s_router_p2m;
+    s_router_p2m << "router_p2m_" << x_id << "_" << y_id;
+    router_p2m = new DspinRouter<dspin_rsp_width>(
+                     s_router_p2m.str().c_str(),
+                     x_id,y_id,                    // coordinates in mesh
+                     x_width, y_width,             // x & y fields width
+                     4,4);                         // input & output fifo depths
+
+    /////////////////////////////////////////////////////////////////////////////
+    std::ostringstream s_router_cla;
+    s_router_cla << "router_cla_" << x_id << "_" << y_id;
+    router_cla = new DspinRouter<dspin_cmd_width>(
+                     s_router_cla.str().c_str(),
+                     x_id,y_id,                    // coordinate in the mesh
+                     x_width, y_width,             // x & y fields width
                      4,4);                         // input & output fifo depths
 
@@ -350,39 +393,51 @@
     ////////////////////////////////////
 
-    //////////////////////// CMD ROUTER and RSP ROUTER
-    router_cmd->p_clk                        (this->p_clk);
-    router_cmd->p_resetn                     (this->p_resetn);
-    router_rsp->p_clk                        (this->p_clk);
-    router_rsp->p_resetn                     (this->p_resetn);
-
-    for (int i = 0; i < 4; i++)
-    {
-        for (int k = 0; k < 3; k++)
-        {
-            router_cmd->p_out[i][k]          (this->p_cmd_out[i][k]);
-            router_cmd->p_in[i][k]           (this->p_cmd_in[i][k]);
-        }
-
-        for (int k = 0; k < 2; k++)
-        {
-            router_rsp->p_out[i][k]          (this->p_rsp_out[i][k]);
-            router_rsp->p_in[i][k]           (this->p_rsp_in[i][k]);
-        }
-    }
-
-    router_cmd->p_out[4][0]                  (signal_dspin_cmd_g2l_d);
-    router_cmd->p_out[4][1]                  (signal_dspin_m2p_g2l_c);
-    router_cmd->p_out[4][2]                  (signal_dspin_clack_g2l_c);
-    router_cmd->p_in[4][0]                   (signal_dspin_cmd_l2g_d);
-    router_cmd->p_in[4][1]                   (signal_dspin_m2p_l2g_c);
-    router_cmd->p_in[4][2]                   (signal_dspin_clack_l2g_c);
-
-    router_rsp->p_out[4][0]                  (signal_dspin_rsp_g2l_d);
-    router_rsp->p_out[4][1]                  (signal_dspin_p2m_g2l_c);
-    router_rsp->p_in[4][0]                   (signal_dspin_rsp_l2g_d);
-    router_rsp->p_in[4][1]                   (signal_dspin_p2m_l2g_c);
-
-
-    std::cout << "  - CMD & RSP routers connected" << std::endl;
+    //////////////////////// ROUTERS
+    router_cmd->p_clk                      (this->p_clk);
+    router_cmd->p_resetn                   (this->p_resetn);
+    router_rsp->p_clk                      (this->p_clk);
+    router_rsp->p_resetn                   (this->p_resetn);
+    router_m2p->p_clk                      (this->p_clk);
+    router_m2p->p_resetn                   (this->p_resetn);
+    router_p2m->p_clk                      (this->p_clk);
+    router_p2m->p_resetn                   (this->p_resetn);
+    router_cla->p_clk                      (this->p_clk);
+    router_cla->p_resetn                   (this->p_resetn);
+
+    // loop on N/S/E/W ports
+    for (size_t i = 0; i < 4; i++)
+    {
+        router_cmd->p_out[i]               (this->p_cmd_out[i]);
+        router_cmd->p_in[i]                (this->p_cmd_in[i]);
+
+        router_rsp->p_out[i]               (this->p_rsp_out[i]);
+        router_rsp->p_in[i]                (this->p_rsp_in[i]);
+
+        router_m2p->p_out[i]               (this->p_m2p_out[i]);
+        router_m2p->p_in[i]                (this->p_m2p_in[i]);
+
+        router_p2m->p_out[i]               (this->p_p2m_out[i]);
+        router_p2m->p_in[i]                (this->p_p2m_in[i]);
+
+        router_cla->p_out[i]               (this->p_cla_out[i]);
+        router_cla->p_in[i]                (this->p_cla_in[i]);
+    }
+
+    router_cmd->p_out[4]                   (signal_dspin_cmd_g2l_d);
+    router_cmd->p_in[4]                    (signal_dspin_cmd_l2g_d);
+
+    router_rsp->p_out[4]                   (signal_dspin_rsp_g2l_d);
+    router_rsp->p_in[4]                    (signal_dspin_rsp_l2g_d);
+
+    router_m2p->p_out[4]                   (signal_dspin_m2p_g2l_c);
+    router_m2p->p_in[4]                    (signal_dspin_m2p_l2g_c);
+
+    router_p2m->p_out[4]                   (signal_dspin_p2m_g2l_c);
+    router_p2m->p_in[4]                    (signal_dspin_p2m_l2g_c);
+
+    router_cla->p_out[4]                   (signal_dspin_clack_g2l_c);
+    router_cla->p_in[4]                    (signal_dspin_clack_l2g_c);
+
+    std::cout << "  - routers connected" << std::endl;
 
     wi_xbar_d->p_clk                         (this->p_clk);
@@ -633,8 +688,18 @@
                                                  vci_param_ext>::~TsarXbarCluster() {
 
-    dealloc_elems<DspinInput<dspin_cmd_width> > (p_cmd_in, 4, 3);
-    dealloc_elems<DspinOutput<dspin_cmd_width> >(p_cmd_out, 4, 3);
-    dealloc_elems<DspinInput<dspin_rsp_width> > (p_rsp_in, 4, 2);
-    dealloc_elems<DspinOutput<dspin_rsp_width> >(p_rsp_out, 4, 2);
+    dealloc_elems<DspinInput<dspin_cmd_width> > (p_cmd_in, 4);
+    dealloc_elems<DspinOutput<dspin_cmd_width> >(p_cmd_out, 4);
+
+    dealloc_elems<DspinInput<dspin_rsp_width> > (p_rsp_in, 4);
+    dealloc_elems<DspinOutput<dspin_rsp_width> >(p_rsp_out, 4);
+
+    dealloc_elems<DspinInput<dspin_cmd_width> > (p_m2p_in, 4);
+    dealloc_elems<DspinOutput<dspin_cmd_width> >(p_m2p_out, 4);
+
+    dealloc_elems<DspinInput<dspin_rsp_width> > (p_p2m_in, 4);
+    dealloc_elems<DspinOutput<dspin_rsp_width> >(p_p2m_out, 4);
+
+    dealloc_elems<DspinInput<dspin_cmd_width> > (p_cla_in, 4);
+    dealloc_elems<DspinOutput<dspin_cmd_width> >(p_cla_out, 4);
 
     for (size_t p = 0; p < n_procs; p++)
@@ -701,7 +766,4 @@
 
 }                        
-                                    
-
-
 
 }}
