| 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)]] |