open Preamble open Proper open PositiveMap open Deqsets open Extralib open Lists open Identifiers open Integers open AST open Division open Exp open Arithmetic open Extranat open Vector open FoldStuff open BitVector open Z open BitVectorZ open Pointers open ErrorMessages open Option open Setoids open Monad open Positive open PreIdentifiers open Errors open Div_and_mod open Jmeq open Russell open Util open Bool open Relations open Nat open List open Hints_declaration open Core_notation open Pts open Logic open Types open Coqlib open Values open Hide open ByteValues (** val make_parts : ByteValues.part List.list **) let make_parts = List.map ByteValues.part_from_sig (Lists.range_strong AST.size_pointer) (** val make_be_null : ByteValues.beval List.list **) let make_be_null = List.map (fun p -> ByteValues.BVnull p) make_parts (** val bytes_of_bitvector : Nat.nat -> BitVector.bitVector -> BitVector.byte List.list **) let rec bytes_of_bitvector n v = (match n with | Nat.O -> (fun x -> List.Nil) | Nat.S m -> (fun v0 -> let { Types.fst = h; Types.snd = t } = Vector.vsplit (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.times m (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))) v0 in List.Cons (h, (bytes_of_bitvector m t)))) v (** val fe_to_be_values : AST.typ -> Values.val0 -> ByteValues.beval List.list **) let fe_to_be_values t = function | Values.Vundef -> List.make_list ByteValues.BVundef (AST.typesize t) | Values.Vint (sz, i) -> List.map (fun b -> ByteValues.BVByte b) (bytes_of_bitvector (AST.size_intsize sz) i) | Values.Vnull -> make_be_null | Values.Vptr ptr -> ByteValues.bevals_of_pointer ptr (** val check_be_null : Nat.nat -> ByteValues.beval List.list -> Bool.bool **) let rec check_be_null n = function | List.Nil -> Nat.eqb AST.size_pointer n | List.Cons (hd, tl) -> (match hd with | ByteValues.BVundef -> Bool.False | ByteValues.BVnonzero -> Bool.False | ByteValues.BVXor (x, x0, x1) -> Bool.False | ByteValues.BVByte x -> Bool.False | ByteValues.BVnull pt -> Bool.andb (Nat.eqb (ByteValues.part_no pt) n) (check_be_null (Nat.S n) tl) | ByteValues.BVptr (x, x0) -> Bool.False | ByteValues.BVpc (x, x0) -> Bool.False) (** val build_integer : Nat.nat -> ByteValues.beval List.list -> BitVector.bitVector Types.option **) let rec build_integer n l = match n with | Nat.O -> (match l with | List.Nil -> Types.Some Vector.VEmpty | List.Cons (x, x0) -> Types.None) | Nat.S m -> (match l with | List.Nil -> Types.None | List.Cons (h, t) -> (match h with | ByteValues.BVundef -> Types.None | ByteValues.BVnonzero -> Types.None | ByteValues.BVXor (x, x0, x1) -> Types.None | ByteValues.BVByte b -> Types.option_map (fun tl -> Vector.append (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))) (Nat.times m (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))) b tl) (build_integer m t) | ByteValues.BVnull x -> Types.None | ByteValues.BVptr (x, x0) -> Types.None | ByteValues.BVpc (x, x0) -> Types.None)) (** val build_integer_val : AST.typ -> ByteValues.beval List.list -> Values.val0 **) let build_integer_val t l = match t with | AST.ASTint (sz, sg) -> Types.option_map_def (fun x -> Values.Vint (sz, x)) Values.Vundef (build_integer (AST.size_intsize sz) l) | AST.ASTptr -> Values.Vundef (** val be_to_fe_value : AST.typ -> ByteValues.beval List.list -> Values.val0 **) let be_to_fe_value ty l = match l with | List.Nil -> Values.Vundef | List.Cons (h, t) -> (match h with | ByteValues.BVundef -> Values.Vundef | ByteValues.BVnonzero -> Values.Vundef | ByteValues.BVXor (x, x0, x1) -> Values.Vundef | ByteValues.BVByte b -> build_integer_val ty l | ByteValues.BVnull pt -> (match Bool.andb (Nat.eqb (ByteValues.part_no pt) Nat.O) (check_be_null (Nat.S Nat.O) t) with | Bool.True -> Values.Vnull | Bool.False -> Values.Vundef) | ByteValues.BVptr (x, x0) -> (match ByteValues.pointer_of_bevals l with | Errors.OK ptr -> Values.Vptr ptr | Errors.Error x1 -> Values.Vundef) | ByteValues.BVpc (x, x0) -> Values.Vundef)