Index: /trunk/platforms/tsar_generic_iob/Makefile
===================================================================
--- /trunk/platforms/tsar_generic_iob/Makefile	(revision 606)
+++ /trunk/platforms/tsar_generic_iob/Makefile	(revision 607)
@@ -4,3 +4,4 @@
 clean:
 	soclib-cc -x -p top.desc -I.
-	rm -rf *.o *.x tty*
+	rm -rf *.o *.x tty* term*
+
Index: /trunk/platforms/tsar_generic_iob/top.cpp
===================================================================
--- /trunk/platforms/tsar_generic_iob/top.cpp	(revision 606)
+++ /trunk/platforms/tsar_generic_iob/top.cpp	(revision 607)
@@ -18,5 +18,8 @@
 // The internal physical address space is 40 bits.
 //
-// It contains a 2D mesh of XMAX*YMAX clusters, and 3 networks:
+// It contains a 2D mesh of XMAX*YMAX clusters, and the cluster index
+// is encoded on 8 bits (X_WIDTH = 4 / Y_WIDTH = 4) whatever the mesh size.
+//
+// It contains 3 networks:
 //
 // 1) the INT network supports Read/Write transactions
@@ -182,6 +185,6 @@
 //////////////////////i/////////////////////////////////////
 
-#define XMAX                  CLUSTER_X
-#define YMAX                  CLUSTER_Y
+#define XMAX                  X_SIZE
+#define YMAX                  Y_SIZE
 
 #define XRAM_LATENCY          0
@@ -200,5 +203,5 @@
 
 #define BDEV_SECTOR_SIZE      512
-#define BDEV_IMAGE_NAME       "giet_vm/display/images.raw"
+#define BDEV_IMAGE_NAME       "../../../giet_vm/hdd/virt_hdd.dmg"
 
 #define NIC_RX_NAME           "giet_vm/nic/rx_packets.txt"
@@ -211,5 +214,5 @@
 #define WEST                  3
 
-#define cluster(x,y)   ((y) + YMAX*(x))
+#define cluster(x,y)   ((y) + (x<<4))
 
 ////////////////////////////////////////////////////////////
@@ -217,5 +220,5 @@
 //////////////////////i/////////////////////////////////////
 
-#define BOOT_SOFT_NAME        "giet_vm/soft.elf"
+#define BOOT_SOFT_NAME        "../../softs/tsar_boot/preloader.elf"
 
 ////////////////////////////////////////////////////////////
@@ -363,5 +366,10 @@
    size_t   cluster_iob1     = cluster(XMAX-1,YMAX-1);     // cluster containing IOB1
    size_t   block_size       = BDEV_SECTOR_SIZE;           // disk block size
-
+   size_t   x_width          = 4;                          // at most 256 clusters
+   size_t   y_width          = 4;                          // at most 256 clusters
+
+   assert( (X_WIDTH == 4) and (Y_WIDTH == 4) and
+   "ERROR: we must have X_WIDTH == Y_WIDTH == 4");
+ 
    ////////////// command line arguments //////////////////////
    if (argc > 1)
@@ -389,6 +397,11 @@
          {
             debug_memc_id = atoi(argv[n+1]);
-            assert( (debug_memc_id < (XMAX*YMAX) ) && 
-                   "debug_memc_id larger than XMAX * YMAX" );
+            size_t x = debug_memc_id >> 4;
+            size_t y = debug_memc_id & 0xF;
+            if( (x>=XMAX) || (y>=YMAX) )
+            {
+                std::cout << "PROCID parameter does'nt fit XMAX/YMAX" << std::endl;
+                exit(0);
+            }
          }
          else if ((strcmp(argv[n],"-IOB") == 0) && (n+1<argc) )
