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
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
1
2
◮ A short tutorial on Cubicle ◮ Theoretical foundations ◮ Implementation details
3
◮ It is based on the theoretical framework of Model Checking
◮ Its implementation relies on a lightweight and enhanced
4
5
6
7
8
8
8
X←1 EAX←Y Y←1 EBX←X
9
X←1 EAX←Y Y←1 EBX←X Y←1
EAX←Y
Y←1
EBX←X EBX←X
EBX←X
EAX←Y 10
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
◮ Characterize bad states ◮ Use Cubicle to show that bad states cannot be reach from
12
◮ Replication of components ◮ Unknown or very large number of components
13
◮ 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
◮ bad states described with existentially-quantified formulas
◮ transitions parameterized by process identifiers
14
Want Idle Crit Turn = i Turn = ?
15
Wait Idle Crit ∀j. j< i ⇒ Q[j] = Idle ∀j.j > i ⇒ Q[j] = Idle
16
E M S I Read miss Write miss Write hit
17
◮ data types (records, several parameterized data types) ◮ programming constructs (sequences, loops) ◮ arithmetic expressions
18
19
◮ Initial states are defined by a universally quantified formula
19
◮ Initial states are defined by a universally quantified formula
19
◮ Initial states are defined by a universally quantified formula
19
◮ Initial states are defined by a universally quantified formula
◮ Bad states are defined by special existentially quantified
19
◮ Initial states are defined by a universally quantified formula
◮ Bad states are defined by special existentially quantified
19
◮ Initial states are defined by a universally quantified formula
◮ Bad states are defined by special existentially quantified
19
◮ Initial states are defined by a universally quantified formula
◮ Bad states are defined by special existentially quantified
◮ Transitions correspond to existentially quantified formulas
19
◮ Initial states are defined by a universally quantified formula
◮ Bad states are defined by special existentially quantified
◮ Transitions correspond to existentially quantified formulas
19
◮ Initial states are defined by a universally quantified formula
◮ Bad states are defined by special existentially quantified
◮ Transitions correspond to existentially quantified formulas
19
20
21
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)
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)
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
23
23
23
23
23
I
U Post*(I) Strongest inductive invariant
I
U Pre*(U) Weakest inductive invariant 24
ψ∈V ψ) then
25
ψ∈V ψ) then (* SMT check *)
25
26
I U 27
V Q I U 27
V Q I U 27
V Q I U 27
V Q I U 27
V Q I U 27
V Q I U 27
V Q I U 27
V I U 27
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′
S[x] = Crit ∧ S[y] = Want ∧ Turn = y S[x] = Crit ∧ S[y] = Crit ∧ S[z] = Want ∧ Turn = z
28
29
ψ∈V ψ) then
30
31
31
31
31
31
31
◮ Fast checks: Gψσ ⊆ F ◮ Irrelevant permutations:
◮ A single SMT-context is used for each fixpoint check; it just
32
ψ∈V ψ) then
33
34
34
34
34
◮ Based on the Functory Library [Filliˆ
◮ Search can be parallelized:
35
36
36
36
36
36
36
37
38
O.M. > 20 GB T.O. > 20 h
38
◮ Cache-coherence shared memory ◮ High-performance message passing ◮ 67 million states for 4 processes (∼40 variables, ∼75
39
◮ infers invariants for parameterized case using finite instances ◮ inserts and checks them on the fly in a backward reachability
◮ backtracks if necessary
40
E S I Shr[i] := true Exg := true Exg := true Shr[i] := true Shr[i] := false Exg := false Exg := false Shr[i] := false
41
E S I Shr[i] := true Exg := true Exg := true Shr[i] := true Shr[i] := false Exg := false Exg := false Shr[i] := false
41
I U 42
V Q I U 42
V Q I U 42
V Q I U 42
V Q I U 42
V Q I U 42
V Q I U 42
V Q I U 42
V I U 42
I U
43
I U 2
43
I U 2 2
43
V Q I U 2 2 43
V Q ϕ I U 2 2 43
V Q candidate I U 2 2 43
V Q I U 2 2 43
V Q V Q I U 2 2 43
V Q V Q ϕ I U 2 2 43
V Q V Q I U 2 2 43
V Q I U 2 2 43
V Q I U 2 2 43
V Q I U 2 2 43
V Q I U 2 2 43
I U 2 2
43
V Q I U 2 2 43
V Q I U 2 2 43
V Q V Q I U 2 2 43
V Q V Q V Q I U 2 2 43
V I U 2 2 43
44
45
ψ∈V ψ) then
46
ψ∈V ψ) then
46
47
¬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
¬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
. . .
¬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
. . .
¬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
. . .
¬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
. . . . . .
¬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
. . . . . .
¬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
. . . . . .
¬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
. . . . . .
¬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
. . . . . .
¬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
. . . . . .
¬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
| =
. . . . . .
¬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
| =
. . . . . .
¬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
| =
. . . . . .
¬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
| = | =
. . . . . .
¬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
| = | =
. . . . . .
¬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
| = | =
. . . . . .
¬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
| = | =
. . . . . .
¬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
| = | =
. . . . . .
¬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
| = | =
. . . . . .
¬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
| = | =
. . . . . .
¬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
| = | =
. . . . . .
¬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
| = | =
. . . . . .
¬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
O.M. > 20 GB T.O. > 20 h
49
◮ http://users.mat.unimi.it/users/ghilardi/mcmt/
50
◮ Certificates for Parameterized Model Checking [FM 2015] ◮ Invariants for Finite Instances and Beyond [FMCAD 2013] ◮ Cubicle: A Parallel SMT-based Model Checker for
◮ Inf´
◮ V´
◮ V´
51