EJCP 2016 Model Checking Modulo Theories with Cubicle Sylvain - - PowerPoint PPT Presentation

ejcp 2016 model checking modulo theories with cubicle
SMART_READER_LITE
LIVE PREVIEW

EJCP 2016 Model Checking Modulo Theories with Cubicle Sylvain - - PowerPoint PPT Presentation

EJCP 2016 Model Checking Modulo Theories with Cubicle Sylvain Conchon LRI (UMR 8623), Universit e Paris-Sud Equipe Toccata, INRIA Saclay Ile-de-France 1 Cubicle An SMT based model checker for parameterized systems 2 Contents


slide-1
SLIDE 1

EJCP 2016 Model Checking Modulo Theories with Cubicle Sylvain Conchon

LRI (UMR 8623), Universit´ e Paris-Sud ´ Equipe Toccata, INRIA Saclay – ˆ Ile-de-France

1

slide-2
SLIDE 2

Cubicle An SMT based model checker for parameterized systems

2

slide-3
SLIDE 3

Contents

◮ A short tutorial on Cubicle ◮ Theoretical foundations ◮ Implementation details

3

slide-4
SLIDE 4

Cubicle : an open source model checker

Cubicle is an open source software written in OCaml.

◮ It is based on the theoretical framework of Model Checking

Modulo Theories [Ghilardi, Ranise]

◮ Its implementation relies on a lightweight and enhanced

version of the SMT solver Alt-Ergo Cubicle is the result of a fruitful collaboration between University

  • f Paris-Sud and Intel corporation

4

slide-5
SLIDE 5

Cubicle’s input language

Inspired by the description language of the Murϕ model checker (Dill’s group at Stanford) A program is only represented by a set of global variables and guarded commands.

5

slide-6
SLIDE 6

Guarded commands

A guarded command consists of a predicate on the state variables, called a guard, and a set of assignments that update those variables to change the state. The control structure is only a single infinite loop which repeatedly execute two steps:

  • 1. evaluate all the guards, given the current values of global

variables

  • 2. arbitrarily choose one of the commands whose guard is true

and execute it, updating the variables

6

slide-7
SLIDE 7

Example 1 : sequential programs

X,Y = 0 L0: X := 1; L1: Y := X + 1; L2:

type loc = L0 | L1 | L2 var X : int var Y : int var PC : loc init () { X = 0 && Y = 0 && PC = L0 } transition t1 () requires { PC = L0 } { X := 1; PC := L1 } transition t2 () requires { PC = L1 } { Y := X + 1; PC := L2 }

7

slide-8
SLIDE 8

Example 2 : granularity

L0: X := 1; L1: Y := X + 1; L2:

8

slide-9
SLIDE 9

Example 2 : granularity

L0: X := 1; L1: EAX := X; L2: EAX := EAX + 1; L3: Y := EAX; L4:

8

slide-10
SLIDE 10

Example 2 : granularity

L0: X := 1; L1: EAX := X; L2: EAX := EAX + 1; L3: Y := EAX; L4:

type loc = L0 | L1 | L2 | L3 | L4 var X : int var Y : int var EAX : int var PC : loc init () { X = 0 && Y = 0 && PC = L0 } transition t1 () requires { PC = L0 }{ X := 1; PC := L1 } transition t2 () requires { PC = L1 }{ EAX := X; PC := L2 } transition t3 () requires { PC = L2 } { EAX := EAX + 1; PC := L3 } transition t4 () requires { PC = L3 }{ Y := EAX; PC := L4 }

8

slide-11
SLIDE 11

Example 3 : threads

X,Y = 0 Thread 1 Thread 2 L0: X := 1; L1: EAX := Y; L2: L0: Y := 1; L1: EBX := X; L2:

X←1 EAX←Y Y←1 EBX←X

9

slide-12
SLIDE 12

Example 3 : interleaving semantics

X←1 EAX←Y Y←1 EBX←X Y←1

EAX←Y

Y←1

EBX←X EBX←X

EBX←X

EAX←Y 10

slide-13
SLIDE 13

Example 3

type location = L0 | L1 | L2 var X : int var Y : int var EAX : int var EBX : int var PC1 : location var PC2 : location init () { PC1 = L0 && PC2 = L0 && X = 0 && Y = 0 } transition writex_1 () requires { PC1 = L0 } { X := 1; PC1 := L1 } transition ready_1 () requires { PC1 = L1 } { EAX := Y; PC1 := L2 } transition writey_2 () requires { PC2 = L0 } { Y := 1; PC2 := L1 } transition readx_2 () requires { PC2 = L1 } { EBX := X; PC2 := L2 }

11

slide-14
SLIDE 14

Example 3 : safety property

◮ Characterize bad states ◮ Use Cubicle to show that bad states cannot be reach from

initial states

type loc = L0 | L1 | L2 var X : int var Y : int var EAX : int var EBX : int var PC1 : loc var PC2 : loc init () { PC1 = L0 && PC2 = L0 && X = 0 && Y = 0 } unsafe () { PC1 = L2 && PC2 = L2 && EAX = 0 && EBX = 0 } ...

