• Nenhum resultado encontrado

6.1 Le langage AltaRica et ses outils

6.1.2 Le langage AltaRica

Nous donnons dans cette partie un aperçu du langageAltaRica.

Nous ne présenterons pas tous les détails du langageAltaRica, d’autres documents le faisant déjà très bien. Nous pourrons notamment nous référer aux thèses de Gérald Point [Poi00] et Aymeric Vincent [Vin03a] qui donnent une description formelle de la syntaxe et de la sémantique du langage. La présentation du langage proposée sur le site internet dédié au langageAltaRica1 est aussi intéressante et présente l’ensemble des notions traitées par le langage.

1. http://altarica.labri.fr/

En outre, il est intéressant de se référer à la thèse de Romain Bernard [Ber09] qui donne le pendant des définitions d’AltaRicaen AltaRicaOCAS. Le langage que nous décrivons et que nous utiliserons dans cette thèse est le langageAltaRicad’origine, l’AltaRicaLaBRI.

Nous ne donnerons pas la description précise de la syntaxe AltaRica, et proposons de se référer aux documents cités précédemment pour aborder les éléments basiques du langage comme lesmots-clés, lesidentifiants, lesexpressions, lavisibilitéou encore lesdomaines. Nous ne décrirons pas non plus les éléments spécifiques tels que lespriorités ou lestypes de données abstraits.

Nous ne reprenons dans cette partie que les éléments nécessaires pour la réalisation et la com- préhension de modèlesAltaRicatels que nous les manipulons dans cette thèse.

Une descriptionAltaRicaest composé de nœuds. La définition d’un nœud commence par le mot-clénodeet se termine par le mot-cléedon. Un exemple est proposé en figure 6.1.

node Composant ...

edon

Figure6.1 – Déclaration d’un nœudAltaRica

Un nœud simple (appelé aussi nœud feuille) est composé des plusieurs champs, chacun débutant par un mot-clé et se terminant au mot-clé suivant. Dans un nœud simple nous retrouvons donc les champs :

- stateet initdéfinissant les variables d’états.

- flowdéfinissant les variables de flux.

- eventdéfinissant les événements.

- transdéfinissant les transitions.

- assertdéfinissant les assertions.

- externpermettant la définition de commandes externes au langage mais qui pourront être prises en comptes dans des outils complémentaires.

Le langage intègre la notion de hiérarchie de nœuds. Un nœud à un niveau de hiérarchie peut être un sous-nœud au niveau supérieur. De nouveaux champs spécifiques à la hiérarchie sont alors utilisés :

- subpour exprimer les sous-nœuds.

- syncpour la synchronisation d’événements.

Chaque champ a son rôle dans le nœud. Nous allons dans la suite de cette partie sur le langage AltaRicaprésenter plus en détails les différents champs. Commençons par la description d’un nœud simple avant d’introduire la notion de hiérarchie.

Nous illustrerons les définitions introduites au fur et à mesure avec l’exemple simple d’un interrupteur et de l’état de ses tensions en entrée et en sortie selon qu’il eston (fermé) ou pas (cf.

figure 6.2).

i o

Figure6.2 – Exemple Interrupteur

6.1.2.1 Description d’un nœud simple

Nous présentons les différents champs que l’on peut retrouver dans un nœud simple.

6.1.2.1.1 Les champs state etinit

Le champstatepermet de déclarer les variables d’état d’un nœud. Chaque variable est associée à un identificateur et un type. L’identificateur désignera la variable pour l’ensemble du nœud. Le type de la variable peut être de plusieurs formes :

- Un type prédéfini, tel quebool(true oufalse) ouinteger.

- Un intervalle d’entiers, tel que[-5,5].

- Un ensemble de valeurs, tel quecouleur={jaune,vert,bleu}.

Il est ensuite possible de composer ces types dans des tableaux. Par exemple, matrice = bool[10][10]définit une matrice de booléens de taille 10 par 10.

De même, AltaRica permet de définir des types structurés comme on les trouve dans de nombreux langages de programmation. Un exemple typique que l’on peut voir en figure 6.3 est celui d’un point défini par deux coordonnées entièresxety.

domain Point = struct

x : integer;

y : integer;

tcurts;

Figure6.3 – Définition d’un type structuré enAltaRica

