Changes between Version 1 and Version 2 of 2010CaoTme5
- Timestamp:
- Apr 8, 2010, 11:40:49 PM (15 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
2010CaoTme5
v1 v2 124 124 Signal* addSignal ( const std::string&, SignalType ); 125 125 Process* addProcess ( const std::string&, const std::string&, unsigned int delay ); 126 void toDot ( std::ostream& ); 127 void toDot (); 126 128 }; 127 129 }}} … … 142 144 * {{{addProcess()}}} : ajoute une nouvelle cible à l'ensemble des cibles. Equivaut à 143 145 créer un arc dans le graphe. 146 * {{{toDot()}}} : crée une représentation graphique du réseau booléen. Cette fonction 147 vous est fournie. 144 148 145 149 {{{ … … 197 201 inline unsigned int getDelay (); 198 202 void display ( std::ostream& ); 203 std::string toString (); 199 204 }; 200 205 }}} … … 211 216 problèmes de causalité. 212 217 213 * Un événement (classe {{{Event}}}), avec le temps ({{{Time}}}) auquel il se produit, Le214 ''signal'' qu'il affecte et la nouvelle valeur que va prendre ce signal.218 * Un événement (classe {{{Event}}}), comprtant le temps ({{{Time}}}) auquel il se 219 produit, Le ''signal'' qu'il affecte et la nouvelle valeur que va prendre ce signal. 215 220 216 221 * Une structure lui permettant de stocker les ensembles d'évenements par dates et de 217 222 trier ces ensembles par date (croissantes). Nous allons pour cela utiliser une 218 223 {{{map<>}}} de {{{vector<>}}}. C'est à dire, une {{{map<>}}} dont chaque élément sera 219 un {{{vector<>}}} d'évènements et la clé une date ({{{Time}}}. Notezqu'au sein d'un224 un {{{vector<>}}} d'évènements et la clé une date ({{{Time}}}). Notez qu'au sein d'un 220 225 ensemble d'évènements synchrones l'ordre est indifférent. 221 226 … … 247 252 }}} 248 253 249 * '''Ordre du parcours''': une propriété fondamentale est que lors d'unparcours de la250 {{{map<>}}} avec des itérateurs, les éléments sont parcourus ''dans l'ordre défini251 par la relation d'ordre de la clé'', c'est à dire dans notre cas, l'ordre chronologique252 de{{{Time}}}.253 254 * Cet ordre est maintenu automatiquent lors d'ajout ou de retraitd'élements dans la254 * '''Ordre du parcours''': une propriété fondamentale est que lors d'un parcours de la 255 {{{map<>}}} avec des itérateurs, les éléments sont parcourus ''dans l'ordre défini par 256 la relation d'ordre de la clé'', c'est à dire dans notre cas, l'ordre chronologique de 257 {{{Time}}}. 258 259 * Cet ordre est maintenu automatiquement lors d'ajout ou de retrait d'élements dans la 255 260 {{{map<>}}}. 256 261 … … 259 264 l'itérateur pointe...). 260 265 261 * Les éléments d'une {{{map<>}}} sont des paires {{{(clé,valeur)}}}, pour yaccéder à262 partir de l'itérateur, il faut utiliser les attributs public {{{first}}}(clé) et266 * Les éléments d'une {{{map<>}}} sont des paires {{{(clé,valeur)}}}, pour y accéder à 267 partir de l'itérateur, il faut utiliser les attributs public {{{first}}} (clé) et 263 268 {{{second}}} (valeur). 264 269 … … 319 324 * {{{simulate()}}} : effectue la simulation. 320 325 321 * {{{ drive()}}} : écrit dans le flot donné en argument le résultat de la simulation dans322 un format lisible par l'outil {{{xpat}}}. La définition de cette fonction vous est323 fournie.326 * {{{toPatterns()}}} : écrit dans le flot donné en argument le résultat de la simulation 327 dans un format lisible par l'outil {{{xpat}}}. La définition de cette fonction vous 328 est fournie. 324 329 325 330 * {{{_reset()}}} : remet toutes les variables (entrées, sorties, internes) à l'état … … 336 341 std::map<Time, std::vector<Event*> > _events; 337 342 public: 338 Scheduler ( BoolNet* ); 339 Event* addEvent ( const std::string& variable, ValueType, unsigned int time, unsigned int dc=0 ); 340 Event* addEvent ( Signal*, ValueType, unsigned int time, unsigned int dc=0 ); 341 void simulate (); 342 void drive ( std::ostream& ); 343 private: 344 void _reset (); 345 void _header (); 346 void _display ( const Time& ); 343 Scheduler ( BoolNet* ); 344 Event* addEvent ( const std::string& variable, ValueType, unsigned int time, unsigned int dc=0 ); 345 Event* addEvent ( Signal*, ValueType, unsigned int time, unsigned int dc=0 ); 346 void simulate (); 347 void toPatterns ( std::ostream& ); 348 void toPatterns (); 349 private: 350 void _reset (); 351 void _header (); 352 void _display ( const Time& ); 347 353 }; 348 354 }}} … … 351 357 = C) Travail à réaliser = 352 358 353 Dans un premier temps vous devrez utiliser le simulateur qui vous est fournidans359 Dans un premier temps vous devrez utiliser le simulateur qui vous est fourni dans 354 360 l'ensemble des fichiers {{{.o}}}. 355 361 356 Dans un second temps, il vous est demandé de progressivment remplacer les {{{.o}}} 357 fournispar les vôtres.358 359 360 == C1) simulation du circuit '' etou'' ==361 362 Le fichier '' etou.c'' contient un tout petit réseau Booléen ne contenant que deux noeuds,362 Dans un second temps, il vous est demandé de progressivment remplacer les {{{.o}}} fournis 363 par les vôtres. 364 365 366 == C1) simulation du circuit ''And Or'' == 367 368 Le fichier ''AndOr.c'' contient un tout petit réseau Booléen ne contenant que deux noeuds, 363 369 et 4 signaux. Compilez ce fihier, et exécutez la simulation. 364 370 365 371 Vous pouvez visualiser le réseau Booléen avec la commande: 366 372 {{{ 367 > eog etou.gif373 > eog AndOr.png 368 374 }}} 369 375 Vous pouvez visualiser le chronogramme résulat de la simulation avec la commande: 370 376 {{{ 371 > xpat -l etou377 > xpat -l AndOr 372 378 }}} 373 379 … … 383 389 == C2.1) Construction réseau Booléen de l'additionneur == 384 390 385 En vous inspirant du fichier {{{etou.c}}}, écrivez le fichier {{{ adder.c}}} qui construit391 En vous inspirant du fichier {{{etou.c}}}, écrivez le fichier {{{Adder.c}}} qui construit 386 392 en mémoire le réseau Booléen correspondant au circuit additionneur 2 bits décrit 387 393 ci-dessus. On utilisera pour cela les fonctions {{{BoolNet::addProcess()}}} et … … 392 398 {{{.gif}}} ou {{{.ps}}}. 393 399 394 Modifiez le Makefile permettant de compiler ce programme '' adder.c'', et exécutez-le.400 Modifiez le Makefile permettant de compiler ce programme ''Adder.c'', et exécutez-le. 395 401 396 402 397 403 == C2.2) Construction et initialisation de l’échéancier == 398 404 399 Compléter le fichier {{{ adder.c}}} {{{main()}}} pour créer l’échéancier et initialiser les405 Compléter le fichier {{{Adder.c}}} {{{main()}}} pour créer l’échéancier et initialiser les 400 406 événements sur les signaux d’ entrée a0, b0, c0, a1 et b1 de façon à respecter le 401 407 chronogramme ci-dessous. On utilisera la fonction Scheduler::addEvent() et add_event(). … … 404 410 au temps {{{T = 0}}}. 405 411 406 [[Image(chronogramme.png, 412 [[Image(chronogramme.png,nolink)]] 407 413 408 414 Pour vérifier que l’échéancier est correctement initialisé, on pourra utiliser la fonction … … 414 420 == C2.3) Simulation effective du circuit additionneur == 415 421 416 Introduisez dans le fichier {{{ adder.c}}} la méthode {{{Scheduler::simulate()}}} qui422 Introduisez dans le fichier {{{Adder.c}}} la méthode {{{Scheduler::simulate()}}} qui 417 423 effectue la simulation du réseau Booléen, jusqu'à ce qu'il n'y ait plus aucun événement à 418 424 traiter dans l'échéancier. Compilez ce programme, et analysez le chronogramme résultant