diff options
Diffstat (limited to 'snapshots/isabelle/riscv/Riscv.thy')
| -rw-r--r-- | snapshots/isabelle/riscv/Riscv.thy | 7876 |
1 files changed, 7876 insertions, 0 deletions
diff --git a/snapshots/isabelle/riscv/Riscv.thy b/snapshots/isabelle/riscv/Riscv.thy new file mode 100644 index 00000000..71873cec --- /dev/null +++ b/snapshots/isabelle/riscv/Riscv.thy @@ -0,0 +1,7876 @@ +chapter \<open>Generated by Lem from riscv.lem.\<close> + +theory "Riscv" + +imports + Main + "Lem_pervasives_extra" + "Sail_instr_kinds" + "Sail_values" + "Sail_operators_mwords" + "Prompt_monad" + "Prompt" + "State" + "Riscv_types" + "Riscv_extras" + +begin + +(*Generated by Sail from riscv.*) +(*open import Pervasives_extra*) +(*open import Sail_instr_kinds*) +(*open import Sail_values*) +(*open import Sail_operators_mwords*) +(*open import Prompt_monad*) +(*open import Prompt*) +(*open import State*) +(*open import Riscv_types*) +(*open import Riscv_extras*) + + + + + + + + + +(*val builtin_and_vec : forall 'n. bits 'n -> bits 'n -> bits 'n*) + + + +(*val builtin_or_vec : forall 'n. bits 'n -> bits 'n -> bits 'n*) + + + +(*val __raw_SetSlice_int : forall 'w. integer -> ii -> ii -> bits 'w -> ii*) + +(*val __GetSlice_int : forall 'n. Size 'n => integer -> ii -> ii -> mword 'n*) + +definition GetSlice_int :: " int \<Rightarrow> int \<Rightarrow> int \<Rightarrow>('n::len)Word.word " where + " GetSlice_int n m o1 = ( (get_slice_int0 n m o1 :: ( 'n::len)Word.word))" + + +(*val __raw_SetSlice_bits : forall 'n 'w. integer -> integer -> bits 'n -> ii -> bits 'w -> bits 'n*) + +(*val __raw_GetSlice_bits : forall 'n 'w. integer -> integer -> bits 'n -> ii -> bits 'w*) + +(*val cast_unit_vec : bitU -> mword ty1*) + +fun cast_unit_vec0 :: " bitU \<Rightarrow>(1)Word.word " where + " cast_unit_vec0 B0 = ( (vec_of_bits [B0] :: 1 Word.word))" +|" cast_unit_vec0 B1 = ( (vec_of_bits [B1] :: 1 Word.word))" + + +(*val DecStr : ii -> string*) + +(*val HexStr : ii -> string*) + +(*val __RISCV_write : forall 'int8_times_n. Size 'int8_times_n => mword ty64 -> integer -> mword 'int8_times_n -> M bool*) + +definition RISCV_write :: "(64)Word.word \<Rightarrow> int \<Rightarrow>('int8_times_n::len)Word.word \<Rightarrow>((register_value),(bool),(exception))monad " where + " RISCV_write addr width data = ( + write_ram (( 64 :: int)::ii) width + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word) addr data \<then> + return True )" + + +(*val __TraceMemoryWrite : forall 'int8_times_n 'm. integer -> bits 'm -> bits 'int8_times_n -> unit*) + +(*val __RISCV_read : forall 'int8_times_n. Size 'int8_times_n => mword ty64 -> integer -> M (maybe (mword 'int8_times_n))*) + +definition RISCV_read :: "(64)Word.word \<Rightarrow> int \<Rightarrow>((register_value),((('int8_times_n::len)Word.word)option),(exception))monad " where + " RISCV_read addr width = ( + (read_ram (( 64 :: int)::ii) width + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word) addr + :: (( 'int8_times_n::len)Word.word) M) \<bind> (\<lambda> (w__0 :: ( 'int8_times_n::len)Word.word) . + return (Some w__0)))" + + +(*val __TraceMemoryRead : forall 'int8_times_n 'm. integer -> bits 'm -> bits 'int8_times_n -> unit*) + +(*val ex_nat : ii -> integer*) + +definition ex_nat :: " int \<Rightarrow> int " where + " ex_nat n = ( n )" + + +(*val ex_int : ii -> integer*) + +definition ex_int :: " int \<Rightarrow> int " where + " ex_int n = ( n )" + + +(*val coerce_int_nat : ii -> M ii*) + +definition coerce_int_nat :: " int \<Rightarrow>((register_value),(int),(exception))monad " where + " coerce_int_nat x = ( assert_exp True ('''') \<then> return x )" + + +(*val EXTS : forall 'n 'm . Size 'm, Size 'n => integer -> mword 'n -> mword 'm*) + +(*val EXTZ : forall 'n 'm . Size 'm, Size 'n => integer -> mword 'n -> mword 'm*) + +definition EXTS :: " int \<Rightarrow>('n::len)Word.word \<Rightarrow>('m::len)Word.word " where + " EXTS (m__tv :: int) v = ( (sign_extend v m__tv :: ( 'm::len)Word.word))" + + +definition EXTZ :: " int \<Rightarrow>('n::len)Word.word \<Rightarrow>('m::len)Word.word " where + " EXTZ (m__tv :: int) v = ( (zero_extend v m__tv :: ( 'm::len)Word.word))" + + +(*val zopz0zI_s : forall 'n. Size 'n => mword 'n -> mword 'n -> bool*) + +(*val zopz0zKzJ_s : forall 'n. Size 'n => mword 'n -> mword 'n -> bool*) + +(*val zopz0zI_u : forall 'n. Size 'n => mword 'n -> mword 'n -> bool*) + +(*val zopz0zKzJ_u : forall 'n. Size 'n => mword 'n -> mword 'n -> bool*) + +(*val zopz0zIzJ_u : forall 'n. Size 'n => mword 'n -> mword 'n -> bool*) + +definition zopz0zI_s :: "('n::len)Word.word \<Rightarrow>('n::len)Word.word \<Rightarrow> bool " where + " zopz0zI_s x y = ( ((Word.sint x)) < ((Word.sint y)))" + + +definition zopz0zKzJ_s :: "('n::len)Word.word \<Rightarrow>('n::len)Word.word \<Rightarrow> bool " where + " zopz0zKzJ_s x y = ( ((Word.sint x)) \<ge> ((Word.sint y)))" + + +definition zopz0zI_u :: "('n::len)Word.word \<Rightarrow>('n::len)Word.word \<Rightarrow> bool " where + " zopz0zI_u x y = ( ((Word.uint x)) < ((Word.uint y)))" + + +definition zopz0zKzJ_u :: "('n::len)Word.word \<Rightarrow>('n::len)Word.word \<Rightarrow> bool " where + " zopz0zKzJ_u x y = ( ((Word.uint x)) \<ge> ((Word.uint y)))" + + +definition zopz0zIzJ_u :: "('n::len)Word.word \<Rightarrow>('n::len)Word.word \<Rightarrow> bool " where + " zopz0zIzJ_u x y = ( ((Word.uint x)) \<le> ((Word.uint y)))" + + +(*val bool_to_bits : bool -> mword ty1*) + +definition bool_to_bits :: " bool \<Rightarrow>(1)Word.word " where + " bool_to_bits x = ( if x then (vec_of_bits [B1] :: 1 Word.word) else (vec_of_bits [B0] :: 1 Word.word))" + + +(*val bit_to_bool : bitU -> bool*) + +fun bit_to_bool :: " bitU \<Rightarrow> bool " where + " bit_to_bool B1 = ( True )" +|" bit_to_bool B0 = ( False )" + + +(*val vector64 : ii -> mword ty64*) + +definition vector64 :: " int \<Rightarrow>(64)Word.word " where + " vector64 n = ( (get_slice_int0 (( 64 :: int)::ii) n (( 0 :: int)::ii) :: 64 Word.word))" + + +(*val to_bits : forall 'l. Size 'l => integer -> ii -> mword 'l*) + +definition to_bits :: " int \<Rightarrow> int \<Rightarrow>('l::len)Word.word " where + " to_bits l n = ( (get_slice_int0 l n (( 0 :: int)::ii) :: ( 'l::len)Word.word))" + + +(*val shift_right_arith64 : mword ty64 -> mword ty6 -> mword ty64*) + +definition shift_right_arith64 :: "(64)Word.word \<Rightarrow>(6)Word.word \<Rightarrow>(64)Word.word " where + " shift_right_arith64 (v :: 64 bits) (shift :: 6 bits) = ( + (let (v128 :: 128 bits) = ((EXTS (( 128 :: int)::ii) v :: 128 Word.word)) in + (subrange_vec_dec ((shift_bits_right v128 shift :: 128 Word.word)) (( 63 :: int)::ii) (( 0 :: int)::ii) :: 64 Word.word)))" + + +(*val shift_right_arith32 : mword ty32 -> mword ty5 -> mword ty32*) + +definition shift_right_arith32 :: "(32)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(32)Word.word " where + " shift_right_arith32 (v :: 32 bits) (shift :: 5 bits) = ( + (let (v64 :: 64 bits) = ((EXTS (( 64 :: int)::ii) v :: 64 Word.word)) in + (subrange_vec_dec ((shift_bits_right v64 shift :: 64 Word.word)) (( 31 :: int)::ii) (( 0 :: int)::ii) :: 32 Word.word)))" + + +definition xlen :: " int " where + " xlen = ( (( 64 :: int)::ii))" + + +definition xlen_max_unsigned :: " int " where + " xlen_max_unsigned = ( ((pow2 xlen)) - (( 1 :: int)::ii))" + + +definition xlen_max_signed :: " int " where + " xlen_max_signed = ( ((pow2 ((xlen - (( 1 :: int)::ii))))) - (( 1 :: int)::ii))" + + +definition xlen_min_signed :: " int " where + " xlen_min_signed = ( (( 0 :: int)::ii) - ((pow2 ((xlen - (( 1 :: int)::ii))))))" + + +(*val regbits_to_regno : mword ty5 -> integer*) + +definition regbits_to_regno :: "(5)Word.word \<Rightarrow> int " where + " regbits_to_regno b = ( + (let r = (Word.uint b) in + r))" + + +(*val creg2reg_bits : mword ty3 -> mword ty5*) + +definition creg2reg_bits :: "(3)Word.word \<Rightarrow>(5)Word.word " where + " creg2reg_bits creg = ( (concat_vec (vec_of_bits [B0,B1] :: 2 Word.word) creg :: 5 Word.word))" + + +definition zreg :: "(5)Word.word " where + " zreg = ( (vec_of_bits [B0,B0,B0,B0,B0] :: 5 Word.word))" + + +definition ra :: "(5)Word.word " where + " ra = ( (vec_of_bits [B0,B0,B0,B0,B1] :: 5 Word.word))" + + +definition sp :: "(5)Word.word " where + " sp = ( (vec_of_bits [B0,B0,B0,B1,B0] :: 5 Word.word))" + + +(*val rX : integer -> M (mword ty64)*) + +definition rX :: " int \<Rightarrow>((register_value),((64)Word.word),(exception))monad " where + " rX l__81 = ( + if (((l__81 = (( 0 :: int)::ii)))) then + return (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word) + else + read_reg Xs_ref \<bind> (\<lambda> (w__0 :: xlenbits list) . + return ((access_list_dec w__0 l__81 :: 64 Word.word))))" + + +(*val wX : integer -> mword ty64 -> M unit*) + +definition wX :: " int \<Rightarrow>(64)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " wX r v = ( + if (((r \<noteq> (( 0 :: int)::ii)))) then + read_reg Xs_ref \<bind> (\<lambda> (w__0 :: ( 64 Word.word) list) . + write_reg Xs_ref ((update_list_dec w__0 r v :: ( 64 Word.word) list)) \<then> + return ((prerr_endline + (((op@) (''x'') + (((op@) ((stringFromInteger r)) + (((op@) ('' <- '') ((string_of_vec v))))))))))) + else return () )" + + +(*val reg_name_abi : mword ty5 -> string*) + +definition reg_name_abi :: "(5)Word.word \<Rightarrow> string " where + " reg_name_abi r = ( + (let b__0 = r in + if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B0,B0,B0,B0,B0] :: 5 Word.word)))))) then + (''zero'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B0,B0,B0,B0,B1] :: 5 Word.word)))))) then + (''ra'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B0,B0,B0,B1,B0] :: 5 Word.word)))))) then + (''sp'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B0,B0,B0,B1,B1] :: 5 Word.word)))))) then + (''gp'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B0,B0,B1,B0,B0] :: 5 Word.word)))))) then + (''tp'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B0,B0,B1,B0,B1] :: 5 Word.word)))))) then + (''t0'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B0,B0,B1,B1,B0] :: 5 Word.word)))))) then + (''t1'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B0,B0,B1,B1,B1] :: 5 Word.word)))))) then + (''t2'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B0,B1,B0,B0,B0] :: 5 Word.word)))))) then + (''fp'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B0,B1,B0,B0,B1] :: 5 Word.word)))))) then + (''s1'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B0,B1,B0,B1,B0] :: 5 Word.word)))))) then + (''a0'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B0,B1,B0,B1,B1] :: 5 Word.word)))))) then + (''a1'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B0,B1,B1,B0,B0] :: 5 Word.word)))))) then + (''a2'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B0,B1,B1,B0,B1] :: 5 Word.word)))))) then + (''a3'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B0,B1,B1,B1,B0] :: 5 Word.word)))))) then + (''a4'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B0,B1,B1,B1,B1] :: 5 Word.word)))))) then + (''a5'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B1,B0,B0,B0,B0] :: 5 Word.word)))))) then + (''a6'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B1,B0,B0,B0,B1] :: 5 Word.word)))))) then + (''a7'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B1,B0,B0,B1,B0] :: 5 Word.word)))))) then + (''s2'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B1,B0,B0,B1,B1] :: 5 Word.word)))))) then + (''s3'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B1,B0,B1,B0,B0] :: 5 Word.word)))))) then + (''s4'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B1,B0,B1,B0,B1] :: 5 Word.word)))))) then + (''s5'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B1,B0,B1,B1,B0] :: 5 Word.word)))))) then + (''s6'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B1,B0,B1,B1,B1] :: 5 Word.word)))))) then + (''s7'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B1,B1,B0,B0,B0] :: 5 Word.word)))))) then + (''s8'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B1,B1,B0,B0,B1] :: 5 Word.word)))))) then + (''s9'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B1,B1,B0,B1,B0] :: 5 Word.word)))))) then + (''s10'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B1,B1,B0,B1,B1] :: 5 Word.word)))))) then + (''s11'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B1,B1,B1,B0,B0] :: 5 Word.word)))))) then + (''t3'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B1,B1,B1,B0,B1] :: 5 Word.word)))))) then + (''t4'') + else if (((((regbits_to_regno b__0)) = ((regbits_to_regno (vec_of_bits [B1,B1,B1,B1,B0] :: 5 Word.word)))))) then + (''t5'') + else (''t6'')))" + + +(*val Architecture_of_num : integer -> Architecture*) + +definition Architecture_of_num :: " int \<Rightarrow> Architecture " where + " Architecture_of_num arg0 = ( + (let l__79 = arg0 in + if (((l__79 = (( 0 :: int)::ii)))) then RV32 + else if (((l__79 = (( 1 :: int)::ii)))) then RV64 + else RV128))" + + +(*val num_of_Architecture : Architecture -> integer*) + +fun num_of_Architecture :: " Architecture \<Rightarrow> int " where + " num_of_Architecture RV32 = ( (( 0 :: int)::ii))" +|" num_of_Architecture RV64 = ( (( 1 :: int)::ii))" +|" num_of_Architecture RV128 = ( (( 2 :: int)::ii))" + + +(*val architecture : mword ty2 -> maybe Architecture*) + +definition architecture :: "(2)Word.word \<Rightarrow>(Architecture)option " where + " architecture a = ( + (let b__0 = a in + if (((b__0 = (vec_of_bits [B0,B1] :: 2 Word.word)))) then Some RV32 + else if (((b__0 = (vec_of_bits [B1,B0] :: 2 Word.word)))) then Some RV64 + else if (((b__0 = (vec_of_bits [B1,B1] :: 2 Word.word)))) then Some RV128 + else None))" + + +(*val arch_to_bits : Architecture -> mword ty2*) + +fun arch_to_bits :: " Architecture \<Rightarrow>(2)Word.word " where + " arch_to_bits RV32 = ( (vec_of_bits [B0,B1] :: 2 Word.word))" +|" arch_to_bits RV64 = ( (vec_of_bits [B1,B0] :: 2 Word.word))" +|" arch_to_bits RV128 = ( (vec_of_bits [B1,B1] :: 2 Word.word))" + + +(*val Privilege_of_num : integer -> Privilege*) + +definition Privilege_of_num :: " int \<Rightarrow> Privilege " where + " Privilege_of_num arg0 = ( + (let l__77 = arg0 in + if (((l__77 = (( 0 :: int)::ii)))) then User + else if (((l__77 = (( 1 :: int)::ii)))) then Supervisor + else Machine))" + + +(*val num_of_Privilege : Privilege -> integer*) + +fun num_of_Privilege :: " Privilege \<Rightarrow> int " where + " num_of_Privilege User = ( (( 0 :: int)::ii))" +|" num_of_Privilege Supervisor = ( (( 1 :: int)::ii))" +|" num_of_Privilege Machine = ( (( 2 :: int)::ii))" + + +(*val privLevel_to_bits : Privilege -> mword ty2*) + +fun privLevel_to_bits :: " Privilege \<Rightarrow>(2)Word.word " where + " privLevel_to_bits User = ( (vec_of_bits [B0,B0] :: 2 Word.word))" +|" privLevel_to_bits Supervisor = ( (vec_of_bits [B0,B1] :: 2 Word.word))" +|" privLevel_to_bits Machine = ( (vec_of_bits [B1,B1] :: 2 Word.word))" + + +(*val privLevel_of_bits : mword ty2 -> Privilege*) + +definition privLevel_of_bits :: "(2)Word.word \<Rightarrow> Privilege " where + " privLevel_of_bits p = ( + (let b__0 = p in + if (((b__0 = (vec_of_bits [B0,B0] :: 2 Word.word)))) then User + else if (((b__0 = (vec_of_bits [B0,B1] :: 2 Word.word)))) then Supervisor + else Machine))" + + +(*val privLevel_to_str : Privilege -> string*) + +fun privLevel_to_str :: " Privilege \<Rightarrow> string " where + " privLevel_to_str User = ( (''U''))" +|" privLevel_to_str Supervisor = ( (''S''))" +|" privLevel_to_str Machine = ( (''M''))" + + +(*val AccessType_of_num : integer -> AccessType*) + +definition AccessType_of_num :: " int \<Rightarrow> AccessType " where + " AccessType_of_num arg0 = ( + (let l__74 = arg0 in + if (((l__74 = (( 0 :: int)::ii)))) then Read + else if (((l__74 = (( 1 :: int)::ii)))) then Write + else if (((l__74 = (( 2 :: int)::ii)))) then ReadWrite + else Execute))" + + +(*val num_of_AccessType : AccessType -> integer*) + +fun num_of_AccessType :: " AccessType \<Rightarrow> int " where + " num_of_AccessType Read = ( (( 0 :: int)::ii))" +|" num_of_AccessType Write = ( (( 1 :: int)::ii))" +|" num_of_AccessType ReadWrite = ( (( 2 :: int)::ii))" +|" num_of_AccessType Execute = ( (( 3 :: int)::ii))" + + +(*val ReadType_of_num : integer -> ReadType*) + +definition ReadType_of_num :: " int \<Rightarrow> ReadType " where + " ReadType_of_num arg0 = ( + (let l__73 = arg0 in + if (((l__73 = (( 0 :: int)::ii)))) then Instruction + else Data))" + + +(*val num_of_ReadType : ReadType -> integer*) + +fun num_of_ReadType :: " ReadType \<Rightarrow> int " where + " num_of_ReadType Instruction = ( (( 0 :: int)::ii))" +|" num_of_ReadType Data = ( (( 1 :: int)::ii))" + + +(*val ExceptionType_of_num : integer -> ExceptionType*) + +definition ExceptionType_of_num :: " int \<Rightarrow> ExceptionType " where + " ExceptionType_of_num arg0 = ( + (let l__58 = arg0 in + if (((l__58 = (( 0 :: int)::ii)))) then E_Fetch_Addr_Align + else if (((l__58 = (( 1 :: int)::ii)))) then E_Fetch_Access_Fault + else if (((l__58 = (( 2 :: int)::ii)))) then E_Illegal_Instr + else if (((l__58 = (( 3 :: int)::ii)))) then E_Breakpoint + else if (((l__58 = (( 4 :: int)::ii)))) then E_Load_Addr_Align + else if (((l__58 = (( 5 :: int)::ii)))) then E_Load_Access_Fault + else if (((l__58 = (( 6 :: int)::ii)))) then E_SAMO_Addr_Align + else if (((l__58 = (( 7 :: int)::ii)))) then E_SAMO_Access_Fault + else if (((l__58 = (( 8 :: int)::ii)))) then E_U_EnvCall + else if (((l__58 = (( 9 :: int)::ii)))) then E_S_EnvCall + else if (((l__58 = (( 10 :: int)::ii)))) then E_Reserved_10 + else if (((l__58 = (( 11 :: int)::ii)))) then E_M_EnvCall + else if (((l__58 = (( 12 :: int)::ii)))) then E_Fetch_Page_Fault + else if (((l__58 = (( 13 :: int)::ii)))) then E_Load_Page_Fault + else if (((l__58 = (( 14 :: int)::ii)))) then E_Reserved_14 + else E_SAMO_Page_Fault))" + + +(*val num_of_ExceptionType : ExceptionType -> integer*) + +fun num_of_ExceptionType :: " ExceptionType \<Rightarrow> int " where + " num_of_ExceptionType E_Fetch_Addr_Align = ( (( 0 :: int)::ii))" +|" num_of_ExceptionType E_Fetch_Access_Fault = ( (( 1 :: int)::ii))" +|" num_of_ExceptionType E_Illegal_Instr = ( (( 2 :: int)::ii))" +|" num_of_ExceptionType E_Breakpoint = ( (( 3 :: int)::ii))" +|" num_of_ExceptionType E_Load_Addr_Align = ( (( 4 :: int)::ii))" +|" num_of_ExceptionType E_Load_Access_Fault = ( (( 5 :: int)::ii))" +|" num_of_ExceptionType E_SAMO_Addr_Align = ( (( 6 :: int)::ii))" +|" num_of_ExceptionType E_SAMO_Access_Fault = ( (( 7 :: int)::ii))" +|" num_of_ExceptionType E_U_EnvCall = ( (( 8 :: int)::ii))" +|" num_of_ExceptionType E_S_EnvCall = ( (( 9 :: int)::ii))" +|" num_of_ExceptionType E_Reserved_10 = ( (( 10 :: int)::ii))" +|" num_of_ExceptionType E_M_EnvCall = ( (( 11 :: int)::ii))" +|" num_of_ExceptionType E_Fetch_Page_Fault = ( (( 12 :: int)::ii))" +|" num_of_ExceptionType E_Load_Page_Fault = ( (( 13 :: int)::ii))" +|" num_of_ExceptionType E_Reserved_14 = ( (( 14 :: int)::ii))" +|" num_of_ExceptionType E_SAMO_Page_Fault = ( (( 15 :: int)::ii))" + + +(*val exceptionType_to_bits : ExceptionType -> mword ty4*) + +fun exceptionType_to_bits :: " ExceptionType \<Rightarrow>(4)Word.word " where + " exceptionType_to_bits E_Fetch_Addr_Align = ( (vec_of_bits [B0,B0,B0,B0] :: 4 Word.word))" +|" exceptionType_to_bits E_Fetch_Access_Fault = ( (vec_of_bits [B0,B0,B0,B1] :: 4 Word.word))" +|" exceptionType_to_bits E_Illegal_Instr = ( (vec_of_bits [B0,B0,B1,B0] :: 4 Word.word))" +|" exceptionType_to_bits E_Breakpoint = ( (vec_of_bits [B0,B0,B1,B1] :: 4 Word.word))" +|" exceptionType_to_bits E_Load_Addr_Align = ( (vec_of_bits [B0,B1,B0,B0] :: 4 Word.word))" +|" exceptionType_to_bits E_Load_Access_Fault = ( (vec_of_bits [B0,B1,B0,B1] :: 4 Word.word))" +|" exceptionType_to_bits E_SAMO_Addr_Align = ( (vec_of_bits [B0,B1,B1,B0] :: 4 Word.word))" +|" exceptionType_to_bits E_SAMO_Access_Fault = ( (vec_of_bits [B0,B1,B1,B1] :: 4 Word.word))" +|" exceptionType_to_bits E_U_EnvCall = ( (vec_of_bits [B1,B0,B0,B0] :: 4 Word.word))" +|" exceptionType_to_bits E_S_EnvCall = ( (vec_of_bits [B1,B0,B0,B1] :: 4 Word.word))" +|" exceptionType_to_bits E_Reserved_10 = ( (vec_of_bits [B1,B0,B1,B0] :: 4 Word.word))" +|" exceptionType_to_bits E_M_EnvCall = ( (vec_of_bits [B1,B0,B1,B1] :: 4 Word.word))" +|" exceptionType_to_bits E_Fetch_Page_Fault = ( (vec_of_bits [B1,B1,B0,B0] :: 4 Word.word))" +|" exceptionType_to_bits E_Load_Page_Fault = ( (vec_of_bits [B1,B1,B0,B1] :: 4 Word.word))" +|" exceptionType_to_bits E_Reserved_14 = ( (vec_of_bits [B1,B1,B1,B0] :: 4 Word.word))" +|" exceptionType_to_bits E_SAMO_Page_Fault = ( (vec_of_bits [B1,B1,B1,B1] :: 4 Word.word))" + + +(*val exceptionType_to_str : ExceptionType -> string*) + +fun exceptionType_to_str :: " ExceptionType \<Rightarrow> string " where + " exceptionType_to_str E_Fetch_Addr_Align = ( (''fisaligned-fetch''))" +|" exceptionType_to_str E_Fetch_Access_Fault = ( (''fetch-access-fault''))" +|" exceptionType_to_str E_Illegal_Instr = ( (''illegal-instruction''))" +|" exceptionType_to_str E_Breakpoint = ( (''breakpoint''))" +|" exceptionType_to_str E_Load_Addr_Align = ( (''misaligned-load''))" +|" exceptionType_to_str E_Load_Access_Fault = ( (''load-access-fault''))" +|" exceptionType_to_str E_SAMO_Addr_Align = ( (''misaliged-store/amo''))" +|" exceptionType_to_str E_SAMO_Access_Fault = ( (''store/amo-access-fault''))" +|" exceptionType_to_str E_U_EnvCall = ( (''u-call''))" +|" exceptionType_to_str E_S_EnvCall = ( (''s-call''))" +|" exceptionType_to_str E_Reserved_10 = ( (''reserved-0''))" +|" exceptionType_to_str E_M_EnvCall = ( (''m-call''))" +|" exceptionType_to_str E_Fetch_Page_Fault = ( (''fetch-page-fault''))" +|" exceptionType_to_str E_Load_Page_Fault = ( (''load-page-fault''))" +|" exceptionType_to_str E_Reserved_14 = ( (''reserved-1''))" +|" exceptionType_to_str E_SAMO_Page_Fault = ( (''store/amo-page-fault''))" + + +(*val InterruptType_of_num : integer -> InterruptType*) + +definition InterruptType_of_num :: " int \<Rightarrow> InterruptType " where + " InterruptType_of_num arg0 = ( + (let l__50 = arg0 in + if (((l__50 = (( 0 :: int)::ii)))) then I_U_Software + else if (((l__50 = (( 1 :: int)::ii)))) then I_S_Software + else if (((l__50 = (( 2 :: int)::ii)))) then I_M_Software + else if (((l__50 = (( 3 :: int)::ii)))) then I_U_Timer + else if (((l__50 = (( 4 :: int)::ii)))) then I_S_Timer + else if (((l__50 = (( 5 :: int)::ii)))) then I_M_Timer + else if (((l__50 = (( 6 :: int)::ii)))) then I_U_External + else if (((l__50 = (( 7 :: int)::ii)))) then I_S_External + else I_M_External))" + + +(*val num_of_InterruptType : InterruptType -> integer*) + +fun num_of_InterruptType :: " InterruptType \<Rightarrow> int " where + " num_of_InterruptType I_U_Software = ( (( 0 :: int)::ii))" +|" num_of_InterruptType I_S_Software = ( (( 1 :: int)::ii))" +|" num_of_InterruptType I_M_Software = ( (( 2 :: int)::ii))" +|" num_of_InterruptType I_U_Timer = ( (( 3 :: int)::ii))" +|" num_of_InterruptType I_S_Timer = ( (( 4 :: int)::ii))" +|" num_of_InterruptType I_M_Timer = ( (( 5 :: int)::ii))" +|" num_of_InterruptType I_U_External = ( (( 6 :: int)::ii))" +|" num_of_InterruptType I_S_External = ( (( 7 :: int)::ii))" +|" num_of_InterruptType I_M_External = ( (( 8 :: int)::ii))" + + +(*val interruptType_to_bits : InterruptType -> mword ty4*) + +fun interruptType_to_bits :: " InterruptType \<Rightarrow>(4)Word.word " where + " interruptType_to_bits I_U_Software = ( (vec_of_bits [B0,B0,B0,B0] :: 4 Word.word))" +|" interruptType_to_bits I_S_Software = ( (vec_of_bits [B0,B0,B0,B1] :: 4 Word.word))" +|" interruptType_to_bits I_M_Software = ( (vec_of_bits [B0,B0,B1,B1] :: 4 Word.word))" +|" interruptType_to_bits I_U_Timer = ( (vec_of_bits [B0,B1,B0,B0] :: 4 Word.word))" +|" interruptType_to_bits I_S_Timer = ( (vec_of_bits [B0,B1,B0,B1] :: 4 Word.word))" +|" interruptType_to_bits I_M_Timer = ( (vec_of_bits [B0,B1,B1,B1] :: 4 Word.word))" +|" interruptType_to_bits I_U_External = ( (vec_of_bits [B1,B0,B0,B0] :: 4 Word.word))" +|" interruptType_to_bits I_S_External = ( (vec_of_bits [B1,B0,B0,B1] :: 4 Word.word))" +|" interruptType_to_bits I_M_External = ( (vec_of_bits [B1,B0,B1,B1] :: 4 Word.word))" + + +(*val TrapVectorMode_of_num : integer -> TrapVectorMode*) + +definition TrapVectorMode_of_num :: " int \<Rightarrow> TrapVectorMode " where + " TrapVectorMode_of_num arg0 = ( + (let l__48 = arg0 in + if (((l__48 = (( 0 :: int)::ii)))) then TV_Direct + else if (((l__48 = (( 1 :: int)::ii)))) then TV_Vector + else TV_Reserved))" + + +(*val num_of_TrapVectorMode : TrapVectorMode -> integer*) + +fun num_of_TrapVectorMode :: " TrapVectorMode \<Rightarrow> int " where + " num_of_TrapVectorMode TV_Direct = ( (( 0 :: int)::ii))" +|" num_of_TrapVectorMode TV_Vector = ( (( 1 :: int)::ii))" +|" num_of_TrapVectorMode TV_Reserved = ( (( 2 :: int)::ii))" + + +(*val trapVectorMode_of_bits : mword ty2 -> TrapVectorMode*) + +definition trapVectorMode_of_bits :: "(2)Word.word \<Rightarrow> TrapVectorMode " where + " trapVectorMode_of_bits m = ( + (let b__0 = m in + if (((b__0 = (vec_of_bits [B0,B0] :: 2 Word.word)))) then TV_Direct + else if (((b__0 = (vec_of_bits [B0,B1] :: 2 Word.word)))) then TV_Vector + else TV_Reserved))" + + +(*val not_implemented : forall 'a. string -> M 'a*) + +definition not_implemented :: " string \<Rightarrow>((register_value),'a,(exception))monad " where + " not_implemented message = ( throw (Error_not_implemented message))" + + +(*val internal_error : forall 'a. string -> M 'a*) + +definition internal_error :: " string \<Rightarrow>((register_value),'a,(exception))monad " where + " internal_error s = ( assert_exp False s \<then> throw (Error_internal_error () ))" + + +(*val ExtStatus_of_num : integer -> ExtStatus*) + +definition ExtStatus_of_num :: " int \<Rightarrow> ExtStatus " where + " ExtStatus_of_num arg0 = ( + (let l__45 = arg0 in + if (((l__45 = (( 0 :: int)::ii)))) then Off + else if (((l__45 = (( 1 :: int)::ii)))) then Initial + else if (((l__45 = (( 2 :: int)::ii)))) then Clean + else Dirty))" + + +(*val num_of_ExtStatus : ExtStatus -> integer*) + +fun num_of_ExtStatus :: " ExtStatus \<Rightarrow> int " where + " num_of_ExtStatus Off = ( (( 0 :: int)::ii))" +|" num_of_ExtStatus Initial = ( (( 1 :: int)::ii))" +|" num_of_ExtStatus Clean = ( (( 2 :: int)::ii))" +|" num_of_ExtStatus Dirty = ( (( 3 :: int)::ii))" + + +(*val extStatus_to_bits : ExtStatus -> mword ty2*) + +fun extStatus_to_bits :: " ExtStatus \<Rightarrow>(2)Word.word " where + " extStatus_to_bits Off = ( (vec_of_bits [B0,B0] :: 2 Word.word))" +|" extStatus_to_bits Initial = ( (vec_of_bits [B0,B1] :: 2 Word.word))" +|" extStatus_to_bits Clean = ( (vec_of_bits [B1,B0] :: 2 Word.word))" +|" extStatus_to_bits Dirty = ( (vec_of_bits [B1,B1] :: 2 Word.word))" + + +(*val extStatus_of_bits : mword ty2 -> ExtStatus*) + +definition extStatus_of_bits :: "(2)Word.word \<Rightarrow> ExtStatus " where + " extStatus_of_bits e = ( + (let b__0 = e in + if (((b__0 = (vec_of_bits [B0,B0] :: 2 Word.word)))) then Off + else if (((b__0 = (vec_of_bits [B0,B1] :: 2 Word.word)))) then Initial + else if (((b__0 = (vec_of_bits [B1,B0] :: 2 Word.word)))) then Clean + else Dirty))" + + +(*val SATPMode_of_num : integer -> SATPMode*) + +definition SATPMode_of_num :: " int \<Rightarrow> SATPMode " where + " SATPMode_of_num arg0 = ( + (let l__43 = arg0 in + if (((l__43 = (( 0 :: int)::ii)))) then Sbare + else if (((l__43 = (( 1 :: int)::ii)))) then Sv32 + else Sv39))" + + +(*val num_of_SATPMode : SATPMode -> integer*) + +fun num_of_SATPMode :: " SATPMode \<Rightarrow> int " where + " num_of_SATPMode Sbare = ( (( 0 :: int)::ii))" +|" num_of_SATPMode Sv32 = ( (( 1 :: int)::ii))" +|" num_of_SATPMode Sv39 = ( (( 2 :: int)::ii))" + + +(*val satpMode_of_bits : Architecture -> mword ty4 -> maybe SATPMode*) + +definition satpMode_of_bits :: " Architecture \<Rightarrow>(4)Word.word \<Rightarrow>(SATPMode)option " where + " satpMode_of_bits (g__113 :: Architecture) (b__0 :: satp_mode) = ( Some Sbare )" + + +(*val uop_of_num : integer -> uop*) + +definition uop_of_num :: " int \<Rightarrow> uop " where + " uop_of_num arg0 = ( + (let l__42 = arg0 in + if (((l__42 = (( 0 :: int)::ii)))) then RISCV_LUI + else RISCV_AUIPC))" + + +(*val num_of_uop : uop -> integer*) + +fun num_of_uop :: " uop \<Rightarrow> int " where + " num_of_uop RISCV_LUI = ( (( 0 :: int)::ii))" +|" num_of_uop RISCV_AUIPC = ( (( 1 :: int)::ii))" + + +(*val bop_of_num : integer -> bop*) + +definition bop_of_num :: " int \<Rightarrow> bop " where + " bop_of_num arg0 = ( + (let l__37 = arg0 in + if (((l__37 = (( 0 :: int)::ii)))) then RISCV_BEQ + else if (((l__37 = (( 1 :: int)::ii)))) then RISCV_BNE + else if (((l__37 = (( 2 :: int)::ii)))) then RISCV_BLT + else if (((l__37 = (( 3 :: int)::ii)))) then RISCV_BGE + else if (((l__37 = (( 4 :: int)::ii)))) then RISCV_BLTU + else RISCV_BGEU))" + + +(*val num_of_bop : bop -> integer*) + +fun num_of_bop :: " bop \<Rightarrow> int " where + " num_of_bop RISCV_BEQ = ( (( 0 :: int)::ii))" +|" num_of_bop RISCV_BNE = ( (( 1 :: int)::ii))" +|" num_of_bop RISCV_BLT = ( (( 2 :: int)::ii))" +|" num_of_bop RISCV_BGE = ( (( 3 :: int)::ii))" +|" num_of_bop RISCV_BLTU = ( (( 4 :: int)::ii))" +|" num_of_bop RISCV_BGEU = ( (( 5 :: int)::ii))" + + +(*val iop_of_num : integer -> iop*) + +definition iop_of_num :: " int \<Rightarrow> iop " where + " iop_of_num arg0 = ( + (let l__32 = arg0 in + if (((l__32 = (( 0 :: int)::ii)))) then RISCV_ADDI + else if (((l__32 = (( 1 :: int)::ii)))) then RISCV_SLTI + else if (((l__32 = (( 2 :: int)::ii)))) then RISCV_SLTIU + else if (((l__32 = (( 3 :: int)::ii)))) then RISCV_XORI + else if (((l__32 = (( 4 :: int)::ii)))) then RISCV_ORI + else RISCV_ANDI))" + + +(*val num_of_iop : iop -> integer*) + +fun num_of_iop :: " iop \<Rightarrow> int " where + " num_of_iop RISCV_ADDI = ( (( 0 :: int)::ii))" +|" num_of_iop RISCV_SLTI = ( (( 1 :: int)::ii))" +|" num_of_iop RISCV_SLTIU = ( (( 2 :: int)::ii))" +|" num_of_iop RISCV_XORI = ( (( 3 :: int)::ii))" +|" num_of_iop RISCV_ORI = ( (( 4 :: int)::ii))" +|" num_of_iop RISCV_ANDI = ( (( 5 :: int)::ii))" + + +(*val sop_of_num : integer -> sop*) + +definition sop_of_num :: " int \<Rightarrow> sop " where + " sop_of_num arg0 = ( + (let l__30 = arg0 in + if (((l__30 = (( 0 :: int)::ii)))) then RISCV_SLLI + else if (((l__30 = (( 1 :: int)::ii)))) then RISCV_SRLI + else RISCV_SRAI))" + + +(*val num_of_sop : sop -> integer*) + +fun num_of_sop :: " sop \<Rightarrow> int " where + " num_of_sop RISCV_SLLI = ( (( 0 :: int)::ii))" +|" num_of_sop RISCV_SRLI = ( (( 1 :: int)::ii))" +|" num_of_sop RISCV_SRAI = ( (( 2 :: int)::ii))" + + +(*val rop_of_num : integer -> rop*) + +definition rop_of_num :: " int \<Rightarrow> rop " where + " rop_of_num arg0 = ( + (let l__21 = arg0 in + if (((l__21 = (( 0 :: int)::ii)))) then RISCV_ADD + else if (((l__21 = (( 1 :: int)::ii)))) then RISCV_SUB + else if (((l__21 = (( 2 :: int)::ii)))) then RISCV_SLL + else if (((l__21 = (( 3 :: int)::ii)))) then RISCV_SLT + else if (((l__21 = (( 4 :: int)::ii)))) then RISCV_SLTU + else if (((l__21 = (( 5 :: int)::ii)))) then RISCV_XOR + else if (((l__21 = (( 6 :: int)::ii)))) then RISCV_SRL + else if (((l__21 = (( 7 :: int)::ii)))) then RISCV_SRA + else if (((l__21 = (( 8 :: int)::ii)))) then RISCV_OR + else RISCV_AND))" + + +(*val num_of_rop : rop -> integer*) + +fun num_of_rop :: " rop \<Rightarrow> int " where + " num_of_rop RISCV_ADD = ( (( 0 :: int)::ii))" +|" num_of_rop RISCV_SUB = ( (( 1 :: int)::ii))" +|" num_of_rop RISCV_SLL = ( (( 2 :: int)::ii))" +|" num_of_rop RISCV_SLT = ( (( 3 :: int)::ii))" +|" num_of_rop RISCV_SLTU = ( (( 4 :: int)::ii))" +|" num_of_rop RISCV_XOR = ( (( 5 :: int)::ii))" +|" num_of_rop RISCV_SRL = ( (( 6 :: int)::ii))" +|" num_of_rop RISCV_SRA = ( (( 7 :: int)::ii))" +|" num_of_rop RISCV_OR = ( (( 8 :: int)::ii))" +|" num_of_rop RISCV_AND = ( (( 9 :: int)::ii))" + + +(*val ropw_of_num : integer -> ropw*) + +definition ropw_of_num :: " int \<Rightarrow> ropw " where + " ropw_of_num arg0 = ( + (let l__17 = arg0 in + if (((l__17 = (( 0 :: int)::ii)))) then RISCV_ADDW + else if (((l__17 = (( 1 :: int)::ii)))) then RISCV_SUBW + else if (((l__17 = (( 2 :: int)::ii)))) then RISCV_SLLW + else if (((l__17 = (( 3 :: int)::ii)))) then RISCV_SRLW + else RISCV_SRAW))" + + +(*val num_of_ropw : ropw -> integer*) + +fun num_of_ropw :: " ropw \<Rightarrow> int " where + " num_of_ropw RISCV_ADDW = ( (( 0 :: int)::ii))" +|" num_of_ropw RISCV_SUBW = ( (( 1 :: int)::ii))" +|" num_of_ropw RISCV_SLLW = ( (( 2 :: int)::ii))" +|" num_of_ropw RISCV_SRLW = ( (( 3 :: int)::ii))" +|" num_of_ropw RISCV_SRAW = ( (( 4 :: int)::ii))" + + +(*val amoop_of_num : integer -> amoop*) + +definition amoop_of_num :: " int \<Rightarrow> amoop " where + " amoop_of_num arg0 = ( + (let l__9 = arg0 in + if (((l__9 = (( 0 :: int)::ii)))) then AMOSWAP + else if (((l__9 = (( 1 :: int)::ii)))) then AMOADD + else if (((l__9 = (( 2 :: int)::ii)))) then AMOXOR + else if (((l__9 = (( 3 :: int)::ii)))) then AMOAND + else if (((l__9 = (( 4 :: int)::ii)))) then AMOOR + else if (((l__9 = (( 5 :: int)::ii)))) then AMOMIN + else if (((l__9 = (( 6 :: int)::ii)))) then AMOMAX + else if (((l__9 = (( 7 :: int)::ii)))) then AMOMINU + else AMOMAXU))" + + +(*val num_of_amoop : amoop -> integer*) + +fun num_of_amoop :: " amoop \<Rightarrow> int " where + " num_of_amoop AMOSWAP = ( (( 0 :: int)::ii))" +|" num_of_amoop AMOADD = ( (( 1 :: int)::ii))" +|" num_of_amoop AMOXOR = ( (( 2 :: int)::ii))" +|" num_of_amoop AMOAND = ( (( 3 :: int)::ii))" +|" num_of_amoop AMOOR = ( (( 4 :: int)::ii))" +|" num_of_amoop AMOMIN = ( (( 5 :: int)::ii))" +|" num_of_amoop AMOMAX = ( (( 6 :: int)::ii))" +|" num_of_amoop AMOMINU = ( (( 7 :: int)::ii))" +|" num_of_amoop AMOMAXU = ( (( 8 :: int)::ii))" + + +(*val csrop_of_num : integer -> csrop*) + +definition csrop_of_num :: " int \<Rightarrow> csrop " where + " csrop_of_num arg0 = ( + (let l__7 = arg0 in + if (((l__7 = (( 0 :: int)::ii)))) then CSRRW + else if (((l__7 = (( 1 :: int)::ii)))) then CSRRS + else CSRRC))" + + +(*val num_of_csrop : csrop -> integer*) + +fun num_of_csrop :: " csrop \<Rightarrow> int " where + " num_of_csrop CSRRW = ( (( 0 :: int)::ii))" +|" num_of_csrop CSRRS = ( (( 1 :: int)::ii))" +|" num_of_csrop CSRRC = ( (( 2 :: int)::ii))" + + +(*val word_width_of_num : integer -> word_width*) + +definition word_width_of_num :: " int \<Rightarrow> word_width " where + " word_width_of_num arg0 = ( + (let l__4 = arg0 in + if (((l__4 = (( 0 :: int)::ii)))) then BYTE + else if (((l__4 = (( 1 :: int)::ii)))) then HALF + else if (((l__4 = (( 2 :: int)::ii)))) then WORD + else DOUBLE))" + + +(*val num_of_word_width : word_width -> integer*) + +fun num_of_word_width :: " word_width \<Rightarrow> int " where + " num_of_word_width BYTE = ( (( 0 :: int)::ii))" +|" num_of_word_width HALF = ( (( 1 :: int)::ii))" +|" num_of_word_width WORD = ( (( 2 :: int)::ii))" +|" num_of_word_width DOUBLE = ( (( 3 :: int)::ii))" + + +(*val is_aligned_addr : mword ty64 -> integer -> bool*) + +definition is_aligned_addr :: "(64)Word.word \<Rightarrow> int \<Rightarrow> bool " where + " is_aligned_addr (addr :: xlenbits) (width :: int) = ( + (((ex_int ((hardware_mod ((Word.uint addr)) width)))) = (( 0 :: int)::ii)))" + + +(*val checked_mem_read : forall 'int8_times_n. Size 'int8_times_n => ReadType -> mword ty64 -> integer -> M (MemoryOpResult (mword 'int8_times_n))*) + +definition checked_mem_read :: " ReadType \<Rightarrow>(64)Word.word \<Rightarrow> int \<Rightarrow>((register_value),((('int8_times_n::len)Word.word)MemoryOpResult),(exception))monad " where + " checked_mem_read (t :: ReadType) (addr :: xlenbits) (width :: int) = ( + (RISCV_read addr width :: ( (( 'int8_times_n::len)Word.word)option) M) \<bind> (\<lambda> (w__0 :: + (( 'int8_times_n::len)Word.word)option) . + return ((case (t, w__0) of + (Instruction, None) => MemException E_Fetch_Access_Fault + | (Data, None) => MemException E_Load_Access_Fault + | (_, Some (v)) => MemValue v + ))))" + + +(*val MEMr : forall 'int8_times_n. Size 'int8_times_n => mword ty64 -> integer -> M (MemoryOpResult (mword 'int8_times_n))*) + +(*val MEMr_acquire : forall 'int8_times_n. Size 'int8_times_n => mword ty64 -> integer -> M (MemoryOpResult (mword 'int8_times_n))*) + +(*val MEMr_strong_acquire : forall 'int8_times_n. Size 'int8_times_n => mword ty64 -> integer -> M (MemoryOpResult (mword 'int8_times_n))*) + +(*val MEMr_reserved : forall 'int8_times_n. Size 'int8_times_n => mword ty64 -> integer -> M (MemoryOpResult (mword 'int8_times_n))*) + +(*val MEMr_reserved_acquire : forall 'int8_times_n. Size 'int8_times_n => mword ty64 -> integer -> M (MemoryOpResult (mword 'int8_times_n))*) + +(*val MEMr_reserved_strong_acquire : forall 'int8_times_n. Size 'int8_times_n => mword ty64 -> integer -> M (MemoryOpResult (mword 'int8_times_n))*) + +definition MEMr :: "(64)Word.word \<Rightarrow> int \<Rightarrow>((register_value),((('int8_times_n::len)Word.word)MemoryOpResult),(exception))monad " where + " MEMr addr width = ( (checked_mem_read Data addr width :: ( (( 'int8_times_n::len)Word.word)MemoryOpResult) M))" + + +definition MEMr_acquire :: "(64)Word.word \<Rightarrow> int \<Rightarrow>((register_value),((('int8_times_n::len)Word.word)MemoryOpResult),(exception))monad " where + " MEMr_acquire addr width = ( + (checked_mem_read Data addr width :: ( (( 'int8_times_n::len)Word.word)MemoryOpResult) M))" + + +definition MEMr_strong_acquire :: "(64)Word.word \<Rightarrow> int \<Rightarrow>((register_value),((('int8_times_n::len)Word.word)MemoryOpResult),(exception))monad " where + " MEMr_strong_acquire addr width = ( + (checked_mem_read Data addr width :: ( (( 'int8_times_n::len)Word.word)MemoryOpResult) M))" + + +definition MEMr_reserved :: "(64)Word.word \<Rightarrow> int \<Rightarrow>((register_value),((('int8_times_n::len)Word.word)MemoryOpResult),(exception))monad " where + " MEMr_reserved addr width = ( + (checked_mem_read Data addr width :: ( (( 'int8_times_n::len)Word.word)MemoryOpResult) M))" + + +definition MEMr_reserved_acquire :: "(64)Word.word \<Rightarrow> int \<Rightarrow>((register_value),((('int8_times_n::len)Word.word)MemoryOpResult),(exception))monad " where + " MEMr_reserved_acquire addr width = ( + (checked_mem_read Data addr width :: ( (( 'int8_times_n::len)Word.word)MemoryOpResult) M))" + + +definition MEMr_reserved_strong_acquire :: "(64)Word.word \<Rightarrow> int \<Rightarrow>((register_value),((('int8_times_n::len)Word.word)MemoryOpResult),(exception))monad " where + " MEMr_reserved_strong_acquire addr width = ( + (checked_mem_read Data addr width :: ( (( 'int8_times_n::len)Word.word)MemoryOpResult) M))" + + +(*val mem_read : forall 'int8_times_n. Size 'int8_times_n => mword ty64 -> integer -> bool -> bool -> bool -> M (MemoryOpResult (mword 'int8_times_n))*) + +definition mem_read :: "(64)Word.word \<Rightarrow> int \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow>((register_value),((('int8_times_n::len)Word.word)MemoryOpResult),(exception))monad " where + " mem_read addr width aq rl res = ( + if ((((((aq \<or> res))) \<and> ((\<not> ((is_aligned_addr addr width))))))) then + return (MemException E_Load_Addr_Align) + else + (case (aq, rl, res) of + (False, False, False) => (MEMr addr width :: ( (( 'int8_times_n::len)Word.word)MemoryOpResult) M) + | (True, False, False) => (MEMr_acquire addr width :: ( (( 'int8_times_n::len)Word.word)MemoryOpResult) M) + | (False, False, True) => + (MEMr_reserved addr width :: ( (( 'int8_times_n::len)Word.word)MemoryOpResult) M) + | (True, False, True) => + (MEMr_reserved_acquire addr width :: ( (( 'int8_times_n::len)Word.word)MemoryOpResult) M) + | (False, True, False) => throw (Error_not_implemented (''load.rl'')) + | (True, True, False) => + (MEMr_strong_acquire addr width :: ( (( 'int8_times_n::len)Word.word)MemoryOpResult) M) + | (False, True, True) => throw (Error_not_implemented (''lr.rl'')) + | (True, True, True) => + (MEMr_reserved_strong_acquire addr width :: ( (( 'int8_times_n::len)Word.word)MemoryOpResult) M) + ))" + + +(*val mem_write_ea : mword ty64 -> integer -> bool -> bool -> bool -> M (MemoryOpResult unit)*) + +definition mem_write_ea :: "(64)Word.word \<Rightarrow> int \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow>((register_value),((unit)MemoryOpResult),(exception))monad " where + " mem_write_ea addr width aq rl con = ( + if ((((((rl \<or> con))) \<and> ((\<not> ((is_aligned_addr addr width))))))) then + return (MemException E_SAMO_Addr_Align) + else + (case (aq, rl, con) of + (False, False, False) => MEMea addr width \<then> return (MemValue () ) + | (False, True, False) => MEMea_release addr width \<then> return (MemValue () ) + | (False, False, True) => MEMea_conditional addr width \<then> return (MemValue () ) + | (False, True, True) => MEMea_conditional_release addr width \<then> return (MemValue () ) + | (True, False, False) => throw (Error_not_implemented (''store.aq'')) + | (True, True, False) => MEMea_strong_release addr width \<then> return (MemValue () ) + | (True, False, True) => throw (Error_not_implemented (''sc.aq'')) + | (True, True, True) => MEMea_conditional_strong_release addr width \<then> return (MemValue () ) + ))" + + +(*val checked_mem_write : forall 'int8_times_n. Size 'int8_times_n => mword ty64 -> integer -> mword 'int8_times_n -> M (MemoryOpResult unit)*) + +definition checked_mem_write :: "(64)Word.word \<Rightarrow> int \<Rightarrow>('int8_times_n::len)Word.word \<Rightarrow>((register_value),((unit)MemoryOpResult),(exception))monad " where + " checked_mem_write (addr :: xlenbits) (width :: int) (data :: 'int8_times_n bits) = ( + RISCV_write addr width data \<bind> (\<lambda> (w__0 :: bool) . + return (if w__0 then MemValue () + else MemException E_SAMO_Access_Fault)))" + + +(*val MEMval : forall 'int8_times_n. Size 'int8_times_n => mword ty64 -> integer -> mword 'int8_times_n -> M (MemoryOpResult unit)*) + +(*val MEMval_release : forall 'int8_times_n. Size 'int8_times_n => mword ty64 -> integer -> mword 'int8_times_n -> M (MemoryOpResult unit)*) + +(*val MEMval_strong_release : forall 'int8_times_n. Size 'int8_times_n => mword ty64 -> integer -> mword 'int8_times_n -> M (MemoryOpResult unit)*) + +(*val MEMval_conditional : forall 'int8_times_n. Size 'int8_times_n => mword ty64 -> integer -> mword 'int8_times_n -> M (MemoryOpResult unit)*) + +(*val MEMval_conditional_release : forall 'int8_times_n. Size 'int8_times_n => mword ty64 -> integer -> mword 'int8_times_n -> M (MemoryOpResult unit)*) + +(*val MEMval_conditional_strong_release : forall 'int8_times_n. Size 'int8_times_n => mword ty64 -> integer -> mword 'int8_times_n -> M (MemoryOpResult unit)*) + +definition MEMval :: "(64)Word.word \<Rightarrow> int \<Rightarrow>('int8_times_n::len)Word.word \<Rightarrow>((register_value),((unit)MemoryOpResult),(exception))monad " where + " MEMval addr width data = ( checked_mem_write addr width data )" + + +definition MEMval_release :: "(64)Word.word \<Rightarrow> int \<Rightarrow>('int8_times_n::len)Word.word \<Rightarrow>((register_value),((unit)MemoryOpResult),(exception))monad " where + " MEMval_release addr width data = ( checked_mem_write addr width data )" + + +definition MEMval_strong_release :: "(64)Word.word \<Rightarrow> int \<Rightarrow>('int8_times_n::len)Word.word \<Rightarrow>((register_value),((unit)MemoryOpResult),(exception))monad " where + " MEMval_strong_release addr width data = ( checked_mem_write addr width data )" + + +definition MEMval_conditional :: "(64)Word.word \<Rightarrow> int \<Rightarrow>('int8_times_n::len)Word.word \<Rightarrow>((register_value),((unit)MemoryOpResult),(exception))monad " where + " MEMval_conditional addr width data = ( checked_mem_write addr width data )" + + +definition MEMval_conditional_release :: "(64)Word.word \<Rightarrow> int \<Rightarrow>('int8_times_n::len)Word.word \<Rightarrow>((register_value),((unit)MemoryOpResult),(exception))monad " where + " MEMval_conditional_release addr width data = ( checked_mem_write addr width data )" + + +definition MEMval_conditional_strong_release :: "(64)Word.word \<Rightarrow> int \<Rightarrow>('int8_times_n::len)Word.word \<Rightarrow>((register_value),((unit)MemoryOpResult),(exception))monad " where + " MEMval_conditional_strong_release addr width data = ( checked_mem_write addr width data )" + + +(*val mem_write_value : forall 'int8_times_n. Size 'int8_times_n => mword ty64 -> integer -> mword 'int8_times_n -> bool -> bool -> bool -> M (MemoryOpResult unit)*) + +definition mem_write_value :: "(64)Word.word \<Rightarrow> int \<Rightarrow>('int8_times_n::len)Word.word \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow>((register_value),((unit)MemoryOpResult),(exception))monad " where + " mem_write_value addr width value1 aq rl con = ( + if ((((((rl \<or> con))) \<and> ((\<not> ((is_aligned_addr addr width))))))) then + return (MemException E_SAMO_Addr_Align) + else + (case (aq, rl, con) of + (False, False, False) => MEMval addr width value1 + | (False, True, False) => MEMval_release addr width value1 + | (False, False, True) => MEMval_conditional addr width value1 + | (False, True, True) => MEMval_conditional_release addr width value1 + | (True, False, False) => throw (Error_not_implemented (''store.aq'')) + | (True, True, False) => MEMval_strong_release addr width value1 + | (True, False, True) => throw (Error_not_implemented (''sc.aq'')) + | (True, True, True) => MEMval_conditional_strong_release addr width value1 + ))" + + +(*val _get_Misa : Misa -> mword ty64*) + +fun get_Misa :: " Misa \<Rightarrow>(64)Word.word " where + " get_Misa (Mk_Misa (v)) = ( v )" + + +(*val _set_Misa : register_ref regstate register_value Misa -> mword ty64 -> M unit*) + +definition set_Misa :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(64)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> r . + (let r = (Mk_Misa v) in + write_reg r_ref r)))" + + +(*val _get_SV39_PTE : SV39_PTE -> mword ty64*) + +(*val _set_SV39_PTE : register_ref regstate register_value SV39_PTE -> mword ty64 -> M unit*) + +(*val _get_Misa_MXL : Misa -> mword ty2*) + +fun get_Misa_MXL :: " Misa \<Rightarrow>(2)Word.word " where + " get_Misa_MXL (Mk_Misa (v)) = ( (subrange_vec_dec v (( 63 :: int)::ii) (( 62 :: int)::ii) :: 2 Word.word))" + + +(*val _set_Misa_MXL : register_ref regstate register_value Misa -> mword ty2 -> M unit*) + +definition set_Misa_MXL :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(2)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_MXL r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 63 :: int)::ii) (( 62 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_MXL : Misa -> mword ty2 -> Misa*) + +fun update_Misa_MXL :: " Misa \<Rightarrow>(2)Word.word \<Rightarrow> Misa " where + " update_Misa_MXL (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 63 :: int)::ii) (( 62 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_Z : Misa -> mword ty1*) + +fun get_Misa_Z :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_Z (Mk_Misa (v)) = ( (subrange_vec_dec v (( 25 :: int)::ii) (( 25 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_Z : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_Z :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_Z r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 25 :: int)::ii) (( 25 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_Z : Misa -> mword ty1 -> Misa*) + +fun update_Misa_Z :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_Z (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 25 :: int)::ii) (( 25 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_Y : Misa -> mword ty1*) + +fun get_Misa_Y :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_Y (Mk_Misa (v)) = ( (subrange_vec_dec v (( 24 :: int)::ii) (( 24 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_Y : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_Y :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_Y r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 24 :: int)::ii) (( 24 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_Y : Misa -> mword ty1 -> Misa*) + +fun update_Misa_Y :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_Y (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 24 :: int)::ii) (( 24 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_X : Misa -> mword ty1*) + +fun get_Misa_X :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_X (Mk_Misa (v)) = ( (subrange_vec_dec v (( 23 :: int)::ii) (( 23 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_X : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_X :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_X r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 23 :: int)::ii) (( 23 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_X : Misa -> mword ty1 -> Misa*) + +fun update_Misa_X :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_X (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 23 :: int)::ii) (( 23 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_PTE_Bits_X : PTE_Bits -> mword ty1 -> PTE_Bits*) + +(*val _get_PTE_Bits_X : PTE_Bits -> mword ty1*) + +(*val _set_PTE_Bits_X : register_ref regstate register_value PTE_Bits -> mword ty1 -> M unit*) + +(*val _get_Misa_W : Misa -> mword ty1*) + +fun get_Misa_W :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_W (Mk_Misa (v)) = ( (subrange_vec_dec v (( 22 :: int)::ii) (( 22 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_W : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_W :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_W r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 22 :: int)::ii) (( 22 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_W : Misa -> mword ty1 -> Misa*) + +fun update_Misa_W :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_W (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 22 :: int)::ii) (( 22 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_PTE_Bits_W : PTE_Bits -> mword ty1 -> PTE_Bits*) + +(*val _get_PTE_Bits_W : PTE_Bits -> mword ty1*) + +(*val _set_PTE_Bits_W : register_ref regstate register_value PTE_Bits -> mword ty1 -> M unit*) + +(*val _get_Misa_V : Misa -> mword ty1*) + +fun get_Misa_V :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_V (Mk_Misa (v)) = ( (subrange_vec_dec v (( 21 :: int)::ii) (( 21 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_V : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_V :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_V r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 21 :: int)::ii) (( 21 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_V : Misa -> mword ty1 -> Misa*) + +fun update_Misa_V :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_V (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 21 :: int)::ii) (( 21 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_PTE_Bits_V : PTE_Bits -> mword ty1 -> PTE_Bits*) + +(*val _get_PTE_Bits_V : PTE_Bits -> mword ty1*) + +(*val _set_PTE_Bits_V : register_ref regstate register_value PTE_Bits -> mword ty1 -> M unit*) + +(*val _get_Misa_U : Misa -> mword ty1*) + +fun get_Misa_U :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_U (Mk_Misa (v)) = ( (subrange_vec_dec v (( 20 :: int)::ii) (( 20 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_U : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_U :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_U r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 20 :: int)::ii) (( 20 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_U : Misa -> mword ty1 -> Misa*) + +fun update_Misa_U :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_U (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 20 :: int)::ii) (( 20 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_PTE_Bits_U : PTE_Bits -> mword ty1 -> PTE_Bits*) + +(*val _get_PTE_Bits_U : PTE_Bits -> mword ty1*) + +(*val _set_PTE_Bits_U : register_ref regstate register_value PTE_Bits -> mword ty1 -> M unit*) + +(*val _get_Misa_T : Misa -> mword ty1*) + +fun get_Misa_T :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_T (Mk_Misa (v)) = ( (subrange_vec_dec v (( 19 :: int)::ii) (( 19 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_T : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_T :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_T r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 19 :: int)::ii) (( 19 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_T : Misa -> mword ty1 -> Misa*) + +fun update_Misa_T :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_T (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 19 :: int)::ii) (( 19 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_S : Misa -> mword ty1*) + +fun get_Misa_S :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_S (Mk_Misa (v)) = ( (subrange_vec_dec v (( 18 :: int)::ii) (( 18 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_S : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_S :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_S r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 18 :: int)::ii) (( 18 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_S : Misa -> mword ty1 -> Misa*) + +fun update_Misa_S :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_S (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 18 :: int)::ii) (( 18 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_R : Misa -> mword ty1*) + +fun get_Misa_R :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_R (Mk_Misa (v)) = ( (subrange_vec_dec v (( 17 :: int)::ii) (( 17 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_R : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_R :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_R r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 17 :: int)::ii) (( 17 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_R : Misa -> mword ty1 -> Misa*) + +fun update_Misa_R :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_R (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 17 :: int)::ii) (( 17 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_PTE_Bits_R : PTE_Bits -> mword ty1 -> PTE_Bits*) + +(*val _get_PTE_Bits_R : PTE_Bits -> mword ty1*) + +(*val _set_PTE_Bits_R : register_ref regstate register_value PTE_Bits -> mword ty1 -> M unit*) + +(*val _get_Misa_Q : Misa -> mword ty1*) + +fun get_Misa_Q :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_Q (Mk_Misa (v)) = ( (subrange_vec_dec v (( 16 :: int)::ii) (( 16 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_Q : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_Q :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_Q r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 16 :: int)::ii) (( 16 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_Q : Misa -> mword ty1 -> Misa*) + +fun update_Misa_Q :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_Q (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 16 :: int)::ii) (( 16 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_P : Misa -> mword ty1*) + +fun get_Misa_P :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_P (Mk_Misa (v)) = ( (subrange_vec_dec v (( 15 :: int)::ii) (( 15 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_P : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_P :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_P r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 15 :: int)::ii) (( 15 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_P : Misa -> mword ty1 -> Misa*) + +fun update_Misa_P :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_P (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 15 :: int)::ii) (( 15 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_O : Misa -> mword ty1*) + +fun get_Misa_O :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_O (Mk_Misa (v)) = ( (subrange_vec_dec v (( 14 :: int)::ii) (( 14 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_O : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_O :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_O r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 14 :: int)::ii) (( 14 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_O : Misa -> mword ty1 -> Misa*) + +fun update_Misa_O :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_O (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 14 :: int)::ii) (( 14 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_N : Misa -> mword ty1*) + +fun get_Misa_N :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_N (Mk_Misa (v)) = ( (subrange_vec_dec v (( 13 :: int)::ii) (( 13 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_N : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_N :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_N r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 13 :: int)::ii) (( 13 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_N : Misa -> mword ty1 -> Misa*) + +fun update_Misa_N :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_N (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 13 :: int)::ii) (( 13 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_M : Misa -> mword ty1*) + +fun get_Misa_M :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_M (Mk_Misa (v)) = ( (subrange_vec_dec v (( 12 :: int)::ii) (( 12 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_M : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_M :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_M r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 12 :: int)::ii) (( 12 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_M : Misa -> mword ty1 -> Misa*) + +fun update_Misa_M :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_M (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 12 :: int)::ii) (( 12 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_L : Misa -> mword ty1*) + +fun get_Misa_L :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_L (Mk_Misa (v)) = ( (subrange_vec_dec v (( 11 :: int)::ii) (( 11 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_L : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_L :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_L r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 11 :: int)::ii) (( 11 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_L : Misa -> mword ty1 -> Misa*) + +fun update_Misa_L :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_L (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 11 :: int)::ii) (( 11 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_K : Misa -> mword ty1*) + +fun get_Misa_K :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_K (Mk_Misa (v)) = ( (subrange_vec_dec v (( 10 :: int)::ii) (( 10 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_K : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_K :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_K r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 10 :: int)::ii) (( 10 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_K : Misa -> mword ty1 -> Misa*) + +fun update_Misa_K :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_K (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 10 :: int)::ii) (( 10 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_J : Misa -> mword ty1*) + +fun get_Misa_J :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_J (Mk_Misa (v)) = ( (subrange_vec_dec v (( 9 :: int)::ii) (( 9 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_J : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_J :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_J r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 9 :: int)::ii) (( 9 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_J : Misa -> mword ty1 -> Misa*) + +fun update_Misa_J :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_J (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 9 :: int)::ii) (( 9 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_I : Misa -> mword ty1*) + +fun get_Misa_I :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_I (Mk_Misa (v)) = ( (subrange_vec_dec v (( 8 :: int)::ii) (( 8 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_I : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_I :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_I r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 8 :: int)::ii) (( 8 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_I : Misa -> mword ty1 -> Misa*) + +fun update_Misa_I :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_I (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 8 :: int)::ii) (( 8 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_H : Misa -> mword ty1*) + +fun get_Misa_H :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_H (Mk_Misa (v)) = ( (subrange_vec_dec v (( 7 :: int)::ii) (( 7 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_H : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_H :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_H r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 7 :: int)::ii) (( 7 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_H : Misa -> mword ty1 -> Misa*) + +fun update_Misa_H :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_H (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 7 :: int)::ii) (( 7 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_G : Misa -> mword ty1*) + +fun get_Misa_G :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_G (Mk_Misa (v)) = ( (subrange_vec_dec v (( 6 :: int)::ii) (( 6 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_G : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_G :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_G r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 6 :: int)::ii) (( 6 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_G : Misa -> mword ty1 -> Misa*) + +fun update_Misa_G :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_G (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 6 :: int)::ii) (( 6 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_PTE_Bits_G : PTE_Bits -> mword ty1 -> PTE_Bits*) + +(*val _get_PTE_Bits_G : PTE_Bits -> mword ty1*) + +(*val _set_PTE_Bits_G : register_ref regstate register_value PTE_Bits -> mword ty1 -> M unit*) + +(*val _get_Misa_F : Misa -> mword ty1*) + +fun get_Misa_F :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_F (Mk_Misa (v)) = ( (subrange_vec_dec v (( 5 :: int)::ii) (( 5 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_F : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_F :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_F r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 5 :: int)::ii) (( 5 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_F : Misa -> mword ty1 -> Misa*) + +fun update_Misa_F :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_F (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 5 :: int)::ii) (( 5 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_E : Misa -> mword ty1*) + +fun get_Misa_E :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_E (Mk_Misa (v)) = ( (subrange_vec_dec v (( 4 :: int)::ii) (( 4 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_E : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_E :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_E r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 4 :: int)::ii) (( 4 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_E : Misa -> mword ty1 -> Misa*) + +fun update_Misa_E :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_E (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 4 :: int)::ii) (( 4 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_D : Misa -> mword ty1*) + +fun get_Misa_D :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_D (Mk_Misa (v)) = ( (subrange_vec_dec v (( 3 :: int)::ii) (( 3 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_D : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_D :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_D r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 3 :: int)::ii) (( 3 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_D : Misa -> mword ty1 -> Misa*) + +fun update_Misa_D :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_D (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 3 :: int)::ii) (( 3 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_PTE_Bits_D : PTE_Bits -> mword ty1 -> PTE_Bits*) + +(*val _get_PTE_Bits_D : PTE_Bits -> mword ty1*) + +(*val _set_PTE_Bits_D : register_ref regstate register_value PTE_Bits -> mword ty1 -> M unit*) + +(*val _get_Misa_C : Misa -> mword ty1*) + +fun get_Misa_C :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_C (Mk_Misa (v)) = ( (subrange_vec_dec v (( 2 :: int)::ii) (( 2 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_C : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_C :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_C r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 2 :: int)::ii) (( 2 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_C : Misa -> mword ty1 -> Misa*) + +fun update_Misa_C :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_C (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 2 :: int)::ii) (( 2 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_B : Misa -> mword ty1*) + +fun get_Misa_B :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_B (Mk_Misa (v)) = ( (subrange_vec_dec v (( 1 :: int)::ii) (( 1 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_B : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_B :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_B r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 1 :: int)::ii) (( 1 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_B : Misa -> mword ty1 -> Misa*) + +fun update_Misa_B :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_B (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 1 :: int)::ii) (( 1 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Misa_A : Misa -> mword ty1*) + +fun get_Misa_A :: " Misa \<Rightarrow>(1)Word.word " where + " get_Misa_A (Mk_Misa (v)) = ( (subrange_vec_dec v (( 0 :: int)::ii) (( 0 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Misa_A : register_ref regstate register_value Misa -> mword ty1 -> M unit*) + +definition set_Misa_A :: "((regstate),(register_value),(Misa))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Misa_A r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Misa) . + (let r = ((get_Misa w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 0 :: int)::ii) (( 0 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Misa r)))))" + + +(*val _update_Misa_A : Misa -> mword ty1 -> Misa*) + +fun update_Misa_A :: " Misa \<Rightarrow>(1)Word.word \<Rightarrow> Misa " where + " update_Misa_A (Mk_Misa (v)) x = ( + Mk_Misa ((update_subrange_vec_dec v (( 0 :: int)::ii) (( 0 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_PTE_Bits_A : PTE_Bits -> mword ty1 -> PTE_Bits*) + +(*val _get_PTE_Bits_A : PTE_Bits -> mword ty1*) + +(*val _set_PTE_Bits_A : register_ref regstate register_value PTE_Bits -> mword ty1 -> M unit*) + +(*val legalize_misa : Misa -> mword ty64 -> Misa*) + +definition legalize_misa :: " Misa \<Rightarrow>(64)Word.word \<Rightarrow> Misa " where + " legalize_misa (m :: Misa) (v :: xlenbits) = ( m )" + + +(*val _get_Mstatus : Mstatus -> mword ty64*) + +fun get_Mstatus :: " Mstatus \<Rightarrow>(64)Word.word " where + " get_Mstatus (Mk_Mstatus (v)) = ( v )" + + +(*val _set_Mstatus : register_ref regstate register_value Mstatus -> mword ty64 -> M unit*) + +definition set_Mstatus :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(64)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> r . + (let r = (Mk_Mstatus v) in + write_reg r_ref r)))" + + +(*val _get_Mstatus_SD : Mstatus -> mword ty1*) + +fun get_Mstatus_SD :: " Mstatus \<Rightarrow>(1)Word.word " where + " get_Mstatus_SD (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 63 :: int)::ii) (( 63 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Mstatus_SD : register_ref regstate register_value Mstatus -> mword ty1 -> M unit*) + +definition set_Mstatus_SD :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_SD r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 63 :: int)::ii) (( 63 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_SD : Mstatus -> mword ty1 -> Mstatus*) + +fun update_Mstatus_SD :: " Mstatus \<Rightarrow>(1)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_SD (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 63 :: int)::ii) (( 63 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sstatus_SD : Sstatus -> mword ty1 -> Sstatus*) + +(*val _get_Sstatus_SD : Sstatus -> mword ty1*) + +(*val _set_Sstatus_SD : register_ref regstate register_value Sstatus -> mword ty1 -> M unit*) + +(*val _get_Mstatus_SXL : Mstatus -> mword ty2*) + +fun get_Mstatus_SXL :: " Mstatus \<Rightarrow>(2)Word.word " where + " get_Mstatus_SXL (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 35 :: int)::ii) (( 34 :: int)::ii) :: 2 Word.word))" + + +(*val _set_Mstatus_SXL : register_ref regstate register_value Mstatus -> mword ty2 -> M unit*) + +definition set_Mstatus_SXL :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(2)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_SXL r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 35 :: int)::ii) (( 34 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_SXL : Mstatus -> mword ty2 -> Mstatus*) + +fun update_Mstatus_SXL :: " Mstatus \<Rightarrow>(2)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_SXL (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 35 :: int)::ii) (( 34 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Mstatus_UXL : Mstatus -> mword ty2*) + +fun get_Mstatus_UXL :: " Mstatus \<Rightarrow>(2)Word.word " where + " get_Mstatus_UXL (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 33 :: int)::ii) (( 32 :: int)::ii) :: 2 Word.word))" + + +(*val _set_Mstatus_UXL : register_ref regstate register_value Mstatus -> mword ty2 -> M unit*) + +definition set_Mstatus_UXL :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(2)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_UXL r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 33 :: int)::ii) (( 32 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_UXL : Mstatus -> mword ty2 -> Mstatus*) + +fun update_Mstatus_UXL :: " Mstatus \<Rightarrow>(2)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_UXL (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 33 :: int)::ii) (( 32 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sstatus_UXL : Sstatus -> mword ty2 -> Sstatus*) + +(*val _get_Sstatus_UXL : Sstatus -> mword ty2*) + +(*val _set_Sstatus_UXL : register_ref regstate register_value Sstatus -> mword ty2 -> M unit*) + +(*val _get_Mstatus_TSR : Mstatus -> mword ty1*) + +fun get_Mstatus_TSR :: " Mstatus \<Rightarrow>(1)Word.word " where + " get_Mstatus_TSR (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 22 :: int)::ii) (( 22 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Mstatus_TSR : register_ref regstate register_value Mstatus -> mword ty1 -> M unit*) + +definition set_Mstatus_TSR :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_TSR r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 22 :: int)::ii) (( 22 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_TSR : Mstatus -> mword ty1 -> Mstatus*) + +fun update_Mstatus_TSR :: " Mstatus \<Rightarrow>(1)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_TSR (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 22 :: int)::ii) (( 22 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Mstatus_TW : Mstatus -> mword ty1*) + +fun get_Mstatus_TW :: " Mstatus \<Rightarrow>(1)Word.word " where + " get_Mstatus_TW (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 21 :: int)::ii) (( 21 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Mstatus_TW : register_ref regstate register_value Mstatus -> mword ty1 -> M unit*) + +definition set_Mstatus_TW :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_TW r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 21 :: int)::ii) (( 21 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_TW : Mstatus -> mword ty1 -> Mstatus*) + +fun update_Mstatus_TW :: " Mstatus \<Rightarrow>(1)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_TW (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 21 :: int)::ii) (( 21 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Mstatus_TVM : Mstatus -> mword ty1*) + +fun get_Mstatus_TVM :: " Mstatus \<Rightarrow>(1)Word.word " where + " get_Mstatus_TVM (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 20 :: int)::ii) (( 20 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Mstatus_TVM : register_ref regstate register_value Mstatus -> mword ty1 -> M unit*) + +definition set_Mstatus_TVM :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_TVM r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 20 :: int)::ii) (( 20 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_TVM : Mstatus -> mword ty1 -> Mstatus*) + +fun update_Mstatus_TVM :: " Mstatus \<Rightarrow>(1)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_TVM (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 20 :: int)::ii) (( 20 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Mstatus_MXR : Mstatus -> mword ty1*) + +fun get_Mstatus_MXR :: " Mstatus \<Rightarrow>(1)Word.word " where + " get_Mstatus_MXR (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 19 :: int)::ii) (( 19 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Mstatus_MXR : register_ref regstate register_value Mstatus -> mword ty1 -> M unit*) + +definition set_Mstatus_MXR :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_MXR r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 19 :: int)::ii) (( 19 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_MXR : Mstatus -> mword ty1 -> Mstatus*) + +fun update_Mstatus_MXR :: " Mstatus \<Rightarrow>(1)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_MXR (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 19 :: int)::ii) (( 19 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sstatus_MXR : Sstatus -> mword ty1 -> Sstatus*) + +(*val _get_Sstatus_MXR : Sstatus -> mword ty1*) + +(*val _set_Sstatus_MXR : register_ref regstate register_value Sstatus -> mword ty1 -> M unit*) + +(*val _get_Mstatus_SUM : Mstatus -> mword ty1*) + +fun get_Mstatus_SUM :: " Mstatus \<Rightarrow>(1)Word.word " where + " get_Mstatus_SUM (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 18 :: int)::ii) (( 18 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Mstatus_SUM : register_ref regstate register_value Mstatus -> mword ty1 -> M unit*) + +definition set_Mstatus_SUM :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_SUM r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 18 :: int)::ii) (( 18 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_SUM : Mstatus -> mword ty1 -> Mstatus*) + +fun update_Mstatus_SUM :: " Mstatus \<Rightarrow>(1)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_SUM (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 18 :: int)::ii) (( 18 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sstatus_SUM : Sstatus -> mword ty1 -> Sstatus*) + +(*val _get_Sstatus_SUM : Sstatus -> mword ty1*) + +(*val _set_Sstatus_SUM : register_ref regstate register_value Sstatus -> mword ty1 -> M unit*) + +(*val _get_Mstatus_MPRV : Mstatus -> mword ty1*) + +fun get_Mstatus_MPRV :: " Mstatus \<Rightarrow>(1)Word.word " where + " get_Mstatus_MPRV (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 17 :: int)::ii) (( 17 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Mstatus_MPRV : register_ref regstate register_value Mstatus -> mword ty1 -> M unit*) + +definition set_Mstatus_MPRV :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_MPRV r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 17 :: int)::ii) (( 17 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_MPRV : Mstatus -> mword ty1 -> Mstatus*) + +fun update_Mstatus_MPRV :: " Mstatus \<Rightarrow>(1)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_MPRV (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 17 :: int)::ii) (( 17 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Mstatus_XS : Mstatus -> mword ty2*) + +fun get_Mstatus_XS :: " Mstatus \<Rightarrow>(2)Word.word " where + " get_Mstatus_XS (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 16 :: int)::ii) (( 15 :: int)::ii) :: 2 Word.word))" + + +(*val _set_Mstatus_XS : register_ref regstate register_value Mstatus -> mword ty2 -> M unit*) + +definition set_Mstatus_XS :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(2)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_XS r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 16 :: int)::ii) (( 15 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_XS : Mstatus -> mword ty2 -> Mstatus*) + +fun update_Mstatus_XS :: " Mstatus \<Rightarrow>(2)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_XS (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 16 :: int)::ii) (( 15 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sstatus_XS : Sstatus -> mword ty2 -> Sstatus*) + +(*val _get_Sstatus_XS : Sstatus -> mword ty2*) + +(*val _set_Sstatus_XS : register_ref regstate register_value Sstatus -> mword ty2 -> M unit*) + +(*val _get_Mstatus_FS : Mstatus -> mword ty2*) + +fun get_Mstatus_FS :: " Mstatus \<Rightarrow>(2)Word.word " where + " get_Mstatus_FS (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 14 :: int)::ii) (( 13 :: int)::ii) :: 2 Word.word))" + + +(*val _set_Mstatus_FS : register_ref regstate register_value Mstatus -> mword ty2 -> M unit*) + +definition set_Mstatus_FS :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(2)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_FS r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 14 :: int)::ii) (( 13 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_FS : Mstatus -> mword ty2 -> Mstatus*) + +fun update_Mstatus_FS :: " Mstatus \<Rightarrow>(2)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_FS (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 14 :: int)::ii) (( 13 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sstatus_FS : Sstatus -> mword ty2 -> Sstatus*) + +(*val _get_Sstatus_FS : Sstatus -> mword ty2*) + +(*val _set_Sstatus_FS : register_ref regstate register_value Sstatus -> mword ty2 -> M unit*) + +(*val _get_Mstatus_MPP : Mstatus -> mword ty2*) + +fun get_Mstatus_MPP :: " Mstatus \<Rightarrow>(2)Word.word " where + " get_Mstatus_MPP (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 12 :: int)::ii) (( 11 :: int)::ii) :: 2 Word.word))" + + +(*val _set_Mstatus_MPP : register_ref regstate register_value Mstatus -> mword ty2 -> M unit*) + +definition set_Mstatus_MPP :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(2)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_MPP r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 12 :: int)::ii) (( 11 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_MPP : Mstatus -> mword ty2 -> Mstatus*) + +fun update_Mstatus_MPP :: " Mstatus \<Rightarrow>(2)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_MPP (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 12 :: int)::ii) (( 11 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Mstatus_SPP : Mstatus -> mword ty1*) + +fun get_Mstatus_SPP :: " Mstatus \<Rightarrow>(1)Word.word " where + " get_Mstatus_SPP (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 8 :: int)::ii) (( 8 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Mstatus_SPP : register_ref regstate register_value Mstatus -> mword ty1 -> M unit*) + +definition set_Mstatus_SPP :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_SPP r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 8 :: int)::ii) (( 8 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_SPP : Mstatus -> mword ty1 -> Mstatus*) + +fun update_Mstatus_SPP :: " Mstatus \<Rightarrow>(1)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_SPP (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 8 :: int)::ii) (( 8 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sstatus_SPP : Sstatus -> mword ty1 -> Sstatus*) + +(*val _get_Sstatus_SPP : Sstatus -> mword ty1*) + +(*val _set_Sstatus_SPP : register_ref regstate register_value Sstatus -> mword ty1 -> M unit*) + +(*val _get_Mstatus_MPIE : Mstatus -> mword ty1*) + +fun get_Mstatus_MPIE :: " Mstatus \<Rightarrow>(1)Word.word " where + " get_Mstatus_MPIE (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 7 :: int)::ii) (( 7 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Mstatus_MPIE : register_ref regstate register_value Mstatus -> mword ty1 -> M unit*) + +definition set_Mstatus_MPIE :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_MPIE r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 7 :: int)::ii) (( 7 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_MPIE : Mstatus -> mword ty1 -> Mstatus*) + +fun update_Mstatus_MPIE :: " Mstatus \<Rightarrow>(1)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_MPIE (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 7 :: int)::ii) (( 7 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Mstatus_SPIE : Mstatus -> mword ty1*) + +fun get_Mstatus_SPIE :: " Mstatus \<Rightarrow>(1)Word.word " where + " get_Mstatus_SPIE (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 5 :: int)::ii) (( 5 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Mstatus_SPIE : register_ref regstate register_value Mstatus -> mword ty1 -> M unit*) + +definition set_Mstatus_SPIE :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_SPIE r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 5 :: int)::ii) (( 5 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_SPIE : Mstatus -> mword ty1 -> Mstatus*) + +fun update_Mstatus_SPIE :: " Mstatus \<Rightarrow>(1)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_SPIE (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 5 :: int)::ii) (( 5 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sstatus_SPIE : Sstatus -> mword ty1 -> Sstatus*) + +(*val _get_Sstatus_SPIE : Sstatus -> mword ty1*) + +(*val _set_Sstatus_SPIE : register_ref regstate register_value Sstatus -> mword ty1 -> M unit*) + +(*val _get_Mstatus_UPIE : Mstatus -> mword ty1*) + +fun get_Mstatus_UPIE :: " Mstatus \<Rightarrow>(1)Word.word " where + " get_Mstatus_UPIE (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 4 :: int)::ii) (( 4 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Mstatus_UPIE : register_ref regstate register_value Mstatus -> mword ty1 -> M unit*) + +definition set_Mstatus_UPIE :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_UPIE r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 4 :: int)::ii) (( 4 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_UPIE : Mstatus -> mword ty1 -> Mstatus*) + +fun update_Mstatus_UPIE :: " Mstatus \<Rightarrow>(1)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_UPIE (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 4 :: int)::ii) (( 4 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sstatus_UPIE : Sstatus -> mword ty1 -> Sstatus*) + +(*val _get_Sstatus_UPIE : Sstatus -> mword ty1*) + +(*val _set_Sstatus_UPIE : register_ref regstate register_value Sstatus -> mword ty1 -> M unit*) + +(*val _get_Mstatus_MIE : Mstatus -> mword ty1*) + +fun get_Mstatus_MIE :: " Mstatus \<Rightarrow>(1)Word.word " where + " get_Mstatus_MIE (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 3 :: int)::ii) (( 3 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Mstatus_MIE : register_ref regstate register_value Mstatus -> mword ty1 -> M unit*) + +definition set_Mstatus_MIE :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_MIE r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 3 :: int)::ii) (( 3 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_MIE : Mstatus -> mword ty1 -> Mstatus*) + +fun update_Mstatus_MIE :: " Mstatus \<Rightarrow>(1)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_MIE (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 3 :: int)::ii) (( 3 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Mstatus_SIE : Mstatus -> mword ty1*) + +fun get_Mstatus_SIE :: " Mstatus \<Rightarrow>(1)Word.word " where + " get_Mstatus_SIE (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 1 :: int)::ii) (( 1 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Mstatus_SIE : register_ref regstate register_value Mstatus -> mword ty1 -> M unit*) + +definition set_Mstatus_SIE :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_SIE r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 1 :: int)::ii) (( 1 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_SIE : Mstatus -> mword ty1 -> Mstatus*) + +fun update_Mstatus_SIE :: " Mstatus \<Rightarrow>(1)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_SIE (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 1 :: int)::ii) (( 1 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sstatus_SIE : Sstatus -> mword ty1 -> Sstatus*) + +(*val _get_Sstatus_SIE : Sstatus -> mword ty1*) + +(*val _set_Sstatus_SIE : register_ref regstate register_value Sstatus -> mword ty1 -> M unit*) + +(*val _get_Mstatus_UIE : Mstatus -> mword ty1*) + +fun get_Mstatus_UIE :: " Mstatus \<Rightarrow>(1)Word.word " where + " get_Mstatus_UIE (Mk_Mstatus (v)) = ( (subrange_vec_dec v (( 0 :: int)::ii) (( 0 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Mstatus_UIE : register_ref regstate register_value Mstatus -> mword ty1 -> M unit*) + +definition set_Mstatus_UIE :: "((regstate),(register_value),(Mstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mstatus_UIE r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let r = ((get_Mstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 0 :: int)::ii) (( 0 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mstatus r)))))" + + +(*val _update_Mstatus_UIE : Mstatus -> mword ty1 -> Mstatus*) + +fun update_Mstatus_UIE :: " Mstatus \<Rightarrow>(1)Word.word \<Rightarrow> Mstatus " where + " update_Mstatus_UIE (Mk_Mstatus (v)) x = ( + Mk_Mstatus ((update_subrange_vec_dec v (( 0 :: int)::ii) (( 0 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sstatus_UIE : Sstatus -> mword ty1 -> Sstatus*) + +(*val _get_Sstatus_UIE : Sstatus -> mword ty1*) + +(*val _set_Sstatus_UIE : register_ref regstate register_value Sstatus -> mword ty1 -> M unit*) + +(*val legalize_mstatus : Mstatus -> mword ty64 -> Mstatus*) + +definition legalize_mstatus :: " Mstatus \<Rightarrow>(64)Word.word \<Rightarrow> Mstatus " where + " legalize_mstatus (o1 :: Mstatus) (v :: xlenbits) = ( + (let (m :: Mstatus) = (Mk_Mstatus v) in + (let m = (update_Mstatus_XS m ((extStatus_to_bits Off :: 2 Word.word))) in + (let m = + (update_Mstatus_SD m + ((bool_to_bits + ((((((((extStatus_to_bits ((extStatus_of_bits ((get_Mstatus_FS m :: 2 Word.word)))) + :: 2 Word.word)) = ((extStatus_to_bits Dirty :: 2 Word.word))))) \<or> (((((extStatus_to_bits ((extStatus_of_bits ((get_Mstatus_XS m :: 2 Word.word)))) + :: 2 Word.word)) = ((extStatus_to_bits Dirty :: 2 Word.word)))))))) + :: 1 Word.word))) in + (let m = (update_Mstatus_SXL m ((get_Mstatus_SXL o1 :: 2 Word.word))) in + (let m = (update_Mstatus_UXL m ((get_Mstatus_UXL o1 :: 2 Word.word))) in + (let m = (update_Mstatus_UPIE m ((bool_to_bits False :: 1 Word.word))) in + update_Mstatus_UIE m ((bool_to_bits False :: 1 Word.word)))))))))" + + +(*val cur_Architecture : unit -> M Architecture*) + +definition cur_Architecture :: " unit \<Rightarrow>((register_value),(Architecture),(exception))monad " where + " cur_Architecture _ = ( + read_reg cur_privilege_ref \<bind> (\<lambda> (w__0 :: Privilege) . + (case w__0 of + Machine => + read_reg misa_ref \<bind> (\<lambda> (w__1 :: Misa) . return ((get_Misa_MXL w__1 :: 2 Word.word))) + | Supervisor => + read_reg mstatus_ref \<bind> (\<lambda> (w__2 :: Mstatus) . return ((get_Mstatus_SXL w__2 :: 2 Word.word))) + | User => + read_reg mstatus_ref \<bind> (\<lambda> (w__3 :: Mstatus) . return ((get_Mstatus_UXL w__3 :: 2 Word.word))) + ) \<bind> (\<lambda> (a :: arch_xlen) . + (case ((architecture a)) of + Some (a) => return a + | None => internal_error (''Invalid current architecture'') + ))))" + + +(*val in32BitMode : unit -> M bool*) + +definition in32BitMode :: " unit \<Rightarrow>((register_value),(bool),(exception))monad " where + " in32BitMode _ = ( cur_Architecture () \<bind> (\<lambda> (w__0 :: Architecture) . return (((w__0 = RV32)))))" + + +(*val haveAtomics : unit -> M bool*) + +definition haveAtomics :: " unit \<Rightarrow>((register_value),(bool),(exception))monad " where + " haveAtomics _ = ( + read_reg misa_ref \<bind> (\<lambda> (w__0 :: Misa) . + return (((((get_Misa_A w__0 :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word)))))))" + + +(*val haveRVC : unit -> M bool*) + +definition haveRVC :: " unit \<Rightarrow>((register_value),(bool),(exception))monad " where + " haveRVC _ = ( + read_reg misa_ref \<bind> (\<lambda> (w__0 :: Misa) . + return (((((get_Misa_C w__0 :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word)))))))" + + +(*val haveMulDiv : unit -> M bool*) + +definition haveMulDiv :: " unit \<Rightarrow>((register_value),(bool),(exception))monad " where + " haveMulDiv _ = ( + read_reg misa_ref \<bind> (\<lambda> (w__0 :: Misa) . + return (((((get_Misa_M w__0 :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word)))))))" + + +(*val haveFP : unit -> M bool*) + +definition haveFP :: " unit \<Rightarrow>((register_value),(bool),(exception))monad " where + " haveFP _ = ( + or_boolM + (read_reg misa_ref \<bind> (\<lambda> (w__0 :: Misa) . + return (((((get_Misa_F w__0 :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))))) + (read_reg misa_ref \<bind> (\<lambda> (w__1 :: Misa) . + return (((((get_Misa_D w__1 :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))))))" + + +(*val _get_Minterrupts : Minterrupts -> mword ty64*) + +fun get_Minterrupts :: " Minterrupts \<Rightarrow>(64)Word.word " where + " get_Minterrupts (Mk_Minterrupts (v)) = ( v )" + + +(*val _set_Minterrupts : register_ref regstate register_value Minterrupts -> mword ty64 -> M unit*) + +definition set_Minterrupts :: "((regstate),(register_value),(Minterrupts))register_ref \<Rightarrow>(64)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Minterrupts r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> r . + (let r = (Mk_Minterrupts v) in + write_reg r_ref r)))" + + +(*val _get_Minterrupts_MEI : Minterrupts -> mword ty1*) + +fun get_Minterrupts_MEI :: " Minterrupts \<Rightarrow>(1)Word.word " where + " get_Minterrupts_MEI (Mk_Minterrupts (v)) = ( (subrange_vec_dec v (( 11 :: int)::ii) (( 11 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Minterrupts_MEI : register_ref regstate register_value Minterrupts -> mword ty1 -> M unit*) + +definition set_Minterrupts_MEI :: "((regstate),(register_value),(Minterrupts))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Minterrupts_MEI r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Minterrupts) . + (let r = ((get_Minterrupts w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 11 :: int)::ii) (( 11 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Minterrupts r)))))" + + +(*val _update_Minterrupts_MEI : Minterrupts -> mword ty1 -> Minterrupts*) + +fun update_Minterrupts_MEI :: " Minterrupts \<Rightarrow>(1)Word.word \<Rightarrow> Minterrupts " where + " update_Minterrupts_MEI (Mk_Minterrupts (v)) x = ( + Mk_Minterrupts ((update_subrange_vec_dec v (( 11 :: int)::ii) (( 11 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Minterrupts_SEI : Minterrupts -> mword ty1*) + +fun get_Minterrupts_SEI :: " Minterrupts \<Rightarrow>(1)Word.word " where + " get_Minterrupts_SEI (Mk_Minterrupts (v)) = ( (subrange_vec_dec v (( 9 :: int)::ii) (( 9 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Minterrupts_SEI : register_ref regstate register_value Minterrupts -> mword ty1 -> M unit*) + +definition set_Minterrupts_SEI :: "((regstate),(register_value),(Minterrupts))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Minterrupts_SEI r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Minterrupts) . + (let r = ((get_Minterrupts w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 9 :: int)::ii) (( 9 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Minterrupts r)))))" + + +(*val _update_Minterrupts_SEI : Minterrupts -> mword ty1 -> Minterrupts*) + +fun update_Minterrupts_SEI :: " Minterrupts \<Rightarrow>(1)Word.word \<Rightarrow> Minterrupts " where + " update_Minterrupts_SEI (Mk_Minterrupts (v)) x = ( + Mk_Minterrupts ((update_subrange_vec_dec v (( 9 :: int)::ii) (( 9 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sinterrupts_SEI : Sinterrupts -> mword ty1 -> Sinterrupts*) + +(*val _get_Sinterrupts_SEI : Sinterrupts -> mword ty1*) + +(*val _set_Sinterrupts_SEI : register_ref regstate register_value Sinterrupts -> mword ty1 -> M unit*) + +(*val _get_Minterrupts_UEI : Minterrupts -> mword ty1*) + +fun get_Minterrupts_UEI :: " Minterrupts \<Rightarrow>(1)Word.word " where + " get_Minterrupts_UEI (Mk_Minterrupts (v)) = ( (subrange_vec_dec v (( 8 :: int)::ii) (( 8 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Minterrupts_UEI : register_ref regstate register_value Minterrupts -> mword ty1 -> M unit*) + +definition set_Minterrupts_UEI :: "((regstate),(register_value),(Minterrupts))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Minterrupts_UEI r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Minterrupts) . + (let r = ((get_Minterrupts w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 8 :: int)::ii) (( 8 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Minterrupts r)))))" + + +(*val _update_Minterrupts_UEI : Minterrupts -> mword ty1 -> Minterrupts*) + +fun update_Minterrupts_UEI :: " Minterrupts \<Rightarrow>(1)Word.word \<Rightarrow> Minterrupts " where + " update_Minterrupts_UEI (Mk_Minterrupts (v)) x = ( + Mk_Minterrupts ((update_subrange_vec_dec v (( 8 :: int)::ii) (( 8 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sinterrupts_UEI : Sinterrupts -> mword ty1 -> Sinterrupts*) + +(*val _get_Sinterrupts_UEI : Sinterrupts -> mword ty1*) + +(*val _set_Sinterrupts_UEI : register_ref regstate register_value Sinterrupts -> mword ty1 -> M unit*) + +(*val _get_Minterrupts_MTI : Minterrupts -> mword ty1*) + +fun get_Minterrupts_MTI :: " Minterrupts \<Rightarrow>(1)Word.word " where + " get_Minterrupts_MTI (Mk_Minterrupts (v)) = ( (subrange_vec_dec v (( 7 :: int)::ii) (( 7 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Minterrupts_MTI : register_ref regstate register_value Minterrupts -> mword ty1 -> M unit*) + +definition set_Minterrupts_MTI :: "((regstate),(register_value),(Minterrupts))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Minterrupts_MTI r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Minterrupts) . + (let r = ((get_Minterrupts w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 7 :: int)::ii) (( 7 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Minterrupts r)))))" + + +(*val _update_Minterrupts_MTI : Minterrupts -> mword ty1 -> Minterrupts*) + +fun update_Minterrupts_MTI :: " Minterrupts \<Rightarrow>(1)Word.word \<Rightarrow> Minterrupts " where + " update_Minterrupts_MTI (Mk_Minterrupts (v)) x = ( + Mk_Minterrupts ((update_subrange_vec_dec v (( 7 :: int)::ii) (( 7 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Minterrupts_STI : Minterrupts -> mword ty1*) + +fun get_Minterrupts_STI :: " Minterrupts \<Rightarrow>(1)Word.word " where + " get_Minterrupts_STI (Mk_Minterrupts (v)) = ( (subrange_vec_dec v (( 5 :: int)::ii) (( 5 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Minterrupts_STI : register_ref regstate register_value Minterrupts -> mword ty1 -> M unit*) + +definition set_Minterrupts_STI :: "((regstate),(register_value),(Minterrupts))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Minterrupts_STI r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Minterrupts) . + (let r = ((get_Minterrupts w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 5 :: int)::ii) (( 5 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Minterrupts r)))))" + + +(*val _update_Minterrupts_STI : Minterrupts -> mword ty1 -> Minterrupts*) + +fun update_Minterrupts_STI :: " Minterrupts \<Rightarrow>(1)Word.word \<Rightarrow> Minterrupts " where + " update_Minterrupts_STI (Mk_Minterrupts (v)) x = ( + Mk_Minterrupts ((update_subrange_vec_dec v (( 5 :: int)::ii) (( 5 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sinterrupts_STI : Sinterrupts -> mword ty1 -> Sinterrupts*) + +(*val _get_Sinterrupts_STI : Sinterrupts -> mword ty1*) + +(*val _set_Sinterrupts_STI : register_ref regstate register_value Sinterrupts -> mword ty1 -> M unit*) + +(*val _get_Minterrupts_UTI : Minterrupts -> mword ty1*) + +fun get_Minterrupts_UTI :: " Minterrupts \<Rightarrow>(1)Word.word " where + " get_Minterrupts_UTI (Mk_Minterrupts (v)) = ( (subrange_vec_dec v (( 4 :: int)::ii) (( 4 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Minterrupts_UTI : register_ref regstate register_value Minterrupts -> mword ty1 -> M unit*) + +definition set_Minterrupts_UTI :: "((regstate),(register_value),(Minterrupts))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Minterrupts_UTI r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Minterrupts) . + (let r = ((get_Minterrupts w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 4 :: int)::ii) (( 4 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Minterrupts r)))))" + + +(*val _update_Minterrupts_UTI : Minterrupts -> mword ty1 -> Minterrupts*) + +fun update_Minterrupts_UTI :: " Minterrupts \<Rightarrow>(1)Word.word \<Rightarrow> Minterrupts " where + " update_Minterrupts_UTI (Mk_Minterrupts (v)) x = ( + Mk_Minterrupts ((update_subrange_vec_dec v (( 4 :: int)::ii) (( 4 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sinterrupts_UTI : Sinterrupts -> mword ty1 -> Sinterrupts*) + +(*val _get_Sinterrupts_UTI : Sinterrupts -> mword ty1*) + +(*val _set_Sinterrupts_UTI : register_ref regstate register_value Sinterrupts -> mword ty1 -> M unit*) + +(*val _get_Minterrupts_MSI : Minterrupts -> mword ty1*) + +fun get_Minterrupts_MSI :: " Minterrupts \<Rightarrow>(1)Word.word " where + " get_Minterrupts_MSI (Mk_Minterrupts (v)) = ( (subrange_vec_dec v (( 3 :: int)::ii) (( 3 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Minterrupts_MSI : register_ref regstate register_value Minterrupts -> mword ty1 -> M unit*) + +definition set_Minterrupts_MSI :: "((regstate),(register_value),(Minterrupts))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Minterrupts_MSI r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Minterrupts) . + (let r = ((get_Minterrupts w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 3 :: int)::ii) (( 3 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Minterrupts r)))))" + + +(*val _update_Minterrupts_MSI : Minterrupts -> mword ty1 -> Minterrupts*) + +fun update_Minterrupts_MSI :: " Minterrupts \<Rightarrow>(1)Word.word \<Rightarrow> Minterrupts " where + " update_Minterrupts_MSI (Mk_Minterrupts (v)) x = ( + Mk_Minterrupts ((update_subrange_vec_dec v (( 3 :: int)::ii) (( 3 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Minterrupts_SSI : Minterrupts -> mword ty1*) + +fun get_Minterrupts_SSI :: " Minterrupts \<Rightarrow>(1)Word.word " where + " get_Minterrupts_SSI (Mk_Minterrupts (v)) = ( (subrange_vec_dec v (( 1 :: int)::ii) (( 1 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Minterrupts_SSI : register_ref regstate register_value Minterrupts -> mword ty1 -> M unit*) + +definition set_Minterrupts_SSI :: "((regstate),(register_value),(Minterrupts))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Minterrupts_SSI r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Minterrupts) . + (let r = ((get_Minterrupts w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 1 :: int)::ii) (( 1 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Minterrupts r)))))" + + +(*val _update_Minterrupts_SSI : Minterrupts -> mword ty1 -> Minterrupts*) + +fun update_Minterrupts_SSI :: " Minterrupts \<Rightarrow>(1)Word.word \<Rightarrow> Minterrupts " where + " update_Minterrupts_SSI (Mk_Minterrupts (v)) x = ( + Mk_Minterrupts ((update_subrange_vec_dec v (( 1 :: int)::ii) (( 1 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sinterrupts_SSI : Sinterrupts -> mword ty1 -> Sinterrupts*) + +(*val _get_Sinterrupts_SSI : Sinterrupts -> mword ty1*) + +(*val _set_Sinterrupts_SSI : register_ref regstate register_value Sinterrupts -> mword ty1 -> M unit*) + +(*val _get_Minterrupts_USI : Minterrupts -> mword ty1*) + +fun get_Minterrupts_USI :: " Minterrupts \<Rightarrow>(1)Word.word " where + " get_Minterrupts_USI (Mk_Minterrupts (v)) = ( (subrange_vec_dec v (( 0 :: int)::ii) (( 0 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Minterrupts_USI : register_ref regstate register_value Minterrupts -> mword ty1 -> M unit*) + +definition set_Minterrupts_USI :: "((regstate),(register_value),(Minterrupts))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Minterrupts_USI r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Minterrupts) . + (let r = ((get_Minterrupts w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 0 :: int)::ii) (( 0 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Minterrupts r)))))" + + +(*val _update_Minterrupts_USI : Minterrupts -> mword ty1 -> Minterrupts*) + +fun update_Minterrupts_USI :: " Minterrupts \<Rightarrow>(1)Word.word \<Rightarrow> Minterrupts " where + " update_Minterrupts_USI (Mk_Minterrupts (v)) x = ( + Mk_Minterrupts ((update_subrange_vec_dec v (( 0 :: int)::ii) (( 0 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sinterrupts_USI : Sinterrupts -> mword ty1 -> Sinterrupts*) + +(*val _get_Sinterrupts_USI : Sinterrupts -> mword ty1*) + +(*val _set_Sinterrupts_USI : register_ref regstate register_value Sinterrupts -> mword ty1 -> M unit*) + +(*val legalize_mip : Minterrupts -> mword ty64 -> Minterrupts*) + +definition legalize_mip :: " Minterrupts \<Rightarrow>(64)Word.word \<Rightarrow> Minterrupts " where + " legalize_mip (o1 :: Minterrupts) (v :: xlenbits) = ( + (let v = (Mk_Minterrupts v) in + (let m = (update_Minterrupts_SEI o1 ((get_Minterrupts_SEI v :: 1 Word.word))) in + (let m = (update_Minterrupts_STI m ((get_Minterrupts_STI v :: 1 Word.word))) in + update_Minterrupts_SSI m ((get_Minterrupts_SSI v :: 1 Word.word))))))" + + +(*val legalize_mie : Minterrupts -> mword ty64 -> Minterrupts*) + +definition legalize_mie :: " Minterrupts \<Rightarrow>(64)Word.word \<Rightarrow> Minterrupts " where + " legalize_mie (o1 :: Minterrupts) (v :: xlenbits) = ( + (let v = (Mk_Minterrupts v) in + (let m = (update_Minterrupts_MEI o1 ((get_Minterrupts_MEI v :: 1 Word.word))) in + (let m = (update_Minterrupts_MTI m ((get_Minterrupts_MTI v :: 1 Word.word))) in + (let m = (update_Minterrupts_MSI m ((get_Minterrupts_MSI v :: 1 Word.word))) in + (let m = (update_Minterrupts_SEI m ((get_Minterrupts_SEI v :: 1 Word.word))) in + (let m = (update_Minterrupts_STI m ((get_Minterrupts_STI v :: 1 Word.word))) in + update_Minterrupts_SSI m ((get_Minterrupts_SSI v :: 1 Word.word)))))))))" + + +(*val legalize_mideleg : Minterrupts -> mword ty64 -> Minterrupts*) + +definition legalize_mideleg :: " Minterrupts \<Rightarrow>(64)Word.word \<Rightarrow> Minterrupts " where + " legalize_mideleg (o1 :: Minterrupts) (v :: xlenbits) = ( + (let m = (Mk_Minterrupts v) in + (let m = (update_Minterrupts_MEI m ((bool_to_bits False :: 1 Word.word))) in + (let m = (update_Minterrupts_MTI m ((bool_to_bits False :: 1 Word.word))) in + update_Minterrupts_MSI m ((bool_to_bits False :: 1 Word.word))))))" + + +(*val _get_Medeleg : Medeleg -> mword ty64*) + +fun get_Medeleg :: " Medeleg \<Rightarrow>(64)Word.word " where + " get_Medeleg (Mk_Medeleg (v)) = ( v )" + + +(*val _set_Medeleg : register_ref regstate register_value Medeleg -> mword ty64 -> M unit*) + +definition set_Medeleg :: "((regstate),(register_value),(Medeleg))register_ref \<Rightarrow>(64)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Medeleg r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> r . + (let r = (Mk_Medeleg v) in + write_reg r_ref r)))" + + +(*val _get_Medeleg_SAMO_Page_Fault : Medeleg -> mword ty1*) + +fun get_Medeleg_SAMO_Page_Fault :: " Medeleg \<Rightarrow>(1)Word.word " where + " get_Medeleg_SAMO_Page_Fault (Mk_Medeleg (v)) = ( + (subrange_vec_dec v (( 15 :: int)::ii) (( 15 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Medeleg_SAMO_Page_Fault : register_ref regstate register_value Medeleg -> mword ty1 -> M unit*) + +definition set_Medeleg_SAMO_Page_Fault :: "((regstate),(register_value),(Medeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Medeleg_SAMO_Page_Fault r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Medeleg) . + (let r = ((get_Medeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 15 :: int)::ii) (( 15 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Medeleg r)))))" + + +(*val _update_Medeleg_SAMO_Page_Fault : Medeleg -> mword ty1 -> Medeleg*) + +fun update_Medeleg_SAMO_Page_Fault :: " Medeleg \<Rightarrow>(1)Word.word \<Rightarrow> Medeleg " where + " update_Medeleg_SAMO_Page_Fault (Mk_Medeleg (v)) x = ( + Mk_Medeleg ((update_subrange_vec_dec v (( 15 :: int)::ii) (( 15 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Medeleg_Load_Page_Fault : Medeleg -> mword ty1*) + +fun get_Medeleg_Load_Page_Fault :: " Medeleg \<Rightarrow>(1)Word.word " where + " get_Medeleg_Load_Page_Fault (Mk_Medeleg (v)) = ( + (subrange_vec_dec v (( 13 :: int)::ii) (( 13 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Medeleg_Load_Page_Fault : register_ref regstate register_value Medeleg -> mword ty1 -> M unit*) + +definition set_Medeleg_Load_Page_Fault :: "((regstate),(register_value),(Medeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Medeleg_Load_Page_Fault r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Medeleg) . + (let r = ((get_Medeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 13 :: int)::ii) (( 13 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Medeleg r)))))" + + +(*val _update_Medeleg_Load_Page_Fault : Medeleg -> mword ty1 -> Medeleg*) + +fun update_Medeleg_Load_Page_Fault :: " Medeleg \<Rightarrow>(1)Word.word \<Rightarrow> Medeleg " where + " update_Medeleg_Load_Page_Fault (Mk_Medeleg (v)) x = ( + Mk_Medeleg ((update_subrange_vec_dec v (( 13 :: int)::ii) (( 13 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Medeleg_Fetch_Page_Fault : Medeleg -> mword ty1*) + +fun get_Medeleg_Fetch_Page_Fault :: " Medeleg \<Rightarrow>(1)Word.word " where + " get_Medeleg_Fetch_Page_Fault (Mk_Medeleg (v)) = ( + (subrange_vec_dec v (( 12 :: int)::ii) (( 12 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Medeleg_Fetch_Page_Fault : register_ref regstate register_value Medeleg -> mword ty1 -> M unit*) + +definition set_Medeleg_Fetch_Page_Fault :: "((regstate),(register_value),(Medeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Medeleg_Fetch_Page_Fault r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Medeleg) . + (let r = ((get_Medeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 12 :: int)::ii) (( 12 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Medeleg r)))))" + + +(*val _update_Medeleg_Fetch_Page_Fault : Medeleg -> mword ty1 -> Medeleg*) + +fun update_Medeleg_Fetch_Page_Fault :: " Medeleg \<Rightarrow>(1)Word.word \<Rightarrow> Medeleg " where + " update_Medeleg_Fetch_Page_Fault (Mk_Medeleg (v)) x = ( + Mk_Medeleg ((update_subrange_vec_dec v (( 12 :: int)::ii) (( 12 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Medeleg_MEnvCall : Medeleg -> mword ty1*) + +fun get_Medeleg_MEnvCall :: " Medeleg \<Rightarrow>(1)Word.word " where + " get_Medeleg_MEnvCall (Mk_Medeleg (v)) = ( (subrange_vec_dec v (( 10 :: int)::ii) (( 10 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Medeleg_MEnvCall : register_ref regstate register_value Medeleg -> mword ty1 -> M unit*) + +definition set_Medeleg_MEnvCall :: "((regstate),(register_value),(Medeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Medeleg_MEnvCall r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Medeleg) . + (let r = ((get_Medeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 10 :: int)::ii) (( 10 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Medeleg r)))))" + + +(*val _update_Medeleg_MEnvCall : Medeleg -> mword ty1 -> Medeleg*) + +fun update_Medeleg_MEnvCall :: " Medeleg \<Rightarrow>(1)Word.word \<Rightarrow> Medeleg " where + " update_Medeleg_MEnvCall (Mk_Medeleg (v)) x = ( + Mk_Medeleg ((update_subrange_vec_dec v (( 10 :: int)::ii) (( 10 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Medeleg_SEnvCall : Medeleg -> mword ty1*) + +fun get_Medeleg_SEnvCall :: " Medeleg \<Rightarrow>(1)Word.word " where + " get_Medeleg_SEnvCall (Mk_Medeleg (v)) = ( (subrange_vec_dec v (( 9 :: int)::ii) (( 9 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Medeleg_SEnvCall : register_ref regstate register_value Medeleg -> mword ty1 -> M unit*) + +definition set_Medeleg_SEnvCall :: "((regstate),(register_value),(Medeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Medeleg_SEnvCall r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Medeleg) . + (let r = ((get_Medeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 9 :: int)::ii) (( 9 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Medeleg r)))))" + + +(*val _update_Medeleg_SEnvCall : Medeleg -> mword ty1 -> Medeleg*) + +fun update_Medeleg_SEnvCall :: " Medeleg \<Rightarrow>(1)Word.word \<Rightarrow> Medeleg " where + " update_Medeleg_SEnvCall (Mk_Medeleg (v)) x = ( + Mk_Medeleg ((update_subrange_vec_dec v (( 9 :: int)::ii) (( 9 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Medeleg_UEnvCall : Medeleg -> mword ty1*) + +fun get_Medeleg_UEnvCall :: " Medeleg \<Rightarrow>(1)Word.word " where + " get_Medeleg_UEnvCall (Mk_Medeleg (v)) = ( (subrange_vec_dec v (( 8 :: int)::ii) (( 8 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Medeleg_UEnvCall : register_ref regstate register_value Medeleg -> mword ty1 -> M unit*) + +definition set_Medeleg_UEnvCall :: "((regstate),(register_value),(Medeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Medeleg_UEnvCall r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Medeleg) . + (let r = ((get_Medeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 8 :: int)::ii) (( 8 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Medeleg r)))))" + + +(*val _update_Medeleg_UEnvCall : Medeleg -> mword ty1 -> Medeleg*) + +fun update_Medeleg_UEnvCall :: " Medeleg \<Rightarrow>(1)Word.word \<Rightarrow> Medeleg " where + " update_Medeleg_UEnvCall (Mk_Medeleg (v)) x = ( + Mk_Medeleg ((update_subrange_vec_dec v (( 8 :: int)::ii) (( 8 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sedeleg_UEnvCall : Sedeleg -> mword ty1 -> Sedeleg*) + +(*val _get_Sedeleg_UEnvCall : Sedeleg -> mword ty1*) + +(*val _set_Sedeleg_UEnvCall : register_ref regstate register_value Sedeleg -> mword ty1 -> M unit*) + +(*val _get_Medeleg_SAMO_Access_Fault : Medeleg -> mword ty1*) + +fun get_Medeleg_SAMO_Access_Fault :: " Medeleg \<Rightarrow>(1)Word.word " where + " get_Medeleg_SAMO_Access_Fault (Mk_Medeleg (v)) = ( + (subrange_vec_dec v (( 7 :: int)::ii) (( 7 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Medeleg_SAMO_Access_Fault : register_ref regstate register_value Medeleg -> mword ty1 -> M unit*) + +definition set_Medeleg_SAMO_Access_Fault :: "((regstate),(register_value),(Medeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Medeleg_SAMO_Access_Fault r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Medeleg) . + (let r = ((get_Medeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 7 :: int)::ii) (( 7 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Medeleg r)))))" + + +(*val _update_Medeleg_SAMO_Access_Fault : Medeleg -> mword ty1 -> Medeleg*) + +fun update_Medeleg_SAMO_Access_Fault :: " Medeleg \<Rightarrow>(1)Word.word \<Rightarrow> Medeleg " where + " update_Medeleg_SAMO_Access_Fault (Mk_Medeleg (v)) x = ( + Mk_Medeleg ((update_subrange_vec_dec v (( 7 :: int)::ii) (( 7 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sedeleg_SAMO_Access_Fault : Sedeleg -> mword ty1 -> Sedeleg*) + +(*val _get_Sedeleg_SAMO_Access_Fault : Sedeleg -> mword ty1*) + +(*val _set_Sedeleg_SAMO_Access_Fault : register_ref regstate register_value Sedeleg -> mword ty1 -> M unit*) + +(*val _get_Medeleg_SAMO_Addr_Align : Medeleg -> mword ty1*) + +fun get_Medeleg_SAMO_Addr_Align :: " Medeleg \<Rightarrow>(1)Word.word " where + " get_Medeleg_SAMO_Addr_Align (Mk_Medeleg (v)) = ( (subrange_vec_dec v (( 6 :: int)::ii) (( 6 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Medeleg_SAMO_Addr_Align : register_ref regstate register_value Medeleg -> mword ty1 -> M unit*) + +definition set_Medeleg_SAMO_Addr_Align :: "((regstate),(register_value),(Medeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Medeleg_SAMO_Addr_Align r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Medeleg) . + (let r = ((get_Medeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 6 :: int)::ii) (( 6 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Medeleg r)))))" + + +(*val _update_Medeleg_SAMO_Addr_Align : Medeleg -> mword ty1 -> Medeleg*) + +fun update_Medeleg_SAMO_Addr_Align :: " Medeleg \<Rightarrow>(1)Word.word \<Rightarrow> Medeleg " where + " update_Medeleg_SAMO_Addr_Align (Mk_Medeleg (v)) x = ( + Mk_Medeleg ((update_subrange_vec_dec v (( 6 :: int)::ii) (( 6 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sedeleg_SAMO_Addr_Align : Sedeleg -> mword ty1 -> Sedeleg*) + +(*val _get_Sedeleg_SAMO_Addr_Align : Sedeleg -> mword ty1*) + +(*val _set_Sedeleg_SAMO_Addr_Align : register_ref regstate register_value Sedeleg -> mword ty1 -> M unit*) + +(*val _get_Medeleg_Load_Access_Fault : Medeleg -> mword ty1*) + +fun get_Medeleg_Load_Access_Fault :: " Medeleg \<Rightarrow>(1)Word.word " where + " get_Medeleg_Load_Access_Fault (Mk_Medeleg (v)) = ( + (subrange_vec_dec v (( 5 :: int)::ii) (( 5 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Medeleg_Load_Access_Fault : register_ref regstate register_value Medeleg -> mword ty1 -> M unit*) + +definition set_Medeleg_Load_Access_Fault :: "((regstate),(register_value),(Medeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Medeleg_Load_Access_Fault r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Medeleg) . + (let r = ((get_Medeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 5 :: int)::ii) (( 5 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Medeleg r)))))" + + +(*val _update_Medeleg_Load_Access_Fault : Medeleg -> mword ty1 -> Medeleg*) + +fun update_Medeleg_Load_Access_Fault :: " Medeleg \<Rightarrow>(1)Word.word \<Rightarrow> Medeleg " where + " update_Medeleg_Load_Access_Fault (Mk_Medeleg (v)) x = ( + Mk_Medeleg ((update_subrange_vec_dec v (( 5 :: int)::ii) (( 5 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sedeleg_Load_Access_Fault : Sedeleg -> mword ty1 -> Sedeleg*) + +(*val _get_Sedeleg_Load_Access_Fault : Sedeleg -> mword ty1*) + +(*val _set_Sedeleg_Load_Access_Fault : register_ref regstate register_value Sedeleg -> mword ty1 -> M unit*) + +(*val _get_Medeleg_Load_Addr_Align : Medeleg -> mword ty1*) + +fun get_Medeleg_Load_Addr_Align :: " Medeleg \<Rightarrow>(1)Word.word " where + " get_Medeleg_Load_Addr_Align (Mk_Medeleg (v)) = ( (subrange_vec_dec v (( 4 :: int)::ii) (( 4 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Medeleg_Load_Addr_Align : register_ref regstate register_value Medeleg -> mword ty1 -> M unit*) + +definition set_Medeleg_Load_Addr_Align :: "((regstate),(register_value),(Medeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Medeleg_Load_Addr_Align r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Medeleg) . + (let r = ((get_Medeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 4 :: int)::ii) (( 4 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Medeleg r)))))" + + +(*val _update_Medeleg_Load_Addr_Align : Medeleg -> mword ty1 -> Medeleg*) + +fun update_Medeleg_Load_Addr_Align :: " Medeleg \<Rightarrow>(1)Word.word \<Rightarrow> Medeleg " where + " update_Medeleg_Load_Addr_Align (Mk_Medeleg (v)) x = ( + Mk_Medeleg ((update_subrange_vec_dec v (( 4 :: int)::ii) (( 4 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sedeleg_Load_Addr_Align : Sedeleg -> mword ty1 -> Sedeleg*) + +(*val _get_Sedeleg_Load_Addr_Align : Sedeleg -> mword ty1*) + +(*val _set_Sedeleg_Load_Addr_Align : register_ref regstate register_value Sedeleg -> mword ty1 -> M unit*) + +(*val _get_Medeleg_Breakpoint : Medeleg -> mword ty1*) + +fun get_Medeleg_Breakpoint :: " Medeleg \<Rightarrow>(1)Word.word " where + " get_Medeleg_Breakpoint (Mk_Medeleg (v)) = ( (subrange_vec_dec v (( 3 :: int)::ii) (( 3 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Medeleg_Breakpoint : register_ref regstate register_value Medeleg -> mword ty1 -> M unit*) + +definition set_Medeleg_Breakpoint :: "((regstate),(register_value),(Medeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Medeleg_Breakpoint r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Medeleg) . + (let r = ((get_Medeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 3 :: int)::ii) (( 3 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Medeleg r)))))" + + +(*val _update_Medeleg_Breakpoint : Medeleg -> mword ty1 -> Medeleg*) + +fun update_Medeleg_Breakpoint :: " Medeleg \<Rightarrow>(1)Word.word \<Rightarrow> Medeleg " where + " update_Medeleg_Breakpoint (Mk_Medeleg (v)) x = ( + Mk_Medeleg ((update_subrange_vec_dec v (( 3 :: int)::ii) (( 3 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sedeleg_Breakpoint : Sedeleg -> mword ty1 -> Sedeleg*) + +(*val _get_Sedeleg_Breakpoint : Sedeleg -> mword ty1*) + +(*val _set_Sedeleg_Breakpoint : register_ref regstate register_value Sedeleg -> mword ty1 -> M unit*) + +(*val _get_Medeleg_Illegal_Instr : Medeleg -> mword ty1*) + +fun get_Medeleg_Illegal_Instr :: " Medeleg \<Rightarrow>(1)Word.word " where + " get_Medeleg_Illegal_Instr (Mk_Medeleg (v)) = ( (subrange_vec_dec v (( 2 :: int)::ii) (( 2 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Medeleg_Illegal_Instr : register_ref regstate register_value Medeleg -> mword ty1 -> M unit*) + +definition set_Medeleg_Illegal_Instr :: "((regstate),(register_value),(Medeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Medeleg_Illegal_Instr r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Medeleg) . + (let r = ((get_Medeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 2 :: int)::ii) (( 2 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Medeleg r)))))" + + +(*val _update_Medeleg_Illegal_Instr : Medeleg -> mword ty1 -> Medeleg*) + +fun update_Medeleg_Illegal_Instr :: " Medeleg \<Rightarrow>(1)Word.word \<Rightarrow> Medeleg " where + " update_Medeleg_Illegal_Instr (Mk_Medeleg (v)) x = ( + Mk_Medeleg ((update_subrange_vec_dec v (( 2 :: int)::ii) (( 2 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sedeleg_Illegal_Instr : Sedeleg -> mword ty1 -> Sedeleg*) + +(*val _get_Sedeleg_Illegal_Instr : Sedeleg -> mword ty1*) + +(*val _set_Sedeleg_Illegal_Instr : register_ref regstate register_value Sedeleg -> mword ty1 -> M unit*) + +(*val _get_Medeleg_Fetch_Access_Fault : Medeleg -> mword ty1*) + +fun get_Medeleg_Fetch_Access_Fault :: " Medeleg \<Rightarrow>(1)Word.word " where + " get_Medeleg_Fetch_Access_Fault (Mk_Medeleg (v)) = ( + (subrange_vec_dec v (( 1 :: int)::ii) (( 1 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Medeleg_Fetch_Access_Fault : register_ref regstate register_value Medeleg -> mword ty1 -> M unit*) + +definition set_Medeleg_Fetch_Access_Fault :: "((regstate),(register_value),(Medeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Medeleg_Fetch_Access_Fault r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Medeleg) . + (let r = ((get_Medeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 1 :: int)::ii) (( 1 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Medeleg r)))))" + + +(*val _update_Medeleg_Fetch_Access_Fault : Medeleg -> mword ty1 -> Medeleg*) + +fun update_Medeleg_Fetch_Access_Fault :: " Medeleg \<Rightarrow>(1)Word.word \<Rightarrow> Medeleg " where + " update_Medeleg_Fetch_Access_Fault (Mk_Medeleg (v)) x = ( + Mk_Medeleg ((update_subrange_vec_dec v (( 1 :: int)::ii) (( 1 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sedeleg_Fetch_Access_Fault : Sedeleg -> mword ty1 -> Sedeleg*) + +(*val _get_Sedeleg_Fetch_Access_Fault : Sedeleg -> mword ty1*) + +(*val _set_Sedeleg_Fetch_Access_Fault : register_ref regstate register_value Sedeleg -> mword ty1 -> M unit*) + +(*val _get_Medeleg_Fetch_Addr_Align : Medeleg -> mword ty1*) + +fun get_Medeleg_Fetch_Addr_Align :: " Medeleg \<Rightarrow>(1)Word.word " where + " get_Medeleg_Fetch_Addr_Align (Mk_Medeleg (v)) = ( (subrange_vec_dec v (( 0 :: int)::ii) (( 0 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Medeleg_Fetch_Addr_Align : register_ref regstate register_value Medeleg -> mword ty1 -> M unit*) + +definition set_Medeleg_Fetch_Addr_Align :: "((regstate),(register_value),(Medeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Medeleg_Fetch_Addr_Align r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Medeleg) . + (let r = ((get_Medeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 0 :: int)::ii) (( 0 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Medeleg r)))))" + + +(*val _update_Medeleg_Fetch_Addr_Align : Medeleg -> mword ty1 -> Medeleg*) + +fun update_Medeleg_Fetch_Addr_Align :: " Medeleg \<Rightarrow>(1)Word.word \<Rightarrow> Medeleg " where + " update_Medeleg_Fetch_Addr_Align (Mk_Medeleg (v)) x = ( + Mk_Medeleg ((update_subrange_vec_dec v (( 0 :: int)::ii) (( 0 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Sedeleg_Fetch_Addr_Align : Sedeleg -> mword ty1 -> Sedeleg*) + +(*val _get_Sedeleg_Fetch_Addr_Align : Sedeleg -> mword ty1*) + +(*val _set_Sedeleg_Fetch_Addr_Align : register_ref regstate register_value Sedeleg -> mword ty1 -> M unit*) + +(*val legalize_medeleg : Medeleg -> mword ty64 -> Medeleg*) + +definition legalize_medeleg :: " Medeleg \<Rightarrow>(64)Word.word \<Rightarrow> Medeleg " where + " legalize_medeleg (o1 :: Medeleg) (v :: xlenbits) = ( + (let m = (Mk_Medeleg v) in + update_Medeleg_MEnvCall m ((bool_to_bits False :: 1 Word.word))))" + + +(*val _get_Mtvec : Mtvec -> mword ty64*) + +fun get_Mtvec :: " Mtvec \<Rightarrow>(64)Word.word " where + " get_Mtvec (Mk_Mtvec (v)) = ( v )" + + +(*val _set_Mtvec : register_ref regstate register_value Mtvec -> mword ty64 -> M unit*) + +definition set_Mtvec :: "((regstate),(register_value),(Mtvec))register_ref \<Rightarrow>(64)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mtvec r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> r . + (let r = (Mk_Mtvec v) in + write_reg r_ref r)))" + + +(*val _get_Mtvec_Base : Mtvec -> mword ty62*) + +fun get_Mtvec_Base :: " Mtvec \<Rightarrow>(62)Word.word " where + " get_Mtvec_Base (Mk_Mtvec (v)) = ( (subrange_vec_dec v (( 63 :: int)::ii) (( 2 :: int)::ii) :: 62 Word.word))" + + +(*val _set_Mtvec_Base : register_ref regstate register_value Mtvec -> mword ty62 -> M unit*) + +definition set_Mtvec_Base :: "((regstate),(register_value),(Mtvec))register_ref \<Rightarrow>(62)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mtvec_Base r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mtvec) . + (let r = ((get_Mtvec w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 63 :: int)::ii) (( 2 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mtvec r)))))" + + +(*val _update_Mtvec_Base : Mtvec -> mword ty62 -> Mtvec*) + +fun update_Mtvec_Base :: " Mtvec \<Rightarrow>(62)Word.word \<Rightarrow> Mtvec " where + " update_Mtvec_Base (Mk_Mtvec (v)) x = ( + Mk_Mtvec ((update_subrange_vec_dec v (( 63 :: int)::ii) (( 2 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Mtvec_Mode : Mtvec -> mword ty2*) + +fun get_Mtvec_Mode :: " Mtvec \<Rightarrow>(2)Word.word " where + " get_Mtvec_Mode (Mk_Mtvec (v)) = ( (subrange_vec_dec v (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word))" + + +(*val _set_Mtvec_Mode : register_ref regstate register_value Mtvec -> mword ty2 -> M unit*) + +definition set_Mtvec_Mode :: "((regstate),(register_value),(Mtvec))register_ref \<Rightarrow>(2)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mtvec_Mode r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mtvec) . + (let r = ((get_Mtvec w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 1 :: int)::ii) (( 0 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mtvec r)))))" + + +(*val _update_Mtvec_Mode : Mtvec -> mword ty2 -> Mtvec*) + +fun update_Mtvec_Mode :: " Mtvec \<Rightarrow>(2)Word.word \<Rightarrow> Mtvec " where + " update_Mtvec_Mode (Mk_Mtvec (v)) x = ( + Mk_Mtvec ((update_subrange_vec_dec v (( 1 :: int)::ii) (( 0 :: int)::ii) x :: 64 Word.word)))" + + +(*val _update_Satp64_Mode : Satp64 -> mword ty4 -> Satp64*) + +(*val _get_Satp64_Mode : Satp64 -> mword ty4*) + +(*val _set_Satp64_Mode : register_ref regstate register_value Satp64 -> mword ty4 -> M unit*) + +(*val legalize_tvec : Mtvec -> mword ty64 -> Mtvec*) + +definition legalize_tvec :: " Mtvec \<Rightarrow>(64)Word.word \<Rightarrow> Mtvec " where + " legalize_tvec (o1 :: Mtvec) (v :: xlenbits) = ( + (let v = (Mk_Mtvec v) in + (case ((trapVectorMode_of_bits ((get_Mtvec_Mode v :: 2 Word.word)))) of + TV_Direct => v + | TV_Vector => v + | _ => update_Mtvec_Mode v ((get_Mtvec_Mode o1 :: 2 Word.word)) + )))" + + +(*val _get_Mcause : Mcause -> mword ty64*) + +fun get_Mcause :: " Mcause \<Rightarrow>(64)Word.word " where + " get_Mcause (Mk_Mcause (v)) = ( v )" + + +(*val _set_Mcause : register_ref regstate register_value Mcause -> mword ty64 -> M unit*) + +definition set_Mcause :: "((regstate),(register_value),(Mcause))register_ref \<Rightarrow>(64)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mcause r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> r . + (let r = (Mk_Mcause v) in + write_reg r_ref r)))" + + +(*val _get_Mcause_IsInterrupt : Mcause -> mword ty1*) + +fun get_Mcause_IsInterrupt :: " Mcause \<Rightarrow>(1)Word.word " where + " get_Mcause_IsInterrupt (Mk_Mcause (v)) = ( (subrange_vec_dec v (( 63 :: int)::ii) (( 63 :: int)::ii) :: 1 Word.word))" + + +(*val _set_Mcause_IsInterrupt : register_ref regstate register_value Mcause -> mword ty1 -> M unit*) + +definition set_Mcause_IsInterrupt :: "((regstate),(register_value),(Mcause))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mcause_IsInterrupt r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mcause) . + (let r = ((get_Mcause w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 63 :: int)::ii) (( 63 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mcause r)))))" + + +(*val _update_Mcause_IsInterrupt : Mcause -> mword ty1 -> Mcause*) + +fun update_Mcause_IsInterrupt :: " Mcause \<Rightarrow>(1)Word.word \<Rightarrow> Mcause " where + " update_Mcause_IsInterrupt (Mk_Mcause (v)) x = ( + Mk_Mcause ((update_subrange_vec_dec v (( 63 :: int)::ii) (( 63 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Mcause_Cause : Mcause -> mword ty63*) + +fun get_Mcause_Cause :: " Mcause \<Rightarrow>(63)Word.word " where + " get_Mcause_Cause (Mk_Mcause (v)) = ( (subrange_vec_dec v (( 62 :: int)::ii) (( 0 :: int)::ii) :: 63 Word.word))" + + +(*val _set_Mcause_Cause : register_ref regstate register_value Mcause -> mword ty63 -> M unit*) + +definition set_Mcause_Cause :: "((regstate),(register_value),(Mcause))register_ref \<Rightarrow>(63)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Mcause_Cause r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Mcause) . + (let r = ((get_Mcause w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 62 :: int)::ii) (( 0 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Mcause r)))))" + + +(*val _update_Mcause_Cause : Mcause -> mword ty63 -> Mcause*) + +fun update_Mcause_Cause :: " Mcause \<Rightarrow>(63)Word.word \<Rightarrow> Mcause " where + " update_Mcause_Cause (Mk_Mcause (v)) x = ( + Mk_Mcause ((update_subrange_vec_dec v (( 62 :: int)::ii) (( 0 :: int)::ii) x :: 64 Word.word)))" + + +(*val tvec_addr : Mtvec -> Mcause -> maybe (mword ty64)*) + +definition tvec_addr :: " Mtvec \<Rightarrow> Mcause \<Rightarrow>((64)Word.word)option " where + " tvec_addr (m :: Mtvec) (c :: Mcause) = ( + (let (base :: xlenbits) = + ((concat_vec ((get_Mtvec_Base m :: 62 Word.word)) (vec_of_bits [B0,B0] :: 2 Word.word) + :: 64 Word.word)) in + (case ((trapVectorMode_of_bits ((get_Mtvec_Mode m :: 2 Word.word)))) of + TV_Direct => Some base + | TV_Vector => + if (((((get_Mcause_IsInterrupt c :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) + then + Some ((add_vec base + ((shift_bits_left + ((EXTZ (( 64 :: int)::ii) ((get_Mcause_Cause c :: 63 Word.word)) :: 64 Word.word)) + (vec_of_bits [B1,B0] :: 2 Word.word) + :: 64 Word.word)) + :: 64 Word.word)) + else Some base + | TV_Reserved => None + )))" + + +(*val legalize_xepc : mword ty64 -> M (mword ty64)*) + +definition legalize_xepc :: "(64)Word.word \<Rightarrow>((register_value),((64)Word.word),(exception))monad " where + " legalize_xepc v = ( + haveRVC () \<bind> (\<lambda> (w__0 :: bool) . + return ((and_vec v + ((EXTS (( 64 :: int)::ii) + (if w__0 then (vec_of_bits [B1,B1,B0] :: 3 Word.word) + else (vec_of_bits [B1,B0,B0] :: 3 Word.word)) + :: 64 Word.word)) + :: 64 Word.word))))" + + +(*val _get_Sstatus : Sstatus -> mword ty64*) + +fun get_Sstatus :: " Sstatus \<Rightarrow>(64)Word.word " where + " get_Sstatus (Mk_Sstatus (v)) = ( v )" + + +(*val _set_Sstatus : register_ref regstate register_value Sstatus -> mword ty64 -> M unit*) + +definition set_Sstatus :: "((regstate),(register_value),(Sstatus))register_ref \<Rightarrow>(64)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sstatus r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> r . + (let r = (Mk_Sstatus v) in + write_reg r_ref r)))" + + +fun get_Sstatus_SD :: " Sstatus \<Rightarrow>(1)Word.word " where + " get_Sstatus_SD (Mk_Sstatus (v)) = ( (subrange_vec_dec v (( 63 :: int)::ii) (( 63 :: int)::ii) :: 1 Word.word))" + + +definition set_Sstatus_SD :: "((regstate),(register_value),(Sstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sstatus_SD r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sstatus) . + (let r = ((get_Sstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 63 :: int)::ii) (( 63 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sstatus r)))))" + + +fun update_Sstatus_SD :: " Sstatus \<Rightarrow>(1)Word.word \<Rightarrow> Sstatus " where + " update_Sstatus_SD (Mk_Sstatus (v)) x = ( + Mk_Sstatus ((update_subrange_vec_dec v (( 63 :: int)::ii) (( 63 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sstatus_UXL :: " Sstatus \<Rightarrow>(2)Word.word " where + " get_Sstatus_UXL (Mk_Sstatus (v)) = ( (subrange_vec_dec v (( 33 :: int)::ii) (( 32 :: int)::ii) :: 2 Word.word))" + + +definition set_Sstatus_UXL :: "((regstate),(register_value),(Sstatus))register_ref \<Rightarrow>(2)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sstatus_UXL r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sstatus) . + (let r = ((get_Sstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 33 :: int)::ii) (( 32 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sstatus r)))))" + + +fun update_Sstatus_UXL :: " Sstatus \<Rightarrow>(2)Word.word \<Rightarrow> Sstatus " where + " update_Sstatus_UXL (Mk_Sstatus (v)) x = ( + Mk_Sstatus ((update_subrange_vec_dec v (( 33 :: int)::ii) (( 32 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sstatus_MXR :: " Sstatus \<Rightarrow>(1)Word.word " where + " get_Sstatus_MXR (Mk_Sstatus (v)) = ( (subrange_vec_dec v (( 19 :: int)::ii) (( 19 :: int)::ii) :: 1 Word.word))" + + +definition set_Sstatus_MXR :: "((regstate),(register_value),(Sstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sstatus_MXR r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sstatus) . + (let r = ((get_Sstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 19 :: int)::ii) (( 19 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sstatus r)))))" + + +fun update_Sstatus_MXR :: " Sstatus \<Rightarrow>(1)Word.word \<Rightarrow> Sstatus " where + " update_Sstatus_MXR (Mk_Sstatus (v)) x = ( + Mk_Sstatus ((update_subrange_vec_dec v (( 19 :: int)::ii) (( 19 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sstatus_SUM :: " Sstatus \<Rightarrow>(1)Word.word " where + " get_Sstatus_SUM (Mk_Sstatus (v)) = ( (subrange_vec_dec v (( 18 :: int)::ii) (( 18 :: int)::ii) :: 1 Word.word))" + + +definition set_Sstatus_SUM :: "((regstate),(register_value),(Sstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sstatus_SUM r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sstatus) . + (let r = ((get_Sstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 18 :: int)::ii) (( 18 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sstatus r)))))" + + +fun update_Sstatus_SUM :: " Sstatus \<Rightarrow>(1)Word.word \<Rightarrow> Sstatus " where + " update_Sstatus_SUM (Mk_Sstatus (v)) x = ( + Mk_Sstatus ((update_subrange_vec_dec v (( 18 :: int)::ii) (( 18 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sstatus_XS :: " Sstatus \<Rightarrow>(2)Word.word " where + " get_Sstatus_XS (Mk_Sstatus (v)) = ( (subrange_vec_dec v (( 16 :: int)::ii) (( 15 :: int)::ii) :: 2 Word.word))" + + +definition set_Sstatus_XS :: "((regstate),(register_value),(Sstatus))register_ref \<Rightarrow>(2)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sstatus_XS r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sstatus) . + (let r = ((get_Sstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 16 :: int)::ii) (( 15 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sstatus r)))))" + + +fun update_Sstatus_XS :: " Sstatus \<Rightarrow>(2)Word.word \<Rightarrow> Sstatus " where + " update_Sstatus_XS (Mk_Sstatus (v)) x = ( + Mk_Sstatus ((update_subrange_vec_dec v (( 16 :: int)::ii) (( 15 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sstatus_FS :: " Sstatus \<Rightarrow>(2)Word.word " where + " get_Sstatus_FS (Mk_Sstatus (v)) = ( (subrange_vec_dec v (( 14 :: int)::ii) (( 13 :: int)::ii) :: 2 Word.word))" + + +definition set_Sstatus_FS :: "((regstate),(register_value),(Sstatus))register_ref \<Rightarrow>(2)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sstatus_FS r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sstatus) . + (let r = ((get_Sstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 14 :: int)::ii) (( 13 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sstatus r)))))" + + +fun update_Sstatus_FS :: " Sstatus \<Rightarrow>(2)Word.word \<Rightarrow> Sstatus " where + " update_Sstatus_FS (Mk_Sstatus (v)) x = ( + Mk_Sstatus ((update_subrange_vec_dec v (( 14 :: int)::ii) (( 13 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sstatus_SPP :: " Sstatus \<Rightarrow>(1)Word.word " where + " get_Sstatus_SPP (Mk_Sstatus (v)) = ( (subrange_vec_dec v (( 8 :: int)::ii) (( 8 :: int)::ii) :: 1 Word.word))" + + +definition set_Sstatus_SPP :: "((regstate),(register_value),(Sstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sstatus_SPP r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sstatus) . + (let r = ((get_Sstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 8 :: int)::ii) (( 8 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sstatus r)))))" + + +fun update_Sstatus_SPP :: " Sstatus \<Rightarrow>(1)Word.word \<Rightarrow> Sstatus " where + " update_Sstatus_SPP (Mk_Sstatus (v)) x = ( + Mk_Sstatus ((update_subrange_vec_dec v (( 8 :: int)::ii) (( 8 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sstatus_SPIE :: " Sstatus \<Rightarrow>(1)Word.word " where + " get_Sstatus_SPIE (Mk_Sstatus (v)) = ( (subrange_vec_dec v (( 5 :: int)::ii) (( 5 :: int)::ii) :: 1 Word.word))" + + +definition set_Sstatus_SPIE :: "((regstate),(register_value),(Sstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sstatus_SPIE r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sstatus) . + (let r = ((get_Sstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 5 :: int)::ii) (( 5 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sstatus r)))))" + + +fun update_Sstatus_SPIE :: " Sstatus \<Rightarrow>(1)Word.word \<Rightarrow> Sstatus " where + " update_Sstatus_SPIE (Mk_Sstatus (v)) x = ( + Mk_Sstatus ((update_subrange_vec_dec v (( 5 :: int)::ii) (( 5 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sstatus_UPIE :: " Sstatus \<Rightarrow>(1)Word.word " where + " get_Sstatus_UPIE (Mk_Sstatus (v)) = ( (subrange_vec_dec v (( 4 :: int)::ii) (( 4 :: int)::ii) :: 1 Word.word))" + + +definition set_Sstatus_UPIE :: "((regstate),(register_value),(Sstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sstatus_UPIE r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sstatus) . + (let r = ((get_Sstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 4 :: int)::ii) (( 4 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sstatus r)))))" + + +fun update_Sstatus_UPIE :: " Sstatus \<Rightarrow>(1)Word.word \<Rightarrow> Sstatus " where + " update_Sstatus_UPIE (Mk_Sstatus (v)) x = ( + Mk_Sstatus ((update_subrange_vec_dec v (( 4 :: int)::ii) (( 4 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sstatus_SIE :: " Sstatus \<Rightarrow>(1)Word.word " where + " get_Sstatus_SIE (Mk_Sstatus (v)) = ( (subrange_vec_dec v (( 1 :: int)::ii) (( 1 :: int)::ii) :: 1 Word.word))" + + +definition set_Sstatus_SIE :: "((regstate),(register_value),(Sstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sstatus_SIE r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sstatus) . + (let r = ((get_Sstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 1 :: int)::ii) (( 1 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sstatus r)))))" + + +fun update_Sstatus_SIE :: " Sstatus \<Rightarrow>(1)Word.word \<Rightarrow> Sstatus " where + " update_Sstatus_SIE (Mk_Sstatus (v)) x = ( + Mk_Sstatus ((update_subrange_vec_dec v (( 1 :: int)::ii) (( 1 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sstatus_UIE :: " Sstatus \<Rightarrow>(1)Word.word " where + " get_Sstatus_UIE (Mk_Sstatus (v)) = ( (subrange_vec_dec v (( 0 :: int)::ii) (( 0 :: int)::ii) :: 1 Word.word))" + + +definition set_Sstatus_UIE :: "((regstate),(register_value),(Sstatus))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sstatus_UIE r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sstatus) . + (let r = ((get_Sstatus w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 0 :: int)::ii) (( 0 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sstatus r)))))" + + +fun update_Sstatus_UIE :: " Sstatus \<Rightarrow>(1)Word.word \<Rightarrow> Sstatus " where + " update_Sstatus_UIE (Mk_Sstatus (v)) x = ( + Mk_Sstatus ((update_subrange_vec_dec v (( 0 :: int)::ii) (( 0 :: int)::ii) x :: 64 Word.word)))" + + +(*val lower_mstatus : Mstatus -> Sstatus*) + +definition lower_mstatus :: " Mstatus \<Rightarrow> Sstatus " where + " lower_mstatus m = ( + (let s = (Mk_Sstatus ((EXTZ (( 64 :: int)::ii) (vec_of_bits [B0] :: 1 Word.word) :: 64 Word.word))) in + (let s = (update_Sstatus_SD s ((get_Mstatus_SD m :: 1 Word.word))) in + (let s = (update_Sstatus_UXL s ((get_Mstatus_UXL m :: 2 Word.word))) in + (let s = (update_Sstatus_MXR s ((get_Mstatus_MXR m :: 1 Word.word))) in + (let s = (update_Sstatus_SUM s ((get_Mstatus_SUM m :: 1 Word.word))) in + (let s = (update_Sstatus_XS s ((get_Mstatus_XS m :: 2 Word.word))) in + (let s = (update_Sstatus_FS s ((get_Mstatus_FS m :: 2 Word.word))) in + (let s = (update_Sstatus_SPP s ((get_Mstatus_SPP m :: 1 Word.word))) in + (let s = (update_Sstatus_SPIE s ((get_Mstatus_SPIE m :: 1 Word.word))) in + (let s = (update_Sstatus_UPIE s ((get_Mstatus_UPIE m :: 1 Word.word))) in + (let s = (update_Sstatus_SIE s ((get_Mstatus_SIE m :: 1 Word.word))) in + update_Sstatus_UIE s ((get_Mstatus_UIE m :: 1 Word.word))))))))))))))" + + +(*val lift_sstatus : Mstatus -> Sstatus -> Mstatus*) + +definition lift_sstatus :: " Mstatus \<Rightarrow> Sstatus \<Rightarrow> Mstatus " where + " lift_sstatus (m :: Mstatus) (s :: Sstatus) = ( + (let m = (update_Mstatus_SD m ((get_Sstatus_SD s :: 1 Word.word))) in + (let m = (update_Mstatus_UXL m ((get_Sstatus_UXL s :: 2 Word.word))) in + (let m = (update_Mstatus_MXR m ((get_Sstatus_MXR s :: 1 Word.word))) in + (let m = (update_Mstatus_SUM m ((get_Sstatus_SUM s :: 1 Word.word))) in + (let m = (update_Mstatus_XS m ((get_Sstatus_XS s :: 2 Word.word))) in + (let m = (update_Mstatus_FS m ((get_Sstatus_FS s :: 2 Word.word))) in + (let m = (update_Mstatus_SPP m ((get_Sstatus_SPP s :: 1 Word.word))) in + (let m = (update_Mstatus_SPIE m ((get_Sstatus_SPIE s :: 1 Word.word))) in + (let m = (update_Mstatus_UPIE m ((get_Sstatus_UPIE s :: 1 Word.word))) in + (let m = (update_Mstatus_SIE m ((get_Sstatus_SIE s :: 1 Word.word))) in + update_Mstatus_UIE m ((get_Sstatus_UIE s :: 1 Word.word)))))))))))))" + + +(*val legalize_sstatus : Mstatus -> mword ty64 -> Mstatus*) + +definition legalize_sstatus :: " Mstatus \<Rightarrow>(64)Word.word \<Rightarrow> Mstatus " where + " legalize_sstatus (m :: Mstatus) (v :: xlenbits) = ( lift_sstatus m (Mk_Sstatus v))" + + +(*val _get_Sedeleg : Sedeleg -> mword ty64*) + +fun get_Sedeleg :: " Sedeleg \<Rightarrow>(64)Word.word " where + " get_Sedeleg (Mk_Sedeleg (v)) = ( v )" + + +(*val _set_Sedeleg : register_ref regstate register_value Sedeleg -> mword ty64 -> M unit*) + +definition set_Sedeleg :: "((regstate),(register_value),(Sedeleg))register_ref \<Rightarrow>(64)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sedeleg r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> r . + (let r = (Mk_Sedeleg v) in + write_reg r_ref r)))" + + +fun get_Sedeleg_UEnvCall :: " Sedeleg \<Rightarrow>(1)Word.word " where + " get_Sedeleg_UEnvCall (Mk_Sedeleg (v)) = ( (subrange_vec_dec v (( 8 :: int)::ii) (( 8 :: int)::ii) :: 1 Word.word))" + + +definition set_Sedeleg_UEnvCall :: "((regstate),(register_value),(Sedeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sedeleg_UEnvCall r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sedeleg) . + (let r = ((get_Sedeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 8 :: int)::ii) (( 8 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sedeleg r)))))" + + +fun update_Sedeleg_UEnvCall :: " Sedeleg \<Rightarrow>(1)Word.word \<Rightarrow> Sedeleg " where + " update_Sedeleg_UEnvCall (Mk_Sedeleg (v)) x = ( + Mk_Sedeleg ((update_subrange_vec_dec v (( 8 :: int)::ii) (( 8 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sedeleg_SAMO_Access_Fault :: " Sedeleg \<Rightarrow>(1)Word.word " where + " get_Sedeleg_SAMO_Access_Fault (Mk_Sedeleg (v)) = ( + (subrange_vec_dec v (( 7 :: int)::ii) (( 7 :: int)::ii) :: 1 Word.word))" + + +definition set_Sedeleg_SAMO_Access_Fault :: "((regstate),(register_value),(Sedeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sedeleg_SAMO_Access_Fault r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sedeleg) . + (let r = ((get_Sedeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 7 :: int)::ii) (( 7 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sedeleg r)))))" + + +fun update_Sedeleg_SAMO_Access_Fault :: " Sedeleg \<Rightarrow>(1)Word.word \<Rightarrow> Sedeleg " where + " update_Sedeleg_SAMO_Access_Fault (Mk_Sedeleg (v)) x = ( + Mk_Sedeleg ((update_subrange_vec_dec v (( 7 :: int)::ii) (( 7 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sedeleg_SAMO_Addr_Align :: " Sedeleg \<Rightarrow>(1)Word.word " where + " get_Sedeleg_SAMO_Addr_Align (Mk_Sedeleg (v)) = ( (subrange_vec_dec v (( 6 :: int)::ii) (( 6 :: int)::ii) :: 1 Word.word))" + + +definition set_Sedeleg_SAMO_Addr_Align :: "((regstate),(register_value),(Sedeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sedeleg_SAMO_Addr_Align r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sedeleg) . + (let r = ((get_Sedeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 6 :: int)::ii) (( 6 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sedeleg r)))))" + + +fun update_Sedeleg_SAMO_Addr_Align :: " Sedeleg \<Rightarrow>(1)Word.word \<Rightarrow> Sedeleg " where + " update_Sedeleg_SAMO_Addr_Align (Mk_Sedeleg (v)) x = ( + Mk_Sedeleg ((update_subrange_vec_dec v (( 6 :: int)::ii) (( 6 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sedeleg_Load_Access_Fault :: " Sedeleg \<Rightarrow>(1)Word.word " where + " get_Sedeleg_Load_Access_Fault (Mk_Sedeleg (v)) = ( + (subrange_vec_dec v (( 5 :: int)::ii) (( 5 :: int)::ii) :: 1 Word.word))" + + +definition set_Sedeleg_Load_Access_Fault :: "((regstate),(register_value),(Sedeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sedeleg_Load_Access_Fault r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sedeleg) . + (let r = ((get_Sedeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 5 :: int)::ii) (( 5 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sedeleg r)))))" + + +fun update_Sedeleg_Load_Access_Fault :: " Sedeleg \<Rightarrow>(1)Word.word \<Rightarrow> Sedeleg " where + " update_Sedeleg_Load_Access_Fault (Mk_Sedeleg (v)) x = ( + Mk_Sedeleg ((update_subrange_vec_dec v (( 5 :: int)::ii) (( 5 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sedeleg_Load_Addr_Align :: " Sedeleg \<Rightarrow>(1)Word.word " where + " get_Sedeleg_Load_Addr_Align (Mk_Sedeleg (v)) = ( (subrange_vec_dec v (( 4 :: int)::ii) (( 4 :: int)::ii) :: 1 Word.word))" + + +definition set_Sedeleg_Load_Addr_Align :: "((regstate),(register_value),(Sedeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sedeleg_Load_Addr_Align r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sedeleg) . + (let r = ((get_Sedeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 4 :: int)::ii) (( 4 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sedeleg r)))))" + + +fun update_Sedeleg_Load_Addr_Align :: " Sedeleg \<Rightarrow>(1)Word.word \<Rightarrow> Sedeleg " where + " update_Sedeleg_Load_Addr_Align (Mk_Sedeleg (v)) x = ( + Mk_Sedeleg ((update_subrange_vec_dec v (( 4 :: int)::ii) (( 4 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sedeleg_Breakpoint :: " Sedeleg \<Rightarrow>(1)Word.word " where + " get_Sedeleg_Breakpoint (Mk_Sedeleg (v)) = ( (subrange_vec_dec v (( 3 :: int)::ii) (( 3 :: int)::ii) :: 1 Word.word))" + + +definition set_Sedeleg_Breakpoint :: "((regstate),(register_value),(Sedeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sedeleg_Breakpoint r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sedeleg) . + (let r = ((get_Sedeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 3 :: int)::ii) (( 3 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sedeleg r)))))" + + +fun update_Sedeleg_Breakpoint :: " Sedeleg \<Rightarrow>(1)Word.word \<Rightarrow> Sedeleg " where + " update_Sedeleg_Breakpoint (Mk_Sedeleg (v)) x = ( + Mk_Sedeleg ((update_subrange_vec_dec v (( 3 :: int)::ii) (( 3 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sedeleg_Illegal_Instr :: " Sedeleg \<Rightarrow>(1)Word.word " where + " get_Sedeleg_Illegal_Instr (Mk_Sedeleg (v)) = ( (subrange_vec_dec v (( 2 :: int)::ii) (( 2 :: int)::ii) :: 1 Word.word))" + + +definition set_Sedeleg_Illegal_Instr :: "((regstate),(register_value),(Sedeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sedeleg_Illegal_Instr r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sedeleg) . + (let r = ((get_Sedeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 2 :: int)::ii) (( 2 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sedeleg r)))))" + + +fun update_Sedeleg_Illegal_Instr :: " Sedeleg \<Rightarrow>(1)Word.word \<Rightarrow> Sedeleg " where + " update_Sedeleg_Illegal_Instr (Mk_Sedeleg (v)) x = ( + Mk_Sedeleg ((update_subrange_vec_dec v (( 2 :: int)::ii) (( 2 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sedeleg_Fetch_Access_Fault :: " Sedeleg \<Rightarrow>(1)Word.word " where + " get_Sedeleg_Fetch_Access_Fault (Mk_Sedeleg (v)) = ( + (subrange_vec_dec v (( 1 :: int)::ii) (( 1 :: int)::ii) :: 1 Word.word))" + + +definition set_Sedeleg_Fetch_Access_Fault :: "((regstate),(register_value),(Sedeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sedeleg_Fetch_Access_Fault r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sedeleg) . + (let r = ((get_Sedeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 1 :: int)::ii) (( 1 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sedeleg r)))))" + + +fun update_Sedeleg_Fetch_Access_Fault :: " Sedeleg \<Rightarrow>(1)Word.word \<Rightarrow> Sedeleg " where + " update_Sedeleg_Fetch_Access_Fault (Mk_Sedeleg (v)) x = ( + Mk_Sedeleg ((update_subrange_vec_dec v (( 1 :: int)::ii) (( 1 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sedeleg_Fetch_Addr_Align :: " Sedeleg \<Rightarrow>(1)Word.word " where + " get_Sedeleg_Fetch_Addr_Align (Mk_Sedeleg (v)) = ( (subrange_vec_dec v (( 0 :: int)::ii) (( 0 :: int)::ii) :: 1 Word.word))" + + +definition set_Sedeleg_Fetch_Addr_Align :: "((regstate),(register_value),(Sedeleg))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sedeleg_Fetch_Addr_Align r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sedeleg) . + (let r = ((get_Sedeleg w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 0 :: int)::ii) (( 0 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sedeleg r)))))" + + +fun update_Sedeleg_Fetch_Addr_Align :: " Sedeleg \<Rightarrow>(1)Word.word \<Rightarrow> Sedeleg " where + " update_Sedeleg_Fetch_Addr_Align (Mk_Sedeleg (v)) x = ( + Mk_Sedeleg ((update_subrange_vec_dec v (( 0 :: int)::ii) (( 0 :: int)::ii) x :: 64 Word.word)))" + + +(*val legalize_sedeleg : Sedeleg -> mword ty64 -> Sedeleg*) + +definition legalize_sedeleg :: " Sedeleg \<Rightarrow>(64)Word.word \<Rightarrow> Sedeleg " where + " legalize_sedeleg (s :: Sedeleg) (v :: xlenbits) = ( + Mk_Sedeleg ((EXTZ (( 64 :: int)::ii) ((subrange_vec_dec v (( 8 :: int)::ii) (( 0 :: int)::ii) :: 9 Word.word)) :: 64 Word.word)))" + + +(*val _get_Sinterrupts : Sinterrupts -> mword ty64*) + +fun get_Sinterrupts :: " Sinterrupts \<Rightarrow>(64)Word.word " where + " get_Sinterrupts (Mk_Sinterrupts (v)) = ( v )" + + +(*val _set_Sinterrupts : register_ref regstate register_value Sinterrupts -> mword ty64 -> M unit*) + +definition set_Sinterrupts :: "((regstate),(register_value),(Sinterrupts))register_ref \<Rightarrow>(64)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sinterrupts r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> r . + (let r = (Mk_Sinterrupts v) in + write_reg r_ref r)))" + + +fun get_Sinterrupts_SEI :: " Sinterrupts \<Rightarrow>(1)Word.word " where + " get_Sinterrupts_SEI (Mk_Sinterrupts (v)) = ( (subrange_vec_dec v (( 9 :: int)::ii) (( 9 :: int)::ii) :: 1 Word.word))" + + +definition set_Sinterrupts_SEI :: "((regstate),(register_value),(Sinterrupts))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sinterrupts_SEI r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sinterrupts) . + (let r = ((get_Sinterrupts w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 9 :: int)::ii) (( 9 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sinterrupts r)))))" + + +fun update_Sinterrupts_SEI :: " Sinterrupts \<Rightarrow>(1)Word.word \<Rightarrow> Sinterrupts " where + " update_Sinterrupts_SEI (Mk_Sinterrupts (v)) x = ( + Mk_Sinterrupts ((update_subrange_vec_dec v (( 9 :: int)::ii) (( 9 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sinterrupts_UEI :: " Sinterrupts \<Rightarrow>(1)Word.word " where + " get_Sinterrupts_UEI (Mk_Sinterrupts (v)) = ( (subrange_vec_dec v (( 8 :: int)::ii) (( 8 :: int)::ii) :: 1 Word.word))" + + +definition set_Sinterrupts_UEI :: "((regstate),(register_value),(Sinterrupts))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sinterrupts_UEI r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sinterrupts) . + (let r = ((get_Sinterrupts w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 8 :: int)::ii) (( 8 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sinterrupts r)))))" + + +fun update_Sinterrupts_UEI :: " Sinterrupts \<Rightarrow>(1)Word.word \<Rightarrow> Sinterrupts " where + " update_Sinterrupts_UEI (Mk_Sinterrupts (v)) x = ( + Mk_Sinterrupts ((update_subrange_vec_dec v (( 8 :: int)::ii) (( 8 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sinterrupts_STI :: " Sinterrupts \<Rightarrow>(1)Word.word " where + " get_Sinterrupts_STI (Mk_Sinterrupts (v)) = ( (subrange_vec_dec v (( 5 :: int)::ii) (( 5 :: int)::ii) :: 1 Word.word))" + + +definition set_Sinterrupts_STI :: "((regstate),(register_value),(Sinterrupts))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sinterrupts_STI r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sinterrupts) . + (let r = ((get_Sinterrupts w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 5 :: int)::ii) (( 5 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sinterrupts r)))))" + + +fun update_Sinterrupts_STI :: " Sinterrupts \<Rightarrow>(1)Word.word \<Rightarrow> Sinterrupts " where + " update_Sinterrupts_STI (Mk_Sinterrupts (v)) x = ( + Mk_Sinterrupts ((update_subrange_vec_dec v (( 5 :: int)::ii) (( 5 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sinterrupts_UTI :: " Sinterrupts \<Rightarrow>(1)Word.word " where + " get_Sinterrupts_UTI (Mk_Sinterrupts (v)) = ( (subrange_vec_dec v (( 4 :: int)::ii) (( 4 :: int)::ii) :: 1 Word.word))" + + +definition set_Sinterrupts_UTI :: "((regstate),(register_value),(Sinterrupts))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sinterrupts_UTI r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sinterrupts) . + (let r = ((get_Sinterrupts w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 4 :: int)::ii) (( 4 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sinterrupts r)))))" + + +fun update_Sinterrupts_UTI :: " Sinterrupts \<Rightarrow>(1)Word.word \<Rightarrow> Sinterrupts " where + " update_Sinterrupts_UTI (Mk_Sinterrupts (v)) x = ( + Mk_Sinterrupts ((update_subrange_vec_dec v (( 4 :: int)::ii) (( 4 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sinterrupts_SSI :: " Sinterrupts \<Rightarrow>(1)Word.word " where + " get_Sinterrupts_SSI (Mk_Sinterrupts (v)) = ( (subrange_vec_dec v (( 1 :: int)::ii) (( 1 :: int)::ii) :: 1 Word.word))" + + +definition set_Sinterrupts_SSI :: "((regstate),(register_value),(Sinterrupts))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sinterrupts_SSI r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sinterrupts) . + (let r = ((get_Sinterrupts w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 1 :: int)::ii) (( 1 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sinterrupts r)))))" + + +fun update_Sinterrupts_SSI :: " Sinterrupts \<Rightarrow>(1)Word.word \<Rightarrow> Sinterrupts " where + " update_Sinterrupts_SSI (Mk_Sinterrupts (v)) x = ( + Mk_Sinterrupts ((update_subrange_vec_dec v (( 1 :: int)::ii) (( 1 :: int)::ii) x :: 64 Word.word)))" + + +fun get_Sinterrupts_USI :: " Sinterrupts \<Rightarrow>(1)Word.word " where + " get_Sinterrupts_USI (Mk_Sinterrupts (v)) = ( (subrange_vec_dec v (( 0 :: int)::ii) (( 0 :: int)::ii) :: 1 Word.word))" + + +definition set_Sinterrupts_USI :: "((regstate),(register_value),(Sinterrupts))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Sinterrupts_USI r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Sinterrupts) . + (let r = ((get_Sinterrupts w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 0 :: int)::ii) (( 0 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Sinterrupts r)))))" + + +fun update_Sinterrupts_USI :: " Sinterrupts \<Rightarrow>(1)Word.word \<Rightarrow> Sinterrupts " where + " update_Sinterrupts_USI (Mk_Sinterrupts (v)) x = ( + Mk_Sinterrupts ((update_subrange_vec_dec v (( 0 :: int)::ii) (( 0 :: int)::ii) x :: 64 Word.word)))" + + +(*val lower_mip : Minterrupts -> Minterrupts -> Sinterrupts*) + +definition lower_mip :: " Minterrupts \<Rightarrow> Minterrupts \<Rightarrow> Sinterrupts " where + " lower_mip (m :: Minterrupts) (d :: Minterrupts) = ( + (let (s :: Sinterrupts) = + (Mk_Sinterrupts ((EXTZ (( 64 :: int)::ii) (vec_of_bits [B0] :: 1 Word.word) :: 64 Word.word))) in + (let s = + (update_Sinterrupts_SEI s + ((and_vec ((get_Minterrupts_SEI m :: 1 Word.word)) ((get_Minterrupts_SEI d :: 1 Word.word)) + :: 1 Word.word))) in + (let s = + (update_Sinterrupts_STI s + ((and_vec ((get_Minterrupts_STI m :: 1 Word.word)) ((get_Minterrupts_STI d :: 1 Word.word)) + :: 1 Word.word))) in + (let s = + (update_Sinterrupts_SSI s + ((and_vec ((get_Minterrupts_SSI m :: 1 Word.word)) ((get_Minterrupts_SSI d :: 1 Word.word)) + :: 1 Word.word))) in + (let s = + (update_Sinterrupts_UEI s + ((and_vec ((get_Minterrupts_UEI m :: 1 Word.word)) ((get_Minterrupts_UEI d :: 1 Word.word)) + :: 1 Word.word))) in + (let s = + (update_Sinterrupts_UTI s + ((and_vec ((get_Minterrupts_UTI m :: 1 Word.word)) ((get_Minterrupts_UTI d :: 1 Word.word)) + :: 1 Word.word))) in + update_Sinterrupts_USI s + ((and_vec ((get_Minterrupts_USI m :: 1 Word.word)) ((get_Minterrupts_USI d :: 1 Word.word)) + :: 1 Word.word)))))))))" + + +(*val lower_mie : Minterrupts -> Minterrupts -> Sinterrupts*) + +definition lower_mie :: " Minterrupts \<Rightarrow> Minterrupts \<Rightarrow> Sinterrupts " where + " lower_mie (m :: Minterrupts) (d :: Minterrupts) = ( + (let (s :: Sinterrupts) = + (Mk_Sinterrupts ((EXTZ (( 64 :: int)::ii) (vec_of_bits [B0] :: 1 Word.word) :: 64 Word.word))) in + (let s = + (update_Sinterrupts_SEI s + ((and_vec ((get_Minterrupts_SEI m :: 1 Word.word)) ((get_Minterrupts_SEI d :: 1 Word.word)) + :: 1 Word.word))) in + (let s = + (update_Sinterrupts_STI s + ((and_vec ((get_Minterrupts_STI m :: 1 Word.word)) ((get_Minterrupts_STI d :: 1 Word.word)) + :: 1 Word.word))) in + (let s = + (update_Sinterrupts_SSI s + ((and_vec ((get_Minterrupts_SSI m :: 1 Word.word)) ((get_Minterrupts_SSI d :: 1 Word.word)) + :: 1 Word.word))) in + (let s = + (update_Sinterrupts_UEI s + ((and_vec ((get_Minterrupts_UEI m :: 1 Word.word)) ((get_Minterrupts_UEI d :: 1 Word.word)) + :: 1 Word.word))) in + (let s = + (update_Sinterrupts_UTI s + ((and_vec ((get_Minterrupts_UTI m :: 1 Word.word)) ((get_Minterrupts_UTI d :: 1 Word.word)) + :: 1 Word.word))) in + update_Sinterrupts_USI s + ((and_vec ((get_Minterrupts_USI m :: 1 Word.word)) ((get_Minterrupts_USI d :: 1 Word.word)) + :: 1 Word.word)))))))))" + + +(*val lift_sip : Minterrupts -> Minterrupts -> Sinterrupts -> Minterrupts*) + +definition lift_sip :: " Minterrupts \<Rightarrow> Minterrupts \<Rightarrow> Sinterrupts \<Rightarrow> Minterrupts " where + " lift_sip (o1 :: Minterrupts) (d :: Minterrupts) (s :: Sinterrupts) = ( + (let (m :: Minterrupts) = o1 in + (let m = + (update_Minterrupts_SSI m + ((and_vec ((get_Sinterrupts_SSI s :: 1 Word.word)) ((get_Minterrupts_SSI d :: 1 Word.word)) + :: 1 Word.word))) in + (let m = + (update_Minterrupts_UEI m + ((and_vec ((get_Minterrupts_UEI m :: 1 Word.word)) ((get_Minterrupts_UEI d :: 1 Word.word)) + :: 1 Word.word))) in + update_Minterrupts_USI m + ((and_vec ((get_Minterrupts_USI m :: 1 Word.word)) ((get_Minterrupts_USI d :: 1 Word.word)) + :: 1 Word.word))))))" + + +(*val legalize_sip : Minterrupts -> Minterrupts -> mword ty64 -> Minterrupts*) + +definition legalize_sip :: " Minterrupts \<Rightarrow> Minterrupts \<Rightarrow>(64)Word.word \<Rightarrow> Minterrupts " where + " legalize_sip (m :: Minterrupts) (d :: Minterrupts) (v :: xlenbits) = ( + lift_sip m d (Mk_Sinterrupts v))" + + +(*val lift_sie : Minterrupts -> Minterrupts -> Sinterrupts -> Minterrupts*) + +definition lift_sie :: " Minterrupts \<Rightarrow> Minterrupts \<Rightarrow> Sinterrupts \<Rightarrow> Minterrupts " where + " lift_sie (o1 :: Minterrupts) (d :: Minterrupts) (s :: Sinterrupts) = ( + (let (m :: Minterrupts) = o1 in + (let m = + (if (((((get_Minterrupts_SEI d :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) then + update_Minterrupts_SEI m ((get_Sinterrupts_SEI s :: 1 Word.word)) + else m) in + (let m = + (if (((((get_Minterrupts_STI d :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) then + update_Minterrupts_STI m ((get_Sinterrupts_STI s :: 1 Word.word)) + else m) in + (let m = + (if (((((get_Minterrupts_SSI d :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) then + update_Minterrupts_SSI m ((get_Sinterrupts_SSI s :: 1 Word.word)) + else m) in + (let m = + (if (((((get_Minterrupts_UEI d :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) then + update_Minterrupts_UEI m ((get_Sinterrupts_UEI s :: 1 Word.word)) + else m) in + (let m = + (if (((((get_Minterrupts_UTI d :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) then + update_Minterrupts_UTI m ((get_Sinterrupts_UTI s :: 1 Word.word)) + else m) in + if (((((get_Minterrupts_USI d :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) then + update_Minterrupts_USI m ((get_Sinterrupts_USI s :: 1 Word.word)) + else m)))))))" + + +(*val legalize_sie : Minterrupts -> Minterrupts -> mword ty64 -> Minterrupts*) + +definition legalize_sie :: " Minterrupts \<Rightarrow> Minterrupts \<Rightarrow>(64)Word.word \<Rightarrow> Minterrupts " where + " legalize_sie (m :: Minterrupts) (d :: Minterrupts) (v :: xlenbits) = ( + lift_sie m d (Mk_Sinterrupts v))" + + +(*val _get_Satp64 : Satp64 -> mword ty64*) + +fun get_Satp64 :: " Satp64 \<Rightarrow>(64)Word.word " where + " get_Satp64 (Mk_Satp64 (v)) = ( v )" + + +(*val _set_Satp64 : register_ref regstate register_value Satp64 -> mword ty64 -> M unit*) + +definition set_Satp64 :: "((regstate),(register_value),(Satp64))register_ref \<Rightarrow>(64)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Satp64 r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> r . + (let r = (Mk_Satp64 v) in + write_reg r_ref r)))" + + +fun get_Satp64_Mode :: " Satp64 \<Rightarrow>(4)Word.word " where + " get_Satp64_Mode (Mk_Satp64 (v)) = ( (subrange_vec_dec v (( 63 :: int)::ii) (( 60 :: int)::ii) :: 4 Word.word))" + + +definition set_Satp64_Mode :: "((regstate),(register_value),(Satp64))register_ref \<Rightarrow>(4)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Satp64_Mode r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Satp64) . + (let r = ((get_Satp64 w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 63 :: int)::ii) (( 60 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Satp64 r)))))" + + +fun update_Satp64_Mode :: " Satp64 \<Rightarrow>(4)Word.word \<Rightarrow> Satp64 " where + " update_Satp64_Mode (Mk_Satp64 (v)) x = ( + Mk_Satp64 ((update_subrange_vec_dec v (( 63 :: int)::ii) (( 60 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Satp64_Asid : Satp64 -> mword ty16*) + +fun get_Satp64_Asid :: " Satp64 \<Rightarrow>(16)Word.word " where + " get_Satp64_Asid (Mk_Satp64 (v)) = ( (subrange_vec_dec v (( 59 :: int)::ii) (( 44 :: int)::ii) :: 16 Word.word))" + + +(*val _set_Satp64_Asid : register_ref regstate register_value Satp64 -> mword ty16 -> M unit*) + +definition set_Satp64_Asid :: "((regstate),(register_value),(Satp64))register_ref \<Rightarrow>(16)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Satp64_Asid r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Satp64) . + (let r = ((get_Satp64 w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 59 :: int)::ii) (( 44 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Satp64 r)))))" + + +(*val _update_Satp64_Asid : Satp64 -> mword ty16 -> Satp64*) + +fun update_Satp64_Asid :: " Satp64 \<Rightarrow>(16)Word.word \<Rightarrow> Satp64 " where + " update_Satp64_Asid (Mk_Satp64 (v)) x = ( + Mk_Satp64 ((update_subrange_vec_dec v (( 59 :: int)::ii) (( 44 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_Satp64_PPN : Satp64 -> mword ty44*) + +fun get_Satp64_PPN :: " Satp64 \<Rightarrow>(44)Word.word " where + " get_Satp64_PPN (Mk_Satp64 (v)) = ( (subrange_vec_dec v (( 43 :: int)::ii) (( 0 :: int)::ii) :: 44 Word.word))" + + +(*val _set_Satp64_PPN : register_ref regstate register_value Satp64 -> mword ty44 -> M unit*) + +definition set_Satp64_PPN :: "((regstate),(register_value),(Satp64))register_ref \<Rightarrow>(44)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_Satp64_PPN r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: Satp64) . + (let r = ((get_Satp64 w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 43 :: int)::ii) (( 0 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_Satp64 r)))))" + + +(*val _update_Satp64_PPN : Satp64 -> mword ty44 -> Satp64*) + +fun update_Satp64_PPN :: " Satp64 \<Rightarrow>(44)Word.word \<Rightarrow> Satp64 " where + " update_Satp64_PPN (Mk_Satp64 (v)) x = ( + Mk_Satp64 ((update_subrange_vec_dec v (( 43 :: int)::ii) (( 0 :: int)::ii) x :: 64 Word.word)))" + + +(*val legalize_satp : Architecture -> mword ty64 -> mword ty64 -> mword ty64*) + +definition legalize_satp :: " Architecture \<Rightarrow>(64)Word.word \<Rightarrow>(64)Word.word \<Rightarrow>(64)Word.word " where + " legalize_satp (a :: Architecture) (o1 :: xlenbits) (v :: xlenbits) = ( + (let s = (Mk_Satp64 v) in + (case ((satpMode_of_bits a ((get_Satp64_Mode s :: 4 Word.word)))) of + None => o1 + | Some (Sv32) => o1 + | Some (_) => (get_Satp64 s :: 64 Word.word) + )))" + + +(*val csr_name : mword ty12 -> string*) + +definition csr_name :: "(12)Word.word \<Rightarrow> string " where + " csr_name csr = ( + (let b__0 = csr in + if (((b__0 = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (''ustatus'') + else if (((b__0 = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B1,B0,B0] :: 12 Word.word)))) then + (''uie'') + else if (((b__0 = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B1,B0,B1] :: 12 Word.word)))) then + (''utvec'') + else if (((b__0 = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B1] :: 12 Word.word)))) then + (''fflags'') + else if (((b__0 = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + (''frm'') + else if (((b__0 = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B1,B1] :: 12 Word.word)))) then + (''fcsr'') + else if (((b__0 = (vec_of_bits [B1,B1,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (''cycle'') + else if (((b__0 = (vec_of_bits [B1,B1,B0,B0,B0,B0,B0,B0,B0,B0,B0,B1] :: 12 Word.word)))) then + (''time'') + else if (((b__0 = (vec_of_bits [B1,B1,B0,B0,B0,B0,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + (''instret'') + else if (((b__0 = (vec_of_bits [B1,B1,B0,B0,B1,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (''cycleh'') + else if (((b__0 = (vec_of_bits [B1,B1,B0,B0,B1,B0,B0,B0,B0,B0,B0,B1] :: 12 Word.word)))) then + (''timeh'') + else if (((b__0 = (vec_of_bits [B1,B1,B0,B0,B1,B0,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + (''instreth'') + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (''sstatus'') + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + (''sedeleg'') + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B0,B1,B1] :: 12 Word.word)))) then + (''sideleg'') + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B1,B0,B0] :: 12 Word.word)))) then + (''sie'') + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B1,B0,B1] :: 12 Word.word)))) then + (''stvec'') + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B1,B1,B0] :: 12 Word.word)))) then + (''scounteren'') + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (''sscratch'') + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B0,B0,B1] :: 12 Word.word)))) then + (''sepc'') + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + (''scause'') + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B0,B1,B1] :: 12 Word.word)))) then + (''stval'') + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B1,B0,B0] :: 12 Word.word)))) then + (''sip'') + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (''satp'') + else if (((b__0 = (vec_of_bits [B1,B1,B1,B1,B0,B0,B0,B1,B0,B0,B0,B1] :: 12 Word.word)))) then + (''mvendorid'') + else if (((b__0 = (vec_of_bits [B1,B1,B1,B1,B0,B0,B0,B1,B0,B0,B1,B0] :: 12 Word.word)))) then + (''marchid'') + else if (((b__0 = (vec_of_bits [B1,B1,B1,B1,B0,B0,B0,B1,B0,B0,B1,B1] :: 12 Word.word)))) then + (''mimpid'') + else if (((b__0 = (vec_of_bits [B1,B1,B1,B1,B0,B0,B0,B1,B0,B1,B0,B0] :: 12 Word.word)))) then + (''mhartid'') + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (''mstatus'') + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B0,B1] :: 12 Word.word)))) then + (''misa'') + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + (''medeleg'') + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B1,B1] :: 12 Word.word)))) then + (''mideleg'') + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B1,B0,B0] :: 12 Word.word)))) then + (''mie'') + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B1,B0,B1] :: 12 Word.word)))) then + (''mtvec'') + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B1,B1,B0] :: 12 Word.word)))) then + (''mcounteren'') + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (''mscratch'') + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B0,B0,B1] :: 12 Word.word)))) then + (''mepc'') + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + (''mcause'') + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B0,B1,B1] :: 12 Word.word)))) then + (''mtval'') + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B1,B0,B0] :: 12 Word.word)))) then + (''mip'') + else if (((b__0 = (vec_of_bits [B1,B0,B1,B1,B0,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (''mcycle'') + else if (((b__0 = (vec_of_bits [B1,B0,B1,B1,B0,B0,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + (''minstret'') + else if (((b__0 = (vec_of_bits [B1,B0,B1,B1,B1,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (''mcycleh'') + else if (((b__0 = (vec_of_bits [B1,B0,B1,B1,B1,B0,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + (''minstreth'') + else if (((b__0 = (vec_of_bits [B0,B1,B1,B1,B1,B0,B1,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (''tselect'') + else (''UNKNOWN'')))" + + +(*val csrAccess : mword ty12 -> mword ty2*) + +definition csrAccess :: "(12)Word.word \<Rightarrow>(2)Word.word " where + " csrAccess csr = ( (subrange_vec_dec csr (( 11 :: int)::ii) (( 10 :: int)::ii) :: 2 Word.word))" + + +(*val csrPriv : mword ty12 -> mword ty2*) + +definition csrPriv :: "(12)Word.word \<Rightarrow>(2)Word.word " where + " csrPriv csr = ( (subrange_vec_dec csr (( 9 :: int)::ii) (( 8 :: int)::ii) :: 2 Word.word))" + + +(*val is_CSR_defined : mword ty12 -> Privilege -> bool*) + +definition is_CSR_defined :: "(12)Word.word \<Rightarrow> Privilege \<Rightarrow> bool " where + " is_CSR_defined (csr :: 12 bits) (p :: Privilege) = ( + (let b__0 = csr in + if (((b__0 = (vec_of_bits [B1,B1,B1,B1,B0,B0,B0,B1,B0,B0,B0,B1] :: 12 Word.word)))) then + (((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))) + else if (((b__0 = (vec_of_bits [B1,B1,B1,B1,B0,B0,B0,B1,B0,B0,B1,B0] :: 12 Word.word)))) then + (((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))) + else if (((b__0 = (vec_of_bits [B1,B1,B1,B1,B0,B0,B0,B1,B0,B0,B1,B1] :: 12 Word.word)))) then + (((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))) + else if (((b__0 = (vec_of_bits [B1,B1,B1,B1,B0,B0,B0,B1,B0,B1,B0,B0] :: 12 Word.word)))) then + (((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B0,B1] :: 12 Word.word)))) then + (((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + (((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B1,B1] :: 12 Word.word)))) then + (((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B1,B0,B0] :: 12 Word.word)))) then + (((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B1,B0,B1] :: 12 Word.word)))) then + (((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B1,B1,B0] :: 12 Word.word)))) then + (((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B0,B0,B1] :: 12 Word.word)))) then + (((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + (((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B0,B1,B1] :: 12 Word.word)))) then + (((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B1,B0,B0] :: 12 Word.word)))) then + (((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + ((((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))))) \<or> (((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Supervisor :: 2 Word.word)))))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + ((((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))))) \<or> (((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Supervisor :: 2 Word.word)))))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B0,B1,B1] :: 12 Word.word)))) then + ((((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))))) \<or> (((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Supervisor :: 2 Word.word)))))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B1,B0,B0] :: 12 Word.word)))) then + ((((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))))) \<or> (((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Supervisor :: 2 Word.word)))))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B1,B0,B1] :: 12 Word.word)))) then + ((((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))))) \<or> (((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Supervisor :: 2 Word.word)))))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B1,B1,B0] :: 12 Word.word)))) then + ((((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))))) \<or> (((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Supervisor :: 2 Word.word)))))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + ((((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))))) \<or> (((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Supervisor :: 2 Word.word)))))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B0,B0,B1] :: 12 Word.word)))) then + ((((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))))) \<or> (((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Supervisor :: 2 Word.word)))))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + ((((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))))) \<or> (((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Supervisor :: 2 Word.word)))))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B0,B1,B1] :: 12 Word.word)))) then + ((((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))))) \<or> (((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Supervisor :: 2 Word.word)))))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B1,B0,B0] :: 12 Word.word)))) then + ((((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))))) \<or> (((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Supervisor :: 2 Word.word)))))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + ((((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))))) \<or> (((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Supervisor :: 2 Word.word)))))) + else if (((b__0 = (vec_of_bits [B0,B1,B1,B1,B1,B0,B1,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))) + else False))" + + +(*val check_CSR_access : mword ty2 -> mword ty2 -> Privilege -> bool -> bool*) + +definition check_CSR_access :: "(2)Word.word \<Rightarrow>(2)Word.word \<Rightarrow> Privilege \<Rightarrow> bool \<Rightarrow> bool " where + " check_CSR_access csrrw csrpr p isWrite = ( + (((\<not> ((((((((bool_to_bits isWrite :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) \<and> (((csrrw = (vec_of_bits [B1,B1] :: 2 Word.word))))))))) \<and> ((zopz0zKzJ_u ((privLevel_to_bits p :: 2 Word.word)) csrpr))))" + + +(*val check_TVM_SATP : mword ty12 -> Privilege -> M bool*) + +definition check_TVM_SATP :: "(12)Word.word \<Rightarrow> Privilege \<Rightarrow>((register_value),(bool),(exception))monad " where + " check_TVM_SATP (csr :: csreg) (p :: Privilege) = ( + and_boolM + (return (((csr = (vec_of_bits [B0,B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word))))) + (and_boolM + (return (((((privLevel_to_bits p :: 2 Word.word)) = ((privLevel_to_bits Supervisor :: 2 Word.word)))))) + (read_reg mstatus_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + return (((((get_Mstatus_TVM w__0 :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word)))))))) \<bind> (\<lambda> (w__2 :: + bool) . + return ((\<not> w__2))))" + + +(*val check_CSR : mword ty12 -> Privilege -> bool -> M bool*) + +definition check_CSR :: "(12)Word.word \<Rightarrow> Privilege \<Rightarrow> bool \<Rightarrow>((register_value),(bool),(exception))monad " where + " check_CSR (csr :: csreg) (p :: Privilege) (isWrite :: bool) = ( + and_boolM (return ((is_CSR_defined csr p))) + (and_boolM + (return ((check_CSR_access ((csrAccess csr :: 2 Word.word)) ((csrPriv csr :: 2 Word.word)) p + isWrite))) ((check_TVM_SATP csr p))))" + + +(*val exception_delegatee : ExceptionType -> Privilege -> M Privilege*) + +definition exception_delegatee :: " ExceptionType \<Rightarrow> Privilege \<Rightarrow>((register_value),(Privilege),(exception))monad " where + " exception_delegatee (e :: ExceptionType) (p :: Privilege) = ( + (let idx = (num_of_ExceptionType e) in + read_reg medeleg_ref \<bind> (\<lambda> (w__0 :: Medeleg) . + (let super = (access_vec_dec ((get_Medeleg w__0 :: 64 Word.word)) idx) in + read_reg sedeleg_ref \<bind> (\<lambda> (w__1 :: Sedeleg) . + (let user = (access_vec_dec ((get_Sedeleg w__1 :: 64 Word.word)) idx) in + and_boolM + (read_reg misa_ref \<bind> (\<lambda> (w__2 :: Misa) . + return (((((get_Misa_S w__2 :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))))) + (return ((bit_to_bool super))) \<bind> (\<lambda> (w__3 :: bool) . + (let deleg = (if w__3 then Supervisor else Machine) in + return (if ((zopz0zI_u ((privLevel_to_bits deleg :: 2 Word.word)) + ((privLevel_to_bits p :: 2 Word.word)))) then + p + else deleg)))))))))" + + +(*val findPendingInterrupt : mword ty64 -> maybe InterruptType*) + +definition findPendingInterrupt :: "(64)Word.word \<Rightarrow>(InterruptType)option " where + " findPendingInterrupt ip = ( + (let ip = (Mk_Minterrupts ip) in + if (((((get_Minterrupts_MEI ip :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) then + Some I_M_External + else if (((((get_Minterrupts_MSI ip :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) + then + Some I_M_Software + else if (((((get_Minterrupts_MTI ip :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) + then + Some I_M_Timer + else if (((((get_Minterrupts_SEI ip :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) + then + Some I_S_External + else if (((((get_Minterrupts_SSI ip :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) + then + Some I_S_Software + else if (((((get_Minterrupts_STI ip :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) + then + Some I_S_Timer + else if (((((get_Minterrupts_UEI ip :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) + then + Some I_U_External + else if (((((get_Minterrupts_USI ip :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) + then + Some I_U_Software + else if (((((get_Minterrupts_UTI ip :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) + then + Some I_U_Timer + else None))" + + +(*val curInterrupt : Minterrupts -> Minterrupts -> Minterrupts -> M (maybe ((InterruptType * Privilege)))*) + +definition curInterrupt :: " Minterrupts \<Rightarrow> Minterrupts \<Rightarrow> Minterrupts \<Rightarrow>((register_value),((InterruptType*Privilege)option),(exception))monad " where + " curInterrupt (pend :: Minterrupts) (enbl :: Minterrupts) (delg :: Minterrupts) = ( + (let (en_mip :: xlenbits) = + ((and_vec ((get_Minterrupts pend :: 64 Word.word)) ((get_Minterrupts enbl :: 64 Word.word)) + :: 64 Word.word)) in + if (((en_mip = ((EXTZ (( 64 :: int)::ii) (vec_of_bits [B0] :: 1 Word.word) :: 64 Word.word))))) then + return None + else + (let eff_mip = + ((and_vec en_mip ((not_vec ((get_Minterrupts delg :: 64 Word.word)) :: 64 Word.word)) + :: 64 Word.word)) in + (let eff_sip = ((and_vec en_mip ((get_Minterrupts delg :: 64 Word.word)) :: 64 Word.word)) in + and_boolM + (read_reg mstatus_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + return (((((get_Mstatus_MIE w__0 :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))))) + (return (((eff_mip \<noteq> ((EXTZ (( 64 :: int)::ii) (vec_of_bits [B0] :: 1 Word.word) :: 64 Word.word)))))) \<bind> (\<lambda> (w__1 :: + bool) . + if w__1 then + return ((case ((findPendingInterrupt eff_mip)) of + Some (i) => + (let r = (i, Machine) in + Some r) + | None => None + )) + else + and_boolM + (read_reg mstatus_ref \<bind> (\<lambda> (w__2 :: Mstatus) . + return (((((get_Mstatus_SIE w__2 :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))))) + (and_boolM + (return (((eff_sip \<noteq> ((EXTZ (( 64 :: int)::ii) (vec_of_bits [B0] :: 1 Word.word) :: 64 Word.word)))))) + (or_boolM + (read_reg cur_privilege_ref \<bind> (\<lambda> (w__3 :: Privilege) . + return (((((privLevel_to_bits w__3 :: 2 Word.word)) = ((privLevel_to_bits Supervisor :: 2 Word.word))))))) + (read_reg cur_privilege_ref \<bind> (\<lambda> (w__4 :: Privilege) . + return (((((privLevel_to_bits w__4 :: 2 Word.word)) = ((privLevel_to_bits User :: 2 Word.word))))))))) \<bind> (\<lambda> (w__7 :: bool) . + return (if w__7 then + (case ((findPendingInterrupt eff_sip)) of + Some (i) => + (let r = (i, Supervisor) in + Some r) + | None => None + ) + else None)))))))" + + +(*val tval : maybe (mword ty64) -> mword ty64*) + +fun tval :: "((64)Word.word)option \<Rightarrow>(64)Word.word " where + " tval (Some (e)) = ( e )" +|" tval None = ( (EXTZ (( 64 :: int)::ii) (vec_of_bits [B0] :: 1 Word.word) :: 64 Word.word))" + + +(*val handle_trap : Privilege -> bool -> mword ty4 -> mword ty64 -> maybe (mword ty64) -> M (mword ty64)*) + +definition handle_trap :: " Privilege \<Rightarrow> bool \<Rightarrow>(4)Word.word \<Rightarrow>(64)Word.word \<Rightarrow>(xlenbits)option \<Rightarrow>((register_value),((64)Word.word),(exception))monad " where + " handle_trap (del_priv :: Privilege) (intr :: bool) (c :: exc_code) (pc :: xlenbits) (info :: + xlenbits option) = ( + (let (_ :: unit) = + (prerr_endline + (((op@) (''handling '') + (((op@) (if intr then (''int#'') else (''exc#'')) + (((op@) ((string_of_vec c)) + (((op@) ('' at priv '') + (((op@) ((privLevel_to_str del_priv)) + (((op@) ('' with tval '') + ((string_of_vec ((tval info :: 64 Word.word))))))))))))))))) in + (case del_priv of + Machine => + ((set_Mcause_IsInterrupt mcause_ref ((bool_to_bits intr :: 1 Word.word)) \<then> + set_Mcause_Cause mcause_ref ((EXTZ (( 63 :: int)::ii) c :: 63 Word.word))) \<then> + read_reg mstatus_ref) \<bind> (\<lambda> (w__0 :: Mstatus) . + ((set_Mstatus_MPIE mstatus_ref ((get_Mstatus_MIE w__0 :: 1 Word.word)) \<then> + set_Mstatus_MIE mstatus_ref ((bool_to_bits False :: 1 Word.word))) \<then> + read_reg cur_privilege_ref) \<bind> (\<lambda> (w__1 :: Privilege) . + ((((set_Mstatus_MPP mstatus_ref ((privLevel_to_bits w__1 :: 2 Word.word)) \<then> + write_reg mtval_ref ((tval info :: 64 Word.word))) \<then> + write_reg mepc_ref pc) \<then> + write_reg cur_privilege_ref del_priv) \<then> + read_reg mtvec_ref) \<bind> (\<lambda> (w__2 :: Mtvec) . + read_reg mcause_ref \<bind> (\<lambda> (w__3 :: Mcause) . + (case ((tvec_addr w__2 w__3 :: ( 64 Word.word)option)) of + Some (epc) => return epc + | None => (internal_error (''Invalid mtvec mode'') :: ( 64 Word.word) M) + ))))) + | Supervisor => + ((set_Mcause_IsInterrupt scause_ref ((bool_to_bits intr :: 1 Word.word)) \<then> + set_Mcause_Cause scause_ref ((EXTZ (( 63 :: int)::ii) c :: 63 Word.word))) \<then> + read_reg mstatus_ref) \<bind> (\<lambda> (w__6 :: Mstatus) . + ((set_Mstatus_SPIE mstatus_ref ((get_Mstatus_SIE w__6 :: 1 Word.word)) \<then> + set_Mstatus_SIE mstatus_ref ((bool_to_bits False :: 1 Word.word))) \<then> + read_reg cur_privilege_ref) \<bind> (\<lambda> (w__7 :: Privilege) . + (case w__7 of + User => return ((bool_to_bits False :: 1 Word.word)) + | Supervisor => return ((bool_to_bits True :: 1 Word.word)) + | Machine => (internal_error (''invalid privilege for s-mode trap'') :: ( 1 Word.word) M) + ) \<bind> (\<lambda> (w__9 :: 1 Word.word) . + ((((set_Mstatus_SPP mstatus_ref w__9 \<then> + write_reg stval_ref ((tval info :: 64 Word.word))) \<then> + write_reg sepc_ref pc) \<then> + write_reg cur_privilege_ref del_priv) \<then> + read_reg stvec_ref) \<bind> (\<lambda> (w__10 :: Mtvec) . + read_reg scause_ref \<bind> (\<lambda> (w__11 :: Mcause) . + (case ((tvec_addr w__10 w__11 :: ( 64 Word.word)option)) of + Some (epc) => return epc + | None => (internal_error (''Invalid stvec mode'') :: ( 64 Word.word) M) + )))))) + | User => (internal_error (''the N extension is currently unsupported'') :: ( 64 Word.word) M) + )))" + + +(*val handle_exception : Privilege -> ctl_result -> mword ty64 -> M (mword ty64)*) + +definition handle_exception :: " Privilege \<Rightarrow> ctl_result \<Rightarrow>(64)Word.word \<Rightarrow>((register_value),((64)Word.word),(exception))monad " where + " handle_exception (cur_priv :: Privilege) (ctl :: ctl_result) (pc :: xlenbits) = ( + (case (cur_priv, ctl) of + (_, CTL_TRAP (e)) => + exception_delegatee(sync_exception_trap e) cur_priv \<bind> (\<lambda> del_priv . + (let (_ :: unit) = + (prerr_endline + (((op@) (''trapping from '') + (((op@) ((privLevel_to_str cur_priv)) + (((op@) ('' to '') + (((op@) ((privLevel_to_str del_priv)) + (((op@) ('' to handle '') + ((exceptionType_to_str(sync_exception_trap e)))))))))))))) in + (handle_trap del_priv False ((exceptionType_to_bits(sync_exception_trap e) :: 4 Word.word)) pc(sync_exception_excinfo + e) + :: ( 64 Word.word) M))) + | (_, CTL_MRET (_)) => + read_reg cur_privilege_ref \<bind> (\<lambda> prev_priv . + read_reg mstatus_ref \<bind> (\<lambda> (w__1 :: Mstatus) . + ((set_Mstatus_MIE mstatus_ref ((get_Mstatus_MPIE w__1 :: 1 Word.word)) \<then> + set_Mstatus_MPIE mstatus_ref ((bool_to_bits True :: 1 Word.word))) \<then> + read_reg mstatus_ref) \<bind> (\<lambda> (w__2 :: Mstatus) . + ((write_reg cur_privilege_ref ((privLevel_of_bits ((get_Mstatus_MPP w__2 :: 2 Word.word)))) \<then> + set_Mstatus_MPP mstatus_ref ((privLevel_to_bits User :: 2 Word.word))) \<then> + read_reg cur_privilege_ref) \<bind> (\<lambda> (w__3 :: Privilege) . + (let (_ :: unit) = + (prerr_endline + (((op@) (''ret-ing from '') + (((op@) ((privLevel_to_str prev_priv)) + (((op@) ('' to '') ((privLevel_to_str w__3))))))))) in + (read_reg mepc_ref :: ( 64 Word.word) M)))))) + | (_, CTL_SRET (_)) => + read_reg cur_privilege_ref \<bind> (\<lambda> prev_priv . + read_reg mstatus_ref \<bind> (\<lambda> (w__5 :: Mstatus) . + ((set_Mstatus_SIE mstatus_ref ((get_Mstatus_SPIE w__5 :: 1 Word.word)) \<then> + set_Mstatus_SPIE mstatus_ref ((bool_to_bits True :: 1 Word.word))) \<then> + read_reg mstatus_ref) \<bind> (\<lambda> (w__6 :: Mstatus) . + ((write_reg + cur_privilege_ref + (if (((((get_Mstatus_SPP w__6 :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) + then + Supervisor + else User) \<then> + set_Mstatus_SPP mstatus_ref ((bool_to_bits False :: 1 Word.word))) \<then> + read_reg cur_privilege_ref) \<bind> (\<lambda> (w__7 :: Privilege) . + (let (_ :: unit) = + (prerr_endline + (((op@) (''ret-ing from '') + (((op@) ((privLevel_to_str prev_priv)) + (((op@) ('' to '') ((privLevel_to_str w__7))))))))) in + (read_reg sepc_ref :: ( 64 Word.word) M)))))) + ))" + + +(*val handle_mem_exception : mword ty64 -> ExceptionType -> M unit*) + +definition handle_mem_exception :: "(64)Word.word \<Rightarrow> ExceptionType \<Rightarrow>((register_value),(unit),(exception))monad " where + " handle_mem_exception (addr :: xlenbits) (e :: ExceptionType) = ( + (let (t :: sync_exception) = ((| sync_exception_trap = e, sync_exception_excinfo = (Some addr) |)) in + read_reg cur_privilege_ref \<bind> (\<lambda> (w__0 :: Privilege) . + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__1 :: 64 Word.word) . + (handle_exception w__0 (CTL_TRAP t) w__1 :: ( 64 Word.word) M) \<bind> (\<lambda> (w__2 :: xlenbits) . + write_reg nextPC_ref w__2)))))" + + +(*val handle_decode_exception : mword ty64 -> M unit*) + +definition handle_decode_exception :: "(64)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " handle_decode_exception instbits = ( + (let (t :: sync_exception) = + ((| sync_exception_trap = E_Illegal_Instr, + sync_exception_excinfo = (Some instbits) |)) in + read_reg cur_privilege_ref \<bind> (\<lambda> (w__0 :: Privilege) . + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__1 :: 64 Word.word) . + (handle_exception w__0 (CTL_TRAP t) w__1 :: ( 64 Word.word) M) \<bind> (\<lambda> (w__2 :: xlenbits) . + write_reg nextPC_ref w__2)))))" + + +(*val handle_interrupt : InterruptType -> Privilege -> M unit*) + +definition handle_interrupt :: " InterruptType \<Rightarrow> Privilege \<Rightarrow>((register_value),(unit),(exception))monad " where + " handle_interrupt (i :: InterruptType) (del_priv :: Privilege) = ( + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: 64 Word.word) . + (handle_trap del_priv True ((interruptType_to_bits i :: 4 Word.word)) w__0 None + :: ( 64 Word.word) M) \<bind> (\<lambda> (w__1 :: xlenbits) . + write_reg nextPC_ref w__1)))" + + +(*val handle_illegal : unit -> M unit*) + +definition handle_illegal :: " unit \<Rightarrow>((register_value),(unit),(exception))monad " where + " handle_illegal _ = ( + (let (t :: sync_exception) = + ((| sync_exception_trap = E_Illegal_Instr, + sync_exception_excinfo = None |)) in + read_reg cur_privilege_ref \<bind> (\<lambda> (w__0 :: Privilege) . + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__1 :: 64 Word.word) . + (handle_exception w__0 (CTL_TRAP t) w__1 :: ( 64 Word.word) M) \<bind> (\<lambda> (w__2 :: xlenbits) . + write_reg nextPC_ref w__2)))))" + + +(*val init_sys : unit -> M unit*) + +definition init_sys :: " unit \<Rightarrow>((register_value),(unit),(exception))monad " where + " init_sys _ = ( + (((((write_reg cur_privilege_ref Machine \<then> + set_Misa_MXL misa_ref ((arch_to_bits RV64 :: 2 Word.word))) \<then> + set_Misa_C misa_ref ((bool_to_bits True :: 1 Word.word))) \<then> + set_Misa_U misa_ref ((bool_to_bits True :: 1 Word.word))) \<then> + set_Misa_S misa_ref ((bool_to_bits True :: 1 Word.word))) \<then> + read_reg misa_ref) \<bind> (\<lambda> (w__0 :: Misa) . + (set_Mstatus_SXL mstatus_ref ((get_Misa_MXL w__0 :: 2 Word.word)) \<then> + read_reg misa_ref) \<bind> (\<lambda> (w__1 :: Misa) . + (set_Mstatus_UXL mstatus_ref ((get_Misa_MXL w__1 :: 2 Word.word)) \<then> + set_Mstatus_SD mstatus_ref ((bool_to_bits False :: 1 Word.word))) \<then> + write_reg mhartid_ref ((EXTZ (( 64 :: int)::ii) (vec_of_bits [B0] :: 1 Word.word) :: 64 Word.word)))))" + + +(*val tick_clock : unit -> M unit*) + +definition tick_clock :: " unit \<Rightarrow>((register_value),(unit),(exception))monad " where + " tick_clock _ = ( + (read_reg mcycle_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: 64 Word.word) . + write_reg mcycle_ref ((add_vec_int w__0 (( 1 :: int)::ii) :: 64 Word.word))))" + + +definition PAGESIZE_BITS :: " int " where + " PAGESIZE_BITS = ( (( 12 :: int)::ii))" + + +(*val _get_PTE_Bits : PTE_Bits -> mword ty8*) + +fun get_PTE_Bits :: " PTE_Bits \<Rightarrow>(8)Word.word " where + " get_PTE_Bits (Mk_PTE_Bits (v)) = ( v )" + + +(*val _set_PTE_Bits : register_ref regstate register_value PTE_Bits -> mword ty8 -> M unit*) + +definition set_PTE_Bits :: "((regstate),(register_value),(PTE_Bits))register_ref \<Rightarrow>(8)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_PTE_Bits r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> r . + (let r = (Mk_PTE_Bits v) in + write_reg r_ref r)))" + + +fun get_PTE_Bits_D :: " PTE_Bits \<Rightarrow>(1)Word.word " where + " get_PTE_Bits_D (Mk_PTE_Bits (v)) = ( (subrange_vec_dec v (( 7 :: int)::ii) (( 7 :: int)::ii) :: 1 Word.word))" + + +definition set_PTE_Bits_D :: "((regstate),(register_value),(PTE_Bits))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_PTE_Bits_D r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: PTE_Bits) . + (let r = ((get_PTE_Bits w__0 :: 8 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 7 :: int)::ii) (( 7 :: int)::ii) v :: 8 Word.word)) in + write_reg r_ref (Mk_PTE_Bits r)))))" + + +fun update_PTE_Bits_D :: " PTE_Bits \<Rightarrow>(1)Word.word \<Rightarrow> PTE_Bits " where + " update_PTE_Bits_D (Mk_PTE_Bits (v)) x = ( + Mk_PTE_Bits ((update_subrange_vec_dec v (( 7 :: int)::ii) (( 7 :: int)::ii) x :: 8 Word.word)))" + + +fun get_PTE_Bits_A :: " PTE_Bits \<Rightarrow>(1)Word.word " where + " get_PTE_Bits_A (Mk_PTE_Bits (v)) = ( (subrange_vec_dec v (( 6 :: int)::ii) (( 6 :: int)::ii) :: 1 Word.word))" + + +definition set_PTE_Bits_A :: "((regstate),(register_value),(PTE_Bits))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_PTE_Bits_A r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: PTE_Bits) . + (let r = ((get_PTE_Bits w__0 :: 8 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 6 :: int)::ii) (( 6 :: int)::ii) v :: 8 Word.word)) in + write_reg r_ref (Mk_PTE_Bits r)))))" + + +fun update_PTE_Bits_A :: " PTE_Bits \<Rightarrow>(1)Word.word \<Rightarrow> PTE_Bits " where + " update_PTE_Bits_A (Mk_PTE_Bits (v)) x = ( + Mk_PTE_Bits ((update_subrange_vec_dec v (( 6 :: int)::ii) (( 6 :: int)::ii) x :: 8 Word.word)))" + + +fun get_PTE_Bits_G :: " PTE_Bits \<Rightarrow>(1)Word.word " where + " get_PTE_Bits_G (Mk_PTE_Bits (v)) = ( (subrange_vec_dec v (( 5 :: int)::ii) (( 5 :: int)::ii) :: 1 Word.word))" + + +definition set_PTE_Bits_G :: "((regstate),(register_value),(PTE_Bits))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_PTE_Bits_G r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: PTE_Bits) . + (let r = ((get_PTE_Bits w__0 :: 8 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 5 :: int)::ii) (( 5 :: int)::ii) v :: 8 Word.word)) in + write_reg r_ref (Mk_PTE_Bits r)))))" + + +fun update_PTE_Bits_G :: " PTE_Bits \<Rightarrow>(1)Word.word \<Rightarrow> PTE_Bits " where + " update_PTE_Bits_G (Mk_PTE_Bits (v)) x = ( + Mk_PTE_Bits ((update_subrange_vec_dec v (( 5 :: int)::ii) (( 5 :: int)::ii) x :: 8 Word.word)))" + + +fun get_PTE_Bits_U :: " PTE_Bits \<Rightarrow>(1)Word.word " where + " get_PTE_Bits_U (Mk_PTE_Bits (v)) = ( (subrange_vec_dec v (( 4 :: int)::ii) (( 4 :: int)::ii) :: 1 Word.word))" + + +definition set_PTE_Bits_U :: "((regstate),(register_value),(PTE_Bits))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_PTE_Bits_U r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: PTE_Bits) . + (let r = ((get_PTE_Bits w__0 :: 8 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 4 :: int)::ii) (( 4 :: int)::ii) v :: 8 Word.word)) in + write_reg r_ref (Mk_PTE_Bits r)))))" + + +fun update_PTE_Bits_U :: " PTE_Bits \<Rightarrow>(1)Word.word \<Rightarrow> PTE_Bits " where + " update_PTE_Bits_U (Mk_PTE_Bits (v)) x = ( + Mk_PTE_Bits ((update_subrange_vec_dec v (( 4 :: int)::ii) (( 4 :: int)::ii) x :: 8 Word.word)))" + + +fun get_PTE_Bits_X :: " PTE_Bits \<Rightarrow>(1)Word.word " where + " get_PTE_Bits_X (Mk_PTE_Bits (v)) = ( (subrange_vec_dec v (( 3 :: int)::ii) (( 3 :: int)::ii) :: 1 Word.word))" + + +definition set_PTE_Bits_X :: "((regstate),(register_value),(PTE_Bits))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_PTE_Bits_X r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: PTE_Bits) . + (let r = ((get_PTE_Bits w__0 :: 8 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 3 :: int)::ii) (( 3 :: int)::ii) v :: 8 Word.word)) in + write_reg r_ref (Mk_PTE_Bits r)))))" + + +fun update_PTE_Bits_X :: " PTE_Bits \<Rightarrow>(1)Word.word \<Rightarrow> PTE_Bits " where + " update_PTE_Bits_X (Mk_PTE_Bits (v)) x = ( + Mk_PTE_Bits ((update_subrange_vec_dec v (( 3 :: int)::ii) (( 3 :: int)::ii) x :: 8 Word.word)))" + + +fun get_PTE_Bits_W :: " PTE_Bits \<Rightarrow>(1)Word.word " where + " get_PTE_Bits_W (Mk_PTE_Bits (v)) = ( (subrange_vec_dec v (( 2 :: int)::ii) (( 2 :: int)::ii) :: 1 Word.word))" + + +definition set_PTE_Bits_W :: "((regstate),(register_value),(PTE_Bits))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_PTE_Bits_W r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: PTE_Bits) . + (let r = ((get_PTE_Bits w__0 :: 8 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 2 :: int)::ii) (( 2 :: int)::ii) v :: 8 Word.word)) in + write_reg r_ref (Mk_PTE_Bits r)))))" + + +fun update_PTE_Bits_W :: " PTE_Bits \<Rightarrow>(1)Word.word \<Rightarrow> PTE_Bits " where + " update_PTE_Bits_W (Mk_PTE_Bits (v)) x = ( + Mk_PTE_Bits ((update_subrange_vec_dec v (( 2 :: int)::ii) (( 2 :: int)::ii) x :: 8 Word.word)))" + + +fun get_PTE_Bits_R :: " PTE_Bits \<Rightarrow>(1)Word.word " where + " get_PTE_Bits_R (Mk_PTE_Bits (v)) = ( (subrange_vec_dec v (( 1 :: int)::ii) (( 1 :: int)::ii) :: 1 Word.word))" + + +definition set_PTE_Bits_R :: "((regstate),(register_value),(PTE_Bits))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_PTE_Bits_R r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: PTE_Bits) . + (let r = ((get_PTE_Bits w__0 :: 8 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 1 :: int)::ii) (( 1 :: int)::ii) v :: 8 Word.word)) in + write_reg r_ref (Mk_PTE_Bits r)))))" + + +fun update_PTE_Bits_R :: " PTE_Bits \<Rightarrow>(1)Word.word \<Rightarrow> PTE_Bits " where + " update_PTE_Bits_R (Mk_PTE_Bits (v)) x = ( + Mk_PTE_Bits ((update_subrange_vec_dec v (( 1 :: int)::ii) (( 1 :: int)::ii) x :: 8 Word.word)))" + + +fun get_PTE_Bits_V :: " PTE_Bits \<Rightarrow>(1)Word.word " where + " get_PTE_Bits_V (Mk_PTE_Bits (v)) = ( (subrange_vec_dec v (( 0 :: int)::ii) (( 0 :: int)::ii) :: 1 Word.word))" + + +definition set_PTE_Bits_V :: "((regstate),(register_value),(PTE_Bits))register_ref \<Rightarrow>(1)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_PTE_Bits_V r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: PTE_Bits) . + (let r = ((get_PTE_Bits w__0 :: 8 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 0 :: int)::ii) (( 0 :: int)::ii) v :: 8 Word.word)) in + write_reg r_ref (Mk_PTE_Bits r)))))" + + +fun update_PTE_Bits_V :: " PTE_Bits \<Rightarrow>(1)Word.word \<Rightarrow> PTE_Bits " where + " update_PTE_Bits_V (Mk_PTE_Bits (v)) x = ( + Mk_PTE_Bits ((update_subrange_vec_dec v (( 0 :: int)::ii) (( 0 :: int)::ii) x :: 8 Word.word)))" + + +(*val isPTEPtr : mword ty8 -> bool*) + +definition isPTEPtr :: "(8)Word.word \<Rightarrow> bool " where + " isPTEPtr p = ( + (let a = (Mk_PTE_Bits p) in + ((((((get_PTE_Bits_R a :: 1 Word.word)) = ((bool_to_bits False :: 1 Word.word))))) \<and> ((((((((get_PTE_Bits_W a :: 1 Word.word)) = ((bool_to_bits False :: 1 Word.word))))) \<and> (((((get_PTE_Bits_X a :: 1 Word.word)) = ((bool_to_bits False :: 1 Word.word)))))))))))" + + +(*val isInvalidPTE : mword ty8 -> bool*) + +definition isInvalidPTE :: "(8)Word.word \<Rightarrow> bool " where + " isInvalidPTE p = ( + (let a = (Mk_PTE_Bits p) in + ((((((get_PTE_Bits_V a :: 1 Word.word)) = ((bool_to_bits False :: 1 Word.word))))) \<or> ((((((((get_PTE_Bits_W a :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) \<and> (((((get_PTE_Bits_R a :: 1 Word.word)) = ((bool_to_bits False :: 1 Word.word)))))))))))" + + +(*val checkPTEPermission : AccessType -> Privilege -> bool -> bool -> PTE_Bits -> M bool*) + +fun checkPTEPermission :: " AccessType \<Rightarrow> Privilege \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow> PTE_Bits \<Rightarrow>((register_value),(bool),(exception))monad " where + " checkPTEPermission (Read :: AccessType) (User :: Privilege) (mxr :: bool) (do_sum :: bool) (p :: + PTE_Bits) = ( + return ((((((((get_PTE_Bits_U p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) \<and> ((((((((get_PTE_Bits_R p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) \<or> ((((((((get_PTE_Bits_X p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) \<and> mxr))))))))))" +|" checkPTEPermission (Write :: AccessType) (User :: Privilege) (mxr :: bool) (do_sum :: bool) (p :: + PTE_Bits) = ( + return ((((((((get_PTE_Bits_U p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) \<and> (((((get_PTE_Bits_W p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word)))))))))" +|" checkPTEPermission (ReadWrite :: AccessType) (User :: Privilege) (mxr :: bool) (do_sum :: bool) (p :: + PTE_Bits) = ( + return ((((((((get_PTE_Bits_U p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) \<and> ((((((((get_PTE_Bits_W p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) \<and> ((((((((get_PTE_Bits_R p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) \<or> ((((((((get_PTE_Bits_X p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) \<and> mxr)))))))))))))" +|" checkPTEPermission (Execute :: AccessType) (User :: Privilege) (mxr :: bool) (do_sum :: bool) (p :: + PTE_Bits) = ( + return ((((((((get_PTE_Bits_U p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) \<and> (((((get_PTE_Bits_X p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word)))))))))" +|" checkPTEPermission (Read :: AccessType) (Supervisor :: Privilege) (mxr :: bool) (do_sum :: bool) (p :: + PTE_Bits) = ( + return (((((((((((get_PTE_Bits_U p :: 1 Word.word)) = ((bool_to_bits False :: 1 Word.word))))) \<or> do_sum))) \<and> ((((((((get_PTE_Bits_R p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) \<or> ((((((((get_PTE_Bits_X p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) \<and> mxr))))))))))" +|" checkPTEPermission (Write :: AccessType) (Supervisor :: Privilege) (mxr :: bool) (do_sum :: bool) (p :: + PTE_Bits) = ( + return (((((((((((get_PTE_Bits_U p :: 1 Word.word)) = ((bool_to_bits False :: 1 Word.word))))) \<or> do_sum))) \<and> (((((get_PTE_Bits_W p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word)))))))))" +|" checkPTEPermission (ReadWrite :: AccessType) (Supervisor :: Privilege) (mxr :: bool) (do_sum :: bool) (p :: + PTE_Bits) = ( + return (((((((((((get_PTE_Bits_U p :: 1 Word.word)) = ((bool_to_bits False :: 1 Word.word))))) \<or> do_sum))) \<and> ((((((((get_PTE_Bits_W p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) \<and> ((((((((get_PTE_Bits_R p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) \<or> ((((((((get_PTE_Bits_X p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) \<and> mxr)))))))))))))" +|" checkPTEPermission (Execute :: AccessType) (Supervisor :: Privilege) (mxr :: bool) (do_sum :: bool) (p :: + PTE_Bits) = ( + return ((((((((get_PTE_Bits_U p :: 1 Word.word)) = ((bool_to_bits False :: 1 Word.word))))) \<and> (((((get_PTE_Bits_X p :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word)))))))))" +|" checkPTEPermission (_ :: AccessType) (Machine :: Privilege) (mxr :: bool) (do_sum :: bool) (p :: + PTE_Bits) = ( internal_error (''m-mode mem perm check''))" + + +(*val update_PTE_Bits : PTE_Bits -> AccessType -> maybe PTE_Bits*) + +definition update_PTE_Bits :: " PTE_Bits \<Rightarrow> AccessType \<Rightarrow>(PTE_Bits)option " where + " update_PTE_Bits (p :: PTE_Bits) (a :: AccessType) = ( + (let update_d = + (((((((a = Write))) \<or> (((a = ReadWrite)))))) \<and> (((((get_PTE_Bits_D p :: 1 Word.word)) = ((bool_to_bits False :: 1 Word.word)))))) in + (let update_a = (((get_PTE_Bits_A p :: 1 Word.word)) = ((bool_to_bits False :: 1 Word.word))) in + if (((update_d \<or> update_a))) then + (let np = (update_PTE_Bits_A p ((bool_to_bits True :: 1 Word.word))) in + (let np = (if update_d then update_PTE_Bits_D p ((bool_to_bits True :: 1 Word.word)) else np) in + Some np)) + else None)))" + + +(*val PTW_Error_of_num : integer -> PTW_Error*) + +definition PTW_Error_of_num :: " int \<Rightarrow> PTW_Error " where + " PTW_Error_of_num arg0 = ( + (let l__0 = arg0 in + if (((l__0 = (( 0 :: int)::ii)))) then PTW_Access + else if (((l__0 = (( 1 :: int)::ii)))) then PTW_Invalid_PTE + else if (((l__0 = (( 2 :: int)::ii)))) then PTW_No_Permission + else if (((l__0 = (( 3 :: int)::ii)))) then PTW_Misaligned + else PTW_PTE_Update))" + + +(*val num_of_PTW_Error : PTW_Error -> integer*) + +fun num_of_PTW_Error :: " PTW_Error \<Rightarrow> int " where + " num_of_PTW_Error PTW_Access = ( (( 0 :: int)::ii))" +|" num_of_PTW_Error PTW_Invalid_PTE = ( (( 1 :: int)::ii))" +|" num_of_PTW_Error PTW_No_Permission = ( (( 2 :: int)::ii))" +|" num_of_PTW_Error PTW_Misaligned = ( (( 3 :: int)::ii))" +|" num_of_PTW_Error PTW_PTE_Update = ( (( 4 :: int)::ii))" + + +(*val translationException : AccessType -> PTW_Error -> ExceptionType*) + +fun translationException :: " AccessType \<Rightarrow> PTW_Error \<Rightarrow> ExceptionType " where + " translationException (Read :: AccessType) (PTW_Access :: PTW_Error) = ( E_Load_Access_Fault )" +|" translationException (Read :: AccessType) (_ :: PTW_Error) = ( E_Load_Page_Fault )" +|" translationException (Write :: AccessType) (PTW_Access :: PTW_Error) = ( E_SAMO_Access_Fault )" +|" translationException (Write :: AccessType) (_ :: PTW_Error) = ( E_SAMO_Page_Fault )" +|" translationException (Fetch :: AccessType) (PTW_Access :: PTW_Error) = ( E_Fetch_Access_Fault )" +|" translationException (Fetch :: AccessType) (_ :: PTW_Error) = ( E_Fetch_Page_Fault )" + + +definition SV39_LEVEL_BITS :: " int " where + " SV39_LEVEL_BITS = ( (( 9 :: int)::ii))" + + +definition SV39_LEVELS :: " int " where + " SV39_LEVELS = ( (( 3 :: int)::ii))" + + +definition PTE39_LOG_SIZE :: " int " where + " PTE39_LOG_SIZE = ( (( 3 :: int)::ii))" + + +definition PTE39_SIZE :: " int " where + " PTE39_SIZE = ( (( 8 :: int)::ii))" + + +(*val _get_SV39_Vaddr : SV39_Vaddr -> mword ty39*) + +fun get_SV39_Vaddr :: " SV39_Vaddr \<Rightarrow>(39)Word.word " where + " get_SV39_Vaddr (Mk_SV39_Vaddr (v)) = ( v )" + + +(*val _set_SV39_Vaddr : register_ref regstate register_value SV39_Vaddr -> mword ty39 -> M unit*) + +definition set_SV39_Vaddr :: "((regstate),(register_value),(SV39_Vaddr))register_ref \<Rightarrow>(39)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_SV39_Vaddr r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> r . + (let r = (Mk_SV39_Vaddr v) in + write_reg r_ref r)))" + + +(*val _get_SV39_Vaddr_VPNi : SV39_Vaddr -> mword ty27*) + +fun get_SV39_Vaddr_VPNi :: " SV39_Vaddr \<Rightarrow>(27)Word.word " where + " get_SV39_Vaddr_VPNi (Mk_SV39_Vaddr (v)) = ( (subrange_vec_dec v (( 38 :: int)::ii) (( 12 :: int)::ii) :: 27 Word.word))" + + +(*val _set_SV39_Vaddr_VPNi : register_ref regstate register_value SV39_Vaddr -> mword ty27 -> M unit*) + +definition set_SV39_Vaddr_VPNi :: "((regstate),(register_value),(SV39_Vaddr))register_ref \<Rightarrow>(27)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_SV39_Vaddr_VPNi r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: SV39_Vaddr) . + (let r = ((get_SV39_Vaddr w__0 :: 39 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 38 :: int)::ii) (( 12 :: int)::ii) v :: 39 Word.word)) in + write_reg r_ref (Mk_SV39_Vaddr r)))))" + + +(*val _update_SV39_Vaddr_VPNi : SV39_Vaddr -> mword ty27 -> SV39_Vaddr*) + +fun update_SV39_Vaddr_VPNi :: " SV39_Vaddr \<Rightarrow>(27)Word.word \<Rightarrow> SV39_Vaddr " where + " update_SV39_Vaddr_VPNi (Mk_SV39_Vaddr (v)) x = ( + Mk_SV39_Vaddr ((update_subrange_vec_dec v (( 38 :: int)::ii) (( 12 :: int)::ii) x :: 39 Word.word)))" + + +(*val _get_SV39_Vaddr_PgOfs : SV39_Vaddr -> mword ty12*) + +fun get_SV39_Vaddr_PgOfs :: " SV39_Vaddr \<Rightarrow>(12)Word.word " where + " get_SV39_Vaddr_PgOfs (Mk_SV39_Vaddr (v)) = ( (subrange_vec_dec v (( 11 :: int)::ii) (( 0 :: int)::ii) :: 12 Word.word))" + + +(*val _set_SV39_Vaddr_PgOfs : register_ref regstate register_value SV39_Vaddr -> mword ty12 -> M unit*) + +definition set_SV39_Vaddr_PgOfs :: "((regstate),(register_value),(SV39_Vaddr))register_ref \<Rightarrow>(12)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_SV39_Vaddr_PgOfs r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: SV39_Vaddr) . + (let r = ((get_SV39_Vaddr w__0 :: 39 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 11 :: int)::ii) (( 0 :: int)::ii) v :: 39 Word.word)) in + write_reg r_ref (Mk_SV39_Vaddr r)))))" + + +(*val _update_SV39_Vaddr_PgOfs : SV39_Vaddr -> mword ty12 -> SV39_Vaddr*) + +fun update_SV39_Vaddr_PgOfs :: " SV39_Vaddr \<Rightarrow>(12)Word.word \<Rightarrow> SV39_Vaddr " where + " update_SV39_Vaddr_PgOfs (Mk_SV39_Vaddr (v)) x = ( + Mk_SV39_Vaddr ((update_subrange_vec_dec v (( 11 :: int)::ii) (( 0 :: int)::ii) x :: 39 Word.word)))" + + +(*val _update_SV39_Paddr_PgOfs : SV39_Paddr -> mword ty12 -> SV39_Paddr*) + +(*val _get_SV39_Paddr_PgOfs : SV39_Paddr -> mword ty12*) + +(*val _set_SV39_Paddr_PgOfs : register_ref regstate register_value SV39_Paddr -> mword ty12 -> M unit*) + +(*val _get_SV39_Paddr : SV39_Paddr -> mword ty56*) + +fun get_SV39_Paddr :: " SV39_Paddr \<Rightarrow>(56)Word.word " where + " get_SV39_Paddr (Mk_SV39_Paddr (v)) = ( v )" + + +(*val _set_SV39_Paddr : register_ref regstate register_value SV39_Paddr -> mword ty56 -> M unit*) + +definition set_SV39_Paddr :: "((regstate),(register_value),(SV39_Paddr))register_ref \<Rightarrow>(56)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_SV39_Paddr r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> r . + (let r = (Mk_SV39_Paddr v) in + write_reg r_ref r)))" + + +(*val _get_SV39_Paddr_PPNi : SV39_Paddr -> mword ty44*) + +fun get_SV39_Paddr_PPNi :: " SV39_Paddr \<Rightarrow>(44)Word.word " where + " get_SV39_Paddr_PPNi (Mk_SV39_Paddr (v)) = ( (subrange_vec_dec v (( 55 :: int)::ii) (( 12 :: int)::ii) :: 44 Word.word))" + + +(*val _set_SV39_Paddr_PPNi : register_ref regstate register_value SV39_Paddr -> mword ty44 -> M unit*) + +definition set_SV39_Paddr_PPNi :: "((regstate),(register_value),(SV39_Paddr))register_ref \<Rightarrow>(44)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_SV39_Paddr_PPNi r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: SV39_Paddr) . + (let r = ((get_SV39_Paddr w__0 :: 56 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 55 :: int)::ii) (( 12 :: int)::ii) v :: 56 Word.word)) in + write_reg r_ref (Mk_SV39_Paddr r)))))" + + +(*val _update_SV39_Paddr_PPNi : SV39_Paddr -> mword ty44 -> SV39_Paddr*) + +fun update_SV39_Paddr_PPNi :: " SV39_Paddr \<Rightarrow>(44)Word.word \<Rightarrow> SV39_Paddr " where + " update_SV39_Paddr_PPNi (Mk_SV39_Paddr (v)) x = ( + Mk_SV39_Paddr ((update_subrange_vec_dec v (( 55 :: int)::ii) (( 12 :: int)::ii) x :: 56 Word.word)))" + + +(*val _update_SV39_PTE_PPNi : SV39_PTE -> mword ty44 -> SV39_PTE*) + +(*val _get_SV39_PTE_PPNi : SV39_PTE -> mword ty44*) + +(*val _set_SV39_PTE_PPNi : register_ref regstate register_value SV39_PTE -> mword ty44 -> M unit*) + +fun get_SV39_Paddr_PgOfs :: " SV39_Paddr \<Rightarrow>(12)Word.word " where + " get_SV39_Paddr_PgOfs (Mk_SV39_Paddr (v)) = ( (subrange_vec_dec v (( 11 :: int)::ii) (( 0 :: int)::ii) :: 12 Word.word))" + + +definition set_SV39_Paddr_PgOfs :: "((regstate),(register_value),(SV39_Paddr))register_ref \<Rightarrow>(12)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_SV39_Paddr_PgOfs r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: SV39_Paddr) . + (let r = ((get_SV39_Paddr w__0 :: 56 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 11 :: int)::ii) (( 0 :: int)::ii) v :: 56 Word.word)) in + write_reg r_ref (Mk_SV39_Paddr r)))))" + + +fun update_SV39_Paddr_PgOfs :: " SV39_Paddr \<Rightarrow>(12)Word.word \<Rightarrow> SV39_Paddr " where + " update_SV39_Paddr_PgOfs (Mk_SV39_Paddr (v)) x = ( + Mk_SV39_Paddr ((update_subrange_vec_dec v (( 11 :: int)::ii) (( 0 :: int)::ii) x :: 56 Word.word)))" + + +fun get_SV39_PTE :: " SV39_PTE \<Rightarrow>(64)Word.word " where + " get_SV39_PTE (Mk_SV39_PTE (v)) = ( v )" + + +definition set_SV39_PTE :: "((regstate),(register_value),(SV39_PTE))register_ref \<Rightarrow>(64)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_SV39_PTE r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> r . + (let r = (Mk_SV39_PTE v) in + write_reg r_ref r)))" + + +fun get_SV39_PTE_PPNi :: " SV39_PTE \<Rightarrow>(44)Word.word " where + " get_SV39_PTE_PPNi (Mk_SV39_PTE (v)) = ( (subrange_vec_dec v (( 53 :: int)::ii) (( 10 :: int)::ii) :: 44 Word.word))" + + +definition set_SV39_PTE_PPNi :: "((regstate),(register_value),(SV39_PTE))register_ref \<Rightarrow>(44)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_SV39_PTE_PPNi r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: SV39_PTE) . + (let r = ((get_SV39_PTE w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 53 :: int)::ii) (( 10 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_SV39_PTE r)))))" + + +fun update_SV39_PTE_PPNi :: " SV39_PTE \<Rightarrow>(44)Word.word \<Rightarrow> SV39_PTE " where + " update_SV39_PTE_PPNi (Mk_SV39_PTE (v)) x = ( + Mk_SV39_PTE ((update_subrange_vec_dec v (( 53 :: int)::ii) (( 10 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_SV39_PTE_RSW : SV39_PTE -> mword ty2*) + +fun get_SV39_PTE_RSW :: " SV39_PTE \<Rightarrow>(2)Word.word " where + " get_SV39_PTE_RSW (Mk_SV39_PTE (v)) = ( (subrange_vec_dec v (( 9 :: int)::ii) (( 8 :: int)::ii) :: 2 Word.word))" + + +(*val _set_SV39_PTE_RSW : register_ref regstate register_value SV39_PTE -> mword ty2 -> M unit*) + +definition set_SV39_PTE_RSW :: "((regstate),(register_value),(SV39_PTE))register_ref \<Rightarrow>(2)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_SV39_PTE_RSW r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: SV39_PTE) . + (let r = ((get_SV39_PTE w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 9 :: int)::ii) (( 8 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_SV39_PTE r)))))" + + +(*val _update_SV39_PTE_RSW : SV39_PTE -> mword ty2 -> SV39_PTE*) + +fun update_SV39_PTE_RSW :: " SV39_PTE \<Rightarrow>(2)Word.word \<Rightarrow> SV39_PTE " where + " update_SV39_PTE_RSW (Mk_SV39_PTE (v)) x = ( + Mk_SV39_PTE ((update_subrange_vec_dec v (( 9 :: int)::ii) (( 8 :: int)::ii) x :: 64 Word.word)))" + + +(*val _get_SV39_PTE_BITS : SV39_PTE -> mword ty8*) + +fun get_SV39_PTE_BITS :: " SV39_PTE \<Rightarrow>(8)Word.word " where + " get_SV39_PTE_BITS (Mk_SV39_PTE (v)) = ( (subrange_vec_dec v (( 7 :: int)::ii) (( 0 :: int)::ii) :: 8 Word.word))" + + +(*val _set_SV39_PTE_BITS : register_ref regstate register_value SV39_PTE -> mword ty8 -> M unit*) + +definition set_SV39_PTE_BITS :: "((regstate),(register_value),(SV39_PTE))register_ref \<Rightarrow>(8)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " set_SV39_PTE_BITS r_ref v = ( + reg_deref r_ref \<bind> (\<lambda> (w__0 :: SV39_PTE) . + (let r = ((get_SV39_PTE w__0 :: 64 Word.word)) in + (let r = ((update_subrange_vec_dec r (( 7 :: int)::ii) (( 0 :: int)::ii) v :: 64 Word.word)) in + write_reg r_ref (Mk_SV39_PTE r)))))" + + +(*val _update_SV39_PTE_BITS : SV39_PTE -> mword ty8 -> SV39_PTE*) + +fun update_SV39_PTE_BITS :: " SV39_PTE \<Rightarrow>(8)Word.word \<Rightarrow> SV39_PTE " where + " update_SV39_PTE_BITS (Mk_SV39_PTE (v)) x = ( + Mk_SV39_PTE ((update_subrange_vec_dec v (( 7 :: int)::ii) (( 0 :: int)::ii) x :: 64 Word.word)))" + + +(*val curAsid64 : unit -> M (mword ty16)*) + +definition curAsid64 :: " unit \<Rightarrow>((register_value),((16)Word.word),(exception))monad " where + " curAsid64 _ = ( + (read_reg satp_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: 64 Word.word) . + (let satp64 = (Mk_Satp64 w__0) in + return ((get_Satp64_Asid satp64 :: 16 Word.word)))))" + + +(*val curPTB39 : unit -> M (mword ty56)*) + +definition curPTB39 :: " unit \<Rightarrow>((register_value),((56)Word.word),(exception))monad " where + " curPTB39 _ = ( + (read_reg satp_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: 64 Word.word) . + (let satp64 = (Mk_Satp64 w__0) in + return ((EXTZ (( 56 :: int)::ii) + ((shiftl ((get_Satp64_PPN satp64 :: 44 Word.word)) PAGESIZE_BITS :: 44 Word.word)) + :: 56 Word.word)))))" + + +(*val walk39 : mword ty39 -> AccessType -> Privilege -> bool -> bool -> mword ty56 -> ii -> bool -> M PTW_Result*) + +function (sequential,domintros) walk39 :: "(39)Word.word \<Rightarrow> AccessType \<Rightarrow> Privilege \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow>(56)Word.word \<Rightarrow> int \<Rightarrow> bool \<Rightarrow>((register_value),(PTW_Result),(exception))monad " where + " walk39 vaddr ac priv mxr do_sum ptb level global1 = ( + (let va = (Mk_SV39_Vaddr vaddr) in + (let (pt_ofs :: paddr39) = + ((shiftl + ((EXTZ (( 56 :: int)::ii) + ((subrange_vec_dec + ((shiftr ((get_SV39_Vaddr_VPNi va :: 27 Word.word)) + ((level * SV39_LEVEL_BITS)) + :: 27 Word.word)) ((SV39_LEVEL_BITS - (( 1 :: int)::ii))) (( 0 :: int)::ii) + :: 9 Word.word)) + :: 56 Word.word)) PTE39_LOG_SIZE + :: 56 Word.word)) in + (let pte_addr = ((add_vec ptb pt_ofs :: 56 Word.word)) in + (checked_mem_read Data ((EXTZ (( 64 :: int)::ii) pte_addr :: 64 Word.word)) (( 8 :: int)::ii) + :: ( ( 64 Word.word)MemoryOpResult) M) \<bind> (\<lambda> (w__0 :: ( 64 Word.word) MemoryOpResult) . + (case w__0 of + MemException (_) => return (PTW_Failure PTW_Access) + | MemValue (v) => + (let pte = (Mk_SV39_PTE v) in + (let pbits = ((get_SV39_PTE_BITS pte :: 8 Word.word)) in + (let pattr = (Mk_PTE_Bits pbits) in + (let is_global = + (global1 \<or> (((((get_PTE_Bits_G pattr :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word)))))) in + if ((isInvalidPTE pbits)) then return (PTW_Failure PTW_Invalid_PTE) + else if ((isPTEPtr pbits)) then + if (((level = (( 0 :: int)::ii)))) then return (PTW_Failure PTW_Invalid_PTE) + else + walk39 vaddr ac priv mxr do_sum + ((EXTZ (( 56 :: int)::ii) + ((shiftl ((get_SV39_PTE_PPNi pte :: 44 Word.word)) PAGESIZE_BITS :: 44 Word.word)) + :: 56 Word.word)) ((level - (( 1 :: int)::ii))) is_global + else + checkPTEPermission ac priv mxr do_sum pattr \<bind> (\<lambda> (w__3 :: bool) . + return (if ((\<not> w__3)) then PTW_Failure PTW_No_Permission + else if ((level > (( 0 :: int)::ii))) then + (let mask1 = + ((sub_vec_int + ((shiftl + ((xor_vec ((get_SV39_PTE_PPNi pte :: 44 Word.word)) + ((xor_vec ((get_SV39_PTE_PPNi pte :: 44 Word.word)) + ((EXTZ (( 44 :: int)::ii) (vec_of_bits [B1] :: 1 Word.word) :: 44 Word.word)) + :: 44 Word.word)) + :: 44 Word.word)) ((level * SV39_LEVEL_BITS)) + :: 44 Word.word)) (( 1 :: int)::ii) + :: 44 Word.word)) in + if (((((and_vec ((get_SV39_PTE_PPNi pte :: 44 Word.word)) mask1 :: 44 Word.word)) \<noteq> ((EXTZ (( 44 :: int)::ii) (vec_of_bits [B0] :: 1 Word.word) :: 44 Word.word))))) then + PTW_Failure PTW_Misaligned + else + (let ppn = + ((or_vec ((get_SV39_PTE_PPNi pte :: 44 Word.word)) + ((and_vec + ((EXTZ (( 44 :: int)::ii) ((get_SV39_Vaddr_VPNi va :: 27 Word.word)) :: 44 Word.word)) + mask1 + :: 44 Word.word)) + :: 44 Word.word)) in + PTW_Success ((concat_vec ppn ((get_SV39_Vaddr_PgOfs va :: 12 Word.word)) + :: 56 Word.word),pte,pte_addr,level,is_global))) + else + PTW_Success ((concat_vec ((get_SV39_PTE_PPNi pte :: 44 Word.word)) + ((get_SV39_Vaddr_PgOfs va :: 12 Word.word)) + :: 56 Word.word),pte,pte_addr,level,is_global))))))) + ))))))" +by pat_completeness auto + + +(*val make_TLB39_Entry : mword ty16 -> bool -> mword ty39 -> mword ty56 -> SV39_PTE -> ii -> mword ty56 -> M TLB39_Entry*) + +definition make_TLB39_Entry :: "(16)Word.word \<Rightarrow> bool \<Rightarrow>(39)Word.word \<Rightarrow>(56)Word.word \<Rightarrow> SV39_PTE \<Rightarrow> int \<Rightarrow>(56)Word.word \<Rightarrow>((register_value),(TLB39_Entry),(exception))monad " where + " make_TLB39_Entry asid global1 vAddr pAddr pte level pteAddr = ( + (let (shift :: ii) = (PAGESIZE_BITS + ((level * SV39_LEVEL_BITS))) in + (let (vAddrMask :: vaddr39) = + ((sub_vec_int + ((shiftl + ((xor_vec vAddr + ((xor_vec vAddr ((EXTZ (( 39 :: int)::ii) (vec_of_bits [B1] :: 1 Word.word) :: 39 Word.word)) + :: 39 Word.word)) + :: 39 Word.word)) shift + :: 39 Word.word)) (( 1 :: int)::ii) + :: 39 Word.word)) in + (let (vMatchMask :: vaddr39) = ((not_vec vAddrMask :: 39 Word.word)) in + (read_reg mcycle_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: xlenbits) . + return ((| TLB39_Entry_asid = asid, + TLB39_Entry_global = global1, + TLB39_Entry_vAddr = ((and_vec vAddr vMatchMask :: 39 Word.word)), + TLB39_Entry_pAddr = + ((shiftl ((shiftr pAddr shift :: 56 Word.word)) shift :: 56 Word.word)), + TLB39_Entry_vMatchMask = vMatchMask, + TLB39_Entry_vAddrMask = vAddrMask, + TLB39_Entry_pte = pte, + TLB39_Entry_pteAddr = pteAddr, + TLB39_Entry_age = w__0 |)))))))" + + +definition TLBEntries :: " int " where + " TLBEntries = ( (( 32 :: int)::ii))" + + +(*val lookupTLB39 : mword ty16 -> mword ty39 -> M (maybe ((ii * TLB39_Entry)))*) + +definition lookupTLB39 :: "(16)Word.word \<Rightarrow>(39)Word.word \<Rightarrow>((register_value),((int*TLB39_Entry)option),(exception))monad " where + " lookupTLB39 asid vaddr = ( + read_reg tlb39_ref \<bind> (\<lambda> (w__0 :: TLB39_Entry option) . + return ((case w__0 of + None => None + | Some (e) => + if (((((((TLB39_Entry_global e) \<or> ((((TLB39_Entry_asid e) = asid)))))) \<and> ((((TLB39_Entry_vAddr e) = ((and_vec(TLB39_Entry_vMatchMask e) vaddr :: 39 Word.word)))))))) + then + Some ((( 0 :: int)::ii), e) + else None + ))))" + + +(*val addToTLB39 : mword ty16 -> mword ty39 -> mword ty56 -> SV39_PTE -> mword ty56 -> ii -> bool -> M unit*) + +definition addToTLB39 :: "(16)Word.word \<Rightarrow>(39)Word.word \<Rightarrow>(56)Word.word \<Rightarrow> SV39_PTE \<Rightarrow>(56)Word.word \<Rightarrow> int \<Rightarrow> bool \<Rightarrow>((register_value),(unit),(exception))monad " where + " addToTLB39 asid vAddr pAddr pte pteAddr level global1 = ( + make_TLB39_Entry asid global1 vAddr pAddr pte level pteAddr \<bind> (\<lambda> ent . + write_reg tlb39_ref (Some ent)))" + + +(*val writeTLB39 : ii -> TLB39_Entry -> M unit*) + +definition writeTLB39 :: " int \<Rightarrow> TLB39_Entry \<Rightarrow>((register_value),(unit),(exception))monad " where + " writeTLB39 (idx :: ii) (ent :: TLB39_Entry) = ( write_reg tlb39_ref (Some ent))" + + +(*val flushTLB : maybe (mword ty16) -> maybe (mword ty39) -> M unit*) + +definition flushTLB :: "((16)Word.word)option \<Rightarrow>((39)Word.word)option \<Rightarrow>((register_value),(unit),(exception))monad " where + " flushTLB asid addr = ( + read_reg tlb39_ref \<bind> (\<lambda> (w__0 :: TLB39_Entry option) . + (let (ent :: TLB39_Entry option) = + ((case (w__0, asid, addr) of + (None, _, _) => None + | (Some (e), None, None) => None + | (Some (e), None, Some (a)) => + if ((((TLB39_Entry_vAddr e) = ((and_vec(TLB39_Entry_vMatchMask e) a :: 39 Word.word))))) then + None + else Some e + | (Some (e), Some (i), None) => + if (((((((TLB39_Entry_asid e) = i))) \<and> ((\<not>(TLB39_Entry_global e)))))) then None + else Some e + | (Some (e), Some (i), Some (a)) => + if (((((((TLB39_Entry_asid e) = i))) \<and> (((((((TLB39_Entry_vAddr e) = ((and_vec a(TLB39_Entry_vMatchMask e) :: 39 Word.word))))) \<and> ((\<not>(TLB39_Entry_global e))))))))) then + None + else Some e + )) in + write_reg tlb39_ref ent)))" + + +definition enable_dirty_update :: " bool " where + " enable_dirty_update = ( False )" + + +(*val translate39 : mword ty39 -> AccessType -> Privilege -> bool -> bool -> ii -> M TR39_Result*) + +definition translate39 :: "(39)Word.word \<Rightarrow> AccessType \<Rightarrow> Privilege \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow> int \<Rightarrow>((register_value),(TR39_Result),(exception))monad " where + " translate39 vAddr ac priv mxr do_sum level = ( + (curAsid64 () :: ( 16 Word.word) M) \<bind> (\<lambda> asid . + lookupTLB39 asid vAddr \<bind> (\<lambda> (w__0 :: ((ii * TLB39_Entry))option) . + (case w__0 of + Some (idx,ent) => + (let pteBits = (Mk_PTE_Bits ((get_SV39_PTE_BITS(TLB39_Entry_pte ent) :: 8 Word.word))) in + checkPTEPermission ac priv mxr do_sum pteBits \<bind> (\<lambda> (w__1 :: bool) . + if ((\<not> w__1)) then return (TR39_Failure PTW_No_Permission) + else + (case ((update_PTE_Bits pteBits ac)) of + None => + return (TR39_Address ((or_vec(TLB39_Entry_pAddr ent) + ((EXTZ (( 56 :: int)::ii) + ((and_vec vAddr(TLB39_Entry_vAddrMask ent) :: 39 Word.word)) + :: 56 Word.word)) + :: 56 Word.word))) + | Some (pbits) => + if ((\<not> enable_dirty_update)) then return (TR39_Failure PTW_PTE_Update) + else + (let (n_ent :: TLB39_Entry) = ent in + (let n_ent = + ((n_ent (| + TLB39_Entry_pte := + ((update_SV39_PTE_BITS(TLB39_Entry_pte ent) ((get_PTE_Bits pbits :: 8 Word.word))))|))) in + (writeTLB39 idx n_ent \<then> + checked_mem_write ((EXTZ (( 64 :: int)::ii)(TLB39_Entry_pteAddr ent) :: 64 Word.word)) (( 8 :: int)::ii) + ((get_SV39_PTE(TLB39_Entry_pte ent) :: 64 Word.word))) \<bind> (\<lambda> (w__2 :: unit + MemoryOpResult) . + (case w__2 of + MemValue (_) => return () + | MemException (e) => internal_error (''invalid physical address in TLB'') + ) \<then> + return (TR39_Address ((or_vec(TLB39_Entry_pAddr ent) + ((EXTZ (( 56 :: int)::ii) + ((and_vec vAddr(TLB39_Entry_vAddrMask ent) :: 39 Word.word)) + :: 56 Word.word)) + :: 56 Word.word)))))) + ))) + | None => + (curPTB39 () :: ( 56 Word.word) M) \<bind> (\<lambda> (w__6 :: 56 Word.word) . + walk39 vAddr ac priv mxr do_sum w__6 level False \<bind> (\<lambda> (w__7 :: PTW_Result) . + (case w__7 of + PTW_Failure (f) => return (TR39_Failure f) + | PTW_Success (pAddr,pte,pteAddr,level,global1) => + (case ((update_PTE_Bits (Mk_PTE_Bits ((get_SV39_PTE_BITS pte :: 8 Word.word))) ac)) of + None => + addToTLB39 asid vAddr pAddr pte pteAddr level global1 \<then> return (TR39_Address pAddr) + | Some (pbits) => + if ((\<not> enable_dirty_update)) then return (TR39_Failure PTW_PTE_Update) + else + (let (w_pte :: SV39_PTE) = + (update_SV39_PTE_BITS pte ((get_PTE_Bits pbits :: 8 Word.word))) in + checked_mem_write ((EXTZ (( 64 :: int)::ii) pteAddr :: 64 Word.word)) (( 8 :: int)::ii) + ((get_SV39_PTE w_pte :: 64 Word.word)) \<bind> (\<lambda> (w__8 :: unit MemoryOpResult) . + (case w__8 of + MemValue (_) => + addToTLB39 asid vAddr pAddr w_pte pteAddr level global1 \<then> + return (TR39_Address pAddr) + | MemException (e) => return (TR39_Failure PTW_Access) + ))) + ) + ))) + ))))" + + +(*val translationMode : Privilege -> M SATPMode*) + +definition translationMode :: " Privilege \<Rightarrow>((register_value),(SATPMode),(exception))monad " where + " translationMode priv = ( + if (((((privLevel_to_bits priv :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))))) + then + return Sbare + else + read_reg mstatus_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (let arch = (architecture ((get_Mstatus_SXL w__0 :: 2 Word.word))) in + (case arch of + Some (RV64) => + (read_reg satp_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__1 :: 64 Word.word) . + (let (mbits :: satp_mode) = ((get_Satp64_Mode (Mk_Satp64 w__1) :: 4 Word.word)) in + (case ((satpMode_of_bits RV64 mbits)) of + Some (m) => return m + | None => internal_error (''invalid RV64 translation mode in satp'') + ))) + | _ => internal_error (''unsupported address translation arch'') + ))))" + + +(*val translateAddr : mword ty64 -> AccessType -> ReadType -> M TR_Result*) + +definition translateAddr :: "(64)Word.word \<Rightarrow> AccessType \<Rightarrow> ReadType \<Rightarrow>((register_value),(TR_Result),(exception))monad " where + " translateAddr vAddr ac rt = ( + (case rt of + Instruction => read_reg cur_privilege_ref + | Data => + read_reg mstatus_ref \<bind> (\<lambda> (w__1 :: Mstatus) . + if (((((get_Mstatus_MPRV w__1 :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) then + read_reg mstatus_ref \<bind> (\<lambda> (w__2 :: Mstatus) . + return ((privLevel_of_bits ((get_Mstatus_MPP w__2 :: 2 Word.word))))) + else read_reg cur_privilege_ref) + ) \<bind> (\<lambda> (effPriv :: Privilege) . + read_reg mstatus_ref \<bind> (\<lambda> (w__5 :: Mstatus) . + (let (mxr :: bool) = + (((get_Mstatus_MXR w__5 :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))) in + read_reg mstatus_ref \<bind> (\<lambda> (w__6 :: Mstatus) . + (let (do_sum :: bool) = + (((get_Mstatus_SUM w__6 :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))) in + translationMode effPriv \<bind> (\<lambda> (mode :: SATPMode) . + (case mode of + Sbare => return (TR_Address vAddr) + | SV39 => + translate39 + ((subrange_vec_dec vAddr (( 38 :: int):: ii) (( 0 :: int):: ii) :: 39 Word.word)) + ac effPriv mxr do_sum ((SV39_LEVELS - (( 1 :: int):: ii))) \<bind> + (\<lambda> (w__7 :: TR39_Result) . + return + ((case w__7 of + TR39_Address (pa) => TR_Address + ((EXTZ (( 64 :: int):: ii) pa :: 64 Word.word)) + | TR39_Failure (f) => TR_Failure ((translationException ac f)) + ))) + ))))))))" + + +(*val decode : mword ty32 -> maybe ast*) + +(*val decodeCompressed : mword ty16 -> maybe ast*) + +(*val execute : ast -> M unit*) + +(*val print_insn : ast -> string*) + +(*val extend_value : forall 'int8_times_n . Size 'int8_times_n => bool -> MemoryOpResult (mword 'int8_times_n) -> MemoryOpResult (mword ty64)*) + +fun extend_value :: " bool \<Rightarrow>(('int8_times_n::len)Word.word)MemoryOpResult \<Rightarrow>((64)Word.word)MemoryOpResult " where + " extend_value is_unsigned (MemValue (v)) = ( + MemValue (if is_unsigned then (EXTZ (( 64 :: int)::ii) v :: 64 Word.word) + else (EXTS (( 64 :: int)::ii) v :: 64 Word.word)))" +|" extend_value is_unsigned (MemException (e)) = ( MemException e )" + + +(*val process_load : forall 'int8_times_n . Size 'int8_times_n => mword ty5 -> mword ty64 -> MemoryOpResult (mword 'int8_times_n) -> bool -> M unit*) + +definition process_load :: "(5)Word.word \<Rightarrow>(64)Word.word \<Rightarrow>(('int8_times_n::len)Word.word)MemoryOpResult \<Rightarrow> bool \<Rightarrow>((register_value),(unit),(exception))monad " where + " process_load rd addr value1 is_unsigned = ( + (case ((extend_value is_unsigned value1 :: ( 64 Word.word) MemoryOpResult)) of + MemValue (result) => wX ((regbits_to_regno rd)) result + | MemException (e) => handle_mem_exception addr e + ))" + + +(*val process_loadres : forall 'int8_times_n . regbits -> xlenbits -> MemoryOpResult (bits 'int8_times_n) -> bool -> unit*) + +(*val readCSR : mword ty12 -> M (mword ty64)*) + +definition readCSR :: "(12)Word.word \<Rightarrow>((register_value),((64)Word.word),(exception))monad " where + " readCSR csr = ( + (let b__0 = csr in + if (((b__0 = (vec_of_bits [B1,B1,B1,B1,B0,B0,B0,B1,B0,B0,B0,B1] :: 12 Word.word)))) then + (read_reg mvendorid_ref :: ( 64 Word.word) M) + else if (((b__0 = (vec_of_bits [B1,B1,B1,B1,B0,B0,B0,B1,B0,B0,B1,B0] :: 12 Word.word)))) then + (read_reg marchid_ref :: ( 64 Word.word) M) + else if (((b__0 = (vec_of_bits [B1,B1,B1,B1,B0,B0,B0,B1,B0,B0,B1,B1] :: 12 Word.word)))) then + (read_reg mimpid_ref :: ( 64 Word.word) M) + else if (((b__0 = (vec_of_bits [B1,B1,B1,B1,B0,B0,B0,B1,B0,B1,B0,B0] :: 12 Word.word)))) then + (read_reg mhartid_ref :: ( 64 Word.word) M) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + read_reg mstatus_ref \<bind> (\<lambda> (w__4 :: Mstatus) . return ((get_Mstatus w__4 :: 64 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B0,B1] :: 12 Word.word)))) then + read_reg misa_ref \<bind> (\<lambda> (w__5 :: Misa) . return ((get_Misa w__5 :: 64 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + read_reg medeleg_ref \<bind> (\<lambda> (w__6 :: Medeleg) . return ((get_Medeleg w__6 :: 64 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B1,B1] :: 12 Word.word)))) then + read_reg mideleg_ref \<bind> (\<lambda> (w__7 :: Minterrupts) . + return ((get_Minterrupts w__7 :: 64 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B1,B0,B0] :: 12 Word.word)))) then + read_reg mie_ref \<bind> (\<lambda> (w__8 :: Minterrupts) . return ((get_Minterrupts w__8 :: 64 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B1,B0,B1] :: 12 Word.word)))) then + read_reg mtvec_ref \<bind> (\<lambda> (w__9 :: Mtvec) . return ((get_Mtvec w__9 :: 64 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (read_reg mscratch_ref :: ( 64 Word.word) M) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B0,B0,B1] :: 12 Word.word)))) then + (read_reg mepc_ref :: ( 64 Word.word) M) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + read_reg mcause_ref \<bind> (\<lambda> (w__12 :: Mcause) . return ((get_Mcause w__12 :: 64 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B0,B1,B1] :: 12 Word.word)))) then + (read_reg mtval_ref :: ( 64 Word.word) M) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B1,B0,B0] :: 12 Word.word)))) then + read_reg mip_ref \<bind> (\<lambda> (w__14 :: Minterrupts) . + return ((get_Minterrupts w__14 :: 64 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + read_reg mstatus_ref \<bind> (\<lambda> (w__15 :: Mstatus) . return ((get_Mstatus w__15 :: 64 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + read_reg sedeleg_ref \<bind> (\<lambda> (w__16 :: Sedeleg) . return ((get_Sedeleg w__16 :: 64 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B0,B1,B1] :: 12 Word.word)))) then + read_reg sideleg_ref \<bind> (\<lambda> (w__17 :: Sinterrupts) . + return ((get_Sinterrupts w__17 :: 64 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B1,B0,B0] :: 12 Word.word)))) then + read_reg mie_ref \<bind> (\<lambda> (w__18 :: Minterrupts) . + read_reg mideleg_ref \<bind> (\<lambda> (w__19 :: Minterrupts) . + return ((get_Sinterrupts ((lower_mie w__18 w__19)) :: 64 Word.word)))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B1,B0,B1] :: 12 Word.word)))) then + read_reg stvec_ref \<bind> (\<lambda> (w__20 :: Mtvec) . return ((get_Mtvec w__20 :: 64 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (read_reg sscratch_ref :: ( 64 Word.word) M) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B0,B0,B1] :: 12 Word.word)))) then + (read_reg sepc_ref :: ( 64 Word.word) M) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + read_reg scause_ref \<bind> (\<lambda> (w__23 :: Mcause) . return ((get_Mcause w__23 :: 64 Word.word))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B0,B1,B1] :: 12 Word.word)))) then + (read_reg stval_ref :: ( 64 Word.word) M) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B1,B0,B0] :: 12 Word.word)))) then + read_reg mip_ref \<bind> (\<lambda> (w__25 :: Minterrupts) . + read_reg mideleg_ref \<bind> (\<lambda> (w__26 :: Minterrupts) . + return ((get_Sinterrupts ((lower_mip w__25 w__26)) :: 64 Word.word)))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (read_reg satp_ref :: ( 64 Word.word) M) + else if (((b__0 = (vec_of_bits [B1,B1,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (read_reg mcycle_ref :: ( 64 Word.word) M) + else if (((b__0 = (vec_of_bits [B1,B1,B0,B0,B0,B0,B0,B0,B0,B0,B0,B1] :: 12 Word.word)))) then + (read_reg mtime_ref :: ( 64 Word.word) M) + else if (((b__0 = (vec_of_bits [B1,B1,B0,B0,B0,B0,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + (read_reg minstret_ref :: ( 64 Word.word) M) + else if (((b__0 = (vec_of_bits [B0,B1,B1,B1,B1,B0,B1,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (read_reg tselect_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__31 :: 64 Word.word) . + return ((not_vec w__31 :: 64 Word.word))) + else + (let (_ :: unit) = (print_bits (''unhandled read to CSR '') csr) in + return (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word))))" + + +(*val writeCSR : mword ty12 -> mword ty64 -> M unit*) + +definition writeCSR :: "(12)Word.word \<Rightarrow>(64)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " writeCSR (csr :: csreg) (value1 :: xlenbits) = ( + (let b__0 = csr in + (if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + read_reg mstatus_ref \<bind> (\<lambda> (w__0 :: Mstatus) . + (write_reg mstatus_ref ((legalize_mstatus w__0 value1)) \<then> + read_reg mstatus_ref) \<bind> (\<lambda> (w__1 :: Mstatus) . + return (Some ((get_Mstatus w__1 :: 64 Word.word))))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + read_reg medeleg_ref \<bind> (\<lambda> (w__2 :: Medeleg) . + (write_reg medeleg_ref ((legalize_medeleg w__2 value1)) \<then> + read_reg medeleg_ref) \<bind> (\<lambda> (w__3 :: Medeleg) . + return (Some ((get_Medeleg w__3 :: 64 Word.word))))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B1,B1] :: 12 Word.word)))) then + read_reg mideleg_ref \<bind> (\<lambda> (w__4 :: Minterrupts) . + (write_reg mideleg_ref ((legalize_mideleg w__4 value1)) \<then> + read_reg mideleg_ref) \<bind> (\<lambda> (w__5 :: Minterrupts) . + return (Some ((get_Minterrupts w__5 :: 64 Word.word))))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B1,B0,B0] :: 12 Word.word)))) then + read_reg mie_ref \<bind> (\<lambda> (w__6 :: Minterrupts) . + (write_reg mie_ref ((legalize_mie w__6 value1)) \<then> + read_reg mie_ref) \<bind> (\<lambda> (w__7 :: Minterrupts) . + return (Some ((get_Minterrupts w__7 :: 64 Word.word))))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B1,B0,B1] :: 12 Word.word)))) then + read_reg mtvec_ref \<bind> (\<lambda> (w__8 :: Mtvec) . + (write_reg mtvec_ref ((legalize_tvec w__8 value1)) \<then> + read_reg mtvec_ref) \<bind> (\<lambda> (w__9 :: Mtvec) . return (Some ((get_Mtvec w__9 :: 64 Word.word))))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (write_reg mscratch_ref value1 \<then> + (read_reg mscratch_ref :: ( 64 Word.word) M)) \<bind> (\<lambda> (w__10 :: 64 Word.word) . return (Some w__10)) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B0,B0,B1] :: 12 Word.word)))) then + (legalize_xepc value1 :: ( 64 Word.word) M) \<bind> (\<lambda> (w__11 :: xlenbits) . + (write_reg mepc_ref w__11 \<then> + (read_reg mepc_ref :: ( 64 Word.word) M)) \<bind> (\<lambda> (w__12 :: 64 Word.word) . return (Some w__12))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + (set_Mcause mcause_ref value1 \<then> + read_reg mcause_ref) \<bind> (\<lambda> (w__13 :: Mcause) . + return (Some ((get_Mcause w__13 :: 64 Word.word)))) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B0,B1,B1] :: 12 Word.word)))) then + (write_reg mtval_ref value1 \<then> + (read_reg mtval_ref :: ( 64 Word.word) M)) \<bind> (\<lambda> (w__14 :: 64 Word.word) . return (Some w__14)) + else if (((b__0 = (vec_of_bits [B0,B0,B1,B1,B0,B1,B0,B0,B0,B1,B0,B0] :: 12 Word.word)))) then + read_reg mip_ref \<bind> (\<lambda> (w__15 :: Minterrupts) . + (write_reg mip_ref ((legalize_mip w__15 value1)) \<then> + read_reg mip_ref) \<bind> (\<lambda> (w__16 :: Minterrupts) . + return (Some ((get_Minterrupts w__16 :: 64 Word.word))))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + read_reg mstatus_ref \<bind> (\<lambda> (w__17 :: Mstatus) . + (write_reg mstatus_ref ((legalize_sstatus w__17 value1)) \<then> + read_reg mstatus_ref) \<bind> (\<lambda> (w__18 :: Mstatus) . + return (Some ((get_Mstatus w__18 :: 64 Word.word))))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + read_reg sedeleg_ref \<bind> (\<lambda> (w__19 :: Sedeleg) . + (write_reg sedeleg_ref ((legalize_sedeleg w__19 value1)) \<then> + read_reg sedeleg_ref) \<bind> (\<lambda> (w__20 :: Sedeleg) . + return (Some ((get_Sedeleg w__20 :: 64 Word.word))))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B0,B1,B1] :: 12 Word.word)))) then + (set_Sinterrupts sideleg_ref value1 \<then> + read_reg sideleg_ref) \<bind> (\<lambda> (w__21 :: Sinterrupts) . + return (Some ((get_Sinterrupts w__21 :: 64 Word.word)))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B1,B0,B0] :: 12 Word.word)))) then + read_reg mie_ref \<bind> (\<lambda> (w__22 :: Minterrupts) . + read_reg mideleg_ref \<bind> (\<lambda> (w__23 :: Minterrupts) . + (write_reg mie_ref ((legalize_sie w__22 w__23 value1)) \<then> + read_reg mie_ref) \<bind> (\<lambda> (w__24 :: Minterrupts) . + return (Some ((get_Minterrupts w__24 :: 64 Word.word)))))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B1,B0,B1] :: 12 Word.word)))) then + read_reg stvec_ref \<bind> (\<lambda> (w__25 :: Mtvec) . + (write_reg stvec_ref ((legalize_tvec w__25 value1)) \<then> + read_reg stvec_ref) \<bind> (\<lambda> (w__26 :: Mtvec) . return (Some ((get_Mtvec w__26 :: 64 Word.word))))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (write_reg sscratch_ref value1 \<then> + (read_reg sscratch_ref :: ( 64 Word.word) M)) \<bind> (\<lambda> (w__27 :: 64 Word.word) . return (Some w__27)) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B0,B0,B1] :: 12 Word.word)))) then + (legalize_xepc value1 :: ( 64 Word.word) M) \<bind> (\<lambda> (w__28 :: xlenbits) . + (write_reg sepc_ref w__28 \<then> + (read_reg sepc_ref :: ( 64 Word.word) M)) \<bind> (\<lambda> (w__29 :: 64 Word.word) . return (Some w__29))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B0,B1,B0] :: 12 Word.word)))) then + (set_Mcause scause_ref value1 \<then> + read_reg scause_ref) \<bind> (\<lambda> (w__30 :: Mcause) . + return (Some ((get_Mcause w__30 :: 64 Word.word)))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B0,B1,B1] :: 12 Word.word)))) then + (write_reg stval_ref value1 \<then> + (read_reg stval_ref :: ( 64 Word.word) M)) \<bind> (\<lambda> (w__31 :: 64 Word.word) . return (Some w__31)) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B0,B1,B0,B0,B0,B1,B0,B0] :: 12 Word.word)))) then + read_reg mip_ref \<bind> (\<lambda> (w__32 :: Minterrupts) . + read_reg mideleg_ref \<bind> (\<lambda> (w__33 :: Minterrupts) . + (write_reg mip_ref ((legalize_sip w__32 w__33 value1)) \<then> + read_reg mip_ref) \<bind> (\<lambda> (w__34 :: Minterrupts) . + return (Some ((get_Minterrupts w__34 :: 64 Word.word)))))) + else if (((b__0 = (vec_of_bits [B0,B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + cur_Architecture () \<bind> (\<lambda> (w__35 :: Architecture) . + (read_reg satp_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__36 :: 64 Word.word) . + (write_reg satp_ref ((legalize_satp w__35 w__36 value1 :: 64 Word.word)) \<then> + (read_reg satp_ref :: ( 64 Word.word) M)) \<bind> (\<lambda> (w__37 :: 64 Word.word) . return (Some w__37)))) + else if (((b__0 = (vec_of_bits [B0,B1,B1,B1,B1,B0,B1,B0,B0,B0,B0,B0] :: 12 Word.word)))) then + (write_reg tselect_ref value1 \<then> + (read_reg tselect_ref :: ( 64 Word.word) M)) \<bind> (\<lambda> (w__38 :: 64 Word.word) . return (Some w__38)) + else return None) \<bind> (\<lambda> (res :: xlenbits option) . + return ((case res of + Some (v) => + prerr_endline + (((op@) (''CSR '') + (((op@) ((csr_name csr)) + (((op@) ('' <- '') + (((op@) ((string_of_vec v)) + (((op@) ('' (input: '') (((op@) ((string_of_vec value1)) ('')''))))))))))))) + | None => print_bits (''unhandled write to CSR '') csr + )))))" + + +definition decode :: "(32)Word.word \<Rightarrow>(ast)option " where + " decode v__0 = ( + if (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B1,B1,B1] :: 7 Word.word)))) then + (let (imm :: 20 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 12 :: int)::ii) :: 20 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (UTYPE (imm,rd,RISCV_LUI)))) + else if (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B1,B0,B1,B1,B1] :: 7 Word.word)))) then + (let (imm :: 20 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 12 :: int)::ii) :: 20 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (UTYPE (imm,rd,RISCV_AUIPC)))) + else if (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B1,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))) then + (let (imm :: 20 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 12 :: int)::ii) :: 20 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (RISCV_JAL ((concat_vec ((cast_unit_vec0 ((access_vec_dec imm (( 19 :: int)::ii))) :: 1 Word.word)) + ((concat_vec ((subrange_vec_dec imm (( 7 :: int)::ii) (( 0 :: int)::ii) :: 8 Word.word)) + ((concat_vec + ((cast_unit_vec0 ((access_vec_dec imm (( 8 :: int)::ii))) :: 1 Word.word)) + ((concat_vec ((subrange_vec_dec imm (( 18 :: int)::ii) (( 13 :: int)::ii) :: 6 Word.word)) + ((concat_vec + ((subrange_vec_dec imm (( 12 :: int)::ii) (( 9 :: int)::ii) :: 4 Word.word)) + (vec_of_bits [B0] :: 1 Word.word) + :: 5 Word.word)) + :: 11 Word.word)) + :: 12 Word.word)) + :: 20 Word.word)) + :: 21 Word.word),rd)))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B1,B1,B0,B0,B1,B1,B1] :: 7 Word.word))))))) then + (let (imm :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (RISCV_JALR (imm,rs1,rd))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B1,B1,B0,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm7 :: 7 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (imm5 :: 5 bits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (BTYPE ((concat_vec ((cast_unit_vec0 ((access_vec_dec imm7 (( 6 :: int)::ii))) :: 1 Word.word)) + ((concat_vec ((cast_unit_vec0 ((access_vec_dec imm5 (( 0 :: int)::ii))) :: 1 Word.word)) + ((concat_vec ((subrange_vec_dec imm7 (( 5 :: int)::ii) (( 0 :: int)::ii) :: 6 Word.word)) + ((concat_vec ((subrange_vec_dec imm5 (( 4 :: int)::ii) (( 1 :: int)::ii) :: 4 Word.word)) + (vec_of_bits [B0] :: 1 Word.word) + :: 5 Word.word)) + :: 11 Word.word)) + :: 12 Word.word)) + :: 13 Word.word),rs2,rs1,RISCV_BEQ)))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B1,B1,B0,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm7 :: 7 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (imm5 :: 5 bits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (BTYPE ((concat_vec ((cast_unit_vec0 ((access_vec_dec imm7 (( 6 :: int)::ii))) :: 1 Word.word)) + ((concat_vec ((cast_unit_vec0 ((access_vec_dec imm5 (( 0 :: int)::ii))) :: 1 Word.word)) + ((concat_vec ((subrange_vec_dec imm7 (( 5 :: int)::ii) (( 0 :: int)::ii) :: 6 Word.word)) + ((concat_vec ((subrange_vec_dec imm5 (( 4 :: int)::ii) (( 1 :: int)::ii) :: 4 Word.word)) + (vec_of_bits [B0] :: 1 Word.word) + :: 5 Word.word)) + :: 11 Word.word)) + :: 12 Word.word)) + :: 13 Word.word),rs2,rs1,RISCV_BNE)))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B1,B1,B0,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm7 :: 7 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (imm5 :: 5 bits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (BTYPE ((concat_vec ((cast_unit_vec0 ((access_vec_dec imm7 (( 6 :: int)::ii))) :: 1 Word.word)) + ((concat_vec ((cast_unit_vec0 ((access_vec_dec imm5 (( 0 :: int)::ii))) :: 1 Word.word)) + ((concat_vec ((subrange_vec_dec imm7 (( 5 :: int)::ii) (( 0 :: int)::ii) :: 6 Word.word)) + ((concat_vec ((subrange_vec_dec imm5 (( 4 :: int)::ii) (( 1 :: int)::ii) :: 4 Word.word)) + (vec_of_bits [B0] :: 1 Word.word) + :: 5 Word.word)) + :: 11 Word.word)) + :: 12 Word.word)) + :: 13 Word.word),rs2,rs1,RISCV_BLT)))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B1,B1,B0,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm7 :: 7 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (imm5 :: 5 bits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (BTYPE ((concat_vec ((cast_unit_vec0 ((access_vec_dec imm7 (( 6 :: int)::ii))) :: 1 Word.word)) + ((concat_vec ((cast_unit_vec0 ((access_vec_dec imm5 (( 0 :: int)::ii))) :: 1 Word.word)) + ((concat_vec ((subrange_vec_dec imm7 (( 5 :: int)::ii) (( 0 :: int)::ii) :: 6 Word.word)) + ((concat_vec ((subrange_vec_dec imm5 (( 4 :: int)::ii) (( 1 :: int)::ii) :: 4 Word.word)) + (vec_of_bits [B0] :: 1 Word.word) + :: 5 Word.word)) + :: 11 Word.word)) + :: 12 Word.word)) + :: 13 Word.word),rs2,rs1,RISCV_BGE)))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B1,B1,B0,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm7 :: 7 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (imm5 :: 5 bits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (BTYPE ((concat_vec ((cast_unit_vec0 ((access_vec_dec imm7 (( 6 :: int)::ii))) :: 1 Word.word)) + ((concat_vec ((cast_unit_vec0 ((access_vec_dec imm5 (( 0 :: int)::ii))) :: 1 Word.word)) + ((concat_vec ((subrange_vec_dec imm7 (( 5 :: int)::ii) (( 0 :: int)::ii) :: 6 Word.word)) + ((concat_vec ((subrange_vec_dec imm5 (( 4 :: int)::ii) (( 1 :: int)::ii) :: 4 Word.word)) + (vec_of_bits [B0] :: 1 Word.word) + :: 5 Word.word)) + :: 11 Word.word)) + :: 12 Word.word)) + :: 13 Word.word),rs2,rs1,RISCV_BLTU)))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B1,B1,B0,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm7 :: 7 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (imm5 :: 5 bits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (BTYPE ((concat_vec ((cast_unit_vec0 ((access_vec_dec imm7 (( 6 :: int)::ii))) :: 1 Word.word)) + ((concat_vec ((cast_unit_vec0 ((access_vec_dec imm5 (( 0 :: int)::ii))) :: 1 Word.word)) + ((concat_vec ((subrange_vec_dec imm7 (( 5 :: int)::ii) (( 0 :: int)::ii) :: 6 Word.word)) + ((concat_vec ((subrange_vec_dec imm5 (( 4 :: int)::ii) (( 1 :: int)::ii) :: 4 Word.word)) + (vec_of_bits [B0] :: 1 Word.word) + :: 5 Word.word)) + :: 11 Word.word)) + :: 12 Word.word)) + :: 13 Word.word),rs2,rs1,RISCV_BGEU)))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B1,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (ITYPE (imm,rs1,rd,RISCV_ADDI))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B1,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (ITYPE (imm,rs1,rd,RISCV_SLTI))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B1,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (ITYPE (imm,rs1,rd,RISCV_SLTIU))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B1,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (ITYPE (imm,rs1,rd,RISCV_XORI))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B1,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (ITYPE (imm,rs1,rd,RISCV_ORI))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B1,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (ITYPE (imm,rs1,rd,RISCV_ANDI))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 26 :: int)::ii) :: 6 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0] :: 6 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (shamt :: 6 bits) = ((subrange_vec_dec v__0 (( 25 :: int)::ii) (( 20 :: int)::ii) :: 6 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (SHIFTIOP (shamt,rs1,rd,RISCV_SLLI))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 26 :: int)::ii) :: 6 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0] :: 6 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (shamt :: 6 bits) = ((subrange_vec_dec v__0 (( 25 :: int)::ii) (( 20 :: int)::ii) :: 6 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (SHIFTIOP (shamt,rs1,rd,RISCV_SRLI))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 26 :: int)::ii) :: 6 Word.word)) = (vec_of_bits [B0,B1,B0,B0,B0,B0] :: 6 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (shamt :: 6 bits) = ((subrange_vec_dec v__0 (( 25 :: int)::ii) (( 20 :: int)::ii) :: 6 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (SHIFTIOP (shamt,rs1,rd,RISCV_SRAI))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (RTYPE (rs2,rs1,rd,RISCV_ADD))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (RTYPE (rs2,rs1,rd,RISCV_SUB))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (RTYPE (rs2,rs1,rd,RISCV_SLL))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (RTYPE (rs2,rs1,rd,RISCV_SLT))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (RTYPE (rs2,rs1,rd,RISCV_SLTU))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (RTYPE (rs2,rs1,rd,RISCV_XOR))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (RTYPE (rs2,rs1,rd,RISCV_SRL))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (RTYPE (rs2,rs1,rd,RISCV_SRA))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (RTYPE (rs2,rs1,rd,RISCV_OR))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (RTYPE (rs2,rs1,rd,RISCV_AND))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (LOAD (imm,rs1,rd,False,BYTE,False,False))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (LOAD (imm,rs1,rd,False,HALF,False,False))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (LOAD (imm,rs1,rd,False,WORD,False,False))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (LOAD (imm,rs1,rd,False,DOUBLE,False,False))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (LOAD (imm,rs1,rd,True,BYTE,False,False))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (LOAD (imm,rs1,rd,True,HALF,False,False))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (LOAD (imm,rs1,rd,True,WORD,False,False))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm7 :: 7 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (imm5 :: 5 bits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (STORE ((concat_vec imm7 imm5 :: 12 Word.word),rs2,rs1,BYTE,False,False)))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm7 :: 7 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (imm5 :: 5 bits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (STORE ((concat_vec imm7 imm5 :: 12 Word.word),rs2,rs1,HALF,False,False)))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm7 :: 7 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (imm5 :: 5 bits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (STORE ((concat_vec imm7 imm5 :: 12 Word.word),rs2,rs1,WORD,False,False)))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm7 :: 7 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (imm5 :: 5 bits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (STORE ((concat_vec imm7 imm5 :: 12 Word.word),rs2,rs1,DOUBLE,False,False)))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B1,B1,B0,B1,B1] :: 7 Word.word))))))) then + (let (imm :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (ADDIW (imm,rs1,rd))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B1,B1,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (shamt :: 5 bits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (SHIFTW (shamt,rs1,rd,RISCV_SLLI))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B1,B1,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (shamt :: 5 bits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (SHIFTW (shamt,rs1,rd,RISCV_SRLI))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B1,B1,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (shamt :: 5 bits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (SHIFTW (shamt,rs1,rd,RISCV_SRAI))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B1,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (RTYPEW (rs2,rs1,rd,RISCV_ADDW))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B1,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (RTYPEW (rs2,rs1,rd,RISCV_SUBW))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B1,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (RTYPEW (rs2,rs1,rd,RISCV_SLLW))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B1,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (RTYPEW (rs2,rs1,rd,RISCV_SRLW))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B0,B0,B0,B0] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B1,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (RTYPEW (rs2,rs1,rd,RISCV_SRAW))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B1] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (MUL (rs2,rs1,rd,False,True,True))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B1] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (MUL (rs2,rs1,rd,True,True,True))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B1] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (MUL (rs2,rs1,rd,True,True,False))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B1] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (MUL (rs2,rs1,rd,True,False,False))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B1] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (DIV (rs2,rs1,rd,True))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B1] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (DIV (rs2,rs1,rd,False))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B1] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (REM (rs2,rs1,rd,True))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B1] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B0,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (REM (rs2,rs1,rd,False))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B1] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B1,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (MULW (rs2,rs1,rd))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B1] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B1,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (DIVW (rs2,rs1,rd,True))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B1] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B1,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (DIVW (rs2,rs1,rd,False))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B1] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B1,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (REMW (rs2,rs1,rd,True))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B1] :: 7 Word.word)))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B1,B1,B0,B1,B1] :: 7 Word.word)))))))))) then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (REMW (rs2,rs1,rd,False))))) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 28 :: int)::ii) :: 4 Word.word)) = (vec_of_bits [B0,B0,B0,B0] :: 4 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 0 :: int)::ii) :: 20 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B1,B1,B1,B1] + :: 20 Word.word))))))) then + (let (pred :: 4 bits) = ((subrange_vec_dec v__0 (( 27 :: int)::ii) (( 24 :: int)::ii) :: 4 Word.word)) in + (let (succ :: 4 bits) = ((subrange_vec_dec v__0 (( 23 :: int)::ii) (( 20 :: int)::ii) :: 4 Word.word)) in + Some (FENCE (pred,succ)))) + else if (((v__0 = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B1,B0,B0,B0,B0, + B0,B0,B0,B0,B1,B1,B1,B1] + :: 32 Word.word)))) then + Some (FENCEI () ) + else if (((v__0 = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B1,B1,B1,B0,B0,B1,B1] + :: 32 Word.word)))) then + Some (ECALL () ) + else if (((v__0 = (vec_of_bits [B0,B0,B1,B1,B0,B0,B0,B0,B0,B0,B1,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B1,B1,B1,B0,B0,B1,B1] + :: 32 Word.word)))) then + Some (MRET () ) + else if (((v__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B0,B1,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B1,B1,B1,B0,B0,B1,B1] + :: 32 Word.word)))) then + Some (SRET () ) + else if (((v__0 = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B1,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B1,B1,B1,B0,B0,B1,B1] + :: 32 Word.word)))) then + Some (EBREAK () ) + else if (((v__0 = (vec_of_bits [B0,B0,B0,B1,B0,B0,B0,B0,B0,B1,B0,B1,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B1,B1,B1,B0,B0,B1,B1] + :: 32 Word.word)))) then + Some (WFI () ) + else if ((((((((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 25 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B1,B0,B0,B1] :: 7 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 0 :: int)::ii) :: 15 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B1,B1,B1,B0,B0,B1,B1] :: 15 Word.word))))))) + then + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + Some (SFENCE_VMA (rs1,rs2)))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B0,B0,B1,B0] :: 5 Word.word)))))) \<and> ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B0,B0,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word))))))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (LOADRES (bit_to_bool aq,bit_to_bool rl,rs1,WORD,rd)))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B0,B0,B1,B0] :: 5 Word.word)))))) \<and> ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B0,B0,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word))))))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (LOADRES (bit_to_bool aq,bit_to_bool rl,rs1,DOUBLE,rd)))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B0,B0,B1,B1] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (STORECON (bit_to_bool aq,bit_to_bool rl,rs2,rs1,WORD,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B0,B0,B1,B1] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (STORECON (bit_to_bool aq,bit_to_bool rl,rs2,rs1,DOUBLE,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B0,B0,B0,B1] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOSWAP,bit_to_bool aq,bit_to_bool rl,rs2,rs1,WORD,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B0,B0,B0,B1] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOSWAP,bit_to_bool aq,bit_to_bool rl,rs2,rs1,DOUBLE,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B0,B0,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOADD,bit_to_bool aq,bit_to_bool rl,rs2,rs1,WORD,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B0,B0,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOADD,bit_to_bool aq,bit_to_bool rl,rs2,rs1,DOUBLE,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B0,B1,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOXOR,bit_to_bool aq,bit_to_bool rl,rs2,rs1,WORD,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B0,B1,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOXOR,bit_to_bool aq,bit_to_bool rl,rs2,rs1,DOUBLE,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B1,B1,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOAND,bit_to_bool aq,bit_to_bool rl,rs2,rs1,WORD,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B1,B1,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOAND,bit_to_bool aq,bit_to_bool rl,rs2,rs1,DOUBLE,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B1,B0,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOOR,bit_to_bool aq,bit_to_bool rl,rs2,rs1,WORD,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B1,B0,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOOR,bit_to_bool aq,bit_to_bool rl,rs2,rs1,DOUBLE,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B1,B0,B0,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOMIN,bit_to_bool aq,bit_to_bool rl,rs2,rs1,WORD,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B1,B0,B0,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOMIN,bit_to_bool aq,bit_to_bool rl,rs2,rs1,DOUBLE,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B1,B0,B1,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOMAX,bit_to_bool aq,bit_to_bool rl,rs2,rs1,WORD,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B1,B0,B1,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOMAX,bit_to_bool aq,bit_to_bool rl,rs2,rs1,DOUBLE,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B1,B1,B0,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOMINU,bit_to_bool aq,bit_to_bool rl,rs2,rs1,WORD,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B1,B1,B0,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOMINU,bit_to_bool aq,bit_to_bool rl,rs2,rs1,DOUBLE,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B1,B1,B1,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOMAXU,bit_to_bool aq,bit_to_bool rl,rs2,rs1,WORD,rd))))))) + else if ((((((((regbits_to_regno ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 27 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B1,B1,B1,B0,B0] :: 5 Word.word)))))) \<and> ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B1,B0,B1,B1,B1,B1] :: 7 Word.word)))))))))) then + (let aq = (access_vec_dec v__0 (( 26 :: int)::ii)) in + (let rl = (access_vec_dec v__0 (( 25 :: int)::ii)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__0 (( 24 :: int)::ii) (( 20 :: int)::ii) :: 5 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (AMO (AMOMAXU,bit_to_bool aq,bit_to_bool rl,rs2,rs1,DOUBLE,rd))))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B1,B1,B1,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (csr :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (CSR (csr,rs1,rd,False,CSRRW))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B1,B1,B1,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (csr :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (CSR (csr,rs1,rd,False,CSRRS))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B1,B1,B1,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (csr :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (CSR (csr,rs1,rd,False,CSRRC))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B1,B1,B1,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (csr :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (CSR (csr,rs1,rd,True,CSRRW))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B1,B1,B1,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (csr :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (CSR (csr,rs1,rd,True,CSRRS))))) + else if ((((((((subrange_vec_dec v__0 (( 14 :: int)::ii) (( 12 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__0 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B1,B1,B1,B0,B0,B1,B1] :: 7 Word.word))))))) then + (let (csr :: 12 bits) = ((subrange_vec_dec v__0 (( 31 :: int)::ii) (( 20 :: int)::ii) :: 12 Word.word)) in + (let (rs1 :: regbits) = ((subrange_vec_dec v__0 (( 19 :: int)::ii) (( 15 :: int)::ii) :: 5 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__0 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + Some (CSR (csr,rs1,rd,True,CSRRC))))) + else None )" + + +definition decodeCompressed :: "(16)Word.word \<Rightarrow>(ast)option " where + " decodeCompressed v__418 = ( + if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B0] :: 3 Word.word)))) \<and> ((((((((regbits_to_regno ((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B0,B0,B0,B0] :: 5 Word.word)))))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word)))))))))) then + (let (nzi1 :: 1 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 12 :: int)::ii) :: 1 Word.word)) in + (let (nzi0 :: 5 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 2 :: int)::ii) :: 5 Word.word)) in + if ((((((nzi1 = (vec_of_bits [B0] :: 1 Word.word)))) \<and> (((((regbits_to_regno nzi0)) = ((regbits_to_regno (vec_of_bits [B0,B0,B0,B0,B0] :: 5 Word.word))))))))) then + Some (NOP () ) + else None)) + else if (((v__418 = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] :: 16 Word.word)))) then + Some (ILLEGAL () ) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B0] :: 2 Word.word))))))) then + (let (nz54 :: 2 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 11 :: int)::ii) :: 2 Word.word)) in + (let (nz96 :: 4 bits) = ((subrange_vec_dec v__418 (( 10 :: int)::ii) (( 7 :: int)::ii) :: 4 Word.word)) in + (let (nz2 :: 1 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 6 :: int)::ii) :: 1 Word.word)) in + (let (nz3 :: 1 bits) = ((subrange_vec_dec v__418 (( 5 :: int)::ii) (( 5 :: int)::ii) :: 1 Word.word)) in + (let (rd :: cregbits) = ((subrange_vec_dec v__418 (( 4 :: int)::ii) (( 2 :: int)::ii) :: 3 Word.word)) in + (let nzimm = + ((concat_vec nz96 ((concat_vec nz54 ((concat_vec nz3 nz2 :: 2 Word.word)) :: 4 Word.word)) + :: 8 Word.word)) in + if (((nzimm = (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0] :: 8 Word.word)))) then None + else Some (C_ADDI4SPN (rd,nzimm)))))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B0] :: 2 Word.word))))))) then + (let (ui53 :: 3 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 10 :: int)::ii) :: 3 Word.word)) in + (let (rs1 :: cregbits) = ((subrange_vec_dec v__418 (( 9 :: int)::ii) (( 7 :: int)::ii) :: 3 Word.word)) in + (let (ui2 :: 1 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 6 :: int)::ii) :: 1 Word.word)) in + (let (ui6 :: 1 bits) = ((subrange_vec_dec v__418 (( 5 :: int)::ii) (( 5 :: int)::ii) :: 1 Word.word)) in + (let (rd :: cregbits) = ((subrange_vec_dec v__418 (( 4 :: int)::ii) (( 2 :: int)::ii) :: 3 Word.word)) in + (let uimm = ((concat_vec ui6 ((concat_vec ui53 ui2 :: 4 Word.word)) :: 5 Word.word)) in + Some (C_LW (uimm,rs1,rd)))))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B0] :: 2 Word.word))))))) then + (let (ui53 :: 3 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 10 :: int)::ii) :: 3 Word.word)) in + (let (rs1 :: cregbits) = ((subrange_vec_dec v__418 (( 9 :: int)::ii) (( 7 :: int)::ii) :: 3 Word.word)) in + (let (ui76 :: 2 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 5 :: int)::ii) :: 2 Word.word)) in + (let (rd :: cregbits) = ((subrange_vec_dec v__418 (( 4 :: int)::ii) (( 2 :: int)::ii) :: 3 Word.word)) in + (let uimm = ((concat_vec ui76 ui53 :: 5 Word.word)) in + Some (C_LD (uimm,rs1,rd))))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B0] :: 2 Word.word))))))) then + (let (ui53 :: 3 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 10 :: int)::ii) :: 3 Word.word)) in + (let (rs1 :: cregbits) = ((subrange_vec_dec v__418 (( 9 :: int)::ii) (( 7 :: int)::ii) :: 3 Word.word)) in + (let (ui2 :: 1 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 6 :: int)::ii) :: 1 Word.word)) in + (let (ui6 :: 1 bits) = ((subrange_vec_dec v__418 (( 5 :: int)::ii) (( 5 :: int)::ii) :: 1 Word.word)) in + (let (rs2 :: cregbits) = ((subrange_vec_dec v__418 (( 4 :: int)::ii) (( 2 :: int)::ii) :: 3 Word.word)) in + (let uimm = ((concat_vec ui6 ((concat_vec ui53 ui2 :: 4 Word.word)) :: 5 Word.word)) in + Some (C_SW (uimm,rs1,rs2)))))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B0] :: 2 Word.word))))))) then + (let (ui53 :: 3 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 10 :: int)::ii) :: 3 Word.word)) in + (let (rs1 :: 3 bits) = ((subrange_vec_dec v__418 (( 9 :: int)::ii) (( 7 :: int)::ii) :: 3 Word.word)) in + (let (ui76 :: 2 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 5 :: int)::ii) :: 2 Word.word)) in + (let (rs2 :: 3 bits) = ((subrange_vec_dec v__418 (( 4 :: int)::ii) (( 2 :: int)::ii) :: 3 Word.word)) in + (let uimm = ((concat_vec ui76 ui53 :: 5 Word.word)) in + Some (C_SD (uimm,rs1,rs2))))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word))))))) then + (let (nzi5 :: 1 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 12 :: int)::ii) :: 1 Word.word)) in + (let (rsd :: regbits) = ((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + (let (nzi40 :: 5 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 2 :: int)::ii) :: 5 Word.word)) in + (let nzi = ((concat_vec nzi5 nzi40 :: 6 Word.word)) in + if ((((((nzi = (vec_of_bits [B0,B0,B0,B0,B0,B0] :: 6 Word.word)))) \<or> (((((regbits_to_regno rsd)) = ((regbits_to_regno zreg)))))))) then + None + else Some (C_ADDI (nzi,rsd)))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word))))))) then + (let (imm5 :: 1 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 12 :: int)::ii) :: 1 Word.word)) in + (let (rsd :: regbits) = ((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + (let (imm40 :: 5 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 2 :: int)::ii) :: 5 Word.word)) in + Some (C_ADDIW ((concat_vec imm5 imm40 :: 6 Word.word),rsd))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word))))))) then + (let (imm5 :: 1 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 12 :: int)::ii) :: 1 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + (let (imm40 :: 5 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 2 :: int)::ii) :: 5 Word.word)) in + if (((((regbits_to_regno rd)) = ((regbits_to_regno zreg))))) then None + else Some (C_LI ((concat_vec imm5 imm40 :: 6 Word.word),rd))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> ((((((((regbits_to_regno ((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)))) = ((regbits_to_regno (vec_of_bits [B0,B0,B0,B1,B0] :: 5 Word.word)))))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word)))))))))) then + (let (nzi9 :: 1 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 12 :: int)::ii) :: 1 Word.word)) in + (let (nzi4 :: 1 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 6 :: int)::ii) :: 1 Word.word)) in + (let (nzi6 :: 1 bits) = ((subrange_vec_dec v__418 (( 5 :: int)::ii) (( 5 :: int)::ii) :: 1 Word.word)) in + (let (nzi87 :: 2 bits) = ((subrange_vec_dec v__418 (( 4 :: int)::ii) (( 3 :: int)::ii) :: 2 Word.word)) in + (let (nzi5 :: 1 bits) = ((subrange_vec_dec v__418 (( 2 :: int)::ii) (( 2 :: int)::ii) :: 1 Word.word)) in + (let nzimm = + ((concat_vec nzi9 + ((concat_vec nzi87 ((concat_vec nzi6 ((concat_vec nzi5 nzi4 :: 2 Word.word)) :: 3 Word.word)) + :: 5 Word.word)) + :: 6 Word.word)) in + if (((nzimm = (vec_of_bits [B0,B0,B0,B0,B0,B0] :: 6 Word.word)))) then None + else Some (C_ADDI16SP nzimm))))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word))))))) then + (let (imm17 :: 1 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 12 :: int)::ii) :: 1 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + (let (imm1612 :: 5 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 2 :: int)::ii) :: 5 Word.word)) in + if ((((((((regbits_to_regno rd)) = ((regbits_to_regno zreg))))) \<or> (((((regbits_to_regno rd)) = ((regbits_to_regno sp)))))))) then + None + else Some (C_LUI ((concat_vec imm17 imm1612 :: 6 Word.word),rd))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B0] :: 3 Word.word)))) \<and> ((((((((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 10 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B0] :: 2 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word)))))))))) then + (let (nzui5 :: 1 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 12 :: int)::ii) :: 1 Word.word)) in + (let (rsd :: cregbits) = ((subrange_vec_dec v__418 (( 9 :: int)::ii) (( 7 :: int)::ii) :: 3 Word.word)) in + (let (nzui40 :: 5 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 2 :: int)::ii) :: 5 Word.word)) in + (let (shamt :: 6 bits) = ((concat_vec nzui5 nzui40 :: 6 Word.word)) in + if (((shamt = (vec_of_bits [B0,B0,B0,B0,B0,B0] :: 6 Word.word)))) then None + else Some (C_SRLI (shamt,rsd)))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B0] :: 3 Word.word)))) \<and> ((((((((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 10 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word)))))))))) then + (let (nzui5 :: 1 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 12 :: int)::ii) :: 1 Word.word)) in + (let (rsd :: cregbits) = ((subrange_vec_dec v__418 (( 9 :: int)::ii) (( 7 :: int)::ii) :: 3 Word.word)) in + (let (nzui40 :: 5 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 2 :: int)::ii) :: 5 Word.word)) in + (let (shamt :: 6 bits) = ((concat_vec nzui5 nzui40 :: 6 Word.word)) in + if (((shamt = (vec_of_bits [B0,B0,B0,B0,B0,B0] :: 6 Word.word)))) then None + else Some (C_SRAI (shamt,rsd)))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B0] :: 3 Word.word)))) \<and> ((((((((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 10 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B1,B0] :: 2 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word)))))))))) then + (let (i5 :: 1 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 12 :: int)::ii) :: 1 Word.word)) in + (let (rsd :: cregbits) = ((subrange_vec_dec v__418 (( 9 :: int)::ii) (( 7 :: int)::ii) :: 3 Word.word)) in + (let (i40 :: 5 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 2 :: int)::ii) :: 5 Word.word)) in + Some (C_ANDI ((concat_vec i5 i40 :: 6 Word.word),rsd))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 10 :: int)::ii) :: 6 Word.word)) = (vec_of_bits [B1,B0,B0,B0,B1,B1] :: 6 Word.word)))) \<and> ((((((((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 5 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B0] :: 2 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word)))))))))) then + (let (rsd :: cregbits) = ((subrange_vec_dec v__418 (( 9 :: int)::ii) (( 7 :: int)::ii) :: 3 Word.word)) in + (let (rs2 :: cregbits) = ((subrange_vec_dec v__418 (( 4 :: int)::ii) (( 2 :: int)::ii) :: 3 Word.word)) in + Some (C_SUB (rsd,rs2)))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 10 :: int)::ii) :: 6 Word.word)) = (vec_of_bits [B1,B0,B0,B0,B1,B1] :: 6 Word.word)))) \<and> ((((((((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 5 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word)))))))))) then + (let (rsd :: cregbits) = ((subrange_vec_dec v__418 (( 9 :: int)::ii) (( 7 :: int)::ii) :: 3 Word.word)) in + (let (rs2 :: cregbits) = ((subrange_vec_dec v__418 (( 4 :: int)::ii) (( 2 :: int)::ii) :: 3 Word.word)) in + Some (C_XOR (rsd,rs2)))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 10 :: int)::ii) :: 6 Word.word)) = (vec_of_bits [B1,B0,B0,B0,B1,B1] :: 6 Word.word)))) \<and> ((((((((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 5 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B1,B0] :: 2 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word)))))))))) then + (let (rsd :: cregbits) = ((subrange_vec_dec v__418 (( 9 :: int)::ii) (( 7 :: int)::ii) :: 3 Word.word)) in + (let (rs2 :: cregbits) = ((subrange_vec_dec v__418 (( 4 :: int)::ii) (( 2 :: int)::ii) :: 3 Word.word)) in + Some (C_OR (rsd,rs2)))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 10 :: int)::ii) :: 6 Word.word)) = (vec_of_bits [B1,B0,B0,B0,B1,B1] :: 6 Word.word)))) \<and> ((((((((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 5 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B1,B1] :: 2 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word)))))))))) then + (let (rsd :: cregbits) = ((subrange_vec_dec v__418 (( 9 :: int)::ii) (( 7 :: int)::ii) :: 3 Word.word)) in + (let (rs2 :: cregbits) = ((subrange_vec_dec v__418 (( 4 :: int)::ii) (( 2 :: int)::ii) :: 3 Word.word)) in + Some (C_AND (rsd,rs2)))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 10 :: int)::ii) :: 6 Word.word)) = (vec_of_bits [B1,B0,B0,B1,B1,B1] :: 6 Word.word)))) \<and> ((((((((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 5 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B0] :: 2 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word)))))))))) then + (let (rsd :: cregbits) = ((subrange_vec_dec v__418 (( 9 :: int)::ii) (( 7 :: int)::ii) :: 3 Word.word)) in + (let (rs2 :: cregbits) = ((subrange_vec_dec v__418 (( 4 :: int)::ii) (( 2 :: int)::ii) :: 3 Word.word)) in + Some (C_SUBW (rsd,rs2)))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 10 :: int)::ii) :: 6 Word.word)) = (vec_of_bits [B1,B0,B0,B1,B1,B1] :: 6 Word.word)))) \<and> ((((((((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 5 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word)))))))))) then + (let (rsd :: cregbits) = ((subrange_vec_dec v__418 (( 9 :: int)::ii) (( 7 :: int)::ii) :: 3 Word.word)) in + (let (rs2 :: cregbits) = ((subrange_vec_dec v__418 (( 4 :: int)::ii) (( 2 :: int)::ii) :: 3 Word.word)) in + Some (C_ADDW (rsd,rs2)))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B0,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word))))))) then + (let (i11 :: 1 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 12 :: int)::ii) :: 1 Word.word)) in + (let (i4 :: 1 bits) = ((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 11 :: int)::ii) :: 1 Word.word)) in + (let (i98 :: 2 bits) = ((subrange_vec_dec v__418 (( 10 :: int)::ii) (( 9 :: int)::ii) :: 2 Word.word)) in + (let (i10 :: 1 bits) = ((subrange_vec_dec v__418 (( 8 :: int)::ii) (( 8 :: int)::ii) :: 1 Word.word)) in + (let (i6 :: 1 bits) = ((subrange_vec_dec v__418 (( 7 :: int)::ii) (( 7 :: int)::ii) :: 1 Word.word)) in + (let (i7 :: 1 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 6 :: int)::ii) :: 1 Word.word)) in + (let (i31 :: 3 bits) = ((subrange_vec_dec v__418 (( 5 :: int)::ii) (( 3 :: int)::ii) :: 3 Word.word)) in + (let (i5 :: 1 bits) = ((subrange_vec_dec v__418 (( 2 :: int)::ii) (( 2 :: int)::ii) :: 1 Word.word)) in + Some (C_J ((concat_vec i11 + ((concat_vec i10 + ((concat_vec i98 + ((concat_vec i7 + ((concat_vec i6 + ((concat_vec i5 ((concat_vec i4 i31 :: 4 Word.word)) :: 5 Word.word)) + :: 6 Word.word)) + :: 7 Word.word)) + :: 9 Word.word)) + :: 10 Word.word)) + :: 11 Word.word))))))))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word))))))) then + (let (i8 :: 1 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 12 :: int)::ii) :: 1 Word.word)) in + (let (i43 :: 2 bits) = ((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 10 :: int)::ii) :: 2 Word.word)) in + (let (rs :: cregbits) = ((subrange_vec_dec v__418 (( 9 :: int)::ii) (( 7 :: int)::ii) :: 3 Word.word)) in + (let (i76 :: 2 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 5 :: int)::ii) :: 2 Word.word)) in + (let (i21 :: 2 bits) = ((subrange_vec_dec v__418 (( 4 :: int)::ii) (( 3 :: int)::ii) :: 2 Word.word)) in + (let (i5 :: 1 bits) = ((subrange_vec_dec v__418 (( 2 :: int)::ii) (( 2 :: int)::ii) :: 1 Word.word)) in + Some (C_BEQZ ((concat_vec i8 + ((concat_vec i76 + ((concat_vec i5 ((concat_vec i43 i21 :: 4 Word.word)) :: 5 Word.word)) + :: 7 Word.word)) + :: 8 Word.word),rs)))))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B0,B1] :: 2 Word.word))))))) then + (let (i8 :: 1 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 12 :: int)::ii) :: 1 Word.word)) in + (let (i43 :: 2 bits) = ((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 10 :: int)::ii) :: 2 Word.word)) in + (let (rs :: cregbits) = ((subrange_vec_dec v__418 (( 9 :: int)::ii) (( 7 :: int)::ii) :: 3 Word.word)) in + (let (i76 :: 2 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 5 :: int)::ii) :: 2 Word.word)) in + (let (i21 :: 2 bits) = ((subrange_vec_dec v__418 (( 4 :: int)::ii) (( 3 :: int)::ii) :: 2 Word.word)) in + (let (i5 :: 1 bits) = ((subrange_vec_dec v__418 (( 2 :: int)::ii) (( 2 :: int)::ii) :: 1 Word.word)) in + Some (C_BNEZ ((concat_vec i8 + ((concat_vec i76 + ((concat_vec i5 ((concat_vec i43 i21 :: 4 Word.word)) :: 5 Word.word)) + :: 7 Word.word)) + :: 8 Word.word),rs)))))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B0,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B1,B0] :: 2 Word.word))))))) then + (let (nzui5 :: 1 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 12 :: int)::ii) :: 1 Word.word)) in + (let (rsd :: regbits) = ((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + (let (nzui40 :: 5 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 2 :: int)::ii) :: 5 Word.word)) in + (let (shamt :: 6 bits) = ((concat_vec nzui5 nzui40 :: 6 Word.word)) in + if ((((((shamt = (vec_of_bits [B0,B0,B0,B0,B0,B0] :: 6 Word.word)))) \<or> (((((regbits_to_regno rsd)) = ((regbits_to_regno zreg)))))))) then + None + else Some (C_SLLI (shamt,rsd)))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B1,B0] :: 2 Word.word))))))) then + (let (ui5 :: 1 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 12 :: int)::ii) :: 1 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + (let (ui42 :: 3 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 4 :: int)::ii) :: 3 Word.word)) in + (let (ui76 :: 2 bits) = ((subrange_vec_dec v__418 (( 3 :: int)::ii) (( 2 :: int)::ii) :: 2 Word.word)) in + (let (uimm :: 6 bits) = ((concat_vec ui76 ((concat_vec ui5 ui42 :: 4 Word.word)) :: 6 Word.word)) in + if (((((regbits_to_regno rd)) = ((regbits_to_regno zreg))))) then None + else Some (C_LWSP (uimm,rd))))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B0,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B1,B0] :: 2 Word.word))))))) then + (let (ui5 :: 1 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 12 :: int)::ii) :: 1 Word.word)) in + (let (rd :: regbits) = ((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + (let (ui43 :: 2 bits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 5 :: int)::ii) :: 2 Word.word)) in + (let (ui86 :: 3 bits) = ((subrange_vec_dec v__418 (( 4 :: int)::ii) (( 2 :: int)::ii) :: 3 Word.word)) in + (let (uimm :: 6 bits) = ((concat_vec ui86 ((concat_vec ui5 ui43 :: 3 Word.word)) :: 6 Word.word)) in + if (((((regbits_to_regno rd)) = ((regbits_to_regno zreg))))) then None + else Some (C_LDSP (uimm,rd))))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B0] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B1,B0] :: 2 Word.word))))))) then + (let (ui52 :: 4 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 9 :: int)::ii) :: 4 Word.word)) in + (let (ui76 :: 2 bits) = ((subrange_vec_dec v__418 (( 8 :: int)::ii) (( 7 :: int)::ii) :: 2 Word.word)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 2 :: int)::ii) :: 5 Word.word)) in + (let (uimm :: 6 bits) = ((concat_vec ui76 ui52 :: 6 Word.word)) in + Some (C_SWSP (uimm,rs2)))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 13 :: int)::ii) :: 3 Word.word)) = (vec_of_bits [B1,B1,B1] :: 3 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B1,B0] :: 2 Word.word))))))) then + (let (ui53 :: 3 bits) = ((subrange_vec_dec v__418 (( 12 :: int)::ii) (( 10 :: int)::ii) :: 3 Word.word)) in + (let (ui86 :: 3 bits) = ((subrange_vec_dec v__418 (( 9 :: int)::ii) (( 7 :: int)::ii) :: 3 Word.word)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 2 :: int)::ii) :: 5 Word.word)) in + (let (uimm :: 6 bits) = ((concat_vec ui86 ui53 :: 6 Word.word)) in + Some (C_SDSP (uimm,rs2)))))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 12 :: int)::ii) :: 4 Word.word)) = (vec_of_bits [B1,B0,B0,B0] :: 4 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B1,B0] :: 7 Word.word))))))) then + (let (rs1 :: regbits) = ((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + if (((((regbits_to_regno rs1)) = ((regbits_to_regno zreg))))) then None + else Some (C_JR rs1)) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 12 :: int)::ii) :: 4 Word.word)) = (vec_of_bits [B1,B0,B0,B1] :: 4 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 0 :: int)::ii) :: 7 Word.word)) = (vec_of_bits [B0,B0,B0,B0,B0,B1,B0] :: 7 Word.word))))))) then + (let (rs1 :: regbits) = ((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + if (((((regbits_to_regno rs1)) = ((regbits_to_regno zreg))))) then None + else Some (C_JALR rs1)) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 12 :: int)::ii) :: 4 Word.word)) = (vec_of_bits [B1,B0,B0,B0] :: 4 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B1,B0] :: 2 Word.word))))))) then + (let (rd :: regbits) = ((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 2 :: int)::ii) :: 5 Word.word)) in + if ((((((((regbits_to_regno rs2)) = ((regbits_to_regno zreg))))) \<or> (((((regbits_to_regno rd)) = ((regbits_to_regno zreg)))))))) then + None + else Some (C_MV (rd,rs2)))) + else if ((((((((subrange_vec_dec v__418 (( 15 :: int)::ii) (( 12 :: int)::ii) :: 4 Word.word)) = (vec_of_bits [B1,B0,B0,B1] :: 4 Word.word)))) \<and> (((((subrange_vec_dec v__418 (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B1,B0] :: 2 Word.word))))))) then + (let (rsd :: regbits) = ((subrange_vec_dec v__418 (( 11 :: int)::ii) (( 7 :: int)::ii) :: 5 Word.word)) in + (let (rs2 :: regbits) = ((subrange_vec_dec v__418 (( 6 :: int)::ii) (( 2 :: int)::ii) :: 5 Word.word)) in + if ((((((((regbits_to_regno rsd)) = ((regbits_to_regno zreg))))) \<or> (((((regbits_to_regno rs2)) = ((regbits_to_regno zreg)))))))) then + None + else Some (C_ADD (rsd,rs2)))) + else None )" + + +(*val execute_WFI : unit -> M unit*) + +fun execute_WFI :: " unit \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_WFI g__110 = ( + read_reg cur_privilege_ref \<bind> (\<lambda> (w__0 :: Privilege) . + (case w__0 of + Machine => return () + | Supervisor => + read_reg mstatus_ref \<bind> (\<lambda> (w__1 :: Mstatus) . + if (((((get_Mstatus_TW w__1 :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) then + handle_illegal () + else return () ) + | User => handle_illegal () + )))" + + +(*val execute_UTYPE : mword ty20 -> mword ty5 -> uop -> M unit*) + +fun execute_UTYPE :: "(20)Word.word \<Rightarrow>(5)Word.word \<Rightarrow> uop \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_UTYPE imm rd op1 = ( + (let (off :: xlenbits) = + ((EXTS (( 64 :: int)::ii) + ((concat_vec imm (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] :: 12 Word.word) + :: 32 Word.word)) + :: 64 Word.word)) in + (case op1 of + RISCV_LUI => return off + | RISCV_AUIPC => + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: 64 Word.word) . + return ((add_vec w__0 off :: 64 Word.word))) + ) \<bind> (\<lambda> (ret :: xlenbits) . + wX ((regbits_to_regno rd)) ret)))" + + +(*val execute_STORECON : bool -> bool -> mword ty5 -> mword ty5 -> word_width -> mword ty5 -> M unit*) + +fun execute_STORECON :: " bool \<Rightarrow> bool \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow> word_width \<Rightarrow>(5)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_STORECON aq rl rs2 rs1 width rd = ( + speculate_conditional_success () \<bind> (\<lambda> (w__0 :: bool) . + (let (status :: 1 bits) = + (if w__0 then (vec_of_bits [B0] :: 1 Word.word) + else (vec_of_bits [B1] :: 1 Word.word)) in + wX ((regbits_to_regno rd)) ((EXTZ (( 64 :: int)::ii) status :: 64 Word.word)) \<then> + (if (((status = (vec_of_bits [B1] :: 1 Word.word)))) then return () + else + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> (vaddr :: xlenbits) . + translateAddr vaddr Write Data \<bind> (\<lambda> (w__1 :: TR_Result) . + (case w__1 of + TR_Failure (e) => handle_mem_exception vaddr e + | TR_Address (addr) => + (case width of + WORD => mem_write_ea addr (( 4 :: int)::ii) aq rl True + | DOUBLE => mem_write_ea addr (( 8 :: int)::ii) aq rl True + | _ => internal_error (''STORECON expected word or double'') + ) \<bind> (\<lambda> (eares :: unit MemoryOpResult) . + (case eares of + MemException (e) => handle_mem_exception addr e + | MemValue (_) => + (rX ((regbits_to_regno rs2)) :: ( 64 Word.word) M) \<bind> (\<lambda> rs2_val . + (case width of + WORD => + mem_write_value addr (( 4 :: int)::ii) ((subrange_vec_dec rs2_val (( 31 :: int)::ii) (( 0 :: int)::ii) :: 32 Word.word)) + aq rl True + | DOUBLE => mem_write_value addr (( 8 :: int)::ii) rs2_val aq rl True + | _ => internal_error (''STORECON expected word or double'') + ) \<bind> (\<lambda> (res :: unit MemoryOpResult) . + (case res of + MemValue (_) => return () + | MemException (e) => handle_mem_exception addr e + ))) + )) + )))))))" + + +(*val execute_STORE : mword ty12 -> mword ty5 -> mword ty5 -> word_width -> bool -> bool -> M unit*) + +fun execute_STORE :: "(12)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow> word_width \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_STORE imm rs2 rs1 width aq rl = ( + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: 64 Word.word) . + (let (vaddr :: xlenbits) = ((add_vec w__0 ((EXTS (( 64 :: int)::ii) imm :: 64 Word.word)) :: 64 Word.word)) in + translateAddr vaddr Write Data \<bind> (\<lambda> (w__1 :: TR_Result) . + (case w__1 of + TR_Failure (e) => handle_mem_exception vaddr e + | TR_Address (addr) => + (case width of + BYTE => mem_write_ea addr (( 1 :: int)::ii) aq rl False + | HALF => mem_write_ea addr (( 2 :: int)::ii) aq rl False + | WORD => mem_write_ea addr (( 4 :: int)::ii) aq rl False + | DOUBLE => mem_write_ea addr (( 8 :: int)::ii) aq rl False + ) \<bind> (\<lambda> (eares :: unit MemoryOpResult) . + (case eares of + MemException (e) => handle_mem_exception addr e + | MemValue (_) => + (rX ((regbits_to_regno rs2)) :: ( 64 Word.word) M) \<bind> (\<lambda> rs2_val . + (case width of + BYTE => + mem_write_value addr (( 1 :: int)::ii) ((subrange_vec_dec rs2_val (( 7 :: int)::ii) (( 0 :: int)::ii) :: 8 Word.word)) aq + rl False + | HALF => + mem_write_value addr (( 2 :: int)::ii) ((subrange_vec_dec rs2_val (( 15 :: int)::ii) (( 0 :: int)::ii) :: 16 Word.word)) aq + rl False + | WORD => + mem_write_value addr (( 4 :: int)::ii) ((subrange_vec_dec rs2_val (( 31 :: int)::ii) (( 0 :: int)::ii) :: 32 Word.word)) aq + rl False + | DOUBLE => mem_write_value addr (( 8 :: int)::ii) rs2_val aq rl False + ) \<bind> (\<lambda> (res :: unit MemoryOpResult) . + (case res of + MemValue (_) => return () + | MemException (e) => handle_mem_exception addr e + ))) + )) + )))))" + + +(*val execute_SRET : unit -> M unit*) + +fun execute_SRET :: " unit \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_SRET g__108 = ( + read_reg cur_privilege_ref \<bind> (\<lambda> (w__0 :: Privilege) . + (case w__0 of + User => handle_illegal () + | Supervisor => + read_reg mstatus_ref \<bind> (\<lambda> (w__1 :: Mstatus) . + if (((((get_Mstatus_TSR w__1 :: 1 Word.word)) = ((bool_to_bits True :: 1 Word.word))))) then + handle_illegal () + else + read_reg cur_privilege_ref \<bind> (\<lambda> (w__2 :: Privilege) . + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__3 :: 64 Word.word) . + (handle_exception w__2 (CTL_SRET () ) w__3 :: ( 64 Word.word) M) \<bind> (\<lambda> (w__4 :: xlenbits) . + write_reg nextPC_ref w__4)))) + | Machine => + read_reg cur_privilege_ref \<bind> (\<lambda> (w__5 :: Privilege) . + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__6 :: 64 Word.word) . + (handle_exception w__5 (CTL_SRET () ) w__6 :: ( 64 Word.word) M) \<bind> (\<lambda> (w__7 :: xlenbits) . + write_reg nextPC_ref w__7))) + )))" + + +(*val execute_SHIFTW : mword ty5 -> mword ty5 -> mword ty5 -> sop -> M unit*) + +fun execute_SHIFTW :: "(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow> sop \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_SHIFTW shamt rs1 rd op1 = ( + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: 64 Word.word) . + (let rs1_val = ((subrange_vec_dec w__0 (( 31 :: int)::ii) (( 0 :: int)::ii) :: 32 Word.word)) in + (let (result :: 32 bits) = + ((case op1 of + RISCV_SLLI => (shift_bits_left rs1_val shamt :: 32 Word.word) + | RISCV_SRLI => (shift_bits_right rs1_val shamt :: 32 Word.word) + | RISCV_SRAI => (shift_right_arith32 rs1_val shamt :: 32 Word.word) + )) in + wX ((regbits_to_regno rd)) ((EXTS (( 64 :: int)::ii) result :: 64 Word.word))))))" + + +(*val execute_SHIFTIOP : mword ty6 -> mword ty5 -> mword ty5 -> sop -> M unit*) + +fun execute_SHIFTIOP :: "(6)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow> sop \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_SHIFTIOP shamt rs1 rd op1 = ( + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> rs1_val . + (let (result :: xlenbits) = + ((case op1 of + RISCV_SLLI => (shift_bits_left rs1_val shamt :: 64 Word.word) + | RISCV_SRLI => (shift_bits_right rs1_val shamt :: 64 Word.word) + | RISCV_SRAI => (shift_right_arith64 rs1_val shamt :: 64 Word.word) + )) in + wX ((regbits_to_regno rd)) result)))" + + +(*val execute_SFENCE_VMA : mword ty5 -> mword ty5 -> M unit*) + +fun execute_SFENCE_VMA :: "(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_SFENCE_VMA rs1 rs2 = ( + read_reg cur_privilege_ref \<bind> (\<lambda> (w__0 :: Privilege) . + if (((((privLevel_to_bits w__0 :: 2 Word.word)) = ((privLevel_to_bits User :: 2 Word.word))))) + then + handle_illegal () + else + read_reg mstatus_ref \<bind> (\<lambda> (w__1 :: Mstatus) . + read_reg mstatus_ref \<bind> (\<lambda> (w__2 :: Mstatus) . + (let p__104 = + (architecture ((get_Mstatus_SXL w__1 :: 2 Word.word)), (get_Mstatus_TVM w__2 :: 1 Word.word)) in + (case p__104 of + (Some (RV64), v_0) => + if (((v_0 = ((bool_to_bits True :: 1 Word.word))))) then handle_illegal () + else + (if (((((regbits_to_regno rs1)) = (( 0 :: int)::ii)))) then return None + else + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> (w__3 :: 64 Word.word) . + return (Some ((subrange_vec_dec w__3 (( 38 :: int)::ii) (( 0 :: int)::ii) :: 39 Word.word))))) \<bind> (\<lambda> (addr :: + vaddr39 option) . + (if (((((regbits_to_regno rs2)) = (( 0 :: int)::ii)))) then return None + else + (rX ((regbits_to_regno rs2)) :: ( 64 Word.word) M) \<bind> (\<lambda> (w__4 :: 64 Word.word) . + return (Some ((subrange_vec_dec w__4 (( 15 :: int)::ii) (( 0 :: int)::ii) :: 16 Word.word))))) \<bind> (\<lambda> (asid :: + asid64 option) . + flushTLB asid addr)) + | (g__102, g__103) => internal_error (''unimplemented sfence architecture'') + ))))))" + + +(*val execute_RTYPEW : mword ty5 -> mword ty5 -> mword ty5 -> ropw -> M unit*) + +fun execute_RTYPEW :: "(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow> ropw \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_RTYPEW rs2 rs1 rd op1 = ( + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: 64 Word.word) . + (let rs1_val = ((subrange_vec_dec w__0 (( 31 :: int)::ii) (( 0 :: int)::ii) :: 32 Word.word)) in + (rX ((regbits_to_regno rs2)) :: ( 64 Word.word) M) \<bind> (\<lambda> (w__1 :: 64 Word.word) . + (let rs2_val = ((subrange_vec_dec w__1 (( 31 :: int)::ii) (( 0 :: int)::ii) :: 32 Word.word)) in + (let (result :: 32 bits) = + ((case op1 of + RISCV_ADDW => (add_vec rs1_val rs2_val :: 32 Word.word) + | RISCV_SUBW => (sub_vec rs1_val rs2_val :: 32 Word.word) + | RISCV_SLLW => + (shift_bits_left rs1_val ((subrange_vec_dec rs2_val (( 4 :: int)::ii) (( 0 :: int)::ii) :: 5 Word.word)) + :: 32 Word.word) + | RISCV_SRLW => + (shift_bits_right rs1_val ((subrange_vec_dec rs2_val (( 4 :: int)::ii) (( 0 :: int)::ii) :: 5 Word.word)) + :: 32 Word.word) + | RISCV_SRAW => + (shift_right_arith32 rs1_val ((subrange_vec_dec rs2_val (( 4 :: int)::ii) (( 0 :: int)::ii) :: 5 Word.word)) + :: 32 Word.word) + )) in + wX ((regbits_to_regno rd)) ((EXTS (( 64 :: int)::ii) result :: 64 Word.word))))))))" + + +(*val execute_RTYPE : mword ty5 -> mword ty5 -> mword ty5 -> rop -> M unit*) + +fun execute_RTYPE :: "(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow> rop \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_RTYPE rs2 rs1 rd op1 = ( + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> rs1_val . + (rX ((regbits_to_regno rs2)) :: ( 64 Word.word) M) \<bind> (\<lambda> rs2_val . + (let (result :: xlenbits) = + ((case op1 of + RISCV_ADD => (add_vec rs1_val rs2_val :: 64 Word.word) + | RISCV_SUB => (sub_vec rs1_val rs2_val :: 64 Word.word) + | RISCV_SLL => + (shift_bits_left rs1_val ((subrange_vec_dec rs2_val (( 5 :: int)::ii) (( 0 :: int)::ii) :: 6 Word.word)) + :: 64 Word.word) + | RISCV_SLT => + (EXTZ (( 64 :: int)::ii) ((bool_to_bits ((zopz0zI_s rs1_val rs2_val)) :: 1 Word.word)) :: 64 Word.word) + | RISCV_SLTU => + (EXTZ (( 64 :: int)::ii) ((bool_to_bits ((zopz0zI_u rs1_val rs2_val)) :: 1 Word.word)) :: 64 Word.word) + | RISCV_XOR => (xor_vec rs1_val rs2_val :: 64 Word.word) + | RISCV_SRL => + (shift_bits_right rs1_val ((subrange_vec_dec rs2_val (( 5 :: int)::ii) (( 0 :: int)::ii) :: 6 Word.word)) + :: 64 Word.word) + | RISCV_SRA => + (shift_right_arith64 rs1_val ((subrange_vec_dec rs2_val (( 5 :: int)::ii) (( 0 :: int)::ii) :: 6 Word.word)) + :: 64 Word.word) + | RISCV_OR => (or_vec rs1_val rs2_val :: 64 Word.word) + | RISCV_AND => (and_vec rs1_val rs2_val :: 64 Word.word) + )) in + wX ((regbits_to_regno rd)) result))))" + + +(*val execute_RISCV_JALR : mword ty12 -> mword ty5 -> mword ty5 -> M unit*) + +fun execute_RISCV_JALR :: "(12)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_RISCV_JALR imm rs1 rd = ( + (read_reg nextPC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: 64 Word.word) . + (wX ((regbits_to_regno rd)) w__0 \<then> + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M)) \<bind> (\<lambda> (w__1 :: 64 Word.word) . + (let (newPC :: xlenbits) = ((add_vec w__1 ((EXTS (( 64 :: int)::ii) imm :: 64 Word.word)) :: 64 Word.word)) in + write_reg + nextPC_ref + ((concat_vec ((subrange_vec_dec newPC (( 63 :: int)::ii) (( 1 :: int)::ii) :: 63 Word.word)) + (vec_of_bits [B0] :: 1 Word.word) + :: 64 Word.word))))))" + + +(*val execute_RISCV_JAL : mword ty21 -> mword ty5 -> M unit*) + +fun execute_RISCV_JAL :: "(21)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_RISCV_JAL imm rd = ( + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (pc :: xlenbits) . + (read_reg nextPC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: 64 Word.word) . + wX ((regbits_to_regno rd)) w__0 \<then> + ((let (offset :: xlenbits) = ((EXTS (( 64 :: int)::ii) imm :: 64 Word.word)) in + write_reg nextPC_ref ((add_vec pc offset :: 64 Word.word)))))))" + + +(*val execute_REMW : mword ty5 -> mword ty5 -> mword ty5 -> bool -> M unit*) + +fun execute_REMW :: "(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow> bool \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_REMW rs2 rs1 rd s = ( + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: 64 Word.word) . + (let rs1_val = ((subrange_vec_dec w__0 (( 31 :: int)::ii) (( 0 :: int)::ii) :: 32 Word.word)) in + (rX ((regbits_to_regno rs2)) :: ( 64 Word.word) M) \<bind> (\<lambda> (w__1 :: 64 Word.word) . + (let rs2_val = ((subrange_vec_dec w__1 (( 31 :: int)::ii) (( 0 :: int)::ii) :: 32 Word.word)) in + (let (rs1_int :: ii) = (if s then Word.sint rs1_val else Word.uint rs1_val) in + (let (rs2_int :: ii) = (if s then Word.sint rs2_val else Word.uint rs2_val) in + (let (r :: ii) = (if (((rs2_int = (( 0 :: int)::ii)))) then rs1_int else hardware_mod rs1_int rs2_int) in + wX ((regbits_to_regno rd)) ((EXTS (( 64 :: int)::ii) ((to_bits (( 32 :: int)::ii) r :: 32 Word.word)) :: 64 Word.word))))))))))" + + +(*val execute_REM : mword ty5 -> mword ty5 -> mword ty5 -> bool -> M unit*) + +fun execute_REM :: "(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow> bool \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_REM rs2 rs1 rd s = ( + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> rs1_val . + (rX ((regbits_to_regno rs2)) :: ( 64 Word.word) M) \<bind> (\<lambda> rs2_val . + (let (rs1_int :: ii) = (if s then Word.sint rs1_val else Word.uint rs1_val) in + (let (rs2_int :: ii) = (if s then Word.sint rs2_val else Word.uint rs2_val) in + (let (r :: ii) = (if (((rs2_int = (( 0 :: int)::ii)))) then rs1_int else hardware_mod rs1_int rs2_int) in + wX ((regbits_to_regno rd)) ((to_bits xlen r :: 64 Word.word))))))))" + + +(*val execute_NOP : unit -> unit*) + +fun execute_NOP :: " unit \<Rightarrow> unit " where + " execute_NOP g__111 = ( () )" + + +(*val execute_MULW : mword ty5 -> mword ty5 -> mword ty5 -> M unit*) + +fun execute_MULW :: "(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_MULW rs2 rs1 rd = ( + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: 64 Word.word) . + (let rs1_val = ((subrange_vec_dec w__0 (( 31 :: int)::ii) (( 0 :: int)::ii) :: 32 Word.word)) in + (rX ((regbits_to_regno rs2)) :: ( 64 Word.word) M) \<bind> (\<lambda> (w__1 :: 64 Word.word) . + (let rs2_val = ((subrange_vec_dec w__1 (( 31 :: int)::ii) (( 0 :: int)::ii) :: 32 Word.word)) in + (let (rs1_int :: ii) = (Word.sint rs1_val) in + (let (rs2_int :: ii) = (Word.sint rs2_val) in + (let result32 = + ((subrange_vec_dec ((to_bits (( 64 :: int)::ii) ((rs1_int * rs2_int)) :: 64 Word.word)) (( 31 :: int)::ii) + (( 0 :: int)::ii) + :: 32 Word.word)) in + (let (result :: xlenbits) = ((EXTS (( 64 :: int)::ii) result32 :: 64 Word.word)) in + wX ((regbits_to_regno rd)) result)))))))))" + + +(*val execute_MUL : mword ty5 -> mword ty5 -> mword ty5 -> bool -> bool -> bool -> M unit*) + +fun execute_MUL :: "(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_MUL rs2 rs1 rd high signed1 signed2 = ( + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> rs1_val . + (rX ((regbits_to_regno rs2)) :: ( 64 Word.word) M) \<bind> (\<lambda> rs2_val . + (let (rs1_int :: ii) = (if signed1 then Word.sint rs1_val else Word.uint rs1_val) in + (let (rs2_int :: ii) = (if signed2 then Word.sint rs2_val else Word.uint rs2_val) in + (let result128 = ((to_bits (( 128 :: int)::ii) ((rs1_int * rs2_int)) :: 128 Word.word)) in + (let result = + (if high then (subrange_vec_dec result128 (( 127 :: int)::ii) (( 64 :: int)::ii) :: 64 Word.word) + else (subrange_vec_dec result128 (( 63 :: int)::ii) (( 0 :: int)::ii) :: 64 Word.word)) in + wX ((regbits_to_regno rd)) result)))))))" + + +(*val execute_MRET : unit -> M unit*) + +fun execute_MRET :: " unit \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_MRET g__107 = ( + read_reg cur_privilege_ref \<bind> (\<lambda> (w__0 :: Privilege) . + if (((((privLevel_to_bits w__0 :: 2 Word.word)) = ((privLevel_to_bits Machine :: 2 Word.word))))) + then + read_reg cur_privilege_ref \<bind> (\<lambda> (w__1 :: Privilege) . + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__2 :: 64 Word.word) . + (handle_exception w__1 (CTL_MRET () ) w__2 :: ( 64 Word.word) M) \<bind> (\<lambda> (w__3 :: xlenbits) . + write_reg nextPC_ref w__3))) + else handle_illegal () ))" + + +(*val execute_LOADRES : bool -> bool -> mword ty5 -> word_width -> mword ty5 -> M unit*) + +fun execute_LOADRES :: " bool \<Rightarrow> bool \<Rightarrow>(5)Word.word \<Rightarrow> word_width \<Rightarrow>(5)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_LOADRES aq rl rs1 width rd = ( + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> (vaddr :: xlenbits) . + translateAddr vaddr Read Data \<bind> (\<lambda> (w__0 :: TR_Result) . + (case w__0 of + TR_Failure (e) => handle_mem_exception vaddr e + | TR_Address (addr) => + (case width of + WORD => + (mem_read addr (( 4 :: int)::ii) aq rl True :: ( ( 32 Word.word)MemoryOpResult) M) \<bind> (\<lambda> (w__1 :: ( 32 Word.word) + MemoryOpResult) . + process_load rd addr w__1 False) + | DOUBLE => + (mem_read addr (( 8 :: int)::ii) aq rl True :: ( ( 64 Word.word)MemoryOpResult) M) \<bind> (\<lambda> (w__2 :: ( 64 Word.word) + MemoryOpResult) . + process_load rd addr w__2 False) + | _ => internal_error (''LOADRES expected WORD or DOUBLE'') + ) + ))))" + + +(*val execute_LOAD : mword ty12 -> mword ty5 -> mword ty5 -> bool -> word_width -> bool -> bool -> M unit*) + +fun execute_LOAD :: "(12)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow> bool \<Rightarrow> word_width \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_LOAD imm rs1 rd is_unsigned width aq rl = ( + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: 64 Word.word) . + (let (vaddr :: xlenbits) = ((add_vec w__0 ((EXTS (( 64 :: int)::ii) imm :: 64 Word.word)) :: 64 Word.word)) in + translateAddr vaddr Read Data \<bind> (\<lambda> (w__1 :: TR_Result) . + (case w__1 of + TR_Failure (e) => handle_mem_exception vaddr e + | TR_Address (addr) => + (case width of + BYTE => + (mem_read addr (( 1 :: int)::ii) aq rl False :: ( ( 8 Word.word)MemoryOpResult) M) \<bind> (\<lambda> (w__2 :: ( 8 Word.word) + MemoryOpResult) . + process_load rd vaddr w__2 is_unsigned) + | HALF => + (mem_read addr (( 2 :: int)::ii) aq rl False :: ( ( 16 Word.word)MemoryOpResult) M) \<bind> (\<lambda> (w__3 :: ( 16 Word.word) + MemoryOpResult) . + process_load rd vaddr w__3 is_unsigned) + | WORD => + (mem_read addr (( 4 :: int)::ii) aq rl False :: ( ( 32 Word.word)MemoryOpResult) M) \<bind> (\<lambda> (w__4 :: ( 32 Word.word) + MemoryOpResult) . + process_load rd vaddr w__4 is_unsigned) + | DOUBLE => + (mem_read addr (( 8 :: int)::ii) aq rl False :: ( ( 64 Word.word)MemoryOpResult) M) \<bind> (\<lambda> (w__5 :: ( 64 Word.word) + MemoryOpResult) . + process_load rd vaddr w__5 is_unsigned) + ) + )))))" + + +(*val execute_ITYPE : mword ty12 -> mword ty5 -> mword ty5 -> iop -> M unit*) + +fun execute_ITYPE :: "(12)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow> iop \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_ITYPE imm rs1 rd op1 = ( + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> rs1_val . + (let (immext :: xlenbits) = ((EXTS (( 64 :: int)::ii) imm :: 64 Word.word)) in + (let (result :: xlenbits) = + ((case op1 of + RISCV_ADDI => (add_vec rs1_val immext :: 64 Word.word) + | RISCV_SLTI => + (EXTZ (( 64 :: int)::ii) ((bool_to_bits ((zopz0zI_s rs1_val immext)) :: 1 Word.word)) :: 64 Word.word) + | RISCV_SLTIU => + (EXTZ (( 64 :: int)::ii) ((bool_to_bits ((zopz0zI_u rs1_val immext)) :: 1 Word.word)) :: 64 Word.word) + | RISCV_XORI => (xor_vec rs1_val immext :: 64 Word.word) + | RISCV_ORI => (or_vec rs1_val immext :: 64 Word.word) + | RISCV_ANDI => (and_vec rs1_val immext :: 64 Word.word) + )) in + wX ((regbits_to_regno rd)) result))))" + + +(*val execute_ILLEGAL : unit -> M unit*) + +fun execute_ILLEGAL :: " unit \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_ILLEGAL g__112 = ( handle_illegal () )" + + +(*val execute_FENCEI : unit -> M unit*) + +fun execute_FENCEI :: " unit \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_FENCEI g__105 = ( MEM_fence_i () )" + + +(*val execute_FENCE : mword ty4 -> mword ty4 -> M unit*) + +fun execute_FENCE :: "(4)Word.word \<Rightarrow>(4)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_FENCE b__0 b__1 = ( + if ((((((b__0 = (vec_of_bits [B0,B0,B1,B1] :: 4 Word.word)))) \<and> (((b__1 = (vec_of_bits [B0,B0,B1,B1] :: 4 Word.word))))))) then + MEM_fence_rw_rw () + else if ((((((b__0 = (vec_of_bits [B0,B0,B1,B0] :: 4 Word.word)))) \<and> (((b__1 = (vec_of_bits [B0,B0,B1,B1] :: 4 Word.word))))))) then + MEM_fence_r_rw () + else if ((((((b__0 = (vec_of_bits [B0,B0,B1,B0] :: 4 Word.word)))) \<and> (((b__1 = (vec_of_bits [B0,B0,B1,B0] :: 4 Word.word))))))) then + MEM_fence_r_r () + else if ((((((b__0 = (vec_of_bits [B0,B0,B1,B1] :: 4 Word.word)))) \<and> (((b__1 = (vec_of_bits [B0,B0,B0,B1] :: 4 Word.word))))))) then + MEM_fence_rw_w () + else MEM_fence_w_w () )" + + +(*val execute_ECALL : unit -> M unit*) + +fun execute_ECALL :: " unit \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_ECALL g__106 = ( + read_reg cur_privilege_ref \<bind> (\<lambda> (w__0 :: Privilege) . + (let (t :: sync_exception) = + ((| sync_exception_trap = + ((case w__0 of + User => E_U_EnvCall + | Supervisor => E_S_EnvCall + | Machine => E_M_EnvCall + )), + sync_exception_excinfo = None |)) in + read_reg cur_privilege_ref \<bind> (\<lambda> (w__1 :: Privilege) . + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__2 :: 64 Word.word) . + (handle_exception w__1 (CTL_TRAP t) w__2 :: ( 64 Word.word) M) \<bind> (\<lambda> (w__3 :: xlenbits) . + write_reg nextPC_ref w__3))))))" + + +(*val execute_EBREAK : unit -> M unit*) + +fun execute_EBREAK :: " unit \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_EBREAK g__109 = ( throw (Error_EBREAK () ))" + + +(*val execute_DIVW : mword ty5 -> mword ty5 -> mword ty5 -> bool -> M unit*) + +fun execute_DIVW :: "(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow> bool \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_DIVW rs2 rs1 rd s = ( + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: 64 Word.word) . + (let rs1_val = ((subrange_vec_dec w__0 (( 31 :: int)::ii) (( 0 :: int)::ii) :: 32 Word.word)) in + (rX ((regbits_to_regno rs2)) :: ( 64 Word.word) M) \<bind> (\<lambda> (w__1 :: 64 Word.word) . + (let rs2_val = ((subrange_vec_dec w__1 (( 31 :: int)::ii) (( 0 :: int)::ii) :: 32 Word.word)) in + (let (rs1_int :: ii) = (if s then Word.sint rs1_val else Word.uint rs1_val) in + (let (rs2_int :: ii) = (if s then Word.sint rs2_val else Word.uint rs2_val) in + (let (q :: ii) = (if (((rs2_int = (( 0 :: int)::ii)))) then ((( 0 :: int)-( 1 :: int))::ii) else hardware_quot rs1_int rs2_int) in + (let (q' :: ii) = + (if (((s \<and> ((q > ((((pow2 (( 31 :: int)::ii))) - (( 1 :: int)::ii)))))))) then + (( 0 :: int)::ii) - ((ex_int ((pow (( 2 :: int)::ii) (( 31 :: int)::ii))))) + else q) in + wX ((regbits_to_regno rd)) ((EXTS (( 64 :: int)::ii) ((to_bits (( 32 :: int)::ii) q' :: 32 Word.word)) :: 64 Word.word)))))))))))" + + +(*val execute_DIV : mword ty5 -> mword ty5 -> mword ty5 -> bool -> M unit*) + +fun execute_DIV :: "(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow> bool \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_DIV rs2 rs1 rd s = ( + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> rs1_val . + (rX ((regbits_to_regno rs2)) :: ( 64 Word.word) M) \<bind> (\<lambda> rs2_val . + (let (rs1_int :: ii) = (if s then Word.sint rs1_val else Word.uint rs1_val) in + (let (rs2_int :: ii) = (if s then Word.sint rs2_val else Word.uint rs2_val) in + (let (q :: ii) = (if (((rs2_int = (( 0 :: int)::ii)))) then ((( 0 :: int)-( 1 :: int))::ii) else hardware_quot rs1_int rs2_int) in + (let (q' :: ii) = (if (((s \<and> ((q > xlen_max_signed))))) then xlen_min_signed else q) in + wX ((regbits_to_regno rd)) ((to_bits xlen q' :: 64 Word.word)))))))))" + + +(*val execute_C_ADDIW : mword ty6 -> mword ty5 -> M unit*) + +fun execute_C_ADDIW :: "(6)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_C_ADDIW imm rsd = ( + (let (imm :: 32 bits) = ((EXTS (( 32 :: int)::ii) imm :: 32 Word.word)) in + (rX ((regbits_to_regno rsd)) :: ( 64 Word.word) M) \<bind> (\<lambda> rs_val . + (let (res :: 32 bits) = + ((add_vec ((subrange_vec_dec rs_val (( 31 :: int)::ii) (( 0 :: int)::ii) :: 32 Word.word)) imm :: 32 Word.word)) in + wX ((regbits_to_regno rsd)) ((EXTS (( 64 :: int)::ii) res :: 64 Word.word))))))" + + +(*val execute_CSR : mword ty12 -> mword ty5 -> mword ty5 -> bool -> csrop -> M unit*) + +fun execute_CSR :: "(12)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow> bool \<Rightarrow> csrop \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_CSR csr rs1 rd is_imm op1 = ( + (if is_imm then return ((EXTZ (( 64 :: int)::ii) rs1 :: 64 Word.word)) + else (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M)) \<bind> (\<lambda> (rs1_val :: xlenbits) . + (let (isWrite :: bool) = + ((case op1 of + CSRRW => True + | _ => if is_imm then (((Word.uint rs1_val)) \<noteq> (( 0 :: int)::ii)) else (((Word.uint rs1)) \<noteq> (( 0 :: int)::ii)) + )) in + read_reg cur_privilege_ref \<bind> (\<lambda> (w__1 :: Privilege) . + check_CSR csr w__1 isWrite \<bind> (\<lambda> (w__2 :: bool) . + if ((\<not> w__2)) then handle_illegal () + else + (readCSR csr :: ( 64 Word.word) M) \<bind> (\<lambda> csr_val . + (if isWrite then + (let (new_val :: xlenbits) = + ((case op1 of + CSRRW => rs1_val + | CSRRS => (or_vec csr_val rs1_val :: 64 Word.word) + | CSRRC => (and_vec csr_val ((not_vec rs1_val :: 64 Word.word)) :: 64 Word.word) + )) in + writeCSR csr new_val) + else return () ) \<then> + wX ((regbits_to_regno rd)) csr_val))))))" + + +(*val execute_BTYPE : mword ty13 -> mword ty5 -> mword ty5 -> bop -> M unit*) + +fun execute_BTYPE :: "(13)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow> bop \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_BTYPE imm rs2 rs1 op1 = ( + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> rs1_val . + (rX ((regbits_to_regno rs2)) :: ( 64 Word.word) M) \<bind> (\<lambda> rs2_val . + (let (taken :: bool) = + ((case op1 of + RISCV_BEQ => (rs1_val = rs2_val) + | RISCV_BNE => (rs1_val \<noteq> rs2_val) + | RISCV_BLT => zopz0zI_s rs1_val rs2_val + | RISCV_BGE => zopz0zKzJ_s rs1_val rs2_val + | RISCV_BLTU => zopz0zI_u rs1_val rs2_val + | RISCV_BGEU => zopz0zKzJ_u rs1_val rs2_val + )) in + if taken then + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: 64 Word.word) . + write_reg nextPC_ref ((add_vec w__0 ((EXTS (( 64 :: int)::ii) imm :: 64 Word.word)) :: 64 Word.word))) + else return () ))))" + + +(*val execute_AMO : amoop -> bool -> bool -> mword ty5 -> mword ty5 -> word_width -> mword ty5 -> M unit*) + +fun execute_AMO :: " amoop \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow> word_width \<Rightarrow>(5)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_AMO op1 aq rl rs2 rs1 width rd = ( + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> (vaddr :: xlenbits) . + translateAddr vaddr ReadWrite Data \<bind> (\<lambda> (w__0 :: TR_Result) . + (case w__0 of + TR_Failure (e) => handle_mem_exception vaddr e + | TR_Address (addr) => + (case width of + WORD => mem_write_ea addr (( 4 :: int)::ii) (((aq \<and> rl))) rl True + | DOUBLE => mem_write_ea addr (( 8 :: int)::ii) (((aq \<and> rl))) rl True + | _ => internal_error (''AMO expected WORD or DOUBLE'') + ) \<bind> (\<lambda> (eares :: unit MemoryOpResult) . + (case eares of + MemException (e) => handle_mem_exception addr e + | MemValue (_) => + (case width of + WORD => + (mem_read addr (( 4 :: int)::ii) aq (((aq \<and> rl))) True :: ( ( 32 Word.word)MemoryOpResult) M) \<bind> (\<lambda> (w__4 :: ( 32 Word.word) + MemoryOpResult) . + return ((extend_value False w__4 :: ( 64 Word.word) MemoryOpResult))) + | DOUBLE => + (mem_read addr (( 8 :: int)::ii) aq (((aq \<and> rl))) True :: ( ( 64 Word.word)MemoryOpResult) M) \<bind> (\<lambda> (w__5 :: ( 64 Word.word) + MemoryOpResult) . + return ((extend_value False w__5 :: ( 64 Word.word) MemoryOpResult))) + | _ => (internal_error (''AMO expected WORD or DOUBLE'') :: ( ( 64 Word.word)MemoryOpResult) M) + ) \<bind> (\<lambda> (rval :: xlenbits MemoryOpResult) . + (case rval of + MemException (e) => handle_mem_exception addr e + | MemValue (loaded) => + (rX ((regbits_to_regno rs2)) :: ( 64 Word.word) M) \<bind> (\<lambda> (rs2_val :: xlenbits) . + (let (result :: xlenbits) = + ((case op1 of + AMOSWAP => rs2_val + | AMOADD => (add_vec rs2_val loaded :: 64 Word.word) + | AMOXOR => (xor_vec rs2_val loaded :: 64 Word.word) + | AMOAND => (and_vec rs2_val loaded :: 64 Word.word) + | AMOOR => (or_vec rs2_val loaded :: 64 Word.word) + | AMOMIN => (vector64 ((min ((Word.sint rs2_val)) ((Word.sint loaded)))) :: 64 Word.word) + | AMOMAX => (vector64 ((max ((Word.sint rs2_val)) ((Word.sint loaded)))) :: 64 Word.word) + | AMOMINU => (vector64 ((min ((Word.uint rs2_val)) ((Word.uint loaded)))) :: 64 Word.word) + | AMOMAXU => (vector64 ((max ((Word.uint rs2_val)) ((Word.uint loaded)))) :: 64 Word.word) + )) in + (case width of + WORD => + mem_write_value addr (( 4 :: int)::ii) ((subrange_vec_dec result (( 31 :: int)::ii) (( 0 :: int)::ii) :: 32 Word.word)) + (((aq \<and> rl))) rl True + | DOUBLE => mem_write_value addr (( 8 :: int)::ii) result (((aq \<and> rl))) rl True + | _ => internal_error (''AMO expected WORD or DOUBLE'') + ) \<bind> (\<lambda> (wval :: unit MemoryOpResult) . + (case wval of + MemValue (_) => wX ((regbits_to_regno rd)) loaded + | MemException (e) => handle_mem_exception addr e + )))) + )) + )) + ))))" + + +(*val execute_ADDIW : mword ty12 -> mword ty5 -> mword ty5 -> M unit*) + +fun execute_ADDIW :: "(12)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>(5)Word.word \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute_ADDIW imm rs1 rd = ( + (rX ((regbits_to_regno rs1)) :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: 64 Word.word) . + (let (result :: xlenbits) = ((add_vec ((EXTS (( 64 :: int)::ii) imm :: 64 Word.word)) w__0 :: 64 Word.word)) in + wX ((regbits_to_regno rd)) + ((EXTS (( 64 :: int)::ii) ((subrange_vec_dec result (( 31 :: int)::ii) (( 0 :: int)::ii) :: 32 Word.word)) :: 64 Word.word)))))" + + +function (sequential,domintros) execute :: " ast \<Rightarrow>((register_value),(unit),(exception))monad " where + " execute (C_ADDI4SPN (rdc,nzimm)) = ( + (let (imm :: 12 bits) = + ((concat_vec (vec_of_bits [B0,B0] :: 2 Word.word) + ((concat_vec nzimm (vec_of_bits [B0,B0] :: 2 Word.word) :: 10 Word.word)) + :: 12 Word.word)) in + (let rd = ((creg2reg_bits rdc :: 5 Word.word)) in + execute (ITYPE (imm,sp,rd,RISCV_ADDI)))))" +|" execute (C_LW (uimm,rsc,rdc)) = ( + (let (imm :: 12 bits) = + ((EXTZ (( 12 :: int)::ii) ((concat_vec uimm (vec_of_bits [B0,B0] :: 2 Word.word) :: 7 Word.word)) + :: 12 Word.word)) in + (let rd = ((creg2reg_bits rdc :: 5 Word.word)) in + (let rs = ((creg2reg_bits rsc :: 5 Word.word)) in + execute (LOAD (imm,rs,rd,False,WORD,False,False))))))" +|" execute (C_LD (uimm,rsc,rdc)) = ( + (let (imm :: 12 bits) = + ((EXTZ (( 12 :: int)::ii) ((concat_vec uimm (vec_of_bits [B0,B0,B0] :: 3 Word.word) :: 8 Word.word)) + :: 12 Word.word)) in + (let rd = ((creg2reg_bits rdc :: 5 Word.word)) in + (let rs = ((creg2reg_bits rsc :: 5 Word.word)) in + execute (LOAD (imm,rs,rd,False,DOUBLE,False,False))))))" +|" execute (C_SW (uimm,rsc1,rsc2)) = ( + (let (imm :: 12 bits) = + ((EXTZ (( 12 :: int)::ii) ((concat_vec uimm (vec_of_bits [B0,B0] :: 2 Word.word) :: 7 Word.word)) + :: 12 Word.word)) in + (let rs1 = ((creg2reg_bits rsc1 :: 5 Word.word)) in + (let rs2 = ((creg2reg_bits rsc2 :: 5 Word.word)) in + execute (STORE (imm,rs2,rs1,WORD,False,False))))))" +|" execute (C_SD (uimm,rsc1,rsc2)) = ( + (let (imm :: 12 bits) = + ((EXTZ (( 12 :: int)::ii) ((concat_vec uimm (vec_of_bits [B0,B0,B0] :: 3 Word.word) :: 8 Word.word)) + :: 12 Word.word)) in + (let rs1 = ((creg2reg_bits rsc1 :: 5 Word.word)) in + (let rs2 = ((creg2reg_bits rsc2 :: 5 Word.word)) in + execute (STORE (imm,rs2,rs1,DOUBLE,False,False))))))" +|" execute (C_ADDI (nzi,rsd)) = ( + (let (imm :: 12 bits) = ((EXTS (( 12 :: int)::ii) nzi :: 12 Word.word)) in + execute (ITYPE (imm,rsd,rsd,RISCV_ADDI))))" +|" execute (C_JAL (imm)) = ( + execute + (RISCV_JAL ((EXTS (( 21 :: int)::ii) ((concat_vec imm (vec_of_bits [B0] :: 1 Word.word) :: 12 Word.word)) + :: 21 Word.word),ra)))" +|" execute (C_LI (imm,rd)) = ( + (let (imm :: 12 bits) = ((EXTS (( 12 :: int)::ii) imm :: 12 Word.word)) in + execute (ITYPE (imm,zreg,rd,RISCV_ADDI))))" +|" execute (C_ADDI16SP (imm)) = ( + (let (imm :: 12 bits) = + ((EXTS (( 12 :: int)::ii) ((concat_vec imm (vec_of_bits [B0,B0,B0,B0] :: 4 Word.word) :: 10 Word.word)) + :: 12 Word.word)) in + execute (ITYPE (imm,sp,sp,RISCV_ADDI))))" +|" execute (C_LUI (imm,rd)) = ( + (let (res :: 20 bits) = ((EXTS (( 20 :: int)::ii) imm :: 20 Word.word)) in + execute (UTYPE (res,rd,RISCV_LUI))))" +|" execute (C_SRLI (shamt,rsd)) = ( + (let rsd = ((creg2reg_bits rsd :: 5 Word.word)) in + execute (SHIFTIOP (shamt,rsd,rsd,RISCV_SRLI))))" +|" execute (C_SRAI (shamt,rsd)) = ( + (let rsd = ((creg2reg_bits rsd :: 5 Word.word)) in + execute (SHIFTIOP (shamt,rsd,rsd,RISCV_SRAI))))" +|" execute (C_ANDI (imm,rsd)) = ( + (let rsd = ((creg2reg_bits rsd :: 5 Word.word)) in + execute (ITYPE ((EXTS (( 12 :: int)::ii) imm :: 12 Word.word),rsd,rsd,RISCV_ANDI))))" +|" execute (C_SUB (rsd,rs2)) = ( + (let rsd = ((creg2reg_bits rsd :: 5 Word.word)) in + (let rs2 = ((creg2reg_bits rs2 :: 5 Word.word)) in + execute (RTYPE (rs2,rsd,rsd,RISCV_SUB)))))" +|" execute (C_XOR (rsd,rs2)) = ( + (let rsd = ((creg2reg_bits rsd :: 5 Word.word)) in + (let rs2 = ((creg2reg_bits rs2 :: 5 Word.word)) in + execute (RTYPE (rs2,rsd,rsd,RISCV_XOR)))))" +|" execute (C_OR (rsd,rs2)) = ( + (let rsd = ((creg2reg_bits rsd :: 5 Word.word)) in + (let rs2 = ((creg2reg_bits rs2 :: 5 Word.word)) in + execute (RTYPE (rs2,rsd,rsd,RISCV_OR)))))" +|" execute (C_AND (rsd,rs2)) = ( + (let rsd = ((creg2reg_bits rsd :: 5 Word.word)) in + (let rs2 = ((creg2reg_bits rs2 :: 5 Word.word)) in + execute (RTYPE (rs2,rsd,rsd,RISCV_AND)))))" +|" execute (C_SUBW (rsd,rs2)) = ( + (let rsd = ((creg2reg_bits rsd :: 5 Word.word)) in + (let rs2 = ((creg2reg_bits rs2 :: 5 Word.word)) in + execute (RTYPEW (rs2,rsd,rsd,RISCV_SUBW)))))" +|" execute (C_ADDW (rsd,rs2)) = ( + (let rsd = ((creg2reg_bits rsd :: 5 Word.word)) in + (let rs2 = ((creg2reg_bits rs2 :: 5 Word.word)) in + execute (RTYPEW (rs2,rsd,rsd,RISCV_ADDW)))))" +|" execute (C_J (imm)) = ( + execute + (RISCV_JAL ((EXTS (( 21 :: int)::ii) ((concat_vec imm (vec_of_bits [B0] :: 1 Word.word) :: 12 Word.word)) + :: 21 Word.word),zreg)))" +|" execute (C_BEQZ (imm,rs)) = ( + execute + (BTYPE ((EXTS (( 13 :: int)::ii) ((concat_vec imm (vec_of_bits [B0] :: 1 Word.word) :: 9 Word.word)) + :: 13 Word.word),zreg,(creg2reg_bits rs :: 5 Word.word),RISCV_BEQ)))" +|" execute (C_BNEZ (imm,rs)) = ( + execute + (BTYPE ((EXTS (( 13 :: int)::ii) ((concat_vec imm (vec_of_bits [B0] :: 1 Word.word) :: 9 Word.word)) + :: 13 Word.word),zreg,(creg2reg_bits rs :: 5 Word.word),RISCV_BNE)))" +|" execute (C_SLLI (shamt,rsd)) = ( execute (SHIFTIOP (shamt,rsd,rsd,RISCV_SLLI)))" +|" execute (C_LWSP (uimm,rd)) = ( + (let (imm :: 12 bits) = + ((EXTZ (( 12 :: int)::ii) ((concat_vec uimm (vec_of_bits [B0,B0] :: 2 Word.word) :: 8 Word.word)) + :: 12 Word.word)) in + execute (LOAD (imm,sp,rd,False,WORD,False,False))))" +|" execute (C_LDSP (uimm,rd)) = ( + (let (imm :: 12 bits) = + ((EXTZ (( 12 :: int)::ii) ((concat_vec uimm (vec_of_bits [B0,B0,B0] :: 3 Word.word) :: 9 Word.word)) + :: 12 Word.word)) in + execute (LOAD (imm,sp,rd,False,DOUBLE,False,False))))" +|" execute (C_SWSP (uimm,rs2)) = ( + (let (imm :: 12 bits) = + ((EXTZ (( 12 :: int)::ii) ((concat_vec uimm (vec_of_bits [B0,B0] :: 2 Word.word) :: 8 Word.word)) + :: 12 Word.word)) in + execute (STORE (imm,rs2,sp,WORD,False,False))))" +|" execute (C_SDSP (uimm,rs2)) = ( + (let (imm :: 12 bits) = + ((EXTZ (( 12 :: int)::ii) ((concat_vec uimm (vec_of_bits [B0,B0,B0] :: 3 Word.word) :: 9 Word.word)) + :: 12 Word.word)) in + execute (STORE (imm,rs2,sp,DOUBLE,False,False))))" +|" execute (C_JR (rs1)) = ( + execute (RISCV_JALR ((EXTZ (( 12 :: int)::ii) (vec_of_bits [B0] :: 1 Word.word) :: 12 Word.word),rs1,zreg)))" +|" execute (C_JALR (rs1)) = ( + execute (RISCV_JALR ((EXTZ (( 12 :: int)::ii) (vec_of_bits [B0] :: 1 Word.word) :: 12 Word.word),rs1,ra)))" +|" execute (C_MV (rd,rs2)) = ( execute (RTYPE (rs2,zreg,rd,RISCV_ADD)))" +|" execute (C_ADD (rsd,rs2)) = ( execute (RTYPE (rs2,rsd,rsd,RISCV_ADD)))" +|" execute (UTYPE (imm,rd,op1)) = ( execute_UTYPE imm rd op1 )" +|" execute (RISCV_JAL (imm,rd)) = ( execute_RISCV_JAL imm rd )" +|" execute (RISCV_JALR (imm,rs1,rd)) = ( execute_RISCV_JALR imm rs1 rd )" +|" execute (BTYPE (imm,rs2,rs1,op1)) = ( execute_BTYPE imm rs2 rs1 op1 )" +|" execute (ITYPE (imm,rs1,rd,op1)) = ( execute_ITYPE imm rs1 rd op1 )" +|" execute (SHIFTIOP (shamt,rs1,rd,op1)) = ( execute_SHIFTIOP shamt rs1 rd op1 )" +|" execute (RTYPE (rs2,rs1,rd,op1)) = ( execute_RTYPE rs2 rs1 rd op1 )" +|" execute (LOAD (imm,rs1,rd,is_unsigned,width,aq,rl)) = ( execute_LOAD imm rs1 rd is_unsigned width aq rl )" +|" execute (STORE (imm,rs2,rs1,width,aq,rl)) = ( execute_STORE imm rs2 rs1 width aq rl )" +|" execute (ADDIW (imm,rs1,rd)) = ( execute_ADDIW imm rs1 rd )" +|" execute (SHIFTW (shamt,rs1,rd,op1)) = ( execute_SHIFTW shamt rs1 rd op1 )" +|" execute (RTYPEW (rs2,rs1,rd,op1)) = ( execute_RTYPEW rs2 rs1 rd op1 )" +|" execute (MUL (rs2,rs1,rd,high,signed1,signed2)) = ( execute_MUL rs2 rs1 rd high signed1 signed2 )" +|" execute (DIV (rs2,rs1,rd,s)) = ( execute_DIV rs2 rs1 rd s )" +|" execute (REM (rs2,rs1,rd,s)) = ( execute_REM rs2 rs1 rd s )" +|" execute (MULW (rs2,rs1,rd)) = ( execute_MULW rs2 rs1 rd )" +|" execute (DIVW (rs2,rs1,rd,s)) = ( execute_DIVW rs2 rs1 rd s )" +|" execute (REMW (rs2,rs1,rd,s)) = ( execute_REMW rs2 rs1 rd s )" +|" execute (FENCE (pred,succ)) = ( execute_FENCE pred succ )" +|" execute (FENCEI (g__105)) = ( execute_FENCEI g__105 )" +|" execute (ECALL (g__106)) = ( execute_ECALL g__106 )" +|" execute (MRET (g__107)) = ( execute_MRET g__107 )" +|" execute (SRET (g__108)) = ( execute_SRET g__108 )" +|" execute (EBREAK (g__109)) = ( execute_EBREAK g__109 )" +|" execute (WFI (g__110)) = ( execute_WFI g__110 )" +|" execute (SFENCE_VMA (rs1,rs2)) = ( execute_SFENCE_VMA rs1 rs2 )" +|" execute (LOADRES (aq,rl,rs1,width,rd)) = ( execute_LOADRES aq rl rs1 width rd )" +|" execute (STORECON (aq,rl,rs2,rs1,width,rd)) = ( execute_STORECON aq rl rs2 rs1 width rd )" +|" execute (AMO (op1,aq,rl,rs2,rs1,width,rd)) = ( execute_AMO op1 aq rl rs2 rs1 width rd )" +|" execute (CSR (csr,rs1,rd,is_imm,op1)) = ( execute_CSR csr rs1 rd is_imm op1 )" +|" execute (NOP (g__111)) = ( return ((execute_NOP g__111)))" +|" execute (ILLEGAL (g__112)) = ( execute_ILLEGAL g__112 )" +|" execute (C_ADDIW (imm,rsd)) = ( execute_C_ADDIW imm rsd )" +by pat_completeness auto + + +fun print_insn :: " ast \<Rightarrow> string " where + " print_insn (UTYPE (imm,rd,op1)) = ( + (case op1 of + RISCV_LUI => + (op@) (''lui '') + (((op@) ((reg_name_abi rd)) (((op@) ('', '') ((string_of_vec imm)))))) + | RISCV_AUIPC => + (op@) (''auipc '') + (((op@) ((reg_name_abi rd)) (((op@) ('', '') ((string_of_vec imm)))))) + ))" +|" print_insn (RISCV_JAL (imm,rd)) = ( + (op@) (''jal '') + (((op@) ((reg_name_abi rd)) (((op@) ('', '') ((string_of_vec imm)))))))" +|" print_insn (RISCV_JALR (imm,rs1,rd)) = ( + (op@) (''jalr '') + (((op@) ((reg_name_abi rd)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((string_of_vec imm)))))))))))" +|" print_insn (BTYPE (imm,rs2,rs1,op1)) = ( + (let (insn :: string) = + ((case op1 of + RISCV_BEQ => (''beq '') + | RISCV_BNE => (''bne '') + | RISCV_BLT => (''blt '') + | RISCV_BGE => (''bge '') + | RISCV_BLTU => (''bltu '') + | RISCV_BGEU => (''bgeu '') + )) in + (op@) insn + (((op@) ((reg_name_abi rs1)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs2)) (((op@) ('', '') ((string_of_vec imm))))))))))))" +|" print_insn (ITYPE (imm,rs1,rd,op1)) = ( + (let (insn :: string) = + ((case op1 of + RISCV_ADDI => (''addi '') + | RISCV_SLTI => (''slti '') + | RISCV_SLTIU => (''sltiu '') + | RISCV_XORI => (''xori '') + | RISCV_ORI => (''ori '') + | RISCV_ANDI => (''andi '') + )) in + (op@) insn + (((op@) ((reg_name_abi rd)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((string_of_vec imm))))))))))))" +|" print_insn (SHIFTIOP (shamt,rs1,rd,op1)) = ( + (let (insn :: string) = + ((case op1 of RISCV_SLLI => (''slli '') | RISCV_SRLI => (''srli '') | RISCV_SRAI => (''srai '') )) in + (op@) insn + (((op@) ((reg_name_abi rd)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((string_of_vec shamt))))))))))))" +|" print_insn (RTYPE (rs2,rs1,rd,op1)) = ( + (let (insn :: string) = + ((case op1 of + RISCV_ADD => (''add '') + | RISCV_SUB => (''sub '') + | RISCV_SLL => (''sll '') + | RISCV_SLT => (''slt '') + | RISCV_SLTU => (''sltu '') + | RISCV_XOR => (''xor '') + | RISCV_SRL => (''srl '') + | RISCV_SRA => (''sra '') + | RISCV_OR => (''or '') + | RISCV_AND => (''and '') + )) in + (op@) insn + (((op@) ((reg_name_abi rd)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((reg_name_abi rs2))))))))))))" +|" print_insn (LOAD (imm,rs1,rd,is_unsigned,width,aq,rl)) = ( + (let (insn :: string) = + ((case (width, is_unsigned) of + (BYTE, False) => (''lb '') + | (BYTE, True) => (''lbu '') + | (HALF, False) => (''lh '') + | (HALF, True) => (''lhu '') + | (WORD, False) => (''lw '') + | (WORD, True) => (''lwu '') + | (DOUBLE, False) => (''ld '') + | (DOUBLE, True) => (''ldu '') + )) in + (op@) insn + (((op@) ((reg_name_abi rd)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((string_of_vec imm))))))))))))" +|" print_insn (STORE (imm,rs2,rs1,width,aq,rl)) = ( + (let (insn :: string) = + ((case width of + BYTE => (''sb '') + | HALF => (''sh '') + | WORD => (''sw '') + | DOUBLE => (''sd '') + )) in + (op@) insn + (((op@) ((reg_name_abi rs2)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((string_of_vec imm))))))))))))" +|" print_insn (ADDIW (imm,rs1,rd)) = ( + (op@) (''addiw '') + (((op@) ((reg_name_abi rd)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((string_of_vec imm)))))))))))" +|" print_insn (SHIFTW (shamt,rs1,rd,op1)) = ( + (let (insn :: string) = + ((case op1 of RISCV_SLLI => (''slli '') | RISCV_SRLI => (''srli '') | RISCV_SRAI => (''srai '') )) in + (op@) insn + (((op@) ((reg_name_abi rd)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((string_of_vec shamt))))))))))))" +|" print_insn (RTYPEW (rs2,rs1,rd,op1)) = ( + (let (insn :: string) = + ((case op1 of + RISCV_ADDW => (''addw '') + | RISCV_SUBW => (''subw '') + | RISCV_SLLW => (''sllw '') + | RISCV_SRLW => (''srlw '') + | RISCV_SRAW => (''sraw '') + )) in + (op@) insn + (((op@) ((reg_name_abi rd)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((reg_name_abi rs2))))))))))))" +|" print_insn (MUL (rs2,rs1,rd,high,signed1,signed2)) = ( + (let (insn :: string) = + ((case (high, signed1, signed2) of + (False, True, True) => (''mul '') + | (True, True, True) => (''mulh '') + | (True, True, False) => (''mulhsu '') + | (True, False, False) => (''mulhu'') + )) in + (op@) insn + (((op@) ((reg_name_abi rd)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((reg_name_abi rs2))))))))))))" +|" print_insn (DIV (rs2,rs1,rd,s)) = ( + (let (insn :: string) = (if s then (''div '') else (''divu '')) in + (op@) insn + (((op@) ((reg_name_abi rd)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((reg_name_abi rs2))))))))))))" +|" print_insn (REM (rs2,rs1,rd,s)) = ( + (let (insn :: string) = (if s then (''rem '') else (''remu '')) in + (op@) insn + (((op@) ((reg_name_abi rd)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((reg_name_abi rs2))))))))))))" +|" print_insn (MULW (rs2,rs1,rd)) = ( + (op@) (''mulw '') + (((op@) ((reg_name_abi rd)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((reg_name_abi rs2)))))))))))" +|" print_insn (DIVW (rs2,rs1,rd,s)) = ( + (let (insn :: string) = (if s then (''divw '') else (''divuw '')) in + (op@) insn + (((op@) ((reg_name_abi rd)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((reg_name_abi rs2))))))))))))" +|" print_insn (REMW (rs2,rs1,rd,s)) = ( + (let (insn :: string) = (if s then (''remw '') else (''remuw '')) in + (op@) insn + (((op@) ((reg_name_abi rd)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((reg_name_abi rs2))))))))))))" +|" print_insn (FENCE (pred,succ)) = ( (''fence''))" +|" print_insn (FENCEI (g__93)) = ( (''fence.i''))" +|" print_insn (ECALL (g__94)) = ( (''ecall''))" +|" print_insn (MRET (g__95)) = ( (''mret''))" +|" print_insn (SRET (g__96)) = ( (''sret''))" +|" print_insn (EBREAK (g__97)) = ( (''ebreak''))" +|" print_insn (WFI (g__98)) = ( (''wfi''))" +|" print_insn (SFENCE_VMA (rs1,rs2)) = ( + (op@) (''sfence.vma '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((reg_name_abi rs2)))))))" +|" print_insn (LOADRES (aq,rl,rs1,width,rd)) = ( + (let (insn :: string) = + ((case width of WORD => (''lr.w '') | DOUBLE => (''lr.d '') | _ => (''lr.bad '') )) in + (op@) insn + (((op@) ((reg_name_abi rd)) (((op@) ('', '') ((reg_name_abi rs1))))))))" +|" print_insn (STORECON (aq,rl,rs2,rs1,width,rd)) = ( + (let (insn :: string) = + ((case width of WORD => (''sc.w '') | DOUBLE => (''sc.d '') | _ => (''sc.bad '') )) in + (op@) insn + (((op@) ((reg_name_abi rd)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((reg_name_abi rs2))))))))))))" +|" print_insn (AMO (op1,aq,rl,rs2,rs1,width,rd)) = ( + (let (insn :: string) = + ((case (op1, width) of + (AMOSWAP, WORD) => (''amoswap.w '') + | (AMOADD, WORD) => (''amoadd.w '') + | (AMOXOR, WORD) => (''amoxor.w '') + | (AMOAND, WORD) => (''amoand.w '') + | (AMOOR, WORD) => (''amoor.w '') + | (AMOMIN, WORD) => (''amomin.w '') + | (AMOMAX, WORD) => (''amomax.w '') + | (AMOMINU, WORD) => (''amominu.w '') + | (AMOMAXU, WORD) => (''amomaxu.w '') + | (AMOSWAP, DOUBLE) => (''amoswap.d '') + | (AMOADD, DOUBLE) => (''amoadd.d '') + | (AMOXOR, DOUBLE) => (''amoxor.d '') + | (AMOAND, DOUBLE) => (''amoand.d '') + | (AMOOR, DOUBLE) => (''amoor.d '') + | (AMOMIN, DOUBLE) => (''amomin.d '') + | (AMOMAX, DOUBLE) => (''amomax.d '') + | (AMOMINU, DOUBLE) => (''amominu.d '') + | (AMOMAXU, DOUBLE) => (''amomaxu.d '') + | (_, _) => (''amo.bad '') + )) in + (op@) insn + (((op@) ((reg_name_abi rd)) + (((op@) ('', '') + (((op@) ((reg_name_abi rs1)) (((op@) ('', '') ((reg_name_abi rs2))))))))))))" +|" print_insn (CSR (csr,rs1,rd,is_imm,op1)) = ( + (let (insn :: string) = + ((case (op1, is_imm) of + (CSRRW, True) => (''csrrwi '') + | (CSRRW, False) => (''csrrw '') + | (CSRRS, True) => (''csrrsi '') + | (CSRRS, False) => (''csrrs '') + | (CSRRC, True) => (''csrrci '') + | (CSRRC, False) => (''csrrc '') + )) in + (let (rs1_str :: string) = (if is_imm then string_of_vec rs1 else reg_name_abi rs1) in + (op@) insn + (((op@) ((reg_name_abi rd)) + (((op@) ('', '') (((op@) rs1_str (((op@) ('', '') ((csr_name csr)))))))))))))" +|" print_insn (NOP (g__99)) = ( (''nop''))" +|" print_insn (ILLEGAL (g__100)) = ( (''illegal''))" +|" print_insn (C_ADDI4SPN (rdc,nzimm)) = ( + (op@) (''c.addi4spn '') + (((op@) ((reg_name_abi ((creg2reg_bits rdc :: 5 Word.word)))) + (((op@) ('', '') ((string_of_vec nzimm)))))))" +|" print_insn (C_LW (uimm,rsc,rdc)) = ( + (op@) (''c.lw '') + (((op@) ((reg_name_abi ((creg2reg_bits rdc :: 5 Word.word)))) + (((op@) ('', '') + (((op@) ((reg_name_abi ((creg2reg_bits rsc :: 5 Word.word)))) + (((op@) ('', '') ((string_of_vec uimm)))))))))))" +|" print_insn (C_LD (uimm,rsc,rdc)) = ( + (op@) (''c.ld '') + (((op@) ((reg_name_abi ((creg2reg_bits rdc :: 5 Word.word)))) + (((op@) ('', '') + (((op@) ((reg_name_abi ((creg2reg_bits rsc :: 5 Word.word)))) + (((op@) ('', '') ((string_of_vec uimm)))))))))))" +|" print_insn (C_SW (uimm,rsc1,rsc2)) = ( + (op@) (''c.sw '') + (((op@) ((reg_name_abi ((creg2reg_bits rsc1 :: 5 Word.word)))) + (((op@) ('', '') + (((op@) ((reg_name_abi ((creg2reg_bits rsc2 :: 5 Word.word)))) + (((op@) ('', '') ((string_of_vec uimm)))))))))))" +|" print_insn (C_SD (uimm,rsc1,rsc2)) = ( + (op@) (''c.sd '') + (((op@) ((reg_name_abi ((creg2reg_bits rsc1 :: 5 Word.word)))) + (((op@) ('', '') + (((op@) ((reg_name_abi ((creg2reg_bits rsc2 :: 5 Word.word)))) + (((op@) ('', '') ((string_of_vec uimm)))))))))))" +|" print_insn (C_ADDI (nzi,rsd)) = ( + (op@) (''c.addi '') + (((op@) ((reg_name_abi rsd)) (((op@) ('', '') ((string_of_vec nzi)))))))" +|" print_insn (C_JAL (imm)) = ( (op@) (''c.jal '') ((string_of_vec imm)))" +|" print_insn (C_ADDIW (imm,rsd)) = ( + (op@) (''c.addiw '') + (((op@) ((reg_name_abi rsd)) (((op@) ('', '') ((string_of_vec imm)))))))" +|" print_insn (C_LI (imm,rd)) = ( + (op@) (''c.li '') + (((op@) ((reg_name_abi rd)) (((op@) ('', '') ((string_of_vec imm)))))))" +|" print_insn (C_ADDI16SP (imm)) = ( (op@) (''c.addi16sp '') ((string_of_vec imm)))" +|" print_insn (C_LUI (imm,rd)) = ( + (op@) (''c.lui '') + (((op@) ((reg_name_abi rd)) (((op@) ('', '') ((string_of_vec imm)))))))" +|" print_insn (C_SRLI (shamt,rsd)) = ( + (op@) (''c.srli '') + (((op@) ((reg_name_abi ((creg2reg_bits rsd :: 5 Word.word)))) + (((op@) ('', '') ((string_of_vec shamt)))))))" +|" print_insn (C_SRAI (shamt,rsd)) = ( + (op@) (''c.srai '') + (((op@) ((reg_name_abi ((creg2reg_bits rsd :: 5 Word.word)))) + (((op@) ('', '') ((string_of_vec shamt)))))))" +|" print_insn (C_ANDI (imm,rsd)) = ( + (op@) (''c.andi '') + (((op@) ((reg_name_abi ((creg2reg_bits rsd :: 5 Word.word)))) + (((op@) ('', '') ((string_of_vec imm)))))))" +|" print_insn (C_SUB (rsd,rs2)) = ( + (op@) (''c.sub '') + (((op@) ((reg_name_abi ((creg2reg_bits rsd :: 5 Word.word)))) + (((op@) ('', '') ((reg_name_abi ((creg2reg_bits rs2 :: 5 Word.word)))))))))" +|" print_insn (C_XOR (rsd,rs2)) = ( + (op@) (''c.xor '') + (((op@) ((reg_name_abi ((creg2reg_bits rsd :: 5 Word.word)))) + (((op@) ('', '') ((reg_name_abi ((creg2reg_bits rs2 :: 5 Word.word)))))))))" +|" print_insn (C_OR (rsd,rs2)) = ( + (op@) (''c.or '') + (((op@) ((reg_name_abi ((creg2reg_bits rsd :: 5 Word.word)))) + (((op@) ('', '') ((reg_name_abi ((creg2reg_bits rs2 :: 5 Word.word)))))))))" +|" print_insn (C_AND (rsd,rs2)) = ( + (op@) (''c.and '') + (((op@) ((reg_name_abi ((creg2reg_bits rsd :: 5 Word.word)))) + (((op@) ('', '') ((reg_name_abi ((creg2reg_bits rs2 :: 5 Word.word)))))))))" +|" print_insn (C_SUBW (rsd,rs2)) = ( + (op@) (''c.subw '') + (((op@) ((reg_name_abi ((creg2reg_bits rsd :: 5 Word.word)))) + (((op@) ('', '') ((reg_name_abi ((creg2reg_bits rs2 :: 5 Word.word)))))))))" +|" print_insn (C_ADDW (rsd,rs2)) = ( + (op@) (''c.addw '') + (((op@) ((reg_name_abi ((creg2reg_bits rsd :: 5 Word.word)))) + (((op@) ('', '') ((reg_name_abi ((creg2reg_bits rs2 :: 5 Word.word)))))))))" +|" print_insn (C_J (imm)) = ( (op@) (''c.j '') ((string_of_vec imm)))" +|" print_insn (C_BEQZ (imm,rs)) = ( + (op@) (''c.beqz '') + (((op@) ((reg_name_abi ((creg2reg_bits rs :: 5 Word.word)))) + (((op@) ('', '') ((string_of_vec imm)))))))" +|" print_insn (C_BNEZ (imm,rs)) = ( + (op@) (''c.bnez '') + (((op@) ((reg_name_abi ((creg2reg_bits rs :: 5 Word.word)))) + (((op@) ('', '') ((string_of_vec imm)))))))" +|" print_insn (C_SLLI (shamt,rsd)) = ( + (op@) (''c.slli '') + (((op@) ((reg_name_abi rsd)) (((op@) ('', '') ((string_of_vec shamt)))))))" +|" print_insn (C_LWSP (uimm,rd)) = ( + (op@) (''c.lwsp '') + (((op@) ((reg_name_abi rd)) (((op@) ('', '') ((string_of_vec uimm)))))))" +|" print_insn (C_LDSP (uimm,rd)) = ( + (op@) (''c.ldsp '') + (((op@) ((reg_name_abi rd)) (((op@) ('', '') ((string_of_vec uimm)))))))" +|" print_insn (C_SWSP (uimm,rd)) = ( + (op@) (''c.swsp '') + (((op@) ((reg_name_abi rd)) (((op@) ('', '') ((string_of_vec uimm)))))))" +|" print_insn (C_SDSP (uimm,rd)) = ( + (op@) (''c.sdsp '') + (((op@) ((reg_name_abi rd)) (((op@) ('', '') ((string_of_vec uimm)))))))" +|" print_insn (C_JR (rs1)) = ( (op@) (''c.jr '') ((reg_name_abi rs1)))" +|" print_insn (C_JALR (rs1)) = ( (op@) (''c.jalr '') ((reg_name_abi rs1)))" +|" print_insn (C_MV (rd,rs2)) = ( + (op@) (''c.mv '') + (((op@) ((reg_name_abi rd)) (((op@) ('', '') ((reg_name_abi rs2)))))))" +|" print_insn (C_ADD (rsd,rs2)) = ( + (op@) (''c.add '') + (((op@) ((reg_name_abi rsd)) (((op@) ('', '') ((reg_name_abi rs2)))))))" + + +(*val isRVC : mword ty16 -> bool*) + +definition isRVC :: "(16)Word.word \<Rightarrow> bool " where + " isRVC h = ( + \<not> (((((subrange_vec_dec h (( 1 :: int)::ii) (( 0 :: int)::ii) :: 2 Word.word)) = (vec_of_bits [B1,B1] :: 2 Word.word)))))" + + +(*val fetch : unit -> M FetchResult*) + +definition fetch :: " unit \<Rightarrow>((register_value),(FetchResult),(exception))monad " where + " fetch _ = ( + or_boolM + ((read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__0 :: xlenbits) . + return (((((cast_unit_vec0 ((access_vec_dec w__0 (( 0 :: int)::ii))) :: 1 Word.word)) \<noteq> (vec_of_bits [B0] :: 1 Word.word)))))) + (and_boolM + ((read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__1 :: xlenbits) . + return (((((cast_unit_vec0 ((access_vec_dec w__1 (( 1 :: int)::ii))) :: 1 Word.word)) \<noteq> (vec_of_bits [B0] :: 1 Word.word)))))) + (haveRVC () \<bind> (\<lambda> (w__2 :: bool) . return ((\<not> w__2))))) \<bind> (\<lambda> (w__4 :: bool) . + if w__4 then + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__5 :: 64 Word.word) . + return (F_Error (E_Fetch_Addr_Align,w__5))) + else + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__6 :: 64 Word.word) . + translateAddr w__6 Execute Instruction \<bind> (\<lambda> (w__7 :: TR_Result) . + (case w__7 of + TR_Failure (e) => + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__8 :: 64 Word.word) . return (F_Error (e,w__8))) + | TR_Address (ppclo) => + (checked_mem_read Instruction ppclo (( 2 :: int)::ii) :: ( ( 16 Word.word)MemoryOpResult) M) \<bind> (\<lambda> (w__9 :: ( 16 Word.word) + MemoryOpResult) . + (case w__9 of + MemException (e) => + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__10 :: 64 Word.word) . + return (F_Error (E_Fetch_Access_Fault,w__10))) + | MemValue (ilo) => + if ((isRVC ilo)) then return (F_RVC ilo) + else + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__11 :: 64 Word.word) . + (let (PChi :: xlenbits) = ((add_vec_int w__11 (( 2 :: int)::ii) :: 64 Word.word)) in + translateAddr PChi Execute Instruction \<bind> (\<lambda> (w__12 :: TR_Result) . + (case w__12 of + TR_Failure (e) => return (F_Error (e,PChi)) + | TR_Address (ppchi) => + (checked_mem_read Instruction ppchi (( 2 :: int)::ii) :: ( ( 16 Word.word)MemoryOpResult) M) \<bind> (\<lambda> (w__13 :: ( 16 Word.word) + MemoryOpResult) . + return ((case w__13 of + MemException (e) => F_Error (E_Fetch_Access_Fault,PChi) + | MemValue (ihi) => F_Base ((concat_vec ihi ilo :: 32 Word.word)) + ))) + )))) + )) + )))))" + + +(*val step : unit -> M bool*) + +definition step :: " unit \<Rightarrow>((register_value),(bool),(exception))monad " where + " step _ = ( + read_reg mip_ref \<bind> (\<lambda> (w__0 :: Minterrupts) . + read_reg mie_ref \<bind> (\<lambda> (w__1 :: Minterrupts) . + read_reg mideleg_ref \<bind> (\<lambda> (w__2 :: Minterrupts) . + curInterrupt w__0 w__1 w__2 \<bind> (\<lambda> (w__3 :: ((InterruptType * Privilege))option) . + (case w__3 of + Some (intr,priv) => + (let (_ :: unit) = (print_bits (''Handling interrupt: '') ((interruptType_to_bits intr :: 4 Word.word))) in + handle_interrupt intr priv \<then> return False) + | None => + fetch () \<bind> (\<lambda> (w__4 :: FetchResult) . + (case w__4 of + F_Error (e,addr) => handle_mem_exception addr e \<then> return False + | F_RVC (h) => + (case ((decodeCompressed h)) of + None => + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__5 :: xlenbits) . + (let (_ :: unit) = + (prerr_endline + (((op@) (''PC: '') + (((op@) ((string_of_vec w__5)) + (((op@) ('' instr: '') + (((op@) ((string_of_vec h)) ('' : <no-decode>'')))))))))) in + handle_decode_exception ((EXTZ (( 64 :: int)::ii) h :: 64 Word.word)) \<then> return False)) + | Some (ast) => + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__6 :: xlenbits) . + (let (_ :: unit) = + (prerr_endline + (((op@) (''PC: '') + (((op@) ((string_of_vec w__6)) + (((op@) ('' instr: '') + (((op@) ((string_of_vec h)) + (((op@) ('' : '') ((print_insn ast))))))))))))) in + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__7 :: 64 Word.word) . + (write_reg nextPC_ref ((add_vec_int w__7 (( 2 :: int)::ii) :: 64 Word.word)) \<then> + execute ast) \<then> return True))) + ) + | F_Base (w) => + (case ((decode w)) of + None => + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__9 :: xlenbits) . + (let (_ :: unit) = + (prerr_endline + (((op@) (''PC: '') + (((op@) ((string_of_vec w__9)) + (((op@) ('' instr: '') + (((op@) ((string_of_vec w)) ('' : <no-decode>'')))))))))) in + handle_decode_exception ((EXTZ (( 64 :: int)::ii) w :: 64 Word.word)) \<then> return False)) + | Some (ast) => + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__10 :: xlenbits) . + (let (_ :: unit) = + (prerr_endline + (((op@) (''PC: '') + (((op@) ((string_of_vec w__10)) + (((op@) ('' instr: '') + (((op@) ((string_of_vec w)) + (((op@) ('' : '') ((print_insn ast))))))))))))) in + (read_reg PC_ref :: ( 64 Word.word) M) \<bind> (\<lambda> (w__11 :: 64 Word.word) . + (write_reg nextPC_ref ((add_vec_int w__11 (( 4 :: int)::ii) :: 64 Word.word)) \<then> + execute ast) \<then> return True))) + ) + )) + ))))))" + + +definition initial_regstate :: " regstate " where + " initial_regstate = ( + (| tlb39 = None, + tselect = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + stval = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + scause = + (Mk_Mcause (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + sepc = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + sscratch = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + stvec = + (Mk_Mtvec (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + satp = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + sideleg = + (Mk_Sinterrupts (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0] + :: 64 Word.word)), + sedeleg = + (Mk_Sedeleg (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + pmpcfg0 = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + pmpaddr0 = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + mhartid = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + marchid = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + mimpid = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + mvendorid = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + minstret = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + mtime = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + mcycle = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + mscratch = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + mtval = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + mepc = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + mcause = + (Mk_Mcause (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + mtvec = + (Mk_Mtvec (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + medeleg = + (Mk_Medeleg (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + mideleg = + (Mk_Minterrupts (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0] + :: 64 Word.word)), + mie = + (Mk_Minterrupts (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0] + :: 64 Word.word)), + mip = + (Mk_Minterrupts (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0] + :: 64 Word.word)), + mstatus = + (Mk_Mstatus (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + misa = + (Mk_Misa (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + cur_inst = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + cur_privilege = User, + Xs = + ([(vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word), + (vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)]), + nextPC = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)), + PC = + ((vec_of_bits [B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0, + B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0,B0] + :: 64 Word.word)) |) )" + + + +end |
