diff --git a/fifo/cache_fifo.c b/fifo/cache_fifo.c
index 1a7a44b..eecb0c0 100644
--- a/fifo/cache_fifo.c
+++ b/fifo/cache_fifo.c
@@ -271,7 +271,6 @@ unsigned int recuperer_tag( unsigned int adresse, struct cache* c)
 	return adresse>> bits_deplacer;
 }
 
-
 /*
  * Fonction : maj_info_fifo
  * Description : Cette fonction gère la politique de remplacement FIFO.
@@ -290,39 +289,19 @@ unsigned int recuperer_tag( unsigned int adresse, struct cache* c)
  *     informations FIFO directement dans la structure de cache.
  */
 void maj_info_fifo(unsigned int tag, unsigned int index, struct cache* c) 
-{   
-    bool hit = false;
+{
+    struct set *current_set = &c->sets[index];
+    unsigned int pos_remplacement = current_set->fifo_head; // La position de remplacement est celle de la tête FIFO
 
-    // Vérifie si une ligne correspond au tag pour mettre à jour la FIFO
-    for (unsigned int i = 0; i < c->associativite; i++) 
-    {
-        if (c->sets[index].lines[i].valid && c->sets[index].lines[i].tag == tag) 
-        {
-            // Hit trouvé, pas de remplacement nécessaire, on met juste à jour les infos
-            c->sets[index].lines[i].fifo_position = c->sets[index].fifo_head;  // Met à jour la position FIFO
-            hit = true;
-            break;
-        }
-    }
-
-    // Si c'est un miss, on remplace la ligne avec la plus ancienne (FIFO)
-    if (!hit) 
-    {
-        // Remplacement en FIFO : on remplace la ligne à la position "tail"
-        c->sets[index].lines[c->sets[index].fifo_tail].valid = 1;      // Marque la ligne comme valide
-        c->sets[index].lines[c->sets[index].fifo_tail].tag = tag;      // Met à jour le tag
-        c->sets[index].lines[c->sets[index].fifo_tail].dirty = 0;      // Réinitialise le bit dirty
-        c->sets[index].lines[c->sets[index].fifo_tail].fifo_position = c->sets[index].fifo_head; // Met à jour la position FIFO
-
-        // Avancement de la queue FIFO pour la prochaine insertion/remplacement
-        c->sets[index].fifo_tail = (c->sets[index].fifo_tail + 1) % c->associativite;  // Le fifo_tail se déplace en circulaire
-    }
-
-    // Incrémenter "fifo_head" à chaque nouvelle insertion pour suivre l'ordre FIFO
-    c->sets[index].fifo_head = (c->sets[index].fifo_head + 1) % c->associativite;  // Incrément circulaire également
+    // Remplacer l'ancienne ligne par la nouvelle
+    current_set->lines[pos_remplacement].tag = tag;
+    current_set->lines[pos_remplacement].valid = 1; // Ligne maintenant valide
+    current_set->lines[pos_remplacement].dirty = 0; // Par défaut, pas encore "salie"
+    
+    // Mise à jour de la position FIFO (circular buffer)
+    current_set->fifo_head = (current_set->fifo_head + 1) % c->associativite; // Avancer la tête
 }
 
-
 /*
  * Fonction : calcul_hits_miss
  * Description : Cette fonction calcule les compteurs de hits et de misses pour une 
@@ -339,111 +318,122 @@ void maj_info_fifo(unsigned int tag, unsigned int index, struct cache* c)
  *   - void : La fonction ne retourne aucune valeur, mais met à jour les 
  *          compteurs et les informations de la mémoire cache directement.
  */
-void calcul_hits_miss( struct reference_memoire m, struct cache* c)
-{
-	// Récupère le tag et l'index de l'adresse mémoire
-	unsigned int tag = recuperer_tag(m.adresse,c);
-	unsigned int index = recuperer_index(m.adresse,c);
-	unsigned int i = 0;
+void calcul_hits_miss(struct reference_memoire m, struct cache* c) {
+    unsigned int index = recuperer_index(m.adresse, c);
+    unsigned int tag = recuperer_tag(m.adresse, c);
+    struct set* current_set = &c->sets[index];
 
-	// Mesurer les temps d'accés
-	clock_t start_time = clock(); // Démarrer le chronomètre
-	
-	// Vérifier si la référence entraîne un miss
-	bool miss = true; // Initialement, on suppose qu'il y a un miss
-	for (i=0;i<c->associativite;i++)
-	{
-		struct line temp = c->sets[index].lines[i];
+    clock_t start_time = clock(); // Démarrer le chronomètre
 
-		// Vérifie si la ligne est valide et si le tag correspond	
-		if (temp.tag == tag && temp.valid)
-		{
-			miss = false; // Hit trouvé
-			break;
-		}
-	}
-	
-	
-	// Charger la valeur dans la cache si c'est un miss
-	if ( miss )
-	{
-		c->action.memory_accesses++; // Compte l'accès mémoire
+    // Logique pour les accès en lecture
+    if (m.adresse_type == 0) { // 0 pour lecture
+        c->action.data_read_reference_count++;
 
-			// Gestion de la politique d'écriture pour Write Back
-        	if (c->write_policy==1 && c->sets[index].lines[0].dirty == 1) // Write Back et set dirty
-        	{
-        	    c->action.memory_accesses++;  // Incrémente l'accès mémoire
-        	    c->sets[index].lines[0].dirty = 0; // Réinitialise le bit dirty
-        	}
-			// Met à jour les lignes du set
-        	for(i=0;i<c->associativite;i++)
-        	{
-			c->sets[index].lines[i].valid = 1; // Marque la ligne comme valide
-			if (m.adresse_type == 1)    c->sets[index].lines[i].dirty = 1; // Si c'est une écriture, marque dirty à 1
-			c->sets[index].lines[i].tag = tag; // Met à jour le tag
-	        }
+        // Vérification des hits
+        for (unsigned int i = 0; i < c->associativite; i++) {
+            if (current_set->lines[i].valid && current_set->lines[i].tag == tag) {
+                // Hit
+                c->action.data_read_hit_count++;
+                // Fin de la mesure de temps
+                clock_t end_time = clock(); // Arrêter le chronomètre
+                double elapsed_time = ((double)(end_time - start_time)) / CLOCKS_PER_SEC; // Temps écoulé en secondes
+                c->total_access_time += elapsed_time; // Ajouter au temps total d'accès
+                return;
+            }
+        }
 
-		// Incrémente le compteur de miss selon le type d'adresse			
-		switch (m.adresse_type) 
-		{
-		case 0:
-			c->action.data_read_miss_count++;
-			break;
-		case 1:
-			c->action.data_write_miss_count++;
-			break;
-		case 2:
-			c->action.instruction_miss_count++;
-			break;
-		default:
-			break;
-		}
-	}
-	else // C'est un hit et non pas un miss
-	{
-		// Incrémente le compteur de hit selon le type d'adresse
-		switch (m.adresse_type)
-		{
-		case 0:
-			c->action.data_read_hit_count++;
-			break;
-		case 1:
-			c->action.data_write_hit_count++;
-			break;
-		case 2:
-			c->action.instruction_hit_count++;
-			break;
-		default:
-			break;
-		}
-	}		
-	
-	// Met à jour les informations FIFO pour le tag et l'index
-	maj_info_fifo(tag,index,c);
+        // Miss
+        c->action.data_read_miss_count++;
+        // Incrémenter le compteur total d'accès
+        c->action.memory_accesses++;
 
-	// Fin de la mesure de temps
+        // Gérer l'insertion dans la cache (FIFO)
+        if (current_set->fifo_tail < c->associativite) {
+            // Insérer dans une ligne vide
+            current_set->lines[current_set->fifo_tail].valid = 1;
+            current_set->lines[current_set->fifo_tail].tag = tag;
+            current_set->fifo_tail++;
+        } else {
+            // Remplacer selon FIFO
+            maj_info_fifo(tag, index, c); // Appel à la fonction de mise à jour
+        }
+    }
+    // Logique pour les écritures
+    else if (m.adresse_type == 1) { // 1 pour écriture
+        c->action.data_write_reference_count++;
+
+        // Vérification des hits
+        for (unsigned int i = 0; i < c->associativite; i++) {
+            if (current_set->lines[i].valid && current_set->lines[i].tag == tag) {
+                // Hit
+                c->action.data_write_hit_count++;
+                current_set->lines[i].dirty = 1; // Marquer comme "dirty"
+                // Fin de la mesure de temps
+                clock_t end_time = clock(); // Arrêter le chronomètre
+                double elapsed_time = ((double)(end_time - start_time)) / CLOCKS_PER_SEC; // Temps écoulé en secondes
+                c->total_access_time += elapsed_time; // Ajouter au temps total d'accès
+                return;
+            }
+        }
+
+        // Miss
+        c->action.data_write_miss_count++;
+        // Incrémenter le compteur total d'accès
+        c->action.memory_accesses++;
+
+        // Gérer l'insertion dans la cache (FIFO)
+        if (current_set->fifo_tail < c->associativite) {
+            // Insérer dans une ligne vide
+            current_set->lines[current_set->fifo_tail].valid = 1;
+            current_set->lines[current_set->fifo_tail].tag = tag;
+            current_set->lines[current_set->fifo_tail].dirty = 1; // Marquer comme "dirty"
+            current_set->fifo_tail++;
+        } else {
+            // Remplacer selon FIFO
+            maj_info_fifo(tag, index, c); // Appel à la fonction de mise à jour
+        }
+    }
+    // Logique pour les instructions
+    else if (m.adresse_type == 2) { // 2 pour instruction
+        c->action.instruction_reference_count++;
+
+        // Vérification des hits
+        for (unsigned int i = 0; i < c->associativite; i++) {
+            if (current_set->lines[i].valid && current_set->lines[i].tag == tag) {
+                // Hit
+                c->action.instruction_hit_count++;
+                // Fin de la mesure de temps
+                clock_t end_time = clock(); // Arrêter le chronomètre
+                double elapsed_time = ((double)(end_time - start_time)) / CLOCKS_PER_SEC; // Temps écoulé en secondes
+                c->total_access_time += elapsed_time; // Ajouter au temps total d'accès
+                return;
+            }
+        }
+
+        // Miss
+        c->action.instruction_miss_count++;
+        // Incrémenter le compteur total d'accès
+        c->action.memory_accesses++;
+
+        // Gérer l'insertion dans la cache (FIFO)
+        if (current_set->fifo_tail < c->associativite) {
+            // Insérer dans une ligne vide
+            current_set->lines[current_set->fifo_tail].valid = 1;
+            current_set->lines[current_set->fifo_tail].tag = tag;
+            current_set->fifo_tail++;
+        } else {
+            // Remplacer selon FIFO
+            maj_info_fifo(tag, index, c); // Appel à la fonction de mise à jour
+        }
+    }
+
+    // Fin de la mesure de temps pour les cas de misses
     clock_t end_time = clock(); // Arrêter le chronomètre
     double elapsed_time = ((double)(end_time - start_time)) / CLOCKS_PER_SEC; // Temps écoulé en secondes
     c->total_access_time += elapsed_time; // Ajouter au temps total d'accès
-
-	// Incrémente le compteur de références selon le type d'adresse
-	switch (m.adresse_type)
-		{
-		case 0:
-			c->action.data_read_reference_count++;
-			break;
-		case 1:
-			c->action.data_write_reference_count++;
-			break;
-		case 2:
-			c->action.instruction_reference_count++;
-			break;
-		default:
-			break;
-		}
-	
 }
 
+
 /*
  * Fonction : get_hits_color
  * Description : Cette fonction détermine la couleur d'affichage basée sur le pourcentage 
@@ -512,6 +502,7 @@ const char* get_misses_color(float percentage)
     }
 }
 
+
 /*
  * Fonction : affiche_hits_miss
  * Description : Cette fonction affiche les statistiques de performance de la mémoire cache, 
@@ -566,9 +557,10 @@ void affiche_hits_miss(struct cache * c)
     int miss_writes = c->action.data_write_miss_count; 
     float pourcent_miss_reads = ((float)miss_reads / (float)accesses) * 100;
     float pourcent_miss_writes = ((float)miss_writes / (float)accesses) * 100;
-    
+
     c->action.memory_accesses = c->action.memory_accesses * (c->taille_ligne / 4); // Convertit en nombre de mots
     
+    
     // Afficher les hits et misses de manière formatée avec couleurs
     printf("%s----------------------------------------------------\n",    COULEUR_BORDURE);
     printf("|               %sStatistiques de Cache%s              |\n",  WHITE, COULEUR_BORDURE);