diff options
Diffstat (limited to 'src/monomorphise.ml')
| -rw-r--r-- | src/monomorphise.ml | 67 |
1 files changed, 35 insertions, 32 deletions
diff --git a/src/monomorphise.ml b/src/monomorphise.ml index 9bb47774..d86db99d 100644 --- a/src/monomorphise.ml +++ b/src/monomorphise.ml @@ -56,6 +56,7 @@ open Parse_ast open Ast +open Ast_defs open Ast_util module Big_int = Nat_big_num open Type_check @@ -657,10 +658,10 @@ let apply_pat_choices choices = e_assert = rewrite_assert; e_case = rewrite_case } -let split_defs target all_errors splits env defs = +let split_defs target all_errors splits env ast = let no_errors_happened = ref true in let error_opt = if all_errors then Some no_errors_happened else None in - let split_constructors (Defs defs) = + let split_constructors defs = let sc_type_union q (Tu_aux (Tu_ty_id (ty, id), l)) = match split_src_type error_opt env id ty q with | None -> ([],[Tu_aux (Tu_ty_id (ty,id),l)]) @@ -681,14 +682,14 @@ let split_defs target all_errors splits env defs = | _ -> ([], d) in let (refinements, defs') = List.split (List.map sc_def defs) - in (List.concat refinements, Defs defs') + in (List.concat refinements, defs') in - let (refinements, defs') = split_constructors defs in + let (refinements, defs') = split_constructors ast.defs in let subst_exp ref_vars substs ksubsts exp = let substs = bindings_from_list substs, ksubsts in - fst (Constant_propagation.const_prop target defs ref_vars substs Bindings.empty exp) + fst (Constant_propagation.const_prop target ast ref_vars substs Bindings.empty exp) in (* Split a variable pattern into every possible value *) @@ -772,7 +773,7 @@ let split_defs target all_errors splits env defs = (* Split variable patterns at the given locations *) - let map_locs ls (Defs defs) = + let map_locs ls defs = let rec match_l = function | Unknown -> [] | Unique (_, l) -> match_l l @@ -1170,11 +1171,11 @@ let split_defs target all_errors splits env defs = Reporting.unreachable (id_loc id) __POS__ "Loop termination measures should have been rewritten before now" in - Defs (List.concat (List.mapi map_def defs)) + List.concat (List.mapi map_def defs) in - let (Defs defs'') = map_locs splits defs' in + let defs'' = map_locs splits defs' in Util.progress "Monomorphising " "done" (List.length defs'') (List.length defs''); - !no_errors_happened, (Defs defs'') + !no_errors_happened, { ast with defs = defs'' } @@ -1337,7 +1338,7 @@ let replace_type env typ = ("replace_type: Unsupported type " ^ string_of_typ typ)) -let rewrite_size_parameters target type_env (Defs defs) = +let rewrite_size_parameters target type_env ast = let open Rewriter in let open Util in @@ -1345,7 +1346,7 @@ let rewrite_size_parameters target type_env (Defs defs) = let ref_vars = Constant_propagation.referenced_vars exp in let substs = (Bindings.empty, KBindings.empty) in let assigns = Bindings.empty in - fst (Constant_propagation.const_prop target (Defs defs) ref_vars substs assigns exp) + fst (Constant_propagation.const_prop target ast ref_vars substs assigns exp) in let const_prop_pexp pexp = let (pat, guard, exp, a) = destruct_pexp pexp in @@ -1454,7 +1455,7 @@ in *) List.fold_left sizes_funcl fsizes funcls | _ -> fsizes in - let fn_sizes = List.fold_left sizes_def Bindings.empty defs in + let fn_sizes = List.fold_left sizes_def Bindings.empty ast.defs in let rewrite_funcl (FCL_aux (FCL_Funcl (id,pexp),(l,annot))) = let pat,guard,body,(pl,_) = destruct_pexp pexp in @@ -1585,7 +1586,7 @@ in *) print_endline (string_of_id id ^ " needs " ^ String.concat ", " (List.map string_of_int args))) fn_sizes *) - Defs (List.map rewrite_def defs) + { ast with defs = List.map rewrite_def ast.defs } end @@ -2760,18 +2761,19 @@ let argset_to_list splits = in List.map argelt l -let analyse_defs debug env (Defs defs) = +let analyse_defs debug env ast = + let total_defs = List.length ast.defs in let def (idx,globals,r) d = begin match d with | DEF_fundef fd -> - Util.progress "Analysing " (string_of_id (id_of_fundef fd)) idx (List.length defs) + Util.progress "Analysing " (string_of_id (id_of_fundef fd)) idx total_defs | _ -> () end; let globals,r' = analyse_def debug env globals d in idx + 1, globals, merge r r' in - let _,_,r = List.fold_left def (0,Bindings.empty,empty) defs in - let _ = Util.progress "Analysing " "done" (List.length defs) (List.length defs) in + let _,_,r = List.fold_left def (0,Bindings.empty,empty) ast.defs in + let _ = Util.progress "Analysing " "done" total_defs total_defs in (* Resolve the interprocedural dependencies *) @@ -2828,7 +2830,7 @@ let fresh_sz_var = let () = counter := n+1 in mk_id ("sz#" ^ string_of_int n) -let add_extra_splits extras (Defs defs) = +let add_extra_splits extras defs = let success = ref true in let add_to_body extras (E_aux (_,(l,annot)) as e) = let l' = Generated l in @@ -2865,7 +2867,7 @@ let add_extra_splits extras (Defs defs) = | d -> d, [] in let defs, splits = List.split (List.map add_to_def defs) in - !success, Defs defs, List.concat splits + !success, defs, List.concat splits module MonoRewrites = struct @@ -3409,7 +3411,7 @@ and rewrite_exp exp = Rewriter.fold_exp { Rewriter.id_exp_alg with e_aux = rewri let mono_rewrite defs = let open Rewriter in - rewrite_defs_base + rewrite_ast_base { rewriters_base with rewrite_exp = fun _ -> fold_exp { id_exp_alg with e_aux = rewrite_aux } } defs @@ -3682,7 +3684,7 @@ let rec extract (E_aux (e,_)) = provide some way for the Lem pretty printer to know what to use; currently we just use two names for the cast, bitvector_cast_in and bitvector_cast_out, to let the pretty printer know whether to use the top-level environment. *) -let add_bitvector_casts global_env (Defs defs) = +let add_bitvector_casts global_env ({ defs; _ } as ast) = let rewrite_body id quant_kids top_env ret_typ exp = let rewrite_aux (e,ann) = match e with @@ -3833,7 +3835,7 @@ let add_bitvector_casts global_env (Defs defs) = let defs = List.mapi rewrite_def defs in let _ = Util.progress "Adding casts " "done" (List.length defs) (List.length defs) in let l = Generated Unknown in - let Defs cast_specs,_ = + let cast_specs, _ = (* TODO: use default/relevant order *) let kid = mk_kid "n" in let bitsn = bitvector_typ (nvar kid) dec_ord in @@ -3843,8 +3845,8 @@ let add_bitvector_casts global_env (Defs defs) = mk_val_spec (VS_val_spec (ts,name,[("_", "zeroExtend")],false)) in let defs = List.map mkfn (IdSet.elements !specs_required) in - check initial_env (Defs defs) - in Defs (cast_specs @ defs) + check_defs initial_env defs + in { ast with defs = cast_specs @ defs } end let replace_nexp_in_typ env typ orig new_nexp = @@ -3907,7 +3909,7 @@ let fresh_nexp_kid nexp = types, which these are explicitly supposed to be. *) mk_kid (mangle_nexp nexp (*^ "#"*)) -let rewrite_toplevel_nexps (Defs defs) = +let rewrite_toplevel_nexps ({ defs; _ } as ast) = let find_nexp env nexp_map nexp = let is_equal (kid,nexp') = prove __POS__ env (nc_eq nexp nexp') in List.find is_equal nexp_map @@ -4075,7 +4077,7 @@ let rewrite_toplevel_nexps (Defs defs) = (* Allow use of div and mod in nexp rewriting during later typechecking passes to help prove equivalences such as (8 * 'n) = 'p8_times_n# *) Type_check.opt_smt_div := true; - Defs (List.rev defs) + { ast with defs = List.rev defs } type options = { auto : bool; @@ -4093,28 +4095,29 @@ let recheck defs = let mono_rewrites = MonoRewrites.mono_rewrite -let monomorphise target opts splits defs = - let defs, env = Type_check.check Type_check.initial_env defs in +let monomorphise target opts splits ast = + let ast, env = Type_check.check Type_check.initial_env ast in let ok_analysis, new_splits, extra_splits = if opts.auto then - let f,r,ex = Analysis.analyse_defs opts.debug_analysis env defs in + let f,r,ex = Analysis.analyse_defs opts.debug_analysis env ast in if f || opts.all_split_errors || opts.continue_anyway then f, r, ex else raise (Reporting.err_general Unknown "Unable to monomorphise program") else true, [], Analysis.ExtraSplits.empty in let splits = new_splits @ (List.map (fun (loc,id) -> (loc,id,None)) splits) in - let ok_extras, defs, extra_splits = add_extra_splits extra_splits defs in + let ok_extras, defs, extra_splits = add_extra_splits extra_splits ast.defs in + let ast = { ast with defs = defs } in let splits = splits @ extra_splits in let () = if ok_extras || opts.all_split_errors || opts.continue_anyway then () else raise (Reporting.err_general Unknown "Unable to monomorphise program") in - let ok_split, defs = split_defs target opts.all_split_errors splits env defs in + let ok_split, ast = split_defs target opts.all_split_errors splits env ast in let () = if (ok_analysis && ok_extras && ok_split) || opts.continue_anyway then () else raise (Reporting.err_general Unknown "Unable to monomorphise program") - in defs + in ast let add_bitvector_casts = BitvectorSizeCasts.add_bitvector_casts let rewrite_atoms_to_singletons target defs = |
