let wp_panel (_main_ui:Design.main_window_extension_points) =
let vbox = GPack.vbox () in
let demon = Gtk_form.demon () in
let packing = vbox#pack in
let form = new Gtk_form.form ~packing in
form#label "Model" ;
Gtk_form.menu wp_model_menu
~tooltip:"Memory model selection" ~packing:form#item
Wp_parameters.Model.get Wp_parameters.Model.set demon ;
form#label "Prover" ;
Gtk_form.menu wp_prover_menu
~tooltip:"Prover selection"
~packing:form#item
wp_prover_get wp_prover_set demon ;
let options = GPack.hbox ~spacing:8 ~packing () in
Gtk_form.check ~label:"RTE"
~tooltip:"Generates RTE guards for WP"
~packing:options#pack
Wp_parameters.RTE.get Wp_parameters.RTE.set demon ;
Gtk_form.check ~label:"Split"
~tooltip:"Split cunjunctions into sub-goals"
~packing:options#pack
Wp_parameters.Split.get Wp_parameters.Split.set demon ;
Gtk_form.check ~label:"Trace"
~tooltip:"Keep user labels in proof obligations"
~packing:options#pack
Wp_parameters.Trace.get Wp_parameters.Trace.set demon ;
Gtk_form.check ~label:"Axioms"
~tooltip:"Instanciation of memory-dependent axioms (Experimental)"
~packing:options#pack
Wp_parameters.Axioms.get Wp_parameters.Axioms.set demon ;
let control = GPack.hbox ~packing () in
Gtk_form.button ~label:"Scripts"
~tooltip:"Script file for saving Coq proofs"
~callback:wp_script ~packing:control#pack () ;
Gtk_form.label ~text:"Timeout" ~packing:control#pack () ;
Gtk_form.spinner ~lower:0 ~upper:100000
~tooltip:"Timeout for proving one proof obligation"
~packing:control#pack
Wp_parameters.Timeout.get Wp_parameters.Timeout.set demon ;
Gtk_form.label ~text:"Process" ~packing:control#pack () ;
Gtk_form.spinner ~lower:1 ~upper:32
~tooltip:"Maximum number of parallel running provers"
~packing:control#pack
Wp_parameters.Procs.get Wp_parameters.Procs.set demon ;
let progress = GRange.progress_bar ~packing ~show:false () in
let server = Prover.server () in
let state = ref 0 in
Task.set_callback server
(fun () ->
let n = Task.load server in
if n=0 then
( progress#misc#hide () ; state := 0 )
else
begin
if !state = 0 then progress#misc#show () ;
if n > !state then state := n ;
let r = !state - n in
progress#set_text (Printf.sprintf "%d / %d" r !state) ;
progress#set_fraction ( float r /. float !state ) ;
end) ;
if Wp_parameters.Prover.get () = "none"
then Wp_parameters.Prover.set "alt-ergo" ;
"WP" , vbox#coerce , Some (Gtk_form.refresh demon)