Index: /branches/MESI/modules/vci_cc_vcache_wrapper/caba/source/src/vci_cc_vcache_wrapper.cpp
===================================================================
--- /branches/MESI/modules/vci_cc_vcache_wrapper/caba/source/src/vci_cc_vcache_wrapper.cpp	(revision 673)
+++ /branches/MESI/modules/vci_cc_vcache_wrapper/caba/source/src/vci_cc_vcache_wrapper.cpp	(revision 674)
@@ -1295,5 +1295,5 @@
                     r_icache_fsm      = ICACHE_MISS_SELECT;
 #if DEBUG_ICACHE
-if ( m_debug_activated )
+if ( m_debug_activated or m_ireq.addr == 0x11020 )
 std::cout << "  <PROC " << name() << " ICACHE_IDLE> READ MISS in icache" 
           << " : PADDR = " << std::hex << paddr << std::endl;
@@ -2100,10 +2100,11 @@
 
         // coherence request completed
-        r_icache_cc_send_req   = true;
-        r_icache_cc_send_nline = r_cc_receive_icache_nline.read();
-        r_icache_cc_send_way   = r_icache_cc_way.read();
-        r_icache_cc_send_type  = CC_TYPE_CLEANUP;
-
-        r_icache_fsm           = r_icache_fsm_save.read();
+        r_icache_cc_send_req    = true;
+        r_icache_cc_send_nline  = r_cc_receive_icache_nline.read();
+        r_icache_cc_send_way    = r_icache_cc_way.read();
+        r_icache_cc_send_type   = CC_TYPE_CLEANUP;
+
+        r_icache_fsm            = r_icache_fsm_save.read();
+        r_cc_receive_icache_req = false;
 
 #if DEBUG_ICACHE
@@ -2821,5 +2822,5 @@
                                     m_drsp.rdata   = cache_rdata;
 #if DEBUG_DCACHE
-if ( m_debug_activated )
+if ( m_debug_activated or m_drsp.rdata == 0x11020)
 std::cout << "  <PROC " << name() << " DCACHE_IDLE>"
           << " READ HIT in dcache" 
@@ -2967,5 +2968,5 @@
                     }
 #if DEBUG_DCACHE
-if ( m_debug_activated )
+if ( m_debug_activated or m_dreq.wdata == 0x11020)
 std::cout << "  <PROC " << name() << " DCACHE_IDLE>"
       << " WRITE REQ " 
@@ -5620,7 +5621,8 @@
     }
     } // end switch r_dcache_fsm
-if(r_dcache_miss_updt.read())
-std::cout << "  <PROC " << name() 
-          << " miss updt " << r_dcache_miss_updt.read() << std::endl;
+
+//if(r_dcache_miss_updt.read())
+//std::cout << "  <PROC " << name() 
+//          << " miss updt " << r_dcache_miss_updt.read() << std::endl;
 
 //std::cout << "  <PROC " << name() 
@@ -6265,6 +6267,6 @@
                 r_cc_receive_dcache_srcid = DspinDhccpParam::dspin_get(receive_data,
                                             DspinDhccpParam::BROADCAST_SRCID);
-            }
-            r_cc_receive_fsm = CC_RECEIVE_BRDCAST_NLINE;
+                r_cc_receive_fsm          = CC_RECEIVE_BRDCAST_NLINE;
+            }
             break;
         }
@@ -6278,7 +6280,10 @@
             // not to actually post a request to an available cache => need a
             // flip_flop to check that ?
-            if (not (r_cc_receive_icache_req.read()) and 
-                not (r_cc_receive_dcache_req.read()) and
-                (p_dspin_m2p.write.read()))
+            if (r_cc_receive_icache_req.read() or r_cc_receive_dcache_req.read())
+            {   
+                std::cout << "illege flags for handling brdcast request" << std::endl;
+                exit(0);
+            }
+            if(p_dspin_m2p.write.read())
             {
                 // request dcache to handle the BROADCAST
@@ -6296,4 +6301,5 @@
                 break;
             }
+
             // keep waiting for the caches to accept the request
             break;
