%------------------------------------------------------------------------------
% $Id$
%------------------------------------------------------------------------------

\Section{Fichier de configuration du générateur}

\subSection{Description}

Ce fichier contient la liste des paramètres et de leur évolution. C'est-à-dire les valeurs minimales, maximales... Ce fichier n'est utilisé qu'en lecture par les différents outils de \cpu.

Si un concepteur modifie le générateur \cpu et ajoute des paramètres, il devra rajouter une entrée dans ce fichier.

Ce fichier est écrit au format XML.

\subSection{Syntaxe}

\verbatiminput{\dirroot/syntax.gen}

\begin{description}
\item[balise parameters :] {\it (Obligatoire et unique)} Balise englobante.
  \begin{description}
  \item[balise parameter :] {\it (Nombre quelconque d'occurrences)} Décris un paramètre du générateur.
    \begin{description}
    \item[attribut name        :] {\it (Obligatoire)} Nom du paramètre.
    \item[attribut min         :] {\it (Obligatoire si attribut max ou step est présent)} Valeur minimale du paramètre.
    \item[attribut max         :] {\it (Obligatoire si attribut min ou step est présent)} Valeur maximale du paramètre.
    \item[attribut step        :] {\it (Obligatoire si attribut min ou max  est présent)} Pas entre deux valeurs de paramètres (par exemple +1 ou *2).
    \item[attribut default     :] {\it (Obligatoire)} Valeur par défaut de ce paramètre.
    \item[attribut level       :] {\it (Optionnel  )} Niveau requis pour que l'utilisateur puisse voir ce paramètre. Le niveau varie de 0 (paramètre jamais affiché) 1 (affichage de presque aucun des paramètres (mode néophyte) à 5 (affichage de tous les paramètres (mode expert)). La valeur par défaut de cet attribut est 3.
    \item[attribut description :] {\it (Optionnel  )} Description du paramètre. La valeur par défaut de cet attribut est une chaîne vide.
    \end{description}
  \item[balise link :] {\it (Nombre quelconque d'occurrences)} Lien entre deux composants du processeur.
    \begin{description}
    \item[attribut name        :] {\it (Obligatoire)} Nom du paramètre.
    \item[attribut src         :] {\it (Obligatoire)} Source du lien.
    \item[attribut dest        :] {\it (Optionnel  )} Destination du lien. La destination ne doit pas apparaître si c'est un lien binaire (lien présent ou non).
    \item[attribut description :] {\it (Optionnel  )} Description du paramètre. 
    \end{description}
  \end{description}
\end{description}

Si une balise {\it parameter} n'a pas les attributs {\it min}, {\it max} et {\it step}, alors il s'agit d'un paramètre qui a une valeur binaire. Ceci ce traduit comme un paramètre classique avec min=''0'', max=''1'' et step=''+ 1''.

\subSection{Paramètres}

\begin{description}
\item[size\_data                                       :] 
\item[dispatch\_priority                               :]~\\
  \begin{description}
  \item[PRIORITY\_STATIC                               :] Les priorités sont fixes.
  \item[PRIORITY\_ROUND\_ROBIN                         :] L'entité la plus prioritaire devient au cycle suivant l'entité la moins prioritaire.
  \end{description}
\item[dispatch\_load\_balancing                        :]~\\
  \begin{description}
  \item[LOAD\_BALANCING\_BALANCE                       :] Un élément de l'entité la plus prioritaire est servi, suivit des autres entités par ordre de priorité.
  \item[LOAD\_BALANCING\_MAXIMUM\_FOR\_PRIORITY        :] Tous les éléments de l'entité la plus prioritaire sont servis, suivirent des autres entités par ordre de priorité.
  \end{description}
\item[nb\_icache\_port                                 :] 
\item[icache\_access\_priority                         :] 
\item[icache\_access\_load\_balancing                  :] 
\item[nb\_dcache\_port                                 :] 
\item[dcache\_access\_priority                         :] 
\item[dcache\_access\_load\_balancing                  :] 
\item[nb\_thread                                       :] 
\item[size\_ifetch\_queue                              :] 
\item[nb\_inst\_fetch                                  :] 
\item[implement\_group                                 :] 
\item[ras\_size\_queue                                 :] 
\item[upt\_size\_queue                                 :] 
\item[nb\_decod\_bloc                                  :] 
\item[size\_decod\_queue                               :] 
\item[nb\_inst\_decod                                  :] 
\item[nb\_context\_select                              :] 
\item[context\_select\_priority                        :] 
\item[context\_select\_load\_balancing                 :] 
\item[nb\_rename\_bloc                                 :] 
\item[nb\_inst\_insert                                 :] 
\item[nb\_inst\_retire                                 :] 
\item[rename\_select\_priority                         :] 
\item[rename\_select\_load\_balancing                  :] 
\item[rename\_select\_nb\_front\_end\_select           :] 
\item[nb\_general\_register                            :] 
\item[nb\_special\_register                            :] 
\item[nb\_reg\_free                                    :] 
\item[nb\_rename\_unit\_bank                           :] 
\item[size\_read\_counter                              :] 
\item[nb\_read\_bloc                                   :] 
\item[size\_read\_queue                                :] 
\item[size\_reservation\_station                       :] 
\item[nb\_inst\_retire\_reservation\_station           :] 
\item[nb\_write\_bloc                                  :] 
\item[size\_write\_queue                               :] 
\item[size\_execute\_queue                             :] 
\item[nb\_bypass\_write                                :] 
\item[nb\_load\_store\_unit                            :] 
\item[size\_store\_queue                               :] 
\item[size\_load\_queue                                :] 
\item[size\_speculative\_access\_queue                 :] 
\item[nb\_port\_check                                  :] 
\item[speculative\_load                                :]~\\
  \begin{description}
  \item[NO\_SPECULATIVE\_LOAD                          :] Chaque lecture mémoire attend que toutes les écritures mémoires antérieures soient connues avant d'accéder au cache.
  \item[SPECULATIVE\_LOAD\_ACCESS                      :] Chaque lecture mémoire attend que toutes les écritures mémoires antérieures soient connues avant d'écrire le résultat dans le banc de registre. L'accès au cache est préventif.
  \item[SPECULATIVE\_LOAD\_COMMIT                      :] Les instructions mémoires n'attendent pas que toutes les écritures mémoires antérieures soient connues avec d'accéder au cache et d'écrire le résultat dans le banc de registres.
  \item[SPECULATIVE\_LOAD\_BYPASS                      :] Les instructions mémoires n'attendent pas que toutes les écritures mémoires antérieures soient connues avec d'accéder au cache, d'écrire le résultat dans le banc de registres et de transmettre la donnée lue sur le réseau de bypass.
  \end{description}
\item[nb\_bypass\_memory                               :] 
\item[nb\_cache\_port                                  :] 
\item[nb\_inst\_memory                                 :] 
\item[nb\_functionnal\_unit                            :] 
\item[nb\_inst\_functionnal\_unit                      :] 
\item[nb\_front\_end                                   :] 
\item[nb\_context                                      :] 
\item[nb\_decod\_unit                                  :] 
\item[nb\_inst\_branch\_predict                        :] 
\item[nb\_inst\_branch\_decod                          :] 
\item[nb\_inst\_branch\_update                         :] 
\item[btb\_size\_queue                                 :] 
\item[btb\_associativity                               :] 
\item[btb\_size\_counter                               :] 
\item[btb\_victim\_scheme                              :]~\\
  \begin{description}
  \item[VICTIM\_RANDOM                                 :] La victime est choisie de façon aléatoire.
  \item[VICTIM\_ROUND\_ROBIN                           :] La victime est choisie de façon circulaire.
  \item[VICTIM\_NLU                                    :] La victime est choisie de façon aléatoire. Le dernier élément utilisé est un choix invalide.
  \item[VICTIM\_PSEUDO\_LRU                            :] La victime suivant un schéma presque LRU.
  \item[VICTIM\_LRU                                    :] Les éléments sont classés par date d'utilisation. La victime choisie est la moins récemment utilisée.
  \item[VICTIM\_FIFO                                   :] Les éléments sont classés par ordre d'arrivée. La victime choisie est la plus ancienne.
  \end{description}
\item[dir\_predictor\_scheme                           :]~\\
  \begin{description}
  \item[PREDICTOR\_NEVER\_TAKE                         :] Le branchement n'est jamais pris.
  \item[PREDICTOR\_ALWAYS\_TAKE                        :] Le branchement est toujours pris.
  \item[PREDICTOR\_STATIC                              :] Si la destination du branchement se situe avant l'instruction du branchement, alors le branchement est pris.
  \item[PREDICTOR\_LAST\_TAKE                          :] La direction sera la même que la fois précédente. Si c'est la première fois que le branchement est rencontré, alors la prédiction suit le schéma statique.
  \item[PREDICTOR\_COUNTER                             :] Table de compteur indexé par l'adresse du branchement. La direction du branchement est déterminée par le bit de poids fort du compteur.
  \item[PREDICTOR\_LOCAL                               :] Table de compteur indexé par une table d'historique qui est lui-même indexé par l'adresse du branchement.
  \item[PREDICTOR\_GLOBAL                              :] Table de compteur indexé par une table d'historique à une entrée qui est lui-même indexé par l'adresse du branchement.
  \item[PREDICTOR\_META                                :] 3 prédicteurs de branchement : une table de compteur va sélectionner entre la prédiction provenant du prédicteur local ou du prédicteur global. C'est trois prédicteurs sont indexés par l'adresse du branchement.
  \item[PREDICTOR\_CUSTOM                              :] Il s'agit d'un méta prédicteur. Mais les 3 prédicteurs internes sont paramétrables. C'est trois prédicteurs sont indexés par l'adresse du branchement.
  \end{description}
\item[dir\_have\_bht                                   :] 
\item[dir\_bht\_size\_shifter                          :] 
\item[dir\_bht\_nb\_shifter                            :] 
\item[dir\_have\_pht                                   :] 
\item[dir\_pht\_size\_counter                          :] 
\item[dir\_pht\_nb\_counter                            :] 
\item[dir\_pht\_size\_address\_share                   :] 
\item[nb\_ooo\_engine                                  :] 
\item[nb\_rename\_unit                                 :] 
\item[nb\_inst\_issue                                  :] 
\item[nb\_inst\_reexecute                              :] 
\item[nb\_inst\_commit                                 :] 
\item[nb\_inst\_branch\_complete                       :] 
\item[nb\_rename\_unit\_select                         :] 
\item[nb\_execute\_loop\_select                        :] 
\item[size\_re\_order\_buffer                          :] 
\item[nb\_re\_order\_buffer\_bank                      :] 
\item[commit\_priority                                 :] 
\item[commit\_load\_balancing                          :] 
\item[size\_issue\_queue                               :] 
\item[nb\_issue\_queue\_bank                           :] 
\item[issue\_priority                                  :] 
\item[issue\_load\_balancing                           :] 
\item[size\_reexecute\_queue                           :] 
\item[reexecute\_priority                              :] 
\item[reexecute\_load\_balancing                       :] 
\item[nb\_execute\_loop                                :] 
\item[nb\_read\_unit                                   :] 
\item[nb\_execute\_unit                                :] 
\item[nb\_write\_unit                                  :] 
\item[nb\_gpr\_bank                                    :] 
\item[nb\_gpr\_port\_read\_by\_bank                    :] 
\item[nb\_gpr\_port\_write\_by\_bank                   :] 
\item[nb\_spr\_bank                                    :] 
\item[nb\_spr\_port\_read\_by\_bank                    :] 
\item[nb\_spr\_port\_write\_by\_bank                   :] 
\item[execution\_unit\_to\_write\_unit\_priority       :] 
\item[read\_unit\_to\_execution\_unit\_priority        :] 
\item[link\_context\_with\_thread                      :] 
\item[link\_decod\_unit\_with\_decod\_bloc             :] 
\item[link\_rename\_unit\_with\_rename\_bloc           :] 
\item[link\_read\_unit\_with\_read\_bloc               :] 
\item[link\_write\_unit\_with\_write\_bloc             :] 
\item[link\_execute\_unit\_with\_functionnal\_unit     :] 
\item[link\_execute\_unit\_with\_load\_store\_unit     :] 
\item[link\_decod\_bloc\_with\_thread                  :] 
\item[link\_rename\_bloc\_with\_front\_end             :] 
\item[table\_dispatch                                  :] 
\item[link\_read\_bloc\_and\_load\_store\_unit         :] 
\item[link\_read\_bloc\_and\_functionnal\_unit         :] 
\item[link\_write\_bloc\_and\_load\_store\_unit        :] 
\item[link\_write\_bloc\_and\_functionnal\_unit        :] 
\item[link\_load\_store\_unit\_with\_thread            :] 
\item[link\_thread\_and\_functionnal\_unit             :] 
\item[link\_icache\_port\_with\_thread                 :] 
\item[link\_dcache\_port\_with\_load\_store\_unit      :] 
\end{description}

%\subSection{Exemples}