12

slide-15
SLIDE 15

Parameterized systems

Modeling and verifying programs involving an arbitrary number of processes

◮ Replication of components ◮ Unknown or very large number of components

Typical examples : cache coherence protocols, mutual exclusion algorithms, fault-tolerant protocols

13

slide-16
SLIDE 16

Array-based transition systems

Cubicle handles parameterized systems through :

◮ a new built-in data type proc (with unspecified cardinality) ◮ state variables defined as arrays indexed by process identifiers ◮ initial states described with a universally-quantified formula

  • ver processes

◮ bad states described with existentially-quantified formulas

  • ver processes

◮ transitions parameterized by process identifiers

14

slide-17
SLIDE 17

Example 4 : array-based transition systems

A Dekker-like mutual exclusion algorithm

Want Idle Crit Turn = i Turn = ?

type st = Idle | Want | Crit var Turn : proc array S[proc] : st init (z) { S[z] = Idle } unsafe (x y) { S[x] = Crit && S[y] = Crit } transition req (i) requires { S[i] = Idle } { S[i] := Want } transition enter (i) requires { S[i] = Want && Turn = i } { S[i] := Crit } transition exit (i) requires { S[i] = Crit } { Turn := ? ; S[i] := Idle }

15

slide-18
SLIDE 18

Example 5 : global conditions

A Bakery-like mutual exclusion algorithm

Wait Idle Crit ∀j. j< i ⇒ Q[j] = Idle ∀j.j > i ⇒ Q[j] = Idle

type t = Idle | Wait | Crit array Q[proc] : t init (i) { Q[i]=Idle } unsafe (i j) { Q[i]=Crit && Q[j]=Crit } transition wait (i) requires { Q[i]=Idle && forall_other j. (j>i => Q[j]=Idle) } { Q[i] := Wait } transition enter (i) requires { Q[i]=Wait && forall_other j. (j<i => Q[j]=Idle) } { Q[i] := Crit } transition exit (i) requires { Q[i] = Crit } { Q[i] := Idle }

16

slide-19
SLIDE 19

Example 6 : case analysis

MESI protocol

E M S I Read miss Write miss Write hit

type state = M | E | S | I array St[proc]: state init (i) { St[i] = I } transition read_miss ( i ) requires { St[i] = I } { St[j] := case | j = i : S | St[j] = E : S | St[j] = M : S | _ : St[j] } transition write_miss ( i ) requires { St[i] = I } { St[j] := case | j = i : E | _ : I } transition write_hit_1 ( i ) requires { St[i] = E }{ St[i] := M } transition write_hit_2 ( i ) requires { St[i] = S } { St[j] := case | j = i : E | _ : I }

17

slide-20
SLIDE 20

Language limitations

Cubicle’s input language is still limited; it could be further improved.

◮ data types (records, several parameterized data types) ◮ programming constructs (sequences, loops) ◮ arithmetic expressions

18

slide-21
SLIDE 21

Theoretical foundation : MCMT

Cubicle implements the Model Checking Modulo Theories (MCMT) framework [Ghilardi, Ranise] where system states and transitions are defined as first-order formulas

19

slide-22
SLIDE 22

Theoretical foundation : MCMT

Cubicle implements the Model Checking Modulo Theories (MCMT) framework [Ghilardi, Ranise] where system states and transitions are defined as first-order formulas

◮ Initial states are defined by a universally quantified formula

19

slide-23
SLIDE 23

Theoretical foundation : MCMT

Cubicle implements the Model Checking Modulo Theories (MCMT) framework [Ghilardi, Ranise] where system states and transitions are defined as first-order formulas

◮ Initial states are defined by a universally quantified formula

init (i) { A[i] = True && PC = L1 }

19

slide-24
SLIDE 24

Theoretical foundation : MCMT

Cubicle implements the Model Checking Modulo Theories (MCMT) framework [Ghilardi, Ranise] where system states and transitions are defined as first-order formulas

◮ Initial states are defined by a universally quantified formula

init (i) { A[i] = True && PC = L1 } ∀i : proc.A[i] ∧ PC = L1

19

slide-25
SLIDE 25

Theoretical foundation : MCMT

Cubicle implements the Model Checking Modulo Theories (MCMT) framework [Ghilardi, Ranise] where system states and transitions are defined as first-order formulas

◮ Initial states are defined by a universally quantified formula

init (i) { A[i] = True && PC = L1 } ∀i : proc.A[i] ∧ PC = L1

◮ Bad states are defined by special existentially quantified

formulas, called cubes

19

slide-26
SLIDE 26

Theoretical foundation : MCMT

Cubicle implements the Model Checking Modulo Theories (MCMT) framework [Ghilardi, Ranise] where system states and transitions are defined as first-order formulas

◮ Initial states are defined by a universally quantified formula

init (i) { A[i] = True && PC = L1 } ∀i : proc.A[i] ∧ PC = L1

◮ Bad states are defined by special existentially quantified

formulas, called cubes unsafe (i j) { S[i] = Crit && S[j] = Crit }

19