@@ -6846,13 +6852,4 @@
         case CC_RECEIVE_BRDCAST_HEADER:
         {
-            p_dspin_m2p.read = true;
-            break;
-        }
-        //////////////////////////////
-        case CC_RECEIVE_BRDCAST_NLINE:
-        {
-            // TODO maybe we need to wait for both only to leave the state, but
-            // not to actually post a request to an available cache => need a
-            // flip_flop to check that ?
             if (not (r_cc_receive_icache_req.read()) and not (r_cc_receive_dcache_req.read()))
                 p_dspin_m2p.read = true;
@@ -6860,4 +6857,14 @@
                 p_dspin_m2p.read = false;
             break;
+        }
+        //////////////////////////////
+        case CC_RECEIVE_BRDCAST_NLINE:
+        {
+            // TODO maybe we need to wait for both only to leave the state, but
+            // not to actually post a request to an available cache => need a
+            // flip_flop to check that ?
+            p_dspin_m2p.read = true;
+            break;
+
         }
         /////////////////////////////
Index: /branches/MESI/modules/vci_mem_cache/caba/source/src/vci_mem_cache.cpp
===================================================================
--- /branches/MESI/modules/vci_mem_cache/caba/source/src/vci_mem_cache.cpp	(revision 673)
+++ /branches/MESI/modules/vci_mem_cache/caba/source/src/vci_mem_cache.cpp	(revision 674)
@@ -3175,4 +3175,5 @@
                             << " / way = " << std::dec << way
                             << " / count = " <<std::dec << entry.count
+                            << " / copy = " <<std::dec << entry.owner.srcid
                             << " / is_cnt = " << entry.is_cnt << std::endl;
                         if((m_cmd_read_pktid_fifo.read() & 0x7) == TYPE_LL) std::cout << " / LL access" << std::endl;
@@ -3287,4 +3288,5 @@
                                     << "  <MEMC " << name() << " READ_IVT_INVAL_LOCK>" 
                                     << " Inval req for a read for ownership request"
+                                    << " read copy = " << r_read_copy.read()
                                     << " count " << ivt_send_count << " " << r_read_count.read() 
                                     << std::endl;
@@ -4905,4 +4907,5 @@
                                          not r_write_to_cc_send_brdcast_req.read() and  
                                             (r_write_inval_trt_send.read() or not r_write_to_cleanup_req.read());
