diff options
| author | Kathy Gray | 2014-11-23 12:12:13 +0000 |
|---|---|---|
| committer | Kathy Gray | 2014-11-23 12:12:13 +0000 |
| commit | dd8b63753c5cb4eb49eead5bbc8eb80bdb8e1f1f (patch) | |
| tree | 9b20833425b27b3b10f0ef3c00212700867de2d4 /src | |
| parent | 2c11eafa811fe17e415f62ff0ba568dd7fa0149c (diff) | |
Fill in some of the basic coercions
Diffstat (limited to 'src')
| -rw-r--r-- | src/lem_interp/interp_inter_imp.lem | 23 | ||||
| -rw-r--r-- | src/lem_interp/interp_interface.lem | 42 | ||||
| -rw-r--r-- | src/lem_interp/printing_functions.ml | 2 |
3 files changed, 29 insertions, 38 deletions
diff --git a/src/lem_interp/interp_inter_imp.lem b/src/lem_interp/interp_inter_imp.lem index 1719e47c..f979b9d9 100644 --- a/src/lem_interp/interp_inter_imp.lem +++ b/src/lem_interp/interp_inter_imp.lem @@ -30,16 +30,6 @@ let bit_to_ibit = function | Bitc_one -> (Interp.V_lit (L_aux L_one Interp_ast.Unknown)) end -let to_bit = function - | Bitl_zero -> Bitc_zero - | Bitl_one -> Bitc_one -end - -let to_lbit = function - | Bitc_zero -> Bitl_zero - | Bitc_one -> Bitl_one -end - let to_bool = function | Bitl_zero -> false | Bitl_one -> true @@ -77,19 +67,10 @@ end let all_known l = List.all is_bool l let all_known_bytes l = List.all (fun (Byte_lifted bs) -> List.all is_bool bs) l -let bits_to_byte b = +let bits_to_word8 b = if ((List.length b) = 8) && (all_known b) then natFromInteger (integerFromBoolList (false,(List.reverse (List.map to_bool b)))) - else Assert_extra.failwith "bits_to_byte given a non-8 list or one containing ? and u" - -(*let memval_to_regval v start dir = - <| rv_bits=(List.concatMap (fun (Byte_lifted(bits)) -> bits) v); - rv_start=start; rv_dir = dir |> - -let opcode_to_regval (Opcode v) start dir = - (memval_to_regval (List.map (fun (Byte(bits)) -> Byte_lifted (List.map to_lbit bits)) v) start dir) - -let regval_to_ifield v = List.map to_bit v.rv_bits*) + else Assert_extra.failwith "bits_to_word8 given a non-8 list or one containing ? and u" (*All but reg_value should take a mode to get direction and start correct*) let intern_opcode (Opcode v) = diff --git a/src/lem_interp/interp_interface.lem b/src/lem_interp/interp_interface.lem index c729c7f4..211917b9 100644 --- a/src/lem_interp/interp_interface.lem +++ b/src/lem_interp/interp_interface.lem @@ -382,17 +382,11 @@ val rr_interp_exhaustive : interp_mode -> instruction_state -> list event -> (ou (** operations and coercions on basic values *) -(*val num_to_bits : nat -> v_kind -> integer -> value*) +val word8_to_bitls : word8 -> list bit_lifted +val bitls_to_word8 : list bit_lifted -> word8 -val byte_to_bits : word8 -> list bit_lifted -val bits_to_byte : list bit_lifted -> word8 - -(* TODO: rename these, as clash with the functions below that take types according to their names: -val integer_of_byte_list : list word8 -> integer - - -val byte_list_of_integer : integer -> integer -> list word8 -*) +val integer_of_word8_list : list word8 -> integer +val word8_list_of_integer : integer -> integer -> list word8 (* constructing values *) @@ -447,17 +441,33 @@ let bit_lifted_of_bit b = val byte_lifted_of_byte : byte -> byte_lifted let byte_lifted_of_byte (Byte bs) : byte_lifted = Byte_lifted (List.map bit_lifted_of_bit bs) +val bytes_of_bits : list bit -> list byte (*assumes (length bits) mod 8 = 0*) +let rec bytes_of_bits bits = match bits with + | [] -> [] + | b1::b2::b3::b4::b5::b6::b7::b8::bits -> + (Byte [b1;b2;b3;b4;b5;b6;b7;b8])::(bytes_of_bits bits) +end -val integer_of_byte_list : list byte -> integer -(* TODO *)let integer_of_byte_list (a:list byte):integer = failwith "TODO" -val byte_list_of_integer : int -> integer -> list byte -(* TODO *)let byte_list_of_integer (len:int) (a:integer):list byte = failwith "TODO" +let bit_to_bool = function + | Bitc_zero -> false + | Bitc_one -> true +end val integer_of_bit_list : list bit -> integer -(* TODO *)let integer_of_bit_list (a:list bit):integer = failwith "TODO" val bit_list_of_integer : int -> integer -> list bit -(* TODO *)let bit_list_of_integer (len:int) (a:integer):list bit = failwith "TODO" +let integer_of_bit_list b = + integerFromBoolList (false,(List.reverse (List.map bit_to_bool b))) + +let bit_list_of_integer len b = + List.map (fun b -> if b then Bitc_one else Bitc_zero) + (boolListFrombitSeq (natFromInt len) (bitSeqFromInteger Nothing b)) +val integer_of_byte_list : list byte -> integer +let integer_of_byte_list bytes = integer_of_bit_list (List.concatMap (fun (Byte bs) -> bs) bytes) + +val byte_list_of_integer : int -> integer -> list byte +let byte_list_of_integer (len:int) (a:integer):list byte = + let bits = bit_list_of_integer (len * 8) a in bytes_of_bits bits val integer_of_address : address -> integer let integer_of_address (a:address):integer = diff --git a/src/lem_interp/printing_functions.ml b/src/lem_interp/printing_functions.ml index de6b24d5..7fc247a7 100644 --- a/src/lem_interp/printing_functions.ml +++ b/src/lem_interp/printing_functions.ml @@ -50,7 +50,7 @@ let bitvec_to_string l = "0b" ^ collapse_leading (String.concat "" (List.map (fu let bytes_to_string bytes = (String.concat "" (List.map (fun i -> let s = (Printf.sprintf "%x" i) in if (String.length s = 1) then "0"^s else s) - (List.map (fun (Byte_lifted bs) -> bits_to_byte bs) bytes))) + (List.map (fun (Byte_lifted bs) -> bits_to_word8 bs) bytes))) let bit_lifted_to_string = function | Bitl_zero -> "0" |
