Index: /trunk/modules/vci_mem_cache/caba/source/include/vci_mem_cache.h
===================================================================
--- /trunk/modules/vci_mem_cache/caba/source/include/vci_mem_cache.h	(revision 662)
+++ /trunk/modules/vci_mem_cache/caba/source/include/vci_mem_cache.h	(revision 663)
@@ -405,4 +405,5 @@
       // instrumentation counters
       uint32_t     m_cpt_cycles;         // Counter of cycles
+      uint32_t     m_cpt_reset_count;    // Cycle at which the counters were last reset
 
       // Counters accessible in software (not yet but eventually)
@@ -449,5 +450,5 @@
       uint32_t     m_cpt_write_miss;     // Number of MISS WRITE
       uint32_t     m_cpt_write_dirty;    // Cumulated length for WRITE transactions
-      uint32_t     m_cpt_write_broadcast;// Number of BROADCAST INVAL because write
+      uint32_t     m_cpt_write_broadcast;// Number of BROADCAST INVAL because of writes
 
       uint32_t     m_cpt_trt_rb;         // Read blocked by a hit in trt
@@ -515,4 +516,5 @@
       ~VciMemCache();
 
+      void reset_counters();
       void print_stats(bool activity_counters, bool stats);
       void print_trace( size_t detailed = 0 );
Index: /trunk/modules/vci_mem_cache/caba/source/src/vci_mem_cache.cpp
===================================================================
--- /trunk/modules/vci_mem_cache/caba/source/src/vci_mem_cache.cpp	(revision 662)
+++ /trunk/modules/vci_mem_cache/caba/source/src/vci_mem_cache.cpp	(revision 663)
@@ -31,4 +31,5 @@
  *              alexandre.joannou@lip6.fr
  */
+
 
 #include "../include/vci_mem_cache.h"
@@ -799,4 +800,47 @@
     }
 
+    
+    /////////////////////////////////////////
+    tmpl(void)::reset_counters()
+    /////////////////////////////////////////
+    {
+        m_cpt_reset_count        = m_cpt_cycles;
+        m_cpt_read_local         = 0;
+        m_cpt_read_remote        = 0;
+        m_cpt_read_cost          = 0;
+        m_cpt_write_local        = 0;
+        m_cpt_write_remote       = 0;
+        m_cpt_write_flits_local  = 0;
+        m_cpt_write_flits_remote = 0;
+        m_cpt_write_cost         = 0;
+        m_cpt_ll_local           = 0;
+        m_cpt_ll_remote          = 0;
+        m_cpt_ll_cost            = 0;
+        m_cpt_sc_local           = 0;
+        m_cpt_sc_remote          = 0;
+        m_cpt_sc_cost            = 0;
+        m_cpt_cas_local          = 0;
+        m_cpt_cas_remote         = 0;
+        m_cpt_cas_cost           = 0;
+        m_cpt_update             = 0;
+        m_cpt_update_local       = 0;
+        m_cpt_update_remote      = 0;
+        m_cpt_update_cost        = 0;
+        m_cpt_minval             = 0;
+        m_cpt_minval_local       = 0;
+        m_cpt_minval_remote      = 0;
+        m_cpt_minval_cost        = 0;
+        m_cpt_binval             = 0;
+        m_cpt_cleanup_local      = 0;
+        m_cpt_cleanup_remote     = 0;
+        m_cpt_cleanup_cost       = 0;
+        m_cpt_read_miss          = 0;
+        m_cpt_write_miss         = 0;
+        m_cpt_write_dirty        = 0;
+        m_cpt_trt_rb             = 0;
+        m_cpt_trt_full           = 0;
+        m_cpt_get                = 0;
+        m_cpt_put                = 0;
+    }
 
     /////////////////////////////////////////
@@ -812,4 +856,5 @@
             std::cout << "----------------------------------" << std::dec << std::endl;
             std::cout
+                << "[000] COUNTERS RESET AT CYCLE   = " << m_cpt_reset_count << std::endl
                 << "[001] NUMBER OF CYCLES          = " << m_cpt_cycles << std::endl
                 << std::endl
@@ -941,5 +986,5 @@
         delete [] m_debug_data;
 
-        print_stats();
+        //print_stats();
     }
 
@@ -1068,4 +1113,5 @@
             // Activity counters
             m_cpt_cycles             = 0;
+            m_cpt_reset_count        = 0;
             m_cpt_read_local         = 0;
             m_cpt_read_remote        = 0;
@@ -1206,5 +1252,4 @@
                 if (p_vci_tgt.cmdval)
                 {
-
 #if DEBUG_MEMC_TGT_CMD
                     if (m_debug)
@@ -3705,6 +3750,4 @@
                             "MEMC ERROR in WRITE_BC_DIR_READ state: Bad DIR allocation");
 
-                    m_cpt_write_broadcast++;
-
                     // write enable signal for data buffer.
                     r_write_bc_data_we = true;
@@ -5509,5 +5552,5 @@
                             << " address = "   << std::hex << r_cleanup_nline.read()*m_words*4
                             << " / way = "   << std::dec << r_cleanup_way.read()
-                            << " / srcid = " << std::dec << r_cleanup_srcid.read() 
+                            << " / srcid = " << std::hex << r_cleanup_srcid.read() 
                             << std::endl;
 #endif
@@ -6639,4 +6682,5 @@
                     // <Activity Counters>
                     m_cpt_binval++;
+                    m_cpt_write_broadcast++;
                     // </Activity Counters>
 
