Changes between Initial Version and Version 1 of 2011CaoTme45


Ignore:
Timestamp:
Mar 10, 2011, 1:25:46 PM (14 years ago)
Author:
jpc
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • 2011CaoTme45

    v1 v1  
     1[[PageOutline]]
     2
     3
     4= La Structure de Données Lofig =
     5
     6La structure de données {{{Lofig}}} est conçue pour représenter les ''netlists''
     7en mémoire. Les attributs des différents objets constituants cette structure ont
     8été présentés en cours. Nous allons maintenant compléter avec les déclarations
     9des fonctions membres.
     10
     11
     12== Fonctions membres de la class Locon ==
     13
     14Les constructeurs :
     15 * Un {{{Locon}}} peut appartenir, soit à un modèle ({{{Lofig}}}), soit à une
     16   instance ({{{Loins}}}). Il y aura donc deux constructeurs correspondants à
     17   chacune de ces possibilités. On fournit en outre son nom et sa direction.
     18   Le type sera déduit à partir du constructeur appelé.
     19   * {{{Locon ( Lofig*, const std::string& name, unsigned int dir );}}}
     20   * {{{Locon ( Loins*, const std::string& name, unsigned int dir );}}}
     21
     22Les accesseurs :
     23 * {{{std::string   getName     ();}}}
     24 * {{{Losig*        getSignal   ();}}}
     25 * {{{Lofig*        getModel    ();}}}
     26 * {{{Loins*        getInstance ();}}}
     27 * {{{unsigned int  getDirection();}}}
     28
     29Les modificateurs (''mutators'', en VO) :
     30 * Un {{{Locon}}} peut (doit) être associé à un signal. On pourra le faire de
     31   deux façons différentes, soit en donnant explicitement un pointeur sur le
     32   {{{Losig}}}, soit en indiquant simplement le nom du signal.
     33   * {{{void  setSignal ( Losig* );}}}
     34   * {{{void  setSignal ( const std::string& );}}}
     35 * Positionnement de la direction :
     36   * {{{void  setDirection ( unsigned int );}}}
     37
     38De plus, le code de trois fonctions membres vous sont fournies pour pouvoir
     39afficher l'objet dans un flux. Dans {{{Locon.h}}} :
     40{{{
     41class Locon {
     42  public:
     43    static std::string   typeToString ( unsigned int );
     44    static std::string   dirToString  ( unsigned int );
     45  public:
     46           void          xmlDrive     ( std::ostream& );
     47};
     48}}}
     49Code de [attachment:Locon-Skeleton.cpp Locon.cpp].
     50
     51
     52== Fonctions membres de la classe Losig ==
     53
     54Le constructeur :
     55 * {{{Losig ( Lofig*, const std::string&, unsigned int type );}}}
     56
     57Les arguments correspondent respectivement à la {{{Lofig}}} auxquel le
     58signal appartient, son nom et son type. L'identificateur sera demandé
     59directement à la {{{Lofig}}} dans le corps du constructeur.   
     60
     61Les accesseurs :
     62 * {{{Lofig*        getOwner ();}}}
     63 * {{{std::string&  getName  ();}}}
     64 * {{{unsigned int  getId    ();}}}
     65 * {{{unsigned int  getType  ();}}}
     66
     67Le code de la fonction utilitaire d'affichage dans un flux :
     68[attachment:Losig-Skeleton.cpp]
     69
     70
     71== Fonctions membres de la classe Loins ==
     72
     73Le constructeur :
     74 * {{{Loins ( Lofig* owner, Lofig* model, const std::string& );}}}
     75
     76__Le destructeur__ :
     77 * {{{~Loins ()}}}
     78
     79Il entrainera la destruction de ses connecteurs {{{Locon}}}.
     80
     81Les arguments sont l'{{{owner}}}, la {{{Lofig}}} ''dans laquelle'' l'instance est
     82crée, le {{{model}}}, la {{{Logig}}} ''dont'' on créé une instance et le nom de
     83cette instance. Le constructeur se charge de la duplication des connecteurs
     84du modèle {{{model}}} dans l'instance.
     85
     86Les accesseurs :
     87 * {{{std::string&       getName       ();}}}
     88 * {{{Lofig*             getModel      ();}}}
     89 * {{{Lofig*             getOwner      ();}}}
     90 * {{{std::list<Locon*>& getConnectors ();}}}
     91 * {{{Locon*             getConnector  ( const std::string& );}}}
     92
     93Les modifieurs :
     94  * {{{bool  connect ( const std::string& name, Losig* );}}}
     95
     96Réalise l'association entre un connecteur ({{{Locon}}}) ''de l'instance''
     97et un signal {{{name}}} (de la {{{Lofig}}} {{{owner}}}).
     98
     99Le code de la fonction utilitaire d'affichage dans un flux :
     100[attachment:Loins-Skeleton.cpp]
     101
     102
     103== Fonctions membres de la classe Lofig ==
     104
     105__Le constructeur__ :
     106 * {{{Lofig ( const std::string& );}}}
     107
     108Le constructeur est extrèmement simple, il se contente de positionner le
     109nom de la {{{Lofig}}}, tous les autres attributs sont ''vides''.
     110
     111__Le destructeur__ :
     112 * {{{~Lofig ()}}}
     113
     114Il entrainera la destruction~:
     115 * De ses instances.
     116 * De ses signaux.
     117 * De ses connecteurs.
     118''Mais pas'' de ses modèles, qui sont autant de {{{Lofig}}} pouvant apparaître
     119comme modèles dans d'autres {{{Lofig}}}
     120
     121__Les accesseurs__ :
     122 * {{{unsigned int       getMode         ();}}}
     123 * {{{const std::string& getName         ();}}}
     124 * {{{std::list<Lofig*>& getModels       ();}}}
     125 * {{{std::list<Locon*>& getConnectors   ();}}}
     126 * {{{std::list<Loins*>& getInstances    ();}}}
     127 * {{{std::list<Losig*>& getSignals      ();}}}
     128
     129__Les modificateurs__ :
     130 * {{{setMode ( unsigned int );}}}
     131
     132__Les modificateurs relatifs aux modèles__ :
     133 * Ajoute un nouveau modèle, soit en donnant directement sa {{{Lofig}}}, soit
     134   par nom. On n'ajoutera pas un modèle s'il est déjà présent.
     135   * {{{void   addModel    ( const std::string& );}}}
     136   * {{{void   addModel    ( Lofig* );}}}
     137 * Retrait d'un modèle de la liste. Mêmes variantes que pour l'ajout.
     138   * {{{void   removeModel ( const std::string& );}}}
     139   * {{{void   removeModel ( Lofig* );}}}
     140 * Recherche d'un modèle par son nom. S'il n'est pas trouvé, la fonction
     141   renverra {{{NULL}}}.
     142   * {{{Lofig* findModel   ( const std::string& );}}}
     143
     144__Les modificateurs relatifs aux connecteurs__ :
     145 * Ajoute un nouveau connecteur à la {{{Losig}}}. On doit fournir son nom, sa
     146   direction ainsi que le signal auquel il est relié. Cela implique que l'on
     147   créé les signaux ''avant'' les connecteurs.
     148   * {{{void   addConnector    ( const std::string&, unsigned int dir, Losig* );}}}
     149 * Suppression d'un connecteur, soit directement par un pointeur sur le {{{Locon}}},
     150   soit par nom.
     151   * {{{void   removeConnector ( const std::string& );}}}
     152   * {{{void   removeConnector ( Locon* );}}}
     153 * Recherche d'un connecteur par son nom.
     154   * {{{Locon* findConnector   ( const std::string& );}}}
     155 * Réalisation d'une connexion. La première version correspond à la (re)connexion
     156   d'un signal sur un {{{Locon}}} du modèle. La seconde version à la connexion
     157   d'un {{{Locon}}} d'une instance (référencé par son nom {{{conName}}}) à un
     158   signal du modèle référencé par son nom {{{sigName}}}.
     159   * {{{bool   connect         ( const std::string& conName, const std::string& sigName );}}}
     160   * {{{bool   connect         ( const std::string& insName, const std::string& conName, const std::string& sigName );}}}
     161
     162__Les modificateurs relatifs aux instances__ :
     163 * Ajout d'une nouvelle instance. La première variante non seulement ajoute l'instance, mais
     164   aussi la créé (l'alloue par appel au constructeur de {{{Loins}}}). Dans le second cas on
     165   dispose déjà de l'instance. Dans les deux cas on effectuera une vérification de cohérence
     166   pour empécher la création de deux instances de même nom.
     167   * {{{void   addInstance     ( const std::string& modelName, const std::string& insName );}}}
     168   * {{{void   addInstance     ( Lofig*, const std::string& insName );}}}
     169 * Supprime une instance du modèle.
     170   * {{{void   removeInstance  ( const std::string& );}}}
     171   * {{{void   removeInstance  ( Loins* );}}}
     172 * Cherche une instance par son nom.
     173   * {{{Loins* findInstance    ( const std::string& );}}}
     174 * Retourne {{{true}}} si l'instance pointée appartient bien à ce modèle.
     175   * {{{bool   hasInstance     ( Loins* );}}}
     176
     177__Les modificateurs relatifs aux signaux__ :
     178 * Ajout d'un signal. Faire une vérification de cohérence, on ne doit pas
     179   avoir deux signaux de même nom.
     180   * {{{void         addSignal    ( const std::string&, unsigned int type );}}}
     181 * Destruction d'un signal, par nom ou diectement par pointeur.
     182   * {{{void         removeSignal ( const std::string& );}}}
     183   * {{{void         removeSignal ( Losig* );}}}
     184 * Recherche d'un signal, par nom ou par identificateur. Si le signal
     185   n'existe pas, renvoyer {{{NULL}}}.
     186   * {{{Losig*       findSignal   ( const std::string& );}}}
     187   * {{{Losig*       findSignal   ( unsigned int id );}}}
     188 * Renvoie un nouvel identificateur de signal. Il doit avoir la garentie
     189   d'être unique.
     190   * {{{unsigned int _newSignalId ();}}}
     191
     192
     193__Fonctions statiques__ :
     194 * Retourne la liste de toutes les {{{Lofig}}} présentent en mémoire.
     195   * {{{static  std::list<Lofig*>& getAll          ();}}}
     196 * Recherche une {{{Lofig}}} dans la liste générale.
     197   * {{{static  Lofig*             findFromAll     ( const std::string& );}}}
     198 * Désalloue la totalité des {{{Lofig}}}.
     199   * {{{static  void               destroyAll      ();}}}
     200 * Ajoute une {{{Lofig}}} à la liste générale (vérifier l'unicité).
     201   * {{{static  void               _addToAll       ( Lofig* );}}}
     202 * Retire une {{{Lofig}}} de la liste générale (par nom ou directement par
     203   pointeur).
     204   * {{{static  void               _removeFromAll  ( Lofig* );}}}
     205   * {{{static  void               _removeFromAll  ( const std::string& );}}}
     206
     207De plus, le code de deux fonctions membres vous sont fournies pour pouvoir
     208afficher l'objet dans un flux. Dans {{{Lofig.h}}} :
     209{{{
     210class Lofig {
     211  public:
     212    static std::string   modeToString ( unsigned int );
     213  public:
     214           void          xmlDrive     ( std::ostream& );
     215};
     216}}}
     217
     218Le code de la fonction utilitaire d'affichage dans un flux :
     219[attachment:Lofig-Skeleton.cpp]
     220
     221
     222== Destruction de la Base de Données ==
     223
     224Cette base de donnée est composées d'objets contenant des pointeurs sur
     225différents autres objets. La destruction de l'un de ces objets doit donc
     226se faire de façon à préserver la cohérence de la base de données.
     227
     228Par exemple, la destruction d'un signal ''devrait'' entrainer son retrait
     229des différents {{{Locon}}} qui pointent sur lui. De même, la destruction
     230d'une {{{Lofig}}} devrait entraîner sa suppression de toutes les listes
     231de modèles.
     232
     233Cette gestion est beaucoup trop compliquée à implanter dans le cadre d'un
     234TME, nous ne le ferons donc pas.
     235
     236En revanche, la fonction {{{Lofig:destroyAll}}} détruisant la totalité
     237de la base de données sera implantée.
     238
     239
     240= Travail à réaliser =
     241
     242Implanter la structure de donnée {{{Lofig}}} à partir la spécification
     243ci-dessus.
     244
     245Pour valider votre travail, il vous est demandé de décrire la ''netlist''
     246ci dessous, représentant un ''full adder'' (brique de base des additionneurs).
     247
     248[[Image(fulladder-1.png)]]
     249
     250Un ''full adder'' se décompose en deux ''half adder''. A titre d'exemple, la
     251construction du ''half adder'' vous est fournie [attachment:Main-Skeleton.cpp].
     252La représentation compléte du ''full adder'' sous forme de structure {{{Lofig}}}
     253est présentée figure 2.
     254
     255[[Image(fulladder-2.png)]]
     256
     257
     258== La Mini Bibliothèque de Modèles ==
     259
     260La bibliothèque vous fourni trois modèles ({{{Lofig}}}), {{{And2}}},
     261{{{Xor2}}} et {{{Or2}}}.
     262
     263Interface simplifiée de la bibliothèque :
     264{{{
     265class Library {
     266  public:
     267    enum ModelType { And2=0, Or2, Xor2, ModelTypeSize };
     268  public:
     269    static void     destroy     ();
     270    static Lofig*   getModel    ( unsigned int modelType );
     271};
     272}}}
     273
     274Code de la bibliothèque :
     275[attachment:Library.h Library.h] [attachment:Library.cpp Library.cpp]
     276
     277[[Image(Library-1.png)]]