123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216(**************************************************************************)(* This file is part of the Codex semantics library. *)(* *)(* Copyright (C) 2013-2025 *)(* CEA (Commissariat à l'énergie atomique et aux énergies *)(* alternatives) *)(* *)(* you can redistribute it and/or modify it under the terms of the GNU *)(* Lesser General Public License as published by the Free Software *)(* Foundation, version 2.1. *)(* *)(* It is distributed in the hope that it will be useful, *)(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *)(* GNU Lesser General Public License for more details. *)(* *)(* See the GNU Lesser General Public License version 2.1 *)(* for more details (enclosed in the file LICENSE). *)(* *)(**************************************************************************)openOperator_sigmoduletypeConversion=sigmoduleFrom_Arity:ARITYmoduleTo_Arity:ARITYvalar0:'rFrom_Arity.ar0->'rTo_Arity.ar0valar1:('a,'r)From_Arity.ar1->('a,'r)To_Arity.ar1valar2:('a,'b,'r)From_Arity.ar2->('a,'b,'r)To_Arity.ar2valar3:('a,'b,'c,'r)From_Arity.ar3->('a,'b,'c,'r)To_Arity.ar3endmoduleConvert_Boolean_Forward(C:Conversion)(F:BOOLEAN_FORWARDwithmoduleArity:=C.From_Arity)=structtypeboolean=F.booleanlettrue_=C.ar0F.true_letfalse_=C.ar0F.false_letnot=C.ar1F.notlet(&&)=C.ar2F.(&&)let(||)=C.ar2F.(||)endmoduleConvert_Integer_Forward(C:Conversion)(F:INTEGER_FORWARDwithmoduleArity:=C.From_Arity)=structtypeboolean=F.booleantypeinteger=F.integerleticonstk=C.ar0(F.iconstk)letiadd=C.ar2F.iaddletisub=C.ar2F.isubletimul=C.ar2F.imulletidiv=C.ar2F.idivletimod=C.ar2F.imodletishl=C.ar2F.ishlletishr=C.ar2F.ishrletior=C.ar2F.iorletixor=C.ar2F.ixorletiand=C.ar2F.iand(* Redundant *)letzero=C.ar0(F.zero)letone=C.ar0(F.one)letile=C.ar2F.ileletieq=C.ar2F.ieqletitimesk=C.ar1(F.itimesk)endmoduleConvert_Bitvector_Forward(C:Conversion)(F:BITVECTOR_FORWARDwithmoduleArity:=C.From_Arity)=structtypeboolean=F.booleantypebitvector=F.bitvectorletbiadd~size~flags=C.ar2(F.biadd~size~flags)letbisub~size~flags=C.ar2(F.bisub~size~flags)letbisdiv~size=C.ar2(F.bisdiv~size)letbismod~size=C.ar2(F.bismod~size)letbiudiv~size=C.ar2(F.biudiv~size)letbiumod~size=C.ar2(F.biumod~size)letbimul~size~flags=C.ar2(F.bimul~flags~size)letbeq~size=C.ar2(F.beq~size)letbisle~size=C.ar2(F.bisle~size)letbiule~size=C.ar2(F.biule~size)letbconcat~size1~size2=C.ar2@@F.bconcat~size1~size2letbextract~size~index~oldsize=C.ar1(F.bextract~size~index~oldsize)letband~size=C.ar2(F.band~size)letbor~size=C.ar2(F.bor~size)letbxor~size=C.ar2(F.bxor~size)letbuext~size~oldsize=C.ar1(F.buext~size~oldsize)letbsext~size~oldsize=C.ar1(F.bsext~size~oldsize)letbofbool~size=C.ar1(F.bofbool~size)letbshl~size~flags=C.ar2(F.bshl~size~flags)letbashr~size=C.ar2(F.bashr~size)letblshr~size=C.ar2(F.blshr~size)letbiconst~sizek=C.ar0(F.biconst~sizek)endmoduleConvert_Binary_Forward(C:Conversion)(F:BINARY_FORWARDwithmoduleArity:=C.From_Arity)=structincludeConvert_Bitvector_Forward(C)(structincludeFtypebitvector=binaryend)typebinary=F.binaryletbuninit~size=C.ar0(F.buninit~size)letvalid~sizeaccess_type=C.ar1(F.valid~sizeaccess_type)letvalid_ptr_arith~sizearith_type=C.ar2(F.valid_ptr_arith~sizearith_type)letbshift~size~offset~max=C.ar1(F.bshift~size~offset~max)letbindex~sizescale=C.ar2(F.bindex~sizescale)letbchoose~sizecond=C.ar1(F.bchoose~sizecond)endmoduleConvert_Block_Forward(C:Conversion)(F:BLOCK_FORWARDwithmoduleArity:=C.From_Arity)=structtypeboolean=F.booleantypevalue=F.valuetypeblock=F.blocktypeoffset=F.offsetletsizeof=C.ar1F.sizeofletconcat=C.ar2F.concatletload~size=C.ar2(F.load~size)letstore~size=C.ar3(F.store~size)letbinary_to_block~size=C.ar1(F.binary_to_block~size)endmoduleConvert_Enum_Forward(C:Conversion)(F:ENUM_FORWARDwithmoduleArity:=C.From_Arity)=structtypeboolean=F.booleantypeenum=F.enumletcaseof~case=C.ar1(F.caseof~case)letenum_const~case=C.ar0(F.enum_const~case)endmoduleConvert_Memory_Forward(C:Conversion)(F:MEMORY_FORWARDwithmoduleArity:=C.From_Arity)=structtypeboolean=F.booleantypeaddress=F.addresstypememory=F.memorytypeblock=F.blocktypevalue=F.valueletload~size=C.ar2(F.load~size)letstore~size=C.ar3(F.store~size)letload_block=C.ar2F.load_blockletstore_block=C.ar3F.store_blockletmemcpy~size=C.ar3(F.memcpy~size)letfree=C.ar2F.freeletmalloc~id~malloc_size=C.ar1(F.malloc~id~malloc_size)letunknown~level=C.ar0(F.unknown~level)end(* module Convert_Binary_Forward_Monomorphic *)(* (C:sig *)(* module From_Arity:Arity *)(* module To_Arity:Arity *)(* type from_binary *)(* type from_boolean *)(* type from_world *)(* type to_binary *)(* type to_boolean *)(* type to_world *)(* val ar0_bin: from_binary From_Arity.ar0 -> to_binary To_Arity.ar0 *)(* val ar1_world_bin: (from_world,from_binary) From_Arity.ar1 -> (to_world,to_binary) To_Arity.ar1 *)(* val ar1_bin_bin: (from_binary,from_binary) From_Arity.ar1 -> (to_binary,to_binary) To_Arity.ar1 *)(* val ar1_bin_bool: (from_binary,from_boolean) From_Arity.ar1 -> (to_binary,to_boolean) To_Arity.ar1 *)(* val ar2_bool_bin_bin: (from_boolean,from_binary,from_binary) From_Arity.ar2 -> (to_boolean,to_binary,to_binary) To_Arity.ar2 *)(* val ar2_bin_bin_bin: (from_binary,from_binary,from_binary) From_Arity.ar2 -> (to_binary,to_binary,to_binary) To_Arity.ar2 *)(* val ar2_bin_bin_bool: (from_binary,from_binary,from_boolean) From_Arity.ar2 -> (to_binary,to_binary,to_boolean) To_Arity.ar2 *)(* val variadic: (from_binary,from_binary) From_Arity.variadic -> (to_binary,to_binary) To_Arity.variadic *)(* end) *)(* (F:Binary_Forward with module Arity := C.From_Arity *)(* and type world = C.from_world *)(* and type binary = C.from_binary *)(* and type boolean = C.from_boolean) = *)(* struct *)(* let nondet ~size = C.variadic (F.nondet ~size) *)(* let assume ~size = C.ar2_bool_bin_bin (F.assume ~size) *)(* let bitimes k = C.ar1_bin_bin (F.bitimes k) *)(* let biadd = C.ar2_bin_bin_bin F.biadd *)(* let bisdiv ~size = C.ar2_bin_bin_bin (F.bisdiv ~size) *)(* let bismod ~size = C.ar2_bin_bin_bin (F.bismod ~size) *)(* let bimul ~size = C.ar2_bin_bin_bin (F.bimul ~size) *)(* let beq = C.ar2_bin_bin_bool F.beq *)(* let bisle = C.ar2_bin_bin_bool F.bisle *)(* let bislt = C.ar2_bin_bin_bool F.bislt *)(* let biule = C.ar2_bin_bin_bool F.biule *)(* let biult = C.ar2_bin_bin_bool F.biult *)(* let bconcat = C.variadic F.bconcat *)(* let bextract ~size ~index = C.ar1_bin_bin (F.bextract ~size ~index) *)(* let band ~size = C.ar2_bin_bin_bin (F.band ~size) *)(* let bor ~size = C.ar2_bin_bin_bin (F.bor ~size) *)(* let bxor ~size = C.ar2_bin_bin_bin (F.bxor ~size) *)(* let buext ~size = C.ar1_bin_bin (F.buext ~size) *)(* let bsext ~size = C.ar1_bin_bin (F.bsext ~size) *)(* let bshl ~size = C.ar2_bin_bin_bin (F.bshl ~size) *)(* let bashr ~size = C.ar2_bin_bin_bin (F.bashr ~size) *)(* let blshr ~size = C.ar2_bin_bin_bin (F.blshr ~size) *)(* let biconst ~size k = C.ar0_bin (F.biconst ~size k) *)(* let baddr ~size addr = C.ar0_bin (F.baddr ~size addr) *)(* let bunknown ~size = C.ar1_world_bin (F.bunknown ~size) *)(* let valid ~size = C.ar1_bin_bool (F.valid ~size) *)(* end *)