summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jib/jib_smt.ml38
-rw-r--r--src/sail_lib.ml4
-rw-r--r--src/smtlib.ml8
-rw-r--r--src/value.ml5
4 files changed, 55 insertions, 0 deletions
diff --git a/src/jib/jib_smt.ml b/src/jib/jib_smt.ml
index d73d1a02..45837513 100644
--- a/src/jib/jib_smt.ml
+++ b/src/jib/jib_smt.ml
@@ -1022,6 +1022,19 @@ let smt_builtin ctx name args ret_ctyp =
| _ -> failwith ("Unknown builtin " ^ name ^ " " ^ Util.string_of_list ", " string_of_ctyp (List.map cval_ctyp args) ^ " -> " ^ string_of_ctyp ret_ctyp)
+
+let writes = ref (-1)
+
+let builtin_write_mem ctx wk addr_size addr data_size data =
+ [Write_mem (smt_cval ctx wk, smt_cval ctx addr, smt_cval ctx data)]
+
+let reads = ref (-1)
+
+let builtin_read_mem ctx rk addr_size addr data_size =
+ incr reads;
+ let name = "R" ^ string_of_int !reads in
+ [Read_mem (name, smt_cval ctx rk, smt_cval ctx addr)]
+
let rec smt_conversion ctx from_ctyp to_ctyp x =
match from_ctyp, to_ctyp with
| _, _ when ctyp_equal from_ctyp to_ctyp -> x
@@ -1384,6 +1397,21 @@ let smt_instr ctx =
| _ ->
Reporting.unreachable l __POS__ "Bad arguments for sqrt_real"
end
+ (* See lib/regfp.sail *)
+ else if name = "platform_write_mem" then
+ begin match args with
+ | [wk; addr_size; addr; data_size; data] ->
+ builtin_write_mem ctx wk addr_size addr data_size data
+ | _ ->
+ Reporting.unreachable l __POS__ "Bad arguments for __write_mem"
+ end
+ else if name = "platform_read_mem" then
+ begin match args with
+ | [rk; addr_size; addr; data_size] ->
+ builtin_read_mem ctx rk addr_size addr data_size
+ | _ ->
+ Reporting.unreachable l __POS__ "Bad arguments for __read_mem"
+ end
else
let value = smt_builtin ctx name args ret_ctyp in
[define_const ctx id ret_ctyp value]
@@ -1521,6 +1549,12 @@ let optimize_smt stack =
end
| (Declare_datatypes _ | Declare_tuple _) as def ->
Stack.push def stack'
+ | Write_mem (wk, addr, data) as def ->
+ uses_in_exp wk; uses_in_exp addr; uses_in_exp data;
+ Stack.push def stack'
+ | Read_mem (name, rk, addr) as def ->
+ uses_in_exp rk; uses_in_exp addr;
+ Stack.push def stack'
| Assert exp as def ->
uses_in_exp exp;
Stack.push def stack'
@@ -1542,6 +1576,10 @@ let optimize_smt stack =
Queue.add (Define_const (var, typ, simp_smt_exp vars exp)) queue
| None -> assert false
end
+ | Write_mem (wk, addr, data) ->
+ Queue.add (Write_mem (simp_smt_exp vars wk, simp_smt_exp vars addr, simp_smt_exp vars data)) queue
+ | Read_mem (name, rk, addr) ->
+ Queue.add (Read_mem (name, simp_smt_exp vars rk, simp_smt_exp vars addr)) queue
| Assert exp ->
Queue.add (Assert (simp_smt_exp vars exp)) queue
| (Declare_datatypes _ | Declare_tuple _) as def ->
diff --git a/src/sail_lib.ml b/src/sail_lib.ml
index 39485769..61e62d76 100644
--- a/src/sail_lib.ml
+++ b/src/sail_lib.ml
@@ -186,6 +186,10 @@ let sint = function
let add_int (x, y) = Big_int.add x y
let sub_int (x, y) = Big_int.sub x y
+let sub_nat (x, y) =
+ let z = Big_int.sub x y in
+ if Big_int.less z Big_int.zero then Big_int.zero else z
+
let mult (x, y) = Big_int.mul x y
(* This is euclidian division from lem *)
diff --git a/src/smtlib.ml b/src/smtlib.ml
index 1665419c..a252ea4a 100644
--- a/src/smtlib.ml
+++ b/src/smtlib.ml
@@ -182,6 +182,8 @@ type smt_def =
| Define_fun of string * (string * smt_typ) list * smt_typ * smt_exp
| Declare_const of string * smt_typ
| Define_const of string * smt_typ * smt_exp
+ | Write_mem of smt_exp * smt_exp * smt_exp
+ | Read_mem of string * smt_exp * smt_exp
| Declare_datatypes of string * (string * (string * smt_typ) list) list
| Declare_tuple of int
| Assert of smt_exp
@@ -242,6 +244,12 @@ let pp_smt_def =
| Define_const (name, ty, exp) ->
pp_sfun "define-const" [string name; pp_smt_typ ty; pp_smt_exp exp]
+ | Write_mem (wk, addr, data) ->
+ pp_sfun "write-mem" [pp_smt_exp wk; pp_smt_exp addr; pp_smt_exp data]
+
+ | Read_mem (name, rk, addr) ->
+ pp_sfun "read-mem" [string name; pp_smt_exp rk; pp_smt_exp addr]
+
| Declare_datatypes (name, ctors) ->
let pp_ctor (ctor_name, fields) =
match fields with
diff --git a/src/value.ml b/src/value.ml
index 958a1919..6ccecac0 100644
--- a/src/value.ml
+++ b/src/value.ml
@@ -341,6 +341,10 @@ let value_sub_int = function
| [v1; v2] -> V_int (Sail_lib.sub_int (coerce_int v1, coerce_int v2))
| _ -> failwith "value sub"
+let value_sub_nat = function
+ | [v1; v2] -> V_int (Sail_lib.sub_nat (coerce_int v1, coerce_int v2))
+ | _ -> failwith "value sub_nat"
+
let value_negate = function
| [v1] -> V_int (Sail_lib.negate (coerce_int v1))
| _ -> failwith "value negate"
@@ -663,6 +667,7 @@ let primops =
("shift_bits_right", value_shift_bits_right);
("add_int", value_add_int);
("sub_int", value_sub_int);
+ ("sub_nat", value_sub_nat);
("div_int", value_quotient);
("mult_int", value_mult);
("mult", value_mult);