Mealy Lustre Produits Simple
Mealy Lustre Produits Simple
Mealy Lustre Produits Simple
Maraninchi
Voir git@gitlab.ensimag.fr:maraninf/trci.git.
Les exemples donnés en cours et ici sont suffisants pour le TP, mais vous avez aussi un tutoriel du
langage Lustre dans la distribution accessible ici :
https://www-verimag.imag.fr/~raymond/home/tools/lv4/
▷ A faire 1 :
— Tapez ce programme dans votre éditeur préféré, nommez le fichier Counter.lus
— Pour le tester, tapez luciole Counter.lus Counter ou bien luciole Counter.lus Toto
Vous obtenez quelque part sur votre écran l’un des deux panneaux de contrôle de luciole :
Les entrées du noeud Lustre (ici boolénnes) donnent des boutons, et les sorties des affichages qui
dépendent du type. Il y a un bouton step pour faire un pas de calcul. Pour obtenir des chronogrammes,
activez l’option sim2chro gtk dans le menu Tools. Vous obtenez ça :
▷ A faire 2 :
Inventer un noeud Lustre à deux entrées booléennes. Lancer luciole pour ce noeud. Comment faire
un pas en ayant fixé la valeur des deux entrées ? Dans le menu Clock, choisir compose. L’interface
change, et on peut choisir toutes les valeurs des entrées pour un pas, avant de lancer un step.
Familiarisez-vous avec ce fonctionnement.
▷ A faire 3 :
En utilisant le schéma de codage vu en cours, donner des nœuds Lustre N1, N2, N3 correspondant
aux automates (M1), (M2), (M3) de la figure 1.
−a
a
−a a/c AC −a
−a −a −b −b
a b BD BC
A B C D a
a/b b/c a
AD
M1 M2 −a
M3 = (M1 * M2)\ b
▷ A faire 4 :
— Ecrire un noeud Lustre N qui réutilise les nœuds N1, N2 précédemment écrits, et qui branche
la sortie b de N1 sur l’entrée b de N2 (cf. Figure 2-α).
— Ecrire un nouveau nœud Lustre P qui fait tourner en parallèle ce nœud N et le nœud N3 de
la question précédente, en leur donnant la même entrée, et en connectant les deux sorties à un
comparateur (cf. Figure 2-β). Que pensez-vous de la sortie de ce comparateur ?
N3 a
N
a b c
N1 N2 =
N3
α β
Indication : pour utiliser un nœud Lustre dans un autre, on peut écrire par exemple :
▷ A faire 5 :
— Reprenez le double clic comme vu en cours en machine de Mealy ; codez directement l’automate
du transparent 165 en Lustre ; exécutez avec Luciole.
— Vous pouvez décider de ne pas avoir d’entrée top, et donc de considérer que le temps est donné
par l’horloge de base du programme. Modifiez l’automate pour prendre en compte cette idée, recodez
en Lustre.
— Exécutez avec Luciole. Dans un menu vous trouverez la possibilité de “brancher” l’horloge de
base sur le temps “réel” de votre machine ; ça vous permet de tester le double clic en situation réelle.
On écrit maintenant une autre version Lustre du double clic, issue du schéma donné en cours (celle
qui utilise le noeud twostates du transparent 166). Complétez le programme ci-dessous en trouvant
les définitions correctes de reset, simple, double :
const D : int = 10 ;
-- double = 2 clicks in less than D tops=base clock
node doubleclick (button : bool) returns
(simple : bool ; double : bool) ;
var
idle, yaclick, reset : bool ;
count : int ;
let
(idle, yaclick) = twostates (button, reset) ;
count = if idle then 0 else pre(count) + 1 ;
reset = .... ;
simple = .... ;
double = .... ;
tel.
On étudie un mécanisme utilisé dans les souris informatiques pour déterminer un sens de rotation. Un
disque à zones noires et blanches (voir figure ci-dessous) tourne autour de son centre, et passe ainsi
devant un support fixe qui porte deux capteurs IE (internal eye) et EE (external eye). Quand le disque
tourne, ces deux capteurs voient se succéder des zones noires et des zones blanches.
Dans tout cet exercice on raisonne en synchrone, donc on suppose l’existence d’une horloge de base qui
découpe le temps en instants successifs. A chacun de ces instants, chaque capteur délivre un booléen,
vrai si la zone qui est en face du capteur à ce moment-là est noire, faux si elle est blanche (on suppose
que le capteur est suffisamment fin, et on ne considère donc pas les cas où le capteur est à cheval sur
une zone noire et une zone blanche).
On veut réaliser un programme synchrone qui reçoit en entrée les deux booléens en provenance des
capteurs, et qui émet deux booléens CK et antiCK: CK (resp. antiCK) est vrai quand on est sûr que le
cyclindre vient de tourner dans le sens horaire (resp. anti horaire).
Sens Sens
horaire anti horaire
IE
EE
Support fixe
portant les capteurs C, E
▷ A faire 7 :
— Expliquez informellement (sans écrire de programmes) comment utiliser les informations en prove-
nance des deux capteurs (valeurs et fronts montants ou descendants) pour déterminer le sens de ro-
tation. Etudiez bien tous les cas (il faut pouvoir émettre le sens de rotation le plus souvent possible)
et prêtez une attention particulière à l’état initial du système.
— Y a-t-il une contrainte à respecter entre la vitesse de rotation et la fréquence d’échantillonnage
des capteurs pour que le système fonctionne correctement ?
On donne un programme Lustre à compléter (à récupérer sur le git), qui contient :
• une partie de détection de sens de rotation (pour l’instant cela produit toujours faux pour les
sorties CK et antiCK, c’est à vous d’implémenter correctement cette partie);
• une partie de génération de valeurs produites par les capteurs IE et EE
• Des nœuds qui assemblent le générateur d’événements et vos détecteurs.
-- Turning clockwise, the eyes see pattern1 and not pattern2 superposed
node s_turningCK(foo:bool ) returns( IE, EE: bool) ;
var
count : int;
let
IE = s_pattern1( count) ;
EE = not s_pattern2( count) ;
count = counter(true);
tel.
------------------------------------------------------
-- Write your code here
--------------------------------------------------------
-- test the generator+ your detector
-- by looking at okCK or okantiCK in luciole