summaryrefslogtreecommitdiff
path: root/src/lem_interp/interp_inter_imp.lem
diff options
context:
space:
mode:
Diffstat (limited to 'src/lem_interp/interp_inter_imp.lem')
-rw-r--r--src/lem_interp/interp_inter_imp.lem20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/lem_interp/interp_inter_imp.lem b/src/lem_interp/interp_inter_imp.lem
index 4aacad5f..67bf42c7 100644
--- a/src/lem_interp/interp_inter_imp.lem
+++ b/src/lem_interp/interp_inter_imp.lem
@@ -43,17 +43,27 @@ let intern_value v = match v with
| _ -> Interp.V_unknown
end
+let byte_list_of_integer size num =
+ if (num < 0)
+ then failwith "signed integer given to byte_list_of_integer"
+ else let internal_value = (Interp_lib.to_vec_inc
+ (Interp.V_tuple([Interp.V_lit(L_aux (L_num (size * 8)) Interp_ast.Unknown);
+ Interp.V_lit(L_aux (L_num num) Interp_ast.Unknown)]))) in
+ let num_check = Interp_lib.to_num Interp_lib.Unsigned internal_value in
+ match (num_check,internal_value) with
+ | (Interp.V_lit (L_aux (L_num n) _), Interp.V_vector _ _ bits) ->
+ if num = n
+ then (to_bytes (from_bits bits))
+ else failwith "byte_list_of_integer given an integer larger than given size"
+ end
+
let num_to_bits size kind num =
match kind with
| Bitv -> Bitvector (match (Interp_lib.to_vec_inc
(Interp.V_tuple([Interp.V_lit(L_aux (L_num (integerFromNat size)) Interp_ast.Unknown);
Interp.V_lit(L_aux (L_num num) Interp_ast.Unknown)]))) with
| Interp.V_vector _ _ bits -> from_bits bits end) true 0
- | Bytev ->
- Bytevector (match (Interp_lib.to_vec_inc
- (Interp.V_tuple([Interp.V_lit(L_aux (L_num (integerFromNat size)) Interp_ast.Unknown);
- Interp.V_lit(L_aux (L_num num) Interp_ast.Unknown)]))) with
- | Interp.V_vector _ _ bits -> (to_bytes (from_bits bits)) end)
+ | Bytev -> Bytevector (byte_list_of_integer (integerFromNat (size/8)) num)
end
let integer_of_byte_list bytes =