12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127(*Generated by Lem from sail2_values.lem.*)openLem_pervasives_extraopenLem_machine_word(*open import Sail_impl_base*)type('a,'b)result=|Okof('a)|Errof('b)typeii=Nat_big_num.numtypenn=Nat_big_num.num(*val nat_of_int : integer -> nat*)letnat_of_inti:int=(ifNat_big_num.lessi((Nat_big_num.of_int0))then0elseabs(Nat_big_num.to_inti))(*val pow : integer -> integer -> integer*)letpowmn:Nat_big_num.num=(Nat_big_num.pow_intm(nat_of_intn))letpow2n:Nat_big_num.num=(pow((Nat_big_num.of_int2))n)(*val eq : forall 'a. Eq 'a => 'a -> 'a -> bool*)(*val neq : forall 'a. Eq 'a => 'a -> 'a -> bool*)(*val print_endline : string -> unit*)(*let print_endline _:unit= ()*)(*val print : string -> unit*)(*let print _:unit= ()*)(*val prerr_endline : string -> unit*)(*let prerr_endline _:unit= ()*)letprerrx:unit=(prerr_endlinex)(*val print_int : string -> integer -> unit*)letprint_intmsgi:unit=(print_endline(msg^(Nat_big_num.to_stringi)))(*val prerr_int : string -> integer -> unit*)letprerr_intmsgi:unit=(prerr_endline(msg^(Nat_big_num.to_stringi)))(*val putchar : integer -> unit*)(*let putchar _:unit= ()*)(*val shr_int : ii -> ii -> ii*)letrecshr_intxs:Nat_big_num.num=(ifNat_big_num.greaters((Nat_big_num.of_int0))thenshr_int(Nat_big_num.divx((Nat_big_num.of_int2)))(Nat_big_num.subs((Nat_big_num.of_int1)))elsex)(*val shl_int : integer -> integer -> integer*)letrecshl_intishift1:Nat_big_num.num=(ifNat_big_num.greatershift1((Nat_big_num.of_int0))thenNat_big_num.mul((Nat_big_num.of_int2))(shl_inti(Nat_big_num.subshift1((Nat_big_num.of_int1))))elsei)(*val align_int : integer -> integer -> integer*)letalign_intxy:Nat_big_num.num=(Nat_big_num.mul(Nat_big_num.divxy)y)lettake_listnxs:'alist=(Lem_list.take(nat_of_intn)xs)letdrop_listnxs:'alist=(Lem_list.drop(nat_of_intn)xs)(*val repeat : forall 'a. list 'a -> integer -> list 'a*)letrecrepeatxsn:'alist=(ifNat_big_num.less_equaln((Nat_big_num.of_int0))then[]elseList.rev_append(List.revxs)(repeatxs(Nat_big_num.subn((Nat_big_num.of_int1)))))letduplicate_to_listbitlength:'alist=(repeat[bit]length)letvector_initlengthelement:'alist=(repeat[element]length)letrecreplacebs(n:Nat_big_num.num)b':'alist=((matchbswith|[]->[]|b::bs->ifNat_big_num.equaln((Nat_big_num.of_int0))thenb'::bselseb::replacebs(Nat_big_num.subn((Nat_big_num.of_int1)))b'))letuppern:'a=n(* Modulus operation corresponding to quot below -- result
has sign of dividend. *)lettmod_int(a:Nat_big_num.num)(b:Nat_big_num.num):Nat_big_num.num=(letm=(Nat_big_num.modulus(Nat_big_num.absa)(Nat_big_num.absb))inifNat_big_num.lessa((Nat_big_num.of_int0))thenNat_big_num.negatemelsem)lethardware_mod:Nat_big_num.num->Nat_big_num.num->Nat_big_num.num=tmod_int(* There are different possible answers for integer divide regarding
rounding behaviour on negative operands. Positive operands always
round down so derive the one we want (truncation towards zero) from
that *)lettdiv_int(a:Nat_big_num.num)(b:Nat_big_num.num):Nat_big_num.num=(letq=(Nat_big_num.div(Nat_big_num.absa)(Nat_big_num.absb))inif((Nat_big_num.lessa((Nat_big_num.of_int0)))=(Nat_big_num.lessb((Nat_big_num.of_int0))))thenq(* same sign -- result positive *)elseNat_big_num.negateq)(* different sign -- result negative *)lethardware_quot:Nat_big_num.num->Nat_big_num.num->Nat_big_num.num=tdiv_intletmax_64u:Nat_big_num.num=(Nat_big_num.sub(Nat_big_num.pow_int((Nat_big_num.of_int2))64)((Nat_big_num.of_int1)))letmax_64:Nat_big_num.num=(Nat_big_num.sub(Nat_big_num.pow_int((Nat_big_num.of_int2))63)((Nat_big_num.of_int1)))letmin_64:Nat_big_num.num=(Nat_big_num.sub((Nat_big_num.of_int0))(Nat_big_num.pow_int((Nat_big_num.of_int2))63))letmax_32u:Nat_big_num.num=(((Nat_big_num.of_string"4294967295"):Nat_big_num.num))letmax_32:Nat_big_num.num=(((Nat_big_num.of_string"2147483647"):Nat_big_num.num))letmin_32:Nat_big_num.num=((Nat_big_num.sub((Nat_big_num.of_int0))((Nat_big_num.of_string"2147483648")):Nat_big_num.num))letmax_8:Nat_big_num.num=(((Nat_big_num.of_int127):Nat_big_num.num))letmin_8:Nat_big_num.num=((Nat_big_num.sub((Nat_big_num.of_int0))((Nat_big_num.of_int128)):Nat_big_num.num))letmax_5:Nat_big_num.num=(((Nat_big_num.of_int31):Nat_big_num.num))letmin_5:Nat_big_num.num=((Nat_big_num.sub((Nat_big_num.of_int0))((Nat_big_num.of_int32)):Nat_big_num.num))(* just_list takes a list of maybes and returns Just xs if all elements have
a value, and Nothing if one of the elements is Nothing. *)(*val just_list : forall 'a. list (maybe 'a) -> maybe (list 'a)*)letrecjust_listl:('alist)option=((matchlwith|[]->Some[]|(x::xs)->(match(x,just_listxs)with|(Somex,Somexs)->Some(x::xs)|(_,_)->None)))(*val maybe_failwith : forall 'a. maybe 'a -> 'a*)letmaybe_failwith:'aoption->'a=((function|Somea->a|None->failwith"maybe_failwith"))(*** Bits *)typebitU=B0|B1|BUletshowBitU:bitU->string=((function|B0->"O"|B1->"I"|BU->"U"))letbitU_char:bitU->char=((function|B0->'0'|B1->'1'|BU->'?'))letinstance_Show_Show_Sail2_values_bitU_dict:(bitU)show_class=({show_method=showBitU})(*val compare_bitU : bitU -> bitU -> ordering*)letcompare_bitUlr:int=((match(l,r)with|(BU,BU)->0|(B0,B0)->0|(B1,B1)->0|(BU,_)->(-1)|(_,BU)->1|(B0,_)->(-1)|(_,_)->1))letinstance_Basic_classes_Ord_Sail2_values_bitU_dict:(bitU)ord_class=({compare_method=compare_bitU;isLess_method=(funlr->Lem.orderingEqual(compare_bitUlr)(-1));isLessEqual_method=(funlr->not(Lem.orderingEqual(compare_bitUlr)1));isGreater_method=(funlr->Lem.orderingEqual(compare_bitUlr)1);isGreaterEqual_method=(funlr->not(Lem.orderingEqual(compare_bitUlr)(-1)))})type'abitU_class={to_bitU_method:'a->bitU;of_bitU_method:bitU->'a}letinstance_Sail2_values_BitU_Sail2_values_bitU_dict:(bitU)bitU_class=({to_bitU_method=(funb->b);of_bitU_method=(funb->b)})letbool_of_bitU:bitU->(bool)option=((function|B0->Somefalse|B1->Sometrue|BU->None))letbitU_of_boolb:bitU=(ifbthenB1elseB0)(*instance (BitU bool)
let to_bitU = bitU_of_bool
let of_bitU = bool_of_bitU
end*)letcast_bit_bool:bitU->(bool)option=bool_of_bitUletnot_bit:bitU->bitU=((function|B1->B0|B0->B1|BU->BU))(*val is_one : integer -> bitU*)letis_onei:bitU=(ifNat_big_num.equali((Nat_big_num.of_int1))thenB1elseB0)(*val and_bit : bitU -> bitU -> bitU*)letand_bitxy:bitU=((match(x,y)with|(B0,_)->B0|(_,B0)->B0|(B1,B1)->B1|(_,_)->BU))(*val or_bit : bitU -> bitU -> bitU*)letor_bitxy:bitU=((match(x,y)with|(B1,_)->B1|(_,B1)->B1|(B0,B0)->B0|(_,_)->BU))(*val xor_bit : bitU -> bitU -> bitU*)letxor_bitxy:bitU=((match(x,y)with|(B0,B0)->B0|(B0,B1)->B1|(B1,B0)->B1|(B1,B1)->B0|(_,_)->BU))(*val &. : bitU -> bitU -> bitU*)(*val |. : bitU -> bitU -> bitU*)(*val +. : bitU -> bitU -> bitU*)(*** Bool lists ***)(*val bools_of_nat_aux : integer -> natural -> list bool -> list bool*)letrecbools_of_nat_auxlenxacc:(bool)list=(ifNat_big_num.less_equallen((Nat_big_num.of_int0))thenaccelsebools_of_nat_aux(Nat_big_num.sublen((Nat_big_num.of_int1)))(Nat_big_num.divx((Nat_big_num.of_int2)))((ifNat_big_num.equal(Nat_big_num.modulusx((Nat_big_num.of_int2)))((Nat_big_num.of_int1))thentrueelsefalse)::acc))letbools_of_natlenn:(bool)list=(bools_of_nat_auxlenn[])(*List.reverse (bools_of_nat_aux n)*)(*val nat_of_bools_aux : natural -> list bool -> natural*)letrecnat_of_bools_auxaccbs:Nat_big_num.num=((matchbswith|[]->acc|true::bs->nat_of_bools_aux(Nat_big_num.add(Nat_big_num.mul((Nat_big_num.of_int2))acc)((Nat_big_num.of_int1)))bs|false::bs->nat_of_bools_aux(Nat_big_num.mul((Nat_big_num.of_int2))acc)bs))letnat_of_boolsbs:Nat_big_num.num=(nat_of_bools_aux((Nat_big_num.of_int0))bs)(*val unsigned_of_bools : list bool -> integer*)letunsigned_of_boolsbs:Nat_big_num.num=((nat_of_boolsbs))(*val signed_of_bools : list bool -> integer*)letsigned_of_boolsbs:Nat_big_num.num=((matchbswith|true::_->Nat_big_num.sub((Nat_big_num.of_int0))(Nat_big_num.add((Nat_big_num.of_int1))(unsigned_of_bools(Lem_list.mapnotbs)))|false::_->unsigned_of_boolsbs|[]->(Nat_big_num.of_int0)(* Treat empty list as all zeros *)))(*val int_of_bools : bool -> list bool -> integer*)letint_of_boolssignbs:Nat_big_num.num=(ifsignthensigned_of_boolsbselseunsigned_of_boolsbs)(*val pad_list : forall 'a. 'a -> list 'a -> integer -> list 'a*)letrecpad_listxxsn:'alist=(ifNat_big_num.less_equaln((Nat_big_num.of_int0))thenxselsepad_listx(x::xs)(Nat_big_num.subn((Nat_big_num.of_int1))))letext_listpadlenxs:'alist=(letlonger=(Nat_big_num.sublen(Nat_big_num.of_int(List.lengthxs)))inifNat_big_num.lesslonger((Nat_big_num.of_int0))thendrop(nat_of_int(Nat_big_num.abs(longer)))xselsepad_listpadxslonger)letextz_boolslenbs:(bool)list=(ext_listfalselenbs)letexts_boolslenbs:(bool)list=((matchbswith|true::_->ext_listtruelenbs|_->ext_listfalselenbs))letrecadd_one_bool_ignore_overflow_auxbits:(bool)list=((matchbitswith|[]->[]|false::bits->true::bits|true::bits->false::add_one_bool_ignore_overflow_auxbits))letadd_one_bool_ignore_overflowbits:(bool)list=(List.rev(add_one_bool_ignore_overflow_aux(List.revbits)))(*let bool_list_of_int n =
let bs_abs = false :: bools_of_nat (naturalFromInteger (abs n)) in
if n >= (0 : integer) then bs_abs
else add_one_bool_ignore_overflow (List.map not bs_abs)
let bools_of_int len n = exts_bools len (bool_list_of_int n)*)letbools_of_intlenn:(bool)list=(letbs_abs=(bools_of_natlen(Nat_big_num.abs(Nat_big_num.absn)))inifNat_big_num.greater_equaln((Nat_big_num.of_int0):Nat_big_num.num)thenbs_abselseadd_one_bool_ignore_overflow(Lem_list.mapnotbs_abs))(*** Bit lists ***)(*val has_undefined_bits : list bitU -> bool*)lethas_undefined_bitsbs:bool=(List.exists((functionBU->true|_->false))bs)letbits_of_natlenn:(bitU)list=(Lem_list.mapbitU_of_bool(bools_of_natlenn))letnat_of_bitsbits:(Nat_big_num.num)option=((match(just_list(Lem_list.mapbool_of_bitUbits))with|Somebs->Some(nat_of_boolsbs)|None->None))letnot_bits:(bitU)list->(bitU)list=(Lem_list.mapnot_bit)(*val binop_list : forall 'a. ('a -> 'a -> 'a) -> list 'a -> list 'a -> list 'a*)letbinop_listopxsys:'alist=(List.fold_right(fun(x,y)acc->opxy::acc)(list_combinexsys)[])letunsigned_of_bitsbits:(Nat_big_num.num)option=((match(just_list(Lem_list.mapbool_of_bitUbits))with|Somebs->Some(unsigned_of_boolsbs)|None->None))letsigned_of_bitsbits:(Nat_big_num.num)option=((match(just_list(Lem_list.mapbool_of_bitUbits))with|Somebs->Some(signed_of_boolsbs)|None->None))(*val int_of_bits : bool -> list bitU -> maybe integer*)letint_of_bitssignbs:(Nat_big_num.num)option=(ifsignthensigned_of_bitsbselseunsigned_of_bitsbs)letextz_bitslenbits:(bitU)list=(ext_listB0lenbits)letexts_bitslenbits:(bitU)list=((matchbitswith|BU::_->ext_listBUlenbits|B1::_->ext_listB1lenbits|_->ext_listB0lenbits))letrecadd_one_bit_ignore_overflow_auxbits:(bitU)list=((matchbitswith|[]->[]|B0::bits->B1::bits|B1::bits->B0::add_one_bit_ignore_overflow_auxbits|BU::bits->BU::Lem_list.map(fun_->BU)bits))letadd_one_bit_ignore_overflowbits:(bitU)list=(List.rev(add_one_bit_ignore_overflow_aux(List.revbits)))(*let bit_list_of_int n = List.map bitU_of_bool (bool_list_of_int n)
let bits_of_int len n = exts_bits len (bit_list_of_int n)*)letbits_of_intlenn:(bitU)list=(Lem_list.mapbitU_of_bool(bools_of_intlenn))(*val arith_op_bits :
(integer -> integer -> integer) -> bool -> list bitU -> list bitU -> list bitU*)letarith_op_bitsopsignlr:(bitU)list=((match(int_of_bitssignl,int_of_bitssignr)with|(Someli,Someri)->bits_of_int(Nat_big_num.of_int(List.lengthl))(opliri)|(_,_)->repeat[BU](Nat_big_num.of_int(List.lengthl))))letchar_of_nibble:bitU*bitU*bitU*bitU->(char)option=((function|(B0,B0,B0,B0)->Some'0'|(B0,B0,B0,B1)->Some'1'|(B0,B0,B1,B0)->Some'2'|(B0,B0,B1,B1)->Some'3'|(B0,B1,B0,B0)->Some'4'|(B0,B1,B0,B1)->Some'5'|(B0,B1,B1,B0)->Some'6'|(B0,B1,B1,B1)->Some'7'|(B1,B0,B0,B0)->Some'8'|(B1,B0,B0,B1)->Some'9'|(B1,B0,B1,B0)->Some'A'|(B1,B0,B1,B1)->Some'B'|(B1,B1,B0,B0)->Some'C'|(B1,B1,B0,B1)->Some'D'|(B1,B1,B1,B0)->Some'E'|(B1,B1,B1,B1)->Some'F'|_->None))letnibble_of_char:char->(bitU*bitU*bitU*bitU)option=((function|'0'->Some(B0,B0,B0,B0)|'1'->Some(B0,B0,B0,B1)|'2'->Some(B0,B0,B1,B0)|'3'->Some(B0,B0,B1,B1)|'4'->Some(B0,B1,B0,B0)|'5'->Some(B0,B1,B0,B1)|'6'->Some(B0,B1,B1,B0)|'7'->Some(B0,B1,B1,B1)|'8'->Some(B1,B0,B0,B0)|'9'->Some(B1,B0,B0,B1)|'A'->Some(B1,B0,B1,B0)|'B'->Some(B1,B0,B1,B1)|'C'->Some(B1,B1,B0,B0)|'D'->Some(B1,B1,B0,B1)|'E'->Some(B1,B1,B1,B0)|'F'->Some(B1,B1,B1,B1)|_->None))letrechexstring_of_bitsbs:((char)list)option=((matchbswith|b1::b2::b3::b4::bs->letn=(char_of_nibble(b1,b2,b3,b4))inlets=(hexstring_of_bitsbs)in(match(n,s)with|(Somen,Somes)->Some(n::s)|_->None)|[]->Some[]|_->None))letshow_bitlist_prefixcbs:string=((matchhexstring_of_bitsbswith|Somes->Xstring.implode(c::('x'::s))|None->Xstring.implode(c::('b'::mapbitU_charbs))))letshow_bitlistbs:string=(show_bitlist_prefix'0'bs)(*val hex_char : natural -> char*)lethex_charn:char=(if(Nat_big_num.equaln((Nat_big_num.of_int0)))then'0'else(if(Nat_big_num.equaln((Nat_big_num.of_int1)))then'1'else(if(Nat_big_num.equaln((Nat_big_num.of_int2)))then'2'else(if(Nat_big_num.equaln((Nat_big_num.of_int3)))then'3'else(if(Nat_big_num.equaln((Nat_big_num.of_int4)))then'4'else(if(Nat_big_num.equaln((Nat_big_num.of_int5)))then'5'else(if(Nat_big_num.equaln((Nat_big_num.of_int6)))then'6'else(if(Nat_big_num.equaln((Nat_big_num.of_int7)))then'7'else(if(Nat_big_num.equaln((Nat_big_num.of_int8)))then'8'else(if(Nat_big_num.equaln((Nat_big_num.of_int9)))then'9'else(if(Nat_big_num.equaln((Nat_big_num.of_int10)))then'A'else(if(Nat_big_num.equaln((Nat_big_num.of_int11)))then'B'else(if(Nat_big_num.equaln((Nat_big_num.of_int12)))then'C'else(if(Nat_big_num.equaln((Nat_big_num.of_int13)))then'D'else(if(Nat_big_num.equaln((Nat_big_num.of_int14)))then'E'else(if(Nat_big_num.equaln((Nat_big_num.of_int15)))then'F'else(failwith"hex_char: not a hexadecimal digit")))))))))))))))))(*val hex_str_aux : natural -> list char -> list char*)letrechex_str_auxnacc:(char)list=(ifNat_big_num.equaln((Nat_big_num.of_int0))thenaccelsehex_str_aux(Nat_big_num.divn((Nat_big_num.of_int16)))(hex_char(Nat_big_num.modulusn((Nat_big_num.of_int16)))::acc))(*val hex_str : integer -> string*)lethex_stri:string=(ifNat_big_num.lessi((Nat_big_num.of_int0))thenfailwith"hex_str: negative"elseifNat_big_num.equali((Nat_big_num.of_int0))then"0x0"else"0x"^Xstring.implode(hex_str_aux(Nat_big_num.abs(Nat_big_num.absi))[]))(*val hex_str_upper : integer -> string*)lethex_str_upperi:string=(hex_stri)(*val subrange_list_inc : forall 'a. list 'a -> integer -> integer -> list 'a*)letsubrange_list_incxsij:'alist=(let(toJ,_suffix)=(Lem_list.split_at(nat_of_int(Nat_big_num.addj((Nat_big_num.of_int1))))xs)inlet(_prefix,fromItoJ)=(Lem_list.split_at(nat_of_inti)toJ)infromItoJ)(*val subrange_list_dec : forall 'a. list 'a -> integer -> integer -> list 'a*)letsubrange_list_decxsij:'alist=(lettop=(Nat_big_num.sub(Nat_big_num.of_int(List.lengthxs))((Nat_big_num.of_int1)))insubrange_list_incxs(Nat_big_num.subtopi)(Nat_big_num.subtopj))(*val subrange_list : forall 'a. bool -> list 'a -> integer -> integer -> list 'a*)letsubrange_listis_incxsij:'alist=(ifis_incthensubrange_list_incxsijelsesubrange_list_decxsij)(*val update_subrange_list_inc : forall 'a. list 'a -> integer -> integer -> list 'a -> list 'a*)letupdate_subrange_list_incxsijxs':'alist=(let(toJ,suffix)=(Lem_list.split_at(nat_of_int(Nat_big_num.addj((Nat_big_num.of_int1))))xs)inlet(prefix,_fromItoJ)=(Lem_list.split_at(nat_of_inti)toJ)inList.rev_append(List.rev(List.rev_append(List.revprefix)xs'))suffix)(*val update_subrange_list_dec : forall 'a. list 'a -> integer -> integer -> list 'a -> list 'a*)letupdate_subrange_list_decxsijxs':'alist=(lettop=(Nat_big_num.sub(Nat_big_num.of_int(List.lengthxs))((Nat_big_num.of_int1)))inupdate_subrange_list_incxs(Nat_big_num.subtopi)(Nat_big_num.subtopj)xs')(*val update_subrange_list : forall 'a. bool -> list 'a -> integer -> integer -> list 'a -> list 'a*)letupdate_subrange_listis_incxsijxs':'alist=(ifis_incthenupdate_subrange_list_incxsijxs'elseupdate_subrange_list_decxsijxs')(*val access_list_inc : forall 'a. list 'a -> integer -> 'a*)letaccess_list_incxsn:'a=(List.nthxs(nat_of_intn))(*val access_list_dec : forall 'a. list 'a -> integer -> 'a*)letaccess_list_decxsn:'a=(lettop=(Nat_big_num.sub(Nat_big_num.of_int(List.lengthxs))((Nat_big_num.of_int1)))inaccess_list_incxs(Nat_big_num.subtopn))(*val access_list : forall 'a. bool -> list 'a -> integer -> 'a*)letaccess_listis_incxsn:'a=(ifis_incthenaccess_list_incxsnelseaccess_list_decxsn)(*val update_list_inc : forall 'a. list 'a -> integer -> 'a -> list 'a*)letupdate_list_incxsnx:'alist=(Lem_list.list_updatexs(nat_of_intn)x)(*val update_list_dec : forall 'a. list 'a -> integer -> 'a -> list 'a*)letupdate_list_decxsnx:'alist=(lettop=(Nat_big_num.sub(Nat_big_num.of_int(List.lengthxs))((Nat_big_num.of_int1)))inupdate_list_incxs(Nat_big_num.subtopn)x)(*val update_list : forall 'a. bool -> list 'a -> integer -> 'a -> list 'a*)letupdate_listis_incxsnx:'alist=(ifis_incthenupdate_list_incxsnxelseupdate_list_decxsnx)letextract_only_bit:(bitU)list->bitU=((function|[]->BU|[e]->e|_->BU))(*** Machine words *)(*val length_mword : forall 'a. mword 'a -> integer*)(*val slice_mword_dec : forall 'a 'b. mword 'a -> integer -> integer -> mword 'b*)letslice_mword_decwij:Lem.mword=(Lem.word_extract(nat_of_inti)(nat_of_intj)w)(*val slice_mword_inc : forall 'a 'b. mword 'a -> integer -> integer -> mword 'b*)letslice_mword_incwij:Lem.mword=(lettop=(Nat_big_num.sub(Nat_big_num.of_int(Lem.word_lengthw))((Nat_big_num.of_int1)))inslice_mword_decw(Nat_big_num.subtopi)(Nat_big_num.subtopj))(*val slice_mword : forall 'a 'b. bool -> mword 'a -> integer -> integer -> mword 'b*)letslice_mwordis_incwij:Lem.mword=(ifis_incthenslice_mword_incwijelseslice_mword_decwij)(*val update_slice_mword_dec : forall 'a 'b. mword 'a -> integer -> integer -> mword 'b -> mword 'a*)letupdate_slice_mword_decwijw':Lem.mword=(Lem.word_updatew(nat_of_inti)(nat_of_intj)w')(*val update_slice_mword_inc : forall 'a 'b. mword 'a -> integer -> integer -> mword 'b -> mword 'a*)letupdate_slice_mword_incwijw':Lem.mword=(lettop=(Nat_big_num.sub(Nat_big_num.of_int(Lem.word_lengthw))((Nat_big_num.of_int1)))inupdate_slice_mword_decw(Nat_big_num.subtopi)(Nat_big_num.subtopj)w')(*val update_slice_mword : forall 'a 'b. bool -> mword 'a -> integer -> integer -> mword 'b -> mword 'a*)letupdate_slice_mwordis_incwijw':Lem.mword=(ifis_incthenupdate_slice_mword_incwijw'elseupdate_slice_mword_decwijw')(*val access_mword_dec : forall 'a. mword 'a -> integer -> bitU*)letaccess_mword_decwn:bitU=(bitU_of_bool(Lem.word_getBitw(nat_of_intn)))(*val access_mword_inc : forall 'a. mword 'a -> integer -> bitU*)letaccess_mword_incwn:bitU=(lettop=(Nat_big_num.sub(Nat_big_num.of_int(Lem.word_lengthw))((Nat_big_num.of_int1)))inaccess_mword_decw(Nat_big_num.subtopn))(*val access_mword : forall 'a. bool -> mword 'a -> integer -> bitU*)letaccess_mwordis_incwn:bitU=(ifis_incthenaccess_mword_incwnelseaccess_mword_decwn)(*val update_mword_bool_dec : forall 'a. mword 'a -> integer -> bool -> mword 'a*)letupdate_mword_bool_decwnb:Lem.mword=(Lem.word_setBitw(nat_of_intn)b)letupdate_mword_decwnb:(Lem.mword)option=(Lem.option_map(update_mword_bool_decwn)(bool_of_bitUb))(*val update_mword_bool_inc : forall 'a. mword 'a -> integer -> bool -> mword 'a*)letupdate_mword_bool_incwnb:Lem.mword=(lettop=(Nat_big_num.sub(Nat_big_num.of_int(Lem.word_lengthw))((Nat_big_num.of_int1)))inupdate_mword_bool_decw(Nat_big_num.subtopn)b)letupdate_mword_incwnb:(Lem.mword)option=(Lem.option_map(update_mword_bool_incwn)(bool_of_bitUb))(*val int_of_mword : forall 'a. bool -> mword 'a -> integer*)letint_of_mwordsignw:Nat_big_num.num=(ifsignthenLem.signedIntegerFromWordwelseLem.naturalFromWordw)(* Translating between a type level number (itself 'n) and an integer *)letsize_itself_intdict_Machine_word_Size_ax:Nat_big_num.num=(Nat_big_num.of_int(size_itselfdict_Machine_word_Size_ax))(* NB: the corresponding sail type is forall 'n. atom('n) -> itself('n),
the actual integer is ignored. *)(*val make_the_value : forall 'n. integer -> itself 'n*)letmake_the_value_:unit=()(*** Bitvectors *)type'abitvector_class={bits_of_method:'a->bitUlist;(* We allow of_bits to be partial, as not all bitvector representations
support undefined bits *)of_bits_method:bitUlist->'aoption;of_bools_method:boollist->'a;length_method:'a->Nat_big_num.num;(* of_int: the first parameter specifies the desired length of the bitvector *)of_int_method:Nat_big_num.num->Nat_big_num.num->'a;(* Conversion to integers is undefined if any bit is undefined *)unsigned_method:'a->Nat_big_num.numoption;signed_method:'a->Nat_big_num.numoption;(* Lifting of integer operations to bitvectors: The boolean flag indicates
whether to treat the bitvectors as signed (true) or not (false). *)arith_op_bv_method:(Nat_big_num.num->Nat_big_num.num->Nat_big_num.num)->bool->'a->'a->'a}(*val of_bits_failwith : forall 'a. Bitvector 'a => list bitU -> 'a*)letof_bits_failwithdict_Sail2_values_Bitvector_abits:'a=(maybe_failwith(dict_Sail2_values_Bitvector_a.of_bits_methodbits))letint_of_bvdict_Sail2_values_Bitvector_asign:'a->(Nat_big_num.num)option=(ifsignthendict_Sail2_values_Bitvector_a.signed_methodelsedict_Sail2_values_Bitvector_a.unsigned_method)letinstance_Sail2_values_Bitvector_list_dictdict_Sail2_values_BitU_a:('alist)bitvector_class=({bits_of_method=(funv->Lem_list.mapdict_Sail2_values_BitU_a.to_bitU_methodv);of_bits_method=(funv->Some(Lem_list.mapdict_Sail2_values_BitU_a.of_bitU_methodv));of_bools_method=(funv->Lem_list.mapdict_Sail2_values_BitU_a.of_bitU_method(Lem_list.mapbitU_of_boolv));length_method=(funxs->Nat_big_num.of_int(List.lengthxs));of_int_method=(funlenn->Lem_list.mapdict_Sail2_values_BitU_a.of_bitU_method(bits_of_intlenn));unsigned_method=(funv->unsigned_of_bits(Lem_list.mapdict_Sail2_values_BitU_a.to_bitU_methodv));signed_method=(funv->signed_of_bits(Lem_list.mapdict_Sail2_values_BitU_a.to_bitU_methodv));arith_op_bv_method=(funopsignlr->Lem_list.mapdict_Sail2_values_BitU_a.of_bitU_method(arith_op_bitsopsign(Lem_list.mapdict_Sail2_values_BitU_a.to_bitU_methodl)(Lem_list.mapdict_Sail2_values_BitU_a.to_bitU_methodr)))})letinstance_Sail2_values_Bitvector_Machine_word_mword_dictdict_Machine_word_Size_a:(Lem.mword)bitvector_class=({bits_of_method=(funv->Lem_list.mapbitU_of_bool(Lem.bitlistFromWordv));of_bits_method=(funv->Lem.option_mapLem.wordFromBitlist(just_list(Lem_list.mapbool_of_bitUv)));of_bools_method=(funv->Lem.wordFromBitlistv);length_method=(funv->Nat_big_num.of_int(Lem.word_lengthv));of_int_method=(fun_n->wordFromIntegerdict_Machine_word_Size_an);unsigned_method=(funv->Some(Lem.naturalFromWordv));signed_method=(funv->Some(Lem.signedIntegerFromWordv));arith_op_bv_method=(funopsignlr->wordFromIntegerdict_Machine_word_Size_a(op(int_of_mwordsignl)(int_of_mwordsignr)))})letaccess_bv_incdict_Sail2_values_Bitvector_avn:bitU=(access_listtrue(dict_Sail2_values_Bitvector_a.bits_of_methodv)n)letaccess_bv_decdict_Sail2_values_Bitvector_avn:bitU=(access_listfalse(dict_Sail2_values_Bitvector_a.bits_of_methodv)n)letupdate_bv_incdict_Sail2_values_Bitvector_avnb:(bitU)list=(update_listtrue(dict_Sail2_values_Bitvector_a.bits_of_methodv)nb)letupdate_bv_decdict_Sail2_values_Bitvector_avnb:(bitU)list=(update_listfalse(dict_Sail2_values_Bitvector_a.bits_of_methodv)nb)letsubrange_bv_incdict_Sail2_values_Bitvector_avij:(bitU)list=(subrange_listtrue(dict_Sail2_values_Bitvector_a.bits_of_methodv)ij)letsubrange_bv_decdict_Sail2_values_Bitvector_avij:(bitU)list=(subrange_listfalse(dict_Sail2_values_Bitvector_a.bits_of_methodv)ij)letupdate_subrange_bv_incdict_Sail2_values_Bitvector_adict_Sail2_values_Bitvector_bvijv':(bitU)list=(update_subrange_listtrue(dict_Sail2_values_Bitvector_b.bits_of_methodv)ij(dict_Sail2_values_Bitvector_a.bits_of_methodv'))letupdate_subrange_bv_decdict_Sail2_values_Bitvector_adict_Sail2_values_Bitvector_bvijv':(bitU)list=(update_subrange_listfalse(dict_Sail2_values_Bitvector_b.bits_of_methodv)ij(dict_Sail2_values_Bitvector_a.bits_of_methodv'))(*val extz_bv : forall 'a. Bitvector 'a => integer -> 'a -> list bitU*)letextz_bvdict_Sail2_values_Bitvector_anv:(bitU)list=(extz_bitsn(dict_Sail2_values_Bitvector_a.bits_of_methodv))(*val exts_bv : forall 'a. Bitvector 'a => integer -> 'a -> list bitU*)letexts_bvdict_Sail2_values_Bitvector_anv:(bitU)list=(exts_bitsn(dict_Sail2_values_Bitvector_a.bits_of_methodv))(*val nat_of_bv : forall 'a. Bitvector 'a => 'a -> maybe nat*)letnat_of_bvdict_Sail2_values_Bitvector_av:(int)option=(Lem.option_mapnat_of_int(dict_Sail2_values_Bitvector_a.unsigned_methodv))(*val string_of_bv : forall 'a. Bitvector 'a => 'a -> string*)letstring_of_bvdict_Sail2_values_Bitvector_av:string=(show_bitlist(dict_Sail2_values_Bitvector_a.bits_of_methodv))(*val string_of_bv_subrange : forall 'a. Bitvector 'a => 'a -> integer -> integer -> string*)letstring_of_bv_subrangedict_Sail2_values_Bitvector_avij:string=(show_bitlist(subrange_bv_dec(instance_Sail2_values_Bitvector_list_dictinstance_Sail2_values_BitU_Sail2_values_bitU_dict)(dict_Sail2_values_Bitvector_a.bits_of_methodv)ij))(*val print_bits : forall 'a. Bitvector 'a => string -> 'a -> unit*)letprint_bitsdict_Sail2_values_Bitvector_astrv:unit=(print_endline(str^string_of_bvdict_Sail2_values_Bitvector_av))(*val prerr_bits : forall 'a. Bitvector 'a => string -> 'a -> unit*)letprerr_bitsdict_Sail2_values_Bitvector_astrv:unit=(prerr_endline(str^string_of_bvdict_Sail2_values_Bitvector_av))(*val dec_str : integer -> string*)letdec_strbv:string=(Nat_big_num.to_stringbv)(*val concat_str : string -> string -> string*)letconcat_strstr1str2:string=(str1^str2)(*val int_of_bit : bitU -> integer*)letint_of_bitb:Nat_big_num.num=((matchbwith|B0->(Nat_big_num.of_int0)|B1->(Nat_big_num.of_int1)|_->failwith"int_of_bit saw unknown"))(*val count_leading_zero_bits : list bitU -> integer*)letreccount_leading_zero_bitsv:Nat_big_num.num=((matchvwith|B0::v'->Nat_big_num.add(count_leading_zero_bitsv')((Nat_big_num.of_int1))|_->(Nat_big_num.of_int0)))(*val count_leading_zeros_bv : forall 'a. Bitvector 'a => 'a -> integer*)letcount_leading_zeros_bvdict_Sail2_values_Bitvector_av:Nat_big_num.num=(count_leading_zero_bits(dict_Sail2_values_Bitvector_a.bits_of_methodv))(*val decimal_string_of_bv : forall 'a. Bitvector 'a => 'a -> string*)letdecimal_string_of_bvdict_Sail2_values_Bitvector_abv:string=(letplace_values=(Lem_list.mapi(funib->Nat_big_num.mul(int_of_bitb)(Nat_big_num.pow_int((Nat_big_num.of_int2))i))(List.rev(dict_Sail2_values_Bitvector_a.bits_of_methodbv)))inletsum=(List.fold_leftNat_big_num.add((Nat_big_num.of_int0))place_values)inNat_big_num.to_stringsum)(*val align_bits : forall 'a. Bitvector 'a => 'a -> integer -> 'a*)letalign_bitsdict_Sail2_values_Bitvector_axy:'a=(letlen=(dict_Sail2_values_Bitvector_a.length_methodx)in(matchdict_Sail2_values_Bitvector_a.unsigned_methodxwith|Somex->dict_Sail2_values_Bitvector_a.of_int_methodlen(align_intxy)|None->failwith"align_bits: failed to convert bitvector"))(*** Bytes and addresses *)typememory_byte=bitUlist(*val byte_chunks : forall 'a. list 'a -> maybe (list (list 'a))*)letrecbyte_chunksbs:(('alist)list)option=((matchbswith|[]->Some[]|a::b::c::d::e::f::g::h::rest->Lem.option_bind(byte_chunksrest)(funrest->Some([a;b;c;d;e;f;g;h]::rest))|_->None))(*val bytes_of_bits : forall 'a. Bitvector 'a => 'a -> maybe (list memory_byte)*)letbytes_of_bitsdict_Sail2_values_Bitvector_abs:(((bitU)list)list)option=(byte_chunks(dict_Sail2_values_Bitvector_a.bits_of_methodbs))(*val bits_of_bytes : list memory_byte -> list bitU*)letbits_of_bytesbs:(bitU)list=(List.concat(Lem_list.map(funv->Lem_list.map(funb->b)v)bs))letmem_bytes_of_bitsdict_Sail2_values_Bitvector_abs:(((bitU)list)list)option=(Lem.option_mapList.rev(bytes_of_bitsdict_Sail2_values_Bitvector_abs))letbits_of_mem_bytesbs:(bitU)list=(bits_of_bytes(List.revbs))(*val bitv_of_byte_lifteds : list Sail_impl_base.byte_lifted -> list bitU
let bitv_of_byte_lifteds v =
foldl (fun x (Byte_lifted y) -> x ++ (List.map bitU_of_bit_lifted y)) [] v
val bitv_of_bytes : list Sail_impl_base.byte -> list bitU
let bitv_of_bytes v =
foldl (fun x (Byte y) -> x ++ (List.map bitU_of_bit y)) [] v
val byte_lifteds_of_bitv : list bitU -> list byte_lifted
let byte_lifteds_of_bitv bits =
let bits = List.map bit_lifted_of_bitU bits in
byte_lifteds_of_bit_lifteds bits
val bytes_of_bitv : list bitU -> list byte
let bytes_of_bitv bits =
let bits = List.map bit_of_bitU bits in
bytes_of_bits bits
val bit_lifteds_of_bitUs : list bitU -> list bit_lifted
let bit_lifteds_of_bitUs bits = List.map bit_lifted_of_bitU bits
val bit_lifteds_of_bitv : list bitU -> list bit_lifted
let bit_lifteds_of_bitv v = bit_lifteds_of_bitUs v
val address_lifted_of_bitv : list bitU -> address_lifted
let address_lifted_of_bitv v =
let byte_lifteds = byte_lifteds_of_bitv v in
let maybe_address_integer =
match (maybe_all (List.map byte_of_byte_lifted byte_lifteds)) with
| Just bs -> Just (integer_of_byte_list bs)
| _ -> Nothing
end in
Address_lifted byte_lifteds maybe_address_integer
val bitv_of_address_lifted : address_lifted -> list bitU
let bitv_of_address_lifted (Address_lifted bs _) = bitv_of_byte_lifteds bs
val address_of_bitv : list bitU -> address
let address_of_bitv v =
let bytes = bytes_of_bitv v in
address_of_byte_list bytes*)letrecreverse_endianness_listbits:'alist=(ifList.lengthbits<=8thenbitselseList.rev_append(List.rev(reverse_endianness_list(drop_list((Nat_big_num.of_int8))bits)))(take_list((Nat_big_num.of_int8))bits))(*** Registers *)(*type register_field = string
type register_field_index = string * (integer * integer) (* name, start and end *)
type register =
| Register of string * (* name *)
integer * (* length *)
integer * (* start index *)
bool * (* is increasing *)
list register_field_index
| UndefinedRegister of integer (* length *)
| RegisterPair of register * register*)type'rvregister_Value_class={bool_of_regval_method:'rv->booloption;regval_of_bool_method:bool->'rv;int_of_regval_method:'rv->Nat_big_num.numoption;regval_of_int_method:Nat_big_num.num->'rv;real_of_regval_method:'rv->floatoption;regval_of_real_method:float->'rv;string_of_regval_method:'rv->stringoption;regval_of_string_method:string->'rv}type('regstate,'regval,'a)register_ref={name:string;(*is_inc : bool;*)read_from:'regstate->'a;write_to:'a->'regstate->'regstate;of_regval:'regval->'aoption;regval_of:'a->'regval}(* Register operations which do not depend on polymorphic type *)type('regstate,'regval)register_ops=(('regval->bool)*('regstate->'regval)*('regval->'regstate->'regstateoption))(*val register_ops_of : forall 'st 'regval 'a.
register_ref 'st 'regval 'a -> register_ops 'st 'regval*)letregister_ops_ofreg:('regval->bool)*('st->'regval)*('regval->'st->'stoption)=((funx->Lem.is_some(reg.of_regvalx)),(funx->reg.regval_of(reg.read_fromx)),(funxst->Lem.option_map(funv->reg.write_tovst)(reg.of_regvalx)))(* Register accessors: pair of functions for reading and writing register values *)type('regstate,'regval)register_accessors=((string->'regstate->'regvaloption)*(string->'regval->'regstate->'regstateoption))(*val mk_accessors : forall 'st 'v.
(string -> maybe (register_ops 'st 'v)) -> register_accessors 'st 'v*)letmk_accessorsregs:(string->'st->'voption)*(string->'v->'st->'stoption)=((funnmst->Lem.option_map(fun(_,acc,_)->accst)(regsnm)),(funnmvst->Lem.option_bind(regsnm)(fun(_,_,put)->putvst)))type('regtype,'a)field_ref={field_name:string;field_start:Nat_big_num.num;field_is_inc:bool;get_field:'regtype->'a;set_field:'regtype->'a->'regtype}(*let name_of_reg = function
| Register name _ _ _ _ -> name
| UndefinedRegister _ -> failwith "name_of_reg UndefinedRegister"
| RegisterPair _ _ -> failwith "name_of_reg RegisterPair"
end
let size_of_reg = function
| Register _ size _ _ _ -> size
| UndefinedRegister size -> size
| RegisterPair _ _ -> failwith "size_of_reg RegisterPair"
end
let start_of_reg = function
| Register _ _ start _ _ -> start
| UndefinedRegister _ -> failwith "start_of_reg UndefinedRegister"
| RegisterPair _ _ -> failwith "start_of_reg RegisterPair"
end
let is_inc_of_reg = function
| Register _ _ _ is_inc _ -> is_inc
| UndefinedRegister _ -> failwith "is_inc_of_reg UndefinedRegister"
| RegisterPair _ _ -> failwith "in_inc_of_reg RegisterPair"
end
let dir_of_reg = function
| Register _ _ _ is_inc _ -> dir_of_bool is_inc
| UndefinedRegister _ -> failwith "dir_of_reg UndefinedRegister"
| RegisterPair _ _ -> failwith "dir_of_reg RegisterPair"
end
let size_of_reg_nat reg = natFromInteger (size_of_reg reg)
let start_of_reg_nat reg = natFromInteger (start_of_reg reg)
val register_field_indices_aux : register -> register_field -> maybe (integer * integer)
let rec register_field_indices_aux register rfield =
match register with
| Register _ _ _ _ rfields -> List.lookup rfield rfields
| RegisterPair r1 r2 ->
let m_indices = register_field_indices_aux r1 rfield in
if isJust m_indices then m_indices else register_field_indices_aux r2 rfield
| UndefinedRegister _ -> Nothing
end
val register_field_indices : register -> register_field -> integer * integer
let register_field_indices register rfield =
match register_field_indices_aux register rfield with
| Just indices -> indices
| Nothing -> failwith "Invalid register/register-field combination"
end
let register_field_indices_nat reg regfield=
let (i,j) = register_field_indices reg regfield in
(natFromInteger i,natFromInteger j)*)(*let rec external_reg_value reg_name v =
let (internal_start, external_start, direction) =
match reg_name with
| Reg _ start size dir ->
(start, (if dir = D_increasing then start else (start - (size +1))), dir)
| Reg_slice _ reg_start dir (slice_start, _) ->
((if dir = D_increasing then slice_start else (reg_start - slice_start)),
slice_start, dir)
| Reg_field _ reg_start dir _ (slice_start, _) ->
((if dir = D_increasing then slice_start else (reg_start - slice_start)),
slice_start, dir)
| Reg_f_slice _ reg_start dir _ _ (slice_start, _) ->
((if dir = D_increasing then slice_start else (reg_start - slice_start)),
slice_start, dir)
end in
let bits = bit_lifteds_of_bitv v in
<| rv_bits = bits;
rv_dir = direction;
rv_start = external_start;
rv_start_internal = internal_start |>
val internal_reg_value : register_value -> list bitU
let internal_reg_value v =
List.map bitU_of_bit_lifted v.rv_bits
(*(integerFromNat v.rv_start_internal)
(v.rv_dir = D_increasing)*)
let external_slice (d:direction) (start:nat) ((i,j):(nat*nat)) =
match d with
(* This is the case the thread/concurrency model expects, so no change needed *)
| D_increasing -> (i,j)
| D_decreasing -> let slice_i = start - i in
let slice_j = (i - j) + slice_i in
(slice_i,slice_j)
end *)(* TODO
let external_reg_whole r =
Reg (r.name) (natFromInteger r.start) (natFromInteger r.size) (dir_of_bool r.is_inc)
let external_reg_slice r (i,j) =
let start = natFromInteger r.start in
let dir = dir_of_bool r.is_inc in
Reg_slice (r.name) start dir (external_slice dir start (i,j))
let external_reg_field_whole reg rfield =
let (m,n) = register_field_indices_nat reg rfield in
let start = start_of_reg_nat reg in
let dir = dir_of_reg reg in
Reg_field (name_of_reg reg) start dir rfield (external_slice dir start (m,n))
let external_reg_field_slice reg rfield (i,j) =
let (m,n) = register_field_indices_nat reg rfield in
let start = start_of_reg_nat reg in
let dir = dir_of_reg reg in
Reg_f_slice (name_of_reg reg) start dir rfield
(external_slice dir start (m,n))
(external_slice dir start (i,j))*)(*val external_mem_value : list bitU -> memory_value
let external_mem_value v =
byte_lifteds_of_bitv v $> List.reverse
val internal_mem_value : memory_value -> list bitU
let internal_mem_value bytes =
List.reverse bytes $> bitv_of_byte_lifteds*)(*val foreach : forall 'a 'vars.
(list 'a) -> 'vars -> ('a -> 'vars -> 'vars) -> 'vars*)letrecforeachlvarsbody:'vars=((matchlwith|[]->vars|(x::xs)->foreachxs(bodyxvars)body))(*val index_list : integer -> integer -> integer -> list integer*)letrecindex_listfromto1step:(Nat_big_num.num)list=(if(Nat_big_num.greaterstep((Nat_big_num.of_int0))&&Nat_big_num.less_equalfromto1)||(Nat_big_num.lessstep((Nat_big_num.of_int0))&&Nat_big_num.less_equalto1from)thenfrom::index_list(Nat_big_num.addfromstep)to1stepelse[])(*val while : forall 'vars. 'vars -> ('vars -> bool) -> ('vars -> 'vars) -> 'vars*)letrecwhile0varscondbody:'vars=(ifcondvarsthenwhile0(bodyvars)condbodyelsevars)(*val until : forall 'vars. 'vars -> ('vars -> bool) -> ('vars -> 'vars) -> 'vars*)letrecuntilvarscondbody:'vars=(letvars=(bodyvars)inifcondvarsthenvarselseuntil(bodyvars)condbody)(* convert numbers unsafely to naturals *)type'atoNatural_class={toNatural_method:'a->Nat_big_num.num}(* eta-expanded for Isabelle output, otherwise it breaks *)letinstance_Sail2_values_ToNatural_Num_integer_dict:(Nat_big_num.num)toNatural_class=({toNatural_method=(funn->Nat_big_num.absn)})letinstance_Sail2_values_ToNatural_Num_int_dict:(int)toNatural_class=({toNatural_method=(funn->Nat_big_num.of_int(absn))})letinstance_Sail2_values_ToNatural_nat_dict:(int)toNatural_class=({toNatural_method=(funn->Nat_big_num.of_intn)})letinstance_Sail2_values_ToNatural_Num_natural_dict:(Nat_big_num.num)toNatural_class=({toNatural_method=(funn->n)})lettoNaturalFiveTupdict_Sail2_values_ToNatural_adict_Sail2_values_ToNatural_bdict_Sail2_values_ToNatural_cdict_Sail2_values_ToNatural_ddict_Sail2_values_ToNatural_e(n1,n2,n3,n4,n5):Nat_big_num.num*Nat_big_num.num*Nat_big_num.num*Nat_big_num.num*Nat_big_num.num=(dict_Sail2_values_ToNatural_d.toNatural_methodn1,dict_Sail2_values_ToNatural_c.toNatural_methodn2,dict_Sail2_values_ToNatural_b.toNatural_methodn3,dict_Sail2_values_ToNatural_a.toNatural_methodn4,dict_Sail2_values_ToNatural_e.toNatural_methodn5)(* Let the following types be generated by Sail per spec, using either bitlists
or machine words as bitvector representation *)(*type regfp =
| RFull of (string)
| RSlice of (string * integer * integer)
| RSliceBit of (string * integer)
| RField of (string * string)
type niafp =
| NIAFP_successor
| NIAFP_concrete_address of vector bitU
| NIAFP_indirect_address
(* only for MIPS *)
type diafp =
| DIAFP_none
| DIAFP_concrete of vector bitU
| DIAFP_reg of regfp
let regfp_to_reg (reg_info : string -> maybe string -> (nat * nat * direction * (nat * nat))) = function
| RFull name ->
let (start,length,direction,_) = reg_info name Nothing in
Reg name start length direction
| RSlice (name,i,j) ->
let i = natFromInteger i in
let j = natFromInteger j in
let (start,length,direction,_) = reg_info name Nothing in
let slice = external_slice direction start (i,j) in
Reg_slice name start direction slice
| RSliceBit (name,i) ->
let i = natFromInteger i in
let (start,length,direction,_) = reg_info name Nothing in
let slice = external_slice direction start (i,i) in
Reg_slice name start direction slice
| RField (name,field_name) ->
let (start,length,direction,span) = reg_info name (Just field_name) in
let slice = external_slice direction start span in
Reg_field name start direction field_name slice
end
let niafp_to_nia reginfo = function
| NIAFP_successor -> NIA_successor
| NIAFP_concrete_address v -> NIA_concrete_address (address_of_bitv v)
| NIAFP_indirect_address -> NIA_indirect_address
end
let diafp_to_dia reginfo = function
| DIAFP_none -> DIA_none
| DIAFP_concrete v -> DIA_concrete_address (address_of_bitv v)
| DIAFP_reg r -> DIA_register (regfp_to_reg reginfo r)
end
*)