slide-27
SLIDE 27

Theoretical foundation : MCMT

Cubicle implements the Model Checking Modulo Theories (MCMT) framework [Ghilardi, Ranise] where system states and transitions are defined as first-order formulas

◮ Initial states are defined by a universally quantified formula

init (i) { A[i] = True && PC = L1 } ∀i : proc.A[i] ∧ PC = L1

◮ Bad states are defined by special existentially quantified

formulas, called cubes unsafe (i j) { S[i] = Crit && S[j] = Crit } ∃i, j : proc. i = j ∧ S[i] = Crit ∧ S[j] = Crit

19

slide-28
SLIDE 28

Theoretical foundation : MCMT

Cubicle implements the Model Checking Modulo Theories (MCMT) framework [Ghilardi, Ranise] where system states and transitions are defined as first-order formulas

◮ Initial states are defined by a universally quantified formula

init (i) { A[i] = True && PC = L1 } ∀i : proc.A[i] ∧ PC = L1

◮ Bad states are defined by special existentially quantified

formulas, called cubes unsafe (i j) { S[i] = Crit && S[j] = Crit } ∃i, j : proc. i = j ∧ S[i] = Crit ∧ S[j] = Crit

◮ Transitions correspond to existentially quantified formulas

19

slide-29
SLIDE 29

Theoretical foundation : MCMT

Cubicle implements the Model Checking Modulo Theories (MCMT) framework [Ghilardi, Ranise] where system states and transitions are defined as first-order formulas

◮ Initial states are defined by a universally quantified formula

init (i) { A[i] = True && PC = L1 } ∀i : proc.A[i] ∧ PC = L1

◮ Bad states are defined by special existentially quantified

formulas, called cubes unsafe (i j) { S[i] = Crit && S[j] = Crit } ∃i, j : proc. i = j ∧ S[i] = Crit ∧ S[j] = Crit

◮ Transitions correspond to existentially quantified formulas

transition t(i) requires { S[i] = A && PC = L1 } { S[i] = B; X = X+1 }

19

slide-30
SLIDE 30

Theoretical foundation : MCMT

Cubicle implements the Model Checking Modulo Theories (MCMT) framework [Ghilardi, Ranise] where system states and transitions are defined as first-order formulas

◮ Initial states are defined by a universally quantified formula

init (i) { A[i] = True && PC = L1 } ∀i : proc.A[i] ∧ PC = L1

◮ Bad states are defined by special existentially quantified

formulas, called cubes unsafe (i j) { S[i] = Crit && S[j] = Crit } ∃i, j : proc. i = j ∧ S[i] = Crit ∧ S[j] = Crit

◮ Transitions correspond to existentially quantified formulas

transition t(i) requires { S[i] = A && PC = L1 } { S[i] = B; X = X+1 } ∃i : proc. S[i] = A ∧ PC = L1 ∧ S’ = S[i <- B] ∧ X’ = X + 1

19

slide-31
SLIDE 31

Inductive invariants

We are looking for a predicate Reach such that : Reach is an inductive invariant : ∀ x.Init( x) ⇒ Reach( x) ∀ x, x′.Reach( x) ∧ τ( x, x′) ⇒ Reach( x′) The system is safe if there exists an interpretation of Reach such that : ∀ x.Reach( x) | = ¬unsafe( x)

20

slide-32
SLIDE 32

Example 7 : Back to Dekker-like algorithm

type st = Idle | Want | Crit var T : proc array S[proc] : st init (z) { S[z] = Idle } unsafe (x y) { S[x] = Crit && S[y] = Crit } transition req (i) requires { S[i] = Idle } { S[i] := Want } transition enter (i) requires { S[i] = Want && T = i } { S[i] := Crit } transition exit (i) requires { S[i] = Crit } { T := ? ; S[i] := Idle }

21

slide-33
SLIDE 33

A pure SMT problem

type st = Idle | Want | Crit type proc logic Reach : proc, (proc,st) farray -> prop axiom init : forall t:proc. forall s:(proc,st) farray. (forall z:proc. s[z]=Idle) -> Reach(t,s) axiom req : forall t,t’:proc. forall s,s’:(proc,st) farray. Reach(t,s) and ( exists i:proc. s[i]=Idle and s’=s[i<-Want] and t’=t)

  • > Reach(t’,s’)

axiom enter : forall t,t’:proc. forall s,s’:(proc,st) farray. Reach(t,s) and (exists i:proc. s[i]=Want and t=i and s’= s[i<-Crit] and t’=t)

  • > Reach(t’,s’)

axiom exit : forall t,t’:proc. forall s,s’:(proc,st) farray. Reach(t,s) and ( exists i:proc. s[i]=Crit and s’=s[i<-Idle]) -> Reach(t’,s’) goal unsafe : exists t:proc. exists s:(proc,st) farray. exists i,j:proc. i<>j and Reach(t,s) and s[i]=Crit and s[j]=Crit

22

slide-34
SLIDE 34

Inductive Invariants (1)

