Index: trunk/modules/vci_cc_vcache_wrapper_v4/caba/source/include/vci_cc_vcache_wrapper_v4.h
===================================================================
--- trunk/modules/vci_cc_vcache_wrapper_v4/caba/source/include/vci_cc_vcache_wrapper_v4.h	(revision 246)
+++ trunk/modules/vci_cc_vcache_wrapper_v4/caba/source/include/vci_cc_vcache_wrapper_v4.h	(revision 247)
@@ -254,4 +254,9 @@
     const size_t  						m_dcache_words;
 
+    const size_t                        m_x_width;
+    const size_t                        m_y_width;
+
+    const size_t                        m_memory_cache_local_id;
+
     const size_t                        m_proc_id;
 
@@ -625,4 +630,7 @@
         size_t   wbuf_nlines, 
         size_t   wbuf_nwords, 
+        size_t   x_width,
+        size_t   y_width,
+        uint32_t memory_cache_local_id,
         uint32_t max_frozen_cycles,
         uint32_t debug_start_cycle,
Index: trunk/modules/vci_cc_vcache_wrapper_v4/caba/source/src/vci_cc_vcache_wrapper_v4.cpp
===================================================================
--- trunk/modules/vci_cc_vcache_wrapper_v4/caba/source/src/vci_cc_vcache_wrapper_v4.cpp	(revision 246)
+++ trunk/modules/vci_cc_vcache_wrapper_v4/caba/source/src/vci_cc_vcache_wrapper_v4.cpp	(revision 247)
@@ -166,6 +166,9 @@
     size_t 				wbuf_nlines, 
     size_t 				wbuf_nwords, 
-    uint32_t				max_frozen_cycles,
-    uint32_t				debug_start_cycle,
+    size_t				x_width,
+    size_t				y_width,
+    uint32_t			memory_cache_local_id,
+    uint32_t			max_frozen_cycles,
+    uint32_t			debug_start_cycle,
     bool				debug_ok)
     : soclib::caba::BaseModule(name),
@@ -197,4 +200,9 @@
       m_dcache_yzmask((~0)<<(uint32_log2(dcache_words) + 2)),
       m_dcache_words(dcache_words),
+
+      m_x_width(x_width),
+      m_y_width(y_width),
+
+      m_memory_cache_local_id(memory_cache_local_id),      
 
       m_proc_id(proc_id),
@@ -4812,18 +4820,34 @@
     // it depends on the CLEANUP FSM state
 
+    paddr_t  cleanup_nline;
     paddr_t  address;
 
     if ( r_cleanup_fsm.read() == CLEANUP_DATA_GO )
-        address = r_dcache_cleanup_line.read()*m_dcache_words*4;
+    {
+        cleanup_nline = r_dcache_cleanup_line.read();
+        address       = (m_x_width + m_y_width) ? (cleanup_nline * m_dcache_words * 4    ) >>
+                                                  (vci_param::N  - m_x_width - m_y_width ) : 0;
+    }
     else if ( r_cleanup_fsm.read() == CLEANUP_INS_GO )
-        address = r_icache_cleanup_line.read()*m_icache_words*4;
+    {
+        cleanup_nline = r_icache_cleanup_line.read();
+        address       = (m_x_width + m_y_width) ? (cleanup_nline * m_icache_words * 4    ) >>
+                                                  (vci_param::N  - m_x_width - m_y_width ) : 0;
+    }
     else
-        address = 0;
+    {
+        cleanup_nline = 0;
+        address       = 0;
+    }
+
+    address           <<= vci_param::S - m_x_width - m_y_width;
+    address            |= m_memory_cache_local_id;
+    address           <<= vci_param::N - vci_param::S;
 
     p_vci_ini_c.cmdval  = ((r_cleanup_fsm.read() == CLEANUP_DATA_GO) or
                            (r_cleanup_fsm.read() == CLEANUP_INS_GO) );
     p_vci_ini_c.address = address;
-    p_vci_ini_c.wdata   = 0;
-    p_vci_ini_c.be      = 0xF;
+    p_vci_ini_c.wdata   = (uint32_t) cleanup_nline;
+    p_vci_ini_c.be      = (cleanup_nline >> 32) & 0x3;
     p_vci_ini_c.plen    = 4;
     p_vci_ini_c.cmd     = vci_param::CMD_WRITE;
Index: trunk/modules/vci_mem_cache_v4/caba/source/src/vci_mem_cache_v4.cpp
===================================================================
--- trunk/modules/vci_mem_cache_v4/caba/source/src/vci_mem_cache_v4.cpp	(revision 246)
+++ trunk/modules/vci_mem_cache_v4/caba/source/src/vci_mem_cache_v4.cpp	(revision 247)
@@ -273,5 +273,4 @@
     m_seglist(mtp.getSegmentList(vci_tgt_index)),
     m_cseglist(mtc.getSegmentList(vci_tgt_index_cleanup)),
