From 28c16a5e86c08bd010dbfafccf412921d175610a Mon Sep 17 00:00:00 2001 From: Shaked Flur Date: Fri, 24 Jul 2015 11:56:08 +0100 Subject: added signed_integer --- src/lem_interp/interp_interface.lem | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'src') 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 -- cgit v1.2.3