var X : int init () { X = 0 } unsafe () { X = 9 } transition t () { X := X + 2 } axiom a1 : Reach(0) axiom a2 : forall x:int. Reach(x)->Reach(x+2) goal unsafe : exists x. Reach(x) and x = 9

23

slide-35
SLIDE 35

Inductive Invariants (1)

var X : int init () { X = 0 } unsafe () { X = 9 } transition t () { X := X + 2 } axiom a1 : Reach(0) axiom a2 : forall x:int. Reach(x)->Reach(x+2) goal unsafe : exists x. Reach(x) and x = 9 A possible interpretation for Reach could be {0, 2, 4, 6, . . .}

23

slide-36
SLIDE 36

Inductive Invariants (1)

var X : int init () { X = 0 } unsafe () { X = 9 } transition t () { X := X + 2 } axiom a1 : Reach(0) axiom a2 : forall x:int. Reach(x)->Reach(x+2) goal unsafe : exists x. Reach(x) and x = 9 A possible interpretation for Reach could be {0, 2, 4, 6, . . .}

  • r {0, 2, 4, 6, 8, 10, 11, 12, 13, . . .}

23

slide-37
SLIDE 37

Inductive Invariants (1)

var X : int init () { X = 0 } unsafe () { X = 9 } transition t () { X := X + 2 } axiom a1 : Reach(0) axiom a2 : forall x:int. Reach(x)->Reach(x+2) goal unsafe : exists x. Reach(x) and x = 9 A possible interpretation for Reach could be {0, 2, 4, 6, . . .}

  • r {0, 2, 4, 6, 8, 10, 11, 12, 13, . . .} but not N nor {0, 2, 4, 5, 6, 7, . . .}

23

slide-38
SLIDE 38

Inductive Invariants (1)

var X : int init () { X = 0 } unsafe () { X = 9 } transition t () { X := X + 2 } axiom a1 : Reach(0) axiom a2 : forall x:int. Reach(x)->Reach(x+2) goal unsafe : exists x. Reach(x) and x = 9 A possible interpretation for Reach could be {0, 2, 4, 6, . . .}

  • r {0, 2, 4, 6, 8, 10, 11, 12, 13, . . .} but not N nor {0, 2, 4, 5, 6, 7, . . .}

How to find interpretations for inductive invariants ?

23

slide-39
SLIDE 39

Inductive invariants (2)

Set of reachable states from Init = Strongest inductive invariant

I

U Post*(I) Strongest inductive invariant

Set of states that cannot reach Unsafe = Weakest inductive invariant

I

U Pre*(U) Weakest inductive invariant 24

slide-40
SLIDE 40

Backward Reachability (BR) : How to compute Pre*(U)

I : inital states U : unsafe states (cube) T : transitions BR (): V := ∅ ; push(Q, U ) ; while not empty(Q) do ϕ := pop(Q) if ϕ ∧ I sat then return unsafe if ¬(ϕ | =

ψ∈V ψ) then

V := V ∪ {ϕ} push(Q, preT (ϕ)) return safe

25

slide-41
SLIDE 41

Backward Reachability (BR) : How to compute Pre*(U)

I : inital states U : unsafe states (cube) T : transitions BR (): V := ∅ ; push(Q, U ) ; while not empty(Q) do ϕ := pop(Q) if ϕ ∧ I sat then return unsafe (* SMT check *) if ¬(ϕ | =

ψ∈V ψ) then (* SMT check *)

V := V ∪ {ϕ} push(Q, preT (ϕ)) return safe

25

slide-42
SLIDE 42

Pre-images

Given a transition t ∈ T , pret(ϕ) is a formula that describes the set of states from which a ϕ-state is reachable in one t-step preT (ϕ) =

  • t∈T

pret(ϕ) If ϕ is a cube, then preT (ϕ) can also be represented as a union of cubes

26

slide-43
SLIDE 43

Running BR

I U 27

slide-44
SLIDE 44

Running BR

V Q I U 27

slide-45
SLIDE 45

Running BR

V Q I U 27

slide-46
SLIDE 46

Running BR

V Q I U 27

slide-47
SLIDE 47

Running BR

V Q I U 27

slide-48
SLIDE 48

Running BR

V Q I U 27

slide-49
SLIDE 49

Running BR

V Q I U 27

slide-50
SLIDE 50

Running BR

V Q I U 27

slide-51
SLIDE 51

Running BR

V I U 27

slide-52
SLIDE 52

BR : example

S[x] = Crit ∧ S[y] = Crit S[x] = Want ∧ S[y] = Crit ∧ Turn = x S[x] = Idle ∧ S[y] = Crit ∧ Turn = x S[x] = Crit ∧ S[y] = Crit ∧ Turn = x′

preexit(x) prereq(x)

S[x] = Crit ∧ S[y] = Want ∧ Turn = y S[x] = Crit ∧ S[y] = Crit ∧ S[z] = Want ∧ Turn = z

preenter(x) preenter(y) preenter(z)

28

slide-53
SLIDE 53

Implementation issues and optimizations

29

slide-54
SLIDE 54

Fixpoint computation