Le type structuré est ensuite utilisable comme n’importe quel autre type. On accédera au champ xd’une variablepde typePoint en faisantp.x.

Il est possible d’associer à une variable unevisibilité. La visibilité permet de définir comment les nœuds extérieurs ont accès à la variable. Pour plus de détails, nous nous référerons aux documents cités en début de partie.

Une variable d’état est définie dans le champ state et sa valeur initiale est donnée dans le champinit. Si aucune valeur initiale n’est donnée, alors la variable sera libre dans les configura- tions initiales, i.e. toutes les valeurs de son domaine seront possibles. Notons qu’une configuration AltaRicareprésente l’état d’un nœud et correspond à une valuation de l’ensemble des variables (d’état et de flux) du nœud.

Ces variables portent l’état d’un composant et sont modifiés lors d’occurrence d’événements à travers les transitions.

Considérons l’exemple de notre interrupteur. Nous représentons ses états possibles par une variable d’état comme représenté en figure 6.4

node Switch state

on : bool;

init

on := true;

...

edon

Figure 6.4 – Exemple Interrupteur : définition d’une variable d’état

La variable d’étatonest une variable booléenne qui exprime que l’interrupteur est fermé lorsque la variableonest vraie (vaut true) et ouvert sinon. Au départ, nous considérons que notre inter- rupteur est fermé.

6.1.2.1.2 Le champflow

Les variables de flux sont définies dans le champflow. On donne un identificateur et un type de la même manière pour les variables de flux que pour les variables d’état (de même, on peut lui associer une visibilité et des attributs).

Le rôle d’une variable de flux est différent de celui d’une variable d’état. Les valeurs des variables de flux dépendent de celles des variables d’état et de l’environnement du nœud. C’est aussi le cas pour leur valeur initiale, qui ne rentre pas dans le champinit. Les relations de dépendances entre variables de flux et variables d’état sont exprimées à travers des contraintes appelées assertions que nous définirons par la suite.

Nous intégrons dans l’exemple de notre interrupteur deux variables de flux qui représentent les flux de tensions d’entrée (i pour in) et de sortie (o pour out) de l’interrupteur, comme nous pouvons le voir en figure 6.5.

node Switch state

on : bool;

init

on := true;

flow

i, o : [0,1];

...

edon

Figure6.5 – Exemple Interrupteur : ajout d’une variable de flux

Nous définissons les variablesietocomme pouvant prendre leur valeur entre0et1, ce qui est équivalent à les définir booléennes. La valeur0exprime qu’aucune tension n’est présent contraire- ment à la valeur1.

6.1.2.1.3 Le champevent

Les événementsAltaRicasont définis dans le champevent. Un événement représente une ac- tion qui va faire basculer le système d’une configuration dans une autre. L’événement correspondra donc à l’étiquette d’une transition.

On peut, comme pour les variables, associer à l’événement une visibilité et on peut aussi lui associer des attributs. Les attributs peuvent servir à faire des catégories. Il est possible par exemple de distinguer ainsi les événements qui sont contrôlables de ceux qui ne le sont pas en les marquant d’un attribut.

Pour notre exemple, nous pouvons définir l’événementpushqui correspond à une action d’appui sur l’interrupteur. Le codeAltaRicade l’exemple intégrant cet événement est proposé en figure 6.6.

6.1.2.1.4 Le champassert

Les assertionsAltaRicasont définies dans le champassert. Elles sont exprimées à travers des expressions booléennes qui représentent des contraintes sur les variables. Toutes les configurations d’un nœud doivent satisfaire ses assertions.

Les assertions peuvent être utilisées pour décrire les relations de dépendance entre les variables d’états du système et les variables de flux, mais aussi pour décrire la valeur de variables de flux

node Switch state

on : bool;

init

on := true;

flow

i, o : [0,1];

event push;

...

edon

Figure6.6 – Exemple Interrupteur : ajout d’un événement

par rapport à d’autres variables de flux. Un exemple classique de ce dernier type d’utilisation est la définition de fonctions de transfert.

Nous ajoutons à notre exemple d’interrupteur en figure 6.7 la contrainte décrivant la valeur en sortie de l’interrupteur en fonction de son état et de la valeur d’entrée.

node Switch state

on : bool;

init

on := true;

flow

i, o : [0,1];

