Skip to content

Commit 4d975d9

Browse files
committed
handle indexing and slicing for internal inputs
1 parent 0ed30de commit 4d975d9

7 files changed

+346
-247
lines changed

compiler/PreCompilerProofScript.sml

Lines changed: 143 additions & 109 deletions
Large diffs are not rendered by default.

compiler/PreCompilerScript.sml

Lines changed: 110 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,15 @@ Proof
8585
Cases \\ simp [is_ok_idx_const_def]
8686
QED
8787

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)
9292
End
9393

9494
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
9897
INR (VArray_t varlen) =>
9998
(case get_const idx of
10099
INR idx => (tmpnum, tmps, [], if is_ok_idx_const varlen idx then
@@ -104,138 +103,144 @@ Definition compile_array_read_exp_def:
104103
| _ => (*let (tmpnum, tmps, newvars, idx) = compile_array_read_exp tenv tmpnum tmps idx in*)
105104
(* ^-- actually, cannot have nested indexing because of the current limited type system... *)
106105
(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)))
108107
| _ => (* 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
111110
(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
115114
(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
119118
(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
123122
(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))
125124
End
126125

127126
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
131130
(tmpnum, tmps, newvars, SOME e))
132131
End
133132

134133
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
137136
newvar = tmpvar tmpnum;
138137
caselen = MIN varlen (2**ilen);
139138
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
141140
Seq (Case (VArray_t ilen) idx cases NONE)
142-
(compile_array_read_newvars tenv newvars p))
141+
(compile_array_read_newvars newvars p))
143142
End
144143

145144
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)
149148
End
150149

151150
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
156155
(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
168167
(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
179178
(tmpnum, tmps, SOME p)) ∧
180179

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
186185
(tmpnum, tmps, newvars1 ++ newvars2, (e, p) :: ps))
187186
Termination
188187
WF_REL_TAC `measure compile_array_read_size` \\ rw [compile_array_read_size_def, vprog_size_def]
189188
End
190189

191190
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
196195
(tmpnum, tmps, p::ps))
197196
End
198197

199198
Definition compile_array_read_module_def:
200199
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
203202
(tmpnum, m with <| decls := m.decls ++ tmpvardecls ffs_tmps ++ tmpvardecls combs_tmps; ffs := ffs; combs := combs |>)
204203
End
205204

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+
206211
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
212217
INR (i, VArray_t len) => i < len
213218
| _ => 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)
224229
End
225230

226231
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)
237242
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] \\
239244
drule_strip MEM_IMP_vprog_size \\ DECIDE_TAC
240245
End
241246

@@ -252,6 +257,12 @@ Definition compile_array_write_prog_assn_def:
252257
NONE) in
253258
(SUC tmpnum, (tmpnum, VBool_t) :: tmps, p)
254259
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
255266

256267
Definition compile_array_write_def:
257268
(compile_array_write tenv tmpnum tmps (Seq l r) = let
@@ -299,7 +310,7 @@ Definition compile_array_write_def:
299310
(tmpnum, tmps, ps) = compile_array_write_case_list tenv tmpnum tmps ps in
300311
(tmpnum, tmps, (e, p) :: ps))
301312
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]
303314
End
304315

305316
Definition compile_array_write_list_def:
@@ -424,20 +435,20 @@ Definition preprocess_def:
424435
End
425436

426437
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
428439
End
429440

430441
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
435446
Proof
436447
simp [EVERY_MEM, preprocessed_def] \\ metis_tac []
437448
QED
438449

439450
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
441452
End
442453

443454
val _ = export_theory ();

0 commit comments

Comments
 (0)