Title: SPIN / PROMELA
1SPIN / PROMELA
2Introduction (1)
- SPIN Simple Promela Interpreter
- Analyse de systèmes distribués, notamment des
protocoles de communications, - Modélisation du système en langage PROMELA,
- Simulation aléatoire ou interactive du modèle,
- Vérification dinvariants / de propriétés LTL sur
le modèle. - PROMELA Protocol/Processus Meta Language
- Langage de spécification de SPIN
- Documentation
- http//spinroot.com/spin/whatispin.html
- http//spinroot.com/spin/Man/Manual.html
3Introduction (2)
Verifier generator
Optimized Model-checker
PLTL parser and Translator
Executable On-the-fly Verifier
XSPINFront-End
Promelaparser
Interactive Simulation
Counter-examples
Syntax Error reports
4Promela
5Spécification Promela
- Une spécification Promela peut être composée de
- Variables,
- Canaux de communication,
- Un ou plusieurs processus un processus initial
 init . - Syntaxe proche de celle de C
- Commentaires de la forme / . /
6Types, variables et constantes
- Types de base bit, bool, byte, short, int
- Exemples
- bool sa, ra
- int i 0
Type Taille Domaine
bit 1 0...1
bool 1 01
byte 8 0...255
short 16 -215-1...215-1
int 32 -231-1...231-1
7Types, variables et constantes
- Types énumérés
- Ensemble de constantes symboliques
- Un seul type énuméré autorisé par spécification
- mtype Partiel,Complet,Ackmtype st,rt
- Structures
- typedef Mesg bool b int data
- -gt Structure Mesg avec un booléen et un entier
- Mesg mm.b 0m.data 5
8Types, variables et constantes
- Tableaux
- int sf5 tableau de 5 entiers (0 Ã 4).
- Canaux
- chan ch_bloc 3 of int
- canal pouvant contenir 3 messages,
chaque message étant un entier. - Constantes
- define MAX 5
- Constante MAX égale à 5.
9Opérateurs
Type Opérateurs
Arithmétiques , -, , /, , --,
Relationnels gt, gt, lt, lt, , !
Logiques , , !
Bits , , , , gtgt, ltlt
Canaux !, ?
10Processus
- Déclaration
- proctype nom_proc (paramètres formels)
- / Déclarations des variables locales et
instructions / -
- Instanciation
- run nom_proc (paramètres effectifs)
- Processus initial
- init
- / Déclarations des variables locales et
instructions / -
11Spécification Promela
- / Déclaration des constantes /
- / Déclaration et initialisation des variables
globales / - proctype sender ()
- / Déclaration des variables locales et
instructions / -
- proctype receiver ()
- / Déclarations des variables locales et
instructions / -
- init
- run sender() run receiver()
12Instructions
- Activables ou bloquées
- Si une instruction est activable, elle peut être
immédiatement exécutée. - Si une instruction est bloquée, lexécution du
processus dans lequel elle apparaît est bloquée
jusquà ce que linstruction devienne activable. - Instructions séparées par ou -gt
- Pas de distinction entre condition et instruction
- (ab) b b nest incrémenté que si a est
égal à b. Sinon, on dit que linstruction (ab)
est bloquante. On préférera ici la notation
(ab) -gt b
13Entrelacement (1)
- 1 processus 1 automate byte x2, y3
- proctype A() x x 1
- proctype B() x x 1 y y x
- init run A() run B()
14Entrelacement (2)
- byte x2, y3
- proctype A() x x 1
- proctype B() x x 1 y y x
- init run A() run B()
15Instructions atomiques
- atomic Instr1 Instr2 Instrn
- Activable si Instr1 est activable.
- Toutes les instructions sont effectuées en un
seul pas aucune autre instruction ne peut être
effectuée entre les instructions de  atomic . - Lexécution est suspendue si une des instructions
Instr2, , Instrn est bloquante -gt Attention Ã
bien sassurer que ces instructions ne sont
pas bloquantes !
16Instructions atomiques
- byte x2, y3
- proctype A() x x 1
- proctype B() atomic x x 1 y y x
- init run A() run B()
17Instruction conditionnelle
- Syntaxe
- if instr11 -gt instr12 instr1N
instrN1 -gt instrN2 instrNN else -gt
instructions / facultatif /fi - Activable si une des gardes est activable
- Si plusieurs gardes activables, choix
non-déterministe - Si aucune garde activable et else présent,
exécution des instructions suivant else.
18Boucles
- Syntaxe
- do instr11 -gt instr12 instr1N
instrN1 -gt instrN2 instrNN else -gt
instructions / facultatif /od - Pour sortir de la boucle, on peut utiliser une
instruction break ou goto. - do
-
- goto done
- od
- done printf()
19Canaux
- Files dattente (FIFO)
- Déclaration
- chan ch_bloc 5 of int
- chan ch_rdv 0 of int canal synchrone (un
message ne peut être envoyé que sil est attendu) - Envoi ch_bloc!exprexpr est envoyé sur ch_bloc
sil reste de la place dans la file dattente du
canal. Instruction bloquante sinon. - Réception
- ch_bloc?variablevariable reçoit pour valeur le
premier message du canal. Si aucun message sur le
canal, instruction bloquante. - ch_bloc?constante
- Exécutable si le premier message du canal a une
valeur égale à constante. Instruction bloquante
sinon.
20Canaux
- Messages de type  tupleÂ
- chan ch 5 of bool, int
- Envoi ch!exprB,exprI ou ch!exprB(exprI)
- Réception ch?varB,varI ou ch?varB(varI)
- Si oubli de paramètres, affectation non
déterministe pour les paramètres manquants - Les paramètres en trop sont perdus (sans
avertissements !).
21Canaux
- Quelques fonctions sur les canaux
- len(ch_bloc) retourne le nombre de messages
contenus dans ch_bloc(peut sutiliser dans une
affectation), - empty(ch_bloc) / nempty(ch_bloc) permet de
savoir si le canal ch_bloc est vide / non vide, - full(ch_bloc) / nfull(ch_bloc) permet de savoir
si ch_bloc est rempli / non rempli.
22Récursivité
- Utilisation des canaux
- int final_res
- proctype factorielle (int n chan p)
- chan res 1 of int
- int tmp_res
- if
- (nlt1) -gt p!1
- (ngt2) -gt
- run factorielle (n-1, res)
- res?tmp_res
- p!ntmp_res
- fi
init chan res 1 of int run factorielle
(5,res) res?final_res printf(Â resultat
d\n , final_res)