• Aucun résultat trouvé

3.2 Langages Simulink et Stateflow

3.2.4 Typage en Simulink

En Simulink, les types n’ont pas besoin d’être explicitement précisés. Cepen- dant, le système de type de Simulink dispose de règles de typage qui doivent être respectées par les circuits.

Les types de base numériques en Simulink sont résumés dans la table3.1. Avec realmin une fonction Matlab qui renvoie la plus petite valeur positive à virgule flottante représentable sur la machine. realmin(’single’) est la plus petite valeur positive simple précision à virgule flottante représentable sur la machine concernée. Réciproquement, realmax(’single’) est la plus grande valeur réelle positive en simple précision à virgule flottante représen- table sur la machine.

Dans la grammaire suivante, nous décrivons les types de base de Simulink qui sont acceptés par le système de type de GeneAuto. Les types numériques

Type Désignation taille plage

int8 Entier signé 8 bits [-128 ,127] uint8 Entier non signé 8 bits [0 , 255] int16 Entier signé 16 bits [-32768 , 32767] uint16 Entier non signé 16 bits [0 , 65535]

int32 Entier signé 32 bits [-2147483648, 2147483647] uint32 Entier non signé 32 bits [0, 4294967295]

single Réel simple précision 32 bits [realmin(’single’), realmax(’single’)] double Réel double précision 64 bits [realmin(’double’), realmax(’double’)]

Tab. 3.1 – Les types numériques de base en Simulink

acceptés par ce dernier sont ceux décrits dans la table 3.1 hormis int64 et uint64.

Les types de base en Simulink sont boolean, single, double, int8, uint8, int16, uint16, int32 et uint32. Le type double est le type des réels représentés sur 64 bits, les types int8, int16 et int32 sont des types entiers signés respectivement sur 8, 16 et 32 bits, contrairement aux entiers non signés uint8, uint16 et uint32. La configuration par défaut de Simulink consiste à typer tous les signaux, initialement, par double sauf si le signal est connecté à un bloc nécessitant un autre type ou si l’utilisateur a précisé explici- tement un autre type. Cette configuration est également différente dans le cas où un bloc Data Type Converter est utilisé. Ce bloc convertit une entrée de type t1 en une sortie de type t2. De plus, les blocs nécessitant un type différent tel

que les blocs logiques changent également cette configuration. La spécification de type en Simulink se fait lors de la spécification des blocs en précisant le type des ports de sortie. Un signal de donnée, en Simulink, doit avoir le même type sur ses deux extrémités.

Si le type d’un port n’est pas défini par l’utilisateur, il doit être calculé par inférence de type. Si l’inférence de type ne permet pas de le calculer, il sera initialisé au type double. Une erreur de type peut se produire lorsque des blocs manipulent des signaux de types incompatibles. Les règles de compatibi- lité peuvent être définies par l’utilisateur dans l’outil Simulink. Par exemple, celui-ci a la possibilité de spécifier le type de sortie à travers une fenêtre de dialogue. Notons également la fenêtre de dialogue de la figure3.19 qui offre la possibilité à l’utilisateur d’additionner des valeurs de types différents en cochant la case appropriée.

Si cette case n’est pas cochée, Simulink autorise l’application d’un opéra- teur arithmétique sur des entrées dont certaines sont de type boolean. Le circuit de la figure3.20additionne un entier (int8) et un booléen (boolean) sans pour autant signaler une erreur.

Remarquons que le résultat de l’addition obtenu est 3 alors que les valeurs additionnées sont 3 et false. L’explication de ce comportement en Simulink est simple : l’entrée booléenne false est représentée par 0, ensuite l’opération d’addition est effectuée normalement. Ceci est due à une conversion de type effectuée automatiquement par Simulink en interne du bloc Add.

Considérons maintenant le circuit de la figure 3.21. Il est spécifié dans le bloc Constant1 que la valeur 4 est de type booléen. Là aussi, l’addition est effectuée sans rejeter le circuit car deux conversions sont effectuées : d’une part, la valeur 4 est convertie en true, et d’autre part, la valeur true est convertie en 1 pour effectuer l’addition. Donc, toute valeur numérique non nulle correspond à true, sinon à false.

Fig. 3.19 – Fenêtre de dialogue du bloc Simulink Add int8 boolean Display 3 Constant1 false Constant 3 Add

Fig. 3.20 – La somme d’un entier et d’un booléen

Les cas présentés sont issus d’une conversion de type effectuée automati- quement par Simulink si l’utilisateur ne précise pas ce qui est toléré et ce qui ne l’est pas. Il est possible de refuser la conversion de booléens en numérique, en configurant l’option correspondante sur les signaux logiques booléens.

int8 boolean Display 4 Constant1 4 Constant 3 Add

Fig. 3.21 – Conversion implicite d’un entier en booléen

Le même raisonnement reste valable pour les blocs logiques qui peuvent, en l’absence de configuration spécifique, manipuler des entrées numériques.

En Simulink, les nombres complexes sont représentés par des paires de nombres (entiers ou réels). Celui-ci offre également des types énumérés conte- nant des valeurs de type caractère qui ne sont pas considérées dans nos travaux. Le type d’un port peut être explicitement précisé par l’utilisateur ou déduit de-

puis la valeur des paramètres du bloc en question. Il peut également être hérité du type d’un autre port. Par exemple, le type d’un port de sortie d’un bloc peut être hérité (s’il n’est pas précisé) du type d’une constante, du type du port d’en- trée ou encore du type de port du bloc cible auquel il est connecté. Simulink dispose également des types vecteur ou matrice dont les valeurs sont des types de base. Il supporte également les objets et les classes qui sont ignorés dans nos travaux. Les blocs Simulink ont généralement des types polymorphes. Il s’agit de polymorphisme ad-hoc où la sémantique du bloc dépend du type des pa- ramètres, ou de polymorphisme de coercion induit par la conversion implicite entre certains types.

L’outil Simulink/Stateflow dispose de plusieurs sémantiques, qui varient suivant les versions ainsi que les options de configuration choisies par l’utili- sateur et qui ne sont définies que de façon informelle, à travers les nombreux exemples et contre-exemples présentés dans la documentation de Simulink.