summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/interpreter.ml4
-rw-r--r--src/ocaml_backend.ml3
-rw-r--r--src/sail_lib.ml21
-rw-r--r--src/value.ml10
4 files changed, 37 insertions, 1 deletions
diff --git a/src/interpreter.ml b/src/interpreter.ml
index 1a8cad90..599a83bf 100644
--- a/src/interpreter.ml
+++ b/src/interpreter.ml
@@ -105,6 +105,10 @@ let value_of_lit (L_aux (l_aux, _)) =
|> List.map (fun c -> List.map (fun b -> V_bit b) (Sail_lib.hex_char c))
|> List.concat
|> (fun v -> V_vector v)
+ | L_bin str ->
+ Util.string_to_list str
+ |> List.map (fun c -> V_bit (Sail_lib.bin_char c))
+ |> (fun v -> V_vector v)
| _ -> failwith "Unimplemented value_of_lit" (* TODO *)
let is_value = function
diff --git a/src/ocaml_backend.ml b/src/ocaml_backend.ml
index 2a6206d4..970dea83 100644
--- a/src/ocaml_backend.ml
+++ b/src/ocaml_backend.ml
@@ -195,7 +195,8 @@ let rec ocaml_pat ctx (P_aux (pat_aux, _) as pat) =
match Env.lookup_id id (pat_env_of pat) with
| Local (Immutable, _) | Unbound -> zencode ctx id
| Enum _ -> zencode_upper ctx id
- | _ -> failwith "Ocaml: Cannot pattern match on mutable variable or register"
+ | Union _ -> zencode_upper ctx id
+ | _ -> failwith ("Ocaml: Cannot pattern match on mutable variable or register:" ^ string_of_pat pat)
end
| P_lit lit -> ocaml_lit lit
| P_typ (_, pat) -> ocaml_pat ctx pat
diff --git a/src/sail_lib.ml b/src/sail_lib.ml
index 08b8ac1a..86c12aae 100644
--- a/src/sail_lib.ml
+++ b/src/sail_lib.ml
@@ -255,6 +255,11 @@ let get_slice_int (n, m, o) =
assert (Big_int.equal (Big_int.of_int (List.length slice)) n);
slice
+let bin_char = function
+ | '0' -> B0
+ | '1' -> B1
+ | _ -> failwith "Invalid binary character"
+
let hex_char = function
| '0' -> [B0; B0; B0; B0]
| '1' -> [B0; B0; B0; B1]
@@ -479,8 +484,24 @@ let rec string_of_list sep string_of = function
| [x] -> string_of x
| x::ls -> (string_of x) ^ sep ^ (string_of_list sep string_of ls)
+let skip () = ()
+
let zero_extend (vec, n) =
let m = Big_int.to_int n in
if m <= List.length vec
then take m vec
else replicate_bits ([B0], Big_int.of_int (m - List.length vec)) @ vec
+
+
+let sign_extend (vec, n) =
+ let m = Big_int.to_int n in
+ match vec with
+ | B0 :: _ as vec -> replicate_bits ([B0], Big_int.of_int (m - List.length vec)) @ vec
+ | [] -> replicate_bits ([B0], Big_int.of_int (m - List.length vec)) @ vec
+ | B1 :: _ as vec -> replicate_bits ([B1], Big_int.of_int (m - List.length vec)) @ vec
+
+(* FIXME *)
+let shift_bits_right (x, y) = x
+let shift_bits_left (x, y) = x
+
+let speculate_conditional_success () = true
diff --git a/src/value.ml b/src/value.ml
index b1f6f80b..0b50ee1f 100644
--- a/src/value.ml
+++ b/src/value.ml
@@ -328,6 +328,14 @@ let rec string_of_value = function
| V_record record ->
"{" ^ Util.string_of_list ", " (fun (field, v) -> field ^ "=" ^ string_of_value v) (StringMap.bindings record) ^ "}"
+let value_sign_extend = function
+ | [v1; v2] -> mk_vector (Sail_lib.sign_extend (coerce_bv v1, coerce_int v2))
+ | _ -> failwith "value sign_extend"
+
+let value_zero_extend = function
+ | [v1; v2] -> mk_vector (Sail_lib.zero_extend (coerce_bv v1, coerce_int v2))
+ | _ -> failwith "value zero_extend"
+
let eq_value v1 v2 = string_of_value v1 = string_of_value v2
let value_eq_anything = function
@@ -407,6 +415,8 @@ let primops =
("set_slice_int", value_set_slice_int);
("set_slice", value_set_slice);
("hex_slice", value_hex_slice);
+ ("zero_extend", value_zero_extend);
+ ("sign_extend", value_sign_extend);
("add_int", value_add_int);
("sub_int", value_sub_int);
("mult", value_mult);