-    m_coherence_table( mtc.getCoherenceTable<vci_addr_t>() ),
     m_transaction_tab_lines(transaction_tab_lines),
     m_transaction_tab( transaction_tab_lines, nwords ),
@@ -354,6 +353,6 @@
     r_alloc_dir_fsm("r_alloc_dir_fsm"),
     r_alloc_trt_fsm("r_alloc_trt_fsm"),
-    r_alloc_upt_fsm("r_alloc_upt_fsm")
-
+    r_alloc_upt_fsm("r_alloc_upt_fsm"),
+    r_alloc_heap_fsm("r_alloc_heap_fsm")
     {
       assert(IS_POW_OF_2(nsets));
@@ -552,5 +551,4 @@
     }
     delete [] m_cache_data;
-    delete [] m_coherence_table;
 
     delete [] r_ixr_rsp_to_xram_rsp_rok;
@@ -587,4 +585,5 @@
       r_cleanup_fsm 	= CLEANUP_IDLE;
       r_alloc_dir_fsm   = ALLOC_DIR_READ;
+      r_alloc_heap_fsm  = ALLOC_HEAP_READ;
       r_alloc_trt_fsm   = ALLOC_TRT_READ;
       r_alloc_upt_fsm   = ALLOC_UPT_WRITE;
