diff --git a/Final Code/README.md b/Final Code/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..4c06cefc68189bc791f0b3ca3997db56aa52694d
--- /dev/null
+++ b/Final Code/README.md	
@@ -0,0 +1,65 @@
+# Projet_Q4_Groupe_O4
+
+## Description des fichiers :
+
+@fonctions.h
+Un fichier header qui reprend les structures utilisées pour les listes chaînées ainsi que les nom 
+des fonctions utilisées dans fonctions.c
+
+@fonctions.c
+Un fichier avec l'implémentation des différentes fonctions décrites dans le fichier header.
+Dans celui-ci, il y a les fonctions liées aux listes chaînées, une fonction pour trouver les 
+diviseurspremiers d'un nombre donné, une fonction comptant les listes d'un fichier et des fonctions 
+pour initialiser les 2 buffers.
+
+@main.c
+Le code source à compiler pour obtenir le programme
+
+@test.c
+Un fichier reprenant les tests unitaires de nos fonctions
+
+@Makefile
+Le fichier reprenant les commandes à executer pour lancer le code de façon plus agréable
+
+## Lancer le code :
+
+- make fact               : produit l'exécutable "fact"
+
+- make cpp / make cpp_xml : compile le programme et analyse ou donne le rapport d'analyse avec cppcheck
+
+- make val / make val_xml : compile le programme et analyse ou donne le rapport d'analyse avec valgrind
+
+- make test               : compile le programme et exécute les test unitaires
+
+- make clean              : nettoie le dossier et supprime les exécutables créés
+
+- ./fact -N nthreads input.txt output.txt : lance le programme exécutable fact
+	* nthreads   : le nombre de threads du programme, un entier >= 1
+	* input.txt  : le nom du fichier input ayant des lignes d'entiers compris entre 2 et 2^(31)-1
+	* output.txt : le nom du fichier output qui est créé si il n'existe pas encore
+
+## Architecture du code :
+
+Notre code est découpé en 3 parties : 
+
+1) Lecture  (1 thread ) : lit les lignes du fichier input et en stock les entiers dans le buffer_1
+
+2) Calcul   (n threads) : prend les entiers du buffer_1, calcul la liste des diviseurs premiers de l'entier
+			  et stock cette liste d'entiers dans le buffer_2
+3) Ecriture (1 thread ) : prend les listes d'entiers du buffer_2 et les écrit dans le fichier output
+
+   Les 2 buffers sont protégés par 1 mutex et 2 sémaphores (free et full) chacun
+
+## Bon fonctionnement :
+
+Pour un bon fonctionnement du code, il faut respecter quelque règles :
+
+1) Le fichier input doit être composé de lignes ne comportant que des entiers compris entre 2 et 2^(31)-1
+   avec un seul entier par ligne
+
+2) Le nombre de thread(s) doit être précisé et doit être >= 1
+
+3) Pour un bon fonctionnement de valgrind, il faut que le fichier "example_input.txt" soit dans le même dossier
+   que le Makefile
+
+# Projet_Q4_Groupe_O4 
\ No newline at end of file