@@ -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+
1724Definition 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 )
214221End
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+
216233Definition 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 )
335370End
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+
337408Definition 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
404481Type 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
408485Definition 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' =
499576Redblackmap.find (v1model_dict, “"meta"”)
500577*)
501578Definition 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:
547624End
548625
549626Definition 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