@@ -85,16 +85,15 @@ Proof
85
85
Cases \\ simp [is_ok_idx_const_def]
86
86
QED
87
87
88
- Definition get_arrayindex_var_def:
89
- (* Partial function! *)
90
- (get_arrayindex_var (Var var) = var) ∧
91
- (get_arrayindex_var (InputVar var) = var)
88
+ (* Partial function! *)
89
+ Definition get_var_type_impl_def:
90
+ (get_var_type_impl tenv tfext (Var var) = decls_type tenv var) ∧
91
+ (get_var_type_impl tenv tfext (InputVar var) = sum_alookup tfext var)
92
92
End
93
93
94
94
Definition compile_array_read_exp_def:
95
- (compile_array_read_exp tenv tmpnum tmps (ArrayIndex var ilen idx) =
96
- let varvar = get_arrayindex_var var in
97
- case decls_type tenv varvar of
95
+ (compile_array_read_exp tenv tfext tmpnum tmps (ArrayIndex var ilen idx) =
96
+ case get_var_type_impl tenv tfext var of
98
97
INR (VArray_t varlen) =>
99
98
(case get_const idx of
100
99
INR idx => (tmpnum, tmps, [], if is_ok_idx_const varlen idx then
@@ -104,138 +103,144 @@ Definition compile_array_read_exp_def:
104
103
| _ => (* let (tmpnum, tmps, newvars, idx) = compile_array_read_exp tenv tmpnum tmps idx in*)
105
104
(* ^-- actually, cannot have nested indexing because of the current limited type system... *)
106
105
(SUC tmpnum, (tmpnum, VBool_t)::tmps,
107
- [(tmpnum, varlen, varvar , ilen, idx)](* ::newvars*) , Var (tmpvar tmpnum)))
106
+ [(tmpnum, varlen, var , ilen, idx)](* ::newvars*) , Var (tmpvar tmpnum)))
108
107
| _ => (* ill-typed program: *) (tmpnum, tmps, [], ArrayIndex var ilen idx)) ∧
109
- (compile_array_read_exp tenv tmpnum tmps (BUOp op e1) =
110
- let (tmpnum, tmps, newvars, e1) = compile_array_read_exp tenv tmpnum tmps e1 in
108
+ (compile_array_read_exp tenv tfext tmpnum tmps (BUOp op e1) =
109
+ let (tmpnum, tmps, newvars, e1) = compile_array_read_exp tenv tfext tmpnum tmps e1 in
111
110
(tmpnum, tmps, newvars, BUOp op e1)) /\
112
- (compile_array_read_exp tenv tmpnum tmps (BBOp e1 op e2) =
113
- let (tmpnum, tmps, newvars1, e1) = compile_array_read_exp tenv tmpnum tmps e1;
114
- (tmpnum, tmps, newvars2, e2) = compile_array_read_exp tenv tmpnum tmps e2 in
111
+ (compile_array_read_exp tenv tfext tmpnum tmps (BBOp e1 op e2) =
112
+ let (tmpnum, tmps, newvars1, e1) = compile_array_read_exp tenv tfext tmpnum tmps e1;
113
+ (tmpnum, tmps, newvars2, e2) = compile_array_read_exp tenv tfext tmpnum tmps e2 in
115
114
(tmpnum, tmps, newvars1 ++ newvars2, BBOp e1 op e2)) /\
116
- (compile_array_read_exp tenv tmpnum tmps (Arith e1 op e2) =
117
- let (tmpnum, tmps, newvars1, e1) = compile_array_read_exp tenv tmpnum tmps e1;
118
- (tmpnum, tmps, newvars2, e2) = compile_array_read_exp tenv tmpnum tmps e2 in
115
+ (compile_array_read_exp tenv tfext tmpnum tmps (Arith e1 op e2) =
116
+ let (tmpnum, tmps, newvars1, e1) = compile_array_read_exp tenv tfext tmpnum tmps e1;
117
+ (tmpnum, tmps, newvars2, e2) = compile_array_read_exp tenv tfext tmpnum tmps e2 in
119
118
(tmpnum, tmps, newvars1 ++ newvars2, Arith e1 op e2)) /\
120
- (compile_array_read_exp tenv tmpnum tmps (Cmp e1 op e2) =
121
- let (tmpnum, tmps, newvars1, e1) = compile_array_read_exp tenv tmpnum tmps e1;
122
- (tmpnum, tmps, newvars2, e2) = compile_array_read_exp tenv tmpnum tmps e2 in
119
+ (compile_array_read_exp tenv tfext tmpnum tmps (Cmp e1 op e2) =
120
+ let (tmpnum, tmps, newvars1, e1) = compile_array_read_exp tenv tfext tmpnum tmps e1;
121
+ (tmpnum, tmps, newvars2, e2) = compile_array_read_exp tenv tfext tmpnum tmps e2 in
123
122
(tmpnum, tmps, newvars1 ++ newvars2, Cmp e1 op e2)) /\
124
- (compile_array_read_exp tenv tmpnum tmps e = (tmpnum, tmps, [], e))
123
+ (compile_array_read_exp tenv tfext tmpnum tmps e = (tmpnum, tmps, [], e))
125
124
End
126
125
127
126
Definition compile_array_read_exp_opt_def:
128
- (compile_array_read_exp_opt tenv tmpnum tmps NONE = (tmpnum, tmps, [], NONE )) ∧
129
- (compile_array_read_exp_opt tenv tmpnum tmps (SOME e) =
130
- let (tmpnum, tmps, newvars, e) = compile_array_read_exp tenv tmpnum tmps e in
127
+ (compile_array_read_exp_opt tenv tfext tmpnum tmps NONE = (tmpnum, tmps, [], NONE )) ∧
128
+ (compile_array_read_exp_opt tenv tfext tmpnum tmps (SOME e) =
129
+ let (tmpnum, tmps, newvars, e) = compile_array_read_exp tenv tfext tmpnum tmps e in
131
130
(tmpnum, tmps, newvars, SOME e))
132
131
End
133
132
134
133
Definition compile_array_read_newvars_def:
135
- (compile_array_read_newvars tenv [] p = p) ∧
136
- (compile_array_read_newvars tenv ((tmpnum, varlen, var, ilen, idx)::newvars) p = let
134
+ (compile_array_read_newvars [] p = p) ∧
135
+ (compile_array_read_newvars ((tmpnum, varlen, var, ilen, idx)::newvars) p = let
137
136
newvar = tmpvar tmpnum;
138
137
caselen = MIN varlen (2 **ilen);
139
138
cases = GENLIST (λi. let i = (Const $ n2VArray ilen i) in
140
- (i, BlockingAssign (NoIndexing newvar) (SOME $ ArrayIndex (Var var) ilen i))) caselen in
139
+ (i, BlockingAssign (NoIndexing newvar) (SOME $ ArrayIndex var ilen i))) caselen in
141
140
Seq (Case (VArray_t ilen) idx cases NONE )
142
- (compile_array_read_newvars tenv newvars p))
141
+ (compile_array_read_newvars newvars p))
143
142
End
144
143
145
144
Definition compile_array_read_size_def:
146
- (compile_array_read_size (INL (_, _, _, p)) = vprog_size p) ∧
147
- (compile_array_read_size (INR (INL (_, _, _, p))) = vprog3_size p) ∧
148
- (compile_array_read_size (INR (INR (_, _, _, ps))) = vprog1_size ps)
145
+ (compile_array_read_size (INL (_, _, _, _, p)) = vprog_size p) ∧
146
+ (compile_array_read_size (INR (INL (_, _, _, _, p))) = vprog3_size p) ∧
147
+ (compile_array_read_size (INR (INR (_, _, _, _, ps))) = vprog1_size ps)
149
148
End
150
149
151
150
Definition compile_array_read_def:
152
- (compile_array_read tenv tmpnum tmps Skip = (tmpnum, tmps, Skip)) ∧
153
- (compile_array_read tenv tmpnum tmps (Seq l r) = let
154
- (tmpnum, tmps, l) = compile_array_read tenv tmpnum tmps l;
155
- (tmpnum, tmps, r) = compile_array_read tenv tmpnum tmps r in
151
+ (compile_array_read tenv tfext tmpnum tmps Skip = (tmpnum, tmps, Skip)) ∧
152
+ (compile_array_read tenv tfext tmpnum tmps (Seq l r) = let
153
+ (tmpnum, tmps, l) = compile_array_read tenv tfext tmpnum tmps l;
154
+ (tmpnum, tmps, r) = compile_array_read tenv tfext tmpnum tmps r in
156
155
(tmpnum, tmps, Seq l r)) ∧
157
- (compile_array_read tenv tmpnum tmps (IfElse c l r) = let
158
- (tmpnum, tmps, newvars, c) = compile_array_read_exp tenv tmpnum tmps c;
159
- (tmpnum, tmps, l) = compile_array_read tenv tmpnum tmps l;
160
- (tmpnum, tmps, r) = compile_array_read tenv tmpnum tmps r in
161
- (tmpnum, tmps, compile_array_read_newvars tenv newvars (IfElse c l r))) ∧
162
- (compile_array_read tenv tmpnum tmps (Case t m cs d) = let
163
- (tmpnum, tmps, newvars1, m) = compile_array_read_exp tenv tmpnum tmps m;
164
- (tmpnum, tmps, newvars2, cs) = compile_array_read_case_list tenv tmpnum tmps cs;
165
- (tmpnum, tmps, d) = compile_array_read_opt tenv tmpnum tmps d in
166
- (tmpnum, tmps, compile_array_read_newvars tenv newvars2
167
- (compile_array_read_newvars tenv newvars1
156
+ (compile_array_read tenv tfext tmpnum tmps (IfElse c l r) = let
157
+ (tmpnum, tmps, newvars, c) = compile_array_read_exp tenv tfext tmpnum tmps c;
158
+ (tmpnum, tmps, l) = compile_array_read tenv tfext tmpnum tmps l;
159
+ (tmpnum, tmps, r) = compile_array_read tenv tfext tmpnum tmps r in
160
+ (tmpnum, tmps, compile_array_read_newvars newvars (IfElse c l r))) ∧
161
+ (compile_array_read tenv tfext tmpnum tmps (Case t m cs d) = let
162
+ (tmpnum, tmps, newvars1, m) = compile_array_read_exp tenv tfext tmpnum tmps m;
163
+ (tmpnum, tmps, newvars2, cs) = compile_array_read_case_list tenv tfext tmpnum tmps cs;
164
+ (tmpnum, tmps, d) = compile_array_read_opt tenv tfext tmpnum tmps d in
165
+ (tmpnum, tmps, compile_array_read_newvars newvars2
166
+ (compile_array_read_newvars newvars1
168
167
(Case t m cs d)))) ∧
169
- (compile_array_read tenv tmpnum tmps (BlockingAssign wc rhs) = let
170
- (tmpnum, tmps, newvars, rhs) = compile_array_read_exp_opt tenv tmpnum tmps rhs in
171
- (tmpnum, tmps, compile_array_read_newvars tenv newvars (BlockingAssign wc rhs))) ∧
172
- (compile_array_read tenv tmpnum tmps (NonBlockingAssign wc rhs) = let
173
- (tmpnum, tmps, newvars, rhs) = compile_array_read_exp_opt tenv tmpnum tmps rhs in
174
- (tmpnum, tmps, compile_array_read_newvars tenv newvars (NonBlockingAssign wc rhs))) ∧
175
-
176
- (compile_array_read_opt tenv tmpnum tmps NONE = (tmpnum, tmps, NONE )) ∧
177
- (compile_array_read_opt tenv tmpnum tmps (SOME p) = let
178
- (tmpnum, tmps, p) = compile_array_read tenv tmpnum tmps p in
168
+ (compile_array_read tenv tfext tmpnum tmps (BlockingAssign wc rhs) = let
169
+ (tmpnum, tmps, newvars, rhs) = compile_array_read_exp_opt tenv tfext tmpnum tmps rhs in
170
+ (tmpnum, tmps, compile_array_read_newvars newvars (BlockingAssign wc rhs))) ∧
171
+ (compile_array_read tenv tfext tmpnum tmps (NonBlockingAssign wc rhs) = let
172
+ (tmpnum, tmps, newvars, rhs) = compile_array_read_exp_opt tenv tfext tmpnum tmps rhs in
173
+ (tmpnum, tmps, compile_array_read_newvars newvars (NonBlockingAssign wc rhs))) ∧
174
+
175
+ (compile_array_read_opt tenv tfext tmpnum tmps NONE = (tmpnum, tmps, NONE )) ∧
176
+ (compile_array_read_opt tenv tfext tmpnum tmps (SOME p) = let
177
+ (tmpnum, tmps, p) = compile_array_read tenv tfext tmpnum tmps p in
179
178
(tmpnum, tmps, SOME p)) ∧
180
179
181
- (compile_array_read_case_list tenv tmpnum tmps [] = (tmpnum, tmps, [], [])) ∧
182
- (compile_array_read_case_list tenv tmpnum tmps ((e,p)::ps) = let
183
- (tmpnum, tmps, newvars1, e) = compile_array_read_exp tenv tmpnum tmps e;
184
- (tmpnum, tmps, p) = compile_array_read tenv tmpnum tmps p;
185
- (tmpnum, tmps, newvars2, ps) = compile_array_read_case_list tenv tmpnum tmps ps in
180
+ (compile_array_read_case_list tenv tfext tmpnum tmps [] = (tmpnum, tmps, [], [])) ∧
181
+ (compile_array_read_case_list tenv tfext tmpnum tmps ((e,p)::ps) = let
182
+ (tmpnum, tmps, newvars1, e) = compile_array_read_exp tenv tfext tmpnum tmps e;
183
+ (tmpnum, tmps, p) = compile_array_read tenv tfext tmpnum tmps p;
184
+ (tmpnum, tmps, newvars2, ps) = compile_array_read_case_list tenv tfext tmpnum tmps ps in
186
185
(tmpnum, tmps, newvars1 ++ newvars2, (e, p) :: ps))
187
186
Termination
188
187
WF_REL_TAC `measure compile_array_read_size` \\ rw [compile_array_read_size_def, vprog_size_def]
189
188
End
190
189
191
190
Definition compile_array_read_list_def:
192
- (compile_array_read_list tenv tmpnum tmps [] = (tmpnum, tmps, [])) ∧
193
- (compile_array_read_list tenv tmpnum tmps (p::ps) = let
194
- (tmpnum, tmps, p) = compile_array_read tenv tmpnum tmps p;
195
- (tmpnum, tmps, ps) = compile_array_read_list tenv tmpnum tmps ps in
191
+ (compile_array_read_list tenv tfext tmpnum tmps [] = (tmpnum, tmps, [])) ∧
192
+ (compile_array_read_list tenv tfext tmpnum tmps (p::ps) = let
193
+ (tmpnum, tmps, p) = compile_array_read tenv tfext tmpnum tmps p;
194
+ (tmpnum, tmps, ps) = compile_array_read_list tenv tfext tmpnum tmps ps in
196
195
(tmpnum, tmps, p::ps))
197
196
End
198
197
199
198
Definition compile_array_read_module_def:
200
199
compile_array_read_module tmpnum m =
201
- let (tmpnum, ffs_tmps, ffs) = compile_array_read_list m.decls tmpnum [] m.ffs;
202
- (tmpnum, combs_tmps, combs) = compile_array_read_list m.decls tmpnum [] m.combs in
200
+ let (tmpnum, ffs_tmps, ffs) = compile_array_read_list m.decls m.fextty tmpnum [] m.ffs;
201
+ (tmpnum, combs_tmps, combs) = compile_array_read_list m.decls m.fextty tmpnum [] m.combs in
203
202
(tmpnum, m with <| decls := m.decls ++ tmpvardecls ffs_tmps ++ tmpvardecls combs_tmps; ffs := ffs; combs := combs |>)
204
203
End
205
204
205
+ Definition get_var_type_def:
206
+ (get_var_type tenv tfext (Var var) = tenv_type tenv var) ∧
207
+ (get_var_type tenv tfext (InputVar var) = sum_alookup tfext var) ∧
208
+ (get_var_type tenv tfext _ = INL Impossible)
209
+ End
210
+
206
211
Definition no_array_read_dyn_exp_def:
207
- (no_array_read_dyn_exp tenv (Const _) <=> T) /\
208
- (no_array_read_dyn_exp tenv (Var _) <=> T) /\
209
- (no_array_read_dyn_exp tenv (InputVar _) <=> T) /\
210
- (no_array_read_dyn_exp tenv (ArrayIndex (Var var) ilen i) <=>
211
- case (do i <- get_const i; i <- ver2n i; t <- tenv_type tenv var; return (i, t) od) of
212
+ (no_array_read_dyn_exp tenv tfext (Const _) <=> T) /\
213
+ (no_array_read_dyn_exp tenv tfext (Var _) <=> T) /\
214
+ (no_array_read_dyn_exp tenv tfext (InputVar _) <=> T) /\
215
+ (no_array_read_dyn_exp tenv tfext (ArrayIndex var ilen i) <=>
216
+ case (do i <- get_const i; i <- ver2n i; t <- get_var_type tenv tfext var; return (i, t) od) of
212
217
INR (i, VArray_t len) => i < len
213
218
| _ => F) /\
214
- (no_array_read_dyn_exp tenv (ArraySlice _ _ _) ⇔ T) ∧
215
- (no_array_read_dyn_exp tenv (BUOp _ e1) <=>
216
- no_array_read_dyn_exp tenv e1) /\
217
- (no_array_read_dyn_exp tenv (BBOp e1 _ e2) <=>
218
- no_array_read_dyn_exp tenv e1 /\ no_array_read_dyn_exp tenv e2) /\
219
- (no_array_read_dyn_exp tenv (Arith e1 _ e2) <=>
220
- no_array_read_dyn_exp tenv e1 /\ no_array_read_dyn_exp tenv e2) /\
221
- (no_array_read_dyn_exp tenv (Cmp e1 _ e2) <=>
222
- no_array_read_dyn_exp tenv e1 /\ no_array_read_dyn_exp tenv e2) /\
223
- (no_array_read_dyn_exp tenv _ <=> F)
219
+ (no_array_read_dyn_exp tenv tfext (ArraySlice _ _ _) ⇔ T) ∧
220
+ (no_array_read_dyn_exp tenv tfext (BUOp _ e1) <=>
221
+ no_array_read_dyn_exp tenv tfext e1) /\
222
+ (no_array_read_dyn_exp tenv tfext (BBOp e1 _ e2) <=>
223
+ no_array_read_dyn_exp tenv tfext e1 /\ no_array_read_dyn_exp tenv tfext e2) /\
224
+ (no_array_read_dyn_exp tenv tfext (Arith e1 _ e2) <=>
225
+ no_array_read_dyn_exp tenv tfext e1 /\ no_array_read_dyn_exp tenv tfext e2) /\
226
+ (no_array_read_dyn_exp tenv tfext (Cmp e1 _ e2) <=>
227
+ no_array_read_dyn_exp tenv tfext e1 /\ no_array_read_dyn_exp tenv tfext e2) /\
228
+ (no_array_read_dyn_exp tenv tfext _ <=> F)
224
229
End
225
230
226
231
Definition no_array_read_dyn_def:
227
- (no_array_read_dyn tenv Skip <=> T) /\
228
- (no_array_read_dyn tenv (Seq p1 p2) <=> no_array_read_dyn tenv p1 /\ no_array_read_dyn tenv p2) /\
229
- (no_array_read_dyn tenv (IfElse c tb fb) <=>
230
- no_array_read_dyn_exp tenv c /\ no_array_read_dyn tenv tb /\ no_array_read_dyn tenv fb) /\
231
- (no_array_read_dyn tenv (Case _ c cases def) <=>
232
- no_array_read_dyn_exp tenv c /\
233
- EVERY (λ(c, e). no_array_read_dyn_exp tenv c /\ no_array_read_dyn tenv e) cases /\
234
- OPTION_ALL (no_array_read_dyn tenv) def) /\
235
- (no_array_read_dyn tenv (BlockingAssign _ e) <=> OPTION_ALL (no_array_read_dyn_exp tenv) e) /\
236
- (no_array_read_dyn tenv (NonBlockingAssign _ e) <=> OPTION_ALL (no_array_read_dyn_exp tenv) e)
232
+ (no_array_read_dyn tenv tfext Skip <=> T) /\
233
+ (no_array_read_dyn tenv tfext (Seq p1 p2) <=> no_array_read_dyn tenv tfext p1 /\ no_array_read_dyn tenv tfext p2) /\
234
+ (no_array_read_dyn tenv tfext (IfElse c tb fb) <=>
235
+ no_array_read_dyn_exp tenv tfext c /\ no_array_read_dyn tenv tfext tb /\ no_array_read_dyn tenv tfext fb) /\
236
+ (no_array_read_dyn tenv tfext (Case _ c cases def) <=>
237
+ no_array_read_dyn_exp tenv tfext c /\
238
+ EVERY (λ(c, e). no_array_read_dyn_exp tenv tfext c /\ no_array_read_dyn tenv tfext e) cases /\
239
+ OPTION_ALL (no_array_read_dyn tenv tfext ) def) /\
240
+ (no_array_read_dyn tenv tfext (BlockingAssign _ e) <=> OPTION_ALL (no_array_read_dyn_exp tenv tfext ) e) /\
241
+ (no_array_read_dyn tenv tfext (NonBlockingAssign _ e) <=> OPTION_ALL (no_array_read_dyn_exp tenv tfext ) e)
237
242
Termination
238
- WF_REL_TAC `measure (vprog_size o SND)` \\ rw [MEM_MAP] \\
243
+ WF_REL_TAC `measure (vprog_size o SND o SND )` \\ rw [MEM_MAP] \\
239
244
drule_strip MEM_IMP_vprog_size \\ DECIDE_TAC
240
245
End
241
246
@@ -252,6 +257,12 @@ Definition compile_array_write_prog_assn_def:
252
257
NONE ) in
253
258
(SUC tmpnum, (tmpnum, VBool_t) :: tmps, p)
254
259
End
260
+
261
+ Definition compile_array_write_size_def:
262
+ (compile_array_write_size (INL (_, _, _, p)) = vprog_size p) ∧
263
+ (compile_array_write_size (INR (INL (_, _, _, p))) = vprog3_size p) ∧
264
+ (compile_array_write_size (INR (INR (_, _, _, ps))) = vprog1_size ps)
265
+ End
255
266
256
267
Definition compile_array_write_def:
257
268
(compile_array_write tenv tmpnum tmps (Seq l r) = let
@@ -299,7 +310,7 @@ Definition compile_array_write_def:
299
310
(tmpnum, tmps, ps) = compile_array_write_case_list tenv tmpnum tmps ps in
300
311
(tmpnum, tmps, (e, p) :: ps))
301
312
Termination
302
- WF_REL_TAC `measure compile_array_read_size ` \\ rw [compile_array_read_size_def , vprog_size_def]
313
+ WF_REL_TAC `measure compile_array_write_size ` \\ rw [compile_array_write_size_def , vprog_size_def]
303
314
End
304
315
305
316
Definition compile_array_write_list_def:
@@ -424,20 +435,20 @@ Definition preprocess_def:
424
435
End
425
436
426
437
Definition preprocessed_def:
427
- preprocessed tenv p <=> no_array_read_dyn tenv p /\ no_array_write_dyn tenv p /\ no_Case p
438
+ preprocessed tenv tfext p <=> no_array_read_dyn tenv tfext p /\ no_array_write_dyn tenv p /\ no_Case p
428
439
End
429
440
430
441
Theorem EVERY_preprocessed:
431
- !tenv ps.
432
- EVERY (preprocessed tenv) ps <=> EVERY (no_array_read_dyn tenv) ps /\
433
- EVERY (no_array_write_dyn tenv) ps /\
434
- EVERY no_Case ps
442
+ !tenv tfext ps.
443
+ EVERY (preprocessed tenv tfext ) ps <=> EVERY (no_array_read_dyn tenv tfext ) ps /\
444
+ EVERY (no_array_write_dyn tenv) ps /\
445
+ EVERY no_Case ps
435
446
Proof
436
447
simp [EVERY_MEM, preprocessed_def] \\ metis_tac []
437
448
QED
438
449
439
450
Definition preprocessed_module_def:
440
- preprocessed_module tenv m <=> EVERY (preprocessed tenv) m.ffs ∧ EVERY (preprocessed tenv) m.combs
451
+ preprocessed_module tenv m <=> EVERY (preprocessed tenv m.fextty ) m.ffs ∧ EVERY (preprocessed tenv m.fextty ) m.combs
441
452
End
442
453
443
454
val _ = export_theory ();
0 commit comments