V := ∅ push(Q, U) while not empty(Q) do ϕ := pop(Q) if ϕ ∧ I sat then return(unsafe) if ¬(ϕ | =

ψ∈V ψ) then

V := V ∪ {ϕ} push(Q, preT (ϕ)) return(safe)

30

slide-55
SLIDE 55

Fixpoint computation: a challenge

ϕ | =

  • ψ∈V

ψ

31

slide-56
SLIDE 56

Fixpoint computation: a challenge

∃¯ x.F | =

  • ψ∈V

∃¯ y.Gψ

31

slide-57
SLIDE 57

Fixpoint computation: a challenge

∃¯ x.F ∧

  • ψ∈V

∀¯ y.¬Gψ satisfiable ?

31

slide-58
SLIDE 58

Fixpoint computation: a challenge

∃¯ x.F ∧

  • ψ∈V

∀¯ y.¬Gψ satisfiable ? F and Gψ are conjunctions of literals involving several theories (uninterpreted function symbols, linear arithmetic, enumerations)

31

slide-59
SLIDE 59

Fixpoint computation: a challenge

∃¯ x.F ∧

  • ψ∈V
  • σ∈Σ

(¬Gψ)σ satisfiable ?

31

slide-60
SLIDE 60

Fixpoint computation: a challenge

∃¯ x.F ∧

  • ψ∈V
  • σ∈Σ

(¬Gψ)σ satisfiable ? Suppose |V| = 20000 and |Σ| = 120 (e.g. |¯ x| = |¯ y| = 5) then |

  • ψ∈V
  • σ∈Σ

(¬Gψ)σ| ∼ 2.106clauses

31

slide-61
SLIDE 61

Fixpoint computation: optimizations

◮ Fast checks: Gψσ ⊆ F ◮ Irrelevant permutations:

L ∈ Gψσ and L′ ∈ F and ¬(L ∧ L′) is immediate

◮ A single SMT-context is used for each fixpoint check; it just

gets incremented and repeatedly verified

32

slide-62
SLIDE 62

Node deletion

V := ∅ push(Q, U) while not empty(Q) ϕ := pop(Q) if ϕ ∧ I sat then return(unsafe) if ¬(ϕ | =

ψ∈V ψ) then

V := V ∪ {ϕ} push(Q, pre(ϕ)) return(safe)

33

slide-63
SLIDE 63

Node deletion : backward simplification

34

slide-64
SLIDE 64

Node deletion : backward simplification

34

slide-65
SLIDE 65

Node deletion : backward simplification

34

slide-66
SLIDE 66

Node deletion : backward simplification

34

slide-67
SLIDE 67

Towards a concurrent implementation

◮ Based on the Functory Library [Filliˆ

atre, Krishnamani] : master / worker architecture

◮ Search can be parallelized:

  • Expensive tasks = fixpoint checks
  • Synchronization to keep a precise guidance (BFS)
  • Deletion becomes dangerous

35

slide-68
SLIDE 68

Node deletion in parallel BFS

36

slide-69
SLIDE 69

Node deletion in parallel BFS

36

slide-70
SLIDE 70

Node deletion in parallel BFS

36

slide-71
SLIDE 71

Node deletion in parallel BFS

36

slide-72
SLIDE 72

Node deletion in parallel BFS

36

slide-73
SLIDE 73

Node deletion in parallel BFS

36

slide-74
SLIDE 74

Invariants

37

slide-75
SLIDE 75

How to scale?

Cubicle’s benchmarks on academic problems are promising

Cubicle CMurphi Szymanski at 0.30s 8.04s (8) 5m12s (10) 2h50m (12) German Baukus 7.03s 0.74s (4) 19m35s (8) 4h49m (10) German.CTC 3m23s 1.83s (4) 43m46s (8) 12h35m (10) German pfs 3m58s 0.99s (4) 22m56s (8) 5h30m (10) Chandra-Toueg 2h01m 5.68s (4) 2m58s (5) 1h36m (6)

38

slide-76
SLIDE 76

How to scale?

But how to scale up on industrial-like problems?

Cubicle CMurphi Szymanski at 0.30s 8.04s (8) 5m12s (10) 2h50m (12) German Baukus 7.03s 0.74s (4) 19m35s (8) 4h49m (10) German.CTC 3m23s 1.83s (4) 43m46s (8) 12h35m (10) German pfs 3m58s 0.99s (4) 22m56s (8) 5h30m (10) Chandra-Toueg 2h01m 5.68s (4) 2m58s (5) 1h36m (6) Szymanski na T.O. 0.88s (4) 8m25s (6) 7h08m (8) Flash nodata O.M. 4.86s (3) 3m33s (4) 2h46m (5) Flash O.M. 1m27s (3) 2h15m (4) O.M. (5)

O.M. > 20 GB T.O. > 20 h

38

slide-77
SLIDE 77

What Industrial-Like Means (for us)

A well-known candidate : the FLASH protocol (stanford multiprocessor architecture — 1994)

◮ Cache-coherence shared memory ◮ High-performance message passing ◮ 67 million states for 4 processes (∼40 variables, ∼75

transitions)

39

slide-78
SLIDE 78

