Changes between Version 4 and Version 5 of CaoCourseTme7
- Timestamp:
- Mar 22, 2007, 12:35:38 PM (18 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
CaoCourseTme7
v4 v5 49 49 }}} 50 50 51 = B) Structures de données =51 = A) Structures de données = 52 52 53 53 On utilise deux structures de données : … … 55 55 * structure représentant l'échéancier, c'est à dire l'ensemble ordonné des événements. 56 56 57 == B1) Le réseau Booléen ==57 == A1) Le réseau Booléen == 58 58 59 59 Le réseau Booléen est constitué d'un ensemble de signaux et d'un ensemble de processus. … … 104 104 }}} 105 105 106 == B2) L’échéancier ==106 == A2) L’échéancier == 107 107 108 108 L'échéancier permet d'enregistrer et d'ordonner les événements dans le temps. … … 131 131 }}} 132 132 133 = B /Fonctions d'accès aux structures de données =133 = B) Fonctions d'accès aux structures de données = 134 134 135 135 On présente ici les différentes fonctions permettant d’accéder aux structures de données définies ci-dessus. … … 139 139 Dans un deuxième temps, il vous sera demandé d’écrire vous-même le code de ces fonctions. 140 140 141 == B1) réseau Booléen ==141 == B1) construction réseau Booléen == 142 142 143 143 {{{ … … 161 161 et qu'un signal de type OUT ne peut apparaître dans le support d'une fonction. 162 162 163 == B2) Echéancier ==163 == B2) construction échéancier == 164 164 {{{ 165 165 scheduler_t * cons_scheduler() … … 175 175 '''Attention''' : Cette fonction ne doit être utilisée que dans la phase d’initialisation, pour introduire dans l’échéancier 176 176 les événements portant sur les signaux d’entrée du circuit (stimuli). 177 178 == B3) simulation == 177 179 {{{ 178 180 void add_event (scheduler_t * sch, signal_t sig, long delta, unsigned val) … … 188 190 bip_t * get_events (scheduler_t * sch) 189 191 }}} 190 Cette fonction recherche dans l'échéancier les événements prévus au temps TC. Il peut y avoir plusieurs événements à la même date. Elle renvoie ces événements sous forme d'une liste chaînée de bi-pointeurs (qu'il faut penser à libérer quand ils ne sont plus utiles).191 192 C8) Progression du temps simulé 193 192 Cette fonction recherche dans l'échéancier les événements prévus au temps TC. 193 Il peut y avoir plusieurs événements à la même date. Elle renvoie ces événements sous forme d'une liste chaînée de bi-pointeurs 194 (qu'il faut penser à libérer quand ils ne sont plus utiles). 195 {{{ 194 196 unsigned update_tc(scheduler_t * sch) 195 196 Cette fonction modifie la valeur de la variable TC en lui donnant la valeur de la date du premier événement strictement postérieur au temps courant. Elle met à jour le pointeur CURRENT de l’échéancier. Cette fonction renvoie la valeur 0 quand elle ne trouve pas d’événement postérieur au temps courant, ce qui correspond à la fin de la simulation. Cette valeur doit donc être testée à chaque itération de la boucle de simulation. 197 198 C9) Mise à jour des signaux 199 197 }}} 198 Cette fonction modifie la valeur de la variable TC en lui donnant la valeur de la date du premier événement strictement postérieur au temps courant. 199 Elle met à jour le pointeur CURRENT de l’échéancier. 200 Cette fonction renvoie la valeur 0 quand elle ne trouve pas d’événement postérieur au temps courant, 201 ce qui correspond à la fin de la simulation. Cette valeur doit donc être testée à chaque itération de la boucle de simulation. 202 {{{ 200 203 bip_t * update_signals ( bip_t * events) 201 202 Cette fonction prend pour argument un pointeur sur une liste de signaux (liste de bipointeurs). Elle modifie la valeur des variables Booléennes associées à chacun des signaux pour lesquels il existe un événement. Elle rend la liste des signaux qui ont été modifiés (une autre liste de bipointeurs, qu’il faudra également libérer quand ils ne seront plus utilisés).203 204 C10) Récupération des processus à évaluer 205 204 }}} 205 Cette fonction prend pour argument un pointeur sur une liste de signaux (liste de bipointeurs). 206 Elle modifie la valeur des variables Booléennes associées à chacun des signaux pour lesquels il existe un événement. 207 Elle rend la liste des signaux qui ont été modifiés (une autre liste de bipointeurs, qu’il faudra également libérer quand ils ne seront plus utilisés). 208 {{{ 206 209 bip_t * get_processes (boolnet_t * bn, bip_t * signals) 207 208 Cette fonction prend comme argument un pointeur sur le réseau Booléen, et une liste de signaux, et elle renvoie un pointeur sur une autre liste contenant l’ensemble de tous les processus ayant au moins un signal d’entrée appartenant à l’ensemble signals. (ici encore, il faut penser à libérer la mémoire occupée par les bi-pointeurs quand ils ne sont plus utiles). 209 210 C11) Evaluation d’un process 211 210 }}} 211 Cette fonction prend comme argument un pointeur sur le réseau Booléen, et une liste de signaux, 212 et elle renvoie un pointeur sur une autre liste contenant l’ensemble de tous les processus ayant 213 au moins un signal d’entrée appartenant à l’ensemble signals. 214 (ici encore, il faut penser à libérer la mémoire occupée par les bi-pointeurs quand ils ne sont plus utiles). 215 {{{ 212 216 void eval_processes( scheduler_t * sch, bip_t * p) 213 214 Cette fonction prend pour argument une liste de processus, ainsi qu’un pointeur sur le scheduler, et évalue la valeur du signal de sortie pour chacun des processus de la liste, en fonction des valeurs des signaux d’entrée. Elle utilise pour cela une version de la fonction eval_abl() modifiée pour traiter une logique à trois valeurs (0,1,U). Elle compare la valeur future du signal de sortie à sa valeur présente, et insère un événement dans l’échéancier si cette valeur change (en utilisant la fonction add_event). 215 216 D/ Travail à réaliser 217 }}} 218 Cette fonction prend pour argument une liste de processus, ainsi qu’un pointeur sur le scheduler, 219 et évalue la valeur du signal de sortie pour chacun des processus de la liste, en fonction des valeurs des signaux d’entrée. 220 Elle utilise pour cela une version de la fonction eval_abl() modifiée pour traiter une logique à trois valeurs (0,1,U). 221 Elle compare la valeur future du signal de sortie à sa valeur présente, et insère un événement dans l’échéancier 222 si cette valeur change (en utilisant la fonction add_event). 223 224 = C) Construction du réseau Booléen = 217 225 218 226 On se propose de simuler le schéma suivant, qui réalise un additionneur 2 bits. … … 220 228 221 229 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 D1) Construction du réseau Booléen 242 243 Utiliser les fonctions cons_boolnet(), cons_process() et cons_signal() pour construire en mémoire le réseau Booléen correspondant au circuit-ci-dessus. On prendra une valeur de 1 ns pour le temps de propagation de la porte NAND2, et de 2 ns pour la porte XOR2. Ecrire, compiler et exécuter le programme main() qui construit le réseau Booléen. Pour vérifier la structure du réseau Booléen, on pourra utiliser la fonction : 230 Utiliser les fonctions cons_boolnet(), cons_process() et cons_signal() pour construire en mémoire 231 le réseau Booléen correspondant au circuit-ci-dessus. 232 On prendra une valeur de 1 ns pour le temps de propagation de la porte NAND2, et de 2 ns pour la porte XOR2. 233 Ecrire, compiler et exécuter le programme main() qui construit le réseau Booléen. 234 Pour vérifier la structure du réseau Booléen, on pourra utiliser la fonction : 244 235 245 236 void drive_boolnet(dotfmt_t format, boolnet_t *bn) … … 249 240 enum dotfmt_t { GIF , PS } 250 241 251 D2) Construction et initialisation de l’échéancier 242 = D) Construction et initialisation de l’échéancier = 252 243 253 244 Complêter le programme main() de la question D1 pour créer l’échéancier et initialiser les événements sur les signaux d’ entrée a0, b0, c0, a1 et b1 de façon à respecter le chronogramme suivant . On utilisera les fonctions cons-scheduler() et add_event(). Attention : le passage de la valeur U (indéfinie) à une valeur 0 ou 1 constitue un événement : Dans ce chronogramme, il y a donc un événement sur tous les signaux d’entrée au temps T = 0. … … 262 253 263 254 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 D3) Ecriture de la boucle de simulation 255 = E) Ecriture de la boucle de simulation = 286 256 287 257 Ecrire la boucle fonction principale de simulation qui enchaîne les phases “update” et “exécute” présentées en cours. 288 258 {{{ 289 259 void simulate (boolnet_t * bn, scheduler_t * sch) 290 260 }}} 291 261 On utilisera pour cela les fonctions get_events(), update_tc(), update_signals(), get_process() et eval_process(). 292 293 On sauvera le contenu de l’échéancier en sortie de la boucle de simulation en utilisant la fonction drive_scheduler(), de façon à visualiser le chronogramme avec l’outil XPAT. 294 295 D4) Ecriture des fonctions d’accès 296 297 Ecrivez vous-même le code des 11 fonctions d’accès aux structures de données du simulateur décrites dans la section C, et introduire progressivement votre code à la place des fichiers .o qui vous ont été fournis. 262 On sauvera sur disque le contenu de l’échéancier en sortie de la boucle de simulation en utilisant la fonction drive_scheduler(), 263 de façon à visualiser le chronogramme avec l’outil XPAT. 264 265 = F) Ecriture des fonctions d’accès = 266 267 Ecrivez vous-même le code des 11 fonctions d’accès aux structures de données du simulateur décrites 268 dans la section B, et introduire progressivement votre code à la place des fichiers .o qui vous ont été fournis.