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