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/p4spectec.backend_boot/spectec.ml.html
Source file spectec.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 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252module Typ = Runtime.Type.Typ module Value = Runtime.Value module CCache = Runtime.Dynamic.Caches.CallCache module Run = Runtime.Dynamic_Runner.Signature open Error open Util.Source (* A wrapper for SpecTec interfaces, providing apis for caching boot/unboots *) module type INTERFACE_SPECTEC = sig include Run.INTERFACE (* Interface cache *) type cache val make_cache : unit -> cache val push_cache : cache -> unit val pop_cache : unit -> unit val cache_enable : cache -> unit val cache_disable_reset : cache -> unit val cache_clear : cache -> unit (* Boot / unboots *) val boot_value : Value.t -> Value.t val boot_values : Value.t list -> Value.t val unboot_id : Value.t -> string phrase val unboot_typs : Value.t -> Typ.t list val unboot_values : Value.t -> Value.t list end (* The null layer *) module Make_null (Interface_SpecTec : INTERFACE_SPECTEC) (Interp_AL : Run.INTERP_AL) (Interp_SL : Run.INTERP_SL) (Interp_PL : Run.INTERP_PL) : Run.EXTERN = struct (* Mode initialization *) let call_func = ref (fun _ _ _ -> assert false) let init_mode mode_ = let call_func_ name typs values = (match mode_ with | Run.AL_mode -> Interp_AL.eval_func name typs values | Run.SL_mode -> Interp_SL.eval_func name typs values | Run.PL_mode -> Interp_PL.eval_func name typs values | Run.Empty_mode -> assert false) |> function | Pass value -> value | Fail (at, msg) -> error at msg in call_func := call_func_; () (* Threading extern calls to the interpreter *) let call_builtin_func (values_input : Value.t list) : Value.t list = let value_id, value_typs, value_values = match values_input with | [ value_id; value_typs; value_values ] -> (value_id, value_typs, value_values) | _ -> error_no_region "unexpected number of arguments to call_builtin_func" in let id = value_id |> Interface_SpecTec.unboot_id in let typs = value_typs |> Interface_SpecTec.unboot_typs in let values = value_values |> Interface_SpecTec.unboot_values in let value_output = !call_func id.it typs values in let value_value_output = Interface_SpecTec.boot_value value_output in let value_value_output_res = Value.Make.("OK val" <| [ value_value_output ] <<| "valres") in [ value_value_output_res ] (* Cache management *) (* Externs *) let eval_extern_rel (name : string) (values_input : Value.t list) : Run.rel_result = try Run.Pass (match name with | "Call_builtin_func" -> call_builtin_func values_input | _ -> error no_region (Format.asprintf "unimplemented extern relation: %s" name)) with Util.Error.ExternError (at, msg) -> Run.Fail (at, msg) let eval_extern_func (name : string) (_typs : Typ.t list) (_values_input : Value.t list) : Run.func_result = try Run.Pass (match name with | _ -> error no_region (Format.asprintf "unimplemented extern function: %s" name)) with Util.Error.ExternError (at, msg) -> Run.Fail (at, msg) (* State management *) let checkpoint () : int = 0 let seff (before : int) (after : int) : bool = before <> after (* Clear the cache *) let clear () : unit = () (* Cache management *) module Cache = struct let cache_on () = () let cache_off () = () end end (* The intermediate layer *) module Make_parametric (Runner : Run.RUNNER) (Interface_SpecTec : INTERFACE_SPECTEC) () : Run.EXTERN = struct (* Mode initialization *) let init_mode _ = () (* Caches * an interface cache for storing results of booting and unbooting values, types, and mixops *) type cache = { interface : Interface_SpecTec.cache } let cache : cache = let interface = Interface_SpecTec.make_cache () in { interface } module Cache = struct let cache_on () = Interface_SpecTec.cache_enable cache.interface let cache_off () = Interface_SpecTec.cache_disable_reset cache.interface end (* Threading extern calls to the runner *) let call_builtin_func (values_input : Value.t list) : Value.t list = let value_id, value_typs, value_values = match values_input with | [ value_id; value_typs; value_values ] -> (value_id, value_typs, value_values) | _ -> error_no_region "unexpected number of arguments to call_builtin_func" in Interface_SpecTec.push_cache cache.interface; let id = value_id |> Interface_SpecTec.unboot_id in let typs = value_typs |> Interface_SpecTec.unboot_typs in let values = value_values |> Interface_SpecTec.unboot_values in let value_output = match Runner.Interp.eval_func id.it typs values with | Pass value_output -> value_output | Fail (at, msg) -> error at msg in let value_value_output = Interface_SpecTec.boot_value value_output in let value_value_output_res = Value.Make.("OK val" <| [ value_value_output ] <<| "valres") in Interface_SpecTec.pop_cache (); [ value_value_output_res ] let call_extern_func (values_input : Value.t list) : Value.t list = let value_id, value_typs, value_values = match values_input with | [ value_id; value_typs; value_values ] -> (value_id, value_typs, value_values) | _ -> error_no_region "unexpected number of arguments to call_extern_rel" in Interface_SpecTec.push_cache cache.interface; let id = value_id |> Interface_SpecTec.unboot_id in let typs = value_typs |> Interface_SpecTec.unboot_typs in let values = value_values |> Interface_SpecTec.unboot_values in let value_output = match Runner.Interp.eval_func id.it typs values with | Pass value_output -> value_output | Fail (at, msg) -> error at msg in let value_value_output = Interface_SpecTec.boot_value value_output in let value_value_output_res = Value.Make.("OK val" <| [ value_value_output ] <<| "valsres") in Interface_SpecTec.pop_cache (); [ value_value_output_res ] let call_extern_rel (values_input : Value.t list) : Value.t list = let value_id, value_values = match values_input with | [ value_id; value_values ] -> (value_id, value_values) | _ -> error_no_region "unexpected number of arguments to call_extern_rel" in Interface_SpecTec.push_cache cache.interface; let id = value_id |> Interface_SpecTec.unboot_id in let values = value_values |> Interface_SpecTec.unboot_values in let values_output = match Runner.Interp.eval_rel id.it values with | Pass values_output -> values_output | Fail (at, msg) -> error at msg in let value_values_output = Interface_SpecTec.boot_values values_output in let value_values_output_res = Value.Make.("OK val*" <| [ value_values_output ] <<| "valsres") in Interface_SpecTec.pop_cache (); [ value_values_output_res ] (* Extern handlers *) let eval_extern_rel (name : string) (values_input : Value.t list) : Run.rel_result = try Run.Pass (match name with | "Call_builtin_func" -> call_builtin_func values_input | "Call_extern_func" -> call_extern_func values_input | "Call_extern_rel" -> call_extern_rel values_input | _ -> error no_region (Format.asprintf "unimplemented extern relation: %s" name)) with Util.Error.ExternError (at, msg) -> Run.Fail (at, msg) let eval_extern_func (name : string) (_typs : Typ.t list) (_values_input : Value.t list) : Run.func_result = try Run.Pass (match name with | _ -> error no_region (Format.asprintf "unimplemented extern function: %s" name)) with Util.Error.ExternError (at, msg) -> Run.Fail (at, msg) (* State management *) let checkpoint () : int = Runner.Interface.checkpoint () let seff (before : int) (after : int) : bool = Runner.Interface.seff before after (* Clear the cache *) let clear_cache_interface () : unit = Interface_SpecTec.cache_clear cache.interface let clear () : unit = clear_cache_interface () end
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>