Changes between Version 4 and Version 5 of CaoCourseTme7


Ignore:
Timestamp:
Mar 22, 2007, 12:35:38 PM (18 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • CaoCourseTme7

    v4 v5  
    4949}}}
    5050
    51 = B) Structures de données =
     51= A) Structures de données =
    5252
    5353On utilise deux structures de données :
     
    5555 * structure représentant l'échéancier, c'est à dire l'ensemble ordonné des événements.
    5656 
    57 == B1) Le réseau Booléen ==
     57== A1) Le réseau Booléen ==
    5858
    5959Le réseau Booléen est constitué d'un ensemble de signaux et d'un ensemble de processus.
     
    104104}}}
    105105
    106 == B2) L’échéancier ==
     106== A2) L’échéancier ==
    107107
    108108L'échéancier permet d'enregistrer  et d'ordonner les événements dans le temps.
     
    131131}}}
    132132
    133 = B/ Fonctions d'accès aux structures de données =
     133= B) Fonctions d'accès aux structures de données =
    134134
    135135On présente ici les différentes fonctions permettant d’accéder aux structures de données définies ci-dessus.
     
    139139 Dans un deuxième temps, il vous sera demandé d’écrire vous-même le code de ces fonctions.
    140140
    141 == B1) réseau Booléen ==
     141== B1) construction réseau Booléen ==
    142142
    143143{{{
     
    161161et qu'un signal de type OUT ne peut apparaître dans le support d'une fonction.
    162162
    163 == B2) Echéancier ==
     163== B2) construction échéancier ==
    164164{{{
    165165scheduler_t * cons_scheduler()
     
    175175'''Attention''' : Cette fonction ne doit être utilisée que dans la phase d’initialisation, pour introduire dans l’échéancier
    176176les événements portant sur les signaux d’entrée du circuit (stimuli).
     177
     178== B3) simulation ==
    177179{{{
    178180void add_event (scheduler_t * sch, signal_t sig, long delta, unsigned val)
     
    188190bip_t * get_events (scheduler_t * sch)
    189191}}}
    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 
     192Cette fonction recherche dans l'échéancier les événements prévus au temps TC.
     193Il 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{{{
    194196unsigned 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}}}
     198Cette 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.
     199Elle met à jour le pointeur CURRENT de l’échéancier.
     200Cette fonction renvoie la valeur 0 quand elle ne trouve pas d’événement postérieur au temps courant,
     201ce qui correspond à la fin de la simulation. Cette valeur doit donc être testée à chaque itération de la boucle de simulation.
     202{{{
    200203bip_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}}}
     205Cette fonction prend pour argument un pointeur sur une liste de signaux (liste de bipointeurs).
     206Elle modifie la valeur des variables Booléennes associées à chacun des signaux pour lesquels il existe un événement.
     207Elle 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{{{
    206209bip_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}}}
     211Cette fonction prend comme argument un pointeur sur le réseau Booléen, et une liste de signaux,
     212et elle renvoie un pointeur sur une autre liste contenant l’ensemble de tous les processus ayant
     213au 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{{{
    212216void 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}}}
     218Cette fonction prend pour argument une liste de processus, ainsi qu’un pointeur sur le scheduler,
     219et évalue la valeur du signal de sortie pour chacun des processus de la liste,  en fonction des valeurs des signaux d’entrée.
     220Elle utilise pour cela une version de la fonction eval_abl() modifiée pour traiter une logique à trois valeurs (0,1,U).
     221Elle compare la valeur future du signal de sortie à sa valeur présente, et insère un événement dans  l’échéancier
     222si cette valeur change (en utilisant la fonction add_event).
     223
     224= C) Construction du réseau Booléen =
    217225
    218226On se propose de simuler le schéma suivant, qui réalise un additionneur 2 bits.
     
    220228
    221229
    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 :
     230Utiliser les fonctions cons_boolnet(), cons_process() et cons_signal() pour construire en mémoire
     231le réseau Booléen correspondant au circuit-ci-dessus.
     232On prendra une valeur de 1 ns pour le temps de propagation de la porte NAND2, et de 2 ns pour la porte XOR2.
     233Ecrire, compiler et exécuter le programme main() qui construit le réseau Booléen.
     234Pour vérifier la structure du réseau Booléen, on pourra utiliser la fonction :
    244235
    245236void drive_boolnet(dotfmt_t format, boolnet_t *bn)
     
    249240enum dotfmt_t { GIF , PS }
    250241
    251 D2) Construction et initialisation de l’échéancier
     242= D) Construction et initialisation de l’échéancier =
    252243
    253244Complê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.
     
    262253
    263254
    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 =
    286256
    287257Ecrire la boucle fonction principale de simulation qui enchaîne les phases “update” et “exécute” présentées en cours.
    288 
     258{{{
    289259void simulate (boolnet_t * bn, scheduler_t * sch)
    290 
     260}}}
    291261On 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.
     262On sauvera sur disque le contenu de l’échéancier en sortie de la boucle de simulation en utilisant la fonction drive_scheduler(),
     263de façon à visualiser le chronogramme avec l’outil XPAT.
     264
     265= F) Ecriture des fonctions d’accès =
     266
     267Ecrivez vous-même le code des 11 fonctions d’accès aux structures de données du simulateur décrites
     268dans la section B, et introduire progressivement votre code à la place des fichiers .o qui vous ont été fournis.