/*******************************************************************\

Module: Counterexample Beautification using Incremental SAT

Author: Daniel Kroening, kroening@cs.cmu.edu

\*******************************************************************/

#ifndef CPROVER_CBMC_COUNTEREXAMPLE_BEAUTIFICATION_GREEDY_H
#define CPROVER_CBMC_COUNTEREXAMPLE_BEAUTIFICATION_GREEDY_H

#include <set>

#include "counterexample_beautification.h"

class counterexample_beautification_greedyt:
  public counterexample_beautificationt
{
public:
  void counterexample_beautification(
    cnf_clause_listt &cnf,
    bv_cbmct &bv_cbmc,
    symex_target_equationt &equation,
    const namespacet &ns);

protected:
  #if 0
  struct beautify_statet
  {
   public:
    beautify_statet():gid(0), last_was_sat(true) { }

    int gid;
    std::list<literalt> constraints;
    bool last_was_sat;

    std::vector<bool> assignment;
  } state;
  
  void counterexample_beautification_guards(
    cnf_clause_listt &cnf,
    bv_cbmct &bv_cbmc,
    symex_target_equationt &equation,        
    const namespacet &ns);

  void counterexample_beautification_values(
    cnf_clause_listt &cnf,
    bv_cbmct &bv_cbmc,
    symex_target_equationt &equation,        
    const namespacet &ns);

  void beautify(
    cnf_clause_listt &cnf,
    bv_cbmct &bv_cbmc,
    const namespacet &ns,
    const exprt &expr,
    const typet &type,
    unsigned offset,
    unsigned bit_nr);
                
  void beautify_try(
    cnf_clause_listt &cnf,
    literalt l,
    bool v);
                    
  unsigned get_max_width(const namespacet &ns, const typet &type);

  symex_target_equationt::statest::const_iterator failed;
  #endif
};

#endif
