Skip to content

Commit 698db2f

Browse files
Added to CakeML exec sem: io_list as byte lists, translation of table entries, misc fixes and renamings
1 parent 8ebb96c commit 698db2f

13 files changed

+1018
-89
lines changed

hol/cake_sem/p4_exec_sem_cake_test3Script.sml renamed to hol/cake_sem/cake_baselineScript.sml

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

3-
val _ = new_theory "p4_exec_sem_cake_test3";
3+
val _ = new_theory "cake_baseline";
44

55
open p4Syntax;
66
open bitstringSyntax numSyntax pairSyntax;
@@ -21,6 +21,6 @@ val _ = translation_extends "p4_exec_sem_cakeProg";
2121

2222
(* Creates baseline FFI program (same as test2, but in CakeML) *)
2323

24-
p4_baseline_ffiLib.get_baseline_program "baseline";
24+
p4_baseline_ffiLib.get_baseline_program (Theory.current_theory());
2525

2626
val _ = export_theory ();

hol/cake_sem/cake_vss_v1modelScript.sml

Lines changed: 547 additions & 0 deletions
Large diffs are not rendered by default.

hol/cake_sem/p4_exec_sem_cake_test2Script.sml renamed to hol/cake_sem/ffi_testScript.sml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
open HolKernel boolLib Parse bossLib;
22

3-
val _ = new_theory "p4_exec_sem_cake_test2";
3+
val _ = new_theory "ffi_test";
44

55
open p4Syntax;
66
open bitstringSyntax numSyntax pairSyntax;

hol/cake_sem/p4_arch_cakeScript.sml

Lines changed: 120 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ open p4_v1modelTheory;
1414
(*********************)
1515
(* Core architecture *)
1616

