blob: 2b1d716925483039c4029d6213469d4387cd48d8 [file] [log] [blame]
/**CFile****************************************************************
FileName [giaCSat2.c]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [Scalable AIG package.]
Synopsis [Circuit-based SAT solver.]
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [$Id: giaCSat2.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
***********************************************************************/
#include "gia.h"
ABC_NAMESPACE_IMPL_START
////////////////////////////////////////////////////////////////////////
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
typedef struct Tas_Par_t_ Tas_Par_t;
struct Tas_Par_t_
{
// conflict limits
int nBTLimit; // limit on the number of conflicts
// current parameters
int nBTThis; // number of conflicts
int nBTTotal; // total number of conflicts
// decision heuristics
int fUseHighest; // use node with the highest ID
// other parameters
int fVerbose;
};
typedef struct Tas_Sto_t_ Tas_Sto_t;
struct Tas_Sto_t_
{
int iCur; // currently used
int nSize; // allocated size
char * pBuffer; // handles of objects stored in the queue
};
typedef struct Tas_Que_t_ Tas_Que_t;
struct Tas_Que_t_
{
int iHead; // beginning of the queue
int iTail; // end of the queue
int nSize; // allocated size
int * pData; // handles of objects stored in the queue
};
typedef struct Tas_Var_t_ Tas_Var_t;
struct Tas_Var_t_
{
unsigned fTerm : 1; // terminal node
unsigned fVal : 1; // current value
unsigned fValOld : 1; // previous value
unsigned fAssign : 1; // assigned status
unsigned fJQueue : 1; // part of J-frontier
unsigned fCompl0 : 1; // complemented attribute
unsigned fCompl1 : 1; // complemented attribute
unsigned fMark0 : 1; // multi-purpose mark
unsigned fMark1 : 1; // multi-purpose mark
unsigned fPhase : 1; // polarity
unsigned Level : 22; // decision level
int Id; // unique ID of this variable
int IdAig; // original ID of this variable
int Reason0; // reason of this variable
int Reason1; // reason of this variable
int Diff0; // difference for the first fanin
int Diff1; // difference for the second fanin
int Watch0; // handle of first watch
int Watch1; // handle of second watch
};
typedef struct Tas_Cls_t_ Tas_Cls_t;
struct Tas_Cls_t_
{
int Watch0; // next clause to watch
int Watch1; // next clause to watch
int pVars[0]; // variable handles
};
typedef struct Tas_Man_t_ Tas_Man_t;
struct Tas_Man_t_
{
// user data
Gia_Man_t * pAig; // AIG manager
Tas_Par_t Pars; // parameters
// solver data
Tas_Sto_t * pVars; // variables
Tas_Sto_t * pClauses; // clauses
// state representation
Tas_Que_t pProp; // propagation queue
Tas_Que_t pJust; // justification queue
Vec_Int_t * vModel; // satisfying assignment
Vec_Ptr_t * vTemp; // temporary storage
// SAT calls statistics
int nSatUnsat; // the number of proofs
int nSatSat; // the number of failure
int nSatUndec; // the number of timeouts
int nSatTotal; // the number of calls
// conflicts
int nConfUnsat; // conflicts in unsat problems
int nConfSat; // conflicts in sat problems
int nConfUndec; // conflicts in undec problems
int nConfTotal; // total conflicts
// runtime stats
clock_t timeSatUnsat; // unsat
clock_t timeSatSat; // sat
clock_t timeSatUndec; // undecided
clock_t timeTotal; // total runtime
};
static inline int Tas_VarIsAssigned( Tas_Var_t * pVar ) { return pVar->fAssign; }
static inline void Tas_VarAssign( Tas_Var_t * pVar ) { assert(!pVar->fAssign); pVar->fAssign = 1; }
static inline void Tas_VarUnassign( Tas_Var_t * pVar ) { assert(pVar->fAssign); pVar->fAssign = 0; pVar->fVal = 0; }
static inline int Tas_VarValue( Tas_Var_t * pVar ) { assert(pVar->fAssign); return pVar->fVal; }
static inline void Tas_VarSetValue( Tas_Var_t * pVar, int v ) { assert(pVar->fAssign); pVar->fVal = v; }
static inline int Tas_VarIsJust( Tas_Var_t * pVar ) { return Gia_ObjIsAnd(pVar) && !Tas_VarIsAssigned(Gia_ObjFanin0(pVar)) && !Tas_VarIsAssigned(Gia_ObjFanin1(pVar)); }
static inline int Tas_VarFanin0Value( Tas_Var_t * pVar ) { return !Tas_VarIsAssigned(Gia_ObjFanin0(pVar)) ? 2 : (Tas_VarValue(Gia_ObjFanin0(pVar)) ^ Gia_ObjFaninC0(pVar)); }
static inline int Tas_VarFanin1Value( Tas_Var_t * pVar ) { return !Tas_VarIsAssigned(Gia_ObjFanin1(pVar)) ? 2 : (Tas_VarValue(Gia_ObjFanin1(pVar)) ^ Gia_ObjFaninC1(pVar)); }
static inline int Tas_VarDecLevel( Tas_Man_t * p, Tas_Var_t * pVar ) { assert( pVar->Value != ~0 ); return Vec_IntEntry(p->vLevReas, 3*pVar->Value); }
static inline Tas_Var_t * Tas_VarReason0( Tas_Man_t * p, Tas_Var_t * pVar ) { assert( pVar->Value != ~0 ); return pVar + Vec_IntEntry(p->vLevReas, 3*pVar->Value+1); }
static inline Tas_Var_t * Tas_VarReason1( Tas_Man_t * p, Tas_Var_t * pVar ) { assert( pVar->Value != ~0 ); return pVar + Vec_IntEntry(p->vLevReas, 3*pVar->Value+2); }
static inline int Tas_ClauseDecLevel( Tas_Man_t * p, int hClause ) { return Tas_VarDecLevel( p, p->pClauses.pData[hClause] ); }
static inline Tas_Var_t * Tas_ManVar( Tas_Man_t * p, int h ) { return (Tas_Var_t *)(p->pVars->pBuffer + h); }
static inline Tas_Cls_t * Tas_ManClause( Tas_Man_t * p, int h ) { return (Tas_Cls_t *)(p->pClauses->pBuffer + h); }
#define Tas_ClaForEachVar( p, pClause, pVar, i ) \
for ( pVar = Tas_ManVar(p, pClause->pVars[(i=0)]); pClause->pVars[i]; pVar = (Tas_Var_t *)(((char *)pVar + pClause->pVars[++i])) )
#define Tas_QueForEachVar( p, pQue, pVar, i ) \
for ( pVar = Tas_ManVar(p, pQue->pVars[(i=pQue->iHead)]); i < pQue->iTail; pVar = Tas_ManVar(p, pQue->pVars[i++]) )
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Tas_Var_t * Tas_ManCreateVar( Tas_Man_t * p )
{
Tas_Var_t * pVar;
if ( p->pVars->iCur + sizeof(Tas_Var_t) > p->pVars->nSize )
{
p->pVars->nSize *= 2;
p->pVars->pData = ABC_REALLOC( char, p->pVars->pData, p->pVars->nSize );
}
pVar = p->pVars->pData + p->pVars->iCur;
p->pVars->iCur += sizeof(Tas_Var_t);
memset( pVar, 0, sizeof(Tas_Var_t) );
pVar->Id = pVar - ((Tas_Var_t *)p->pVars->pData);
return pVar;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Tas_Var_t * Tas_ManObj2Var( Tas_Man_t * p, Gia_Obj_t * pObj )
{
Tas_Var_t * pVar;
assert( !Gia_ObjIsComplement(pObj) );
if ( pObj->Value == 0 )
{
pVar = Tas_ManCreateVar( p );
pVar->
}
return Tas_ManVar( p, pObj->Value );
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_IMPL_END