@@ -55,6 +55,16 @@ let lv_of_expr e =
5555 LvTuple (List. map (fun e -> EcTypes. destr_var e, e_ty e) pvs)
5656 | _ -> failwith " failed to construct lv from expr"
5757
58+ let explode_assgn (lv : lvalue ) (e : expr ) : ((prog_var * ty) * expr) list =
59+ match lv, e with
60+ | LvVar lv , e ->
61+ [(lv, e)]
62+ | LvTuple lvs , { e_node = Etuple es } ->
63+ List. combine lvs es
64+ | LvTuple lvs , e ->
65+ List. mapi (fun i (pv , ty ) ->
66+ ((pv, ty), e_proj_simpl e i ty)) lvs
67+
5868(* -------------------------------------------------------------------- *)
5969type instr = EcAst .instr
6070
@@ -161,6 +171,14 @@ let is_while = _is_of_get get_while
161171let is_match = _is_of_get get_match
162172let is_raise = _is_of_get get_raise
163173
174+ (* -------------------------------------------------------------------- *)
175+ let i_asgn_of_pve (pve : ((prog_var * ty) * expr ) list ) : instr option =
176+ let lvs, es = List. split pve in
177+
178+ lvs
179+ |> lv_of_list
180+ |> omap (fun lvs -> i_asgn (lvs, e_tuple es))
181+
164182(* -------------------------------------------------------------------- *)
165183let i_iter (f : instr -> unit ) =
166184 let rec i_iter (i : instr ) =
@@ -181,6 +199,24 @@ let i_iter (f : instr -> unit) =
181199
182200 in fun (i : instr ) -> i_iter i
183201
202+ (* -------------------------------------------------------------------- *)
203+ let i_map_expr (tx : expr -> expr ) =
204+ let rec doit (i : instr ) =
205+ match i.i_node with
206+ | Sasgn (lv , e ) -> i_asgn (lv, (tx e))
207+ | Sif (c , t , f ) -> i_if (tx c, doit_s t, doit_s f)
208+ | Smatch (e , cs ) -> i_match (tx e, List. map (snd_map doit_s) cs)
209+ | Swhile (c , bd ) -> i_while (tx c, doit_s bd)
210+ | Srnd (lv , e ) -> i_rnd (lv, tx e)
211+ | Sraise e -> i_raise (tx e)
212+ | Sabstract (_ : memory ) -> i
213+ | Scall (lv , f , args ) -> i_call (lv, f, List. map tx args)
214+
215+ and doit_s (s : stmt ) =
216+ stmt (List. map doit s.s_node) in
217+
218+ fun i -> doit i
219+
184220(* -------------------------------------------------------------------- *)
185221module Uninit = struct (* FIXME: generalize this for use in ecPV *)
186222 let e_pv e =
0 commit comments