-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmonitor_spec.py
55 lines (42 loc) · 1.73 KB
/
monitor_spec.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from typing import Callable, Any
import source
import nip
from ghost_data_helpers import *
msg_info_ret = source.ExprVar(source.type_word64, source.CRetSpecialVar(
'rv#space#ret__struct_seL4_MessageInfo_C#v.words_C.0'))
def htd_assigned() -> source.ExprVarT[nip.GuardVarName]:
return g(source.ExprVar(source.type_bool, source.ProgVarName('HTD')))
def mem_assigned() -> source.ExprVarT[nip.GuardVarName]:
return g(source.ExprVar(source.type_bool, source.ProgVarName('Mem')))
def pms_assigned() -> source.ExprVarT[nip.GuardVarName]:
return g(source.ExprVar(source.type_bool, source.ProgVarName('PMS')))
def ghost_asserts_assigned() -> source.ExprVarT[nip.GuardVarName]:
return g(source.ExprVar(source.type_bool, source.ProgVarName('GhostAssertions')))
def recv_postcondition(ret_var: source.ExprVarT[source.ProgVarName]) -> source.ExprT[source.ProgVarName]:
mem = source.ExprVar(source.type_mem, source.ProgVarName('Mem'))
gbadge: source.ExprT[source.ProgVarName] = source.ExprFunction(
source.type_word64, source.FunctionName('gbadge@global-symbol'), [])
gbadge_val = mem_acc(source.type_word64, gbadge, mem)
return conjs(
ule(gbadge_val, u64(63))
)
functions_spec = {
"tmp.monitor": source.Ghost(
precondition=conjs(),
postcondition=conjs(),
loop_invariants={lh("3"): conjs(
htd_assigned(),
mem_assigned(),
pms_assigned(),
ghost_asserts_assigned(),
)},
loop_iterations={lh("3"): source.empty_loop_ghost},
),
"tmp.seL4_Recv": source.Ghost(
precondition=conjs(
),
postcondition=recv_postcondition(msg_info_ret),
loop_invariants={},
loop_iterations={},
),
}