| 14 | | constitués d'un ensemble de composants matériels interconnectés par des signaux. Dans notre cas, |
| 15 | | les signaux véhiculent fondamentatement deux tensions VSS et VDD représentant respectivement |
| 16 | | les valeurs Booléennes 0 et 1, mais le simulateur doit traiter plus de valeurs pour gérer |
| 17 | | les cas spéciaux comme les signaux en haute impédance, les conflits électriques, ou les |
| 18 | | valeurs indéfinies. A titre indicatif, le VHDL standard utilise 9 valeurs pour les |
| 19 | | signaux. Pour simplifier, nous nous limiterons dans ce TME aux trois valeurs logiques 0, |
| 20 | | 1, et U (Undefined). |
| | 14 | constitués d'un ensemble de composants matériels interconnectés par des signaux. Dans |
| | 15 | notre cas, les signaux véhiculent fondamentatement deux tensions VSS et VDD représentant |
| | 16 | respectivement les valeurs Booléennes 0 et 1, mais le simulateur doit traiter plus de |
| | 17 | valeurs pour gérer les cas spéciaux comme les signaux en haute impédance, les conflits |
| | 18 | électriques, ou les valeurs indéfinies. A titre indicatif, le VHDL standard utilise 9 |
| | 19 | valeurs pour les signaux. Pour simplifier, nous nous limiterons dans ce TME aux trois |
| | 20 | valeurs logiques 0, 1, et U (Undefined). |
| 35 | | possède donc un seul signal de sortie, et la liste de sensibilité du processus contient tous les |
| 36 | | signaux d'entrée. Cette liste de sensibilité est tout simplement le support de l'EBM, tel |
| 37 | | que vu au TME3. Un réseau Booléen peut être représenté par un graphe biparti orienté comportant |
| 38 | | deux types de noeuds: des '''processus''' et des '''signaux'''. Les noeuds à la périphérie du réseau |
| 39 | | sont toujours des signaux. |
| | 35 | possède donc un seul signal de sortie, et la liste de sensibilité du processus contient |
| | 36 | tous les signaux d'entrée. Cette liste de sensibilité est tout simplement le support de |
| | 37 | l'EBM, tel que vu au TME3. Un réseau Booléen peut être représenté par un graphe biparti |
| | 38 | orienté comportant deux types de noeuds: des '''processus''' et des '''signaux'''. Les |
| | 39 | noeuds à la périphérie du réseau sont toujours des signaux. |
| 101 | | * Méthode {{{addSignal()}}}: ajoute au réseau Booléen un noeud de type ''signal''. On donne le nom |
| 102 | | du signal ainsi que son type (parmis {{{In}}}, {{{Out}}} et {{{Internal}}}. La liste |
| 103 | | des cibles du noeud représentant le signal est initialisée vide. |
| 104 | | * Méthode {{{addProcess()}}}: ajoute au réseau Booléen un noeud de type ''processus''. On donne |
| 105 | | respectivement comme arguments, le nom du ''signal'' cible, l'expression booléenne |
| 106 | | qu'il représente (sous forme textuelle) et le délai de calcul de ce processus. |
| 107 | | |
| 108 | | '''Importante remarque''': les arcs (liste de cibles attachée à chaque noeud source) |
| 109 | | sont construits lors de la création des processus. Il est donc impératif que |
| 110 | | tous les ''signaux'' aient été créés avant de commencer à créer les ''processus''. |
| 111 | | |
| 112 | | La méthode {{{toDot()}}} crée une représentation graphique du réseau booléen. Cette fonction vous est fournie. |
| 113 | | {{{ |
| | 102 | * Méthode {{{addSignal()}}}: ajoute au réseau Booléen un noeud de type ''signal''. On |
| | 103 | donne le nom du signal ainsi que son type (parmis {{{In}}}, {{{Out}}} et |
| | 104 | {{{Internal}}}. La liste des cibles du noeud représentant le signal est initialisée |
| | 105 | vide. |
| | 106 | |
| | 107 | * Méthode {{{addProcess()}}}: ajoute au réseau Booléen un noeud de type ''processus''. |
| | 108 | On donne respectivement comme arguments, le nom du ''signal'' cible, l'expression |
| | 109 | booléenne qu'il représente (sous forme textuelle) et le délai de calcul de ce |
| | 110 | processus. |
| | 111 | |
| | 112 | '''Importante remarque''': les arcs (liste de cibles attachée à chaque noeud source) sont |
| | 113 | construits lors de la création des processus. Il est donc impératif que tous les |
| | 114 | ''signaux'' aient été créés avant de commencer à créer les ''processus''. |
| | 115 | |
| | 116 | La méthode {{{toDot()}}} crée une représentation graphique du réseau booléen. Cette |
| | 117 | fonction vous est fournie. |
| | 118 | |
| | 119 | {{{ |
| | 120 | #!cpp |
| 207 | | Le rôle de l'échéancier (''scheduler'' en anglais) est d'enregistrer et d'ordonner les évènements dans le temps. |
| 208 | | Pour le réaliser nous avons besoin de définr les objets suivants: |
| 209 | | |
| 210 | | * Une date (classe {{{Date}}}) contenant deux informations : le temps physique écoulé depuis le début de la simulation, |
| 211 | | et un temps logique permettant de distinguer deux événements X et Y possédant le même temps physique, |
| 212 | | mais reliés entre eux par une relation de causalité : ceci se produit quand on veut représenter des processus |
| 213 | | dont le temps de propagation est nul. |
| 214 | | * Un événement (classe {{{Event}}}), comportant la date ({{{Date}}}) à laquelle il se |
| | 216 | Le rôle de l'échéancier (''scheduler'' en anglais) est d'enregistrer et d'ordonner les |
| | 217 | évènements dans le temps. Pour le réaliser nous avons besoin de définr les objets |
| | 218 | suivants: |
| | 219 | |
| | 220 | * Une date (classe {{{Date}}}) contenant deux informations : le temps physique écoulé |
| | 221 | depuis le début de la simulation, et un temps logique permettant de distinguer deux |
| | 222 | événements X et Y possédant le même temps physique, mais reliés entre eux par une |
| | 223 | relation de causalité : ceci se produit quand on veut représenter des processus dont le |
| | 224 | temps de propagation est nul. |
| | 225 | |
| | 226 | * Un événement (classe {{{Event}}}), comportant la date ({{{Date}}}) à laquelle il se |
| 216 | | * Une structure permettant de stocker les d'évenements et de |
| 217 | | trier ces événements par dates croissantes. Nous allons pour cela utiliser une |
| 218 | | {{{map<>}}} de {{{vector<>}}}. C'est à dire, une {{{map<>}}} dont chaque élément sera |
| 219 | | un {{{vector<>}}} d'évènements et la clé une date ({{{Date}}}). Deux événements sont synchrones s'ils ont le même temps physique |
| 220 | | '''et''' le même temps logique. L'ordre est sans importance au sein d'un ensemble d'événements synchrones, puisqu'il ne peut pas y avoir |
| 221 | | de relation de causalité entre deux événements synchrones. |
| | 228 | |
| | 229 | * Une structure permettant de stocker les d'évenements et de trier ces événements par |
| | 230 | dates croissantes. Nous allons pour cela utiliser une {{{map<>}}} de {{{vector<>}}}. |
| | 231 | C'est à dire, une {{{map<>}}} dont chaque élément sera un {{{vector<>}}} d'évènements |
| | 232 | et la clé une date ({{{Date}}}). Deux événements sont synchrones s'ils ont le même |
| | 233 | temps physique '''et''' le même temps logique. L'ordre est sans importance au sein d'un |
| | 234 | ensemble d'événements synchrones, puisqu'il ne peut pas y avoir de relation de |
| | 235 | causalité entre deux événements synchrones. |
| 248 | | * Lors d'un parcours de la |
| 249 | | {{{map<>}}} avec des itérateurs, les éléments sont parcourus ''dans l'ordre défini par |
| 250 | | la relation d'ordre de la clé'', c'est à dire dans notre cas, l'ordre chronologique des dates croissantes. |
| | 264 | * Lors d'un parcours de la {{{map<>}}} avec des itérateurs, les éléments sont parcourus |
| | 265 | ''dans l'ordre défini par la relation d'ordre de la clé'', c'est à dire dans notre cas, |
| | 266 | l'ordre chronologique des dates croissantes. |
| 271 | | inline Date ( unsigned int time, unsigned int delta ); |
| 272 | | inline unsigned int getTime () const; |
| 273 | | inline unsigned int getDelta () const; |
| 274 | | friend bool operator< ( const Date& lhs, const Date& rhs ); |
| | 288 | inline Date ( unsigned int time, unsigned int delta ); |
| | 289 | inline unsigned int getTime () const; |
| | 290 | inline unsigned int getDelta () const; |
| | 291 | friend bool operator< ( const Date& lhs, const Date& rhs ); |