Skip to content

Commit 761e726

Browse files
Proof of arithmetic correctness, patching soundness proof of exec sem
1 parent 1256c10 commit 761e726

14 files changed

+3762
-2395
lines changed

hol/cake_sem/completeness/p4_cake_exec_sem_completenessScript.sml renamed to hol/cake_sem/metatheory/p4_cake_exec_sem_completenessScript.sml

Lines changed: 296 additions & 480 deletions
Large diffs are not rendered by default.

hol/cake_sem/p4_cake_arch_v1modelScript.sml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ Definition v1model_copyout_pbl'_def:
260260
| NONE => NONE)
261261
| _ => NONE
262262
End
263-
263+
(* TODO: Why both v1model_apply_table_f' and v1model_apply_table_f''? *)
264264
val v1model_apply_table_f'_def =
265265
if matching_optimization
266266
then Define ‘v1model_apply_table_f' = T’

hol/cake_sem/p4_cake_auxLib.sml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ val identifier = “:word64”;
1818
(* val identifier = “:word16”; *)
1919

2020
(* This controls whether optimized matching in tables and select will be used *)
21-
val matching_optimization = true;
21+
val matching_optimization = false;
2222

2323
(* This controls whether optimized I/O (byte instead of bit lists) will be used *)
2424
val io_optimization = true;

hol/cake_sem/p4_cake_exec_semProgScript.sml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ open HolKernel boolLib Parse bossLib;
22

33
val _ = new_theory "p4_cake_exec_semProg";
44

5-
open p4Theory p4_auxTheory p4_coreTheory p4_v1modelTheory;
5+
open p4Theory p4_exec_semTheory p4_auxTheory p4_coreTheory p4_v1modelTheory;
66
open p4_cake_auxTheory p4_cake_exec_semTheory p4_cake_archTheory;
77
open p4_cake_auxLib;
88

@@ -170,6 +170,12 @@ val _ = translate e_exec_cast'_def;
170170
(* Unops *)
171171
val _ = translate bitv_1comp_def;
172172
val _ = translate bitv_2comp_def;
173+
Theorem bitv_2comp_side:
174+
!v. bitv_2comp_side v
175+
Proof
176+
gs[definition "bitv_2comp_side_def", arithmeticTheory.LT_IMP_LE, bitstringTheory.v2n_lt]
177+
QED
178+
val _ = update_precondition bitv_2comp_side;
173179
val _ = translate unop_exec'_def;
174180
val _ = translate e_exec_unop'_def;
175181

hol/cake_sem/p4_cake_exec_semScript.sml

Lines changed: 1 addition & 187 deletions
Original file line numberDiff line numberDiff line change
@@ -844,33 +844,13 @@ Definition to_bool_cast_exec_def:
844844
End
845845

846846

847-
(** unops and predicates for bitvectors **)
848-
Definition bitv_1comp_def:
849-
bitv_1comp (v:bool list) = MAP $~ v
850-
End
851-
852-
Definition bitv_2comp_def:
853-
bitv_2comp (v:bool list) l =
854-
let a = 2 ** l in
855-
let b = v2n v in
856-
if b ≤ a
857-
then SOME $ fixwidth l $ n2v (a - b)
858-
else NONE
859-
End
860-
861-
Definition bitv_unplus_def:
862-
bitv_unplus (v:bool list) = v
863-
End
864-
865847
Definition unop_exec'_def:
866848
(unop_exec' unop_neg (v'_bool b) = SOME (v'_bool ~b))
867849
/\
868850
(unop_exec' unop_compl (v'_bit (bl,n)) = SOME (v'_bit (bitv_1comp bl, n)))
869851
/\
870852
(unop_exec' unop_neg_signed (v'_bit (bl,n)) =
871-
case bitv_2comp bl n of
872-
| SOME res => SOME (v'_bit (res, n))
873-
| NONE => NONE)
853+
SOME (v'_bit (bitv_2comp bl, n)))
874854
/\
875855
(unop_exec' unop_un_plus (v'_bit bitv) = SOME (v'_bit bitv))
876856
/\
@@ -901,172 +881,6 @@ Definition e_exec_cast'_def:
901881
(e_exec_cast' _ _ = NONE)
902882
End
903883

904-
(** binops **)
905-
(* Translation: dimword (:a) to (v2n (REPLICATE (LENGTH a) T) + 1)
906-
* UINT_MAXw to above minus 1 *)
907-
908-
Definition bitv_ls_def:
909-
bitv_ls a b = (v2n a <= v2n b)
910-
End
911-
912-
Definition bitv_hs_def:
913-
bitv_hs a b = (v2n a >= v2n b)
914-
End
915-
916-
Definition bitv_lo_def:
917-
bitv_lo a b = (v2n a < v2n b)
918-
End
919-
920-
Definition bitv_hi_def:
921-
bitv_hi a b = (v2n a > v2n b)
922-
End
923-
924-
Definition bitv_eq_def:
925-
bitv_eq a b = AND_EL (MAP bit_eq (ZIP (a, b)))
926-
End
927-
928-
Definition bitv_neq_def:
929-
bitv_neq a b = ~bitv_eq a b
930-
End
931-
932-
Definition bitv_saturate_add_def:
933-
bitv_saturate_add a b l =
934-
let res = (v2n a) + (v2n b) in
935-
let limit = (v2n (REPLICATE l T) + 1) in
936-
if limit <= res
937-
then SOME $ (fixwidth l $ n2v (limit - 1), l)
938-
else SOME $ (fixwidth l $ n2v res, l)
939-
End
940-
941-
Definition bitv_saturate_sub_def:
942-
bitv_saturate_sub a b l =
943-
(* TODO: Need this so that the CakeML translator can work *)
944-
let av = v2n a in
945-
let bv = v2n b in
946-
SOME $ (fixwidth l $ n2v (if bv ≤ av then (av - bv) else 0), l)
947-
End
948-
949-
Definition bitv_lsl_bv_def:
950-
bitv_lsl_bv a b l =
951-
SOME $ (fixwidth l (a++(REPLICATE (v2n b) F)), l)
952-
End
953-
954-
(* We could use l instead of LENGTH a, but that gives a precondition *)
955-
Definition bitv_lsr_bv_def:
956-
bitv_lsr_bv a b l =
957-
SOME $ (TAKE (LENGTH a) ((REPLICATE (v2n b) F)++a), l)
958-
End
959-
960-
Definition bitv_mul_def:
961-
bitv_mul a b l = SOME $ (fixwidth l $ n2v (v2n a * v2n b), l)
962-
End
963-
964-
Definition bitv_div_def:
965-
bitv_div a b l =
966-
let divisor = v2n b in
967-
if divisor <> 0
968-
then
969-
SOME $ (fixwidth l $ n2v (v2n a DIV divisor), l)
970-
else NONE
971-
End
972-
973-
Definition bitv_mod_def:
974-
bitv_mod a b l =
975-
let modulus = v2n b in
976-
if modulus <> 0
977-
then
978-
SOME $ (fixwidth l $ n2v (v2n a MOD modulus), l)
979-
else NONE
980-
End
981-
982-
Definition bitv_add_def:
983-
bitv_add a b (l:num) = SOME $ (fixwidth l $ n2v (v2n a + v2n b), l)
984-
End
985-
986-
(* OLD
987-
Definition bitv_sub_def:
988-
bitv_sub a b (l:num) = bitv_add a (bitv_2comp b l) l
989-
End
990-
*)
991-
(* Note that this guard can never yield the NONE case in practice,
992-
* it's just needed for translation *)
993-
Definition bitv_sub_def:
994-
bitv_sub a b (l:num) =
995-
case bitv_2comp b l of
996-
| SOME res => bitv_add a res l
997-
| NONE => NONE
998-
End
999-
1000-
Definition band'_def:
1001-
band' a b = MAP (\(x,y). x /\ y) (ZIP(a, b))
1002-
End
1003-
Definition bitv_and_def:
1004-
bitv_and a b (l:num) = SOME $ (band' a b, l)
1005-
End
1006-
1007-
Definition bor'_def:
1008-
bor' (a:bool list) b = MAP (\(x,y). (x \/ y)) (ZIP(a, b))
1009-
End
1010-
Definition bitv_or_def:
1011-
bitv_or a b (l:num) = SOME $ (bor' a b, l)
1012-
End
1013-
1014-
Definition bitv_xor_def:
1015-
bitv_xor a b (l:num) = SOME $ (bxor a b, l)
1016-
End
1017-
1018-
(* TODO: Split the binop type into binops and binpreds, more efficient... *)
1019-
Definition get_bitv_binpred'_def:
1020-
get_bitv_binpred' binop =
1021-
case binop of
1022-
| binop_le => SOME bitv_ls
1023-
| binop_ge => SOME bitv_hs
1024-
| binop_lt => SOME bitv_lo
1025-
| binop_gt => SOME bitv_hi
1026-
| binop_neq => SOME bitv_neq
1027-
| binop_eq => SOME bitv_eq
1028-
| _ => NONE
1029-
End
1030-
1031-
Definition bitv_binpred'_def:
1032-
bitv_binpred' binpred (v, n) (v', n') =
1033-
if n = n'
1034-
then
1035-
(case get_bitv_binpred' binpred of
1036-
| SOME bp =>
1037-
SOME $ bp v v'
1038-
| NONE => NONE)
1039-
else NONE
1040-
End
1041-
1042-
Definition get_bitv_binop'_def:
1043-
get_bitv_binop' binop =
1044-
case binop of
1045-
| binop_mul => SOME bitv_mul
1046-
| binop_div => SOME bitv_div
1047-
| binop_mod => SOME bitv_mod
1048-
| binop_add => SOME bitv_add
1049-
| binop_sat_add => SOME bitv_saturate_add
1050-
| binop_sub => SOME bitv_sub
1051-
| binop_sat_sub => SOME bitv_saturate_sub
1052-
| binop_shl => SOME bitv_lsl_bv
1053-
| binop_shr => SOME bitv_lsr_bv
1054-
| binop_and => SOME bitv_and
1055-
| binop_xor => SOME bitv_xor
1056-
| binop_or => SOME bitv_or
1057-
| _ => NONE
1058-
End
1059-
1060-
Definition bitv_binop'_def:
1061-
bitv_binop' binop (v, n) (v', n') =
1062-
if n = n'
1063-
then
1064-
(case get_bitv_binop' binop of
1065-
| SOME bo => bo v v' n
1066-
| NONE => NONE)
1067-
else NONE
1068-
End
1069-
1070884
Definition binop_exec'_def:
1071885
(binop_exec' binop_mul (v'_bit bitv1) (v'_bit bitv2) =
1072886
case bitv_binop' binop_mul bitv1 bitv2 of

0 commit comments

Comments
 (0)