Our Solution to Scale Up

We designed a new core algorithm for Cubicle that

◮ infers invariants for parameterized case using finite instances ◮ inserts and checks them on the fly in a backward reachability

loop

◮ backtracks if necessary

BRAB (Backward Reachability Algorithm with Approximations) [FMCAD 2013]

40

slide-79
SLIDE 79

Example: German-ish cache coherence protocol

Client i: Cache[i] ∈ {E, S, I} Directory: Cmd ∈ {rs, re, ǫ} Ptr ∈ proc Shr[i] ∈ {true, false} Exg ∈ {true, false}

E S I Shr[i] := true Exg := true Exg := true Shr[i] := true Shr[i] := false Exg := false Exg := false Shr[i] := false

Initial states: ∀i. Cache[i] = I ∧ ¬Shr[i] ∧ ¬Exg ∧ Cmd = ǫ Unsafe states: ∃i, j. i = j ∧ Cache[i] = E ∧ Cache[j] = I ? (cubes)

41

slide-80
SLIDE 80

Example: German-ish cache coherence protocol

Client i: Cache[i] ∈ {E, S, I} Directory: Cmd ∈ {rs, re, ǫ} Ptr ∈ proc Shr[i] ∈ {true, false} Exg ∈ {true, false}

E S I Shr[i] := true Exg := true Exg := true Shr[i] := true Shr[i] := false Exg := false Exg := false Shr[i] := false

t5 : ∃i. Ptr = i ∧ Cmd = rs ∧ ¬Exg ∧ Cmd′ = ǫ ∧ Shr′[i] ∧ Cache′[i] = S

41

slide-81
SLIDE 81

Backward reachability algorithm

I U 42

slide-82
SLIDE 82

Backward reachability algorithm

V Q I U 42

slide-83
SLIDE 83

Backward reachability algorithm

V Q I U 42

slide-84
SLIDE 84

Backward reachability algorithm

V Q I U 42

slide-85
SLIDE 85

Backward reachability algorithm

V Q I U 42

slide-86
SLIDE 86

Backward reachability algorithm

V Q I U 42

slide-87
SLIDE 87

Backward reachability algorithm

V Q I U 42

slide-88
SLIDE 88

Backward reachability algorithm

V Q I U 42

slide-89
SLIDE 89

Backward reachability algorithm

V I U 42

slide-90
SLIDE 90

BRAB: intuition

I U

43

slide-91
SLIDE 91

BRAB: intuition

I U 2

43

slide-92
SLIDE 92

BRAB: intuition

I U 2 2

43

slide-93
SLIDE 93

BRAB: intuition

V Q I U 2 2 43

slide-94
SLIDE 94

BRAB: intuition

V Q ϕ I U 2 2 43

slide-95
SLIDE 95

BRAB: intuition

V Q candidate I U 2 2 43

slide-96
SLIDE 96

BRAB: intuition

V Q I U 2 2 43

slide-97
SLIDE 97

BRAB: intuition

V Q V Q I U 2 2 43

slide-98
SLIDE 98

BRAB: intuition

V Q V Q ϕ I U 2 2 43

slide-99
SLIDE 99

BRAB: intuition

V Q V Q I U 2 2 43

slide-100
SLIDE 100

BRAB: intuition

V Q I U 2 2 43

slide-101
SLIDE 101

BRAB: intuition

V Q I U 2 2 43

slide-102
SLIDE 102

BRAB: intuition

V Q I U 2 2 43

slide-103
SLIDE 103

BRAB: intuition

V Q I U 2 2 43

slide-104
SLIDE 104

BRAB: intuition

I U 2 2

43

slide-105
SLIDE 105

BRAB: intuition

V Q I U 2 2 43

slide-106
SLIDE 106

BRAB: intuition

V Q I U 2 2 43

slide-107
SLIDE 107

BRAB: intuition

V Q V Q I U 2 2 43

slide-108
SLIDE 108

BRAB: intuition

V Q V Q V Q I U 2 2 43

slide-109
SLIDE 109

BRAB: intuition

V I U 2 2 43

slide-110
SLIDE 110

Inductive invariants and BRAB

I

U Pre*(U) Post*(I) VBRAB

φ ≡ ¬ VBRAB

44

slide-111
SLIDE 111

BRAB algorithm

I : inital states U : unsafe states (cubes) T : transitions BRAB (): B := ∅; Kind(U) := Orig; From(U) := U; M := FWD(dmax, k) ; while BWDA() = unsafe do if Kind(F) = Orig then return unsafe B := B ∪ { From(F) }; return safe

45

slide-112
SLIDE 112

BRAB algorithm

I : inital states U : unsafe states (cubes) T : transitions BWD (): V := ∅ ; push(Q, U ) ; while not empty(Q) do ϕ := pop(Q); if ϕ ∧ I sat then return unsafe if ¬(ϕ | =

ψ∈V ψ) then

V := V ∪ {ϕ}; push(Q, preT (ϕ)); return safe

46

slide-113
SLIDE 113

BRAB algorithm

