Changes between Version 12 and Version 13 of 2010CaoTme5


Ignore:
Timestamp:
Apr 10, 2010, 4:10:58 PM (15 years ago)
Author:
jpc
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • 2010CaoTme5

    v12 v13  
    1212
    1313Les  simulateurs  à événements  discrets  permettent  de  simuler des  systèmes  matériels
    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).
     14constitués d'un  ensemble de  composants matériels interconnectés  par des  signaux.  Dans
     15notre cas, les  signaux véhiculent fondamentatement deux tensions  VSS et VDD représentant
     16respectivement les  valeurs Booléennes  0 et 1,  mais le  simulateur doit traiter  plus de
     17valeurs 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
     19valeurs pour  les signaux.  Pour  simplifier, nous nous  limiterons dans ce TME  aux trois
     20valeurs logiques 0, 1, et U (Undefined).
    2121
    2222Dans le cas général, chaque composant est modélisé par un processus, et tous les processus
     
    3333On  s'intéresse  dans  ce TME  au  cas  particulier  des  réseaux Booléens:  un  processus
    3434correspond à une expression Booléenne multi-niveaux. Dans ce cas particulier, un processus
    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.
     35possède donc un  seul signal de sortie,  et la liste de sensibilité  du processus contient
     36tous les  signaux d'entrée. Cette liste de  sensibilité est tout simplement  le support de
     37l'EBM, tel que  vu au TME3. Un réseau  Booléen peut être représenté par  un graphe biparti
     38orienté comportant  deux types  de noeuds: des  '''processus''' et des  '''signaux'''. Les
     39noeuds à la périphérie du réseau sont toujours des signaux.
    4040
    4141En  d'autres termes,  un processus  a toujours  au moins  un signal  entrant et  un signal
    42 sortant.   Les signaux  qui n'ont  pas  d'arc entrant  sont les  entrées primaires  du
    43 réseau, les signaux qui n'ont pas  d'arc sortant sont les sorties primaires du réseau.
    44 Les autres signaux sont appelés signaux internes.
     42sortant.  Les  signaux qui n'ont pas d'arc  entrant sont les entrées  primaires du réseau,
     43les signaux qui n'ont pas d'arc sortant  sont les sorties primaires du réseau.  Les autres
     44signaux sont appelés signaux internes.
    4545
    4646[[Image(reseau_booleen.png, nolink)]]
     
    5858(0,1,U).
    5959
    60 Créez un  répertoire de travail TME5,  et copiez dans  ce répertoire les  fichiers qui se
    61 trouvent dans {{{/users/enseig/jpc/M1-CAO/TME/5.public}}}.
     60Créez un  répertoire de travail  TME5, et  copiez dans ce  répertoire les fichiers  qui se
     61trouvent  dans {{{/users/enseig/jpc/M1-CAO/TME/5.public}}}.  Vous  pouvez aussi  récupérer
     62l'archive suivante: [wiki:TME5-public.tar.bz2].
    6263
    6364
     
    99100réseau booléen. Le réseau booléen est initialisé vide.
    100101
    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
     113construits  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
     116La  méthode {{{toDot()}}}  crée une  représentation  graphique du  réseau booléen.   Cette
     117fonction vous est fournie.
     118
     119{{{
     120#!cpp
    114121class BoolNet {
    115122  private:
     
    148155
    149156{{{
     157#!cpp
    150158class Signal {
    151159  private:
     
    186194
    187195{{{
     196#!cpp
    188197class Process {
    189198  private:
     
    205214== A2) échéancier ==
    206215
    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
     216Le 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
     218suivants:
     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
    215227   produit, Le signal qu'il affecte et la nouvelle valeur que va prendre ce signal.
    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.
    222236
    223237'''Propriérés remarquables de la {{{map<>}}} de {{{vector<>}}}'''
     
    225239'''Syntaxe:'''
    226240{{{
    227 map<Time, vector<Event*> >  _events;
     241#!cpp
     242map<Date, vector<Event*> >  _events;
    228243}}}
    229244
     
    235250'''Accès et itérateurs'''
    236251{{{
     252#!cpp
    237253map<Date, vector<Event*> >            _events;
    238254map<Date, vector<Event*> >::iterator  istate = _events.begin();
     
    246262}}}
    247263
    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.
    251267
    252268 * Cet ordre  est maintenu automatiquement lors  d'ajout ou de retrait  d'élements dans la
     
    254270
    255271 * Les itérateurs pointant sur des éléments de la {{{map<>}}} restent valides même si l'on
    256    ajoute ou retire des éléments pendant le parcours (une seule exception: si l'on retire l'élement sur lequel
    257    l'itérateur pointe...).
     272   ajoute ou retire des éléments pendant  le parcours (une seule exception: si l'on retire
     273   l'élement sur lequel l'itérateur pointe...).
    258274
    259275 * Les éléments  d'une {{{map<>}}}  sont des paires  {{{(clé,valeur)}}}, pour y  accéder à
     
    264280
    265281{{{
     282#!cpp
    266283class Date {
    267284  private:
     
    269286    unsigned int  _delta;
    270287  public:
    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 );
    275292};
    276293}}}
     
    284301
    285302{{{
     303#!cpp
    286304class Event {
    287305  private:
     
    324342
    325343{{{
     344#!cpp
    326345class Scheduler {
    327346  private:
     
    348367l'ensemble des fichiers {{{.o}}}.
    349368
    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.
     369Dans  un second  temps,  il vous  est  demandé de  progressivment  remplacer les  fichiers
     370{{{.o}}} fournis par les objets résultant de la compilation de votre propre code.
    352371
    353372
     
    407426== C2.3) Simulation effective du circuit additionneur ==
    408427
    409 Introduisez  dans  le fichier  {{{Adder.c}}}  la  méthode {{{Scheduler::simulate()}}}  qui
    410 effectue la simulation du réseau Booléen, jusqu'à  ce qu'il n'y ait plus aucun événement à
    411 traiter dans l'échéancier. Compilez ce programme, et analysez le chronogramme résultant
    412 
    413 == C2.4) Ecriture de la boucle de simulation ==
    414 
    415 Implémenter et remplacer progressivement toutes les classes qui vous on été fournies.
     428Introduisez  dans  le fichier  {{{Adder.c}}}  la  méth