package p4spectec
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>
P4-SpecTec: A mechanization toolchain for the P4 Programming Language
Install
dune-project
Dependency
Authors
Maintainers
Sources
v0.1.2.tar.gz
md5=1a3bc0a385fe1ecf403c019f49aa6de6
sha512=5d20b5821f33e2a3a5419b208606f27c01511994c2b3b1e1cdf4c077056dfd0aa81682af0720e1060ee2bfb0341918fcc4c53159820205a2bc32b725e5c1a714
doc/src/instr/multi.ml.html
Source file multi.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151open Domain.Lib open Lang open Sl open Util.Source (* Instruction node *) module Node = struct (* Enclosing relation or function id *) type origin = id (* Status *) type status = Hit of string list | Miss (* Type *) type t = { origin : origin; status : status } (* Constructor *) let init (id : id) : t = { origin = id; status = Miss } (* Equivalence *) let eq (node_a : t) (node_b : t) : bool = node_a.origin = node_b.origin && node_a.status = node_b.status (* Printer *) let to_string (node : t) : string = match node.status with Hit _ -> "H" | Miss -> "M" end (* Instruction node coverage map *) module Cover = struct include MakeIIdEnv (Node) (* Constructor *) let is_ignored (hints : hint list) : bool = Hints.Flag.init hints "cover_instr_ignore" let rec init_instr (cover : t) (id : id) (instr : instr) : t = let iid = instr.note.iid in let node = Node.init id in let cover = add iid node cover in match instr.it with | IfI (_, _, block_then, _) -> init_block cover id block_then | HoldI (_, _, _, holdcase) -> ( match holdcase with | BothH (block_hold, block_nothold) -> let cover = init_block cover id block_hold in init_block cover id block_nothold | HoldH (block_hold, _) -> init_block cover id block_hold | NotHoldH (block_nothold, _) -> init_block cover id block_nothold) | CaseI (_, cases, _) -> let blocks = cases |> List.split |> snd in List.fold_left (fun cover block -> init_block cover id block) cover blocks | GroupI (_, _, _, block_group) -> init_block cover id block_group | LetI (_, _, _, block) -> init_block cover id block | RuleI (_, _, _, _, block) -> init_block cover id block | _ -> cover and init_block (cover : t) (id : id) (block : block) : t = List.fold_left (fun cover instr -> init_instr cover id instr) cover block let init_tablerow (cover : t) (id : id) (tablerow : tablerow) : t = let _, _, block = tablerow in init_block cover id block let init_tablerows (cover : t) (id : id) (tablerows : tablerow list) : t = List.fold_left (fun cover tablerow -> init_tablerow cover id tablerow) cover tablerows let init_def (cover : t) (def : def) : t = match def.it with | RelD (id, _, _, block, elseblock_opt, hints) when not (is_ignored hints) -> ( let cover = init_block cover id block in match elseblock_opt with | Some elseblock -> init_block cover id elseblock | None -> cover) | FuncDecD (id, _, _, _, block, elseblock_opt, hints) when not (is_ignored hints) -> ( let cover = init_block cover id block in match elseblock_opt with | Some elseblock -> init_block cover id elseblock | None -> cover) | TableDecD (id, _, _, tablerows, hints) when not (is_ignored hints) -> init_tablerows cover id tablerows | _ -> cover let init_spec (spec : spec) : t = List.fold_left init_def empty spec end (* Instruction node coverage *) type t = Cover.t (* Querying coverage *) let is_hit (cover : t) (iid : iid) : bool = match Cover.find_opt iid cover with | Some node -> ( match node.Node.status with Hit _ -> true | Miss -> false) | None -> false (* Measuring coverage *) let measure_coverage (cover : t) : int * int * float = let total = Cover.cardinal cover in let hits = Cover.fold (fun _ (node : Node.t) (hits : int) -> match node.status with Hit _ -> hits + 1 | Miss -> hits) cover 0 in let coverage = if total = 0 then 0. else float_of_int hits /. float_of_int total *. 100. in (total, hits, coverage) (* Extension from single coverage *) let extend (cover : t) (path_p4 : string) (cover_single : Single.t) : t = Cover.mapi (fun (iid : iid) (node : Node.t) -> let node_single = Single.Cover.find iid cover_single in match node.status with | Hit paths_p4 -> ( match node_single.status with | Hit -> let paths_p4 = path_p4 :: paths_p4 in { node with status = Hit paths_p4 } | _ -> node) | Miss -> ( match node_single.status with | Hit -> let paths_p4 = [ path_p4 ] in { node with status = Hit paths_p4 } | _ -> node)) cover (* Constructor *) let init (spec : spec) : t = Cover.init_spec spec
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>