event push;

assert

on => (i = o);

not on => (o = 0);

...

edon

Figure 6.7 – Exemple Interrupteur : ajout d’une assertion

Les deux assertions on => (i = o) et not on => (o = 0) peuvent être exprimées en une seule contrainteon => (i = o) and not on => (o = 0). Cela décrit le comportement des flux de tension en entrée et en sortie selon que l’interrupteur est ouvert ou fermé. Ici on exprime le fait que si l’interrupteur eston, alors les tensions en entrée et en sortie sont les mêmes (i = o). En revanche, si l’interrupteur est ouvert, la tension en sortie est nulle (o = 0).

Nous aurions évidemment pu écrire des formules booléennes différentes mais équivalentes à la place de celle que nous avons écrite, par exempleon and i = o or not on and o = 0. Le modèle AltaRicaest totalement équivalent.

AltaRica permet aussi d’exprimer ces contraintes booléennes en utilisant les expressions if-then-else. Les assertions suivantes sont donc équivalentes aux deux présentées dans le code en figure 6.7 :

- o = (if on and i = 0 then 1 else 0);

- (if on and i = 0 then 1 else 0) = o;

- (if on and i = 0 then o = 1 else o = 0);

6.1.2.1.5 Le champtrans

Le dernier champ utilisé pour les nœuds simples est le champtrans. Il est utilisé pour décrire les conditions d’occurrence d’un événement et les changements d’état du système qu’il provoque.

Une transition a trois composantes :

- une garde qui est une expression booléenne décrivant la condition à vérifier pour que la transition puisse être tirée.

- un événement, déclaré dans le champevent, qui sera l’étiquette de la transition.

- une liste d’affectations qui décrit les nouvelles valeurs des variables d’états du système après le tirage de la transition. (pour plus de détails concernant la forme des affectations, on pourra se référer à [Vin03a] qui donne en annexe la grammaire complète du langage, et donc en particulier celle décrivant les affectations).

Lorsqu’un événement est déclenché, chaque transition qu’il étiquette peut être tirée si les deux conditions suivantes sont remplies :

- la garde est satisfaite.

- les assertions sont satisfiables une fois les variables d’états modifiées par les affectations.

Si au moins une transition étiquetée par un événementeest tirable, alorseest ditdéclenchable.

Une fois la transition tirée, les variables d’état sont modifiées d’après les affectations et les variables de flux ont comme valeurs possibles celles qui satisfont les assertions.

Une transition a la forme suivante :

garde |- événement -> affectations;

Un événement peut très bien étiqueter plusieurs transitions. De plus, les gardes peuvent ne pas être exclusives,AltaRicagérant le non-déterminisme.

Nous pouvons finalement intégrer les transitions à notre exemple d’interrupteur, en figure 6.8.

node Switch state

on : bool;

init

on := true;

flow

i, o : [0,1];

event push;

assert

on => (i = o);

not on => (o = 0);

trans

true |- push -> on := not on;

edon

Figure6.8 – Exemple Interrupteur : modèle complet

Notre modèle, à travers la transition que nous venons d’ajouter, stipule qu’il est possible d’ef- fectuer l’appui sur l’interrupteur (événementpush) à n’importe quel moment (garde à true), et que cela le fait basculer de ouvert à fermé et inversement (on := not on).

Il est une nouvelle fois possible de décrire différemment le même comportement. Par exemple, nous aurions pu le décomposer en deux transitions :

- on |- push -> on := false;

- not on |- push -> on := true;

Avec l’ajout des transitions dans notre modèle d’interrupteur, nous l’obtenons de manière com- plète.

Nous pouvons donc désormais nous intéresser à la notion de hiérarchie.

6.1.2.2 Description de la hiérarchie

AltaRicadonne la possibilité de décrire le modèle d’un système par niveau de hiérarchie.

Le principe est tout d’abord de construire les nœuds de base comme nous l’avons montré dans la partie précédente, puis de les utiliser à un niveau supérieur. Les notions qui apparaissent sont celles desous-nœuds, deconnexion de flux et de synchronisation d’événements.

Pour illustrer la notion de hiérarchie en AltaRica nous proposons de modéliser un système comportant deux interrupteurs en série, comme représenté sur le schéma en figure 6.9.

S1.i S1.o S2.i S2.o

