diff --git a/src/main/main.ml b/src/main/main.ml index b4fdf611..0d3be230 100644 --- a/src/main/main.ml +++ b/src/main/main.ml @@ -33,6 +33,8 @@ let proof_file = ref "" let proof_store_memory = ref false let proof_store_file = ref "" +let reset_line = "\x1b[2K\r" + (* Arguments parsing *) let int_arg r arg = let l = String.length arg in @@ -149,6 +151,13 @@ let main_smt () : _ result = Process.Solver.create ~proof ~theories tst () () in + let finally() = + if !p_stat then ( + Format.printf "%s%a@." reset_line Solver.pp_stats solver; + ); + in + CCFun.protect ~finally @@ fun () -> + (* FIXME: emit an actual proof *) let proof_file = if !proof_file ="" then None else Some !proof_file in if !check then ( @@ -174,9 +183,6 @@ let main_smt () : _ result = with Exit -> E.return() in - if !p_stat then ( - Format.printf "%a@." Solver.pp_stats solver; - ); res let main_cnf () : _ result = @@ -195,18 +201,21 @@ let main_cnf () : _ result = in let stat = Stat.create () in + + let finally() = + if !p_stat then ( + Fmt.printf "%a@." Stat.pp_all (Stat.all stat); + ); + Proof.close proof; + in + CCFun.protect ~finally @@ fun () -> + let solver = S.SAT.create ~size:`Big ~proof ~stat () in S.Dimacs.parse_file solver !file >>= fun () -> let r = S.solve ~check:!check ?in_memory_proof solver in - (* FIXME: if in memory proof and !proof_file<>"", then dump proof into file now *) - - Proof.close proof; - if !p_stat then ( - Fmt.printf "%a@." Stat.pp_all (Stat.all stat); - ); r let main () = @@ -225,6 +234,14 @@ let main () = let al = Gc.create_alarm check_limits in Util.setup_gc(); let is_cnf = Filename.check_suffix !file ".cnf" in + + let finally() = + if !p_gc_stat then ( + Printf.printf "(gc_stats\n%t)\n" Gc.print_stat; + ) + in + CCFun.protect ~finally @@ fun () -> + let res = if is_cnf then ( main_cnf () @@ -232,9 +249,6 @@ let main () = main_smt () ) in - if !p_gc_stat then ( - Printf.printf "(gc_stats\n%t)\n" Gc.print_stat; - ); Gc.delete_alarm al; res diff --git a/src/smtlib/Process.ml b/src/smtlib/Process.ml index e532a03f..ef33c043 100644 --- a/src/smtlib/Process.ml +++ b/src/smtlib/Process.ml @@ -111,6 +111,8 @@ let check_smt_model (solver:Solver.Sat_solver.t) (hyps:_ Vec.t) (m:Model.t) : un Vec.iter check_c hyps *) +let reset_line = "\x1b[2K\r" + let mk_progress (_s:Solver.t) : _ -> unit = let start = Sys.time() in let n = ref 0 in @@ -124,7 +126,7 @@ let mk_progress (_s:Solver.t) : _ -> unit = (* limit frequency *) if float !n > 6. *. diff then ( let sym = String.get syms (!n mod String.length syms) in - Printf.printf "\r[%.2fs %c]" diff sym; + Printf.printf "%s[%.2fs %c]" reset_line diff sym; n := 0; flush stdout ) @@ -219,7 +221,11 @@ let solve Format.printf "Unsat (%.3f/%.3f/%.3f)@." t1 (t2-.t1) t3; | Solver.Unknown reas -> - Format.printf "Unknown (:reason %a)" Solver.Unknown.pp reas + Format.printf "Unknown (:reason %a)@." Solver.Unknown.pp reas + + | exception exn -> + Printf.printf "%s%!" reset_line; + raise exn end; res