Changes between Version 9 and Version 10 of 2010CaoTme5
- Timestamp:
- Apr 9, 2010, 6:41:34 PM (15 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
2010CaoTme5
v9 v10 112 112 La méthode {{{toDot()}}} crée une représentation graphique du réseau booléen. Cette fonction vous est fournie. 113 113 {{{ 114 #!cpp115 114 class BoolNet { 116 115 private: … … 149 148 150 149 {{{ 151 #!cpp152 150 class Signal { 153 151 private: … … 188 186 189 187 {{{ 190 #!cpp191 188 class Process { 192 189 private: … … 211 208 Pour le réaliser nous avons besoin de définr les objets suivants: 212 209 213 * Une date (classe {{{ Time}}}) contenant deux informations : le temps physique écoulé depuis le début de la simulation,210 * Une date (classe {{{Date}}}) contenant deux informations : le temps physique écoulé depuis le début de la simulation, 214 211 et un temps logique permettant de distinguer deux événements X et Y possédant le même temps physique, 215 212 mais reliés entre eux par une relation de causalité : ceci se produit quand on veut représenter des processus 216 213 dont le temps de propagation est nul. 217 * Un événement (classe {{{Event}}}), comportant la date ({{{ Time}}}) à laquelle il se218 produit, Le ''signal''qu'il affecte et la nouvelle valeur que va prendre ce signal.214 * Un événement (classe {{{Event}}}), comportant la date ({{{Date}}}) à laquelle il se 215 produit, Le signal qu'il affecte et la nouvelle valeur que va prendre ce signal. 219 216 * Une structure permettant de stocker les d'évenements et de 220 trier ces événements par date (croissantes). Nous allons pour cela utiliser une217 trier ces événements par dates croissantes. Nous allons pour cela utiliser une 221 218 {{{map<>}}} de {{{vector<>}}}. C'est à dire, une {{{map<>}}} dont chaque élément sera 222 un {{{vector<>}}} d'évènements et la clé une date ({{{ Time}}}). Deux événements sont synchrones s'ils ont le même temps physique219 un {{{vector<>}}} d'évènements et la clé une date ({{{Date}}}). Deux événements sont synchrones s'ils ont le même temps physique 223 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 224 221 de relation de causalité entre deux événements synchrones. … … 228 225 '''Syntaxe:''' 229 226 {{{ 230 #!cpp231 227 map<Time, vector<Event*> > _events; 232 228 }}} 233 229 234 La clé de tri est un objet de type {{{ Time}}} et la valeur associée à cette clé un235 {{{vector<Event*>}}}. Il faudra définir pour la classe {{{ Time}}} une surcharge de230 La clé de tri est un objet de type {{{Date}}} et la valeur associée à cette clé un 231 {{{vector<Event*>}}}. Il faudra définir pour la classe {{{Date}}} une surcharge de 236 232 l'operateur ''strictement inférieur'' ({{{operator<()}}}) qui définira l'ordre 237 233 chronologique. … … 239 235 '''Accès et itérateurs''' 240 236 {{{ 241 #!cpp 242 map<Time, vector<Event*> > _events; 243 map<Time, vector<Event*> >::iterator istate = _events.begin(); 237 map<Date, vector<Event*> > _events; 238 map<Date, vector<Event*> >::iterator istate = _events.begin(); 244 239 245 240 for ( ; istate != _events.end() ; ++istate ) { 246 const Time& date = (*istate).first;241 const Date& date = (*istate).first; 247 242 vector<Event*>& events = (*istate).second; 248 243 … … 251 246 }}} 252 247 253 * '''Ordre du parcours''': une propriété fondamentale est que lors d'un parcours de la248 * Lors d'un parcours de la 254 249 {{{map<>}}} avec des itérateurs, les éléments sont parcourus ''dans l'ordre défini par 255 250 la relation d'ordre de la clé'', c'est à dire dans notre cas, l'ordre chronologique des dates croissantes. … … 266 261 {{{second}}} (valeur). 267 262 268 '''La classe {{{Time}}}''' 269 270 {{{ 271 #!cpp 272 // Time is used as key by the scheduler's map<>. 273 class Time { 263 '''La classe {{{Date}}}''' 264 265 {{{ 266 class Date { 274 267 private: 275 268 unsigned int _time; 276 unsigned int _delta Cycle;277 public: 278 inline Time ( unsigned int time, unsigned int dc);269 unsigned int _delta; 270 public: 271 inline Date ( unsigned int time, unsigned int delta ); 279 272 inline unsigned int getTime () const; 280 inline unsigned int getDelta Cycle() const;273 inline unsigned int getDelta () const; 281 274 friend bool operator< ( const Time& lhs, const Time& rhs ); 282 275 }; … … 291 284 292 285 {{{ 293 #!cpp294 286 class Event { 295 287 private: 296 288 Signal* _signal; 297 289 ValueType _value; 298 Time _time;299 public: 300 inline Event ( Signal*, ValueType, Time& );290 Date _date; 291 public: 292 inline Event ( Signal*, ValueType, Date& ); 301 293 inline Signal* getSignal (); 302 294 inline ValueType getValue (); 303 inline Time& getTime ();295 inline Date& getDate (); 304 296 inline void updateSignalValue (); 305 297 }; … … 312 304 313 305 * {{{addEvent(Signal*,...)}}} : ajoute un nouvel évènement à l'échéancier. Pour donner la 314 date on ne passe pas d'objet {{{ Time}}}, mais ses deux composants {{{time}}} et315 {{{d c}}}.306 date on ne passe pas d'objet {{{Date}}}, mais ses deux composants {{{time}}} et 307 {{{delta}}}. 316 308 317 309 * {{{addEvent(const std::string&,...)}}} : une surcharge de la fonction précédente qui … … 322 314 323 315 * {{{toPatterns()}}} : écrit dans le flot donné en argument le résultat de la simulation 324 dans un format lisible par l'outil {{{xpat}}}. La définition de cette fonction vous316 dans un format lisible par l'outil {{{xpat}}}. Cette fonction vous 325 317 est fournie. 326 318 327 319 * {{{_reset()}}} : remet toutes les variables (entrées, sorties, internes) à l'état 328 in itial(U).320 indéfini (U). 329 321 330 322 * {{{_header()}}} et {{{_display()}}} : utilitaires vous permettant d'afficher l'état de … … 332 324 333 325 {{{ 334 #!cpp335 326 class Scheduler { 336 327 private: 337 328 BoolNet* _network; 338 std::map< Time, std::vector<Event*> > _events;329 std::map<Date, std::vector<Event*> > _events; 339 330 public: 340 331 Scheduler ( BoolNet* ); 341 Event* addEvent ( const std::string& variable, ValueType, unsigned int time, unsigned int d c=0 );342 Event* addEvent ( Signal*, ValueType, unsigned int time, unsigned int d c=0 );332 Event* addEvent ( const std::string& variable, ValueType, unsigned int time, unsigned int delta=0 ); 333 Event* addEvent ( Signal*, ValueType, unsigned int time, unsigned int delta=0 ); 343 334 void simulate (); 344 335 void toPatterns ( std::ostream& ); … … 347 338 void _reset (); 348 339 void _header (); 349 void _display ( const Time& );340 void _display ( const Date& ); 350 341 }; 351 342 }}} … … 357 348 l'ensemble des fichiers {{{.o}}}. 358 349 359 Dans un second temps, il vous est demandé de progressivment remplacer les {{{.o}}} fournis360 par les vôtres.350 Dans un second temps, il vous est demandé de progressivment remplacer les fichiers {{{.o}}} fournis 351 par les objets résultant de la compilation de votre propre code. 361 352 362 353 … … 414 405 des signaux d'entrée. Vous pouvez visualiser ce chronogramme avec l’outil {{{xpat}}}. 415 406 416 417 407 == C2.3) Simulation effective du circuit additionneur == 418 408 … … 421 411 traiter dans l'échéancier. Compilez ce programme, et analysez le chronogramme résultant 422 412 423 424 413 == C2.4) Ecriture de la boucle de simulation == 425 414