123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230(*Generated by Lem from sail2_operators.lem.*)openLem_pervasives_extraopenLem_machine_wordopenSail2_values(*** Bit vector operations *)(*val concat_bv : forall 'a 'b. Bitvector 'a, Bitvector 'b => 'a -> 'b -> list bitU*)letconcat_bvdict_Sail2_values_Bitvector_adict_Sail2_values_Bitvector_blr:(bitU)list=(List.rev_append(List.rev(dict_Sail2_values_Bitvector_a.bits_of_methodl))(dict_Sail2_values_Bitvector_b.bits_of_methodr))(*val cons_bv : forall 'a. Bitvector 'a => bitU -> 'a -> list bitU*)letcons_bvdict_Sail2_values_Bitvector_abv:(bitU)list=(b::dict_Sail2_values_Bitvector_a.bits_of_methodv)(*val cast_unit_bv : bitU -> list bitU*)letcast_unit_bvb:(bitU)list=([b])(*val bv_of_bit : integer -> bitU -> list bitU*)letbv_of_bitlenb:(bitU)list=(extz_bitslen[b])letmost_significantdict_Sail2_values_Bitvector_av:bitU=((matchdict_Sail2_values_Bitvector_a.bits_of_methodvwith|b::_->b|_->B0(* Treat empty bitvector as all zeros *)))letget_max_representable_insign(n:Nat_big_num.num):Nat_big_num.num=(if(Nat_big_num.equaln((Nat_big_num.of_int64)))then(matchsignwith|true->max_64|false->max_64u)elseif(Nat_big_num.equaln((Nat_big_num.of_int32)))then(matchsignwith|true->max_32|false->max_32u)elseif(Nat_big_num.equaln((Nat_big_num.of_int8)))thenmax_8elseif(Nat_big_num.equaln((Nat_big_num.of_int5)))thenmax_5else(matchsignwith|true->Nat_big_num.pow_int((Nat_big_num.of_int2))(Nat_num.nat_monus(abs(Nat_big_num.to_intn))1)|false->Nat_big_num.pow_int((Nat_big_num.of_int2))(abs(Nat_big_num.to_intn))))letget_min_representable_in_(n:Nat_big_num.num):Nat_big_num.num=(ifNat_big_num.equaln((Nat_big_num.of_int64))thenmin_64elseifNat_big_num.equaln((Nat_big_num.of_int32))thenmin_32elseifNat_big_num.equaln((Nat_big_num.of_int8))thenmin_8elseifNat_big_num.equaln((Nat_big_num.of_int5))thenmin_5elseNat_big_num.sub((Nat_big_num.of_int0))(Nat_big_num.pow_int((Nat_big_num.of_int2))(abs(Nat_big_num.to_intn))))(*val arith_op_bv_int : forall 'a 'b. Bitvector 'a =>
(integer -> integer -> integer) -> bool -> 'a -> integer -> 'a*)letarith_op_bv_intdict_Sail2_values_Bitvector_aopsignlr:'a=(letr'=(dict_Sail2_values_Bitvector_a.of_int_method(dict_Sail2_values_Bitvector_a.length_methodl)r)indict_Sail2_values_Bitvector_a.arith_op_bv_methodopsignlr')(*val arith_op_int_bv : forall 'a 'b. Bitvector 'a =>
(integer -> integer -> integer) -> bool -> integer -> 'a -> 'a*)letarith_op_int_bvdict_Sail2_values_Bitvector_aopsignlr:'a=(letl'=(dict_Sail2_values_Bitvector_a.of_int_method(dict_Sail2_values_Bitvector_a.length_methodr)l)indict_Sail2_values_Bitvector_a.arith_op_bv_methodopsignl'r)letarith_op_bv_booldict_Sail2_values_Bitvector_aopsignlr:'a=(arith_op_bv_intdict_Sail2_values_Bitvector_aopsignl(ifrthen(Nat_big_num.of_int1)else(Nat_big_num.of_int0)))letarith_op_bv_bitdict_Sail2_values_Bitvector_aopsignlr:'aoption=(Lem.option_map(arith_op_bv_booldict_Sail2_values_Bitvector_aopsignl)(bool_of_bitUr))(* TODO (or just omit and define it per spec if needed)
val arith_op_overflow_bv : forall 'a. Bitvector 'a =>
(integer -> integer -> integer) -> bool -> integer -> 'a -> 'a -> (list bitU * bitU * bitU)
let arith_op_overflow_bv op sign size l r =
let len = length l in
let act_size = len * size in
match (int_of_bv sign l, int_of_bv sign r, int_of_bv false l, int_of_bv false r) with
| (Just l_sign, Just r_sign, Just l_unsign, Just r_unsign) ->
let n = op l_sign r_sign in
let n_unsign = op l_unsign r_unsign in
let correct_size = of_int act_size n in
let one_more_size_u = bits_of_int (act_size + 1) n_unsign in
let overflow =
if n <= get_max_representable_in sign len &&
n >= get_min_representable_in sign len
then B0 else B1 in
let c_out = most_significant one_more_size_u in
(correct_size,overflow,c_out)
| (_, _, _, _) ->
(repeat [BU] act_size, BU, BU)
end
let add_overflow_bv = arith_op_overflow_bv integerAdd false 1
let adds_overflow_bv = arith_op_overflow_bv integerAdd true 1
let sub_overflow_bv = arith_op_overflow_bv integerMinus false 1
let subs_overflow_bv = arith_op_overflow_bv integerMinus true 1
let mult_overflow_bv = arith_op_overflow_bv integerMult false 2
let mults_overflow_bv = arith_op_overflow_bv integerMult true 2
val arith_op_overflow_bv_bit : forall 'a. Bitvector 'a =>
(integer -> integer -> integer) -> bool -> integer -> 'a -> bitU -> (list bitU * bitU * bitU)
let arith_op_overflow_bv_bit op sign size l r_bit =
let act_size = length l * size in
match (int_of_bv sign l, int_of_bv false l, r_bit = BU) with
| (Just l', Just l_u, false) ->
let (n, nu, changed) = match r_bit with
| B1 -> (op l' 1, op l_u 1, true)
| B0 -> (l', l_u, false)
| BU -> (* unreachable due to check above *)
failwith "arith_op_overflow_bv_bit applied to undefined bit"
end in
let correct_size = of_int act_size n in
let one_larger = bits_of_int (act_size + 1) nu in
let overflow =
if changed
then
if n <= get_max_representable_in sign act_size && n >= get_min_representable_in sign act_size
then B0 else B1
else B0 in
(correct_size, overflow, most_significant one_larger)
| (_, _, _) ->
(repeat [BU] act_size, BU, BU)
end
let add_overflow_bv_bit = arith_op_overflow_bv_bit integerAdd false 1
let adds_overflow_bv_bit = arith_op_overflow_bv_bit integerAdd true 1
let sub_overflow_bv_bit = arith_op_overflow_bv_bit integerMinus false 1
let subs_overflow_bv_bit = arith_op_overflow_bv_bit integerMinus true 1*)typeshift=LL_shift|RR_shift|RR_shift_arith|LL_rot|RR_rotletinvert_shift:shift->shift=((function|LL_shift->RR_shift|RR_shift->LL_shift|RR_shift_arith->LL_shift|LL_rot->RR_rot|RR_rot->LL_rot))(*val shift_op_bv : forall 'a. Bitvector 'a => shift -> 'a -> integer -> list bitU*)letshift_op_bvdict_Sail2_values_Bitvector_aopvn:(bitU)list=(letv=(dict_Sail2_values_Bitvector_a.bits_of_methodv)inifNat_big_num.equaln((Nat_big_num.of_int0))thenvelselet(op,n)=(ifNat_big_num.greatern((Nat_big_num.of_int0))then(op,n)else(invert_shiftop,Nat_big_num.negaten))in(matchopwith|LL_shift->List.rev_append(List.rev(subrange_listtruevn(Nat_big_num.sub(Nat_big_num.of_int(List.lengthv))((Nat_big_num.of_int1)))))(repeat[B0]n)|RR_shift->List.rev_append(List.rev(repeat[B0]n))(subrange_listtruev((Nat_big_num.of_int0))(Nat_big_num.sub(Nat_big_num.sub(Nat_big_num.of_int(List.lengthv))n)((Nat_big_num.of_int1))))|RR_shift_arith->List.rev_append(List.rev(repeat[most_significant(instance_Sail2_values_Bitvector_list_dictinstance_Sail2_values_BitU_Sail2_values_bitU_dict)v]n))(subrange_listtruev((Nat_big_num.of_int0))(Nat_big_num.sub(Nat_big_num.sub(Nat_big_num.of_int(List.lengthv))n)((Nat_big_num.of_int1))))|LL_rot->List.rev_append(List.rev(subrange_listtruevn(Nat_big_num.sub(Nat_big_num.of_int(List.lengthv))((Nat_big_num.of_int1)))))(subrange_listtruev((Nat_big_num.of_int0))(Nat_big_num.subn((Nat_big_num.of_int1))))|RR_rot->List.rev_append(List.rev(subrange_listfalsev((Nat_big_num.of_int0))(Nat_big_num.subn((Nat_big_num.of_int1)))))(subrange_listfalsevn(Nat_big_num.sub(Nat_big_num.of_int(List.lengthv))((Nat_big_num.of_int1))))))letshiftl_bvdict_Sail2_values_Bitvector_a:'a->Nat_big_num.num->(bitU)list=(shift_op_bvdict_Sail2_values_Bitvector_aLL_shift)(*"<<"*)letshiftr_bvdict_Sail2_values_Bitvector_a:'a->Nat_big_num.num->(bitU)list=(shift_op_bvdict_Sail2_values_Bitvector_aRR_shift)(*">>"*)letarith_shiftr_bvdict_Sail2_values_Bitvector_a:'a->Nat_big_num.num->(bitU)list=(shift_op_bvdict_Sail2_values_Bitvector_aRR_shift_arith)letrotl_bvdict_Sail2_values_Bitvector_a:'a->Nat_big_num.num->(bitU)list=(shift_op_bvdict_Sail2_values_Bitvector_aLL_rot)(*"<<<"*)letrotr_bvdict_Sail2_values_Bitvector_a:'a->Nat_big_num.num->(bitU)list=(shift_op_bvdict_Sail2_values_Bitvector_aLL_rot)(*">>>"*)letshiftl_mwordwn:Lem.mword=(Lem.word_shiftLeftw(nat_of_intn))letshiftr_mwordwn:Lem.mword=(Lem.word_shiftRightw(nat_of_intn))letarith_shiftr_mwordwn:Lem.mword=(Lem.word_arithShiftRightw(nat_of_intn))letrotl_mwordwn:Lem.mword=(Lem.word_rol(nat_of_intn)w)letrotr_mwordwn:Lem.mword=(Lem.word_ror(nat_of_intn)w)letarith_op_no0(op:Nat_big_num.num->Nat_big_num.num->Nat_big_num.num)lr:(Nat_big_num.num)option=(ifNat_big_num.equalr((Nat_big_num.of_int0))thenNoneelseSome(oplr))(*val arith_op_bv_no0 : forall 'a 'b. Bitvector 'a, Bitvector 'b =>
(integer -> integer -> integer) -> bool -> integer -> 'a -> 'a -> maybe 'b*)letarith_op_bv_no0dict_Sail2_values_Bitvector_adict_Sail2_values_Bitvector_bopsignsizelr:'boption=(Lem.option_bind(int_of_bvdict_Sail2_values_Bitvector_asignl)(funl'->Lem.option_bind(int_of_bvdict_Sail2_values_Bitvector_asignr)(funr'->ifNat_big_num.equalr'((Nat_big_num.of_int0))thenNoneelseSome(dict_Sail2_values_Bitvector_b.of_int_method(Nat_big_num.mul(dict_Sail2_values_Bitvector_a.length_methodl)size)(opl'r')))))letmod_bvdict_Sail2_values_Bitvector_adict_Sail2_values_Bitvector_b:'b->'b->'aoption=(arith_op_bv_no0dict_Sail2_values_Bitvector_bdict_Sail2_values_Bitvector_atmod_intfalse((Nat_big_num.of_int1)))letquot_bvdict_Sail2_values_Bitvector_adict_Sail2_values_Bitvector_b:'b->'b->'aoption=(arith_op_bv_no0dict_Sail2_values_Bitvector_bdict_Sail2_values_Bitvector_atdiv_intfalse((Nat_big_num.of_int1)))letquots_bvdict_Sail2_values_Bitvector_adict_Sail2_values_Bitvector_b:'b->'b->'aoption=(arith_op_bv_no0dict_Sail2_values_Bitvector_bdict_Sail2_values_Bitvector_atdiv_inttrue((Nat_big_num.of_int1)))letmod_mword:Lem.mword->Lem.mword->Lem.mword=Lem.word_modletquot_mword:Lem.mword->Lem.mword->Lem.mword=Lem.word_udivletquots_mword:Lem.mword->Lem.mword->Lem.mword=Lem_machine_word.signedDivideletarith_op_bv_int_no0dict_Sail2_values_Bitvector_adict_Sail2_values_Bitvector_bopsignsizelr:'boption=(arith_op_bv_no0dict_Sail2_values_Bitvector_adict_Sail2_values_Bitvector_bopsignsizel(dict_Sail2_values_Bitvector_a.of_int_method(dict_Sail2_values_Bitvector_a.length_methodl)r))letquot_bv_intdict_Sail2_values_Bitvector_adict_Sail2_values_Bitvector_b:'b->Nat_big_num.num->'aoption=(arith_op_bv_int_no0dict_Sail2_values_Bitvector_bdict_Sail2_values_Bitvector_atdiv_intfalse((Nat_big_num.of_int1)))letmod_bv_intdict_Sail2_values_Bitvector_adict_Sail2_values_Bitvector_b:'b->Nat_big_num.num->'aoption=(arith_op_bv_int_no0dict_Sail2_values_Bitvector_bdict_Sail2_values_Bitvector_atmod_intfalse((Nat_big_num.of_int1)))letmod_mword_intdict_Machine_word_Size_alr:Lem.mword=(Lem.word_modl(wordFromIntegerdict_Machine_word_Size_ar))letquot_mword_intdict_Machine_word_Size_alr:Lem.mword=(Lem.word_udivl(wordFromIntegerdict_Machine_word_Size_ar))letquots_mword_intdict_Machine_word_Size_alr:Lem.mword=(Lem_machine_word.signedDividel(wordFromIntegerdict_Machine_word_Size_ar))letreplicate_bits_bvdict_Sail2_values_Bitvector_avcount:(bitU)list=(repeat(dict_Sail2_values_Bitvector_a.bits_of_methodv)count)letduplicate_bit_bvdict_Sail2_values_BitU_abitlen:(bitU)list=(replicate_bits_bv(instance_Sail2_values_Bitvector_list_dictdict_Sail2_values_BitU_a)[bit]len)(*val eq_bv : forall 'a. Bitvector 'a => 'a -> 'a -> bool*)leteq_bvdict_Sail2_values_Bitvector_alr:bool=((listEqualBy(=)(dict_Sail2_values_Bitvector_a.bits_of_methodl)(dict_Sail2_values_Bitvector_a.bits_of_methodr)))(*val neq_bv : forall 'a. Bitvector 'a => 'a -> 'a -> bool*)letneq_bvdict_Sail2_values_Bitvector_alr:bool=(not(eq_bvdict_Sail2_values_Bitvector_alr))(*val get_slice_int_bv : forall 'a. Bitvector 'a => integer -> integer -> integer -> 'a*)letget_slice_int_bvdict_Sail2_values_Bitvector_alennlo:'a=(lethi=(Nat_big_num.sub(Nat_big_num.addlolen)((Nat_big_num.of_int1)))inletbs=(bools_of_int(Nat_big_num.addhi((Nat_big_num.of_int1)))n)indict_Sail2_values_Bitvector_a.of_bools_method(subrange_listfalsebshilo))(*val set_slice_int_bv : forall 'a. Bitvector 'a => integer -> integer -> integer -> 'a -> integer*)letset_slice_int_bvdict_Sail2_values_Bitvector_alennlov:Nat_big_num.num=(lethi=(Nat_big_num.sub(Nat_big_num.addlolen)((Nat_big_num.of_int1)))inletbs=(bits_of_int(Nat_big_num.addhi((Nat_big_num.of_int1)))n)inmaybe_failwith(signed_of_bits(update_subrange_listfalsebshilo(dict_Sail2_values_Bitvector_a.bits_of_methodv))))