/**CFile****************************************************************

  FileName    [AbcGlucose.h]

  SystemName  [ABC: Logic synthesis and verification system.]

  PackageName [SAT solver Glucose 3.0 by Gilles Audemard and Laurent Simon.]

  Synopsis    [Interface to Glucose.]

  Author      [Alan Mishchenko]
  
  Affiliation [UC Berkeley]

  Date        [Ver. 1.0. Started - September 6, 2017.]

  Revision    [$Id: AbcGlucose.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $]

***********************************************************************/

#ifndef ABC_SAT_GLUCOSE_H_
#define ABC_SAT_GLUCOSE_H_

////////////////////////////////////////////////////////////////////////
///                          INCLUDES                                ///
////////////////////////////////////////////////////////////////////////

#include "aig/gia/gia.h"

////////////////////////////////////////////////////////////////////////
///                         PARAMETERS                               ///
////////////////////////////////////////////////////////////////////////

#define GLUCOSE_UNSAT -1
#define GLUCOSE_SAT    1
#define GLUCOSE_UNDEC  0


ABC_NAMESPACE_HEADER_START

////////////////////////////////////////////////////////////////////////
///                         BASIC TYPES                              ///
////////////////////////////////////////////////////////////////////////

typedef struct Glucose2_Pars_ Glucose2_Pars;
struct Glucose2_Pars_ {
    int pre;     // preprocessing
    int verb;    // verbosity
    int cust;    // customizable
    int nConfls; // conflict limit (0 = no limit)
};

static inline Glucose2_Pars Glucose_CreatePars(int p, int v, int c, int nConfls)
{
    Glucose2_Pars pars;
    pars.pre     = p;
    pars.verb    = v;
    pars.cust    = c;
    pars.nConfls = nConfls;
    return pars;
}

typedef void bmcg2_sat_solver;

////////////////////////////////////////////////////////////////////////
///                      MACRO DEFINITIONS                           ///
////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////
///                    FUNCTION DECLARATIONS                         ///
////////////////////////////////////////////////////////////////////////

extern bmcg2_sat_solver * bmcg2_sat_solver_start();
extern void              bmcg2_sat_solver_stop( bmcg2_sat_solver* s );
extern void              bmcg2_sat_solver_reset( bmcg2_sat_solver* s );
extern int               bmcg2_sat_solver_addclause( bmcg2_sat_solver* s, int * plits, int nlits );
extern void              bmcg2_sat_solver_setcallback( bmcg2_sat_solver* s, void * pman, int(*pfunc)(void*, int, int*) );
extern int               bmcg2_sat_solver_solve( bmcg2_sat_solver* s, int * plits, int nlits );
extern int               bmcg2_sat_solver_final( bmcg2_sat_solver* s, int ** ppArray );
extern int               bmcg2_sat_solver_addvar( bmcg2_sat_solver* s );
extern void              bmcg2_sat_solver_set_nvars( bmcg2_sat_solver* s, int nvars );
extern int               bmcg2_sat_solver_eliminate( bmcg2_sat_solver* s, int turn_off_elim );
extern int               bmcg2_sat_solver_var_is_elim( bmcg2_sat_solver* s, int v );
extern void              bmcg2_sat_solver_var_set_frozen( bmcg2_sat_solver* s, int v, int freeze );
extern int               bmcg2_sat_solver_elim_varnum(bmcg2_sat_solver* s);
extern int *             bmcg2_sat_solver_read_cex( bmcg2_sat_solver* s );
extern int               bmcg2_sat_solver_read_cex_varvalue( bmcg2_sat_solver* s, int );
extern void              bmcg2_sat_solver_set_stop( bmcg2_sat_solver* s, int * pstop );
extern abctime           bmcg2_sat_solver_set_runtime_limit( bmcg2_sat_solver* s, abctime Limit );
extern void              bmcg2_sat_solver_set_conflict_budget( bmcg2_sat_solver* s, int Limit );
extern int               bmcg2_sat_solver_varnum( bmcg2_sat_solver* s );
extern int               bmcg2_sat_solver_clausenum( bmcg2_sat_solver* s );
extern int               bmcg2_sat_solver_learntnum( bmcg2_sat_solver* s );
extern int               bmcg2_sat_solver_conflictnum( bmcg2_sat_solver* s );
extern int               bmcg2_sat_solver_minimize_assumptions( bmcg2_sat_solver * s, int * plits, int nlits, int pivot );
extern int               bmcg2_sat_solver_add_and( bmcg2_sat_solver * s, int iVar, int iVar0, int iVar1, int fCompl0, int fCompl1, int fCompl );
extern int               bmcg2_sat_solver_add_xor( bmcg2_sat_solver * s, int iVarA, int iVarB, int iVarC, int fCompl );
extern int               bmcg2_sat_solver_quantify( bmcg2_sat_solver * s[], Gia_Man_t * p, int iLit, int fHash, int(*pFuncCiToKeep)(void *, int), void * pData, Vec_Int_t * vDLits );
extern int               bmcg2_sat_solver_equiv_overlap_check( bmcg2_sat_solver * s, Gia_Man_t * p, int iLit0, int iLit1, int fEquiv );
extern Vec_Str_t *       bmcg2_sat_solver_sop( Gia_Man_t * p, int CubeLimit );
extern int               bmcg2_sat_solver_jftr( bmcg2_sat_solver * s );
extern void              bmcg2_sat_solver_set_jftr( bmcg2_sat_solver * s, int jftr );
extern void              bmcg2_sat_solver_set_var_fanin_lit( bmcg2_sat_solver * s, int var, int lit0, int lit1 );
extern void              bmcg2_sat_solver_start_new_round( bmcg2_sat_solver * s );
extern void              bmcg2_sat_solver_mark_cone( bmcg2_sat_solver * s, int var );

extern void              Glucose2_SolveCnf( char * pFilename, Glucose2_Pars * pPars );
extern int               Glucose2_SolveAig( Gia_Man_t * p, Glucose2_Pars * pPars );

ABC_NAMESPACE_HEADER_END

#endif

////////////////////////////////////////////////////////////////////////
///                       END OF FILE                                ///
////////////////////////////////////////////////////////////////////////