Index: /trunk/platforms/almos-tsar-mipsel/top.desc
===================================================================
--- /trunk/platforms/almos-tsar-mipsel/top.desc	(revision 662)
+++ /trunk/platforms/almos-tsar-mipsel/top.desc	(revision 663)
@@ -23,5 +23,5 @@
 
 	uses = [
-            Uses('caba:tsar_xbar_cluster', 
+            Uses('caba:tsar_xbar_cluster_almos', 
                   vci_data_width_int = vci_cell_size_int,
                   vci_data_width_ext = vci_cell_size_ext,
Index: /trunk/platforms/almos-tsar-mipsel/tsar_xbar_cluster/caba/metadata/tsar_xbar_cluster.sd
===================================================================
--- /trunk/platforms/almos-tsar-mipsel/tsar_xbar_cluster/caba/metadata/tsar_xbar_cluster.sd	(revision 662)
+++ /trunk/platforms/almos-tsar-mipsel/tsar_xbar_cluster/caba/metadata/tsar_xbar_cluster.sd	(revision 663)
@@ -2,5 +2,5 @@
 # -*- python -*-
 
-Module('caba:tsar_xbar_cluster', 
+Module('caba:tsar_xbar_cluster_almos', 
     classname = 'soclib::caba::TsarXbarCluster',
    tmpl_parameters = [
Index: /trunk/platforms/tsar_generic_xbar/top.cpp
===================================================================
--- /trunk/platforms/tsar_generic_xbar/top.cpp	(revision 662)
+++ /trunk/platforms/tsar_generic_xbar/top.cpp	(revision 663)
@@ -91,13 +91,9 @@
 #include "gdbserver.h"
 #include "mapping_table.h"
+#include "alloc_elems.h"
 #include "tsar_xbar_cluster.h"
-#include "alloc_elems.h"
-
-///////////////////////////////////////////////////
-//      OS
-///////////////////////////////////////////////////
-
-//#define USE_ALMOS 1
-#define USE_GIET 1
+
+#define USE_ALMOS 1
+//#define USE_GIET 
 
 #ifdef USE_ALMOS
@@ -113,7 +109,16 @@
 #endif
 
+#ifdef USE_ALMOS
+   #define PREFIX_OS "almos/"
+   #include "almos/hard_config.h"
+#endif
+#ifdef USE_GIET
+   #define PREFIX_OS "giet_vm/"
+#endif
+
 ///////////////////////////////////////////////////
 //               Parallelisation
 ///////////////////////////////////////////////////
+
 #define USE_OPENMP 0
 
@@ -124,7 +129,7 @@
 //  cluster index (computed from x,y coordinates)
 #ifdef USE_ALMOS
-#  define cluster(x,y)   (y + x * Y_MAX)
+   #define cluster(x,y)   (y + x * Y_SIZE)
 #else
-#  define cluster(x,y)   (y + (x << Y_WIDTH))
+   #define cluster(x,y)   (y + (x << Y_WIDTH))
 #endif
 
@@ -162,22 +167,7 @@
 
 ////////////////////////////////////////////////////////////
-//    Main Hardware Parameters values         
-//////////////////////i/////////////////////////////////////
-
-#ifdef USE_ALMOS
-#include "almos/hard_config.h"
-#define PREFIX_OS "almos/"
-#endif
-#ifdef USE_GIET
-#include "giet_vm/hard_config.h"
-#define PREFIX_OS "giet_vm/"
-#endif
-
-////////////////////////////////////////////////////////////
 //    Secondary Hardware Parameters         
 //////////////////////i/////////////////////////////////////
 
-#define XMAX                  X_SIZE
-#define YMAX                  Y_SIZE
 
 #define XRAM_LATENCY          0
@@ -193,6 +183,6 @@
 
 #ifdef USE_ALMOS
-#define FBUF_X_SIZE           512
-#define FBUF_Y_SIZE           512
+#define FBUF_X_SIZE           1024
+#define FBUF_Y_SIZE           1024
 #endif
 #ifdef USE_GIET
@@ -224,5 +214,5 @@
 
 #ifdef USE_ALMOS
-#define soft_name       PREFIX_OS"bootloader.bin",\
+#define soft_name       PREFIX_OS"bootloader-tsar-mipsel.bin",\
                         PREFIX_OS"kernel-soclib.bin@0xbfc10000:D",\
                         PREFIX_OS"arch-info.bib@0xBFC08000:D"
@@ -236,6 +226,5 @@
 //////////////////////i/////////////////////////////////////
 
-#define MAX_FROZEN_CYCLES     1000000
-
+#define MAX_FROZEN_CYCLES     100000000
 
 
@@ -249,11 +238,10 @@
 #define MDMA_TGTID      2
 #define MTTY_TGTID      3
-#define FBUF_TGTID      4
-#define BDEV_TGTID      5
-#define MNIC_TGTID      6
-#define BROM_TGTID      7
-#define CDMA_TGTID      8
-#define SIMH_TGTID      9
-
+#define BDEV_TGTID      4
+#define MNIC_TGTID      5
+#define BROM_TGTID      6
+#define CDMA_TGTID      7
+#define SIMH_TGTID      8
+#define FBUF_TGTID      9
 
 
@@ -307,7 +295,6 @@
    // (Almos supports 32 bits physical addresses)
 
-   #define CLUSTER_IO_INC  (cluster_io_id * (0x80000000ULL / (XMAX * YMAX) * 2))
-
-   #define MEMC_MAX_SIZE (0x80000000 / (XMAX * YMAX))
+   #define CLUSTER_IO_INC  (cluster_io_id * (0x80000000ULL / (X_SIZE * Y_SIZE) * 2))
+   #define MEMC_MAX_SIZE (0x40000000 / (X_SIZE * Y_SIZE))
 
    #define BROM_BASE    0x00BFC00000
@@ -315,5 +302,5 @@
 
    #define MEMC_BASE    0x0000000000
-   #define MEMC_SIZE    min(0x02000000, MEMC_MAX_SIZE)
+   #define MEMC_SIZE    min(0x04000000, MEMC_MAX_SIZE)
 
    #define XICU_BASE    MEMC_MAX_SIZE + (XICU_TGTID << 19)
@@ -325,22 +312,20 @@
    #define BDEV_BASE    MEMC_MAX_SIZE + (BDEV_TGTID << 19) + (CLUSTER_IO_INC)
    #define BDEV_SIZE    0x0000001000   // 4 Kbytes
-   
+
    #define MTTY_BASE    MEMC_MAX_SIZE + (MTTY_TGTID << 19) + (CLUSTER_IO_INC)
    #define MTTY_SIZE    0x0000001000   // 4 Kbytes
-   
+
    #define FBUF_BASE    MEMC_MAX_SIZE + (FBUF_TGTID << 19) + (CLUSTER_IO_INC)
    #define FBUF_SIZE    (FBUF_X_SIZE * FBUF_Y_SIZE * 2) // Should be 0x80000
-   
+
    #define MNIC_BASE    MEMC_MAX_SIZE + (MNIC_TGTID << 19) + (CLUSTER_IO_INC)
    #define MNIC_SIZE    0x0000080000
-   
+
    #define CDMA_BASE    MEMC_MAX_SIZE + (CDMA_TGTID << 19) + (CLUSTER_IO_INC)
    #define CDMA_SIZE    (0x0000004000 * NB_CMA_CHANNELS)
-   
+
    #define SIMH_BASE    MEMC_MAX_SIZE + (SIMH_TGTID << 19) + (CLUSTER_IO_INC)
    #define SIMH_SIZE    0x0000001000
-
-#endif
-
+#endif
 
 bool stop_called = false;
@@ -354,20 +339,25 @@
 
 #ifdef USE_GIET
-   char     soft_name[256]   = soft_pathname;      // pathname to binary code
-#endif
-   uint64_t ncycles          = 0xFFFFFFFFFFFFFFFF; // simulated cycles
-   char     disk_name[256]   = BDEV_IMAGE_NAME;    // pathname to the disk image
-   char     nic_rx_name[256] = NIC_RX_NAME;        // pathname to the rx packets file
-   char     nic_tx_name[256] = NIC_TX_NAME;        // pathname to the tx packets file
-   ssize_t  threads_nr       = 1;                  // simulator's threads number
-   bool     debug_ok         = false;              // trace activated
-   size_t   debug_period     = 1;                  // trace period
-   size_t   debug_memc_id    = 0;                  // index of memc to be traced 
-   size_t   debug_proc_id    = 0;                  // index of proc to be traced
-   uint32_t debug_from       = 0;                  // trace start cycle
-   uint32_t frozen_cycles    = MAX_FROZEN_CYCLES;  // monitoring frozen processor
+   char     soft_name[256]    = soft_pathname;      // pathname to binary code
+#endif
+   const int64_t max_cycles   = 5000000;             // Maximum number of cycles simulated in one sc_start call
+   int64_t ncycles            = 0x7FFFFFFFFFFFFFFF;  // simulated cycles
+   char     disk_name[256]    = BDEV_IMAGE_NAME;    // pathname to the disk image
+   char     nic_rx_name[256]  = NIC_RX_NAME;        // pathname to the rx packets file
+   char     nic_tx_name[256]  = NIC_TX_NAME;        // pathname to the tx packets file
+   ssize_t  threads_nr        = 1;                  // simulator's threads number
+   bool     debug_ok          = false;              // trace activated
+   size_t   debug_period      = 1;                  // trace period
+   size_t   debug_memc_id     = 0;                  // index of memc to be traced 
+   size_t   debug_proc_id     = 0;                  // index of proc to be traced
+   int64_t  debug_from        = 0;                  // trace start cycle
+   int64_t  frozen_cycles     = MAX_FROZEN_CYCLES;  // monitoring frozen processor
    size_t   cluster_io_id;                         // index of cluster containing IOs
-   struct   timeval t1,t2;
-   uint64_t ms1,ms2;
+   int64_t  reset_counters    = -1;
+   int64_t  dump_counters     = -1;
+   bool     do_reset_counters = false;
+   bool     do_dump_counters  = false;
+   struct   timeval t1, t2;
+   uint64_t ms1, ms2;
 
    ////////////// command line arguments //////////////////////
@@ -378,5 +368,5 @@
          if ((strcmp(argv[n], "-NCYCLES") == 0) && (n + 1 < argc))
          {
-            ncycles = (uint64_t) strtol(argv[n + 1], NULL, 0);
+            ncycles = (int64_t) strtol(argv[n + 1], NULL, 0);
          }
          else if ((strcmp(argv[n], "-SOFT") == 0) && (n + 1 < argc))
@@ -396,18 +386,17 @@
          {
             debug_ok = true;
-            debug_from = (uint32_t) strtol(argv[n + 1], NULL, 0);
+            debug_from = (int64_t) strtol(argv[n + 1], NULL, 0);
          }
          else if ((strcmp(argv[n], "-MEMCID") == 0) && (n + 1 < argc))
          {
             debug_memc_id = (size_t) strtol(argv[n + 1], NULL, 0);
-
-#ifdef USE_ALMOS
-            assert((debug_memc_id < (XMAX * YMAX)) &&
-                   "debug_memc_id larger than XMAX * YMAX" );
+#ifdef USE_ALMOS
+            assert((debug_memc_id < (X_SIZE * Y_SIZE)) &&
+                   "debug_memc_id larger than X_SIZE * Y_SIZE" );
 #else
             size_t x = debug_memc_id >> Y_WIDTH;
             size_t y = debug_memc_id & ((1<<Y_WIDTH)-1);
 
-            assert( (x <= XMAX) and (y <= YMAX) &&
+            assert( (x <= X_SIZE) and (y <= Y_SIZE) &&
                   "MEMCID parameter refers a not valid memory cache");
 #endif
@@ -416,8 +405,7 @@
          {
             debug_proc_id = (size_t) strtol(argv[n + 1], NULL, 0);
-
-#ifdef USE_ALMOS
-            assert((debug_proc_id < (XMAX * YMAX * NB_PROCS_MAX)) && 
-                   "debug_proc_id larger than XMAX * YMAX * NB_PROCS");
+#ifdef USE_ALMOS
+            assert((debug_proc_id < (X_SIZE * Y_SIZE * NB_PROCS_MAX)) && 
+                   "debug_proc_id larger than X_SIZE * Y_SIZE * NB_PROCS");
 #else
             size_t cluster_xy = debug_proc_id / NB_PROCS_MAX ;
@@ -425,5 +413,5 @@
             size_t y          = cluster_xy & ((1<<Y_WIDTH)-1);
 
-            assert( (x <= XMAX) and (y <= YMAX) &&
+            assert( (x <= X_SIZE) and (y <= Y_SIZE) &&
                   "PROCID parameter refers a not valid processor");
 #endif
@@ -436,9 +424,19 @@
          else if ((strcmp(argv[n], "-FROZEN") == 0) && (n + 1 < argc))
          {
-            frozen_cycles = (uint32_t) strtol(argv[n + 1], NULL, 0);
+            frozen_cycles = (int64_t) strtol(argv[n + 1], NULL, 0);
          }
          else if ((strcmp(argv[n], "-PERIOD") == 0) && (n + 1 < argc))
          {
             debug_period = (size_t) strtol(argv[n + 1], NULL, 0);
+         }
+         else if ((strcmp(argv[n], "--reset-counters") == 0) && (n + 1 < argc))
+         {
+            reset_counters = (int64_t) strtol(argv[n + 1], NULL, 0);
+            do_reset_counters = true;
+         }
+         else if ((strcmp(argv[n], "--dump-counters") == 0) && (n + 1 < argc))
+         {
+            dump_counters = (int64_t) strtol(argv[n + 1], NULL, 0);
+            do_dump_counters = true;
          }
          else
@@ -462,11 +460,11 @@
 
     // checking hardware parameters
-    assert( ( (XMAX == 1) or (XMAX == 2) or (XMAX == 4) or
-              (XMAX == 8) or (XMAX == 16) ) and
-              "The XMAX parameter must be 1, 2, 4, 8 or 16" );
-
-    assert( ( (YMAX == 1) or (YMAX == 2) or (YMAX == 4) or
-              (YMAX == 8) or (YMAX == 16) ) and
-              "The YMAX parameter must be 1, 2, 4, 8 or 16" );
+    assert( ( (X_SIZE == 1) or (X_SIZE == 2) or (X_SIZE == 4) or
+              (X_SIZE == 8) or (X_SIZE == 16) ) and
+              "The X_SIZE parameter must be 1, 2, 4, 8 or 16" );
+
+    assert( ( (Y_SIZE == 1) or (Y_SIZE == 2) or (Y_SIZE == 4) or
+              (Y_SIZE == 8) or (Y_SIZE == 16) ) and
+              "The Y_SIZE parameter must be 1, 2, 4, 8 or 16" );
 
     assert( ( (NB_PROCS_MAX == 1) or (NB_PROCS_MAX == 2) or
@@ -495,6 +493,6 @@
 
     std::cout << std::endl;
-    std::cout << " - XMAX             = " << XMAX << std::endl;
-    std::cout << " - YMAX             = " << YMAX << std::endl;
+    std::cout << " - X_SIZE             = " << X_SIZE << std::endl;
+    std::cout << " - Y_SIZE             = " << Y_SIZE << std::endl;
     std::cout << " - NB_PROCS_MAX     = " << NB_PROCS_MAX <<  std::endl;
     std::cout << " - NB_DMA_CHANNELS  = " << NB_DMA_CHANNELS <<  std::endl;
@@ -505,5 +503,4 @@
     std::cout << " - RAM_LATENCY      = " << XRAM_LATENCY << std::endl;
     std::cout << " - MAX_FROZEN       = " << frozen_cycles << std::endl;
-    std::cout << "[PROCS] " << NB_PROCS_MAX * XMAX * YMAX << std::endl;
 
     std::cout << std::endl;
@@ -537,20 +534,22 @@
 #endif
 
-#ifdef USE_ALMOS
-
-   if      (XMAX == 1) x_width = 0;
-   else if (XMAX == 2) x_width = 1;
-   else if (XMAX <= 4) x_width = 2;
-   else if (XMAX <= 8) x_width = 3;
+   // Define parameters depending on mesh size
+   size_t   x_width;
+   size_t   y_width;
+
+#ifdef USE_ALMOS
+   if      (X_SIZE == 1) x_width = 0;
+   else if (X_SIZE == 2) x_width = 1;
+   else if (X_SIZE <= 4) x_width = 2;
+   else if (X_SIZE <= 8) x_width = 3;
    else                x_width = 4;
 
-   if      (YMAX == 1) y_width = 0;
-   else if (YMAX == 2) y_width = 1;
-   else if (YMAX <= 4) y_width = 2;
-   else if (YMAX <= 8) y_width = 3;
+   if      (Y_SIZE == 1) y_width = 0;
+   else if (Y_SIZE == 2) y_width = 1;
+   else if (Y_SIZE <= 4) y_width = 2;
+   else if (Y_SIZE <= 8) y_width = 3;
    else                y_width = 4;
 
 #else
-
    size_t x_width = X_WIDTH;
    size_t y_width = Y_WIDTH;
@@ -559,12 +558,12 @@
            "Up to 256 clusters");
 
-   assert( (XMAX <= (1 << X_WIDTH)) and (YMAX <= (1 << Y_WIDTH)) and
+   assert( (X_SIZE <= (1 << X_WIDTH)) and (Y_SIZE <= (1 << Y_WIDTH)) and
            "The X_WIDTH and Y_WIDTH parameter are insufficient");
 
 #endif
-
 
    // index of cluster containing IOs
    cluster_io_id = 0x00bfc00000ULL >> (vci_address_width - x_width - y_width);
+
 
    /////////////////////
@@ -578,7 +577,7 @@
                         0x00FF800000);
 
-   for (size_t x = 0; x < XMAX; x++)
+   for (size_t x = 0; x < X_SIZE; x++)
    {
-      for (size_t y = 0; y < YMAX; y++)
+      for (size_t y = 0; y < Y_SIZE; y++)
       {
          sc_uint<vci_address_width> offset;
@@ -628,7 +627,7 @@
                         0xFFFF000000ULL);
 
-   for (size_t x = 0; x < XMAX; x++)
+   for (size_t x = 0; x < X_SIZE; x++)
    {
-      for (size_t y = 0; y < YMAX ; y++)
+      for (size_t y = 0; y < Y_SIZE ; y++)
       { 
 
@@ -655,31 +654,31 @@
    // 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", XMAX-1, YMAX, 3);
+      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", XMAX-1, YMAX, 3);
+      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", XMAX-1, YMAX, 2);
+      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", XMAX-1, YMAX, 2);
+      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_h_rsp_dec", X_SIZE-1, Y_SIZE, 2);
 
    // 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", XMAX, YMAX-1, 3);
+      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", XMAX, YMAX-1, 3);
+      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", XMAX, YMAX-1, 2);
+      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", XMAX, YMAX-1, 2);
+      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" , XMAX, YMAX, 4, 3);
+      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", XMAX, YMAX, 4, 3);
+      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" , XMAX, YMAX, 4, 2);
+      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", XMAX, YMAX, 4, 2);
+      alloc_elems<DspinSignals<dspin_rsp_width> >("signal_dspin_false_rsp_out", X_SIZE, Y_SIZE, 4, 2);
 
 
@@ -700,5 +699,5 @@
                    dspin_rsp_width,
                    vci_param_int,
-                   vci_param_ext>*          clusters[XMAX][YMAX];
+                   vci_param_ext>*          clusters[X_SIZE][Y_SIZE];
 
 #if USE_OPENMP
@@ -707,8 +706,8 @@
 #pragma omp for
 #endif
-        for (size_t i = 0; i  < (XMAX * YMAX); i++)
+        for (size_t i = 0; i  < (X_SIZE * Y_SIZE); i++)
         {
-            size_t x = i / YMAX;
-            size_t y = i % YMAX;
+            size_t x = i / Y_SIZE;
+            size_t y = i % Y_SIZE;
 
 #if USE_OPENMP
@@ -768,5 +767,5 @@
                 loader,
                 frozen_cycles,
-                debug_from   ,
+                debug_from,
                 debug_ok and (cluster(x,y) == debug_memc_id),
                 debug_ok and (cluster(x,y) == debug_proc_id) 
@@ -786,6 +785,6 @@
 
    // Clock & RESET
-   for (size_t x = 0; x < (XMAX); x++){
-      for (size_t y = 0; y < YMAX; y++){
+   for (size_t x = 0; x < (X_SIZE); x++){
+      for (size_t y = 0; y < Y_SIZE; y++){
          clusters[x][y]->p_clk                         (signal_clk);
          clusters[x][y]->p_resetn                      (signal_resetn);
@@ -794,7 +793,7 @@
 
    // Inter Clusters horizontal connections
-   if (XMAX > 1){
-      for (size_t x = 0; x < (XMAX-1); x++){
-         for (size_t y = 0; y < YMAX; y++){
+   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]);
@@ -816,7 +815,7 @@
 
    // Inter Clusters vertical connections
-   if (YMAX > 1) {
-      for (size_t y = 0; y < (YMAX-1); y++){
-         for (size_t x = 0; x < XMAX; x++){
+   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]);
@@ -838,5 +837,5 @@
 
    // East & West boundary cluster connections
-   for (size_t y = 0; y < YMAX; y++)
+   for (size_t y = 0; y < Y_SIZE; y++)
    {
       for (size_t k = 0; k < 3; k++)
@@ -844,6 +843,6 @@
          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[XMAX-1][y]->p_cmd_in[EAST][k]   (signal_dspin_false_cmd_in[XMAX-1][y][EAST][k]);
-         clusters[XMAX-1][y]->p_cmd_out[EAST][k]  (signal_dspin_false_cmd_out[XMAX-1][y][EAST][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]);
       }
 
@@ -852,11 +851,11 @@
          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[XMAX-1][y]->p_rsp_in[EAST][k]   (signal_dspin_false_rsp_in[XMAX-1][y][EAST][k]);
-         clusters[XMAX-1][y]->p_rsp_out[EAST][k]  (signal_dspin_false_rsp_out[XMAX-1][y][EAST][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]);
       }
    }
 
    // North & South boundary clusters connections
-   for (size_t x = 0; x < XMAX; x++)
+   for (size_t x = 0; x < X_SIZE; x++)
    {
       for (size_t k = 0; k < 3; k++)
@@ -864,6 +863,6 @@
          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][YMAX-1]->p_cmd_in[NORTH][k]  (signal_dspin_false_cmd_in[x][YMAX-1][NORTH][k]);
-         clusters[x][YMAX-1]->p_cmd_out[NORTH][k] (signal_dspin_false_cmd_out[x][YMAX-1][NORTH][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]);
       }
 
@@ -872,6 +871,6 @@
          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][YMAX-1]->p_rsp_in[NORTH][k]  (signal_dspin_false_rsp_in[x][YMAX-1][NORTH][k]);
-         clusters[x][YMAX-1]->p_rsp_out[NORTH][k] (signal_dspin_false_rsp_out[x][YMAX-1][NORTH][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]);
       }
    }
@@ -888,6 +887,6 @@
 
    // network boundaries signals
-   for (size_t x = 0; x < XMAX ; x++){
-      for (size_t y = 0; y < YMAX ; y++){
+   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++){
@@ -911,143 +910,212 @@
    signal_resetn = true;
 
-   if (gettimeofday(&t1, NULL) != 0) 
-   {
-      perror("gettimeofday");
-      return EXIT_FAILURE;
-   }
-
-   for (uint64_t n = 1; n < ncycles && !stop_called; n++)
-   {
-      // Monitor a specific address for L1 & L2 caches
-      //clusters[0][0]->proc[0]->cache_monitor(0x800002c000ULL);
-      //clusters[1][0]->memc->copies_monitor(0x800002C000ULL);
-
-      if( (n % 5000000) == 0)
+   if (debug_ok) {
+      #if USE_OPENMP
+         assert(false && "OPEN MP should not be used with debug because of its traces");
+      #endif
+
+      if (gettimeofday(&t1, NULL) != 0) {
+         perror("gettimeofday");
+         return EXIT_FAILURE;
+      }
+
+      for (int64_t n = 1; n < ncycles && !stop_called; n++)
       {
-
-         if (gettimeofday(&t2, NULL) != 0) 
-         {
+         // Monitor a specific address for L1 & L2 caches
+         //clusters[0][0]->proc[0]->cache_monitor(0x800002c000ULL);
+         //clusters[1][0]->memc->copies_monitor(0x800002C000ULL);
+
+         if ((n % max_cycles) == 0)
+         {
+
+            if (gettimeofday(&t2, NULL) != 0) 
+            {
+               perror("gettimeofday");
+               return EXIT_FAILURE;
+            }
+
+            ms1 = (uint64_t) t1.tv_sec * 1000ULL + (uint64_t) t1.tv_usec / 1000;
+            ms2 = (uint64_t) t2.tv_sec * 1000ULL + (uint64_t) t2.tv_usec / 1000;
+            std::cerr << "platform clock frequency " << (double) 5000000 / (double) (ms2 - ms1) << "Khz" << std::endl;
+
+            if (gettimeofday(&t1, NULL) != 0) 
+            {
+               perror("gettimeofday");
+               return EXIT_FAILURE;
+            }
+         }
+
+
+         if (n == reset_counters) {
+            for (size_t x = 0; x < (X_SIZE); x++) {
+               for (size_t y = 0; y < Y_SIZE; y++) {
+                  clusters[x][y]->memc->reset_counters();
+               }
+            }
+         }
+
+         if (n == dump_counters) {
+            for (size_t x = 0; x < (X_SIZE); x++) {
+               for (size_t y = 0; y < Y_SIZE; y++) {
+                  clusters[x][y]->memc->print_stats(true, false);
+               }
+            }
+         }
+
+         if (debug_ok and (n > debug_from) and (n % debug_period == 0))
+         {
+            std::cout << "****************** cycle " << std::dec << n ;
+            std::cout << " ************************************************" << std::endl;
+
+            // trace proc[debug_proc_id] 
+            size_t l = debug_proc_id % NB_PROCS_MAX ;
+            size_t y = (debug_proc_id / NB_PROCS_MAX) % Y_SIZE ;
+            size_t x = debug_proc_id / (Y_SIZE * NB_PROCS_MAX) ;
+
+            std::ostringstream proc_signame;
+            proc_signame << "[SIG]PROC_" << x << "_" << y << "_" << l ;
+            std::ostringstream p2m_signame;
+            p2m_signame << "[SIG]PROC_" << x << "_" << y << "_" << l << " P2M" ;
+            std::ostringstream m2p_signame;
+            m2p_signame << "[SIG]PROC_" << x << "_" << y << "_" << l << " M2P" ;
+            std::ostringstream p_cmd_signame;
+            p_cmd_signame << "[SIG]PROC_" << x << "_" << y << "_" << l << " CMD" ;
+            std::ostringstream p_rsp_signame;
+            p_rsp_signame << "[SIG]PROC_" << x << "_" << y << "_" << l << " RSP" ;
+
+            //clusters[x][y]->wi_proc[l]->print_trace();
+            //clusters[x][y]->signal_vci_ini_proc[l].print_trace(proc_signame.str());
+            //clusters[x][y]->signal_dspin_p2m_proc[l].print_trace(p2m_signame.str());
+            //clusters[x][y]->signal_dspin_m2p_proc[l].print_trace(m2p_signame.str());
+            //clusters[x][y]->signal_dspin_cmd_proc_i[l].print_trace(p_cmd_signame.str());
+            //clusters[x][y]->signal_dspin_rsp_proc_i[l].print_trace(p_rsp_signame.str());
+
+            //clusters[x][y]->xbar_rsp_d->print_trace();
+            //clusters[x][y]->xbar_cmd_d->print_trace();
+            //clusters[x][y]->signal_dspin_cmd_l2g_d.print_trace("[SIG]L2G CMD");
+            //clusters[x][y]->signal_dspin_cmd_g2l_d.print_trace("[SIG]G2L CMD");
+            //clusters[x][y]->signal_dspin_rsp_l2g_d.print_trace("[SIG]L2G RSP");
+            //clusters[x][y]->signal_dspin_rsp_g2l_d.print_trace("[SIG]G2L RSP");
+
+            // trace memc[debug_memc_id] 
+            x = debug_memc_id / Y_SIZE;
+            y = debug_memc_id % Y_SIZE;
+
+            std::ostringstream smemc;
+            smemc << "[SIG]MEMC_" << x << "_" << y;
+            std::ostringstream sxram;
+            sxram << "[SIG]XRAM_" << x << "_" << y;
+            std::ostringstream sm2p;
+            sm2p << "[SIG]MEMC_" << x << "_" << y << " M2P" ;
+            std::ostringstream sp2m;
+            sp2m << "[SIG]MEMC_" << x << "_" << y << " P2M" ;
+            std::ostringstream m_cmd_signame;
+            m_cmd_signame << "[SIG]MEMC_" << x << "_" << y <<  " CMD" ;
+            std::ostringstream m_rsp_signame;
+            m_rsp_signame << "[SIG]MEMC_" << x << "_" << y <<  " RSP" ;
+
+            //clusters[x][y]->memc->print_trace();
+            //clusters[x][y]->wt_memc->print_trace();
+            //clusters[x][y]->signal_vci_tgt_memc.print_trace(smemc.str());
+            //clusters[x][y]->signal_vci_xram.print_trace(sxram.str());
+            //clusters[x][y]->signal_dspin_p2m_memc.print_trace(sp2m.str());
+            //clusters[x][y]->signal_dspin_m2p_memc.print_trace(sm2p.str());
+            //clusters[x][y]->signal_dspin_cmd_memc_t.print_trace(m_cmd_signame.str());
+            //clusters[x][y]->signal_dspin_rsp_memc_t.print_trace(m_rsp_signame.str());
+
+            // trace replicated peripherals
+            //clusters[1][1]->mdma->print_trace();
+            //clusters[1][1]->signal_vci_tgt_mdma.print_trace("[SIG]MDMA_TGT_1_1");
+            //clusters[1][1]->signal_vci_ini_mdma.print_trace("[SIG]MDMA_INI_1_1");
+
+
+            // trace external peripherals
+            //size_t io_x   = cluster_io_id / Y_SIZE;
+            //size_t io_y   = cluster_io_id % Y_SIZE;
+
+            //clusters[io_x][io_y]->brom->print_trace();
+            //clusters[io_x][io_y]->wt_brom->print_trace();
+            //clusters[io_x][io_y]->signal_vci_tgt_brom.print_trace("[SIG]BROM");
+            //clusters[io_x][io_y]->signal_dspin_cmd_brom_t.print_trace("[SIG]BROM CMD");
+            //clusters[io_x][io_y]->signal_dspin_rsp_brom_t.print_trace("[SIG]BROM RSP");
+
+            //clusters[io_x][io_y]->bdev->print_trace();
+            //clusters[io_x][io_y]->signal_vci_tgt_bdev.print_trace("[SIG]BDEV_TGT");
+            //clusters[io_x][io_y]->signal_vci_ini_bdev.print_trace("[SIG]BDEV_INI");
+         }
+
+         sc_start(sc_core::sc_time(1, SC_NS));
+      }
+   }
+   else {
+      int64_t n = 0;
+      while (!stop_called) {
+         if (gettimeofday(&t1, NULL) != 0) {
             perror("gettimeofday");
             return EXIT_FAILURE;
          }
-
+         int64_t nb_cycles = max_cycles;
+         if (do_reset_counters) {
+            nb_cycles = min(nb_cycles, reset_counters - n);
+         }
+         if (do_dump_counters) {
+            nb_cycles = min(nb_cycles, dump_counters - n);
+         }
+
+         sc_start(sc_core::sc_time(nb_cycles, SC_NS));
+         n += nb_cycles;
+
+         if (do_reset_counters && n == reset_counters) {
+            // Reseting counters
+            for (size_t x = 0; x < (X_SIZE); x++) {
+               for (size_t y = 0; y < Y_SIZE; y++) {
+                  clusters[x][y]->memc->reset_counters();
+               }
+            }
+            do_reset_counters = false;
+         }
+
+         if (do_dump_counters && n == dump_counters) {
+            // Dumping counters
+            for (size_t x = 0; x < (X_SIZE); x++) {
+               for (size_t y = 0; y < Y_SIZE; y++) {
+                  clusters[x][y]->memc->print_stats(true, false);
+               }
+            }
+            do_dump_counters = false;
+         }
+
+
+         if (gettimeofday(&t2, NULL) != 0) {
+            perror("gettimeofday");
+            return EXIT_FAILURE;
+         }
          ms1 = (uint64_t) t1.tv_sec * 1000ULL + (uint64_t) t1.tv_usec / 1000;
          ms2 = (uint64_t) t2.tv_sec * 1000ULL + (uint64_t) t2.tv_usec / 1000;
-         std::cerr << "platform clock frequency " << (double) 5000000 / (double) (ms2 - ms1) << "Khz" << std::endl;
-
-         if (gettimeofday(&t1, NULL) != 0) 
-         {
-            perror("gettimeofday");
-            return EXIT_FAILURE;
-         }
-      }
-
-      if (debug_ok and (n > debug_from) and (n % debug_period == 0))
-      {
-         std::cout << "****************** cycle " << std::dec << n ;
-         std::cout << " ************************************************" << std::endl;
-
-        // trace proc[debug_proc_id] 
-        size_t l = debug_proc_id % NB_PROCS_MAX ;
-        size_t y = (debug_proc_id /                   NB_PROCS_MAX)  % YMAX ;
-        size_t x = (debug_proc_id / ((1 << y_width) * NB_PROCS_MAX)) % XMAX ;
-
-        std::ostringstream proc_signame;
-        proc_signame << "[SIG]PROC_" << x << "_" << y << "_" << l ;
-        std::ostringstream p2m_signame;
-        p2m_signame << "[SIG]PROC_" << x << "_" << y << "_" << l << " P2M" ;
-        std::ostringstream m2p_signame;
-        m2p_signame << "[SIG]PROC_" << x << "_" << y << "_" << l << " M2P" ;
-        std::ostringstream p_cmd_signame;
-        p_cmd_signame << "[SIG]PROC_" << x << "_" << y << "_" << l << " CMD" ;
-        std::ostringstream p_rsp_signame;
-        p_rsp_signame << "[SIG]PROC_" << x << "_" << y << "_" << l << " RSP" ;
-
-        clusters[x][y]->proc[l]->print_trace();
-        clusters[x][y]->wi_proc[l]->print_trace();
-        clusters[x][y]->signal_vci_ini_proc[l].print_trace(proc_signame.str());
-        clusters[x][y]->signal_dspin_p2m_proc[l].print_trace(p2m_signame.str());
-        clusters[x][y]->signal_dspin_m2p_proc[l].print_trace(m2p_signame.str());
-        clusters[x][y]->signal_dspin_cmd_proc_i[l].print_trace(p_cmd_signame.str());
-        clusters[x][y]->signal_dspin_rsp_proc_i[l].print_trace(p_rsp_signame.str());
-
-        clusters[x][y]->xbar_rsp_d->print_trace();
-        clusters[x][y]->xbar_cmd_d->print_trace();
-        clusters[x][y]->signal_dspin_cmd_l2g_d.print_trace("[SIG]L2G CMD");
-        clusters[x][y]->signal_dspin_cmd_g2l_d.print_trace("[SIG]G2L CMD");
-        clusters[x][y]->signal_dspin_rsp_l2g_d.print_trace("[SIG]L2G RSP");
-        clusters[x][y]->signal_dspin_rsp_g2l_d.print_trace("[SIG]G2L RSP");
-
-        // trace memc[debug_memc_id] 
-        x = debug_memc_id / YMAX;
-        y = debug_memc_id % YMAX;
-
-        std::ostringstream smemc;
-        smemc << "[SIG]MEMC_" << x << "_" << y;
-        std::ostringstream sxram;
-        sxram << "[SIG]XRAM_" << x << "_" << y;
-        std::ostringstream sm2p;
-        sm2p << "[SIG]MEMC_" << x << "_" << y << " M2P" ;
-        std::ostringstream sp2m;
-        sp2m << "[SIG]MEMC_" << x << "_" << y << " P2M" ;
-        std::ostringstream m_cmd_signame;
-        m_cmd_signame << "[SIG]MEMC_" << x << "_" << y <<  " CMD" ;
-        std::ostringstream m_rsp_signame;
-        m_rsp_signame << "[SIG]MEMC_" << x << "_" << y <<  " RSP" ;
-
-        clusters[x][y]->memc->print_trace();
-        clusters[x][y]->wt_memc->print_trace();
-        clusters[x][y]->signal_vci_tgt_memc.print_trace(smemc.str());
-        clusters[x][y]->signal_vci_xram.print_trace(sxram.str());
-        clusters[x][y]->signal_dspin_p2m_memc.print_trace(sp2m.str());
-        clusters[x][y]->signal_dspin_m2p_memc.print_trace(sm2p.str());
-        clusters[x][y]->signal_dspin_cmd_memc_t.print_trace(m_cmd_signame.str());
-        clusters[x][y]->signal_dspin_rsp_memc_t.print_trace(m_rsp_signame.str());
-        
-        // trace replicated peripherals
-//        clusters[1][1]->mdma->print_trace();
-//        clusters[1][1]->signal_vci_tgt_mdma.print_trace("[SIG]MDMA_TGT_1_1");
-//        clusters[1][1]->signal_vci_ini_mdma.print_trace("[SIG]MDMA_INI_1_1");
-        
-
-        // trace external peripherals
-        size_t io_x   = cluster_io_id >> y_width;
-        size_t io_y   = cluster_io_id  & ((1 << x_width) - 1);
-
-        clusters[io_x][io_y]->brom->print_trace();
-        clusters[io_x][io_y]->wt_brom->print_trace();
-        clusters[io_x][io_y]->signal_vci_tgt_brom.print_trace("[SIG]BROM");
-        clusters[io_x][io_y]->signal_dspin_cmd_brom_t.print_trace("[SIG]BROM CMD");
-        clusters[io_x][io_y]->signal_dspin_rsp_brom_t.print_trace("[SIG]BROM RSP");
-
-//        clusters[io_x][io_y]->bdev->print_trace();
-//        clusters[io_x][io_y]->signal_vci_tgt_bdev.print_trace("[SIG]BDEV_TGT");
-//        clusters[io_x][io_y]->signal_vci_ini_bdev.print_trace("[SIG]BDEV_INI");
-      }
-
-      sc_start(sc_core::sc_time(1, SC_NS));
+         std::cerr << "cycle " << n << " platform clock frequency " << (double) nb_cycles / (double) (ms2 - ms1) << "Khz" << std::endl;
+      }
    }
 
    
    // Free memory
-   for (size_t i = 0; i  < (XMAX * YMAX); i++)
+   for (size_t i = 0; i  < (X_SIZE * Y_SIZE); i++)
    {
-      size_t x = i / YMAX;
-      size_t y = i % YMAX;
+      size_t x = i / Y_SIZE;
+      size_t y = i % Y_SIZE;
       delete clusters[x][y];
    }
 
-   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cmd_inc, XMAX - 1, YMAX, 3);
-   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_h_cmd_dec, XMAX - 1, YMAX, 3);
-   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_rsp_inc, XMAX - 1, YMAX, 2);
-   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_h_rsp_dec, XMAX - 1, YMAX, 2);
-   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cmd_inc, XMAX, YMAX - 1, 3);
-   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_v_cmd_dec, XMAX, YMAX - 1, 3);
-   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_rsp_inc, XMAX, YMAX - 1, 2);
-   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_v_rsp_dec, XMAX, YMAX - 1, 2);
-   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_false_cmd_in, XMAX, YMAX, 4, 3);
-   dealloc_elems<DspinSignals<dspin_cmd_width> >(signal_dspin_false_cmd_out, XMAX, YMAX, 4, 3);
-   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_false_rsp_in, XMAX, YMAX, 4, 2);
-   dealloc_elems<DspinSignals<dspin_rsp_width> >(signal_dspin_false_rsp_out, XMAX, YMAX, 4, 2);
+   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);
 
    return EXIT_SUCCESS;
