summaryrefslogtreecommitdiff
path: root/src/rewrites.ml
diff options
context:
space:
mode:
Diffstat (limited to 'src/rewrites.ml')
-rw-r--r--src/rewrites.ml33
1 files changed, 27 insertions, 6 deletions
diff --git a/src/rewrites.ml b/src/rewrites.ml
index 30230710..6e98abb0 100644
--- a/src/rewrites.ml
+++ b/src/rewrites.ml
@@ -95,13 +95,13 @@ let simple_num l n = E_aux (
(atom_typ (Nexp_aux (Nexp_constant n, gen_loc l))))
let effectful_effs = function
- | Effect_aux (Effect_set effs, _) ->
- List.exists
+ | Effect_aux (Effect_set effs, _) -> not (effs = [])
+ (*List.exists
(fun (BE_aux (be,_)) ->
match be with
| BE_nondet | BE_unspec | BE_undef | BE_lset -> false
| _ -> true
- ) effs
+ ) effs*)
let effectful eaux = effectful_effs (effect_of (propagate_exp_effect eaux))
let effectful_pexp pexp = effectful_effs (snd (propagate_pexp_effect pexp))
@@ -214,6 +214,26 @@ let rewrite_defs_nexp_ids, rewrite_typ_nexp_ids =
rewrite_typ
+let rewrite_bitvector_exps defs =
+ let e_aux = function
+ | (E_vector es, ((l, Some (env, typ, eff)) as a)) when is_bitvector_typ typ ->
+ begin
+ try
+ let len = mk_lit_exp (L_num (Big_int.of_int (List.length es))) in
+ let es = mk_exp (E_list (List.map strip_exp es)) in
+ let exp = mk_exp (E_app (mk_id "bitvector_of_bitlist", [len; es])) in
+ check_exp env exp typ
+ with
+ | _ -> E_aux (E_vector es, a)
+ end
+ | (e_aux, a) -> E_aux (e_aux, a)
+ in
+ let rewrite_exp _ = fold_exp { id_exp_alg with e_aux = e_aux } in
+ if IdSet.mem (mk_id "bitvector_of_bitlist") (Initial_check.val_spec_ids defs) then
+ rewrite_defs_base { rewriters_base with rewrite_exp = rewrite_exp } defs
+ else defs
+
+
(* Re-write trivial sizeof expressions - trivial meaning that the
value of the sizeof can be directly inferred from the type
variables in scope. *)
@@ -1555,7 +1575,7 @@ let rewrite_exp_lift_assign_intro rewriters ((E_aux (exp,((l,_) as annot))) as f
(strip_exp (E_aux (E_var(le', e', block), annot))) (typ_of full_exp)
| _ -> rewrite_base full_exp
-let rewrite_lexp_lift_assign_intro rewriters ((LEXP_aux(lexp,annot)) as le) =
+(*let rewrite_lexp_lift_assign_intro rewriters ((LEXP_aux(lexp,annot)) as le) =
let rewrap le = LEXP_aux(le,annot) in
let rewrite_base = rewrite_lexp rewriters in
match lexp, annot with
@@ -1564,14 +1584,14 @@ let rewrite_lexp_lift_assign_intro rewriters ((LEXP_aux(lexp,annot)) as le) =
| Unbound | Local _ ->
LEXP_aux (lexp, (l, Some (env, typ, union_effects eff (mk_effect [BE_lset]))))
| _ -> rewrap lexp)
- | _ -> rewrite_base le
+ | _ -> rewrite_base le*)
let rewrite_defs_exp_lift_assign defs = rewrite_defs_base
{rewrite_exp = rewrite_exp_lift_assign_intro;
rewrite_pat = rewrite_pat;
rewrite_let = rewrite_let;
- rewrite_lexp = rewrite_lexp_lift_assign_intro;
+ rewrite_lexp = rewrite_lexp (*_lift_assign_intro*);
rewrite_fun = rewrite_fun;
rewrite_def = rewrite_def;
rewrite_defs = rewrite_defs_base} defs
@@ -3075,6 +3095,7 @@ let rewrite_defs_lem = [
("remove_bitvector_pats", rewrite_defs_remove_bitvector_pats);
("remove_numeral_pats", rewrite_defs_remove_numeral_pats);
("guarded_pats", rewrite_defs_guarded_pats);
+ ("bitvector_exps", rewrite_bitvector_exps);
(* ("register_ref_writes", rewrite_register_ref_writes); *)
("fix_val_specs", rewrite_fix_val_specs);
("split_execute", rewrite_split_fun_constr_pats "execute");