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 677)
+++ /branches/MESI/modules/vci_mem_cache/caba/source/src/vci_mem_cache.cpp	(revision 678)
@@ -1976,5 +1976,5 @@
                     else
                     {
-                        r_multi_ack_fsm = MULTI_ACK_IVT_LOCK;
+                        r_multi_ack_fsm = MULTI_ACK_DIR_REQ;
                         r_multi_ack_need_data = false;
                     }
@@ -2024,5 +2024,5 @@
                         {
                             assert( eop && "the last word has been received in multi ack data");
-                            r_multi_ack_fsm       = MULTI_ACK_IVT_LOCK;
+                            r_multi_ack_fsm       = MULTI_ACK_DIR_REQ;
                         }
 
@@ -2034,4 +2034,5 @@
                 {
                     if(r_alloc_ivt_fsm.read() != ALLOC_IVT_MULTI_ACK)  break;
+                    assert( r_alloc_dir_fsm.read() == ALLOC_DIR_MULTI_ACK && " BAD ALLOC_DIR_MULTI_ACK IN MULTI_ACK_IVT_LOCK STATE");
                     size_t index  = r_multi_ack_ivt_index.read();
                     size_t count  = m_ivt.count(index);
@@ -2044,10 +2045,10 @@
                     //bool is_valid = m_ivt.is_valid(index);
 
-                    if(r_multi_ack_miss_updt.read())
-                    {
-                        r_multi_ack_fsm = MULTI_ACK_DIR_REQ;
-                    }                    
-                    else
-                    {
+                    // if(r_multi_ack_miss_updt.read())
+                    //{
+                        r_multi_ack_fsm = MULTI_ACK_DIR_LOCK; // this way may be bring about the problem of critical path
+                    //}                    
+                    //else
+                    //{
                         bool is_updt  = m_ivt.is_update(index);
                     
@@ -2055,14 +2056,13 @@
                         assert(count == 1 && "there is only one copy in the memc");
 
-                        r_multi_ack_fsm = MULTI_ACK_IVT_CLEAR;
+                    //  r_multi_ack_fsm = MULTI_ACK_IVT_CLEAR;
 
 #if DEBUG_MEMC_MULTI_ACK
                     if(m_debug)
                         std::cout << "  <MEMC " << name()
-                            << " MULTI_ACK_IVT_LOCK> Decrement the responses counter for UPT:"
+                            << " MULTI_ACK_IVT_LOCK> "
                             << " entry = "       << r_multi_ack_ivt_index.read()
                             << " / count = " << std::dec << count << std::endl;
 #endif
-                    }
                     break;
                 }
@@ -2074,5 +2074,5 @@
                         std::cout
                             << "VCI_MEM_CACHE ERROR " << name()
-                            << " MULTI_ACK_IVT_LOCK state"
+                            << " MULTI_ACK_IVT_CLEAR state"
                             << " bad IVT allocation" << std::endl;
 
@@ -2081,5 +2081,5 @@
 
                     m_ivt.clear(r_multi_ack_ivt_index.read()); 
-                    r_multi_ack_fsm = MULTI_ACK_DIR_REQ;        
+                    r_multi_ack_fsm = MULTI_ACK_RSP;        
             
 #if DEBUG_MEMC_MULTI_ACK
@@ -2097,5 +2097,5 @@
                     if(r_alloc_dir_fsm.read() != ALLOC_DIR_MULTI_ACK) break;
 
-                    r_multi_ack_fsm = MULTI_ACK_DIR_LOCK;
+                    r_multi_ack_fsm = MULTI_ACK_IVT_LOCK;
                     //std::cout << " MEM_CACHE : CLEANUP_DIR_REQ" << std::endl;
 
@@ -2152,15 +2152,7 @@
                     assert( (entry.state == ENTRY_LOCKED) && "mutli rsp check the entry, the line is not locked!!!");
                         