@@ -3298,5 +3297,6 @@
                      ((p_vci_tgt_cleanup.address.read() & 0x3) == 0) && reached) 
                 {
-                    addr_t line = (addr_t)(m_nline[(vci_addr_t)(p_vci_tgt_cleanup.address.read())]);
+                    addr_t line =(((addr_t) p_vci_tgt_cleanup.be.read() << (vci_param::B*8))) |
+                                 (((addr_t) p_vci_tgt_cleanup.wdata.read()));
 
                     r_cleanup_nline = line;
@@ -5253,5 +5253,4 @@
     switch ( r_alloc_dir_fsm.read() ) 
     {
-
       ////////////////////
       case ALLOC_DIR_READ:
@@ -5881,4 +5880,5 @@
     p_vci_ini.cfixed  = false;
 
+    vci_addr_t vci_ini_address = 0;
     switch ( r_init_cmd_fsm.read() ) {
 
@@ -5897,10 +5897,13 @@
       case INIT_CMD_INVAL_NLINE:
       {
+        vci_ini_address = (vci_addr_t)
+            m_xram_rsp_to_init_cmd_srcid_fifo.read() << (vci_param::N - vci_param::S);
+
         p_vci_ini.cmdval  = m_xram_rsp_to_init_cmd_inst_fifo.rok();
         if(m_xram_rsp_to_init_cmd_inst_fifo.rok()){
           if(m_xram_rsp_to_init_cmd_inst_fifo.read()) {
-            p_vci_ini.address = (addr_t)(m_coherence_table[m_xram_rsp_to_init_cmd_srcid_fifo.read()]+4);
+              p_vci_ini.address = (addr_t) (vci_ini_address+4);
           } else {
-            p_vci_ini.address = (addr_t)(m_coherence_table[m_xram_rsp_to_init_cmd_srcid_fifo.read()]);
+              p_vci_ini.address = (addr_t) (vci_ini_address);
           }
         } else p_vci_ini.address = 0; // prevent segmentation faults by reading an empty fifo
@@ -5935,10 +5938,13 @@
         break;
       case INIT_CMD_UPDT_NLINE:
+        vci_ini_address = (vci_addr_t)
+            m_write_to_init_cmd_srcid_fifo.read() << (vci_param::N - vci_param::S);
+
         p_vci_ini.cmdval  = m_write_to_init_cmd_inst_fifo.rok();
         if(m_write_to_init_cmd_inst_fifo.rok()){
           if(m_write_to_init_cmd_inst_fifo.read()) {
-            p_vci_ini.address = (addr_t)(m_coherence_table[m_write_to_init_cmd_srcid_fifo.read()] + 12);
+            p_vci_ini.address = (addr_t)(vci_ini_address + 12);
           } else {
-            p_vci_ini.address = (addr_t)(m_coherence_table[m_write_to_init_cmd_srcid_fifo.read()] + 8);
+            p_vci_ini.address = (addr_t)(vci_ini_address + 8);
           }
         } else {
@@ -5953,9 +5959,12 @@
         break;
       case INIT_CMD_UPDT_INDEX:
+        vci_ini_address = (vci_addr_t)
+            m_write_to_init_cmd_srcid_fifo.read() << (vci_param::N - vci_param::S);
+
         p_vci_ini.cmdval  = true;
         if(m_write_to_init_cmd_inst_fifo.read()) {
-          p_vci_ini.address = (addr_t)(m_coherence_table[m_write_to_init_cmd_srcid_fifo.read()] + 12);
+          p_vci_ini.address = (addr_t)(vci_ini_address + 12);
         } else {
-          p_vci_ini.address = (addr_t)(m_coherence_table[m_write_to_init_cmd_srcid_fifo.read()] + 8);
+          p_vci_ini.address = (addr_t)(vci_ini_address + 8);
         }
         p_vci_ini.wdata   = r_write_to_init_cmd_index.read();
@@ -5967,9 +5976,12 @@
         break;
       case INIT_CMD_UPDT_DATA:
+        vci_ini_address = (vci_addr_t)
+            m_write_to_init_cmd_srcid_fifo.read() << (vci_param::N - vci_param::S);
+
         p_vci_ini.cmdval  = true;
         if(m_write_to_init_cmd_inst_fifo.read()) {
-          p_vci_ini.address = (addr_t)(m_coherence_table[m_write_to_init_cmd_srcid_fifo.read()] + 12);
+          p_vci_ini.address = (addr_t)(vci_ini_address + 12);
         } else {
-          p_vci_ini.address = (addr_t)(m_coherence_table[m_write_to_init_cmd_srcid_fifo.read()] + 8);
+          p_vci_ini.address = (addr_t)(vci_ini_address + 8);
         }
         p_vci_ini.wdata   = r_write_to_init_cmd_data[r_init_cmd_cpt.read() +
@@ -5994,10 +6006,13 @@
         break;
       case INIT_CMD_SC_UPDT_NLINE:
+        vci_ini_address = (vci_addr_t)
+            m_sc_to_init_cmd_srcid_fifo.read() << (vci_param::N - vci_param::S);
+
         p_vci_ini.cmdval  = m_sc_to_init_cmd_inst_fifo.rok();
         if(m_sc_to_init_cmd_inst_fifo.rok()){
           if( m_sc_to_init_cmd_inst_fifo.read() ) {
-            p_vci_ini.address = (addr_t)(m_coherence_table[m_sc_to_init_cmd_srcid_fifo.read()] + 12);
+            p_vci_ini.address = (addr_t)(vci_ini_address + 12);
           } else {
-            p_vci_ini.address = (addr_t)(m_coherence_table[m_sc_to_init_cmd_srcid_fifo.read()] + 8);
+            p_vci_ini.address = (addr_t)(vci_ini_address + 8);
           }
         } else {
@@ -6016,9 +6031,12 @@
         break;
       case INIT_CMD_SC_UPDT_INDEX:
+        vci_ini_address = (vci_addr_t)
+            m_sc_to_init_cmd_srcid_fifo.read() << (vci_param::N - vci_param::S);
+
         p_vci_ini.cmdval  = true;
         if( m_sc_to_init_cmd_inst_fifo.read() ) {
-          p_vci_ini.address = (addr_t)(m_coherence_table[m_sc_to_init_cmd_srcid_fifo.read()] + 12);
+          p_vci_ini.address = (addr_t)(vci_ini_address + 12);
         } else {
-          p_vci_ini.address = (addr_t)(m_coherence_table[m_sc_to_init_cmd_srcid_fifo.read()] + 8);
+          p_vci_ini.address = (addr_t)(vci_ini_address + 8);
         }
         p_vci_ini.wdata   = r_sc_to_init_cmd_index.read();
@@ -6034,9 +6052,12 @@
         break;
       case INIT_CMD_SC_UPDT_DATA:
+        vci_ini_address = (vci_addr_t)
+            m_sc_to_init_cmd_srcid_fifo.read() << (vci_param::N - vci_param::S);
+
         p_vci_ini.cmdval  = true;
         if( m_sc_to_init_cmd_inst_fifo.read() ) {
-          p_vci_ini.address = (addr_t)(m_coherence_table[m_sc_to_init_cmd_srcid_fifo.read()] + 12);
+          p_vci_ini.address = (addr_t)(vci_ini_address + 12);
         } else {
-          p_vci_ini.address = (addr_t)(m_coherence_table[m_sc_to_init_cmd_srcid_fifo.read()] + 8);
+          p_vci_ini.address = (addr_t)(vci_ini_address + 8);
         }
         p_vci_ini.wdata   = r_sc_to_init_cmd_wdata.read();
@@ -6053,9 +6074,12 @@
         break;
       case INIT_CMD_SC_UPDT_DATA_HIGH:
+        vci_ini_address = (vci_addr_t)
+            m_sc_to_init_cmd_srcid_fifo.read() << (vci_param::N - vci_param::S);
+
         p_vci_ini.cmdval  = true;
         if( m_sc_to_init_cmd_inst_fifo.read() ) {
-          p_vci_ini.address = (addr_t)(m_coherence_table[m_sc_to_init_cmd_srcid_fifo.read()] + 12);
+          p_vci_ini.address = (addr_t)(vci_ini_address + 12);
         } else {
-          p_vci_ini.address = (addr_t)(m_coherence_table[m_sc_to_init_cmd_srcid_fifo.read()] + 8);
+          p_vci_ini.address = (addr_t)(vci_ini_address + 8);
         }
         p_vci_ini.wdata   = r_sc_to_init_cmd_wdata_high.read();
