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

Module: Bounded Model Checking for ANSI-C

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

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

#ifndef CPROVER_CBMC_SYMEX_BMC_H
#define CPROVER_CBMC_SYMEX_BMC_H

#include <hash_cont.h>
#include <message.h>
#include <goto-symex/goto_symex.h>

class symex_bmct:
  public goto_symext,
  virtual public messaget
{
public:
  symex_bmct(
    const namespacet &_ns,
    contextt &_new_context,
    symex_targett &_target);
  
  friend class bmc_baset;
  friend class cbmc_satt;
  friend class explain_bmct;
  
protected:  
  //
  // overloaded from goto_symext
  //
  virtual void symex(
    const goto_functionst &goto_functions,
    statet &state);

  // for loop unwinding
  virtual bool get_unwind(
    const symex_targett::sourcet &source,
    unsigned unwind);

  virtual bool get_unwind_recursion(
    const irep_idt &identifier,
    unsigned unwind);
    
  virtual void no_body(const irep_idt &identifier);

  unsigned long max_unwind;
  hash_map_cont<irep_idt, long, irep_id_hash> unwind_set;
  
  // To show progress
  irept last_location;
  
  hash_set_cont<irep_idt, irep_id_hash> body_warnings;
};

#endif