I : inital states U : unsafe states (cubes) T : transitions BWDA (): V := ∅ ; push(Q, U ) ; while not empty(Q) do ϕ := pop(Q); if ϕ ∧ I sat then return unsafe if ¬(ϕ | =

ψ∈V ψ) then

V := V ∪ {ϕ}; push(Q, ApproxT (ϕ) ); return safe

46

slide-114
SLIDE 114

BRAB algorithm

I : inital states U : unsafe states (cubes) T : transitions ApproxT (ϕ): foreach ψ in candidates(ϕ) do if ψ ∈ B ∧ M ψ then Kind(ψ) := Appr ; . . . return ψ . . . return preT (ϕ)

47

slide-115
SLIDE 115

Example: BRAB on German-ish

¬Exg Cmd = ǫ ∀i. Cache[i] = I ¬Shr[i] t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1)

∃i = j. Cache[i] = E Cache[j] = I

48

slide-116
SLIDE 116

Example: BRAB on German-ish

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1)

∃i = j. Cache[i] = E Cache[j] = I

48

slide-117
SLIDE 117

Example: BRAB on German-ish

. . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

48

slide-118
SLIDE 118

Example: BRAB on German-ish

. . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j]

pre(t4(j))

48

slide-119
SLIDE 119

Example: BRAB on German-ish

. . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

pre(t4(j)) pre(t5(j))

48

slide-120
SLIDE 120

Example: BRAB on German-ish

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

pre(t4(j)) pre(t5(j)) pre(t6(i))

48

slide-121
SLIDE 121

Example: BRAB on German-ish

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

∃i. Cmd = rs Cache[i] = E pre(t4(j)) pre(t5(j)) pre(t6(i))

48

slide-122
SLIDE 122

Example: BRAB on German-ish

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

∃i. Cmd = rs Cache[i] = E pre(t4(j)) pre(t5(j)) pre(t6(i))

Extracting a candi

48

slide-123
SLIDE 123

Example: BRAB on German-ish

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

∃i. Cmd = rs Cache[i] = E pre(t4(j)) pre(t5(j)) pre(t6(i))

48

slide-124
SLIDE 124

Example: BRAB on German-ish

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

∃i. Cmd = rs Cache[i] = E pre(t4(j)) pre(t5(j)) pre(t6(i))