Figure 6.9 – Exemple Système d’interrupteurs

6.1.2.2.1 Sous-nœuds

La première notion à définir pour gérer la hiérarchie est la notion de sous-nœud. Elle apparaît enAltaRicadans le champ sub.

Un nœudAltaRicapeut contenir plusieurs sous-nœud. On dit alors que c’est le nœudparent.

Les droits de regard d’un nœud parent sur ses enfants et leurs attributs sont définis par la notion de visibilité. Nous ne regarderons pas ces notions que l’on retrouve dans [Poi00] et [Vin03a], mais considérons le comportement par défaut, à savoir :

- Un sous-nœud n’a connaissance d’aucun événement ou variable de son nœud parent (par déclaration).

- Un nœud parent peut seulement agir sur les variables de flux (à travers des contraintes) et sur les événements (à travers les synchronisations) de ses enfants.

- Un nœud peut en revanche définir ou redéfinir les valeurs initiales des variables d’état de tous ses descendants.

La création du nœud système de notre exemple peut être réalisée comme sur code AltaRica présenté en figure 6.10.

Pour notre système, nous créons deux sous-nœudsS1et S2qui représentent les deux interrup- teurs du système.

6.1.2.2.2 Connexion de flux

Les flux de plusieurs sous-nœuds peuvent être connectés au niveau du nœud parent. Cela correspond typiquement au cas de communication entre sous-nœuds qui ne peut être défini qu’au niveau supérieur.

La connexion de flux se fait à travers des contraintes dans le champ assert. Pour vérifier l’assertion globale du système, il s’agira désormais de vérifier toutes les contraintes, à la fois celles du nœud courant et celles de tous ses descendants.

Nous pouvons illustrer la connexion de flux sur notre exemple en figure 6.11.

Nous avons connecté le flux de sortieS1.odu premier interrupteurS1au flux d’entréeS2.idu second interrupteurS2.

node Switch state

on : bool;

init

on := true;

flow

i, o : [0,1];

event push;

assert

on => (i = o);

not on => (o = 0);

trans

true |- push -> on := not on;

edon

node System sub

S1, S2 : Switch;

...

edon

Figure 6.10 – Exemple Système d’interrupteurs : création de sous-nœuds

node Switch state

on : bool;

init

on := true;

flow

i, o : [0,1];

event push;

assert

on => (i = o);

not on => (o = 0);

trans

true |- push -> on := not on;

edon

node System sub

S1, S2 : Switch;

assert

S1.o = S2.i;

...

edon

Figure6.11 – Exemple Système d’interrupteurs : connexion de flux

6.1.2.2.3 Synchronisation d’événements

La synchronisation d’événements enAltaRicadonne la possibilité de forcer des événements à

se produire simultanément. Les synchronisations sont exprimées dans le champsync.

Une synchronisation s’applique à des événements de nœuds différents et est définie dans le nœud le plus global (assez haut dans la hiérarchie pour avoir la visibilité des événements qu’il veut synchroniser).

Une synchronisation d’événements a la forme suivante :

< event1, event2, ..., eventN >

Une synchronisation n’est possible que si les modifications induites par l’occurrence de tous les événements de manière simultanée sont réalisables. Cela signifie que la modification de l’ensemble des variables d’état et la satisfaction de l’assertion globale sont possibles.

Un autre type de synchronisation, moins contrainte que les synchronisations fortes, est possible : les synchronisations faibles.

Lorsqu’un événement d’une synchronisation forte n’est pas déclenchable, la synchronisation ne peut pas avoir lieu. Dans les synchronisations faibles, certains événements, précédés d’un symbole

“ ?”, ne sont pas bloquants pour la synchronisation. Cela se traduit en deux clauses :

- Un événement qui est marqué n’est pas nécessaire pour la synchronisation.

- Si un événement marqué est déclenchable lors d’une synchronisation, alors il peut être ou ne pas être déclenché.

Considérons la synchronisation faible suivante :

< a, b?, c? >

Cette synchronisation stipule que les événementsbetcsont non bloquants pour la synchroni- sation. On peut réécrire la synchronisation faible en plusieurs synchronisations fortes :

< a >

< a, b >

< a, c >

< a, b, c >