17+
Datatype:
18+
core_v_ext' =
19+
core_v_ext'_packet (word8 list)
20+
End
21+
22+
val _ = type_abbrev("v1model_sum_v_ext'", “:(core_v_ext', v1model_v_ext) sum”);
23+
1724
Definition header_entries2v'_def:
1825
(header_entries2v' (INL []) = SOME []) /\
1926
(header_entries2v' (INL (h::t)) =
@@ -213,28 +220,45 @@ Definition set_v'_def:
213220
(set_v' _ packet_in = NONE)
214221
End
215222

223+
Definition byte_list_to_bool_list_take_def:
224+
(byte_list_to_bool_list_take l 0 = SOME []) /\
225+
(byte_list_to_bool_list_take ((h:word8)::t) (SUC n) =
226+
case byte_list_to_bool_list_take t n of
227+
SOME res =>
228+
SOME ((w2v:word8 -> bool list) h::res)
229+
| NONE => NONE) /\
230+
(byte_list_to_bool_list_take [] n = NONE)
231+
End
232+
216233
Definition packet_in_extract_gen'_def:
217234
(packet_in_extract_gen' ascope_lookup ascope_update ascope_update_v_map (ascope:'a, g_scope_list:g_scope_list', scope_list) =
218235
case lookup_lval'' scope_list (lval'_varname (varn'_name 3w)) of
219236
| SOME (v'_ext_ref i) =>
220237
(case lookup_lval_header' scope_list (lval'_varname (varn'_name 4w)) of
221238
| SOME (valid_bit, x_v_l) =>
222239
(case lookup_ascope_gen ascope_lookup ascope i of
223-
| SOME ((INL (core_v_ext_packet packet_in_bl)):(core_v_ext, 'b) sum) =>
240+
| SOME ((INL (core_v_ext'_packet packet_in_bl)):(core_v_ext', 'b) sum) =>
224241
(case size_in_bits' (v'_header valid_bit x_v_l) of
225242
| SOME size =>
226-
if size <= LENGTH packet_in_bl
243+
(* TODO: Handle non-mod 8 case properly *)
244+
if size MOD 8 = 0
227245
then
228-
(case set_header' x_v_l packet_in_bl of
229-
| SOME header =>
230-
(case assign' scope_list header (lval'_varname (varn'_name 4w)) of
231-
| SOME scope_list' =>
232-
SOME (update_ascope_gen ascope_update ascope i ((INL (core_v_ext_packet (DROP size packet_in_bl))):(core_v_ext, 'b) sum), scope_list', status'_returnv v'_bot)
233-
| NONE => NONE)
234-
| NONE => NONE)
235-
else
236-
(* NOTE: Specific serialisation of errors is assumed here - "PacketTooShort" -> 1 *)
237-
SOME (ascope_update_v_map (update_ascope_gen ascope_update ascope i ((INL (core_v_ext_packet [])):(core_v_ext, 'b) sum)) (0w:word64) (v'_bit (fixwidth 32 (n2v 1), 32)), scope_list, status'_trans 40w)
246+
if size <= (LENGTH packet_in_bl) * 8
247+
then
248+
case byte_list_to_bool_list_take packet_in_bl (size DIV 8) of
249+
SOME bool_list_list =>
250+
(case set_header' x_v_l (FLAT bool_list_list) of
251+
| SOME header =>
252+
(case assign' scope_list header (lval'_varname (varn'_name 4w)) of
253+
| SOME scope_list' =>
254+
SOME (update_ascope_gen ascope_update ascope i ((INL (core_v_ext'_packet (DROP (size DIV 8) packet_in_bl))):(core_v_ext', 'b) sum), scope_list', status'_returnv v'_bot)
255+
| NONE => NONE)
256+
| NONE => NONE)
257+
| NONE => NONE
258+
else
259+
(* NOTE: Specific serialisation of errors is assumed here - "PacketTooShort" -> 1 *)
260+
SOME (ascope_update_v_map (update_ascope_gen ascope_update ascope i ((INL (core_v_ext'_packet [])):(core_v_ext', 'b) sum)) (0w:word64) (v'_bit (fixwidth 32 (n2v 1), 32)), scope_list, status'_trans 40w)
261+
else NONE
238262
| NONE => NONE)
239263
| _ => NONE)
240264
| NONE => NONE)
@@ -249,18 +273,25 @@ Definition packet_in_lookahead_gen'_def:
249273
(case lookup_lval'' scope_list (lval'_varname (varn'_name 5w)) of
250274
| SOME dummy_v =>
251275
(case lookup_ascope_gen ascope_lookup ascope i of
252-
| SOME ((INL (core_v_ext_packet packet_in_bl)):(core_v_ext, 'b) sum) =>
276+
| SOME ((INL (core_v_ext'_packet packet_in_bl)):(core_v_ext', 'b) sum) =>
253277
(case size_in_bits' dummy_v of
254278
| SOME size =>
255-
if size <= LENGTH packet_in_bl
279+
(* TODO: Handle non-mod 8 case properly *)
280+
if size MOD 8 = 0
256281
then
257-
(case set_v' dummy_v packet_in_bl of
258-
| SOME v =>
259-
SOME (ascope, scope_list, status'_returnv v)
260-
| NONE => NONE)
261-
else
262-
(* NOTE: Specific serialisation of errors is assumed here - "PacketTooShort" -> 1 *)
263-
SOME (ascope_update_v_map ascope (0w:word64) (v'_bit (fixwidth 32 (n2v 1), 32)), scope_list, status'_trans 40w)
282+
if size <= (LENGTH packet_in_bl) * 8
283+
then
284+
case byte_list_to_bool_list_take packet_in_bl (size DIV 8) of
285+
SOME bool_list_list =>
286+
(case set_v' dummy_v (FLAT bool_list_list) of
287+
| SOME v =>
288+
SOME (ascope, scope_list, status'_returnv v)
289+
| NONE => NONE)
290+
| NONE => NONE
291+
else
292+
(* NOTE: Specific serialisation of errors is assumed here - "PacketTooShort" -> 1 *)
293+
SOME (ascope_update_v_map ascope (0w:word64) (v'_bit (fixwidth 32 (n2v 1), 32)), scope_list, status'_trans 40w)
294+
else NONE
264295
| NONE => NONE)
265296
| _ => NONE)
266297
| NONE => NONE)
@@ -283,13 +314,17 @@ Definition packet_in_advance_gen'_def:
283314
(case lookup_lval_bit32' scope_list (lval'_varname (varn'_name 6w)) of
284315
| SOME n_bits =>
285316
(case lookup_ascope_gen ascope_lookup ascope i of
286-
| SOME ((INL (core_v_ext_packet packet_in_bl)):(core_v_ext, 'b) sum) =>
287-
if n_bits <= LENGTH packet_in_bl
317+
| SOME ((INL (core_v_ext'_packet packet_in_bl)):(core_v_ext', 'b) sum) =>
318+
(* TODO: Handle non-mod 8 case properly *)
319+
if n_bits MOD 8 = 0
288320
then
289-
SOME (update_ascope_gen ascope_update ascope i ((INL (core_v_ext_packet (DROP n_bits packet_in_bl))):(core_v_ext, 'b) sum), scope_list, status'_returnv v'_bot)
290-
else
291-
(* NOTE: Serialisation of errors is assumed here - "PacketTooShort" -> 1 *)
292-
SOME (ascope_update_v_map ascope (0w:word64) (v'_bit (fixwidth 32 (n2v 1), 32)), scope_list, status'_trans 40w)
321+
if n_bits <= (LENGTH packet_in_bl) * 8
322+
then
323+
SOME (update_ascope_gen ascope_update ascope i ((INL (core_v_ext'_packet (DROP (n_bits DIV 8) packet_in_bl))):(core_v_ext', 'b) sum), scope_list, status'_returnv v'_bot)
324+
else
325+
(* NOTE: Serialisation of errors is assumed here - "PacketTooShort" -> 1 *)
326+
SOME (ascope_update_v_map ascope (0w:word64) (v'_bit (fixwidth 32 (n2v 1), 32)), scope_list, status'_trans 40w)
327+
else NONE
293328
| _ => NONE)
294329
| NONE => NONE)
295330
| _ => NONE
@@ -334,23 +369,65 @@ Definition flatten_v_l'_def:
334369
)
335370
End
336371

372+
Definition v2w8_def:
373+
(v2w8 [b0;b1;b2;b3;b4;b5;b6;b7] = SOME (
374+
let acc0 = if b7 then 1w else 0w in
375+
let acc1 = if b6 then acc0 + (word_lsl 1w 1) else acc0 in
376+
let acc2 = if b5 then acc1 + (word_lsl 1w 2) else acc1 in
377+
let acc3 = if b4 then acc2 + (word_lsl 1w 3) else acc2 in
378+
let acc4 = if b3 then acc3 + (word_lsl 1w 4) else acc3 in
379+
let acc5 = if b2 then acc4 + (word_lsl 1w 5) else acc4 in
380+
let acc6 = if b1 then acc5 + (word_lsl 1w 6) else acc5 in
381+
let acc7 = if b0 then acc6 + (word_lsl 1w 7) else acc6 in
382+
acc7:word8
383+
)) /\
384+
(v2w8 _ = NONE)
385+
End
386+
387+
Definition bool_list_to_byte_list_def:
388+
(bool_list_to_byte_list [] = SOME []) /\
389+
(bool_list_to_byte_list l =
390+
case oTAKE_DROP 8 l of
391+
| SOME (take,rest) =>
392+
(case v2w8 take of
393+
| SOME w =>
394+
(case bool_list_to_byte_list rest of
395+
| SOME res =>
396+
SOME (w::res)
397+
| NONE => NONE)
398+
| NONE => NONE)
399+
| NONE => NONE)
400+
Termination
401+
WF_REL_TAC ‘measure LENGTH’ >>
402+
rpt strip_tac >>
403+
imp_res_tac oTAKE_DROP_SOME >>
404+
imp_res_tac oDROP_LENGTH >>
405+
gvs[]
406+
End
407+
337408
Definition packet_out_emit_gen'_def:
338-
(packet_out_emit_gen' (ascope_lookup:'a -> num -> (core_v_ext + 'b) option) ascope_update (ascope:'a, g_scope_list:g_scope_list', scope_list) =
409+
(packet_out_emit_gen' (ascope_lookup:'a -> num -> (core_v_ext' + 'b) option) ascope_update (ascope:'a, g_scope_list:g_scope_list', scope_list) =
339410
case lookup_lval'' scope_list (lval'_varname (varn'_name 3w)) of
340411
| SOME (v'_ext_ref i) =>
341412
(case lookup_ascope_gen ascope_lookup ascope i of
342-
| SOME (INL (core_v_ext_packet packet_out_bl)) =>
413+
| SOME (INL (core_v_ext'_packet packet_out_bl)) =>
343414
(case lookup_lval'' scope_list (lval'_varname (varn'_name 7w)) of
344415
| SOME (v'_header F x_v_l) => SOME (ascope, scope_list, status'_returnv v'_bot)
345416
| SOME (v'_header T x_v_l) =>
346417
(case flatten_v_l' (MAP SND x_v_l) of
347418
| SOME bl =>
348-
SOME (update_ascope_gen ascope_update ascope i ((INL (core_v_ext_packet (packet_out_bl++bl))):(core_v_ext, 'b) sum), scope_list, status'_returnv v'_bot)
419+
(case bool_list_to_byte_list bl of
420+
| SOME byte_list =>
421+
SOME (update_ascope_gen ascope_update ascope i ((INL (core_v_ext'_packet (packet_out_bl++ byte_list))):(core_v_ext', 'b) sum), scope_list, status'_returnv v'_bot)
422+
| NONE => NONE)
349423
| NONE => NONE)
350424
| SOME (v'_struct x_v_l) =>
351425
(case flatten_v_l' (MAP SND x_v_l) of
352426
| SOME bl =>
353-
SOME (update_ascope_gen ascope_update ascope i ((INL (core_v_ext_packet (packet_out_bl++bl))):(core_v_ext, 'b) sum), scope_list, status'_returnv v'_bot)
427+
(case bool_list_to_byte_list bl of
428+
| SOME byte_list =>
429+
SOME (update_ascope_gen ascope_update ascope i ((INL (core_v_ext'_packet (packet_out_bl++byte_list))):(core_v_ext', 'b) sum), scope_list, status'_returnv v'_bot)
430+
| NONE => NONE)
354431
| NONE => NONE)
355432
| SOME _ => NONE
356433
| NONE => NONE)
@@ -403,7 +480,7 @@ val CONTROL_PLANE_API = 0;
403480

404481
Type v1model_ctrl' = “:(word64, (((e_list' -> bool) # num), word64 # e_list') alist) alist”;
405482

406-
Type v1model_ascope' = “:(num # ((num, v1model_sum_v_ext) alist) # ((word64, v') alist) # v1model_ctrl')”;
483+
Type v1model_ascope' = “:(num # ((num, v1model_sum_v_ext') alist) # ((word64, v') alist) # v1model_ctrl')”;
407484

408485
Definition v1model_ascope_lookup'_def:
409486
v1model_ascope_lookup' (ascope:v1model_ascope') ext_ref =
@@ -439,7 +516,7 @@ Definition v1model_postparser'_def:
439516
(case ALOOKUP v_map 8w of
440517
| SOME (v'_ext_ref i) =>
441518
(case ALOOKUP ext_obj_map i of
442-
| SOME (INL (core_v_ext_packet bl)) =>
519+
| SOME (INL (core_v_ext'_packet bl)) =>
443520
(case ALOOKUP v_map 9w of
444521
| SOME (v'_ext_ref i') =>
445522
(case ALOOKUP v_map 11w of
@@ -452,8 +529,8 @@ Definition v1model_postparser'_def:
452529
(case scope_to_vmap' v_map_scope of
453530
| SOME v_map'' =>
454531
let v_map''' = p4$AUPDATE v_map'' (7w, v'_bit (fixwidth 32 (n2v 0), 32)) in
455-
let (counter', ext_obj_map', v_map'''', ctrl') = (v1model_ascope_update' (counter, ext_obj_map, v_map''', ctrl) i' (INL (core_v_ext_packet bl))) in
456-
SOME (v1model_ascope_update' (counter', ext_obj_map', v_map'''', ctrl') i (INL (core_v_ext_packet [])))
532+
let (counter', ext_obj_map', v_map'''', ctrl') = (v1model_ascope_update' (counter, ext_obj_map, v_map''', ctrl) i' (INL (core_v_ext'_packet bl))) in
533+
SOME (v1model_ascope_update' (counter', ext_obj_map', v_map'''', ctrl') i (INL (core_v_ext'_packet [])))
457534
| NONE => NONE)
458535
| _ => NONE)
459536
| NONE => NONE)
@@ -499,14 +576,14 @@ val v1model_standard_metadata_zeroed' =
499576
Redblackmap.find (v1model_dict, “"meta"”)
500577
*)
501578
Definition v1model_input_f'_def:
502-
(v1model_input_f' (tau1_uninit_v,tau2_uninit_v) (io_list:in_out_list, (counter, ext_obj_map, v_map, ctrl):v1model_ascope') =
579+
(v1model_input_f' (tau1_uninit_v,tau2_uninit_v) (io_list:in_out_list', (counter, ext_obj_map, v_map, ctrl):v1model_ascope') =
503580
case io_list of
504581
| [] => NONE
505-
| ((bl,p)::t) =>
582+
| ((byte_list,p)::t) =>
506583
(* TODO: Currently, no garbage collection in ext_obj_map is done *)
507584
(* let counter' = ^v1model_init_counter in *)
508-
let ext_obj_map' = AUPDATE_LIST ext_obj_map [(counter, INL (core_v_ext_packet bl));
509-
(counter+1, INL (core_v_ext_packet []))] in
585+
let ext_obj_map' = AUPDATE_LIST ext_obj_map [(counter, INL (core_v_ext'_packet byte_list));
586+
(counter+1, INL (core_v_ext'_packet []))] in
510587
let counter' = counter + 2 in
511588
(* TODO: Currently, no garbage collection in v_map is done *)
512589
let v_map' = AUPDATE_LIST v_map [(8w, v'_ext_ref counter);
@@ -547,16 +624,16 @@ Definition v1model_lookup_obj'_def:
547624
End
548625

549626
Definition v1model_output_f'_def:
550-
v1model_output_f' (in_out_list:in_out_list, (counter, ext_obj_map, v_map, ctrl):v1model_ascope') =
627+
v1model_output_f' (in_out_list:in_out_list', (counter, ext_obj_map, v_map, ctrl):v1model_ascope') =
551628
(case v1model_lookup_obj' ext_obj_map v_map 8w of
552-
| SOME (INL (core_v_ext_packet bl)) =>
629+
| SOME (INL (core_v_ext'_packet byte_list)) =>
553630
(case v1model_lookup_obj' ext_obj_map v_map 9w of
554-
| SOME (INL (core_v_ext_packet bl')) =>
631+
| SOME (INL (core_v_ext'_packet byte_list')) =>
555632
(case ALOOKUP v_map 10w of
556633
| SOME (v'_struct struct) =>
557634
(case ALOOKUP struct 23w of
558635
| SOME (v'_bit (port_bl, n)) =>
559-
SOME (in_out_list++(if v1model_is_drop_port port_bl then [] else [(bl++bl', v2n port_bl)]), (counter, ext_obj_map, v_map, ctrl))
636+
SOME (in_out_list++(if v1model_is_drop_port port_bl then [] else [(byte_list++byte_list', v2n port_bl)]), (counter, ext_obj_map, v_map, ctrl))
560637
| _ => NONE)
561638
| _ => NONE)
562639
| _ => NONE)

0 commit comments

Comments
 (0)