123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191openLangmoduleTyp=Runtime.Type.TypmoduleValue=Runtime.ValuemoduleRun=Runtime.Dynamic_Runner.SignatureopenUtil.ErroropenUtil.Source(* Interfaces *)(* P4 *)moduleP4=struct(* Program unparser *)letunparser=ref(fun(_:Value.t)->"")(* Program parsing *)letparse_program(includes_p4:stringlist)(paths_p4:stringlist):Run.parse_result=trymatchpaths_p4with|[path_p4]->letvalue_program=P4.Parse.parse_fileincludes_p4path_p4inRun.Passvalue_program|_->Run.Fail(`Syntax(no_region,"exactly one P4 file must be provided"))withParseError(at,msg)->Run.Fail(`Syntax(at,msg))letparse_string(path_p4:string)(str:string):Run.parse_result=tryletvalue_program=P4.Parse.parse_stringpath_p4strinRun.Passvalue_programwithParseError(at,msg)->Run.Fail(`Syntax(at,msg))(* Program unparsing *)letunparse_program(value_program:Value.t):string=!unparservalue_program(* Builtins *)moduleBuiltin_P4_Ext=struct(* dec $print_<X>(X) : text *)letprint(add:Value.t->unit)(at:region)(targs:Typ.tlist)(values_input:Value.tlist):Value.t=let_typ=Builtin.Extract.oneattargsinletvalue=Builtin.Extract.oneatvalues_inputinlettext=!unparservalueinletvalue=Value.Make.texttextinaddvalue;value(* Builtin extension entries *)letentries=[("print_",print)]endmoduleBuiltin_P4=Builtin.Call.Make(Builtin_P4_Ext)()letcall_builtin=Builtin_P4.invoke(* State management *)letcheckpoint=Builtin_P4.checkpointletseff=Builtin_P4.seff(* Cache management *)moduleCache=structletcache_on()=()letcache_off()=()end(* Initialization *)letinit(spec:Run.spec):unit=letprinter(value:Value.t)=matchspecwith|ALspec_al->lethenv=P4.Unparse.hints_of_spec_alspec_alinFormat.asprintf"%a"(P4.Unparse.pp_valuehenv)value|SLspec_sl->lethenv=P4.Unparse.hints_of_spec_slspec_slinFormat.asprintf"%a"(P4.Unparse.pp_valuehenv)value|PLspec_pl->lethenv=P4.Unparse.hints_of_spec_plspec_plinFormat.asprintf"%a"(P4.Unparse.pp_valuehenv)value|Empty->assertfalseinunparser:=printerend(* SpecTec IL *)moduleSpecTec_AL=structincludeSpectec.Common.BootincludeSpectec.Common.UnbootincludeSpectec.Ali.BootincludeSpectec.Ali.UnbootincludeSpectec.Caches(* Program parsing *)letparse_program(_includes:stringlist)(paths:stringlist):Run.parse_result=tryletvalue_spec=Spectec.Parse.parse_filesRun.AL_modepathsinRun.Passvalue_specwith|ParseError(at,msg)->Run.Fail(`Syntax(at,msg))|ElabError(at,msg)->Run.Fail(`Syntax(at,msg))letparse_string(path:string)(str:string):Run.parse_result=tryletvalue_spec=Spectec.Parse.parse_stringRun.AL_modepathstrinRun.Passvalue_specwith|ParseError(at,msg)->Run.Fail(`Syntax(at,msg))|ElabError(at,msg)->Run.Fail(`Syntax(at,msg))(* Program unparsing *)letunparse_program(value_script:Value.t):string=value_script|>unboot_script|>Al.Print.string_of_spec(* Builtins *)moduleBuiltin_SpecTec=Builtin.Call.Make(Builtin.Call.No_ext)()letcall_builtin=Builtin_SpecTec.invoke(* State management *)letcheckpoint=Builtin_SpecTec.checkpointletseff=Builtin_SpecTec.seff(* Initialization *)letinit(_spec:Run.spec):unit=()end(* SpecTec SL *)moduleSpecTec_SL=structincludeSpectec.Common.BootincludeSpectec.Common.UnbootincludeSpectec.Sli.BootincludeSpectec.Sli.UnbootincludeSpectec.Caches(* Program parsing *)letparse_program(_includes:stringlist)(paths:stringlist):Run.parse_result=tryletvalue_spec=Spectec.Parse.parse_filesRun.SL_modepathsinRun.Passvalue_specwith|ParseError(at,msg)->Run.Fail(`Syntax(at,msg))|ElabError(at,msg)->Run.Fail(`Syntax(at,msg))letparse_string(path:string)(str:string):Run.parse_result=tryletvalue_spec=Spectec.Parse.parse_stringRun.SL_modepathstrinRun.Passvalue_specwith|ParseError(at,msg)->Run.Fail(`Syntax(at,msg))|ElabError(at,msg)->Run.Fail(`Syntax(at,msg))(* Program unparsing *)letunparse_program(value_script:Value.t):string=value_script|>unboot_script|>Sl.Print.string_of_spec(* Builtins *)moduleBuiltin_SpecTec=Builtin.Call.Make(Builtin.Call.No_ext)()letcall_builtin=Builtin_SpecTec.invoke(* State management *)letcheckpoint=Builtin_SpecTec.checkpointletseff=Builtin_SpecTec.seff(* Initialization *)letinit(_spec:Run.spec):unit=()end