summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/initial_check.ml2
-rw-r--r--src/process_file.ml2
-rw-r--r--src/rewriter.ml6
-rw-r--r--src/rewriter.mli2
4 files changed, 8 insertions, 4 deletions
diff --git a/src/initial_check.ml b/src/initial_check.ml
index a9201c1f..d652d490 100644
--- a/src/initial_check.ml
+++ b/src/initial_check.ml
@@ -970,6 +970,8 @@ let generate_undefineds vs_ids (Defs defs) =
gen_vs (mk_id "undefined_range") "forall 'n 'm. (atom('n), atom('m)) -> range('n,'m) effect {undef}";
(* FIXME: How to handle inc/dec order correctly? *)
gen_vs (mk_id "undefined_vector") "forall 'n 'm ('a:Type). (atom('n), atom('m), 'a) -> vector('n, 'm, dec,'a) effect {undef}";
+ (* Only used with lem_mwords *)
+ gen_vs (mk_id "undefined_bitvector") "forall 'n 'm. (atom('n), atom('m)) -> vector('n, 'm, dec,bit) effect {undef}";
gen_vs (mk_id "undefined_unit") "unit -> unit effect {undef}"]
in
let undefined_tu = function
diff --git a/src/process_file.ml b/src/process_file.ml
index 18df5047..59518075 100644
--- a/src/process_file.ml
+++ b/src/process_file.ml
@@ -259,6 +259,6 @@ let rewrite rewriters defs =
exit 1
let rewrite_ast = rewrite [("initial", Rewriter.rewrite_defs)]
-let rewrite_undefined = rewrite [("undefined", Rewriter.rewrite_undefined)]
+let rewrite_undefined = rewrite [("undefined", fun x -> Rewriter.rewrite_undefined !opt_lem_mwords x)]
let rewrite_ast_lem = rewrite Rewriter.rewrite_defs_lem
let rewrite_ast_ocaml = rewrite Rewriter.rewrite_defs_ocaml
diff --git a/src/rewriter.ml b/src/rewriter.ml
index 60beadac..69beac4d 100644
--- a/src/rewriter.ml
+++ b/src/rewriter.ml
@@ -2512,11 +2512,13 @@ let rewrite_overload_cast (Defs defs) =
let defs = List.map simple_def defs in
Defs (List.filter (fun def -> not (is_overload def)) defs)
-let rewrite_undefined =
- let rec undefined_of_typ (Typ_aux (typ_aux, _)) =
+let rewrite_undefined mwords =
+ let rec undefined_of_typ (Typ_aux (typ_aux, _) as typ) =
match typ_aux with
| Typ_id id ->
mk_exp (E_app (prepend_id "undefined_" id, [mk_lit_exp L_unit]))
+ | Typ_app (_,[start;size;_;_]) when mwords && is_bitvector_typ typ ->
+ mk_exp (E_app (mk_id "undefined_bitvector", undefined_of_typ_args start @ undefined_of_typ_args size))
| Typ_app (id, args) ->
mk_exp (E_app (prepend_id "undefined_" id, List.concat (List.map undefined_of_typ_args args)))
| Typ_var kid ->
diff --git a/src/rewriter.mli b/src/rewriter.mli
index 73337de4..3125c410 100644
--- a/src/rewriter.mli
+++ b/src/rewriter.mli
@@ -56,7 +56,7 @@ type 'a rewriters = { rewrite_exp : 'a rewriters -> 'a exp -> 'a exp;
val rewrite_exp : tannot rewriters -> tannot exp -> tannot exp
val rewrite_defs : tannot defs -> tannot defs
-val rewrite_undefined : tannot defs -> tannot defs
+val rewrite_undefined : bool -> tannot defs -> tannot defs
val rewrite_defs_ocaml : (string * (tannot defs -> tannot defs)) list (*Perform rewrites to exclude AST nodes not supported for ocaml out*)
val rewrite_defs_lem : (string * (tannot defs -> tannot defs)) list (*Perform rewrites to exclude AST nodes not supported for lem out*)