packages feed

liquid-fixpoint-0.1.0.0: external/fixpoint/fixpoint.ml

(*
 * Copyright © 2009 The Regents of the University of California. All rights reserved. 
 *
 * Permission is hereby granted, without written agreement and without 
 * license or royalty fees, to use, copy, modify, and distribute this 
 * software and its documentation for any purpose, provided that the 
 * above copyright notice and the following two paragraphs appear in 
 * all copies of this software. 
 * 
 * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY 
 * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 
 * IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY 
 * OF SUCH DAMAGE. 
 * 
 * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, 
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
 * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 
 * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION 
 * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 *
 *)


(** read a set of constraints, solve, and dump out the solution *)

module CX  = Counterexample
module BS  = BNstats
module SM  = Ast.Symbol.SMap
module Co  = Constants 
module C   = FixConstraint
module F   = Format
module T   = Toplevel
module PA  = PredAbs
module SPA = Solve.Make (PA)
module Cg  = FixConfig

module Misc = FixMisc open Misc.Ops

let mydebug = false

(*****************************************************************)
(********************* Hooking into Solver ***********************)
(*****************************************************************)

let print_raw_cs ppf = function
  | [] -> F.fprintf ppf "SAT \n \n \n"
  | cs -> F.fprintf ppf "UNSAT [%s] \n \n \n" (Misc.map_to_string (C.id_of_t <+> string_of_int) cs)

let save_raw fname cs s = 
  Misc.with_out_formatter fname begin fun ppf ->
    F.fprintf ppf "%a \n" print_raw_cs cs; 
    F.fprintf ppf "%a \n" PA.print s;
    F.fprintf ppf "@.";
    F.print_flush ()
  end

let save_crash fname (id, tag, msg) =
  Misc.with_out_formatter fname begin fun ppf ->
    F.fprintf ppf "CRASH %d (%s)\n" id msg;
    F.fprintf ppf "//%a\n" C.print_tag tag;
    F.fprintf ppf "@.";
    F.print_flush ()
  end

let solve ac  = 
  let _         = Co.bprintflush mydebug "Fixpoint: Creating  CI\n" in
  let ctx, s    = BS.time "create" SPA.create ac None in
  let _         = Co.bprintflush mydebug "Fixpoint: Solving \n" in
  let s, cs',_  = BS.time "solve" (SPA.solve ctx) s in
  
  let _         = Co.bprintflush mydebug "Fixpoint: Saving Result \n" in
  let _         = BS.time "save" (save_raw !Co.out_file cs') s in
  let _         = Co.bprintflush mydebug "Fixpoint: Saving Result DONE \n" in
  cs'

let dump_solve ac = 
  try 
    let cs' = solve { ac with Cg.bm = SM.map PA.mkbind ac.Cg.bm } in
    let _   = if Co.ck_olev 1 then BNstats.print stdout "Fixpoint Solver Time \n" in
    match cs' with 
    | [] -> (F.printf "\nSAT\n" ; exit 0)
    | _  -> (F.printf "\nUNSAT\n" ; exit 1)
  with (C.BadConstraint (id, tag, msg)) -> begin
    Format.printf "Fixpoint: Bad Constraint! id = %d (%s) tag = %a \n" 
    id msg C.print_tag tag;
    save_crash !Co.out_file (id, tag, msg); 
  end

(*****************************************************************)
(********************* Generate Imp Program **********************)
(*****************************************************************)

let dump_imp a = 
  (List.map (fun c -> Cg.Cst c) a.Cg.cs ++ List.map (fun c -> Cg.Wfc c) a.Cg.ws)
  |> ToImp.render F.std_formatter
  |> fun _ -> exit 1 

(*****************************************************************)
(***************** Generate Simplified Constraints ***************)
(*****************************************************************)

let hook_simplify_ts = function
  | "andrey" -> List.map Simplification.simplify_t
                <+> List.filter (not <.> Simplification.is_tauto_t)
                <+> Simplification.simplify_ts
  | "jhala"  -> FixSimplify.simplify_ts
  (* put other transforms here *)
  | _        -> id

let simplify_ts cs = hook_simplify_ts !Co.dump_simp cs

let dump_simp ac = 
  let ac = {ac with Cg.cs = simplify_ts ac.Cg.cs; Cg.bm = SM.empty} in
  Misc.with_out_formatter !Co.save_file (fun ppf -> Cg.print ppf ac)

(*
let dump_simp ac = 
  (* let ac    = {ac with Cg.cs = simplify_ts ac.Cg.cs; Cg.bm = SM.empty; Cg.qs = []} in *)
  let ac    = {ac with Cg.cs = simplify_ts ac.Cg.cs; Cg.bm = SM.empty} in
  Misc.with_out_formatter !Co.save_file (fun ppf -> Cg.print ppf ac)

  let ctx,_ = BS.time "create" SPA.create ac None in
  let s0    = PA.empty (* PA.create ac None *) in 
  let _     = BS.time "save" (SPA.save !Co.save_file ctx) s0 in
  exit 1
*)

(*****************************************************************)
(*********************** Main ************************************)
(*****************************************************************)

let usage = "Usage: fixpoint.native <options> [source-files]\noptions are:"

let main () =
  let cfg  = usage |> Toplevel.read_inputs |> snd in 
  if !Co.dump_imp then 
    dump_imp cfg 
  else if !Co.dump_smtlib then
    ToSmtLib.dump_smtlib cfg
  else if !Co.dump_simp <> "" then 
    dump_simp cfg
  else
    dump_solve cfg 



let _ = main ()