Avec le langage AltaRica, il est possible en plus de donner une contrainte sur le nombre d’événements qui doivent être synchronisés dans une synchronisation faible. Prenons l’exemple suivant pour illustrer cela :

< a, b?, c? > >= 1

Ici nous forçons à ce qu’au moins un des deux événements marqués (b ou c) soit déclenché.

La synchronisation avec cette contrainte supplémentaire peut être réécrite en cet ensemble de synchronisations fortes :

< a, b >

< a, c >

< a, b, c >

Nous pouvons finalement considérer notre exemple de système d’interrupteurs auquel nous avons intégré la notion de synchronisation en figure 6.12.

À travers la synchronisation forte< S1.push, S2.push >;nous obligeons les événementspush des deux interrupteurs à se produire simultanément.

Ce comportement, qui ne correspond pas à une interaction classique de deux interrupteurs, est définie à des fins d’illustration et n’a pas de réalité particulière.

node Switch state

on : bool;

init

on := true;

flow

i, o : [0,1];

event push;

assert

on => (i = o);

not on => (o = 0);

trans

true |- push -> on := not on;

edon

node System sub

S1, S2 : Switch;

assert

S1.o = S2.i;

sync

< S1.push, S2.push >;

edon

Figure6.12 – Exemple Système d’interrupteurs : Modèle complet

6.1.2.3 Automate de comportement AltaRica

Dans cette dernière section de la partie sur le langageAltaRica, nous allons décrire dans les grandes lignes l’automate de comportement du système modélisé.

Le langage AltaRica, comme la majorité des langages de modélisation formelle, calcule un objet formel à partir du fichier AltaRica décrivant le comportement du système. Dans le cas d’AltaRica, l’objet manipulé, qui représente le graphe d’accessibilité du modèle, peut être décrit comme un automate à contraintes [PR99].

Avant de définir ce qu’est un automate à contraintes, nous introduisons ou rappelons quelques notations. Pour la suite, T(V) et BF(V) représenteront respectivement l’ensemble des termes et l’ensemble des formules booléennes construites à partir d’un ensemble de variables V. De plus, F(A, B)désigne l’ensemble des fonctions deAversB.

Définition 46 (Automate à contraintes) Un automate à contraintesA=hVS, VF, E, T, A, Ii est un n-uplet où :

- VS et VF sont des ensembles de variables disjoints. Les éléments de VS (resp. VF) sont les variables d’état (resp.de flux).

- E est l’ensemble des événements.

- T ⊆BF(VS∪VF)×E× F(VS, T(VS∪VF))est l’ensemble des macro-transitions. Sihg, e, αi appartient à T,g est appelée la garde,e l’événement et α l’affectation de la transition. α n’est pas nécessairement totale.

- A⊆BF(VS∪VF)contient l’ensemble des assertionsdu modèle i.e. les invariants qui doivent être satisfaits par les affectations de variables.

- I⊆BF(VS)contient la contrainte initiale.

Dans le cas de l’automate à contraintes, une configuration deAest une valuation de ses variables qui satisfaitA. On obtient ainsiQ, l’ensemble des configurations deA.

Un automate à contraintes est donc un système de transitions étiquetées. On peut le rapprocher des définitions données en section 3.1. En particulier, les notions de successeurs et d’accessibles sont totalement applicables ici.

Nous n’entrerons pas plus dans les détails concernant la représentation formelle du modèle. Pour approfondir la notion d’automate à contraintes enAltaRica, on pourra se référer au rapport de recherche [GPKV11] qui décrit tout cela plus en détail.

Nous pouvons maintenant représenter l’automate à contraintes qui correspond au comportement de notre exemple de système d’interrupteurs (cf. figure 6.12).

Représentons tout d’abord l’automate à contraintes pour un interrupteur en figure 6.13. Pour cela, nous représentons les configurations comme un triplet(on, i, o)qui contient les valuations des variableson,ieto.

(t,0,0) q0

(f,0,0) q1

(f,1,0) q2

(t,1,1) q3

push

push

push

push push

push

push

push

Figure6.13 – Automate de comportement pour un interrupteur

Nous représentons l’automate de comportement du système d’interrupteurs en figure 6.14. Pour cela, une configuration de l’automate correspond à deux triplets{(S1.on, S1.i, S1.o),(S2.on, S2.i, S2.o)}.