summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShaked Flur2015-07-24 11:56:08 +0100
committerShaked Flur2015-07-24 11:56:08 +0100
commit28c16a5e86c08bd010dbfafccf412921d175610a (patch)
tree7e9e1b222918a2a9a32bbd6cc553fb2af30a2b17
parent291eef6e74dcabc0add7f63a30213fd4ed5acbae (diff)
added signed_integer
-rw-r--r--src/lem_interp/interp_interface.lem15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/lem_interp/interp_interface.lem b/src/lem_interp/interp_interface.lem
index 3c79ed5e..b60a4dbb 100644
--- a/src/lem_interp/interp_interface.lem
+++ b/src/lem_interp/interp_interface.lem
@@ -1079,6 +1079,21 @@ val address_of_integer : integer -> address
let address_of_integer (i:integer):address =
Address (byte_list_of_integer 8 i) i
+(* to and from signed-integer *)
+
+val signed_integer_of_bit_list : list bit -> integer
+let signed_integer_of_bit_list b =
+ match b with
+ | [] -> failwith "empty bit list"
+ | Bitc_zero :: b' ->
+ integerFromBoolList (false,(List.reverse (List.map bit_to_bool b)))
+ | Bitc_one :: b' ->
+ let b'_val = integerFromBoolList (false,(List.reverse (List.map bit_to_bool b'))) in
+ (* integerFromBoolList takes a list with LSB first, so we reverse it *)
+ let msb_val = integerPow 2 ((List.length b) - 1) in
+ b'_val - msb_val
+ end
+
(* regarding a list of int as a list of bytes in memory, MSB lowest-address first, convert to an integer *)
val integer_address_of_int_list : list int -> integer