@@ -398,7 +411,13 @@
          else if ((strcmp(argv[n],"-PROCID") == 0) && (n+1<argc) )
          {
-            debug_proc_id = atoi(argv[n+1]);
-            assert( (debug_proc_id < (XMAX * YMAX * NB_PROCS_MAX) ) && 
-                   "debug_proc_id larger than XMAX * YMAX * NB_PROCS" );
+            debug_proc_id     = atoi(argv[n+1]);
+            size_t cluster_xy = debug_proc_id / NB_PROCS_MAX ;
+            size_t x          = cluster_xy >> 4;
+            size_t y          = cluster_xy & 0xF;
+            if( (x>=XMAX) || (y>=YMAX) )
+            {
+                std::cout << "PROCID parameter does'nt fit XMAX/YMAX" << std::endl;
+                exit(0);
+            }
          }
          else if ((strcmp(argv[n], "-THREADS") == 0) && ((n+1) < argc))
@@ -436,17 +455,15 @@
 
    // 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( ( (NB_PROCS_MAX == 1) or (NB_PROCS_MAX == 2) or (NB_PROCS_MAX == 4) ) and
-           "The NB_PROCS_MAX parameter must be 1, 2, 4" );
-
-   assert( (NB_DMA_CHANNELS == 4) and
-           "The NB_DMA_CHANNELS parameter must be 4" );
+   assert( (XMAX <= 16) and
+           "The XMAX parameter cannot be larger than 16" );
+
+   assert( (YMAX <= 16) and
+           "The YMAX parameter cannot be larger than 16" );
+
+   assert( (NB_PROCS_MAX <= 8) and
+           "The NB_PROCS_MAX parameter cannot be larger than 8" );
+
+   assert( (NB_DMA_CHANNELS <= 4) and
+           "The NB_DMA_CHANNELS parameter cannot be larger than 4" );
 
    assert( (NB_TTY_CHANNELS < 16) and
@@ -498,20 +515,4 @@
                                    vci_trdid_width,
                                    vci_wrplen_width> vci_param_ext;
-
-   // Define parameters depending on mesh size
-   size_t   x_width;
-   size_t   y_width;
-
-   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;
-   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;
-   else                y_width = 4;
 
    /////////////////////////////////////////////////////////////////////
@@ -1394,7 +1395,12 @@
     for (size_t n = 1; n < ncycles; n++)
     {
-        // Monitor a specific address for L1 and/or L2 caches
+        // Monitor a specific address for one L1 cache
         // clusters[1][1]->proc[0]->cache_monitor(0x50090ULL);
-        // clusters[0][0]->memc->cache_monitor(   0x50090ULL);
+
+        // Monitor a specific address for one L2 cache
+        // clusters[0][0]->memc->cache_monitor( 0x170000ULL);
+
+        // Monitor a specific address for one XRAM
+        // if (n == 3000000) clusters[0][0]->xram->start_monitor( 0x170000ULL , 64);
 
         if (debug_ok and (n > debug_from) and (n % debug_period == 0))
@@ -1403,13 +1409,11 @@
             std::cout << " ************************************************" << std::endl;
 
-         
-            // trace proc[debug_proc_id] ... or several procs
-//          for( debug_proc_id = 0 ; debug_proc_id < 2 ; debug_proc_id++ )
-
-            if ( debug_proc_id < XMAX*YMAX*NB_PROCS_MAX )
+            // trace proc[debug_proc_id] 
+            if ( debug_proc_id != 0xFFFFFFFF )
             {
-                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 / (YMAX * NB_PROCS_MAX) ;
+                size_t l          = debug_proc_id % NB_PROCS_MAX ;
+                size_t cluster_xy = debug_proc_id / NB_PROCS_MAX ;
+                size_t x          = cluster_xy >> 4;
+                size_t y          = cluster_xy & 0xF;
 
                 clusters[x][y]->proc[l]->print_trace(1);
@@ -1425,51 +1429,35 @@
                 clusters[x][y]->signal_int_vci_tgt_xicu.print_trace(xicu_signame.str());
 
-                if( clusters[x][y]->signal_proc_it[0].read() ) 
+                if( clusters[x][y]->signal_proc_it[l].read() ) 
                     std::cout << "### IRQ_PROC_" << std::dec
-                              << x << "_" << y << " ACTIVE" << std::endl;
-                
-//              std::ostringstream p2m_signame;
-//              p2m_signame << "[SIG]PROC_" << x << "_" << y << "_" << l << " P2M" ;
-//              clusters[x][y]->signal_int_dspin_p2m_proc[l].print_trace(p2m_signame.str());
-
-//              std::ostringstream m2p_signame;
-//              m2p_signame << "[SIG]PROC_" << x << "_" << y << "_" << l << " M2P" ;
-//              clusters[x][y]->signal_int_dspin_m2p_proc[l].print_trace(m2p_signame.str());
-
-//              std::ostringstream p_cmd_signame;
-//              p_cmd_signame << "[SIG]PROC_" << x << "_" << y << "_" << l << " CMD" ;
-//              clusters[x][y]->signal_int_dspin_cmd_proc_i[l].print_trace(p_cmd_signame.str());
-
-//              std::ostringstream p_rsp_signame;
-//              p_rsp_signame << "[SIG]PROC_" << x << "_" << y << "_" << l << " RSP" ;
-//              clusters[x][y]->signal_int_dspin_rsp_proc_i[l].print_trace(p_rsp_signame.str());
-
+                              << x << "_" << y << "_" << l << " ACTIVE" << std::endl;
             }   
 
-            // trace INT_CMD_D xbar and router in 1_0
-//          clusters[1][0]->int_xbar_cmd_d->print_trace();
-//          clusters[1][0]->int_xbar_rsp_d->print_trace();
-
-//          clusters[1][0]->signal_int_dspin_cmd_l2g_d.print_trace("[SIG] INT_CMD_L2G_D_1_0");
-//          clusters[1][0]->signal_int_dspin_rsp_g2l_d.print_trace("[SIG] INT_RSP_G2L_D_1_0");
-
-//          clusters[1][0]->int_router_cmd->print_trace(0);
-//          clusters[1][0]->int_router_rsp->print_trace(0);
-
-            // trace INT_CMD_D xbar and router in 0_0
+            // trace INT network
 //          clusters[0][0]->int_xbar_cmd_d->print_trace();
 //          clusters[0][0]->int_xbar_rsp_d->print_trace();
 
-//          clusters[0][0]->signal_int_dspin_cmd_g2l_d.print_trace("[SIG] INT_CMD_G2L_D_0_0");
-//          clusters[0][0]->signal_int_dspin_rsp_l2g_d.print_trace("[SIG] INT_RSP_L2G_D_0_0");
-         
+//          clusters[0][0]->signal_int_dspin_cmd_l2g_d.print_trace("[SIG] INT_CMD_L2G_D_0_0");
+//          clusters[0][0]->signal_int_dspin_rsp_g2l_d.print_trace("[SIG] INT_RSP_G2L_D_0_0");
+
 //          clusters[0][0]->int_router_cmd->print_trace(0);
 //          clusters[0][0]->int_router_rsp->print_trace(0);
 
-            // trace memc[debug_memc_id] and xram[debug_memc_id]
-            if ( debug_memc_id < XMAX*YMAX )
+            // trace INT_CMD_D xbar and router in cluster 0_1
+//          clusters[0][1]->int_router_cmd->print_trace(0);
+//          clusters[0][1]->int_router_rsp->print_trace(0);
+ 
+//          clusters[0][1]->signal_int_dspin_cmd_g2l_d.print_trace("[SIG] INT_CMD_G2L_D_0_0");
+//          clusters[0][1]->signal_int_dspin_rsp_l2g_d.print_trace("[SIG] INT_RSP_L2G_D_0_0");
+         
+//          clusters[0][1]->int_xbar_cmd_d->print_trace();
+//          clusters[0][1]->int_xbar_rsp_d->print_trace();
+
+            // trace memc[debug_memc_id] 
+            if ( debug_memc_id != 0xFFFFFFFF )
             {
-                size_t x = debug_memc_id / YMAX;
-                size_t y = debug_memc_id % YMAX;
+                size_t x = debug_memc_id >> 4;
+                size_t y = debug_memc_id & 0xF;
+            
                 clusters[x][y]->memc->print_trace(0);
                 std::ostringstream smemc_tgt;
@@ -1508,17 +1496,17 @@
 //              signal_dspin_rsp_iob0_loopback.print_trace("[SIG]IOB0_RSP_LOOPBACK"); 
 
-//              cdma->print_trace();
-//              signal_vci_tgt_cdma.print_trace("[SIG]IOX_CDMA_TGT");
-//              signal_vci_ini_cdma.print_trace("[SIG]IOX_CDMA_INI");
-
-                brom->print_trace();
-                signal_vci_tgt_brom.print_trace("[SIG]IOX_BROM_TGT");
+                cdma->print_trace();
+                signal_vci_tgt_cdma.print_trace("[SIG]IOX_CDMA_TGT");
+                signal_vci_ini_cdma.print_trace("[SIG]IOX_CDMA_INI");
+
+//              brom->print_trace();
+//              signal_vci_tgt_brom.print_trace("[SIG]IOX_BROM_TGT");
 
 //              mtty->print_trace();
 //              signal_vci_tgt_mtty.print_trace("[SIG]IOX_MTTY_TGT");
 
-                bdev->print_trace();
-                signal_vci_tgt_bdev.print_trace("[SIG]IOX_BDEV_TGT");
-                signal_vci_ini_bdev.print_trace("[SIG]IOX_BDEV_INI");
+//              bdev->print_trace();
+//              signal_vci_tgt_bdev.print_trace("[SIG]IOX_BDEV_TGT");
+//              signal_vci_ini_bdev.print_trace("[SIG]IOX_BDEV_INI");
 
 //              fbuf->print_trace();
Index: /trunk/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/include/tsar_iob_cluster.h
===================================================================
--- /trunk/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/include/tsar_iob_cluster.h	(revision 606)
+++ /trunk/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/include/tsar_iob_cluster.h	(revision 607)
@@ -78,4 +78,5 @@
 	sc_signal<bool> 		              signal_proc_it[8];
 	sc_signal<bool> 		              signal_irq_mdma[8];
+	sc_signal<bool> 		              signal_irq_memc;
 	
 	// INT network DSPIN signals between DSPIN routers and DSPIN local_crossbars
Index: /trunk/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/src/tsar_iob_cluster.cpp
===================================================================
--- /trunk/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/src/tsar_iob_cluster.cpp	(revision 606)
+++ /trunk/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/src/tsar_iob_cluster.cpp	(revision 607)
@@ -84,8 +84,8 @@
     assert( (x_id < xmax) and (y_id < ymax) and "Illegal cluster coordinates");
 
-    size_t cluster_id = x_id * ymax + y_id;
-
-    size_t cluster_iob0 = 0;                 // South-West cluster
-    size_t cluster_iob1 = xmax*ymax-1;       // North-East cluster
+    size_t cluster_id = (x_id<<4) + y_id;
+
+    size_t cluster_iob0 = 0;                            // South-West cluster
+    size_t cluster_iob1 = ((xmax-1)<<4) + ymax-1;       // North-East cluster
 
     // Vectors of DSPIN ports for inter-cluster communications
@@ -621,4 +621,5 @@
     memc->p_dspin_m2p                            (signal_int_dspin_m2p_memc);
     memc->p_dspin_clack                          (signal_int_dspin_clack_memc);
+    memc->p_irq                                  (signal_irq_memc);
 
     // wrapper to INT network
