summaryrefslogtreecommitdiff
path: root/src/value.ml
diff options
context:
space:
mode:
Diffstat (limited to 'src/value.ml')
-rw-r--r--src/value.ml34
1 files changed, 29 insertions, 5 deletions
diff --git a/src/value.ml b/src/value.ml
index c00b9687..cb55aa79 100644
--- a/src/value.ml
+++ b/src/value.ml
@@ -65,6 +65,10 @@ let output_close () =
else
()
+let output str =
+ output_string !print_chan str;
+ flush !print_chan
+
let output_endline str =
output_string !print_chan (str ^ "\n");
flush !print_chan
@@ -83,6 +87,24 @@ type value =
| V_ctor of string * value list
| V_record of value StringMap.t
+let rec eq_value v1 v2 =
+ match v1, v2 with
+ | V_vector v1s, V_vector v2s when List.length v1s = List.length v2s -> List.for_all2 eq_value v1s v2s
+ | V_list v1s, V_vector v2s when List.length v1s = List.length v2s -> List.for_all2 eq_value v1s v2s
+ | V_int n, V_int m -> Big_int.equal n m
+ | V_real n, V_real m -> Rational.equal n m
+ | V_bool b1, V_bool b2 -> b1 = b2
+ | V_bit b1, V_bit b2 -> b1 = b2
+ | V_tuple v1s, V_tuple v2s when List.length v1s = List.length v2s -> List.for_all2 eq_value v1s v2s
+ | V_unit, V_unit -> true
+ | V_string str1, V_string str2 -> str1 = str2
+ | V_ref str1, V_ref str2 -> str1 = str2
+ | V_ctor (name1, fields1), V_ctor (name2, fields2) when List.length fields1 = List.length fields2 ->
+ name1 = name2 && List.for_all2 eq_value fields1 fields2
+ | V_record fields1, V_record fields2 ->
+ StringMap.equal eq_value fields1 fields2
+ | _, _ -> false
+
let coerce_bit = function
| V_bit b -> b
| _ -> assert false
@@ -338,7 +360,6 @@ let is_bit = function
| V_bit _ -> true
| _ -> false
-
let is_ctor = function
| V_ctor _ -> true
| _ -> false
@@ -385,13 +406,16 @@ let value_vector_truncate = function
| [v1; v2] -> mk_vector (Sail_lib.vector_truncate (coerce_bv v1, coerce_int v2))
| _ -> failwith "value vector_truncate"
-let eq_value v1 v2 = string_of_value v1 = string_of_value v2
-
let value_eq_anything = function
| [v1; v2] -> V_bool (eq_value v1 v2)
| _ -> failwith "value eq_anything"
let value_print = function
+ | [V_string str] -> output str; V_unit
+ | [v] -> output (string_of_value v |> Util.red |> Util.clear); V_unit
+ | _ -> assert false
+
+let value_print_endline = function
| [V_string str] -> output_endline str; V_unit
| [v] -> output_endline (string_of_value v |> Util.red |> Util.clear); V_unit
| _ -> assert false
@@ -496,9 +520,9 @@ let primops =
[ ("and_bool", and_bool);
("or_bool", or_bool);
("print", value_print);
- ("prerr", fun vs -> (prerr_endline (string_of_value (List.hd vs)); V_unit));
+ ("prerr", fun vs -> (prerr_string (string_of_value (List.hd vs)); V_unit));
("dec_str", fun _ -> V_string "X");
- ("print_endline", value_print);
+ ("print_endline", value_print_endline);
("prerr_endline", fun vs -> (prerr_endline (string_of_value (List.hd vs)); V_unit));
("putchar", value_putchar);
("string_of_int", fun vs -> V_string (string_of_value (List.hd vs)));