void MESI_protocol::process_snoop_request (Mreq *request)
{
    if (DEBUG) {
        switch (state) {
            case MESI_CACHE_I: printf("SI"); do_snoop_I (request); break;
            case MESI_CACHE_S: printf("SS"); do_snoop_S (request); break;
            case MESI_CACHE_E: printf("SE"); do_snoop_E (request); break;
            case MESI_CACHE_M: printf("SM"); do_snoop_M (request); break;
            case MESI_CACHE_IM: printf("SIM"); do_snoop_IM (request); break;
            case MESI_CACHE_IS: printf("SIS"); do_snoop_IS (request); break;
            case MESI_CACHE_SM: printf("SSM"); do_snoop_SM (request); break;
        default:
            fatal_error ("Invalid Cache State for MESI Protocol\n");
        }
    }
    else {
        switch (state) {
            case MESI_CACHE_I: do_snoop_I (request); break;
            case MESI_CACHE_S: do_snoop_S (request); break;
            case MESI_CACHE_E: do_snoop_E (request); break;
            case MESI_CACHE_M: do_snoop_M (request); break;
            case MESI_CACHE_IM: do_snoop_IM (request); break;
            case MESI_CACHE_IS: do_snoop_IS (request); break;
            case MESI_CACHE_SM: do_snoop_SM (request); break;
        default:
            fatal_error ("Invalid Cache State for MESI Protocol\n");
        }
    }
}
void MOESI_protocol::process_snoop_request (Mreq *request)
{
	switch (state) {
    case MOESI_CACHE_I:  
    	do_snoop_I (request); 
    	break;
    case MOESI_CACHE_S:  
    	do_snoop_S (request);
    	break;
    case MOESI_CACHE_E:  
    	do_snoop_E (request); 
    	break;
    case MOESI_CACHE_O:  
    	do_snoop_O (request); 
    	break;
    case MOESI_CACHE_M:  
    	do_snoop_M (request); 
    	break;
    case MOESI_CACHE_IM_Intermediate:  
    	do_snoop_IM_Intermediate (request); 
    	break;
    case MOESI_CACHE_IS_Intermediate:  
    	do_snoop_IS_Intermediate (request); 
    	break;
    case MOESI_CACHE_SM_Intermediate:  
    	do_snoop_SM_Intermediate (request); 
    	break;
    case MOESI_CACHE_OM_Intermediate:  
    	do_snoop_OM_Intermediate (request); 
    	break;
    default:
    	fatal_error ("Invalid Cache State for MOESI Protocol\n");
    }
}
void MSI_protocol::process_snoop_request (Mreq *request){
	switch (state) {
	case MSI_CACHE_I:  do_snoop_I (request); break;
    case MSI_CACHE_IM: do_snoop_IM (request); break;
    case MSI_CACHE_M:  do_snoop_M (request); break;
	case MSI_CACHE_S:  do_snoop_S (request); break;
    case MSI_CACHE_IS: do_snoop_IS (request); break;
    case MSI_CACHE_SM:  do_snoop_SM (request); break;
	default:
    	fatal_error ("Invalid Cache State for MSI Protocol\n");
    }
}
//Redirect work to the appropriate function
void TYPE(_protocol)::process_snoop_request (Mreq *request)
{
	switch (state) {
	case TYPE(_CACHE_I): do_snoop_I (request); break;
	case TYPE(_CACHE_S): do_snoop_S (request); break;
	case TYPE(_CACHE_M): do_snoop_M (request); break;
	case TYPE(_CACHE_IE): do_snoop_IE (request); break;
	case TYPE(_CACHE_IM): do_snoop_IM (request); break;
	case TYPE(_CACHE_SM): do_snoop_SM (request); break;

	default:
		fatal_error ("Invalid Cache State for TYPE Protocol\n");
	}
}
void MOESIF_protocol::process_snoop_request (Mreq *request)
{
	switch (state) {
	
	case MOESIF_CACHE_I:  do_snoop_I (request); break;
	case MOESIF_CACHE_IS: do_snoop_IS (request); break;
    case MOESIF_CACHE_S:  do_snoop_S (request); break;
	case MOESIF_CACHE_SM: do_snoop_SM (request); break;
	case MOESIF_CACHE_E:  do_snoop_E (request); break;
	case MOESIF_CACHE_OM: do_snoop_OM (request); break;
    case MOESIF_CACHE_IM: do_snoop_IM (request); break;
    case MOESIF_CACHE_M:  do_snoop_M (request); break;
	case MOESIF_CACHE_O:  do_snoop_O (request); break;
	case MOESIF_CACHE_FM: do_snoop_FM (request); break;
	case MOESIF_CACHE_F:  do_snoop_F (request); break;

    default:
    	fatal_error ("Invalid Cache State for MOESIF Protocol\n");
    }
}