%------------------------------------------------------------------------------
% $Id: document-morpheo-vhdl_generation-fr-04_vhdl_structural.tex 100 2009-01-08 13:06:27Z rosiere $
%------------------------------------------------------------------------------

\Section{VHDL : structurelle}\label{vhdl_structural}

\subSection{Description du fichier {\it Component\_vhdl.cpp}}
Les modèles systemC structurels sont des modèles qui instancient d'autres modèles. Il n'y a pas de description comportementale. Ces modèles sont générés automatiquement. 
Par contre, les modèles systemC comportementaux peuvent être décrit par un modèle VHDL mixte (incluant une description comportementale et des instances d'autre composant).

Les modèles génériques sont dans le répertoire {\it IPs/systemC/processor/Morpheo/Behavioural/Generic}.

\lstparam{C++}
\begin{lstlisting}[caption={Component\_vhdl.cpp}, label=component_vhdl.cpp]
  void component::vhdl (void)
  {
    Vhdl * vhdl = new Vhdl (_name);

    _interfaces->set_port(vhdl);
    _component->vhdl_instance(vhdl);

    vhdl_declaration (vhdl);
    vhdl_body        (vhdl);

    vhdl->generate_file();

    delete vhdl;
  };
\end{lstlisting}


La première étape est d'éditer le fichier {\it Component\_vhdl.cpp}. Le listing \ref{component_vhdl.cpp} représente le contenu de ce fichier. 
\begin{itemize}
\item Ligne 3 : Déclaration et construction de la variable {\it vhdl} qui est du  type {\it Vhdl}.
\item Ligne 5 : Ajout dans le modèle VHDL des interfaces présentes dans le modèle SystemC. (cf fichiers Component.h).
\item Ligne 6 : Ajout dans le modèle VHDL des composants internes  dans le modèle SystemC. (cf fichiers Component.h et Component\_allocation.cpp).
\item Ligne 8 : Ajout dans le modèle VHDL des déclarations définit dans le fichiers Component\_vhdl\_declaration.cpp (cf section \ref{vhdl_declaration}).
\item Ligne 9 : Ajout dans le modèle VHDL de la description comportemental définit dans le fichiers Component\_vhdl\_body.cpp (cf section \ref{vhdl_body}).
\item Ligne 11 : Génération des fichiers VHDL. Le nom du fichier est construit à partir du nom fourni lors de la construction de la variable {\it vhdl}.
\item Ligne 13 : Destruction de l'objet. 
\end{itemize}

Pour la suite, nous allons supposer l'instanciation d'une FIFO.

\subSection{Ajout d'une instance}

Dans le fichier Component\_vhdl.cpp :
\begin{enumerate}
\item Inclure la définition de la classe désirée.
\lstparam{C++}
\begin{lstlisting}
#include "Behavioural/Generic/Queue/include/Queue.h"
\end{lstlisting}
\item Creer les paramètres du modèle.
\lstparam{C++}
\begin{lstlisting}
    morpheo::behavioural::generic::queue::Parameters * param_queue;
    param_queue = new morpheo::behavioural::generic::queue::Parameters
      (16, //size_queue
       32);//size_data 
\end{lstlisting}
\item Creer le modèle
\lstparam{C++}
\begin{lstlisting}
    morpheo::behavioural::generic::queue::Queue      * queue;
    std::string queue_name = _name + "_queue";

    queue = new morpheo::behavioural::generic::queue::Queue
      (queue_name.c_str() // nom du modèle
#ifdef STATISTICS
       ,NULL              // Pas paramètres pour les statistiques
#endif
       ,param_queue       // Paramètres de la file
       ,USE_VHDL);        // Utilisation du modèle VHDL
\end{lstlisting}
\item Inclure le modèle dans la liste des composants internes
\lstparam{C++}
\begin{lstlisting}
    _component->set_component(queue->_component
#ifdef POSITION
                              , 20, 20, 20, 20   
                              // Coordonée pour l'outil de visualisation
#endif
                              , INSTANCE_LIBRARY 
                              // Instancier uniquement les librairies
                              );
\end{lstlisting}
\item indiquer dans le fichier Makefile.deps que le composant dépend de ce modèle. 
\lstparam{make}
\begin{lstlisting}
# Inclure les dépendances
ifndef Queue
include  $(DIR_MORPHEO)/Behavioural/Generic/Queue/Makefile.deps
endif

# Inclure les librairies
Component_LIBRARY       = -lComponent     \
                          $(Queue_LIBRARY)

# Les chemins vers les librairies
Component_DIR_LIBRARY   = -L$(Component_DIR)/lib  \
                          $(Queue_DIR_LIBRARY)

# Construction de la librairie ``Component''
Component_library       :
                        @\
                        $(MAKE) Queue_library; \
                        $(MAKE) --directory=$(Component_DIR) --makefile=Makefile;

# Effacement des fichiers générés
Component_library_clean :
                        @\
                        $(MAKE) Queue_library_clean; \
                        $(MAKE) --directory=$(Component_DIR) --makefile=Makefile clean;
\end{lstlisting}
\end{enumerate}

\subSection{Instanciation}
L'instanciation ce fait comme avec des composants VHDL classiques :
\lstparam{C++}
\begin{lstlisting}
    vhdl->set_comment(0,"");
    vhdl->set_comment(0,"-----------------------------------");
    vhdl->set_comment(0,"-- Instance queue                  ");
    vhdl->set_comment(0,"-----------------------------------");
    vhdl->set_comment(0,"");

    vhdl->set_body   (0,"instance_"+_name+"_queue : "+_name+"_queue");
    vhdl->set_body   (0,"port map (");
    vhdl->set_body   (1,"  in_CLOCK       \t=>\t      in_CLOCK ");
    vhdl->set_body   (1,", in_NRESET      \t=>\t      in_NRESET");
    vhdl->set_body   (1,", in_INSERT_VAL  \t=>\tinternal_QUEUE_INSERT_VAL");
    vhdl->set_body   (1,",out_INSERT_ACK  \t=>\tinternal_QUEUE_INSERT_ACK");
    vhdl->set_body   (1,", in_INSERT_DATA \t=>\tinternal_QUEUE_INSERT_DATA");
    vhdl->set_body   (1,",out_RETIRE_VAL  \t=>\tinternal_QUEUE_RETIRE_VAL");
    vhdl->set_body   (1,", in_RETIRE_ACK  \t=>\tinternal_QUEUE_RETIRE_ACK");
    vhdl->set_body   (1,",out_RETIRE_DATA \t=>\tinternal_QUEUE_RETIRE_DATA");
    vhdl->set_body   (0,");");
\end{lstlisting}