Shr[#1] ¬Shr[#2]

Checking

48

slide-125
SLIDE 125

Example: BRAB on German-ish

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

∃i. Cmd = rs Cache[i] = E pre(t4(j)) pre(t5(j)) pre(t6(i))

|

Shr[#1] ¬Shr[#2]

Checking

48

slide-126
SLIDE 126

Example: BRAB on German-ish

| =

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

∃i. Cmd = rs Cache[i] = E pre(t4(j)) pre(t5(j)) pre(t6(i))

48

slide-127
SLIDE 127

Example: BRAB on German-ish

| =

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Shr[j] Cache[i] = E ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

∃i. Cmd = rs Cache[i] = E pre(t4(j)) pre(t5(j)) pre(t6(i))

48

slide-128
SLIDE 128

Example: BRAB on German-ish

| =

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Shr[j] Cache[i] = E ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

∃i. Cmd = rs Cache[i] = E ¬Exg Cmd = rs pre(t4(j)) pre(t5(j)) pre(t6(i))

48

slide-129
SLIDE 129

Example: BRAB on German-ish

| = | =

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Shr[j] Cache[i] = E ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

∃i. Cmd = rs Cache[i] = E ¬Exg Cmd = rs pre(t4(j)) pre(t5(j)) pre(t6(i))

48

slide-130
SLIDE 130

Example: BRAB on German-ish

| = | =

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

Cache[i] = E ∃i. ¬Exg ∃i. Cmd = rs Cache[i] = E ¬Exg Cmd = rs ∃i = j. Shr[j] Cache[i] = E pre(t4(j)) pre(t5(j)) pre(t6(i))

48

slide-131
SLIDE 131

Example: BRAB on German-ish

| = | =

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

Cache[i] = E ∃i. ¬Exg ∃i. Cmd = rs Cache[i] = E ¬Exg Cmd = rs ∃i = j. Shr[j] Cache[i] = E pre(t4(j)) pre(t5(j)) pre(t6(i)) pre(t5(j))

48

slide-132
SLIDE 132

Example: BRAB on German-ish

| = | =

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

Cache[i] = E ∃i. ¬Exg ∃i. Cmd = rs Cache[i] = E ¬Exg Cmd = rs ∃i = j. Shr[j] Cache[i] = E pre(t4(j)) pre(t5(j)) pre(t6(i)) pre(t5(j))

48

slide-133
SLIDE 133

Example: BRAB on German-ish

| = | =

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

Cache[i] = E

∃i = j. Cmd = re Cache[i] = E Shr[j]

∃i. ¬Exg ∃i. Cmd = rs Cache[i] = E ¬Exg Cmd = rs ∃i = j. Shr[j] Cache[i] = E pre(t4(j)) pre(t5(j)) pre(t6(i)) pre(t5(j)) pre(t3(j))

48

slide-134
SLIDE 134

Example: BRAB on German-ish

| = | =

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

Cache[i] = E

∃i = j. Cmd = re Cache[i] = E Shr[j]

∃i. ¬Exg ∃i. Cmd = rs Cache[i] = E ¬Exg Cmd = rs ∃i = j. Shr[j] Cache[i] = E pre(t4(j)) pre(t5(j)) pre(t6(i)) pre(t5(j)) pre(t3(j))

48

slide-135
SLIDE 135

Example: BRAB on German-ish

| = | =

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

Cache[i] = E

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. Cmd = re Cache[i] = E Shr[j]

∃i. ¬Exg ∃i. Cmd = rs Cache[i] = E ¬Exg Cmd = rs ∃i = j. Shr[j] Cache[i] = E pre(t4(j)) pre(t5(j)) pre(t6(i)) pre(t5(j)) pre(t4(j)) pre(t3(j))

48

slide-136
SLIDE 136

Example: BRAB on German-ish

| = | =

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

Cache[i] = E

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. Cmd = re Cache[i] = E Shr[j]

∃i. ¬Exg ∃i. Cmd = rs Cache[i] = E ¬Exg Cmd = rs ∃i = j. Shr[j] Cache[i] = E pre(t4(j)) pre(t5(j)) pre(t6(i)) pre(t5(j)) pre(t4(j)) pre(t3(j))

48

slide-137
SLIDE 137

Example: BRAB on German-ish

| = | =

. . . . . .

¬Exg Cmd = ǫ Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = re Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = re Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] ¬Exg Cmd = rs Ptr = #2 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2]

¬Exg Cmd = rs

Ptr = #1 Cache[#1] = I Cache[#2] = I ¬Shr[#1] ¬Shr[#2] Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = E ¬Shr[#1] Shr[#2] Exg Cmd = ǫ Ptr = #1 Cache[#1] = E Cache[#2] = I Shr[#1] ¬Shr[#2] ¬Exg Cmd = ǫ Ptr = #2 Cache[#1] = I Cache[#2] = S ¬Shr[#1] Shr[#2] Exg

Cmd = rs

Ptr = #2

Cache[#1] = E

Cache[#2] = I Shr[#1] ¬Shr[#2]

t2(#2) t2(#1) t1(#2) t1(#1) t6(#2) t6(#1) t5(#2) t5(#1) t2(#1) t1(#1) t2(#2) t1(#2) t2(#2) t2(#1) t1(#1) ∃i = j. Cache[i] = E Cache[j] = I

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E ∃i = j. ¬Exg Cmd = rs Ptr = j Cache[i] = E

Cache[i] = E

∃i = j. Exg Cmd = rs Cache[i] = E Shr[j] ∃i = j. Cmd = re Cache[i] = E Shr[j]

∃i. ¬Exg ∃i. Cmd = rs Cache[i] = E ¬Exg Cmd = rs ∃i = j. Shr[j] Cache[i] = E pre(t4(j)) pre(t5(j)) pre(t6(i)) pre(t5(j)) pre(t4(j)) pre(t3(j))

48

slide-138
SLIDE 138

Some benchmarks

BRAB Cubicle CMurphi Szymanski at 0.14s 0.30s 8.04s (8) 5m12s (10) 2h50m (12) German Baukus 0.25s 7.03s 0.74s (4) 19m35s (8) 4h49m (10) German.CTC 0.29s 3m23s 1.83s (4) 43m46s (8) 12h35m (10) German pfs 0.34s 3m58s 0.99s (4) 22m56s (8) 5h30m (10) Chandra-Toueg 2m17s 2h01m 5.68s (4) 2m58s (5) 1h36m (6) Szymanski na 0.19s T.O. 0.88s (4) 8m25s (6) 7h08m (8) Flash nodata 0.36s O.M. 4.86s (3) 3m33s (4) 2h46m (5) Flash 5m40s O.M. 1m27s (3) 2h15m (4) O.M. (5)

O.M. > 20 GB T.O. > 20 h

49

slide-139
SLIDE 139

Some papers

The Model Checking Modulo Theories paradigm has been

  • riginally proposed by Silvio Ghilardi et Silvio Ranise

◮ http://users.mat.unimi.it/users/ghilardi/mcmt/

In particular, I recommend Backward Reachability of Array-based Systems by SMT Solving: Termination and Invariant Synthesis [LMCS, vol.6, n.4, 2010]

50

slide-140
SLIDE 140

More information about Cubicle

In English :

◮ Certificates for Parameterized Model Checking [FM 2015] ◮ Invariants for Finite Instances and Beyond [FMCAD 2013] ◮ Cubicle: A Parallel SMT-based Model Checker for

Parameterized Systems [CAV 2012] In french :

◮ Inf´

erence d’Invariant pour le model checking de syst` emes param´ etr´ es [Alain Mebsout, PhD thesis, 2014]

◮ V´

erification de programmes C concurrents avec Cubicle : Enfoncer les barri` eres [JFLA 2014]

◮ V´

erification de syst` emes param´ etr´ es avec Cubicle [JFLA 2013]

51