summaryrefslogtreecommitdiff
path: root/test/hol/test_raw_addScript.sml
diff options
context:
space:
mode:
Diffstat (limited to 'test/hol/test_raw_addScript.sml')
-rw-r--r--test/hol/test_raw_addScript.sml248
1 files changed, 248 insertions, 0 deletions
diff --git a/test/hol/test_raw_addScript.sml b/test/hol/test_raw_addScript.sml
new file mode 100644
index 00000000..eca6def7
--- /dev/null
+++ b/test/hol/test_raw_addScript.sml
@@ -0,0 +1,248 @@
+open HolKernel boolLib bossLib Parse
+open intLib bitLib wordsLib
+open sail_valuesAuxiliaryTheory state_monad_lemmasTheory
+open cheriTheory hoareTheory
+
+val _ = new_theory "test_raw_add";
+
+val _ = Globals.max_print_depth := 20;
+
+(* MIPS register names
+ ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/MIPS-N32-ABI-Handbook.pdf
+ *)
+val gpr_names_def = Define`
+ gpr_names = [
+ "zero";
+ "at";
+ "v0"; "v1";
+ "a0"; "a1"; "a2"; "a3"; "a4"; "a5"; "a6"; "a7";
+ "t4"; "t5"; "t6"; "t7";
+ "s0"; "s1"; "s2"; "s3"; "s4"; "s5"; "s6"; "s7";
+ "t8"; "t9";
+ "kt0"; "kt1";
+ "gp";
+ "sp";
+ "s8";
+ "ra"]`;
+
+val install_code_def = Define`
+ install_code initialPC (code:word32 list) =
+ iteriS (λi c. MEMw_wrapper (initialPC + 4w*(i2w i)) 4 c) code`;
+
+val clocked_whileS_def = Define`
+ clocked_whileS clock vars cond body s =
+ if 0n < clock then
+ bindS (cond vars)
+ (λcond_val s'.
+ if cond_val then
+ bindS (body vars) (λvars' s''. clocked_whileS (clock-1) vars' cond body s'') s'
+ else returnS vars s') s
+ else
+ failS "timeout" s`;
+
+val install_and_run_def = Define`
+ install_and_run code clock =
+ seqS
+ (seqS (install_code 0x9000000040000000w code) (init_registers 0x9000000040000000w))
+ (clocked_whileS clock () (λunit_var. fetch_and_execute ()) (λunit_var. returnS ()))`;
+
+(* obtained from
+ objdump -d test_raw_add.elf
+ (with the cheri mips binutils version of objdump)
+
+test_raw_add.elf: file format elf64-bigmips
+
+Disassembly of section .text:
+
+9000000040000000 <start>:
+9000000040000000: 24130001 li s3,1
+9000000040000004: 24140002 li s4,2
+9000000040000008: 02742020 add a0,s3,s4
+900000004000000c: 240c0001 li t0,1
+9000000040000010: 24050002 li a1,2
+9000000040000014: 00ac2820 add a1,a1,t0
+9000000040000018: 240c0001 li t0,1
+900000004000001c: 24060002 li a2,2
+9000000040000020: 01863020 add a2,t0,a2
+9000000040000024: 24070001 li a3,1
+9000000040000028: 00e73820 add a3,a3,a3
+900000004000002c: 240c0001 li t0,1
+9000000040000030: 240d0002 li t1,2
+9000000040000034: 240e0003 li t2,3
+9000000040000038: 018d7820 add t3,t0,t1
+900000004000003c: 01ee4020 add a4,t3,t2
+9000000040000040: 240c0001 li t0,1
+9000000040000044: 240dffff li t1,-1
+9000000040000048: 018d4820 add a5,t0,t1
+900000004000004c: 240cffff li t0,-1
+9000000040000050: 240dffff li t1,-1
+9000000040000054: 018d5020 add a6,t0,t1
+9000000040000058: 240cffff li t0,-1
+900000004000005c: 240d0002 li t1,2
+9000000040000060: 018d5820 add a7,t0,t1
+9000000040000064: 240c0001 li t0,1
+9000000040000068: 240dfffe li t1,-2
+900000004000006c: 018d8020 add s0,t0,t1
+9000000040000070: 4082d000 mtc0 v0,$26
+ ...
+900000004000007c: 4082b800 mtc0 v0,$23
+
+9000000040000080 <end>:
+9000000040000080: 1000ffff b 9000000040000080 <end>
+9000000040000084: 00000000 nop
+*)
+
+
+val test_raw_add_insts_def = Define`test_raw_add_insts =
+ [0x24130001w:word32
+ ;0x24140002w
+ ;0x02742020w
+ ;0x240c0001w
+ ;0x24050002w
+ ;0x00ac2820w
+ ;0x240c0001w
+ ;0x24060002w
+ ;0x01863020w
+ ;0x24070001w
+ ;0x00e73820w
+ ;0x240c0001w
+ ;0x240d0002w
+ ;0x240e0003w
+ ;0x018d7820w
+ ;0x01ee4020w
+ ;0x240c0001w
+ ;0x240dffffw
+ ;0x018d4820w
+ ;0x240cffffw
+ ;0x240dffffw
+ ;0x018d5020w
+ ;0x240cffffw
+ ;0x240d0002w
+ ;0x018d5820w
+ ;0x240c0001w
+ ;0x240dfffew
+ ;0x018d8020w
+ ;0x4082d000w]`;
+
+fun check_name n =
+ EVAL ``EL ^(numSyntax.term_of_int n) gpr_names``;
+
+val test_raw_add_post_def = Define`
+ test_raw_add_post s = (
+ bindS (rGPR 19w) (λs3. (* check_name 19 *)
+ seqS (assert_expS (s3 = 1w) "add modified first input") (
+ bindS (rGPR 20w) (λs4. (* check_name 20 *)
+ seqS (assert_expS (s4 = 2w) "add modified second input") (
+ bindS (rGPR 04w) (λa0. (* check_name 04 *)
+ seqS (assert_expS (a0 = 3w) "add failed") (
+ bindS (rGPR 05w) (λa1. (* check_name 05 *)
+ seqS (assert_expS (a1 = 3w) "add into first input failed") (
+ bindS (rGPR 06w) (λa2. (* check_name 06 *)
+ seqS (assert_expS (a2 = 3w) "add into second input failed") (
+ bindS (rGPR 07w) (λa3. (* check_name 07 *)
+ seqS (assert_expS (a3 = 2w) "add into both inputs failed") (
+ bindS (rGPR 08w) (λa4. (* check_name 08 *)
+ seqS (assert_expS (a4 = 6w) "add-to-add pipeline failed") (
+ bindS (rGPR 09w) (λa5. (* check_name 09 *)
+ seqS (assert_expS (a5 = 0w) "positive plus negative to zero failed") (
+ bindS (rGPR 10w) (λa6. (* check_name 10 *)
+ seqS (assert_expS (a6 = 0xfffffffffffffffew) "negative plus negative to negative failed") (
+ bindS (rGPR 11w) (λa7. (* check_name 11 *)
+ seqS (assert_expS (a7 = 1w) "negative plus positive to positive failed") (
+ bindS (rGPR 16w) (λs0. (* check_name 16 *)
+ (assert_expS (s0 = 0xffffffffffffffffw) "positive plus negative to negative failed")))))))))))))))))))))) s
+ = {(Value (),s)})`;
+
+(*
+
+val decoded_insts1 =
+ listLib.MAP_CONV EVAL ``MAP decode ^(rhs(concl test_raw_add_insts_def))``
+
+val (SOME_is, oty) = decoded_insts1 |> concl |> rhs |> listSyntax.dest_list
+val asts = map rand SOME_is
+val ls2 = listLib.MAP_CONV EVAL ``MAP SOME ^(listSyntax.mk_list(asts,optionSyntax.dest_option oty))``;
+val test_raw_add_asts_def = Define`
+ test_raw_add_asts = ^(rand(lhs(concl ls2)))`;
+
+val decoded_insts = TRANS decoded_insts1 (SYM ls2)
+ |> ONCE_REWRITE_RULE[GSYM test_raw_add_insts_def, GSYM test_raw_add_asts_def]
+*)
+
+val test_raw_add_thm = Q.store_thm("test_raw_add_thm",
+ `PrePost
+ (λ_. T)
+ (install_and_run test_raw_add_insts 100000)
+ (λ_ s. test_raw_add_post s)`,
+(*
+ rw[install_and_run_def]
+ \\ match_mp_tac PrePost_seqS
+ \\ simp[]
+ \\ qmatch_goalsub_abbrev_tac`install_code initPC`
+ \\ qexists_tac`λs. code_installed initPC test_raw_add_insts s ∧
+ init_registers_post s`
+ \\ conj_tac
+ >- (
+ match_mp_tac PrePost_seqS \\ simp[]
+ \\ qexists_tac`code_installed initPC test_raw_add_insts`
+ \\ conj_tac
+ >- cheat
+ \\ cheat )
+ fetch_and_execute_def
+*)
+cheat);
+
+(*
+val cs = wordsLib.words_compset();
+val () = computeLib.extend_compset [
+ computeLib.Extenders [
+ intReduce.add_int_compset
+ ],
+ (* sail stuff *)
+ computeLib.Defs [
+ sail_valuesTheory.nat_of_int_def,
+ sail_operators_mwordsTheory.subrange_vec_dec_def
+ ],
+ (* cheri/mips model *)
+ computeLib.Defs [
+ decode_def
+ ],
+ (* addition test *)
+ computeLib.Defs [
+ test_raw_add_insts_def
+ ]
+] cs;
+
+computeLib.CBV_CONV cs ``decode (EL 1 test_raw_add_insts)``
+
+val th1 = EVAL ``THE (decode (EL 1 test_raw_add_insts))``
+
+val s1 = EVAL ``init_cp0_state () (init_state (regs:regstate) o1 seed)``
+
+val th2 = ``execute ^(rhs(concl th1)) ^s1``
+ |> SIMP_CONV(srw_ss())[execute_def]
+ |> SIMP_RULE(srw_ss())[execute_ADDIU_def]
+
+f"bindS"
+type_of ``execute ast ``
+f"init_state"
+execute_ADDIU_def
+type_of``OPTION_BIND``
+tyabbrev_info"M"
+val (_, execute_rng) = dom_rng (type_of``execute``)
+val (mdom, mrng) = dom_rng execute_rng
+val state_ty = ``:regstate sequential_state``
+dest_thy_type state_ty
+TypeBase.fields_of state_ty
+disable_tyabbrev_printing"rel"
+dest_type``:unit M``
+
+f"vec_of_bits"
+f"of_bits_fail"
+f"maybe_failw"
+f"nat_of_int"
+f"just_list"
+f"sfunpow"
+show_assums := true
+*)
+
+val _ = export_theory ();