| | 1 | [[PageOutline]] |
| | 2 | |
| | 3 | |
| | 4 | = La Structure de Données Lofig = |
| | 5 | |
| | 6 | La structure de données {{{Lofig}}} est conçue pour représenter les ''netlists'' |
| | 7 | en 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 |
| | 9 | des fonctions membres. |
| | 10 | |
| | 11 | |
| | 12 | == Fonctions membres de la class Locon == |
| | 13 | |
| | 14 | Les 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 | |
| | 22 | Les accesseurs : |
| | 23 | * {{{std::string getName ();}}} |
| | 24 | * {{{Losig* getSignal ();}}} |
| | 25 | * {{{Lofig* getModel ();}}} |
| | 26 | * {{{Loins* getInstance ();}}} |
| | 27 | * {{{unsigned int getDirection();}}} |
| | 28 | |
| | 29 | Les 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 | |
| | 38 | De plus, le code de trois fonctions membres vous sont fournies pour pouvoir |
| | 39 | afficher l'objet dans un flux. Dans {{{Locon.h}}} : |
| | 40 | {{{ |
| | 41 | class 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 | }}} |
| | 49 | Code de [attachment:Locon-Skeleton.cpp Locon.cpp]. |
| | 50 | |
| | 51 | |
| | 52 | == Fonctions membres de la classe Losig == |
| | 53 | |
| | 54 | Le constructeur : |
| | 55 | * {{{Losig ( Lofig*, const std::string&, unsigned int type );}}} |
| | 56 | |
| | 57 | Les arguments correspondent respectivement à la {{{Lofig}}} auxquel le |
| | 58 | signal appartient, son nom et son type. L'identificateur sera demandé |
| | 59 | directement à la {{{Lofig}}} dans le corps du constructeur. |
| | 60 | |
| | 61 | Les accesseurs : |
| | 62 | * {{{Lofig* getOwner ();}}} |
| | 63 | * {{{std::string& getName ();}}} |
| | 64 | * {{{unsigned int getId ();}}} |
| | 65 | * {{{unsigned int getType ();}}} |
| | 66 | |
| | 67 | Le 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 | |
| | 73 | Le constructeur : |
| | 74 | * {{{Loins ( Lofig* owner, Lofig* model, const std::string& );}}} |
| | 75 | |
| | 76 | __Le destructeur__ : |
| | 77 | * {{{~Loins ()}}} |
| | 78 | |
| | 79 | Il entrainera la destruction de ses connecteurs {{{Locon}}}. |
| | 80 | |
| | 81 | Les arguments sont l'{{{owner}}}, la {{{Lofig}}} ''dans laquelle'' l'instance est |
| | 82 | crée, le {{{model}}}, la {{{Logig}}} ''dont'' on créé une instance et le nom de |
| | 83 | cette instance. Le constructeur se charge de la duplication des connecteurs |
| | 84 | du modèle {{{model}}} dans l'instance. |
| | 85 | |
| | 86 | Les accesseurs : |
| | 87 | * {{{std::string& getName ();}}} |
| | 88 | * {{{Lofig* getModel ();}}} |
| | 89 | * {{{Lofig* getOwner ();}}} |
| | 90 | * {{{std::list<Locon*>& getConnectors ();}}} |
| | 91 | * {{{Locon* getConnector ( const std::string& );}}} |
| | 92 | |
| | 93 | Les modifieurs : |
| | 94 | * {{{bool connect ( const std::string& name, Losig* );}}} |
| | 95 | |
| | 96 | Réalise l'association entre un connecteur ({{{Locon}}}) ''de l'instance'' |
| | 97 | et un signal {{{name}}} (de la {{{Lofig}}} {{{owner}}}). |
| | 98 | |
| | 99 | Le 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 | |
| | 108 | Le constructeur est extrèmement simple, il se contente de positionner le |
| | 109 | nom de la {{{Lofig}}}, tous les autres attributs sont ''vides''. |
| | 110 | |
| | 111 | __Le destructeur__ : |
| | 112 | * {{{~Lofig ()}}} |
| | 113 | |
| | 114 | Il 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 |
| | 119 | comme 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 | |
| | 207 | De plus, le code de deux fonctions membres vous sont fournies pour pouvoir |
| | 208 | afficher l'objet dans un flux. Dans {{{Lofig.h}}} : |
| | 209 | {{{ |
| | 210 | class Lofig { |
| | 211 | public: |
| | 212 | static std::string modeToString ( unsigned int ); |
| | 213 | public: |
| | 214 | void xmlDrive ( std::ostream& ); |
| | 215 | }; |
| | 216 | }}} |
| | 217 | |
| | 218 | Le 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 | |
| | 224 | Cette base de donnée est composées d'objets contenant des pointeurs sur |
| | 225 | différents autres objets. La destruction de l'un de ces objets doit donc |
| | 226 | se faire de façon à préserver la cohérence de la base de données. |
| | 227 | |
| | 228 | Par exemple, la destruction d'un signal ''devrait'' entrainer son retrait |
| | 229 | des différents {{{Locon}}} qui pointent sur lui. De même, la destruction |
| | 230 | d'une {{{Lofig}}} devrait entraîner sa suppression de toutes les listes |
| | 231 | de modèles. |
| | 232 | |
| | 233 | Cette gestion est beaucoup trop compliquée à implanter dans le cadre d'un |
| | 234 | TME, nous ne le ferons donc pas. |
| | 235 | |
| | 236 | En revanche, la fonction {{{Lofig:destroyAll}}} détruisant la totalité |
| | 237 | de la base de données sera implantée. |
| | 238 | |
| | 239 | |
| | 240 | = Travail à réaliser = |
| | 241 | |
| | 242 | Implanter la structure de donnée {{{Lofig}}} à partir la spécification |
| | 243 | ci-dessus. |
| | 244 | |
| | 245 | Pour valider votre travail, il vous est demandé de décrire la ''netlist'' |
| | 246 | ci dessous, représentant un ''full adder'' (brique de base des additionneurs). |
| | 247 | |
| | 248 | [[Image(fulladder-1.png)]] |
| | 249 | |
| | 250 | Un ''full adder'' se décompose en deux ''half adder''. A titre d'exemple, la |
| | 251 | construction du ''half adder'' vous est fournie [attachment:Main-Skeleton.cpp]. |
| | 252 | La représentation compléte du ''full adder'' sous forme de structure {{{Lofig}}} |
| | 253 | est présentée figure 2. |
| | 254 | |
| | 255 | [[Image(fulladder-2.png)]] |
| | 256 | |
| | 257 | |
| | 258 | == La Mini Bibliothèque de Modèles == |
| | 259 | |
| | 260 | La bibliothèque vous fourni trois modèles ({{{Lofig}}}), {{{And2}}}, |
| | 261 | {{{Xor2}}} et {{{Or2}}}. |
| | 262 | |
| | 263 | Interface simplifiée de la bibliothèque : |
| | 264 | {{{ |
| | 265 | class 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 | |
| | 274 | Code de la bibliothèque : |
| | 275 | [attachment:Library.h Library.h] [attachment:Library.cpp Library.cpp] |
| | 276 | |
| | 277 | [[Image(Library-1.png)]] |