123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874(**************************************************************************)(* *)(* SPDX-License-Identifier LGPL-2.1 *)(* Copyright (C) *)(* CEA (Commissariat à l'énergie atomique et aux énergies alternatives) *)(* *)(**************************************************************************)(* -------------------------------------------------------------------------- *)(* --- Server API for WP --- *)(* -------------------------------------------------------------------------- *)moduleP=Server.PackagemoduleD=Server.DatamoduleR=Server.RequestmoduleS=Server.StatesmoduleMd=MarkdownmoduleAST=Server.Kernel_astmoduleWP_Prover=Proverletpackage=P.package~plugin:"wp"~title:"WP Main Services"()(* -------------------------------------------------------------------------- *)(* --- WPO Index --- *)(* -------------------------------------------------------------------------- *)moduleINDEX=State_builder.Ref(Datatype.Make(structincludeDatatype.Undefinedtypet=(string,Wpo.t)Hashtbl.tletname="WpApi.INDEX.Datatype"letreprs=[Hashtbl.create0]letmem_project=Datatype.never_any_projectend))(structletname="WpApi.INDEX"letdependencies=[Ast.self]letdefault()=Hashtbl.create0end)letindexGoalg=letid=g.Wpo.po_gidinletindex=INDEX.get()inifnot(Hashtbl.memindexid)thenHashtbl.addindexidg;idmoduleGoal:D.Swithtypet=Wpo.t=structtypet=Wpo.tletjtype=D.declare~package~name:"goal"~descr:(Md.plain"Proof Obligations")(Jkey"wpo")letof_jsonjs=Hashtbl.find(INDEX.get())(Json.stringjs)letto_jsong=`String(indexGoalg)end(* -------------------------------------------------------------------------- *)(* --- Provers --- *)(* -------------------------------------------------------------------------- *)moduleProver=structtypet=Prover.tletjtype=D.declare~package~name:"prover"~descr:(Md.plain"Prover Identifier")(Jkey"prover")letto_jsonprv=`String(WP_Prover.identprv)letof_jsonjs=matchProver.parse@@Json.stringjswith|Someprv->prv|None->D.failure"Unknown prover name"endmoduleProvers=D.Jlist(Prover)letsignal=refNoneletgetProvers()=List.filterWP_Prover.is_extern@@WP_Prover.provers()let()=R.register~package~name:"setProverState"~descr:(Md.plain"Select/unselect prover")~kind:`SET~input:(moduleD.Jpair(Prover)(D.Jbool))~output:(moduleD.Junit)beginfun(p,v)->WP_Prover.set_proverp~state:v;Option.iterR.emit!signalendlet_=lets=S.register_value~package~name:"provers"~descr:(Md.plain"Get all available provers")~output:(moduleProvers)~get:(fun()->getProvers())()insignal:=Someslet_:WP_Prover.tS.array=letmodel=S.model()inS.column~name:"name"~descr:(Md.plain"Prover Name")~data:(moduleD.Jalpha)~get:WP_Prover.namemodel;S.column~name:"version"~descr:(Md.plain"Prover Version")~data:(moduleD.Jalpha)~get:WP_Prover.versionmodel;S.column~name:"descr"~descr:(Md.plain"Prover Full Name (description)")~data:(moduleD.Jalpha)~get:(WP_Prover.title~version:true)model;S.columnmodel~name:"extern"~descr:(Md.plain"Why3 or internal")~data:(moduleD.Jbool)~get:WP_Prover.is_extern;S.columnmodel~name:"auto"~descr:(Md.plain"Automatic solver")~data:(moduleD.Jbool)~get:WP_Prover.is_auto;S.columnmodel~name:"active"~descr:(Md.plain"Whether it is enabled")~data:(moduleD.Jbool)~get:WP_Prover.enabled;S.register_array~package~name:"ProverInfos"~descr:(Md.plain"Available Provers")~key:WP_Prover.ident~keyName:"prover"~keyType:Prover.jtype~iter:(funf->List.iterf@@WP_Prover.provers())~add_update_hook:WP_Prover.add_prover_update_hook~add_reload_hook:WP_Prover.add_reload_hookmodel(* -------------------------------------------------------------------------- *)(* --- Server Processes --- *)(* -------------------------------------------------------------------------- *)let_=S.register_state~package~name:"process"~descr:(Md.plain"Server Processes")~data:(moduleD.Jint)~get:Wp_parameters.Procs.get~set:(funprocs->Wp_parameters.Procs.setprocs;ignore@@ProverTask.server~procs())~add_hook:Wp_parameters.Procs.add_hook_on_update()(* -------------------------------------------------------------------------- *)(* --- Provers Timeout --- *)(* -------------------------------------------------------------------------- *)let_=S.register_state~package~name:"timeout"~descr:(Md.plain"Prover's Timeout")~data:(moduleD.Jint)~get:Wp_parameters.Timeout.get~set:Wp_parameters.Timeout.set~add_hook:Wp_parameters.Timeout.add_hook_on_update()(* -------------------------------------------------------------------------- *)(* --- Cache mode --- *)(* -------------------------------------------------------------------------- *)moduleCacheMode=structincludeD.Enumletdictionary:Cache.modedictionary=dictionary()lettagnamevalue=tag~name~descr:(Md.plainname)~valuedictionaryletnone=tag"None"NoCacheletupdate=tag"Update"Updateletreplay=tag"Replay"Replayletrebuild=tag"Rebuild"Rebuildletoffline=tag"Offline"Offlineletcleanup=tag"Cleanup"Cleanupletlookup=function|Cache.NoCache->none|Update->update|Replay->replay|Rebuild->rebuild|Offline->offline|Cleanup->cleanuplet()=set_lookupdictionarylookupinclude(valpublish~package~descr:(Md.plain"Cache mode")~name:"CacheMode"dictionary)endlet_=S.register_state~package~name:"cacheMode"~descr:(Md.plain"Current Cache mode")~data:(moduleCacheMode)~get:Cache.get_mode~set:Cache.set_mode~add_hook:Cache.add_hook_on_mode_update()(* -------------------------------------------------------------------------- *)(* --- Interactive provers --- *)(* -------------------------------------------------------------------------- *)let_=R.register~package~kind:`GET~name:"isInteractiveProver"~descr:(Md.plain"Tells whether the prover is interactive")~input:(moduleProver)~output:(moduleD.Jbool)(funp->not@@WP_Prover.is_autop)moduleInteractiveMode=structincludeD.Enumletdictionary:WP_Prover.InteractiveMode.tdictionary=dictionary()lettagnamevalue=tag~name~descr:(Md.plainname)~valuedictionaryletbatch=tag"Batch"WP_Prover.InteractiveMode.Batchletupdate=tag"Update"WP_Prover.InteractiveMode.Updateletedit=tag"Edit"WP_Prover.InteractiveMode.Editletfix=tag"Fix"WP_Prover.InteractiveMode.Fixletfixup=tag"FixUpdate"WP_Prover.InteractiveMode.FixUpdateletlookup=function|WP_Prover.InteractiveMode.Batch->batch|Update->update|Edit->edit|Fix->fix|FixUpdate->fixuplet()=set_lookupdictionarylookupinclude(valpublish~package~descr:(Md.plain"interactive mode")~name:"InteractiveMode"dictionary)endlet_=S.register_state~package~name:"interactiveMode"~descr:(Md.plain"Current interactive mode")~data:(moduleInteractiveMode)~get:WP_Prover.InteractiveMode.get~set:WP_Prover.InteractiveMode.set~add_hook:WP_Prover.InteractiveMode.add_hook_on_update()(* -------------------------------------------------------------------------- *)(* --- Proof Strategies --- *)(* -------------------------------------------------------------------------- *)moduleTipMode=structincludeD.Enumletdictionary:WP_Prover.TipMode.tdictionary=dictionary()lettagnamevalue=tag~name~descr:(Md.plainname)~valuedictionaryletbatch=tag"Batch"WP_Prover.TipMode.Batchletupdate=tag"Update"WP_Prover.TipMode.Updateletdry=tag"Dry"WP_Prover.TipMode.Dryletinit=tag"Init"WP_Prover.TipMode.Initletlookup=function|WP_Prover.TipMode.Batch->batch|Update->update|Dry->dry|Init->initlet()=set_lookupdictionarylookupinclude(valpublish~package~descr:(Md.plain"TIP mode")~name:"TipMode"dictionary)endlet_=S.register_state~package~name:"tipMode"~descr:(Md.plain"Current Strategy Mode")~data:(moduleTipMode)~get:WP_Prover.TipMode.get~set:WP_Prover.TipMode.set~add_hook:WP_Prover.TipMode.add_hook_on_update()let_=S.register_state~package~name:"scripts"~descr:(Md.plain"Whether scripts are enabled")~data:(moduleD.Jbool)~get:WP_Prover.use_scripts~set:WP_Prover.set_use_scripts~add_hook:WP_Prover.add_scripts_update_hook()let_=S.register_state~package~name:"strategies"~descr:(Md.plain"Whether strategies are enabled")~data:(moduleD.Jbool)~get:WP_Prover.use_strategies~set:WP_Prover.set_use_strategies~add_hook:WP_Prover.add_scripts_update_hook()(* -------------------------------------------------------------------------- *)(* --- Counter Examples --- *)(* -------------------------------------------------------------------------- *)let_=S.register_state~package~name:"counterExamples"~descr:(Md.plain"Enabled Counter Examples")~data:(moduleD.Jbool)~get:Wp_parameters.CounterExamples.get~set:Wp_parameters.CounterExamples.set~add_hook:Wp_parameters.CounterExamples.add_hook_on_update()(* -------------------------------------------------------------------------- *)(* --- Results and Stats --- *)(* -------------------------------------------------------------------------- *)moduleResult=structtypet=VCS.resultletjtype=D.declare~package~name:"result"~descr:(Md.plain"Prover Result")(Jrecord["descr",Jstring;"cached",Jboolean;"verdict",Jstring;"solverTime",Jnumber;"proverTime",Jnumber;"proverSteps",Jnumber;])letof_json_=failwith"Not implemented"letto_json(r:VCS.result)=`Assoc["descr",`String(Pretty_utils.to_stringVCS.pp_resultr);"cached",`Boolr.cached;"verdict",`String(VCS.name_of_verdict~computing:truer.verdict);"solverTime",`Floatr.solver_time;"proverTime",`Floatr.prover_time;"proverSteps",`Intr.prover_steps;]endmoduleSTATUS=structtypet={smoke:bool;verdict:VCS.verdict}letjtype=D.declare~package~name:"status"~descr:(Md.plain"Test Status")(Junion[Jkey"NORESULT";Jkey"COMPUTING";Jkey"FAILED";Jkey"STEPOUT";Jkey"UNKNOWN";Jkey"VALID";Jkey"PASSED";Jkey"DOOMED";])letto_json{smoke;verdict}=`Stringbeginmatchverdictwith|Valid->ifsmokethen"DOOMED"else"VALID"|Invalid->ifsmokethen"PASSED"else"INVALID"|Unknown->ifsmokethen"PASSED"else"UNKNOWN"|Timeout->ifsmokethen"PASSED"else"TIMEOUT"|Stepout->ifsmokethen"PASSED"else"STEPOUT"|Failed->"FAILED"|NoResult->"NORESULT"|Computing_->"COMPUTING"endendmoduleSTATS=structtypet=Stats.statsletjtype=D.declare~package~name:"stats"~descr:(Md.plain"Prover Result")(Jrecord["summary",Jstring;"tactics",Jnumber;"proved",Jnumber;"total",Jnumber;])letto_jsoncs:Json.t=letcache=Cache.get_mode()inletsummary=Pretty_utils.to_string(Stats.pp_stats~shell:false~cache)csin`Assoc["summary",`Stringsummary;"tactics",`Intcs.tactics;"proved",`Intcs.proved;"total",`Int(Stats.subgoalscs);]end(* -------------------------------------------------------------------------- *)(* --- Goal Array --- *)(* -------------------------------------------------------------------------- *)letgmodel:Wpo.tS.model=S.model()letget_propertyg=Printer_tag.PIP(WpPropId.property_of_idg.Wpo.po_pid)letget_markerg=matchg.Wpo.po_formula.sourcewith|Some(stmt,_)->Printer_tag.localizable_of_stmtstmt|None->letip=WpPropId.property_of_idg.Wpo.po_pidinmatchipwith|IPOther{io_loc=OLStmt(_,stmt)}->Printer_tag.localizable_of_stmtstmt|_->Printer_tag.PIPipletget_declg=matchg.Wpo.po_idxwith|Function(kf,_)->Some(Printer_tag.SFunctionkf)|Axiomatic_->None(* TODO *)letget_fctg=matchg.Wpo.po_idxwith|Function(kf,_)->Some(Kernel_function.get_namekf)|Axiomatic_->Noneletget_bhvg=matchg.Wpo.po_idxwith|Function(_,bhv)->bhv|Axiomatic_->Noneletget_thyg=matchg.Wpo.po_idxwith|Function_->None|Axiomaticax->axletget_statusg=STATUS.{smoke=Wpo.is_smoke_testg;verdict=(ProofEngine.consolidatedg).best;}letget_ast_dependenciesg=letopenWpoinletmoduleStmts=Cil_datatype.Stmt.SetinletmoduleProps=Property.Setinletadd_stmtsl=Printer_tag.localizable_of_stmts::linletadd_proppl=Printer_tag.PIPp::linStmts.foldadd_stmtg.po_formula.path@@Props.foldadd_propg.po_formula.deps[]let()=S.columngmodel~name:"marker"~descr:(Md.plain"Associated Marker")~data:(moduleAST.Marker)~get:get_markerlet()=S.columngmodel~name:"scope"~descr:(Md.plain"Associated declaration, if any")~data:(moduleD.Joption(AST.Decl))~get:get_decllet()=S.columngmodel~name:"property"~descr:(Md.plain"Property Marker")~data:(moduleAST.Marker)~get:get_propertylet()=S.optiongmodel~name:"fct"~descr:(Md.plain"Associated function name, if any")~data:(moduleD.Jstring)~get:get_fctlet()=S.optiongmodel~name:"bhv"~descr:(Md.plain"Associated behavior name, if any")~data:(moduleD.Jstring)~get:get_bhvlet()=S.optiongmodel~name:"thy"~descr:(Md.plain"Associated axiomatic name, if any")~data:(moduleD.Jstring)~get:get_thylet()=S.columngmodel~name:"name"~descr:(Md.plain"Informal Property Name")~data:(moduleD.Jstring)~get:(fung->g.Wpo.po_name)let()=S.columngmodel~name:"smoke"~descr:(Md.plain"Smoking (or not) goal")~data:(moduleD.Jbool)~get:Wpo.is_smoke_testlet()=S.columngmodel~name:"passed"~descr:(Md.plain"Valid or Passed goal")~data:(moduleD.Jbool)~get:Wpo.is_passedlet()=S.columngmodel~name:"status"~descr:(Md.plain"Verdict, Status")~data:(moduleSTATUS)~get:get_statuslet()=S.columngmodel~name:"stats"~descr:(Md.plain"Prover Stats Summary")~data:(moduleSTATS)~get:ProofEngine.consolidatedlet()=S.columngmodel~name:"proof"~descr:(Md.plain"Proof Tree")~data:(moduleD.Jbool)~get:ProofEngine.has_prooflet()=S.optiongmodel~name:"script"~descr:(Md.plain"Script File")~data:(moduleD.Jstring)~get:(funwpo->matchProofSession.getwpowith|NoScript->None|Scripta|Deprecateda->Some(Filepath.to_string_absa))let()=S.columngmodel~name:"saved"~descr:(Md.plain"Saved Script")~data:(moduleD.Jbool)~get:(funwpo->ProofEngine.getwpo=`Saved)let()=S.columngmodel~name:"deps"~descr:(Md.plain"Dependencies")~data:(moduleD.Jlist(AST.Marker))~get:get_ast_dependenciesletfilterhookfn=hook(fung->ifnot@@Wpo.is_tacticgthenfng)let(++)h1h2fn=h1fn;h2fnletgoals=letadd_remove_hook=filterWpo.add_removed_hookinletadd_update_hook=filterWpo.add_modified_hook++ProofEngine.add_goal_hookinletadd_reload_hook=Wpo.add_cleared_hookinS.register_array~package~name:"goals"~descr:(Md.plain"Generated Goals")~key:indexGoal~keyName:"wpo"~keyType:Goal.jtype~iter:(filterWpo.iter_on_goals)~preload:ProofEngine.consolidate~add_remove_hook~add_update_hook~add_reload_hookgmodellet()=R.register~package~kind:`GET~name:"getGoalsFromASTMarker"~descr:(Md.plain"Get goals from AST marker")~input:(moduleAST.Marker)~output:(moduleD.Jlist(Goal))beginfunmarker->letopenPrinter_taginlethas_markerg=letis_marker=Localizable.equalmarkerinletin_stmt=matchg.Wpo.po_formula.sourcewith|Some(stmt,_)->is_marker@@localizable_of_stmtstmt|None->falseinin_stmt||matchWpPropId.property_of_idg.Wpo.po_pidwith|IPOther{io_loc=OLStmt(_,s)}->is_marker@@localizable_of_stmts|ip->is_marker@@Printer_tag.PIPipinletselectg=has_markerg&¬@@Wpo.is_tacticginletl=ref[]inWpo.iter_on_goals(fung->ifselectgthenl:=g::!l);List.sortWpo.S.compare!lend(* -------------------------------------------------------------------------- *)(* --- Generate RTEs --- *)(* -------------------------------------------------------------------------- *)let()=R.register~package~kind:`EXEC~name:"generateRTEGuards"~descr:(Md.plain"Generate RTE guards for the function")~input:(moduleAST.Marker)~output:(moduleD.Junit)beginfunction|PVDecl(Somekf,_,_)->letsetup=Factory.parse(Wp_parameters.Model.get())inletdriver=Driver.load_driver()inletmodel=Factory.instancesetupdriverinWpRTE.generatemodelkf|_->()end(* -------------------------------------------------------------------------- *)(* --- Special case of initialization --- *)(* -------------------------------------------------------------------------- *)(* NB: this should be factorized between Eva, RTE, Kernel *)moduleInitialized_proxy=structtypet=|OnlyofKernel_function.Set.t|ExceptofKernel_function.Set.ttypeelem=All|KfofCil_types.kernel_functiontypeinit=Addofelem|Removeofelemletactionsetelem=matchelem,setwith|AddAll,_->ExceptKernel_function.Set.empty|RemoveAll,_->OnlyKernel_function.Set.empty|Add(Kfkf),Exceptset->Except(Kernel_function.Set.removekfset)|Add(Kfkf),Onlyset->Only(Kernel_function.Set.addkfset)|Remove(Kfkf),Exceptset->Except(Kernel_function.Set.addkfset)|Remove(Kfkf),Onlyset->Only(Kernel_function.Set.removekfset)letparsename=letadde=Addeandreme=RemoveeinifString.equalname"@default"||String.equalname"+@default"||String.equalname"-@default"thenNone(* adds or removes nothing *)elseifString.equalname"@all"||String.equalname"+@all"thenSome(AddAll)elseifString.equalname"-@all"thenSome(RemoveAll)elseifString.starts_with~prefix:"-"name||String.starts_with~prefix:"+"namethenletop=ifString.getname0='+'thenaddelsereminletname=String.subname1((String.lengthname)-1)inSome(op(Kf(Globals.Functions.find_by_namename)))elseSome(Add(Kf(Globals.Functions.find_by_namename)))letparse_actionls=matchparseswith|None->l|Somevalue->actionlvalueletpp_actionsfmtactions=letonly,elements=matchactionswith|Onlyset->true,Kernel_function.Set.elementsset|Exceptset->false,Kernel_function.Set.elementssetinletppfmtkf=ifonlythenKernel_function.prettyfmtkfelseFormat.fprintffmt"-%a"Kernel_function.prettykfinFormat.fprintffmt"%s%a"(ifonlythen""elseifelements=[]then"@all"else"@all,")(Pretty_utils.pp_list~sep:","pp)elementsletcurrent_init_proxy=ref(OnlyKernel_function.Set.empty)lethooks=ref[]letadd_hook_on_updatehook=hooks:=hook::!hooksletset_init_proxyvalue=current_init_proxy:=value;List.iter(funhook->hook())!hooksletupdate_init_proxy()=(* We force the kernel to compute the value so that we are sure that the
internal string contains something that is meaningful for a kernel
function set.
*)ignore(RteGen.Options.DoInitialized.get());(* Now the nice thing is that we are sure that list contains only @all,
@default or function names (potentially prefixed with - or +), so we can
trim spaces and split according to ','. *)letline=RteGen.Options.DoInitialized.As_string.get()inletentries=List.mapString.trim@@String.split_on_char','lineinletactions=List.fold_leftparse_action(OnlyKernel_function.Set.empty)entriesinset_init_proxyactions(* Note that, since we do not update the actual option with the preprocessed
list of actions, the proxy is not *exactly* the same as the content of the
parameter. But, it has the same meaning.
*)let()=RteGen.Options.DoInitialized.add_set_hook(fun__->update_init_proxy())letsetactions=RteGen.Options.DoInitialized.As_string.set(Format.asprintf"%a"pp_actionsactions);set_init_proxyactionsletget()=!current_init_proxyendmoduleJInitialized_proxy=structmoduleDecl_list=D.Jlist(D.Jpair(AST.Decl)(D.Jstring))typet=Initialized_proxy.tletjtype=D.declare~package~name:"initializedProxy"@@Jrecord["only",Jboolean;"elems",Decl_list.jtype]letto_jsons=letonly,set=matchswith|Initialized_proxy.Onlyset->true,set|Initialized_proxy.Exceptset->false,setinletelems=List.map(funkf->Printer_tag.SFunctionkf,Kernel_function.get_namekf)(Kernel_function.Set.elementsset)in`Assoc["only",`Boolonly;"elems",Decl_list.to_jsonelems]letof_jsonjson=letextract_function=function|Printer_tag.SFunctionkf,_->kf|_->raiseNot_foundintrymatchJson.assocjsonwith|[(_,only);(_,elems)]->letonly=Json.boolonlyinletelems=Decl_list.of_jsonelemsinletkfs=List.mapextract_functionelemsinletkfs=Kernel_function.Set.of_listkfsinifonlythenInitialized_proxy.OnlykfselseExceptkfs|_->raiseNot_foundwith_->Wp_parameters.fatal"Cannot parse: %a"Json.ppjsonendlet()=ignore@@S.register_state~package~name:"initialized"~descr:(Md.plain"Configured properties filter")~data:(moduleJInitialized_proxy)~get:Initialized_proxy.get~set:Initialized_proxy.set~add_hook:Initialized_proxy.add_hook_on_update()(* -------------------------------------------------------------------------- *)(* --- Properties filter --- *)(* -------------------------------------------------------------------------- *)let()=ignore@@S.register_state~package~name:"filter"~descr:(Md.plain"Configured properties filter")~data:(moduleD.Jlist(D.Jstring))~get:Wp_parameters.Properties.get~set:Wp_parameters.Properties.set~add_hook:(funf->Wp_parameters.Properties.add_set_hook(fun_->f))()(* -------------------------------------------------------------------------- *)(* --- Generate goals --- *)(* -------------------------------------------------------------------------- *)letis_callstmt=matchstmt.Cil_types.skindwith|Instr(Call_)|Instr(Local_init(_,ConsInit_,_))->true|_->falseletstart_proofs_marker=function|Printer_tag.PExp_|PTermLval_|PLval_|PGlobal_|PType_|PVDecl(None,_,_)->(* We cannot run anything here *)()|PStmtStart(_,stmt)|PStmt(_,stmt)whenis_callstmt->VC.command@@VC.generate_callstmt|PStmtStart(kf,stmt)|PStmt(kf,stmt)->letfold_ips_cabag=letids=WpPropId.mk_code_annot_idskfstmtcainletprops=Bag.ulist@@List.mapVC.generate_ip@@List.mapWpPropId.property_of_ididsinBag.concatbagpropsinVC.command@@Annotations.fold_code_annotfold_ipsstmtBag.empty|PVDecl(Somekf,_,_)->VC.command@@VC.generate_kfkf|PIPproperty->VC.command@@VC.generate_ippropertylet()=R.register~package~kind:`EXEC~name:"startProofs"~descr:(Md.plain"Generate goals and run provers")~input:(moduleD.Joption(AST.Marker))~output:(moduleD.Junit)beginfunction|None->VC.command@@VC.generate_all()|Somemarker->start_proofs_markermarkerend(* -------------------------------------------------------------------------- *)(* --- Clear goals --- *)(* -------------------------------------------------------------------------- *)let()=R.register~package~kind:`EXEC~name:"clearProofs"~descr:(Md.plain"Clear goals")~input:(moduleD.Junit)~output:(moduleD.Junit)beginfun()->Emitter.clearWpReached.emitter;CfgInfos.clear();Wpo.iter_on_goals(fung->letemitter=WpContext.get_emitterg.po_modelinEmitter.clearemitter);Wpo.iter_on_goalsWpo.clear_results;Wpo.clear();end(* -------------------------------------------------------------------------- *)(* --- Proof Server --- *)(* -------------------------------------------------------------------------- *)letserverActivity=R.signal~package~name:"serverActivity"~descr:(Md.plain"Proof Server Activity")let()=letserver_sig=R.signature~input:(moduleD.Junit)()inletset_procs=R.resultserver_sig~name:"procs"~descr:(Md.plain"Max parallel tasks")(moduleD.Jint)inletset_active=R.resultserver_sig~name:"active"~descr:(Md.plain"Active tasks")(moduleD.Jint)inletset_done=R.resultserver_sig~name:"done"~descr:(Md.plain"Finished tasks")(moduleD.Jint)inletset_todo=R.resultserver_sig~name:"todo"~descr:(Md.plain"Remaining jobs")(moduleD.Jint)inR.register_sig~package~kind:`GET~name:"getScheduledTasks"~descr:(Md.plain"Scheduled tasks in proof server")~signals:[serverActivity]server_sigbeginletmonitored=reffalseinfunrq()->letserver=ProverTask.server()inifnot!monitoredthenbeginmonitored:=true;letsignal()=R.emitserverActivityinTask.on_server_activityserversignal;Task.on_server_startserversignal;Task.on_server_stopserversignal;end;set_procsrq(Task.get_procsserver);set_activerq(Task.runningserver);set_donerq(Task.terminatedserver);set_todorq(Task.remainingserver);endlet()=R.register~package~kind:`SET~name:"cancelProofTasks"~descr:(Md.plain"Cancel all scheduled proof tasks")~input:(moduleD.Junit)~output:(moduleD.Junit)(fun()->letserver=ProverTask.server()inTask.cancel_allserver)(* -------------------------------------------------------------------------- *)