-
Notifications
You must be signed in to change notification settings - Fork 63
Expand file tree
/
Copy pathecPV.mli
More file actions
209 lines (154 loc) · 6.55 KB
/
ecPV.mli
File metadata and controls
209 lines (154 loc) · 6.55 KB
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
(* -------------------------------------------------------------------- *)
open EcMaps
open EcPath
open EcEnv
open EcAst
(* -------------------------------------------------------------------- *)
type alias_clash =
| AC_concrete_abstract of mpath * xpath
| AC_abstract_abstract of mpath * mpath
exception AliasClash of env * alias_clash
(* -------------------------------------------------------------------- *)
module Mnpv : Map.S with type key = prog_var
module Snpv : Set.S with module M = Map.MakeBase(Mnpv)
(* -------------------------------------------------------------------- *)
module PVMap : sig
type 'a t
val create : env -> 'a t
val add : prog_var -> 'a -> 'a t -> 'a t
val find : prog_var -> 'a t -> 'a option
val raw : 'a t -> 'a Mnpv.t
end
(* -------------------------------------------------------------------- *)
module Mpv : sig
type ('a,'b) t
val empty : ('a,'b) t
val check_npv_mp :
env -> xpath -> mpath -> use use_restr -> unit
val check_mp_mp :
env -> mpath -> use use_restr -> mpath -> use use_restr -> unit
val check_npv : env -> prog_var -> ('a,'b) t -> unit
val check_glob : env -> mpath -> ('a,'b) t -> unit
val add : env -> prog_var -> 'a -> ('a,'b) t -> ('a,'b) t
val remove : env -> prog_var -> ('a,'b) t -> ('a,'b) t
val add_glob : env -> mpath -> 'b -> ('a,'b) t -> ('a,'b) t
val find : env -> prog_var -> ('a,'b) t -> 'a
val mem : env -> prog_var -> ('a,'b) t -> bool
val find_glob : env -> mpath -> ('a,'b) t -> 'b
val pvs : ('a,'b) t -> 'a Mnpv.t
val esubst : env -> (expr, unit) t -> expr -> expr
val issubst : env -> (expr, unit) t -> instr list -> instr list
val isubst : env -> (expr, unit) t -> instr -> instr
val ssubst : env -> (expr, unit) t -> stmt -> stmt
end
(* -------------------------------------------------------------------- *)
exception MemoryClash
module PVM : sig
type subst
val empty : subst
val add : env -> prog_var -> EcIdent.t -> form -> subst -> subst
val of_list : env -> ((prog_var * EcIdent.t) * form) list -> subst
val add_glob : env -> mpath -> EcIdent.t -> form -> subst -> subst
val of_mpv : (form,form) Mpv.t -> EcIdent.t -> subst
val find : env -> prog_var -> memory -> subst -> form
val subst : env -> subst -> form -> form
val subst1 : env -> prog_var -> EcIdent.t -> form -> form -> form
end
(* -------------------------------------------------------------------- *)
module PV : sig
type t
val empty : t
val is_empty : t -> bool
val pick : t -> [`Global of mpath | `PV of prog_var] option
val add : env -> prog_var -> ty -> t -> t
val add_glob : env -> mpath -> t -> t
val remove : env -> prog_var -> t -> t
val union : t -> t -> t
val diff : t -> t -> t
val inter : t -> t -> t
val subset : t -> t -> bool
val interdep : env -> t -> t -> t
val indep : env -> t -> t -> bool
val check_depend : env -> t -> mpath -> unit
val elements : t -> (prog_var * ty) list * mpath list
val ntr_elements : t -> (prog_var * ty) list * mpath list
val mem_pv : env -> prog_var -> t -> bool
val mem_glob : env -> mpath -> t -> bool
val fv : env -> EcMemory.memory -> form -> t
val pp : env -> Format.formatter -> t -> unit
val iter : (prog_var -> ty -> unit) -> (mpath -> unit) -> t -> unit
val check_notmod : EcEnv.env -> EcTypes.prog_var -> t -> bool
end
(* -------------------------------------------------------------------- *)
type 'a pvaccess = env -> PV.t -> 'a -> PV.t
val lp_write_r : lvalue pvaccess
val i_write_r : ?except:Sx.t -> instr pvaccess
val is_write_r : ?except:Sx.t -> instr list pvaccess
val s_write_r : ?except:Sx.t -> stmt pvaccess
val f_write_r : ?except:Sx.t -> xpath pvaccess
val e_read_r : expr pvaccess
val form_read_r : form pvaccess
val i_read_r : instr pvaccess
val is_read_r : instr list pvaccess
val s_read_r : stmt pvaccess
val f_read_r : xpath pvaccess
(* -------------------------------------------------------------------- *)
type 'a pvaccess0 = env -> 'a -> PV.t
val lp_write : lvalue pvaccess0
val i_write : ?except:Sx.t -> instr pvaccess0
val is_write : ?except:Sx.t -> instr list pvaccess0
val s_write : ?except:Sx.t -> stmt pvaccess0
val f_write : ?except:Sx.t -> xpath pvaccess0
val e_read : expr pvaccess0
val form_read : form pvaccess0
val i_read : instr pvaccess0
val is_read : instr list pvaccess0
val s_read : stmt pvaccess0
val f_read : xpath pvaccess0
(* -------------------------------------------------------------------- *)
exception EqObsInError
module Mpv2 : sig
type t
val empty : t
type local
val empty_local : local
val enter_local: env -> local -> (EcIdent.t * ty) list ->
(EcIdent.t * ty) list -> local
val to_form_ts_inv : t -> ts_inv -> ts_inv
val to_form : t -> memory -> memory -> form -> form
val of_form : env -> ts_inv -> t
val needed_eq : env -> ts_inv -> t
val union : t -> t -> t
val subset : t -> t -> bool
val equal : t -> t -> bool
val remove : env -> prog_var -> prog_var -> t -> t
(* remove_glob mp t, mp should be a top abstract functor *)
val remove_glob : mpath -> t -> t
val add_glob : env -> mpath -> mpath -> t -> t
val add_eqs_loc : env -> local -> t -> expr -> expr -> t
val add_eqs : env -> expr -> expr -> t -> t
val subst_l : env -> prog_var -> prog_var -> t -> t
val subst_r : env -> prog_var -> prog_var -> t -> t
val substs_l : env -> (prog_var * 'a) list -> prog_var list -> t -> t
val substs_r : env -> (prog_var * 'a) list -> prog_var list -> t -> t
val check_glob : t -> unit
(* [mem x1 x2 eq] return true if (x1,x2) is in eq.
x1 and x2 are assumed in normal form *)
val mem : prog_var -> prog_var -> t -> bool
val mem_glob : mpath -> t -> bool
(* [iter fpv fabs eq] iterate fpv and fabs on all pair contained in eq.
The argument given to both function are in normal form *)
val iter :
(prog_var -> prog_var -> ty -> unit) -> (mpath -> unit) -> t -> unit
val eq_refl : PV.t -> t
val fv2 : t -> PV.t
val eq_fv2 : t -> t
val split_nmod : env -> PV.t -> PV.t -> t -> t
val split_mod : env -> PV.t -> PV.t -> t -> t
val is_mod_pv' : env -> prog_var -> t -> bool
val mem_pv_l : env -> prog_var -> t -> bool
val mem_pv_r : env -> prog_var -> t -> bool
end
(* -------------------------------------------------------------------- *)
val i_eqobs_in_refl : env -> instr -> PV.t -> PV.t
val eqobs_inF_refl : env -> EcPath.xpath -> PV.t -> PV.t