Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Fengmin Zhu
RefinedC
Commits
341fdd3e
Commit
341fdd3e
authored
Nov 10, 2020
by
Michael Sammler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
generate proofs for spinlock automatically
parent
85faf59b
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
73 additions
and
60 deletions
+73
-60
examples/proofs/spinlock/generated_code.v
examples/proofs/spinlock/generated_code.v
+34
-34
examples/proofs/spinlock/generated_proof_sl_init.v
examples/proofs/spinlock/generated_proof_sl_init.v
+1
-0
examples/proofs/spinlock/generated_proof_sl_lock.v
examples/proofs/spinlock/generated_proof_sl_lock.v
+19
-1
examples/proofs/spinlock/generated_proof_sl_unlock.v
examples/proofs/spinlock/generated_proof_sl_unlock.v
+12
-1
examples/proofs/spinlock/spinlock_proof.v
examples/proofs/spinlock/spinlock_proof.v
+2
-22
examples/spinlock.c
examples/spinlock.c
+5
-2
No files found.
examples/proofs/spinlock/generated_code.v
View file @
341fdd3e
...
...
@@ -7,40 +7,40 @@ Set Default Proof Using "Type".
(* Generated from [examples/spinlock.c]. *)
Section
code
.
Definition
file_0
:
string
:
=
"examples/spinlock.c"
.
Definition
loc_2
:
location_info
:
=
LocationInfo
file_0
6
4
6
19
.
Definition
loc_3
:
location_info
:
=
LocationInfo
file_0
6
4
6
14
.
Definition
loc_4
:
location_info
:
=
LocationInfo
file_0
6
4
6
8
.
Definition
loc_5
:
location_info
:
=
LocationInfo
file_0
6
4
6
8
.
Definition
loc_6
:
location_info
:
=
LocationInfo
file_0
6
17
6
18
.
Definition
loc_9
:
location_info
:
=
LocationInfo
file_0
1
1
4
1
1
23
.
Definition
loc_10
:
location_info
:
=
LocationInfo
file_0
1
2
4
1
4
5
.
Definition
loc_11
:
location_info
:
=
LocationInfo
file_0
1
2
4
1
4
5
.
Definition
loc_12
:
location_info
:
=
LocationInfo
file_0
1
2
144
1
4
5
.
Definition
loc_13
:
location_info
:
=
LocationInfo
file_0
1
3
8
1
3
21
.
Definition
loc_14
:
location_info
:
=
LocationInfo
file_0
1
2
4
1
4
5
.
Definition
loc_15
:
location_info
:
=
LocationInfo
file_0
1
2
4
1
4
5
.
Definition
loc_16
:
location_info
:
=
LocationInfo
file_0
1
3
8
1
3
16
.
Definition
loc_17
:
location_info
:
=
LocationInfo
file_0
1
3
19
1
3
20
.
Definition
loc_18
:
location_info
:
=
LocationInfo
file_0
1
2
10
1
2
142
.
Definition
loc_19
:
location_info
:
=
LocationInfo
file_0
1
2
10
1
2
130
.
Definition
loc_20
:
location_info
:
=
LocationInfo
file_0
1
2
10
1
2
59
.
Definition
loc_21
:
location_info
:
=
LocationInfo
file_0
1
2
60
1
2
71
.
Definition
loc_22
:
location_info
:
=
LocationInfo
file_0
1
2
61
1
2
71
.
Definition
loc_23
:
location_info
:
=
LocationInfo
file_0
1
2
61
1
2
65
.
Definition
loc_24
:
location_info
:
=
LocationInfo
file_0
1
2
61
1
2
65
.
Definition
loc_25
:
location_info
:
=
LocationInfo
file_0
1
2
73
1
2
82
.
Definition
loc_26
:
location_info
:
=
LocationInfo
file_0
1
2
74
1
2
82
.
Definition
loc_27
:
location_info
:
=
LocationInfo
file_0
1
2
84
1
2
85
.
Definition
loc_28
:
location_info
:
=
LocationInfo
file_0
1
2
134
1
2
142
.
Definition
loc_29
:
location_info
:
=
LocationInfo
file_0
1
2
141
1
2
142
.
Definition
loc_30
:
location_info
:
=
LocationInfo
file_0
1
1
21
1
1
22
.
Definition
loc_35
:
location_info
:
=
LocationInfo
file_0
19
4
19
74
.
Definition
loc_36
:
location_info
:
=
LocationInfo
file_0
19
4
19
35
.
Definition
loc_37
:
location_info
:
=
LocationInfo
file_0
19
36
19
47
.
Definition
loc_38
:
location_info
:
=
LocationInfo
file_0
19
37
19
47
.
Definition
loc_39
:
location_info
:
=
LocationInfo
file_0
19
37
19
41
.
Definition
loc_40
:
location_info
:
=
LocationInfo
file_0
19
37
19
41
.
Definition
loc_41
:
location_info
:
=
LocationInfo
file_0
19
49
19
50
.
Definition
loc_2
:
location_info
:
=
LocationInfo
file_0
8
4
8
19
.
Definition
loc_3
:
location_info
:
=
LocationInfo
file_0
8
4
8
14
.
Definition
loc_4
:
location_info
:
=
LocationInfo
file_0
8
4
8
8
.
Definition
loc_5
:
location_info
:
=
LocationInfo
file_0
8
4
8
8
.
Definition
loc_6
:
location_info
:
=
LocationInfo
file_0
8
17
8
18
.
Definition
loc_9
:
location_info
:
=
LocationInfo
file_0
1
3
4
1
3
23
.
Definition
loc_10
:
location_info
:
=
LocationInfo
file_0
1
5
4
1
7
5
.
Definition
loc_11
:
location_info
:
=
LocationInfo
file_0
1
5
4
1
7
5
.
Definition
loc_12
:
location_info
:
=
LocationInfo
file_0
1
5
144
1
7
5
.
Definition
loc_13
:
location_info
:
=
LocationInfo
file_0
1
6
8
1
6
21
.
Definition
loc_14
:
location_info
:
=
LocationInfo
file_0
1
5
4
1
7
5
.
Definition
loc_15
:
location_info
:
=
LocationInfo
file_0
1
5
4
1
7
5
.
Definition
loc_16
:
location_info
:
=
LocationInfo
file_0
1
6
8
1
6
16
.
Definition
loc_17
:
location_info
:
=
LocationInfo
file_0
1
6
19
1
6
20
.
Definition
loc_18
:
location_info
:
=
LocationInfo
file_0
1
5
10
1
5
142
.
Definition
loc_19
:
location_info
:
=
LocationInfo
file_0
1
5
10
1
5
130
.
Definition
loc_20
:
location_info
:
=
LocationInfo
file_0
1
5
10
1
5
59
.
Definition
loc_21
:
location_info
:
=
LocationInfo
file_0
1
5
60
1
5
71
.
Definition
loc_22
:
location_info
:
=
LocationInfo
file_0
1
5
61
1
5
71
.
Definition
loc_23
:
location_info
:
=
LocationInfo
file_0
1
5
61
1
5
65
.
Definition
loc_24
:
location_info
:
=
LocationInfo
file_0
1
5
61
1
5
65
.
Definition
loc_25
:
location_info
:
=
LocationInfo
file_0
1
5
73
1
5
82
.
Definition
loc_26
:
location_info
:
=
LocationInfo
file_0
1
5
74
1
5
82
.
Definition
loc_27
:
location_info
:
=
LocationInfo
file_0
1
5
84
1
5
85
.
Definition
loc_28
:
location_info
:
=
LocationInfo
file_0
1
5
134
1
5
142
.
Definition
loc_29
:
location_info
:
=
LocationInfo
file_0
1
5
141
1
5
142
.
Definition
loc_30
:
location_info
:
=
LocationInfo
file_0
1
3
21
1
3
22
.
Definition
loc_35
:
location_info
:
=
LocationInfo
file_0
22
4
22
74
.
Definition
loc_36
:
location_info
:
=
LocationInfo
file_0
22
4
22
35
.
Definition
loc_37
:
location_info
:
=
LocationInfo
file_0
22
36
22
47
.
Definition
loc_38
:
location_info
:
=
LocationInfo
file_0
22
37
22
47
.
Definition
loc_39
:
location_info
:
=
LocationInfo
file_0
22
37
22
41
.
Definition
loc_40
:
location_info
:
=
LocationInfo
file_0
22
37
22
41
.
Definition
loc_41
:
location_info
:
=
LocationInfo
file_0
22
49
22
50
.
(* Definition of struct [atomic_flag]. *)
Program
Definition
struct_atomic_flag
:
=
{|
...
...
examples/proofs/spinlock/generated_proof_sl_init.v
View file @
341fdd3e
...
...
@@ -3,6 +3,7 @@ From refinedc.examples.spinlock Require Import generated_code.
From
refinedc
.
examples
.
spinlock
Require
Import
generated_spec
.
From
refinedc
.
examples
.
spinlock
Require
Import
spinlock_def
.
From
refinedc
.
examples
.
spinlock
Require
Import
spinlock_proof
.
From
refinedc
.
examples
.
spinlock
Require
Import
spinlock_proof
.
Set
Default
Proof
Using
"Type"
.
(* Generated from [examples/spinlock.c]. *)
...
...
examples/proofs/spinlock/generated_proof_sl_lock.v
View file @
341fdd3e
...
...
@@ -13,5 +13,23 @@ Section proof_sl_lock.
(* Typing proof for [sl_lock]. *)
Lemma
type_sl_lock
:
⊢
typed_function
impl_sl_lock
type_of_sl_lock
.
Proof
.
refine
type_sl_lock
.
Qed
.
Proof
.
start_function
"sl_lock"
([[
p
gamma
]
beta
])
=>
arg_lock
local_expected
.
split_blocks
((
<[
"#1"
:
=
arg_lock
◁ₗ
(
p
@
(&
frac
{
beta
}
(
spinlock
(
gamma
))))
∗
local_expected
◁ₗ
(
false
@
(
boolean
(
bool_it
)))
]>
$
∅
)%
I
:
gmap
label
(
iProp
Σ
))
((
∅
)%
I
:
gmap
label
(
iProp
Σ
)).
-
repeat
liRStep
;
liShow
.
all
:
print_typesystem_goal
"sl_lock"
"#0"
.
-
repeat
liRStep
;
liShow
.
all
:
print_typesystem_goal
"sl_lock"
"#1"
.
Unshelve
.
all
:
sidecond_hook
;
prepare_sideconditions
;
normalize_and_simpl_goal
;
try
solve_goal
;
unsolved_sidecond_hook
.
all
:
try
by
rewrite
/
bytes_per_int
/=
;
have
->
:
bytes_per_addr
=
8
%
nat
;
solve_goal
.
all
:
print_sidecondition_goal
"sl_lock"
.
Qed
.
End
proof_sl_lock
.
examples/proofs/spinlock/generated_proof_sl_unlock.v
View file @
341fdd3e
...
...
@@ -13,5 +13,16 @@ Section proof_sl_unlock.
(* Typing proof for [sl_unlock]. *)
Lemma
type_sl_unlock
:
⊢
typed_function
impl_sl_unlock
type_of_sl_unlock
.
Proof
.
refine
type_sl_unlock
.
Qed
.
Proof
.
start_function
"sl_unlock"
([[
p
gamma
]
beta
])
=>
arg_lock
.
split_blocks
((
∅
)%
I
:
gmap
label
(
iProp
Σ
))
((
∅
)%
I
:
gmap
label
(
iProp
Σ
)).
-
repeat
liRStep
;
liShow
.
all
:
print_typesystem_goal
"sl_unlock"
"#0"
.
Unshelve
.
all
:
sidecond_hook
;
prepare_sideconditions
;
normalize_and_simpl_goal
;
try
solve_goal
;
unsolved_sidecond_hook
.
all
:
print_sidecondition_goal
"sl_unlock"
.
Qed
.
End
proof_sl_unlock
.
examples/proofs/spinlock/spinlock_proof.v
View file @
341fdd3e
...
...
@@ -5,9 +5,10 @@ From refinedc.examples.spinlock Require Import spinlock_def.
From
refinedc
.
examples
.
spinlock
Require
Import
generated_code
generated_spec
.
Set
Default
Proof
Using
"Type"
.
Typeclasses
Transparent
spinlock
spinlocked_ex
spinlock_token
spinlocked_ex_token
.
Section
type
.
Context
`
{!
typeG
Σ
}
`
{!
lockG
Σ
}.
Typeclasses
Transparent
spinlock
spinlocked_ex
spinlock_token
spinlocked_ex_token
.
Lemma
type_sl_init
:
...
...
@@ -26,25 +27,4 @@ Section type.
Unshelve
.
all
:
prepare_sideconditions
;
solve_goal
.
Qed
.
Lemma
type_sl_lock
:
⊢
typed_function
impl_sl_lock
type_of_sl_lock
.
Proof
.
start_function
"sl_lock"
([[
p
γ
]
β
])
=>
vl
vexpected
.
split_blocks
({[
"#1"
:
=
vl
◁ₗ
p
@
&
frac
{
β
}
(
spinlock
γ
)
∗
vexpected
◁ₗ
false
@
boolean
bool_it
]}%
I
:
gmap
label
(
iProp
Σ
))
(
∅
:
gmap
label
(
iProp
Σ
)).
-
repeat
liRStep
;
liShow
.
-
repeat
liRStep
;
liShow
.
Unshelve
.
all
:
prepare_sideconditions
;
try
solve_goal
.
rewrite
/
bytes_per_int
/=.
have
->
:
bytes_per_addr
=
8
%
nat
;
solve_goal
.
Qed
.
Lemma
type_sl_unlock
:
⊢
typed_function
impl_sl_unlock
type_of_sl_unlock
.
Proof
.
start_function
"sl_unlock"
([[
p
γ
]
β
])
=>
vl
.
split_blocks
(
∅
:
gmap
label
(
iProp
Σ
))
(
∅
:
gmap
label
(
iProp
Σ
)).
repeat
liRStep
;
liShow
.
Unshelve
.
all
:
prepare_sideconditions
;
solve_goal
.
Qed
.
End
type
.
examples/spinlock.c
View file @
341fdd3e
#include <stdbool.h>
#include <spinlock.h>
//@rc::import spinlock_proof from refinedc.examples.spinlock (for proofs only)
[[
rc
::
manual_proof
(
"refinedc.examples.spinlock:spinlock_proof, type_sl_init"
)]]
void
sl_init
(
struct
spinlock
*
lock
)
{
lock
->
lock
=
0
;
}
[[
rc
::
manual_proof
(
"refinedc.examples.spinlock:spinlock_proof, type_sl_lock
"
)]]
[[
rc
::
tactics
(
"all: try by rewrite /bytes_per_int/=; have ->: bytes_per_addr = 8%nat; solve_goal.
"
)]]
void
sl_lock
(
struct
spinlock
*
lock
)
{
bool
expected
=
0
;
[[
rc
::
inv_vars
(
"expected : false @ boolean<bool_it>"
)]]
while
(
atomic_compare_exchange_strong
(
&
lock
->
lock
,
&
expected
,
1
)
==
(
bool
)
false
)
{
expected
=
0
;
}
}
[[
rc
::
manual_proof
(
"refinedc.examples.spinlock:spinlock_proof, type_sl_unlock"
)]]
void
sl_unlock
(
struct
spinlock
*
lock
)
{
atomic_store
(
&
lock
->
lock
,
0
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment