blob: b82d959089d10c171131453d749efec0a1b99758 [file] [log] [blame]
/**CFile****************************************************************
FileName [satProof2.h]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [SAT solver.]
Synopsis [Proof logging.]
Author [Alan Mishchenko <alanmi@eecs.berkeley.edu>]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - January 1, 2004.]
Revision [$Id: satProof2.h,v 1.0 2004/01/01 1:00:00 alanmi Exp $]
***********************************************************************/
#ifndef ABC__sat__bsat__satProof2_h
#define ABC__sat__bsat__satProof2_h
////////////////////////////////////////////////////////////////////////
/// INCLUDES ///
////////////////////////////////////////////////////////////////////////
#include "misc/vec/vec.h"
ABC_NAMESPACE_HEADER_START
////////////////////////////////////////////////////////////////////////
/// PARAMETERS ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// STRUCTURE DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
typedef struct Prf_Man_t_ Prf_Man_t;
struct Prf_Man_t_
{
int iFirst; // first learned clause with proof
int iFirst2; // first learned clause with proof
int nWords; // the number of proof words
word * pInfo; // pointer to the current proof
Vec_Wrd_t * vInfo; // proof information
Vec_Int_t * vSaved; // IDs of saved clauses
Vec_Int_t * vId2Pr; // mapping proof IDs of problem clauses into bitshifts (user's array)
};
////////////////////////////////////////////////////////////////////////
/// GLOBAL VARIABLES ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// MACRO DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
static inline int Prf_BitWordNum( int nWidth ) { return (nWidth >> 6) + ((nWidth & 63) > 0); }
static inline int Prf_ManSize( Prf_Man_t * p ) { return Vec_WrdSize( p->vInfo ) / p->nWords; }
static inline void Prf_ManClearNewInfo( Prf_Man_t * p ) { int w; for ( w = 0; w < p->nWords; w++ ) Vec_WrdPush( p->vInfo, 0 ); }
static inline word * Prf_ManClauseInfo( Prf_Man_t * p, int Id ) { return Vec_WrdEntryP( p->vInfo, Id * p->nWords ); }
////////////////////////////////////////////////////////////////////////
/// FUNCTION DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline Prf_Man_t * Prf_ManAlloc()
{
Prf_Man_t * p;
p = ABC_CALLOC( Prf_Man_t, 1 );
p->iFirst = -1;
p->iFirst2 = -1;
p->vInfo = Vec_WrdAlloc( 1000 );
p->vSaved = Vec_IntAlloc( 1000 );
return p;
}
static inline void Prf_ManStop( Prf_Man_t * p )
{
if ( p == NULL )
return;
Vec_IntFree( p->vSaved );
Vec_WrdFree( p->vInfo );
ABC_FREE( p );
}
static inline void Prf_ManStopP( Prf_Man_t ** p )
{
Prf_ManStop( *p );
*p = NULL;
}
static inline double Prf_ManMemory( Prf_Man_t * p )
{
return Vec_WrdMemory(p->vInfo) + Vec_IntMemory(p->vSaved) + sizeof(Prf_Man_t);
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline void Prf_ManRestart( Prf_Man_t * p, Vec_Int_t * vId2Pr, int iFirst, int nWidth )
{
assert( p->iFirst == -1 );
p->iFirst = iFirst;
p->nWords = Prf_BitWordNum( nWidth );
p->vId2Pr = vId2Pr;
p->pInfo = NULL;
Vec_WrdClear( p->vInfo );
}
static inline void Prf_ManGrow( Prf_Man_t * p, int nWidth )
{
Vec_Wrd_t * vInfoNew;
int i, w, nSize, nWordsNew;
assert( p->iFirst >= 0 );
assert( p->pInfo == NULL );
if ( nWidth < 64 * p->nWords )
return;
// get word count after resizing
nWordsNew = Abc_MaxInt( Prf_BitWordNum(nWidth), 2 * p->nWords );
// remap the entries
nSize = Prf_ManSize( p );
vInfoNew = Vec_WrdAlloc( (nSize + 1000) * nWordsNew );
for ( i = 0; i < nSize; i++ )
{
p->pInfo = Prf_ManClauseInfo( p, i );
for ( w = 0; w < p->nWords; w++ )
Vec_WrdPush( vInfoNew, p->pInfo[w] );
for ( ; w < nWordsNew; w++ )
Vec_WrdPush( vInfoNew, 0 );
}
Vec_WrdFree( p->vInfo );
p->vInfo = vInfoNew;
p->nWords = nWordsNew;
p->pInfo = NULL;
}
static inline void Prf_ManShrink( Prf_Man_t * p, int iClause )
{
assert( p->iFirst >= 0 );
assert( iClause - p->iFirst >= 0 );
assert( iClause - p->iFirst < Prf_ManSize(p) );
Vec_WrdShrink( p->vInfo, (iClause - p->iFirst) * p->nWords );
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline void Prf_ManAddSaved( Prf_Man_t * p, int i, int iNew )
{
assert( p->iFirst >= 0 );
if ( i < p->iFirst )
return;
if ( Vec_IntSize(p->vSaved) == 0 )
{
assert( p->iFirst2 == -1 );
p->iFirst2 = iNew;
}
Vec_IntPush( p->vSaved, i );
}
static inline void Prf_ManCompact( Prf_Man_t * p, int iNew )
{
int i, w, k = 0, Entry, nSize;
assert( p->iFirst >= 0 );
assert( p->pInfo == NULL );
nSize = Prf_ManSize( p );
Vec_IntForEachEntry( p->vSaved, Entry, i )
{
assert( Entry - p->iFirst >= 0 && Entry - p->iFirst < nSize );
p->pInfo = Prf_ManClauseInfo( p, Entry - p->iFirst );
for ( w = 0; w < p->nWords; w++ )
Vec_WrdWriteEntry( p->vInfo, k++, p->pInfo[w] );
}
Vec_WrdShrink( p->vInfo, k );
Vec_IntClear( p->vSaved );
p->pInfo = NULL;
// update first
if ( p->iFirst2 == -1 )
p->iFirst = iNew;
else
p->iFirst = p->iFirst2;
p->iFirst2 = -1;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline void Prf_ManChainResolve( Prf_Man_t * p, clause * c )
{
assert( p->iFirst >= 0 );
assert( p->pInfo != NULL );
// add to proof info
if ( c->lrn ) // learned clause
{
if ( clause_id(c) >= p->iFirst )
{
word * pProofStart;
int w;
assert( clause_id(c) - p->iFirst >= 0 );
assert( clause_id(c) - p->iFirst < Prf_ManSize(p) );
pProofStart = Prf_ManClauseInfo( p, clause_id(c) - p->iFirst );
for ( w = 0; w < p->nWords; w++ )
p->pInfo[w] |= pProofStart[w];
}
}
else // problem clause
{
if ( clause_id(c) >= 0 ) // has proof ID
{
int Entry;
if ( p->vId2Pr == NULL )
Entry = clause_id(c);
else
Entry = Vec_IntEntry( p->vId2Pr, clause_id(c) );
if ( Entry >= 0 )
{
assert( Entry < 64 * p->nWords );
Abc_InfoSetBit( (unsigned *)p->pInfo, Entry );
}
}
}
}
static inline void Prf_ManChainStart( Prf_Man_t * p, clause * c )
{
assert( p->iFirst >= 0 );
// prepare info for new clause
Prf_ManClearNewInfo( p );
// get pointer to the proof
assert( p->pInfo == NULL );
p->pInfo = Prf_ManClauseInfo( p, Prf_ManSize(p)-1 );
// add to proof info
Prf_ManChainResolve( p, c );
}
static inline int Prf_ManChainStop( Prf_Man_t * p )
{
assert( p->pInfo != NULL );
p->pInfo = NULL;
return 0;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline Vec_Int_t * Prf_ManUnsatCore( Prf_Man_t * p )
{
Vec_Int_t * vCore;
int i, Entry;
assert( p->iFirst >= 0 );
assert( p->pInfo == NULL );
assert( Prf_ManSize(p) > 0 );
vCore = Vec_IntAlloc( 64 * p->nWords );
p->pInfo = Prf_ManClauseInfo( p, Prf_ManSize(p)-1 );
if ( p->vId2Pr == NULL )
{
for ( i = 0; i < 64 * p->nWords; i++ )
if ( Abc_InfoHasBit( (unsigned *)p->pInfo, i ) )
Vec_IntPush( vCore, i );
}
else
{
Vec_IntForEachEntry( p->vId2Pr, Entry, i )
{
if ( Entry < 0 )
continue;
assert( Entry < 64 * p->nWords );
if ( Abc_InfoHasBit( (unsigned *)p->pInfo, Entry ) )
Vec_IntPush( vCore, i );
}
}
p->pInfo = NULL;
Vec_IntSort( vCore, 1 );
return vCore;
}
ABC_NAMESPACE_HEADER_END
#endif
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////