123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297(**************************************************************************)(* *)(* This file is part of WP plug-in of Frama-C. *)(* *)(* Copyright (C) 2007-2023 *)(* CEA (Commissariat a l'energie atomique et aux energies *)(* alternatives) *)(* *)(* you can redistribute it and/or modify it under the terms of the GNU *)(* Lesser General Public License as published by the Free Software *)(* Foundation, version 2.1. *)(* *)(* It is distributed in the hope that it will be useful, *)(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *)(* GNU Lesser General Public License for more details. *)(* *)(* See the GNU Lesser General Public License version 2.1 *)(* for more details (enclosed in the file licenses/LGPLv2.1). *)(* *)(**************************************************************************)(* -------------------------------------------------------------------------- *)(* --- Server API for WP --- *)(* -------------------------------------------------------------------------- *)moduleP=Server.PackagemoduleD=Server.DatamoduleR=Server.RequestmoduleS=Server.StatesmoduleMd=MarkdownmoduleAST=Server.Kernel_astletpackage=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)moduleGoal: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=letid=g.Wpo.po_gidinletindex=INDEX.get()inifnot(Hashtbl.memindexid)thenHashtbl.addindexidg;`Stringidend(* -------------------------------------------------------------------------- *)(* --- VCS Provers --- *)(* -------------------------------------------------------------------------- *)moduleProver=structtypet=VCS.proverletjtype=D.declare~package~name:"prover"~descr:(Md.plain"Prover Identifier")(Jkey"prover")letto_jsonprv=`String(VCS.name_of_proverprv)letof_jsonjs=matchVCS.parse_prover@@Json.stringjswith|Someprv->prv|None->D.failure"Unknown prover name"endmoduleResult=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_verdictr.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|VCS.Valid->ifsmokethen"DOOMED"else"VALID"|VCS.Unknown->ifsmokethen"PASSED"else"UNKNOWN"|Failed->"FAILED"|NoResult->"NORESULT"|Computing_->"COMPUTING"|Timeout->"TIMEOUT"|Stepout->"STEPOUT"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=letsummary=Pretty_utils.to_string(Stats.pp_stats~shell:false~cache:Update)csin`Assoc["summary",`Stringsummary;"tactics",`Intcs.tactics;"proved",`Intcs.proved;"total",`Int(Stats.subgoalscs);]endlet()=R.register~package~kind:`GET~name:"getAvailableProvers"~descr:(Md.plain"Returns the list of configured provers from why3")~input:(moduleD.Junit)~output:(moduleD.Jlist(Prover))(fun()->List.map(funp->VCS.Why3p)@@List.filterWhy3Provers.is_mainstream@@Why3Provers.provers())(* -------------------------------------------------------------------------- *)(* --- Goal Array --- *)(* -------------------------------------------------------------------------- *)letgmodel:Wpo.tS.model=S.model()letget_kfg=matchg.Wpo.po_idxwith|Function(kf,_)->Somekf|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;}let()=S.columngmodel~name:"property"~descr:(Md.plain"Property Marker")~data:(moduleAST.Marker)~get:(fung->Printer_tag.PIP(WpPropId.property_of_idg.Wpo.po_pid))let()=S.columngmodel~name:"fct"~descr:(Md.plain"Associated function, if any")~data:(moduleD.Joption(AST.Function))~get:get_kflet()=S.optiongmodel~name:"bhv"~descr:(Md.plain"Associated behavior, if any")~data:(moduleD.Jstring)~get:get_bhvlet()=S.optiongmodel~name:"thy"~descr:(Md.plain"Associated axiomatic, 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.optiongmodel~name:"script"~descr:(Md.plain"Script File")~data:(moduleD.Jstring)~get:(funwpo->matchProofSession.getwpowith|NoScript->None|Scripta|Deprecateda->Some(a:>string))let()=S.columngmodel~name:"saved"~descr:(Md.plain"Saved Script")~data:(moduleD.Jbool)~get:(funwpo->ProofEngine.getwpo=`Saved)let_=S.register_array~package~name:"goals"~descr:(Md.plain"Generated Goals")~key:(fung->g.Wpo.po_gid)~keyName:"wpo"~keyType:Goal.jtype~iter:Wpo.iter_on_goals~add_update_hook:Wpo.add_modified_hook~add_remove_hook:Wpo.add_removed_hook~add_reload_hook:Wpo.add_cleared_hookgmodel(* -------------------------------------------------------------------------- *)(* --- 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)(* -------------------------------------------------------------------------- *)