+
                     if(r_alloc_ivt_fsm.read() == ALLOC_IVT_WRITE)
                     {
@@ -4915,27 +4918,29 @@
                         addr_t      nline      = m_nline[(addr_t)(r_write_address.read())];
                         size_t      nb_copies  = r_write_count.read();
-
-                        wok = m_ivt.set(false,        // it's an inval transaction
-                                        is_brdcast,   // it's a broadcast
-                                        true,         // response required
-                                        false,        // no acknowledge required
-                                        srcid,
-                                        trdid,
-                                        pktid,
-                                        nline,
-                                        nb_copies,
-                                        index);
+                        bool        ivt_full   = m_ivt.is_full();
+
+                        
+                        //r_write_ivt_index = index;
+
+                        if(not ivt_full and cc_send_valid) //avoid to deadlock, we make sure that we can send cc_send request. 
+                        {  
+                            wok = m_ivt.set(false,        // it's an inval transaction
+                                            is_brdcast,   // it's a broadcast
+                                            true,         // response required
+                                            false,        // no acknowledge required
+                                            srcid,
+                                            trdid,
+                                            pktid,
+                                            nline,
+                                            nb_copies,
+                                            index);
+                         /*//   std::cout << " trt wait nline =" << std::hex << nline 
+                                     << " write data " << std::hex << std::endl;*/
 #if DEBUG_MEMC_WRITE
                         if( m_debug and wok )
                             std::cout << "  <MEMC " << name() << " WRITE_INVAL_IVT_LOCK> Register broadcast inval in IVT"
+                                << "ivt index = " << index
                                 << " / nb_copies = " << r_write_count.read() << std::endl;
 #endif
-                        //r_write_ivt_index = index;
-
-                        if(wok and cc_send_valid) //avoid to deadlock, we make sure that we can send cc_send request. 
-                        {   
-                         /*//   std::cout << " trt wait nline =" << std::hex << nline 
-                                     << " write data " << std::hex << std::endl;*/
-
                             for(size_t word=0 ; word<m_words ; word++)
                             {
@@ -6760,4 +6765,5 @@
                             << " CLEANUP_LOCKED_IVT_CLEAR> clear UPT entry"
                             << " contain data = " << r_cleanup_contains_data.read()
+                            << " srcid = " << r_cleanup_locked_srcid.read()
                             << " updt dir count =" << entry.count
                             << std::endl;
@@ -10001,6 +10007,7 @@
         // The ALLOC_DIR FSM allocates the access to the directory and
         // the data cache with a round robin priority between 6 user FSMs :
-        // The cyclic ordering is CONFIG > READ > WRITE > CAS > CLEANUP > XRAM_RSP
+        // The cyclic ordering is CONFIG > READ > WRITE > CAS > MULTI_ACK > CLEANUP > XRAM_RSP
         // The ressource is always allocated.
+        // one important point is that the multi_ack alloc is always token before the cleanup alloc
         /////////////////////////////////////////////////////////////////////////////////////
 
@@ -10037,4 +10044,7 @@
                         r_alloc_dir_fsm = ALLOC_DIR_CAS;
 
+                    else if(r_multi_ack_fsm.read() == MULTI_ACK_DIR_REQ)
+                        r_alloc_dir_fsm = ALLOC_DIR_MULTI_ACK;
+
                     else if(r_cleanup_fsm.read() == CLEANUP_DIR_REQ)
                         r_alloc_dir_fsm = ALLOC_DIR_CLEANUP;
@@ -10042,7 +10052,4 @@
                     else if(r_xram_rsp_fsm.read() == XRAM_RSP_DIR_LOCK)
                         r_alloc_dir_fsm = ALLOC_DIR_XRAM_RSP;
-
-                    else if(r_multi_ack_fsm.read() == MULTI_ACK_DIR_REQ)
-                        r_alloc_dir_fsm = ALLOC_DIR_MULTI_ACK;
 
                     else
@@ -10071,4 +10078,7 @@
                         r_alloc_dir_fsm = ALLOC_DIR_CAS;
 
+                    else if(r_multi_ack_fsm.read() == MULTI_ACK_DIR_REQ)
+                        r_alloc_dir_fsm = ALLOC_DIR_MULTI_ACK;
+
                     else if(r_cleanup_fsm.read() == CLEANUP_DIR_REQ)
                         r_alloc_dir_fsm = ALLOC_DIR_CLEANUP;
@@ -10076,7 +10086,4 @@
                     else if(r_xram_rsp_fsm.read() == XRAM_RSP_DIR_LOCK)
                         r_alloc_dir_fsm = ALLOC_DIR_XRAM_RSP;
-
-                    else if(r_multi_ack_fsm.read() == MULTI_ACK_DIR_REQ)
-                        r_alloc_dir_fsm = ALLOC_DIR_MULTI_ACK;
 
                     else if(r_config_fsm.read() == CONFIG_DIR_REQ)
@@ -10110,4 +10117,7 @@
                         r_alloc_dir_fsm = ALLOC_DIR_CAS;
 
+                    else if(r_multi_ack_fsm.read() == MULTI_ACK_DIR_REQ)
+                        r_alloc_dir_fsm = ALLOC_DIR_MULTI_ACK;
+
                     else if(r_cleanup_fsm.read() == CLEANUP_DIR_REQ)
                         r_alloc_dir_fsm = ALLOC_DIR_CLEANUP;
@@ -10115,7 +10125,4 @@
                     else if(r_xram_rsp_fsm.read() == XRAM_RSP_DIR_LOCK)
                         r_alloc_dir_fsm = ALLOC_DIR_XRAM_RSP;
-
-                    else if(r_multi_ack_fsm.read() == MULTI_ACK_DIR_REQ)
-                        r_alloc_dir_fsm = ALLOC_DIR_MULTI_ACK;
 
                     else if(r_config_fsm.read() == CONFIG_DIR_REQ)
@@ -10150,13 +10157,13 @@
                     ((r_cas_fsm.read()        == CAS_MISS_TRT_LOCK)  and
                      (r_alloc_trt_fsm.read()  == ALLOC_TRT_CAS)))
-                {
-                    if(r_cleanup_fsm.read() == CLEANUP_DIR_REQ)
+                {                   
+                    if(r_multi_ack_fsm.read() == MULTI_ACK_DIR_REQ)
+                        r_alloc_dir_fsm = ALLOC_DIR_MULTI_ACK;
+
+                    else if(r_cleanup_fsm.read() == CLEANUP_DIR_REQ)
                         r_alloc_dir_fsm = ALLOC_DIR_CLEANUP;
 
                     else if(r_xram_rsp_fsm.read() == XRAM_RSP_DIR_LOCK)
                         r_alloc_dir_fsm = ALLOC_DIR_XRAM_RSP;
-
-                    else if(r_multi_ack_fsm.read() == MULTI_ACK_DIR_REQ)
-                        r_alloc_dir_fsm = ALLOC_DIR_MULTI_ACK;
 
                     else if(r_config_fsm.read() == CONFIG_DIR_REQ)
@@ -10175,70 +10182,4 @@
                     m_cpt_cas_fsm_dir_used++;
                 break;
-
-                ///////////////////////
-            case ALLOC_DIR_CLEANUP:    // allocated to CLEANUP FSM
-                if((r_cleanup_fsm.read() != CLEANUP_DIR_REQ) and
-                   (r_cleanup_fsm.read() != CLEANUP_DIR_LOCK) and
-                   (r_cleanup_fsm.read() != CLEANUP_LOCKED_IVT_LOCK) and
-                   (r_cleanup_fsm.read() != CLEANUP_LOCKED_IVT_DECREMENT) and
-                   (r_cleanup_fsm.read() != CLEANUP_HEAP_REQ) and
-                   (r_cleanup_fsm.read() != CLEANUP_HEAP_LOCK))
-                {
-                    if(r_xram_rsp_fsm.read() == XRAM_RSP_DIR_LOCK)
-                        r_alloc_dir_fsm = ALLOC_DIR_XRAM_RSP;
-
-                    else if(r_multi_ack_fsm.read() == MULTI_ACK_DIR_REQ)
-                        r_alloc_dir_fsm = ALLOC_DIR_MULTI_ACK;
-
-                    else if(r_config_fsm.read() == CONFIG_DIR_REQ)
-                        r_alloc_dir_fsm = ALLOC_DIR_CONFIG;
-
-                    else if(r_read_fsm.read() == READ_DIR_REQ)
-                        r_alloc_dir_fsm = ALLOC_DIR_READ;
-
-                    else if(r_write_fsm.read() == WRITE_DIR_REQ)
-                        r_alloc_dir_fsm = ALLOC_DIR_WRITE;
-
-                    else if(r_cas_fsm.read() == CAS_DIR_REQ)
-                        r_alloc_dir_fsm = ALLOC_DIR_CAS;
-
-                    else
-                        m_cpt_dir_unused++;
-                }
-                else
-                    m_cpt_cleanup_fsm_dir_used++;
-                break;
-
-                ////////////////////////
-            case ALLOC_DIR_XRAM_RSP:    // allocated to XRAM_RSP FSM
-                if( (r_xram_rsp_fsm.read() != XRAM_RSP_DIR_LOCK) and
-                    (r_xram_rsp_fsm.read() != XRAM_RSP_TRT_COPY) and
-                    (r_xram_rsp_fsm.read() != XRAM_RSP_IVT_LOCK))
-                {
-                    if(r_multi_ack_fsm.read() == MULTI_ACK_DIR_REQ)
-                        r_alloc_dir_fsm = ALLOC_DIR_MULTI_ACK;
-
-                    else if(r_config_fsm.read() == CONFIG_DIR_REQ)
-                        r_alloc_dir_fsm = ALLOC_DIR_CONFIG;
-
-                    else if(r_read_fsm.read() == READ_DIR_REQ)
-                        r_alloc_dir_fsm = ALLOC_DIR_READ;
-
-                    else if(r_write_fsm.read() == WRITE_DIR_REQ)
-                        r_alloc_dir_fsm = ALLOC_DIR_WRITE;
-
-                    else if(r_cas_fsm.read() == CAS_DIR_REQ)
-                        r_alloc_dir_fsm = ALLOC_DIR_CAS;
-
-                    else if(r_cleanup_fsm.read() == CLEANUP_DIR_REQ)
-                        r_alloc_dir_fsm = ALLOC_DIR_CLEANUP;
-
-                    else
-                        m_cpt_dir_unused++;
-                }
-                else
-                    m_cpt_xram_rsp_fsm_dir_used++;
-                break;
-
                 ////////////////////////
             case ALLOC_DIR_MULTI_ACK:    // allocated to MULTI_ACK FSM
@@ -10253,5 +10194,11 @@
                  //    (r_alloc_heap_fsm.read() == ALLOC_HEAP_MULTI_ACK)))
                 {
-                    if(r_config_fsm.read() == CONFIG_DIR_REQ)
+                    if(r_cleanup_fsm.read() == CLEANUP_DIR_REQ)
+                        r_alloc_dir_fsm = ALLOC_DIR_CLEANUP;
+
+                    else if(r_xram_rsp_fsm.read() == XRAM_RSP_DIR_LOCK)
+                        r_alloc_dir_fsm = ALLOC_DIR_XRAM_RSP;
+
+                    else if(r_config_fsm.read() == CONFIG_DIR_REQ)
                         r_alloc_dir_fsm = ALLOC_DIR_CONFIG;
 
@@ -10265,9 +10212,4 @@
                         r_alloc_dir_fsm = ALLOC_DIR_CAS;
 
-                    else if(r_cleanup_fsm.read() == CLEANUP_DIR_REQ)
-                        r_alloc_dir_fsm = ALLOC_DIR_CLEANUP;
-
-                    else if(r_xram_rsp_fsm.read() == XRAM_RSP_DIR_LOCK)
-                        r_alloc_dir_fsm = ALLOC_DIR_XRAM_RSP;
                     else
                         m_cpt_dir_unused++;
@@ -10276,6 +10218,68 @@
                     m_cpt_xram_rsp_fsm_dir_used++;
                 break;
-
-
+                ///////////////////////
+            case ALLOC_DIR_CLEANUP:    // allocated to CLEANUP FSM
+                if((r_cleanup_fsm.read() != CLEANUP_DIR_REQ) and
+                   (r_cleanup_fsm.read() != CLEANUP_DIR_LOCK) and
+                   (r_cleanup_fsm.read() != CLEANUP_LOCKED_IVT_LOCK) and
+                   (r_cleanup_fsm.read() != CLEANUP_LOCKED_IVT_DECREMENT) and
+                   (r_cleanup_fsm.read() != CLEANUP_HEAP_REQ) and
+                   (r_cleanup_fsm.read() != CLEANUP_HEAP_LOCK))
+                {
+                    if(r_xram_rsp_fsm.read() == XRAM_RSP_DIR_LOCK)
+                        r_alloc_dir_fsm = ALLOC_DIR_XRAM_RSP;
+
+                    else if(r_config_fsm.read() == CONFIG_DIR_REQ)
+                        r_alloc_dir_fsm = ALLOC_DIR_CONFIG;
+
+                    else if(r_read_fsm.read() == READ_DIR_REQ)
+                        r_alloc_dir_fsm = ALLOC_DIR_READ;
+
+                    else if(r_write_fsm.read() == WRITE_DIR_REQ)
+                        r_alloc_dir_fsm = ALLOC_DIR_WRITE;
+
+                    else if(r_cas_fsm.read() == CAS_DIR_REQ)
+                        r_alloc_dir_fsm = ALLOC_DIR_CAS;
+
+                    else if(r_multi_ack_fsm.read() == MULTI_ACK_DIR_REQ)
+                        r_alloc_dir_fsm = ALLOC_DIR_MULTI_ACK;
+
+                    else
+                        m_cpt_dir_unused++;
+                }
+                else
+                    m_cpt_cleanup_fsm_dir_used++;
+                break;
+
+                ////////////////////////
+            case ALLOC_DIR_XRAM_RSP:    // allocated to XRAM_RSP FSM
+                if( (r_xram_rsp_fsm.read() != XRAM_RSP_DIR_LOCK) and
+                    (r_xram_rsp_fsm.read() != XRAM_RSP_TRT_COPY) and
+                    (r_xram_rsp_fsm.read() != XRAM_RSP_IVT_LOCK))
+                {
+                    if(r_config_fsm.read() == CONFIG_DIR_REQ)
+                        r_alloc_dir_fsm = ALLOC_DIR_CONFIG;
+
+                    else if(r_read_fsm.read() == READ_DIR_REQ)
+                        r_alloc_dir_fsm = ALLOC_DIR_READ;
+
+                    else if(r_write_fsm.read() == WRITE_DIR_REQ)
+                        r_alloc_dir_fsm = ALLOC_DIR_WRITE;
+
+                    else if(r_cas_fsm.read() == CAS_DIR_REQ)
+                        r_alloc_dir_fsm = ALLOC_DIR_CAS;
+
+                    else if(r_multi_ack_fsm.read() == MULTI_ACK_DIR_REQ)
+                        r_alloc_dir_fsm = ALLOC_DIR_MULTI_ACK;
+
+                    else if(r_cleanup_fsm.read() == CLEANUP_DIR_REQ)
+                        r_alloc_dir_fsm = ALLOC_DIR_CLEANUP;
+
+                    else
+                        m_cpt_dir_unused++;
+                }
+                else
+                    m_cpt_xram_rsp_fsm_dir_used++;
+                break;
 
         } // end switch alloc_dir_fsm
