%------------------------------------------------------------------------------
% $Id: document-morpheo-vhdl_generation-fr-04_vhdl_structural.tex 113 2009-04-14 18:39:12Z 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}.

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

\subSection{Ajout d'une instance}

\begin{enumerate}
\item Dans le fichier Component.h : inclure la définition de la classe désirée.
\lstparam{C++}
\begin{lstlisting}
#include "Behavioural/Generic/Queue/include/Queue.h"
\end{lstlisting}

\item Dans le fichier Component.h : déclaré les paramètres et le component
\lstparam{C++}
\begin{lstlisting}
  morpheo::behavioural::generic::queue::Parameters * _param_queue;
  morpheo::behavioural::generic::queue::Queue      * _component_queue;
\end{lstlisting}

\item Dans le fichier Component\_allocation.cpp : creer les paramètres du modèle.
\lstparam{C++}
\begin{lstlisting}
  _param_queue = new morpheo::behavioural::generic::queue::Parameters
      (16, //size_queue
       32);//size_data 
\end{lstlisting}
\item Dans le fichier Component\_allocation.cpp : creer le modèle
\lstparam{C++}
\begin{lstlisting}
    std::string queue_name = _name + "_queue";

    _component_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 Dans le fichier Component\_allocation.cpp : inclure le modèle dans la liste des composants internes
\lstparam{C++}
\begin{lstlisting}
    _component->set_component(_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 Dans le fichier Makefile.deps : ajouter les dépendances du 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}
\item Dans le fichier Component\_deallocation.cpp : détruire les modèles et leurs paramètres.
\lstparam{C++}
\begin{lstlisting}
  delete _component_queue;
  delete _param_queue;
\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}