-                    if(r_multi_ack_miss_updt.read()) //cache L1 has sent the cleanup when it receives the cc_updt request,
-                    {
-                        if(not entry.count)
-                        {
-                            r_multi_ack_fsm = MULTI_ACK_IVT_LOCK; 
-                            r_multi_ack_miss_updt = false;
-                        }
-                        else
-                        {
-                            r_multi_ack_fsm = MULTI_ACK_IVT_CHANGE; 
-                        }
+                    if(r_multi_ack_miss_updt.read() and entry.count) //cache L1 has sent the cleanup when it receives the cc_updt request,
+                    {
+                        r_multi_ack_fsm = MULTI_ACK_IVT_CHANGE; 
                     }
                     else if( not entry.count or match_ll) // The line has been already evicted from cache L1
@@ -2180,6 +2172,14 @@
             case MULTI_ACK_IVT_CHANGE:   // release all locks and retry from beginning
                 {                  
-                    if(r_alloc_ivt_fsm.read() != ALLOC_IVT_MULTI_ACK)  break;
-                    
+                    //if(r_alloc_ivt_fsm.read() != ALLOC_IVT_MULTI_ACK)  break;
+                    if(r_alloc_ivt_fsm.read() != ALLOC_IVT_MULTI_ACK ) 
+                    {
+                        std::cout
+                            << "VCI_MEM_CACHE ERROR " << name()
+                            << " MULTI_ACK_IVT_CHANGE state"
+                            << " bad IVT allocation" << std::endl;
+
+                        exit(0);
+                    }
                     m_ivt.change(r_multi_ack_ivt_index.read());
 #if DEBUG_MEMC_MULTI_ACK
@@ -2265,5 +2265,5 @@
                    
                     assert( r_multi_ack_rsp.read() && "Multi ack: must be send the rsp"); 
-                    r_multi_ack_fsm      = MULTI_ACK_RSP;
+                    r_multi_ack_fsm      = MULTI_ACK_IVT_CLEAR;
 #if DEBUG_MEMC_MULTI_ACK
                     if(m_debug)
@@ -2399,5 +2399,5 @@
                             entry.owner.inst     = false;
                             entry.ptr            = 0;
-                            r_multi_ack_fsm      = MULTI_ACK_RSP;
+                            r_multi_ack_fsm      = MULTI_ACK_IVT_CLEAR;
                             
                         }
@@ -2446,5 +2446,5 @@
                         if(r_multi_ack_last_free.read())  m_heap.set_full();
 
-                        r_multi_ack_fsm = MULTI_ACK_RSP;
+                        r_multi_ack_fsm = MULTI_ACK_IVT_CLEAR;
 
 #if DEBUG_MEMC_MULTI_ACK
@@ -9880,6 +9880,5 @@
                         r_alloc_ivt_fsm = ALLOC_IVT_CONFIG;
 
-                    else if ((r_multi_ack_fsm.read() == MULTI_ACK_IVT_LOCK) or
-                            (r_multi_ack_fsm.read() == MULTI_ACK_IVT_CHANGE))
+                    else if (r_multi_ack_fsm.read() == MULTI_ACK_IVT_LOCK) 
                         r_alloc_ivt_fsm = ALLOC_IVT_MULTI_ACK;
 
@@ -9908,6 +9907,5 @@
                         r_alloc_ivt_fsm = ALLOC_IVT_CONFIG;
 
-                    else if ((r_multi_ack_fsm.read() == MULTI_ACK_IVT_LOCK) or
-                            (r_multi_ack_fsm.read() == MULTI_ACK_IVT_CHANGE))
+                    else if (r_multi_ack_fsm.read() == MULTI_ACK_IVT_LOCK)
                         r_alloc_ivt_fsm = ALLOC_IVT_MULTI_ACK;
 
@@ -9935,6 +9933,5 @@
                         r_alloc_ivt_fsm = ALLOC_IVT_CONFIG;
 
-                    else if ((r_multi_ack_fsm.read() == MULTI_ACK_IVT_LOCK) or
-                            (r_multi_ack_fsm.read() == MULTI_ACK_IVT_CHANGE))
+                    else if (r_multi_ack_fsm.read() == MULTI_ACK_IVT_LOCK) 
                         r_alloc_ivt_fsm = ALLOC_IVT_MULTI_ACK;
 
@@ -9965,6 +9962,5 @@
                         r_alloc_ivt_fsm = ALLOC_IVT_CONFIG;
 
-                    else if ((r_multi_ack_fsm.read() == MULTI_ACK_IVT_LOCK) or
-                            (r_multi_ack_fsm.read() == MULTI_ACK_IVT_CHANGE))
+                    else if (r_multi_ack_fsm.read() == MULTI_ACK_IVT_LOCK) 
                         r_alloc_ivt_fsm = ALLOC_IVT_MULTI_ACK;
 
@@ -9992,6 +9988,5 @@
                         r_alloc_ivt_fsm = ALLOC_IVT_CONFIG;
 
-                    else if ((r_multi_ack_fsm.read() == MULTI_ACK_IVT_LOCK) or
-                            (r_multi_ack_fsm.read() == MULTI_ACK_IVT_CHANGE))
+                    else if (r_multi_ack_fsm.read() == MULTI_ACK_IVT_LOCK)
                         r_alloc_ivt_fsm = ALLOC_IVT_MULTI_ACK;
 
@@ -10019,6 +10014,5 @@
                 if (r_config_fsm.read() != CONFIG_IVT_LOCK)
                 {
-                    if ((r_multi_ack_fsm.read() == MULTI_ACK_IVT_LOCK) or
-                            (r_multi_ack_fsm.read() == MULTI_ACK_IVT_CHANGE))
+                    if (r_multi_ack_fsm.read() == MULTI_ACK_IVT_LOCK)
                         r_alloc_ivt_fsm = ALLOC_IVT_MULTI_ACK;
 
@@ -10048,5 +10042,8 @@
             case ALLOC_IVT_MULTI_ACK:           // allocated to MULTI ACK FSM
                 if ((r_multi_ack_fsm.read() != MULTI_ACK_IVT_LOCK) and
-                    (r_multi_ack_fsm.read() != MULTI_ACK_IVT_CHANGE))
+                    (r_multi_ack_fsm.read() != MULTI_ACK_DIR_LOCK) and
+                    (r_multi_ack_fsm.read() != MULTI_ACK_DIR_UPDT) and
+                    (r_multi_ack_fsm.read() != MULTI_ACK_HEAP_LOCK) and
+                    (r_multi_ack_fsm.read() != MULTI_ACK_HEAP_WRITE))
                 {
                     if ((r_write_fsm.read() == WRITE_INVAL_IVT_LOCK))
@@ -10262,4 +10259,5 @@
                 if(((r_multi_ack_fsm.read() != MULTI_ACK_DIR_REQ) and
                     (r_multi_ack_fsm.read() != MULTI_ACK_DIR_LOCK) and
+                    (r_multi_ack_fsm.read() != MULTI_ACK_IVT_LOCK) and
                     (r_multi_ack_fsm.read() != MULTI_ACK_DIR_UPDT)  and
                     (r_multi_ack_fsm.read() != MULTI_ACK_HEAP_REQ)  and
