Re'sume' de cours ================= se'quence = cours1 + tp1 + cours2 + td + tp2 1. Exemple du Veilleur ---------------------- 1.1. E'nonce' Un ordinateur envoie des ordres a` une machine. Le veilleur est charge' de ve'rifier que la machine exe'cute ces ordres dans un certain de'lai (nombre de tops). Pour cela, l'ordinateur envoie une copie de la commande au veilleur, et la machine envoie au veilleur un signal indiquant qu'elle a termine' l'exe'cution. Une alarme doit e^tre de'clenche'e si le de'lai est de'passe'. +----------+ COMMANDE --> | | Veilleur --> ALARME TERMINEE --> | +----^-----+ | TOP 1.2. Stucture du programme % veilleur.SIG % process veilleur = { integer DELAI % parametre % } ( ? event TOP; % entrees % integer COMMANDE; event TERMINEE ! event ALARME % sortie % ) (| ... % equations/contraintes sur les signaux % | ... | ... | ... |) where ... % declarations locales % end 1.3. Parametre DELAI ordre non indifferent ==> fichier veilleur.par 5 1.4. Entrees/sorties et declarations locales ordre indifferent (mais entrees avant sorties) 1.5. Corps du programme ordre indifferent ==> declaratif 1.6. integer compteur constant integer REPOS := -1; repos ==> compteur vaut REPOS COMMANDE ==> compteur vaut DELAI TERMINEE ==> repos en attente de TERMINEE ==> compteur := compteur - 1 ( DELAI DELAI-1 ... 2 1 0 -1) compteur = 0 ==> ALARME 1.7. compteur ^= TOP mais COMMANDE ou TERMINEE pas forcement synchrones avec TOP ==> compteur ^= TOP ^+ ^COMMANDE ^+ TERMINEE 1.8. compteur := DELAI when ^COMMANDE default REPOS when TERMINEE default precedent-1 when precedent>=0 default REPOS 1.9. integer precedent precedent := compteur $ 1 ==> integer precedent init REPOS 1.10. ALARME := when cpt = 0 1.11. Chronogramme TOP : t t t t t t t t t t t t t t t t t t COMMANDE : 7 8 9 TERMINEE : t t t compteur : -1 5 4 3 -1 -1 5 4 3 2 1 0 -1 -1 -1 -1 5 4 -1 -1 precedent : -1 -1 5 4 3 -1 -1 5 4 3 2 1 0 -1 -1 -1 -1 5 4 -1 ALARME : t 1.12. Programme final % veilleur.SIG % process veilleur = { integer DELAI; % parametre % } ( ? event TOP; % entrees % integer COMMANDE; event TERMINEE; ! event ALARME; % sortie % ) (| compteur ^= ^COMMANDE ^+ TERMINEE ^+ TOP | compteur := DELAI when ^COMMANDE default REPOS when TERMINEE default precedent-1 when precedent>=0 default REPOS | precedent := compteur $ 1 | ALARME := when compteur = 0 |) where integer compteur, precedent init REPOS; constant integer REPOS := -1; end 1.13. Les points-virgules - notez les ; a` la fin de chaque de'claration (qu'elle soit locale, de parame`tre, de signal d'entre'e ou de sortie) 2. Types -------- 2.1. event * toujours la valeur vrai, mais a quels instants ? * operateur ^ (extrait l'horloge du signal) ^E est e'quivalent a` E=E ou a` event(E) E 1 2 3 4 5 ^E T T T T T * operateur ^+ (union des instants de deux horloges) E1 T T T T E2 T T T S ^= E1 ^+ E2 S T T T T T T * operateur ^* (intersection des instants de deux horloges) E1 T T T T E2 T T T S ^= E1 ^* E2 S T * operateur ^- (exclusion des instants de la deuxie`me horloge) E1 T T T T E2 T T T S ^= E1 ^- E2 S T T T * contraintes sur des horloges : - H1 ^= H2 (les deux horloges doivent e^tre identiques) - H1 ^< H2 (H1 doit e^tre incluse dans H2, au sens large) - H1 ^# H2 (les deux horloges ne doivent avoir aucun instant en commun) 2.2. boolean * constantes: true et false (1 et 0 dans les fichiers de donne'es) * resultat de comparaison: < <= > >= = /= * operateurs logiques: not and or xor * operateur when (extrait les instants vrais de la condition) ==> B boolean, when B est e'quivalent a` ^B when B B T F T T F T S ^= when B S T T T T * signal de type event est aussi un boolean 2.3. integer * constantes litte'rales: 1654 +287 -39 * constantes nomme'es: (dans la partie where) constant integer TAILLE := 10; * constantes calcule'es: constant integer Z = X + Y; X et Y force'ment constantes ou parame`tres * attention! les constantes n'ont pas d'horloge et sont implicitement toujours pre'sentes * operateurs unaires: + - * operateurs binaires: + - * / (entie`re) modulo ** (entie`re) 2.4. real * constantes litte'rales: 3.14 .2 2.5e-3 1e6 * me^mes constantes nomme'es et calcule'es * me^mes operateurs, mais division re'elle, donc pas de modulo * conversions: real(I) integer(R) * type dreal double precision: 'd' a la place de 'e', et obligatoire * fonctions: (dans la partie where) function sin = ( ? dreal X ! dreal S ) utilisation: A := 0.5 * sin( B ) + 3.14159265358979 2.5. complex * constantes: 0.0@1.0 2.5@4e-3 1.0@(-1.0) * type dcomplex 2 dreal au lieu de 2 real * complex(R) e'quivalent a` R@0.0 2.6. character * constantes: 'a' '8' '\000' 2.7. string * constantes: "une phrase" "" * pas de conversion vers string 2.8. enum * definition: type color = enum ( rouge, orange, vert ); * constantes: #rouge #orange #vert * ambiguite': type fruit = enum ( pomme, poire, orange ); fruit#orange ou color#orange * valeurs entie`res: integer(#rouge) = 0 3. Les 4 ope'rations fondamentales ---------------------------------- 3.1 La fonction imme'diate Y := A+B ou C := A and B ou Y := X ** 2 ==> synchronise Y, A, et B ou C, A, et B ou Y et X A T F T T F F T T T B F F T F F T F F T A and B F F T F F F F F T 3.2 Le retard Xprec := X$1 ou ZX := X$3 ==> integer Xprec init -1 ou integer ZX init [ {to 3} : 0 ] ==> Xprec et X ou ZX et X ont la me^me horloge X 9 8 7 6 5 pour Xprec := X$1 Xprec -1 9 8 7 6 et integer Xprec init -1; 3.3 Le sous-e'chantillonnage Y := A when B ==> Y et A sont de me^me type, et B boolean (ou event) ==> Y n'a de valeurs que lorsque B est pre'sent et vrai A 1 2 3 4 5 6 7 8 9 B T F T T F T A when B 2 5 6 9 3.4 Le me'lange prioritaire Y := A default B ==> Y, A, et B sont de me^me type ==> l'horloge de Y est l'union des horloges de A et de B ==> A est prioritaire sur B, donc Y diffe'rent de B default A ==> B peut e^tre une constante si l'horloge de Y est de'termine'e par ailleurs; sinon, l'horloge de B doit e^tre de'termine'e A 11 13 14 16 18 B 22 23 25 26 27 28 A default B 11 22 13 14 25 16 27 18 B default A 11 22 23 14 25 26 27 28 3.5 En bonus : la me'morisation Y := A cell B init V ==> B boolean (ou event) ==> Y vaut A quand A est pre'sent ==> Y vaut A$1 quand A est absent et B est vrai ==> V est utile quand B est vrai avant la premie`re valeur de A A 1 2 3 4 5 6 B T F T F T T F T A cell B init -1 -1 1 2 2 2 3 4 5 5 6 >>> Exercice: Comment e'crire cell s'il n'existait pas ?