mirror of https://github.com/YosysHQ/abc.git
Improved memory management of proof-logging and propagated changes.
This commit is contained in:
parent
ce945006e1
commit
f1dba69c57
|
|
@ -1261,6 +1261,10 @@ SOURCE=.\src\sat\bsat\satVec.h
|
|||
|
||||
SOURCE=.\src\sat\bsat\vecRec.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\src\sat\bsat\vecSet.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "proof"
|
||||
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ int Fra_FraigSat( Aig_Man_t * pMan, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimi
|
|||
pMan->pData = Sat_Solver2GetModel( pSat, vCiIds->pArray, vCiIds->nSize );
|
||||
}
|
||||
// free the sat_solver2
|
||||
if ( fVerbose )
|
||||
// if ( fVerbose )
|
||||
Sat_Solver2PrintStats( stdout, pSat );
|
||||
//sat_solver2_store_write( pSat, "trace.cnf" );
|
||||
//sat_solver2_store_free( pSat );
|
||||
|
|
@ -253,7 +253,7 @@ int Fra_FraigSat( Aig_Man_t * pMan, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimi
|
|||
pMan->pData = Sat_SolverGetModel( pSat, vCiIds->pArray, vCiIds->nSize );
|
||||
}
|
||||
// free the sat_solver
|
||||
if ( fVerbose )
|
||||
// if ( fVerbose )
|
||||
Sat_SolverPrintStats( stdout, pSat );
|
||||
//sat_solver_store_write( pSat, "trace.cnf" );
|
||||
//sat_solver_store_free( pSat );
|
||||
|
|
|
|||
|
|
@ -22,18 +22,16 @@
|
|||
#include "src/misc/vec/vec.h"
|
||||
#include "src/aig/aig/aig.h"
|
||||
#include "satTruth.h"
|
||||
#include "vecRec.h"
|
||||
#include "vecSet.h"
|
||||
|
||||
ABC_NAMESPACE_IMPL_START
|
||||
|
||||
|
||||
/*
|
||||
Proof is represented as a vector of integers.
|
||||
The first entry is -1.
|
||||
A resolution record is represented by a handle (an offset in this array).
|
||||
Proof is represented as a vector of records.
|
||||
A resolution record is represented by a handle (an offset in this vector).
|
||||
A resolution record entry is <size><label><ant1><ant2>...<antN>
|
||||
Label is initialized to 0.
|
||||
Root clauses are given by their handles.
|
||||
Label is initialized to 0. Root clauses are given by their handles.
|
||||
They are marked by bitshifting by 2 bits up and setting the LSB to 1
|
||||
*/
|
||||
|
||||
|
|
@ -58,74 +56,31 @@ struct satset_t
|
|||
/// DECLARATIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static inline satset* Proof_NodeRead (Vec_Int_t* p, cla h) { return satset_read( (veci*)p, h ); }
|
||||
//static inline cla Proof_NodeHandle (Vec_Int_t* p, satset* c) { return satset_handle( (veci*)p, c ); }
|
||||
//static inline int Proof_NodeCheck (Vec_Int_t* p, satset* c) { return satset_check( (veci*)p, c ); }
|
||||
static inline int Proof_NodeSize (int nEnts) { return sizeof(satset)/4 + nEnts; }
|
||||
|
||||
static inline satset* Proof_ResolveRead (Vec_Rec_t* p, cla h) { return (satset*)Vec_RecEntryP(p, h); }
|
||||
static inline satset* Proof_ClauseRead ( Vec_Int_t* p, cla h ) { assert( h > 0 ); return satset_read( (veci *)p, h ); }
|
||||
static inline satset* Proof_NodeRead ( Vec_Set_t* p, cla h ) { assert( h > 0 ); return (satset*)Vec_SetEntry( p, h ); }
|
||||
static inline int Proof_NodeWordNum ( int nEnts ) { assert( nEnts > 0 ); return 1 + ((nEnts + 1) >> 1); }
|
||||
|
||||
// iterating through nodes in the proof
|
||||
#define Proof_ForeachNode( p, pNode, h ) \
|
||||
for ( h = 1; (h < Vec_IntSize(p)) && ((pNode) = Proof_NodeRead(p, h)); h += Proof_NodeSize(pNode->nEnts) )
|
||||
#define Proof_ForeachClauseVec( pVec, p, pNode, i ) \
|
||||
for ( i = 0; (i < Vec_IntSize(pVec)) && ((pNode) = Proof_ClauseRead(p, Vec_IntEntry(pVec,i))); i++ )
|
||||
#define Proof_ForeachNodeVec( pVec, p, pNode, i ) \
|
||||
for ( i = 0; (i < Vec_IntSize(pVec)) && ((pNode) = Proof_NodeRead(p, Vec_IntEntry(pVec,i))); i++ )
|
||||
#define Proof_ForeachNodeVec1( pVec, p, pNode, i ) \
|
||||
for ( i = 1; (i < Vec_IntSize(pVec)) && ((pNode) = Proof_NodeRead(p, Vec_IntEntry(pVec,i))); i++ )
|
||||
|
||||
// iterating through fanins of a proof node
|
||||
#define Proof_NodeForeachFanin( p, pNode, pFanin, i ) \
|
||||
for ( i = 0; (i < (int)pNode->nEnts) && (((pFanin) = (pNode->pEnts[i] & 1) ? NULL : Proof_NodeRead(p, pNode->pEnts[i] >> 2)), 1); i++ )
|
||||
#define Proof_NodeForeachFanin( pProof, pNode, pFanin, i ) \
|
||||
for ( i = 0; (i < (int)pNode->nEnts) && (((pFanin) = (pNode->pEnts[i] & 1) ? NULL : Proof_NodeRead(pProof, pNode->pEnts[i] >> 2)), 1); i++ )
|
||||
#define Proof_NodeForeachLeaf( pClauses, pNode, pLeaf, i ) \
|
||||
for ( i = 0; (i < (int)pNode->nEnts) && (((pLeaf) = (pNode->pEnts[i] & 1) ? Proof_NodeRead(pClauses, pNode->pEnts[i] >> 2) : NULL), 1); i++ )
|
||||
#define Proof_NodeForeachFaninLeaf( p, pClauses, pNode, pFanin, i ) \
|
||||
for ( i = 0; (i < (int)pNode->nEnts) && ((pFanin) = (pNode->pEnts[i] & 1) ? Proof_NodeRead(pClauses, pNode->pEnts[i] >> 2) : Proof_NodeRead(p, pNode->pEnts[i] >> 2)); i++ )
|
||||
for ( i = 0; (i < (int)pNode->nEnts) && (((pLeaf) = (pNode->pEnts[i] & 1) ? Proof_ClauseRead(pClauses, pNode->pEnts[i] >> 2) : NULL), 1); i++ )
|
||||
#define Proof_NodeForeachFaninLeaf( pProof, pClauses, pNode, pFanin, i ) \
|
||||
for ( i = 0; (i < (int)pNode->nEnts) && ((pFanin) = (pNode->pEnts[i] & 1) ? Proof_ClauseRead(pClauses, pNode->pEnts[i] >> 2) : Proof_NodeRead(pProof, pNode->pEnts[i] >> 2)); i++ )
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// FUNCTION DEFINITIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Returns the number of proof nodes.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Proof_CountAll( Vec_Int_t * p )
|
||||
{
|
||||
satset * pNode;
|
||||
int hNode, Counter = 0;
|
||||
Proof_ForeachNode( p, pNode, hNode )
|
||||
Counter++;
|
||||
return Counter;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Collects all resolution nodes belonging to the proof.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Vec_Int_t * Proof_CollectAll( Vec_Int_t * p )
|
||||
{
|
||||
Vec_Int_t * vUsed;
|
||||
satset * pNode;
|
||||
int hNode;
|
||||
vUsed = Vec_IntAlloc( 1000 );
|
||||
Proof_ForeachNode( p, pNode, hNode )
|
||||
Vec_IntPush( vUsed, hNode );
|
||||
return vUsed;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Cleans collected resultion nodes belonging to the proof.]
|
||||
|
|
@ -137,7 +92,7 @@ Vec_Int_t * Proof_CollectAll( Vec_Int_t * p )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Proof_CleanCollected( Vec_Int_t * vProof, Vec_Int_t * vUsed )
|
||||
void Proof_CleanCollected( Vec_Set_t * vProof, Vec_Int_t * vUsed )
|
||||
{
|
||||
satset * pNode;
|
||||
int hNode;
|
||||
|
|
@ -147,7 +102,7 @@ void Proof_CleanCollected( Vec_Int_t * vProof, Vec_Int_t * vUsed )
|
|||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Recursively visits useful proof nodes.]
|
||||
Synopsis [Marks useful nodes of the proof.]
|
||||
|
||||
Description []
|
||||
|
||||
|
|
@ -156,7 +111,7 @@ void Proof_CleanCollected( Vec_Int_t * vProof, Vec_Int_t * vUsed )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Proof_CollectUsed_iter( Vec_Int_t * vProof, int hNode, Vec_Int_t * vUsed, Vec_Int_t * vStack )
|
||||
void Proof_CollectUsed_iter( Vec_Set_t * vProof, int hNode, Vec_Int_t * vUsed, Vec_Int_t * vStack )
|
||||
{
|
||||
satset * pNext, * pNode = Proof_NodeRead( vProof, hNode );
|
||||
int i;
|
||||
|
|
@ -198,46 +153,33 @@ void Proof_CollectUsed_iter( Vec_Int_t * vProof, int hNode, Vec_Int_t * vUsed, V
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Vec_Int_t * Proof_CollectUsedIter( Vec_Int_t * vProof, Vec_Int_t * vRoots, int hRoot )
|
||||
Vec_Int_t * Proof_CollectUsedIter( Vec_Set_t * vProof, Vec_Int_t * vRoots, int fSort )
|
||||
{
|
||||
int fVerify = 0;
|
||||
Vec_Int_t * vUsed, * vStack;
|
||||
int clk = clock();
|
||||
int i, Entry, iPrev = 0;
|
||||
assert( (hRoot > 0) ^ (vRoots != NULL) );
|
||||
vUsed = Vec_IntAlloc( 1000 );
|
||||
vStack = Vec_IntAlloc( 1000 );
|
||||
if ( hRoot )
|
||||
Proof_CollectUsed_iter( vProof, hRoot, vUsed, vStack );
|
||||
else
|
||||
{
|
||||
Vec_IntForEachEntry( vRoots, Entry, i )
|
||||
Vec_IntForEachEntry( vRoots, Entry, i )
|
||||
if ( Entry >= 0 )
|
||||
Proof_CollectUsed_iter( vProof, Entry, vUsed, vStack );
|
||||
}
|
||||
Vec_IntFree( vStack );
|
||||
// Abc_PrintTime( 1, "Iterative clause collection time", clock() - clk );
|
||||
|
||||
/*
|
||||
// verify topological order
|
||||
iPrev = 0;
|
||||
Vec_IntForEachEntry( vUsed, Entry, i )
|
||||
{
|
||||
printf( "%d ", Entry - iPrev );
|
||||
iPrev = Entry;
|
||||
}
|
||||
*/
|
||||
clk = clock();
|
||||
// Vec_IntSort( vUsed, 0 );
|
||||
Abc_Sort( Vec_IntArray(vUsed), Vec_IntSize(vUsed) );
|
||||
// Abc_PrintTime( 1, "Postprocessing with sorting time", clock() - clk );
|
||||
|
||||
// verify topological order
|
||||
iPrev = 0;
|
||||
Vec_IntForEachEntry( vUsed, Entry, i )
|
||||
if ( fVerify )
|
||||
{
|
||||
if ( iPrev >= Entry )
|
||||
printf( "Out of topological order!!!\n" );
|
||||
assert( iPrev < Entry );
|
||||
iPrev = Entry;
|
||||
iPrev = 0;
|
||||
Vec_IntForEachEntry( vUsed, Entry, i )
|
||||
{
|
||||
if ( iPrev >= Entry )
|
||||
printf( "Out of topological order!!!\n" );
|
||||
assert( iPrev < Entry );
|
||||
iPrev = Entry;
|
||||
}
|
||||
}
|
||||
return vUsed;
|
||||
}
|
||||
|
|
@ -253,7 +195,7 @@ Vec_Int_t * Proof_CollectUsedIter( Vec_Int_t * vProof, Vec_Int_t * vRoots, int h
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Proof_CollectUsed_rec( Vec_Int_t * vProof, int hNode, Vec_Int_t * vUsed )
|
||||
void Proof_CollectUsed_rec( Vec_Set_t * vProof, int hNode, Vec_Int_t * vUsed )
|
||||
{
|
||||
satset * pNext, * pNode = Proof_NodeRead( vProof, hNode );
|
||||
int i;
|
||||
|
|
@ -277,19 +219,14 @@ void Proof_CollectUsed_rec( Vec_Int_t * vProof, int hNode, Vec_Int_t * vUsed )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Vec_Int_t * Proof_CollectUsedRec( Vec_Int_t * vProof, Vec_Int_t * vRoots, int hRoot )
|
||||
Vec_Int_t * Proof_CollectUsedRec( Vec_Set_t * vProof, Vec_Int_t * vRoots )
|
||||
{
|
||||
Vec_Int_t * vUsed;
|
||||
assert( (hRoot > 0) ^ (vRoots != NULL) );
|
||||
int i, Entry;
|
||||
vUsed = Vec_IntAlloc( 1000 );
|
||||
if ( hRoot )
|
||||
Proof_CollectUsed_rec( vProof, hRoot, vUsed );
|
||||
else
|
||||
{
|
||||
int i, Entry;
|
||||
Vec_IntForEachEntry( vRoots, Entry, i )
|
||||
Vec_IntForEachEntry( vRoots, Entry, i )
|
||||
if ( Entry >= 0 )
|
||||
Proof_CollectUsed_rec( vProof, Entry, vUsed );
|
||||
}
|
||||
return vUsed;
|
||||
}
|
||||
|
||||
|
|
@ -307,7 +244,7 @@ Vec_Int_t * Proof_CollectUsedRec( Vec_Int_t * vProof, Vec_Int_t * vRoots, int hR
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Sat_ProofReduceCheck_rec( Vec_Int_t * vProof, Vec_Int_t * vClauses, satset * pNode, int hClausePivot, Vec_Ptr_t * vVisited )
|
||||
void Sat_ProofReduceCheck_rec( Vec_Set_t * vProof, Vec_Int_t * vClauses, satset * pNode, int hClausePivot, Vec_Ptr_t * vVisited )
|
||||
{
|
||||
satset * pFanin;
|
||||
int k;
|
||||
|
|
@ -323,7 +260,7 @@ void Sat_ProofReduceCheck_rec( Vec_Int_t * vProof, Vec_Int_t * vClauses, satset
|
|||
}
|
||||
void Sat_ProofReduceCheckOne( sat_solver2 * s, int iLearnt, Vec_Ptr_t * vVisited )
|
||||
{
|
||||
Vec_Int_t * vProof = (Vec_Int_t *)&s->proofs;
|
||||
Vec_Set_t * vProof = (Vec_Set_t *)&s->Proofs;
|
||||
Vec_Int_t * vClauses = (Vec_Int_t *)&s->clauses;
|
||||
Vec_Int_t * vRoots = (Vec_Int_t *)&s->claProofs;
|
||||
int hProofNode = Vec_IntEntry( vRoots, iLearnt );
|
||||
|
|
@ -357,26 +294,24 @@ void Sat_ProofReduceCheck( sat_solver2 * s )
|
|||
***********************************************************************/
|
||||
void Sat_ProofReduce( sat_solver2 * s )
|
||||
{
|
||||
Vec_Int_t * vProof = (Vec_Int_t *)&s->proofs;
|
||||
Vec_Set_t * vProof = (Vec_Set_t *)&s->Proofs;
|
||||
Vec_Int_t * vRoots = (Vec_Int_t *)&s->claProofs;
|
||||
Vec_Int_t * vClauses = (Vec_Int_t *)&s->clauses;
|
||||
|
||||
int fVerbose = 0;
|
||||
Vec_Int_t * vUsed;
|
||||
satset * pNode, * pFanin;
|
||||
int i, k, hTemp, hNewHandle = 1, clk = clock();
|
||||
int i, k, hTemp, clk = clock();
|
||||
static int TimeTotal = 0;
|
||||
|
||||
// collect visited nodes
|
||||
vUsed = Proof_CollectUsedIter( vProof, vRoots, 0 );
|
||||
// printf( "The proof uses %d out of %d proof nodes (%.2f %%)\n",
|
||||
// Vec_IntSize(vUsed), Proof_CountAll(vProof),
|
||||
// 100.0 * Vec_IntSize(vUsed) / Proof_CountAll(vProof) );
|
||||
vUsed = Proof_CollectUsedIter( vProof, vRoots, 1 );
|
||||
|
||||
// relabel nodes to use smaller space
|
||||
Vec_SetShrinkS( vProof, 1 );
|
||||
Proof_ForeachNodeVec( vUsed, vProof, pNode, i )
|
||||
{
|
||||
pNode->Id = hNewHandle; hNewHandle += Proof_NodeSize(pNode->nEnts);
|
||||
pNode->Id = Vec_SetAppendS( vProof, 2+pNode->nEnts );
|
||||
Proof_NodeForeachFaninLeaf( vProof, vClauses, pNode, pFanin, k )
|
||||
if ( (pNode->pEnts[k] & 1) == 0 ) // proof node
|
||||
pNode->pEnts[k] = (pFanin->Id << 2) | (pNode->pEnts[k] & 2);
|
||||
|
|
@ -384,26 +319,27 @@ void Sat_ProofReduce( sat_solver2 * s )
|
|||
assert( (int*)pFanin >= Vec_IntArray(vClauses) && (int*)pFanin < Vec_IntArray(vClauses)+Vec_IntSize(vClauses) );
|
||||
}
|
||||
// update roots
|
||||
Proof_ForeachNodeVec( vRoots, vProof, pNode, i )
|
||||
Proof_ForeachNodeVec1( vRoots, vProof, pNode, i )
|
||||
Vec_IntWriteEntry( vRoots, i, pNode->Id );
|
||||
// compact the nodes
|
||||
Proof_ForeachNodeVec( vUsed, vProof, pNode, i )
|
||||
{
|
||||
hTemp = pNode->Id; pNode->Id = 0;
|
||||
memmove( Vec_IntArray(vProof) + hTemp, pNode, sizeof(int)*Proof_NodeSize(pNode->nEnts) );
|
||||
memmove( Vec_SetEntry(vProof, hTemp), pNode, sizeof(word)*Proof_NodeWordNum(pNode->nEnts) );
|
||||
}
|
||||
Vec_SetWriteEntryNum( vProof, Vec_IntSize(vUsed) );
|
||||
Vec_IntFree( vUsed );
|
||||
|
||||
// report the result
|
||||
if ( fVerbose )
|
||||
{
|
||||
printf( "The proof was reduced from %10d to %10d integers (by %6.2f %%) ",
|
||||
Vec_IntSize(vProof), hNewHandle, 100.0 * (Vec_IntSize(vProof) - hNewHandle) / Vec_IntSize(vProof) );
|
||||
printf( "The proof was reduced from %6.2f Mb to %6.2f Mb (by %6.2f %%) ",
|
||||
1.0 * Vec_SetMemory(vProof) / (1<<20), 1.0 * Vec_SetMemoryS(vProof) / (1<<20),
|
||||
100.0 * (Vec_SetMemory(vProof) - Vec_SetMemoryS(vProof)) / Vec_SetMemory(vProof) );
|
||||
TimeTotal += clock() - clk;
|
||||
Abc_PrintTime( 1, "Time", TimeTotal );
|
||||
}
|
||||
Vec_IntShrink( vProof, hNewHandle );
|
||||
|
||||
Vec_SetShrink( vProof, Vec_SetHandCurrentS(vProof) );
|
||||
Sat_ProofReduceCheck( s );
|
||||
}
|
||||
|
||||
|
|
@ -419,7 +355,7 @@ void Sat_ProofReduce( sat_solver2 * s )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Sat_ProofCheckResolveOne( Vec_Rec_t * p, satset * c1, satset * c2, Vec_Int_t * vTemp )
|
||||
int Sat_ProofCheckResolveOne( Vec_Set_t * p, satset * c1, satset * c2, Vec_Int_t * vTemp )
|
||||
{
|
||||
satset * c;
|
||||
int h, i, k, Var = -1, Count = 0;
|
||||
|
|
@ -452,9 +388,9 @@ int Sat_ProofCheckResolveOne( Vec_Rec_t * p, satset * c1, satset * c2, Vec_Int_t
|
|||
if ( (c2->pEnts[i] >> 1) != Var )
|
||||
Vec_IntPushUnique( vTemp, c2->pEnts[i] );
|
||||
// create new resolution entry
|
||||
h = Vec_RecPush( p, Vec_IntArray(vTemp), Vec_IntSize(vTemp) );
|
||||
h = Vec_SetAppend( p, Vec_IntArray(vTemp), Vec_IntSize(vTemp) );
|
||||
// return the new entry
|
||||
c = Proof_ResolveRead( p, h );
|
||||
c = Proof_NodeRead( p, h );
|
||||
c->nEnts = Vec_IntSize(vTemp)-2;
|
||||
return h;
|
||||
}
|
||||
|
|
@ -470,15 +406,15 @@ int Sat_ProofCheckResolveOne( Vec_Rec_t * p, satset * c1, satset * c2, Vec_Int_t
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
satset * Sat_ProofCheckReadOne( Vec_Int_t * vClauses, Vec_Int_t * vProof, Vec_Rec_t * vResolves, int iAnt )
|
||||
satset * Sat_ProofCheckReadOne( Vec_Int_t * vClauses, Vec_Set_t * vProof, Vec_Set_t * vResolves, int iAnt )
|
||||
{
|
||||
satset * pAnt;
|
||||
if ( iAnt & 1 )
|
||||
return Proof_NodeRead( vClauses, iAnt >> 2 );
|
||||
return Proof_ClauseRead( vClauses, iAnt >> 2 );
|
||||
assert( iAnt > 0 );
|
||||
pAnt = Proof_NodeRead( vProof, iAnt >> 2 );
|
||||
assert( pAnt->Id > 0 );
|
||||
return Proof_ResolveRead( vResolves, pAnt->Id );
|
||||
return Proof_NodeRead( vResolves, pAnt->Id );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -495,24 +431,21 @@ satset * Sat_ProofCheckReadOne( Vec_Int_t * vClauses, Vec_Int_t * vProof, Vec_Re
|
|||
void Sat_ProofCheck( sat_solver2 * s )
|
||||
{
|
||||
Vec_Int_t * vClauses = (Vec_Int_t *)&s->clauses;
|
||||
Vec_Int_t * vProof = (Vec_Int_t *)&s->proofs;
|
||||
Vec_Rec_t * vResolves;
|
||||
Vec_Set_t * vProof = (Vec_Set_t *)&s->Proofs;
|
||||
Vec_Int_t Roots = { 1, 1, &s->hProofLast }, * vRoots = &Roots;
|
||||
Vec_Set_t * vResolves;
|
||||
Vec_Int_t * vUsed, * vTemp;
|
||||
satset * pSet, * pSet0, * pSet1;
|
||||
int i, k, hRoot, Handle, Counter = 0, clk = clock();
|
||||
// if ( s->hLearntLast < 0 )
|
||||
// return;
|
||||
// hRoot = veci_begin(&s->claProofs)[satset_read(&s->learnts, s->hLearntLast>>1)->Id];
|
||||
hRoot = s->hProofLast;
|
||||
if ( hRoot == -1 )
|
||||
return;
|
||||
|
||||
// collect visited clauses
|
||||
vUsed = Proof_CollectUsedIter( vProof, NULL, hRoot );
|
||||
vUsed = Proof_CollectUsedIter( vProof, vRoots, 1 );
|
||||
Proof_CleanCollected( vProof, vUsed );
|
||||
// perform resolution steps
|
||||
vTemp = Vec_IntAlloc( 1000 );
|
||||
vResolves = Vec_RecAlloc();
|
||||
vResolves = Vec_SetAlloc();
|
||||
Proof_ForeachNodeVec( vUsed, vProof, pSet, i )
|
||||
{
|
||||
pSet0 = Sat_ProofCheckReadOne( vClauses, vProof, vResolves, pSet->pEnts[0] );
|
||||
|
|
@ -520,25 +453,23 @@ void Sat_ProofCheck( sat_solver2 * s )
|
|||
{
|
||||
pSet1 = Sat_ProofCheckReadOne( vClauses, vProof, vResolves, pSet->pEnts[k] );
|
||||
Handle = Sat_ProofCheckResolveOne( vResolves, pSet0, pSet1, vTemp );
|
||||
pSet0 = Proof_ResolveRead( vResolves, Handle );
|
||||
pSet0 = Proof_NodeRead( vResolves, Handle );
|
||||
}
|
||||
pSet->Id = Handle;
|
||||
//printf( "Clause for proof %d: ", Vec_IntEntry(vUsed, i) );
|
||||
//satset_print( pSet0 );
|
||||
Counter++;
|
||||
}
|
||||
Vec_IntFree( vTemp );
|
||||
// clean the proof
|
||||
Proof_CleanCollected( vProof, vUsed );
|
||||
// compare the final clause
|
||||
printf( "Used %6.2f Mb for resolvents.\n", 4.0 * Vec_RecSize(vResolves) / (1<<20) );
|
||||
printf( "Used %6.2f Mb for resolvents.\n", 1.0 * Vec_SetMemory(vResolves) / (1<<20) );
|
||||
if ( pSet0->nEnts > 0 )
|
||||
printf( "Derived clause with %d lits instead of the empty clause. ", pSet0->nEnts );
|
||||
else
|
||||
printf( "Proof verification successful. " );
|
||||
Abc_PrintTime( 1, "Time", clock() - clk );
|
||||
// cleanup
|
||||
Vec_RecFree( vResolves );
|
||||
Vec_SetFree( vResolves );
|
||||
Vec_IntFree( vUsed );
|
||||
}
|
||||
|
||||
|
|
@ -554,7 +485,7 @@ void Sat_ProofCheck( sat_solver2 * s )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Vec_Int_t * Sat_ProofCollectCore( Vec_Int_t * vClauses, Vec_Int_t * vProof, Vec_Int_t * vUsed, int fUseIds )
|
||||
Vec_Int_t * Sat_ProofCollectCore( Vec_Int_t * vClauses, Vec_Set_t * vProof, Vec_Int_t * vUsed, int fUseIds )
|
||||
{
|
||||
Vec_Int_t * vCore;
|
||||
satset * pNode, * pFanin;
|
||||
|
|
@ -571,12 +502,11 @@ Vec_Int_t * Sat_ProofCollectCore( Vec_Int_t * vClauses, Vec_Int_t * vProof, Vec_
|
|||
}
|
||||
}
|
||||
// clean core clauses and reexpress core in terms of clause IDs
|
||||
Proof_ForeachNodeVec( vCore, vClauses, pNode, i )
|
||||
Proof_ForeachClauseVec( vCore, vClauses, pNode, i )
|
||||
{
|
||||
assert( (int*)pNode < Vec_IntArray(vClauses)+Vec_IntSize(vClauses) );
|
||||
pNode->mark = 0;
|
||||
if ( fUseIds )
|
||||
// Vec_IntWriteEntry( vCore, i, pNode->Id - 1 );
|
||||
Vec_IntWriteEntry( vCore, i, pNode->Id );
|
||||
}
|
||||
return vCore;
|
||||
|
|
@ -644,8 +574,9 @@ void Sat_ProofInterpolantCheckVars( sat_solver2 * s, Vec_Int_t * vGloVars )
|
|||
void * Sat_ProofInterpolant( sat_solver2 * s, void * pGloVars )
|
||||
{
|
||||
Vec_Int_t * vClauses = (Vec_Int_t *)&s->clauses;
|
||||
Vec_Int_t * vProof = (Vec_Int_t *)&s->proofs;
|
||||
Vec_Set_t * vProof = (Vec_Set_t *)&s->Proofs;
|
||||
Vec_Int_t * vGlobVars = (Vec_Int_t *)pGloVars;
|
||||
Vec_Int_t Roots = { 1, 1, &s->hProofLast }, * vRoots = &Roots;
|
||||
Vec_Int_t * vUsed, * vCore, * vCoreNums, * vVarMap;
|
||||
satset * pNode, * pFanin;
|
||||
Aig_Man_t * pAig;
|
||||
|
|
@ -661,7 +592,7 @@ void * Sat_ProofInterpolant( sat_solver2 * s, void * pGloVars )
|
|||
Sat_ProofInterpolantCheckVars( s, vGlobVars );
|
||||
|
||||
// collect visited nodes
|
||||
vUsed = Proof_CollectUsedIter( vProof, NULL, hRoot );
|
||||
vUsed = Proof_CollectUsedIter( vProof, vRoots, 1 );
|
||||
// collect core clauses (cleans vUsed and vCore)
|
||||
vCore = Sat_ProofCollectCore( vClauses, vProof, vUsed, 0 );
|
||||
|
||||
|
|
@ -678,7 +609,7 @@ void * Sat_ProofInterpolant( sat_solver2 * s, void * pGloVars )
|
|||
|
||||
// copy the numbers out and derive interpol for clause
|
||||
vCoreNums = Vec_IntAlloc( Vec_IntSize(vCore) );
|
||||
Proof_ForeachNodeVec( vCore, vClauses, pNode, i )
|
||||
Proof_ForeachClauseVec( vCore, vClauses, pNode, i )
|
||||
{
|
||||
if ( pNode->partA )
|
||||
{
|
||||
|
|
@ -719,7 +650,7 @@ void * Sat_ProofInterpolant( sat_solver2 * s, void * pGloVars )
|
|||
Aig_ManCleanup( pAig );
|
||||
|
||||
// move the results back
|
||||
Proof_ForeachNodeVec( vCore, vClauses, pNode, i )
|
||||
Proof_ForeachClauseVec( vCore, vClauses, pNode, i )
|
||||
pNode->Id = Vec_IntEntry( vCoreNums, i );
|
||||
Proof_ForeachNodeVec( vUsed, vProof, pNode, i )
|
||||
pNode->Id = 0;
|
||||
|
|
@ -745,8 +676,9 @@ void * Sat_ProofInterpolant( sat_solver2 * s, void * pGloVars )
|
|||
word * Sat_ProofInterpolantTruth( sat_solver2 * s, void * pGloVars )
|
||||
{
|
||||
Vec_Int_t * vClauses = (Vec_Int_t *)&s->clauses;
|
||||
Vec_Int_t * vProof = (Vec_Int_t *)&s->proofs;
|
||||
Vec_Set_t * vProof = (Vec_Set_t *)&s->Proofs;
|
||||
Vec_Int_t * vGlobVars = (Vec_Int_t *)pGloVars;
|
||||
Vec_Int_t Roots = { 1, 1, &s->hProofLast }, * vRoots = &Roots;
|
||||
Vec_Int_t * vUsed, * vCore, * vCoreNums, * vVarMap;
|
||||
satset * pNode, * pFanin;
|
||||
Tru_Man_t * pTru;
|
||||
|
|
@ -755,9 +687,6 @@ word * Sat_ProofInterpolantTruth( sat_solver2 * s, void * pGloVars )
|
|||
word * pRes = ABC_ALLOC( word, nWords );
|
||||
int i, k, iVar, Lit, Entry, hRoot;
|
||||
assert( nVars > 0 && nVars <= 16 );
|
||||
// if ( s->hLearntLast < 0 )
|
||||
// return NULL;
|
||||
// hRoot = veci_begin(&s->claProofs)[satset_read(&s->learnts, s->hLearntLast>>1)->Id];
|
||||
hRoot = s->hProofLast;
|
||||
if ( hRoot == -1 )
|
||||
return NULL;
|
||||
|
|
@ -765,7 +694,7 @@ word * Sat_ProofInterpolantTruth( sat_solver2 * s, void * pGloVars )
|
|||
Sat_ProofInterpolantCheckVars( s, vGlobVars );
|
||||
|
||||
// collect visited nodes
|
||||
vUsed = Proof_CollectUsedIter( vProof, NULL, hRoot );
|
||||
vUsed = Proof_CollectUsedIter( vProof, vRoots, 1 );
|
||||
// collect core clauses (cleans vUsed and vCore)
|
||||
vCore = Sat_ProofCollectCore( vClauses, vProof, vUsed, 0 );
|
||||
|
||||
|
|
@ -779,7 +708,7 @@ word * Sat_ProofInterpolantTruth( sat_solver2 * s, void * pGloVars )
|
|||
|
||||
// copy the numbers out and derive interpol for clause
|
||||
vCoreNums = Vec_IntAlloc( Vec_IntSize(vCore) );
|
||||
Proof_ForeachNodeVec( vCore, vClauses, pNode, i )
|
||||
Proof_ForeachClauseVec( vCore, vClauses, pNode, i )
|
||||
{
|
||||
if ( pNode->partA )
|
||||
{
|
||||
|
|
@ -808,7 +737,7 @@ word * Sat_ProofInterpolantTruth( sat_solver2 * s, void * pGloVars )
|
|||
Proof_NodeForeachFaninLeaf( vProof, vClauses, pNode, pFanin, k )
|
||||
{
|
||||
// assert( pFanin->Id < 2*Aig_ManObjNumMax(pAig) );
|
||||
assert( pFanin->Id <= Tru_ManHandleMax(pTru) );
|
||||
// assert( pFanin->Id <= Tru_ManHandleMax(pTru) );
|
||||
if ( k == 0 )
|
||||
// pObj = Aig_ObjFromLit( pAig, pFanin->Id );
|
||||
pRes = Tru_ManCopyNotCond( pRes, Tru_ManFunc(pTru, pFanin->Id & ~1), nWords, pFanin->Id & 1 );
|
||||
|
|
@ -829,7 +758,7 @@ word * Sat_ProofInterpolantTruth( sat_solver2 * s, void * pGloVars )
|
|||
// Aig_ManCleanup( pAig );
|
||||
|
||||
// move the results back
|
||||
Proof_ForeachNodeVec( vCore, vClauses, pNode, i )
|
||||
Proof_ForeachClauseVec( vCore, vClauses, pNode, i )
|
||||
pNode->Id = Vec_IntEntry( vCoreNums, i );
|
||||
Proof_ForeachNodeVec( vUsed, vProof, pNode, i )
|
||||
pNode->Id = 0;
|
||||
|
|
@ -856,18 +785,15 @@ word * Sat_ProofInterpolantTruth( sat_solver2 * s, void * pGloVars )
|
|||
void * Sat_ProofCore( sat_solver2 * s )
|
||||
{
|
||||
Vec_Int_t * vClauses = (Vec_Int_t *)&s->clauses;
|
||||
Vec_Int_t * vProof = (Vec_Int_t *)&s->proofs;
|
||||
Vec_Set_t * vProof = (Vec_Set_t *)&s->Proofs;
|
||||
Vec_Int_t Roots = { 1, 1, &s->hProofLast }, * vRoots = &Roots;
|
||||
Vec_Int_t * vCore, * vUsed;
|
||||
int hRoot;
|
||||
// if ( s->hLearntLast < 0 )
|
||||
// return NULL;
|
||||
// hRoot = veci_begin(&s->claProofs)[satset_read(&s->learnts, s->hLearntLast>>1)->Id];
|
||||
hRoot = s->hProofLast;
|
||||
if ( hRoot == -1 )
|
||||
return NULL;
|
||||
|
||||
// collect visited clauses
|
||||
vUsed = Proof_CollectUsedIter( vProof, NULL, hRoot );
|
||||
vUsed = Proof_CollectUsedIter( vProof, vRoots, 0 );
|
||||
// collect core clauses
|
||||
vCore = Sat_ProofCollectCore( vClauses, vProof, vUsed, 1 );
|
||||
Vec_IntFree( vUsed );
|
||||
|
|
|
|||
|
|
@ -70,11 +70,6 @@ static inline int irand(double* seed, int size) {
|
|||
return (int)(drand(seed) * size); }
|
||||
|
||||
|
||||
//=================================================================================================
|
||||
// Predeclarations:
|
||||
|
||||
static void sat_solver_sort(void** array, int size, int(*comp)(const void *, const void *));
|
||||
|
||||
//=================================================================================================
|
||||
// Variable datatype + minor functions:
|
||||
|
||||
|
|
@ -90,12 +85,12 @@ struct varinfo_t
|
|||
unsigned lev : 28; // variable level
|
||||
};
|
||||
|
||||
static inline int var_level (sat_solver* s, int v) { return s->levels[v]; }
|
||||
static inline int var_value (sat_solver* s, int v) { return s->assigns[v]; }
|
||||
static inline int var_level (sat_solver* s, int v) { return s->levels[v]; }
|
||||
static inline int var_value (sat_solver* s, int v) { return s->assigns[v]; }
|
||||
static inline int var_polar (sat_solver* s, int v) { return s->polarity[v]; }
|
||||
|
||||
static inline void var_set_level (sat_solver* s, int v, int lev) { s->levels[v] = lev; }
|
||||
static inline void var_set_value (sat_solver* s, int v, int val) { s->assigns[v] = val; }
|
||||
static inline void var_set_level (sat_solver* s, int v, int lev) { s->levels[v] = lev; }
|
||||
static inline void var_set_value (sat_solver* s, int v, int val) { s->assigns[v] = val; }
|
||||
static inline void var_set_polar (sat_solver* s, int v, int pol) { s->polarity[v] = pol; }
|
||||
|
||||
// variable tags
|
||||
|
|
@ -130,7 +125,7 @@ int sat_solver_get_var_value(sat_solver* s, int v)
|
|||
assert( 0 );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//=================================================================================================
|
||||
// Clause datatype + minor functions:
|
||||
|
||||
|
|
@ -140,6 +135,8 @@ struct clause_t
|
|||
lit lits[0];
|
||||
};
|
||||
|
||||
static inline clause* clause_read (sat_solver* s, int h) { return (clause *)Vec_SetEntry(&s->Mem, h>>1); }
|
||||
|
||||
static inline int clause_nlits (clause* c) { return c->size_learnt >> 1; }
|
||||
static inline lit* clause_begin (clause* c) { return c->lits; }
|
||||
static inline int clause_learnt (clause* c) { return c->size_learnt & 1; }
|
||||
|
|
@ -155,21 +152,18 @@ static inline void clause_print (clause* c) {
|
|||
printf( "}\n" );
|
||||
}
|
||||
|
||||
static inline clause* clause_read( sat_solver* s, int h ) { return (clause *)Vec_RecEntryP(&s->Mem, h); }
|
||||
static inline int clause_size( int nLits, int fLearnt ) { int a = nLits + fLearnt + 1; return a + (a & 1); }
|
||||
|
||||
//=================================================================================================
|
||||
// Encode literals in clause pointers:
|
||||
|
||||
static inline int clause_from_lit (lit l) { return l + l + 1; }
|
||||
static inline int clause_is_lit (int h) { return (h & 1); }
|
||||
static inline lit clause_read_lit (int h) { return (lit)(h >> 1); }
|
||||
static inline int clause_from_lit (lit l) { return l + l + 1; }
|
||||
static inline int clause_is_lit (int h) { return (h & 1); }
|
||||
static inline lit clause_read_lit (int h) { return (lit)(h >> 1); }
|
||||
|
||||
//=================================================================================================
|
||||
// Simple helpers:
|
||||
|
||||
static inline int sat_solver_dl(sat_solver* s) { return veci_size(&s->trail_lim); }
|
||||
static inline veci* sat_solver_read_wlist(sat_solver* s, lit l) { return &s->wlists[l]; }
|
||||
static inline int sat_solver_dl(sat_solver* s) { return veci_size(&s->trail_lim); }
|
||||
static inline veci* sat_solver_read_wlist(sat_solver* s, lit l) { return &s->wlists[l]; }
|
||||
|
||||
//=================================================================================================
|
||||
// Variable order functions:
|
||||
|
|
@ -418,15 +412,6 @@ static void sortrnd(void** array, int size, int(*comp)(const void *, const void
|
|||
}
|
||||
}
|
||||
|
||||
void sat_solver_sort(void** array, int size, int(*comp)(const void *, const void *))
|
||||
{
|
||||
// int i;
|
||||
double seed = 91648253;
|
||||
sortrnd(array,size,comp,&seed);
|
||||
// for ( i = 1; i < size; i++ )
|
||||
// assert(comp(array[i-1], array[i])<0);
|
||||
}
|
||||
|
||||
//=================================================================================================
|
||||
// Clause functions:
|
||||
|
||||
|
|
@ -451,9 +436,9 @@ static int clause_create_new(sat_solver* s, lit* begin, lit* end, int learnt)
|
|||
}
|
||||
|
||||
// create new clause
|
||||
h = Vec_RecAppend( &s->Mem, clause_size(size, learnt) );
|
||||
c = clause_read( s, h );
|
||||
h = Vec_SetAppend( &s->Mem, NULL, size + learnt + 1 ) << 1;
|
||||
assert( !(h & 1) );
|
||||
c = clause_read( s, h );
|
||||
if ( s->hLearnts == -1 && learnt )
|
||||
s->hLearnts = h;
|
||||
c->size_learnt = (size << 1) | learnt;
|
||||
|
|
@ -927,9 +912,9 @@ sat_solver* sat_solver_new(void)
|
|||
{
|
||||
sat_solver* s = (sat_solver*)ABC_CALLOC( char, sizeof(sat_solver));
|
||||
|
||||
Vec_RecAlloc_(&s->Mem);
|
||||
Vec_SetAlloc_(&s->Mem);
|
||||
s->hLearnts = -1;
|
||||
s->hBinary = Vec_RecAppend( &s->Mem, clause_size(2, 0) );
|
||||
s->hBinary = Vec_SetAppend( &s->Mem, NULL, 3 ) << 1;
|
||||
s->binary = clause_read( s, s->hBinary );
|
||||
s->binary->size_learnt = (2 << 1);
|
||||
|
||||
|
|
@ -1049,7 +1034,7 @@ void sat_solver_setnvars(sat_solver* s,int n)
|
|||
|
||||
void sat_solver_delete(sat_solver* s)
|
||||
{
|
||||
Vec_RecFree_( &s->Mem );
|
||||
Vec_SetFree_( &s->Mem );
|
||||
|
||||
// delete vectors
|
||||
veci_delete(&s->order);
|
||||
|
|
@ -1087,10 +1072,10 @@ void sat_solver_delete(sat_solver* s)
|
|||
void sat_solver_rollback( sat_solver* s )
|
||||
{
|
||||
int i;
|
||||
Vec_RecRestart( &s->Mem );
|
||||
Vec_SetRestart( &s->Mem );
|
||||
|
||||
s->hLearnts = -1;
|
||||
s->hBinary = Vec_RecAppend( &s->Mem, clause_size(2, 0) );
|
||||
s->hBinary = Vec_SetAppend( &s->Mem, NULL, 3 ) << 1;
|
||||
s->binary = clause_read( s, s->hBinary );
|
||||
s->binary->size_learnt = (2 << 1);
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWA
|
|||
#include <assert.h>
|
||||
|
||||
#include "satVec.h"
|
||||
#include "vecRec.h"
|
||||
#include "vecSet.h"
|
||||
|
||||
ABC_NAMESPACE_HEADER_START
|
||||
|
||||
|
|
@ -92,7 +92,7 @@ struct sat_solver_t
|
|||
int qtail; // Tail index of queue.
|
||||
|
||||
// clauses
|
||||
Vec_Rec_t Mem;
|
||||
Vec_Set_t Mem;
|
||||
int hLearnts; // the first learnt clause
|
||||
int hBinary; // the special binary clause
|
||||
clause * binary;
|
||||
|
|
|
|||
|
|
@ -172,10 +172,12 @@ static inline void proof_chain_start( sat_solver2* s, satset* c )
|
|||
{
|
||||
if ( s->fProofLogging )
|
||||
{
|
||||
s->iStartChain = veci_size(&s->proofs);
|
||||
veci_push(&s->proofs, 0);
|
||||
veci_push(&s->proofs, 0);
|
||||
veci_push(&s->proofs, clause_proofid(s, c, 0) );
|
||||
int ProofId = clause_proofid(s, c, 0);
|
||||
assert( ProofId > 0 );
|
||||
veci_resize( &s->temp_proof, 0 );
|
||||
veci_push( &s->temp_proof, 0 );
|
||||
veci_push( &s->temp_proof, 0 );
|
||||
veci_push( &s->temp_proof, ProofId );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -183,12 +185,10 @@ static inline void proof_chain_resolve( sat_solver2* s, satset* cls, int Var )
|
|||
{
|
||||
if ( s->fProofLogging )
|
||||
{
|
||||
// int CapOld = (&s->proofs)->cap;
|
||||
satset* c = cls ? cls : var_unit_clause( s, Var );
|
||||
veci_push(&s->proofs, clause_proofid(s, c, var_is_partA(s,Var)) );
|
||||
// printf( "%d %d ", clause_proofid(s, c), Var );
|
||||
// if ( (&s->proofs)->cap > CapOld )
|
||||
// printf( "Resized proof from %d to %d.\n", CapOld, (&s->proofs)->cap );
|
||||
int ProofId = clause_proofid(s, c, var_is_partA(s,Var));
|
||||
assert( ProofId > 0 );
|
||||
veci_push( &s->temp_proof, ProofId );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -196,12 +196,10 @@ static inline int proof_chain_stop( sat_solver2* s )
|
|||
{
|
||||
if ( s->fProofLogging )
|
||||
{
|
||||
int RetValue = s->iStartChain;
|
||||
satset* c = (satset*)(veci_begin(&s->proofs) + s->iStartChain);
|
||||
assert( s->iStartChain > 0 && s->iStartChain < veci_size(&s->proofs) );
|
||||
c->nEnts = veci_size(&s->proofs) - s->iStartChain - 2;
|
||||
s->iStartChain = 0;
|
||||
return RetValue;
|
||||
int h = Vec_SetAppend( &s->Proofs, veci_begin(&s->temp_proof), veci_size(&s->temp_proof) );
|
||||
satset * c = (satset *)Vec_SetEntry( &s->Proofs, h );
|
||||
c->nEnts = veci_size(&s->temp_proof) - 2;
|
||||
return h;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1119,20 +1117,6 @@ sat_solver2* sat_solver2_new(void)
|
|||
{
|
||||
sat_solver2* s = (sat_solver2 *)ABC_CALLOC( char, sizeof(sat_solver2) );
|
||||
|
||||
// initialize vectors
|
||||
veci_new(&s->order);
|
||||
veci_new(&s->trail_lim);
|
||||
veci_new(&s->tagged);
|
||||
veci_new(&s->stack);
|
||||
veci_new(&s->temp_clause);
|
||||
veci_new(&s->conf_final);
|
||||
veci_new(&s->mark_levels);
|
||||
veci_new(&s->min_lit_order);
|
||||
veci_new(&s->min_step_order);
|
||||
veci_new(&s->learnt_live);
|
||||
veci_new(&s->claActs); veci_push(&s->claActs, -1);
|
||||
veci_new(&s->claProofs); veci_push(&s->claProofs, -1);
|
||||
|
||||
#ifdef USE_FLOAT_ACTIVITY2
|
||||
s->var_inc = 1;
|
||||
s->cla_inc = 1;
|
||||
|
|
@ -1156,6 +1140,23 @@ sat_solver2* sat_solver2_new(void)
|
|||
s->nLearntMax = 0;
|
||||
s->fVerbose = 0;
|
||||
|
||||
// initialize vectors
|
||||
veci_new(&s->order);
|
||||
veci_new(&s->trail_lim);
|
||||
veci_new(&s->tagged);
|
||||
veci_new(&s->stack);
|
||||
veci_new(&s->temp_clause);
|
||||
veci_new(&s->temp_proof);
|
||||
veci_new(&s->conf_final);
|
||||
veci_new(&s->mark_levels);
|
||||
veci_new(&s->min_lit_order);
|
||||
veci_new(&s->min_step_order);
|
||||
veci_new(&s->learnt_live);
|
||||
veci_new(&s->claActs); veci_push(&s->claActs, -1);
|
||||
veci_new(&s->claProofs); veci_push(&s->claProofs, -1);
|
||||
if ( s->fProofLogging )
|
||||
Vec_SetAlloc_( &s->Proofs );
|
||||
|
||||
// prealloc clause
|
||||
assert( !s->clauses.ptr );
|
||||
s->clauses.cap = (1 << 20);
|
||||
|
|
@ -1166,21 +1167,17 @@ sat_solver2* sat_solver2_new(void)
|
|||
s->learnts.cap = (1 << 20);
|
||||
s->learnts.ptr = ABC_ALLOC( int, s->learnts.cap );
|
||||
veci_push(&s->learnts, -1);
|
||||
// prealloc proofs
|
||||
if ( s->fProofLogging )
|
||||
{
|
||||
assert( !s->proofs.ptr );
|
||||
s->proofs.cap = (1 << 20);
|
||||
s->proofs.ptr = ABC_ALLOC( int, s->proofs.cap );
|
||||
veci_push(&s->proofs, -1);
|
||||
}
|
||||
|
||||
// initialize clause pointers
|
||||
s->hLearntLast = -1; // the last learnt clause
|
||||
s->hProofLast = -1; // the last proof ID
|
||||
s->hClausePivot = 1; // the pivot among clauses
|
||||
s->hLearntPivot = 1; // the pivot moang learned clauses
|
||||
s->iVarPivot = 0; // the pivot among the variables
|
||||
s->iSimpPivot = 0; // marker of unit-clauses
|
||||
s->hLearntLast = -1; // the last learnt clause
|
||||
s->hProofLast = -1; // the last proof ID
|
||||
// initialize rollback
|
||||
s->iVarPivot = 0; // the pivot for variables
|
||||
s->iTrailPivot = 0; // the pivot for trail
|
||||
s->iProofPivot = 0; // the pivot for proof records
|
||||
s->hClausePivot = 1; // the pivot for problem clause
|
||||
s->hLearntPivot = 1; // the pivot for learned clause
|
||||
s->hProofPivot = 1; // the pivot for proof records
|
||||
return s;
|
||||
}
|
||||
|
||||
|
|
@ -1241,35 +1238,38 @@ void sat_solver2_setnvars(sat_solver2* s,int n)
|
|||
|
||||
void sat_solver2_delete(sat_solver2* s)
|
||||
{
|
||||
// veci * pCore;
|
||||
int fVerify = 0;
|
||||
if ( fVerify )
|
||||
{
|
||||
veci * pCore = Sat_ProofCore( s );
|
||||
printf( "UNSAT core contains %d clauses (%6.2f %%).\n", veci_size(pCore), 100.0*veci_size(pCore)/veci_size(&s->clauses) );
|
||||
veci_delete( pCore );
|
||||
ABC_FREE( pCore );
|
||||
if ( s->fProofLogging )
|
||||
Sat_ProofCheck( s );
|
||||
}
|
||||
|
||||
// report statistics
|
||||
printf( "Used %6.2f Mb for proof-logging. Unit clauses = %d.\n", 2.0 * veci_size(&s->proofs) / (1<<20), s->nUnits );
|
||||
/*
|
||||
pCore = Sat_ProofCore( s );
|
||||
printf( "UNSAT core contains %d clauses (%6.2f %%).\n", veci_size(pCore), 100.0*veci_size(pCore)/veci_size(&s->clauses) );
|
||||
veci_delete( pCore );
|
||||
ABC_FREE( pCore );
|
||||
printf( "Used %6.2f Mb for proof-logging. Unit clauses = %d.\n", 1.0 * Vec_SetMemory(&s->Proofs) / (1<<20), s->nUnits );
|
||||
|
||||
if ( s->fProofLogging )
|
||||
Sat_ProofCheck( s );
|
||||
*/
|
||||
// delete vectors
|
||||
veci_delete(&s->order);
|
||||
veci_delete(&s->trail_lim);
|
||||
veci_delete(&s->tagged);
|
||||
veci_delete(&s->stack);
|
||||
veci_delete(&s->temp_clause);
|
||||
veci_delete(&s->temp_proof);
|
||||
veci_delete(&s->conf_final);
|
||||
veci_delete(&s->mark_levels);
|
||||
veci_delete(&s->min_lit_order);
|
||||
veci_delete(&s->min_step_order);
|
||||
veci_delete(&s->learnt_live);
|
||||
veci_delete(&s->proofs);
|
||||
veci_delete(&s->claActs);
|
||||
veci_delete(&s->claProofs);
|
||||
veci_delete(&s->clauses);
|
||||
veci_delete(&s->learnts);
|
||||
// veci_delete(&s->proofs);
|
||||
Vec_SetFree_( &s->Proofs );
|
||||
|
||||
// delete arrays
|
||||
if (s->vi != 0){
|
||||
|
|
@ -1514,11 +1514,13 @@ void sat_solver2_rollback( sat_solver2* s )
|
|||
{
|
||||
int i, k, j;
|
||||
assert( s->iVarPivot >= 0 && s->iVarPivot <= s->size );
|
||||
assert( s->iSimpPivot >= 0 && s->iSimpPivot <= s->qtail );
|
||||
assert( s->iTrailPivot >= 0 && s->iTrailPivot <= s->qtail );
|
||||
assert( s->iProofPivot >= 0 && s->iProofPivot <= Vec_SetEntryNum(&s->Proofs) );
|
||||
assert( s->hClausePivot >= 1 && s->hClausePivot <= veci_size(&s->clauses) );
|
||||
assert( s->hLearntPivot >= 1 && s->hLearntPivot <= veci_size(&s->learnts) );
|
||||
assert( s->hProofPivot >= 1 && s->hProofPivot <= Vec_SetHandCurrent(&s->Proofs) );
|
||||
// reset implication queue
|
||||
solver2_canceluntil_rollback( s, s->iSimpPivot );
|
||||
solver2_canceluntil_rollback( s, s->iTrailPivot );
|
||||
// update order
|
||||
if ( s->iVarPivot < s->size )
|
||||
{
|
||||
|
|
@ -1558,7 +1560,9 @@ void sat_solver2_rollback( sat_solver2* s )
|
|||
veci_resize(&s->claActs, first->Id);
|
||||
if ( s->fProofLogging ) {
|
||||
veci_resize(&s->claProofs, first->Id);
|
||||
Sat_ProofReduce( s );
|
||||
Vec_SetWriteEntryNum(&s->Proofs, s->iProofPivot);
|
||||
Vec_SetShrink(&s->Proofs, s->hProofPivot);
|
||||
// Sat_ProofReduce( s );
|
||||
}
|
||||
s->stats.learnts = first->Id-1;
|
||||
veci_resize(&s->learnts, s->hLearntPivot);
|
||||
|
|
@ -1600,12 +1604,16 @@ void sat_solver2_rollback( sat_solver2* s )
|
|||
s->stats.learnts_literals = 0;
|
||||
s->stats.tot_literals = 0;
|
||||
// initialize clause pointers
|
||||
s->hLearntLast = -1; // the last learnt clause
|
||||
s->hProofLast = -1; // the last proof ID
|
||||
s->hClausePivot = 1; // the pivot among clauses
|
||||
s->hLearntPivot = 1; // the pivot among learned clauses
|
||||
s->iVarPivot = 0; // the pivot among the variables
|
||||
s->iSimpPivot = 0; // marker of unit-clauses
|
||||
s->hLearntLast = -1; // the last learnt clause
|
||||
s->hProofLast = -1; // the last proof ID
|
||||
|
||||
// initialize rollback
|
||||
s->iVarPivot = 0; // the pivot for variables
|
||||
s->iTrailPivot = 0; // the pivot for trail
|
||||
s->iProofPivot = 0; // the pivot for proof records
|
||||
s->hClausePivot = 1; // the pivot for problem clause
|
||||
s->hLearntPivot = 1; // the pivot for learned clause
|
||||
s->hProofPivot = 1; // the pivot for proof records
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1803,7 +1811,7 @@ int sat_solver2_solve(sat_solver2* s, lit* begin, lit* end, ABC_INT64_T nConfLim
|
|||
printf("==============================================================================\n");
|
||||
|
||||
solver2_canceluntil(s,0);
|
||||
assert( s->qhead == s->qtail );
|
||||
// assert( s->qhead == s->qtail );
|
||||
// if ( status == l_True )
|
||||
// sat_solver2_verify( s );
|
||||
return status;
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWA
|
|||
#include <assert.h>
|
||||
|
||||
#include "satVec.h"
|
||||
#include "vecSet.h"
|
||||
|
||||
ABC_NAMESPACE_HEADER_START
|
||||
|
||||
|
|
@ -112,16 +113,19 @@ struct sat_solver2_t
|
|||
veci clauses; // clause memory
|
||||
veci learnts; // learnt memory
|
||||
veci* wlists; // watcher lists (for each literal)
|
||||
int hLearntLast; // in proof-logging mode, the ID of the final conflict clause (conf_final)
|
||||
int hProofLast; // in proof-logging mode, the ID of the final conflict clause (conf_final)
|
||||
int hClausePivot; // the pivot among problem clause
|
||||
int hLearntPivot; // the pivot among learned clause
|
||||
int iVarPivot; // the pivot among the variables
|
||||
int iSimpPivot; // marker of unit-clauses
|
||||
int nof_learnts; // the number of clauses to trigger reduceDB
|
||||
|
||||
veci claActs; // clause activities
|
||||
veci claProofs; // clause proofs
|
||||
int hLearntLast; // in proof-logging mode, the ID of the final conflict clause (conf_final)
|
||||
int hProofLast; // in proof-logging mode, the ID of the final conflict clause (conf_final)
|
||||
int nof_learnts; // the number of clauses to trigger reduceDB
|
||||
|
||||
// rollback
|
||||
int iVarPivot; // the pivot for variables
|
||||
int iTrailPivot; // the pivot for trail
|
||||
int iProofPivot; // the pivot for proof records
|
||||
int hClausePivot; // the pivot for problem clause
|
||||
int hLearntPivot; // the pivot for learned clause
|
||||
int hProofPivot; // the pivot for proof records
|
||||
|
||||
// internal state
|
||||
varinfo2 * vi; // variable information
|
||||
|
|
@ -146,8 +150,8 @@ struct sat_solver2_t
|
|||
veci learnt_live; // remaining clauses after reduce DB
|
||||
|
||||
// proof logging
|
||||
veci proofs; // sequence of proof records
|
||||
int iStartChain; // temporary variable to remember beginning of the current chain in proof logging
|
||||
Vec_Set_t Proofs; // sequence of proof records
|
||||
veci temp_proof; // temporary place to store proofs
|
||||
int nUnits; // the total number of unit clauses
|
||||
|
||||
// statistics
|
||||
|
|
@ -251,10 +255,12 @@ static inline int sat_solver2_set_learntmax(sat_solver2* s, int nLearntMax)
|
|||
static inline void sat_solver2_bookmark(sat_solver2* s)
|
||||
{
|
||||
assert( s->qhead == s->qtail );
|
||||
s->hLearntPivot = veci_size(&s->learnts);
|
||||
s->hClausePivot = veci_size(&s->clauses);
|
||||
s->iVarPivot = s->size;
|
||||
s->iSimpPivot = s->qhead;
|
||||
s->iTrailPivot = s->qhead;
|
||||
s->iProofPivot = Vec_SetEntryNum(&s->Proofs);
|
||||
s->hClausePivot = veci_size(&s->clauses);
|
||||
s->hLearntPivot = veci_size(&s->learnts);
|
||||
s->hProofPivot = Vec_SetHandCurrent(&s->Proofs);
|
||||
}
|
||||
|
||||
static inline int sat_solver2_add_const( sat_solver2 * pSat, int iVar, int fCompl, int fMark )
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,210 +0,0 @@
|
|||
/**************************************************************************************************
|
||||
MiniSat -- Copyright (c) 2005, Niklas Sorensson
|
||||
http://www.cs.chalmers.se/Cs/Research/FormalMethods/MiniSat/
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
||||
associated documentation files (the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge, publish, distribute,
|
||||
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
|
||||
OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
**************************************************************************************************/
|
||||
// Modified to compile with MS Visual Studio 6.0 by Alan Mishchenko
|
||||
|
||||
#ifndef ABC__sat__bsat__satSolver_old_h
|
||||
#define ABC__sat__bsat__satSolver_old_h
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "satVec.h"
|
||||
#include "satMem.h"
|
||||
|
||||
ABC_NAMESPACE_HEADER_START
|
||||
|
||||
//#define USE_FLOAT_ACTIVITY
|
||||
|
||||
//=================================================================================================
|
||||
// Public interface:
|
||||
|
||||
struct sat_solver_t;
|
||||
typedef struct sat_solver_t sat_solver;
|
||||
|
||||
extern sat_solver* sat_solver_new(void);
|
||||
extern void sat_solver_delete(sat_solver* s);
|
||||
|
||||
extern int sat_solver_addclause(sat_solver* s, lit* begin, lit* end);
|
||||
extern int sat_solver_simplify(sat_solver* s);
|
||||
extern int sat_solver_solve(sat_solver* s, lit* begin, lit* end, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, ABC_INT64_T nConfLimitGlobal, ABC_INT64_T nInsLimitGlobal);
|
||||
extern void sat_solver_rollback( sat_solver* s );
|
||||
|
||||
extern int sat_solver_nvars(sat_solver* s);
|
||||
extern int sat_solver_nclauses(sat_solver* s);
|
||||
extern int sat_solver_nconflicts(sat_solver* s);
|
||||
|
||||
extern void sat_solver_setnvars(sat_solver* s,int n);
|
||||
|
||||
extern void Sat_SolverWriteDimacs( sat_solver * p, char * pFileName, lit* assumptionsBegin, lit* assumptionsEnd, int incrementVars );
|
||||
extern void Sat_SolverPrintStats( FILE * pFile, sat_solver * p );
|
||||
extern int * Sat_SolverGetModel( sat_solver * p, int * pVars, int nVars );
|
||||
extern void Sat_SolverDoubleClauses( sat_solver * p, int iVar );
|
||||
|
||||
// trace recording
|
||||
extern void Sat_SolverTraceStart( sat_solver * pSat, char * pName );
|
||||
extern void Sat_SolverTraceStop( sat_solver * pSat );
|
||||
extern void Sat_SolverTraceWrite( sat_solver * pSat, int * pBeg, int * pEnd, int fRoot );
|
||||
|
||||
// clause storage
|
||||
extern void sat_solver_store_alloc( sat_solver * s );
|
||||
extern void sat_solver_store_write( sat_solver * s, char * pFileName );
|
||||
extern void sat_solver_store_free( sat_solver * s );
|
||||
extern void sat_solver_store_mark_roots( sat_solver * s );
|
||||
extern void sat_solver_store_mark_clauses_a( sat_solver * s );
|
||||
extern void * sat_solver_store_release( sat_solver * s );
|
||||
|
||||
//=================================================================================================
|
||||
// Solver representation:
|
||||
|
||||
struct clause_t;
|
||||
typedef struct clause_t clause;
|
||||
|
||||
struct sat_solver_t
|
||||
{
|
||||
int size; // nof variables
|
||||
int cap; // size of varmaps
|
||||
int qhead; // Head index of queue.
|
||||
int qtail; // Tail index of queue.
|
||||
|
||||
// clauses
|
||||
vecp clauses; // List of problem constraints. (contains: clause*)
|
||||
vecp learnts; // List of learnt clauses. (contains: clause*)
|
||||
|
||||
// activities
|
||||
#ifdef USE_FLOAT_ACTIVITY
|
||||
double var_inc; // Amount to bump next variable with.
|
||||
double var_decay; // INVERSE decay factor for variable activity: stores 1/decay.
|
||||
float cla_inc; // Amount to bump next clause with.
|
||||
float cla_decay; // INVERSE decay factor for clause activity: stores 1/decay.
|
||||
double* activity; // A heuristic measurement of the activity of a variable.
|
||||
#else
|
||||
int var_inc; // Amount to bump next variable with.
|
||||
int cla_inc; // Amount to bump next clause with.
|
||||
unsigned*activity; // A heuristic measurement of the activity of a variable.
|
||||
#endif
|
||||
|
||||
vecp* wlists; //
|
||||
lbool* assigns; // Current values of variables.
|
||||
int* orderpos; // Index in variable order.
|
||||
clause** reasons; //
|
||||
int* levels; //
|
||||
lit* trail;
|
||||
char* polarity;
|
||||
|
||||
clause* binary; // A temporary binary clause
|
||||
lbool* tags; //
|
||||
veci tagged; // (contains: var)
|
||||
veci stack; // (contains: var)
|
||||
|
||||
veci order; // Variable order. (heap) (contains: var)
|
||||
veci trail_lim; // Separator indices for different decision levels in 'trail'. (contains: int)
|
||||
veci model; // If problem is solved, this vector contains the model (contains: lbool).
|
||||
veci conf_final; // If problem is unsatisfiable (possibly under assumptions),
|
||||
// this vector represent the final conflict clause expressed in the assumptions.
|
||||
|
||||
int root_level; // Level of first proper decision.
|
||||
int simpdb_assigns;// Number of top-level assignments at last 'simplifyDB()'.
|
||||
int simpdb_props; // Number of propagations before next 'simplifyDB()'.
|
||||
double random_seed;
|
||||
double progress_estimate;
|
||||
int verbosity; // Verbosity level. 0=silent, 1=some progress report, 2=everything
|
||||
|
||||
stats_t stats;
|
||||
|
||||
ABC_INT64_T nConfLimit; // external limit on the number of conflicts
|
||||
ABC_INT64_T nInsLimit; // external limit on the number of implications
|
||||
int nRuntimeLimit; // external limit on runtime
|
||||
|
||||
veci act_vars; // variables whose activity has changed
|
||||
double* factors; // the activity factors
|
||||
int nRestarts; // the number of local restarts
|
||||
int nCalls; // the number of local restarts
|
||||
int nCalls2; // the number of local restarts
|
||||
|
||||
Sat_MmStep_t * pMem;
|
||||
|
||||
int fSkipSimplify; // set to one to skip simplification of the clause database
|
||||
int fNotUseRandom; // do not allow random decisions with a fixed probability
|
||||
|
||||
int * pGlobalVars; // for experiments with global vars during interpolation
|
||||
// clause store
|
||||
void * pStore;
|
||||
int fSolved;
|
||||
|
||||
// trace recording
|
||||
FILE * pFile;
|
||||
int nClauses;
|
||||
int nRoots;
|
||||
|
||||
veci temp_clause; // temporary storage for a CNF clause
|
||||
};
|
||||
|
||||
static int sat_solver_var_value( sat_solver* s, int v )
|
||||
{
|
||||
assert( s->model.ptr != NULL && v < s->size );
|
||||
return (int)(s->model.ptr[v] == l_True);
|
||||
}
|
||||
static int sat_solver_var_literal( sat_solver* s, int v )
|
||||
{
|
||||
assert( s->model.ptr != NULL && v < s->size );
|
||||
return toLitCond( v, s->model.ptr[v] != l_True );
|
||||
}
|
||||
static void sat_solver_act_var_clear(sat_solver* s)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < s->size; i++)
|
||||
s->activity[i] = 0.0;
|
||||
s->var_inc = 1.0;
|
||||
}
|
||||
static void sat_solver_compress(sat_solver* s)
|
||||
{
|
||||
if ( s->qtail != s->qhead )
|
||||
{
|
||||
int RetValue = sat_solver_simplify(s);
|
||||
assert( RetValue != 0 );
|
||||
}
|
||||
}
|
||||
|
||||
static int sat_solver_final(sat_solver* s, int ** ppArray)
|
||||
{
|
||||
*ppArray = s->conf_final.ptr;
|
||||
return s->conf_final.size;
|
||||
}
|
||||
|
||||
static int sat_solver_set_runtime_limit(sat_solver* s, int Limit)
|
||||
{
|
||||
int nRuntimeLimit = s->nRuntimeLimit;
|
||||
s->nRuntimeLimit = Limit;
|
||||
return nRuntimeLimit;
|
||||
}
|
||||
|
||||
static int sat_solver_set_random(sat_solver* s, int fNotUseRandom)
|
||||
{
|
||||
int fNotUseRandomOld = s->fNotUseRandom;
|
||||
s->fNotUseRandom = fNotUseRandom;
|
||||
return fNotUseRandomOld;
|
||||
}
|
||||
|
||||
ABC_NAMESPACE_HEADER_END
|
||||
|
||||
#endif
|
||||
|
|
@ -19,7 +19,7 @@
|
|||
***********************************************************************/
|
||||
|
||||
#include "satTruth.h"
|
||||
#include "vecRec.h"
|
||||
#include "vecSet.h"
|
||||
|
||||
ABC_NAMESPACE_IMPL_START
|
||||
|
||||
|
|
@ -39,7 +39,7 @@ struct Tru_Man_t_
|
|||
int nEntrySize; // the size of one entry in 'int'
|
||||
int nTableSize; // hash table size
|
||||
int * pTable; // hash table
|
||||
Vec_Rec_t * pMem; // memory for truth tables
|
||||
Vec_Set_t * pMem; // memory for truth tables
|
||||
word * pZero; // temporary truth table
|
||||
int hIthVars[16]; // variable handles
|
||||
int nTableLookups;
|
||||
|
|
@ -53,7 +53,7 @@ struct Tru_One_t_
|
|||
word pTruth[0]; // truth table
|
||||
};
|
||||
|
||||
static inline Tru_One_t * Tru_ManReadOne( Tru_Man_t * p, int h ) { return h ? (Tru_One_t *)Vec_RecEntryP(p->pMem, h) : NULL; }
|
||||
static inline Tru_One_t * Tru_ManReadOne( Tru_Man_t * p, int h ) { return h ? (Tru_One_t *)Vec_SetEntry(p->pMem, h) : NULL; }
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// FUNCTION DEFINITIONS ///
|
||||
|
|
@ -140,7 +140,7 @@ void Tru_ManResize( Tru_Man_t * p )
|
|||
*pSpot = pThis->Handle;
|
||||
Counter++;
|
||||
}
|
||||
assert( Counter == Vec_RecEntryNum(p->pMem) );
|
||||
assert( Counter == Vec_SetEntryNum(p->pMem) );
|
||||
ABC_FREE( pTableOld );
|
||||
}
|
||||
|
||||
|
|
@ -163,7 +163,7 @@ int Tru_ManInsert( Tru_Man_t * p, word * pTruth )
|
|||
if ( Tru_ManEqual1(pTruth, p->nWords) )
|
||||
return 1;
|
||||
p->nTableLookups++;
|
||||
if ( Vec_RecEntryNum(p->pMem) > 2 * p->nTableSize )
|
||||
if ( Vec_SetEntryNum(p->pMem) > 2 * p->nTableSize )
|
||||
Tru_ManResize( p );
|
||||
fCompl = pTruth[0] & 1;
|
||||
if ( fCompl )
|
||||
|
|
@ -172,7 +172,7 @@ int Tru_ManInsert( Tru_Man_t * p, word * pTruth )
|
|||
if ( *pSpot == 0 )
|
||||
{
|
||||
Tru_One_t * pEntry;
|
||||
*pSpot = Vec_RecAppend( p->pMem, p->nEntrySize );
|
||||
*pSpot = Vec_SetAppend( p->pMem, NULL, p->nEntrySize );
|
||||
assert( (*pSpot & 1) == 0 );
|
||||
pEntry = Tru_ManReadOne( p, *pSpot );
|
||||
Tru_ManCopy( pEntry->pTruth, pTruth, p->nWords );
|
||||
|
|
@ -215,7 +215,7 @@ Tru_Man_t * Tru_ManAlloc( int nVars )
|
|||
p->nEntrySize = (sizeof(Tru_One_t) + p->nWords * sizeof(word))/sizeof(int);
|
||||
p->nTableSize = 8147;
|
||||
p->pTable = ABC_CALLOC( int, p->nTableSize );
|
||||
p->pMem = Vec_RecAlloc();
|
||||
p->pMem = Vec_SetAlloc();
|
||||
// initialize truth tables
|
||||
p->pZero = ABC_ALLOC( word, p->nWords );
|
||||
for ( i = 0; i < nVars; i++ )
|
||||
|
|
@ -247,8 +247,8 @@ Tru_Man_t * Tru_ManAlloc( int nVars )
|
|||
***********************************************************************/
|
||||
void Tru_ManFree( Tru_Man_t * p )
|
||||
{
|
||||
printf( "Lookups = %d. Entries = %d.\n", p->nTableLookups, Vec_RecEntryNum(p->pMem) );
|
||||
Vec_RecFree( p->pMem );
|
||||
printf( "Lookups = %d. Entries = %d.\n", p->nTableLookups, Vec_SetEntryNum(p->pMem) );
|
||||
Vec_SetFree( p->pMem );
|
||||
ABC_FREE( p->pZero );
|
||||
ABC_FREE( p->pTable );
|
||||
ABC_FREE( p );
|
||||
|
|
@ -287,25 +287,9 @@ word * Tru_ManFunc( Tru_Man_t * p, int h )
|
|||
assert( (h & 1) == 0 );
|
||||
if ( h == 0 )
|
||||
return p->pZero;
|
||||
assert( Vec_RecChunk(h) );
|
||||
return Tru_ManReadOne( p, h )->pTruth;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Returns stored truth table]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Tru_ManHandleMax( Tru_Man_t * p )
|
||||
{
|
||||
return p->pMem->hCurrent;
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// END OF FILE ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ extern void Tru_ManFree( Tru_Man_t * p );
|
|||
extern word * Tru_ManVar( Tru_Man_t * p, int v );
|
||||
extern word * Tru_ManFunc( Tru_Man_t * p, int h );
|
||||
extern int Tru_ManInsert( Tru_Man_t * p, word * pTruth );
|
||||
extern int Tru_ManHandleMax( Tru_Man_t * p );
|
||||
//extern int Tru_ManHandleMax( Tru_Man_t * p );
|
||||
|
||||
ABC_NAMESPACE_HEADER_END
|
||||
|
||||
|
|
|
|||
|
|
@ -1,396 +0,0 @@
|
|||
/**CFile****************************************************************
|
||||
|
||||
FileName [vecRec.h]
|
||||
|
||||
SystemName [ABC: Logic synthesis and verification system.]
|
||||
|
||||
PackageName [Resizable arrays.]
|
||||
|
||||
Synopsis [Array of records.]
|
||||
|
||||
Author [Alan Mishchenko]
|
||||
|
||||
Affiliation [UC Berkeley]
|
||||
|
||||
Date [Ver. 1.0. Started - June 20, 2005.]
|
||||
|
||||
Revision [$Id: vecRec.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
|
||||
|
||||
***********************************************************************/
|
||||
|
||||
#ifndef ABC__sat__bsat__vecRec_h
|
||||
#define ABC__sat__bsat__vecRec_h
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// INCLUDES ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
ABC_NAMESPACE_HEADER_START
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// PARAMETERS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// BASIC TYPES ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// data-structure for logging entries
|
||||
// memory is allocated in 'p->Mask+1' int chunks
|
||||
// the first 'int' of each entry cannot be 0
|
||||
typedef struct Vec_Rec_t_ Vec_Rec_t;
|
||||
struct Vec_Rec_t_
|
||||
{
|
||||
int Mask; // mask for the log size
|
||||
int hCurrent; // current position
|
||||
int hShadow; // current position
|
||||
int nEntries; // total number of entries
|
||||
int nChunks; // total number of chunks
|
||||
int nChunksAlloc; // the number of allocated chunks
|
||||
int ** pChunks; // the chunks
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// MACRO DEFINITIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// p is vector of records
|
||||
// Size is given by the user
|
||||
// Handle is returned to the user
|
||||
// c (chunk) and s (shift) are variables used here
|
||||
#define Vec_RecForEachEntry( p, Size, Handle, c, s ) \
|
||||
for ( c = 1; c <= p->nChunks; c++ ) \
|
||||
for ( s = 0; p->pChunks[c][s] && ((Handle) = (((c)<<16)|(s))); s += Size, assert(s < p->Mask) )
|
||||
|
||||
#define Vec_RecForEachEntryStart( p, Size, Handle, c, s, hStart ) \
|
||||
for ( c = Vec_RecChunk(hStart), s = Vec_RecShift(hStart); c <= p->nChunks; c++, s = 0 ) \
|
||||
for ( ; p->pChunks[c][s] && ((Handle) = (((c)<<16)|(s))); s += Size, assert(s < p->Mask) )
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// FUNCTION DEFINITIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline Vec_Rec_t * Vec_RecAlloc()
|
||||
{
|
||||
Vec_Rec_t * p;
|
||||
p = ABC_CALLOC( Vec_Rec_t, 1 );
|
||||
p->Mask = (1 << 15) - 1; // chunk size = 2^15 ints = 128 Kb
|
||||
p->hCurrent = (1 << 16);
|
||||
p->nChunks = 1;
|
||||
p->nChunksAlloc = 16;
|
||||
p->pChunks = ABC_CALLOC( int *, p->nChunksAlloc );
|
||||
p->pChunks[0] = NULL;
|
||||
p->pChunks[1] = ABC_ALLOC( int, (1 << 16) );
|
||||
p->pChunks[1][0] = 0;
|
||||
return p;
|
||||
}
|
||||
static inline void Vec_RecAlloc_( Vec_Rec_t * p )
|
||||
{
|
||||
// Vec_Rec_t * p;
|
||||
// p = ABC_CALLOC( Vec_Rec_t, 1 );
|
||||
memset( p, 0, sizeof(Vec_Rec_t) );
|
||||
p->Mask = (1 << 15) - 1; // chunk size = 2^15 ints = 128 Kb
|
||||
p->hCurrent = (1 << 16);
|
||||
p->nChunks = 1;
|
||||
p->nChunksAlloc = 16;
|
||||
p->pChunks = ABC_CALLOC( int *, p->nChunksAlloc );
|
||||
p->pChunks[0] = NULL;
|
||||
p->pChunks[1] = ABC_ALLOC( int, (1 << 16) );
|
||||
p->pChunks[1][0] = 0;
|
||||
// return p;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline int Vec_RecChunk( int i )
|
||||
{
|
||||
return i>>16;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline int Vec_RecShift( int i )
|
||||
{
|
||||
return i&0xFFFF;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline int Vec_RecSize( Vec_Rec_t * p )
|
||||
{
|
||||
return Vec_RecChunk(p->hCurrent) * (p->Mask + 1);
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline int Vec_RecEntryNum( Vec_Rec_t * p )
|
||||
{
|
||||
return p->nEntries;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline int Vec_RecEntry( Vec_Rec_t * p, int i )
|
||||
{
|
||||
assert( i <= p->hCurrent );
|
||||
return p->pChunks[Vec_RecChunk(i)][Vec_RecShift(i)];
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline int * Vec_RecEntryP( Vec_Rec_t * p, int i )
|
||||
{
|
||||
assert( i <= p->hCurrent );
|
||||
return p->pChunks[Vec_RecChunk(i)] + Vec_RecShift(i);
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline void Vec_RecRestart( Vec_Rec_t * p )
|
||||
{
|
||||
p->hCurrent = (1 << 16);
|
||||
p->nChunks = 1;
|
||||
p->nEntries = 0;
|
||||
p->pChunks[1][0] = 0;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline void Vec_RecShrink( Vec_Rec_t * p, int h )
|
||||
{
|
||||
int i;
|
||||
assert( Vec_RecEntry(p, h) == 0 );
|
||||
for ( i = Vec_RecChunk(h)+1; i < p->nChunksAlloc; i++ )
|
||||
ABC_FREE( p->pChunks[i] );
|
||||
p->nChunks = Vec_RecChunk(h);
|
||||
p->hCurrent = h;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline void Vec_RecFree( Vec_Rec_t * p )
|
||||
{
|
||||
int i;
|
||||
for ( i = 0; i < p->nChunksAlloc; i++ )
|
||||
ABC_FREE( p->pChunks[i] );
|
||||
ABC_FREE( p->pChunks );
|
||||
ABC_FREE( p );
|
||||
}
|
||||
static inline void Vec_RecFree_( Vec_Rec_t * p )
|
||||
{
|
||||
int i;
|
||||
for ( i = 0; i < p->nChunksAlloc; i++ )
|
||||
ABC_FREE( p->pChunks[i] );
|
||||
ABC_FREE( p->pChunks );
|
||||
// ABC_FREE( p );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline int Vec_RecAppend( Vec_Rec_t * p, int nSize )
|
||||
{
|
||||
assert( nSize <= p->Mask );
|
||||
assert( Vec_RecEntry(p, p->hCurrent) == 0 );
|
||||
assert( Vec_RecChunk(p->hCurrent) == p->nChunks );
|
||||
if ( Vec_RecShift(p->hCurrent) + nSize >= p->Mask )
|
||||
{
|
||||
if ( ++p->nChunks == p->nChunksAlloc )
|
||||
{
|
||||
p->pChunks = ABC_REALLOC( int *, p->pChunks, p->nChunksAlloc * 2 );
|
||||
memset( p->pChunks + p->nChunksAlloc, 0, sizeof(int *) * p->nChunksAlloc );
|
||||
p->nChunksAlloc *= 2;
|
||||
}
|
||||
if ( p->pChunks[p->nChunks] == NULL )
|
||||
p->pChunks[p->nChunks] = ABC_ALLOC( int, (p->Mask + 1) );
|
||||
p->pChunks[p->nChunks][0] = 0;
|
||||
p->hCurrent = p->nChunks << 16;
|
||||
}
|
||||
p->hCurrent += nSize;
|
||||
*Vec_RecEntryP(p, p->hCurrent) = 0;
|
||||
p->nEntries++;
|
||||
return p->hCurrent - nSize;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline int Vec_RecPush( Vec_Rec_t * p, int * pArray, int nSize )
|
||||
{
|
||||
int Handle = Vec_RecAppend( p, nSize );
|
||||
memmove( Vec_RecEntryP(p, Handle), pArray, sizeof(int) * nSize );
|
||||
return Handle;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline void Vec_RecSetShadow( Vec_Rec_t * p, int hShadow )
|
||||
{
|
||||
p->hShadow = hShadow;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline int Vec_RecReadShadow( Vec_Rec_t * p )
|
||||
{
|
||||
return p->hShadow;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline int Vec_RecAppendShadow( Vec_Rec_t * p, int nSize )
|
||||
{
|
||||
if ( Vec_RecShift(p->hShadow) + nSize >= p->Mask )
|
||||
p->hShadow = ((Vec_RecChunk(p->hShadow) + 1) << 16);
|
||||
p->hShadow += nSize;
|
||||
return p->hShadow - nSize;
|
||||
}
|
||||
|
||||
|
||||
ABC_NAMESPACE_HEADER_END
|
||||
|
||||
#endif
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// END OF FILE ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
|
@ -0,0 +1,247 @@
|
|||
/**CFile****************************************************************
|
||||
|
||||
FileName [vecSet.h]
|
||||
|
||||
SystemName [ABC: Logic synthesis and verification system.]
|
||||
|
||||
PackageName [SAT solvers.]
|
||||
|
||||
Synopsis [Multi-page dynamic array.]
|
||||
|
||||
Author [Alan Mishchenko]
|
||||
|
||||
Affiliation [UC Berkeley]
|
||||
|
||||
Date [Ver. 1.0. Started - June 20, 2005.]
|
||||
|
||||
Revision [$Id: vecSet.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
|
||||
|
||||
***********************************************************************/
|
||||
|
||||
#ifndef ABC__sat__bsat__vecSet_h
|
||||
#define ABC__sat__bsat__vecSet_h
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// INCLUDES ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
ABC_NAMESPACE_HEADER_START
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// PARAMETERS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// BASIC TYPES ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// data-structure for logging entries
|
||||
// memory is allocated in 2^16 word-sized pages
|
||||
// the first 'word' of each page is used storing additional data
|
||||
// the first 'int' of additional data stores the word limit
|
||||
// the second 'int' of the additional data stores the shadow word limit
|
||||
|
||||
typedef struct Vec_Set_t_ Vec_Set_t;
|
||||
struct Vec_Set_t_
|
||||
{
|
||||
int nEntries; // entry count
|
||||
int iPage; // current page
|
||||
int iPageS; // shadow page
|
||||
int nPagesAlloc; // page count allocated
|
||||
word ** pPages; // page pointers
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// MACRO DEFINITIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static inline int Vec_SetHandPage( int h ) { return h >> 16; }
|
||||
static inline int Vec_SetHandShift( int h ) { return h & 0xFFFF; }
|
||||
|
||||
static inline word * Vec_SetEntry( Vec_Set_t * p, int h ) { return p->pPages[Vec_SetHandPage(h)] + Vec_SetHandShift(h); }
|
||||
static inline int Vec_SetEntryNum( Vec_Set_t * p ) { return p->nEntries; }
|
||||
static inline void Vec_SetWriteEntryNum( Vec_Set_t * p, int i){ p->nEntries = i; }
|
||||
|
||||
static inline int Vec_SetLimit( word * p ) { return ((int*)p)[0]; }
|
||||
static inline int Vec_SetLimitS( word * p ) { return ((int*)p)[1]; }
|
||||
|
||||
static inline int Vec_SetIncLimit( word * p, int nWords ) { return ((int*)p)[0] += nWords; }
|
||||
static inline int Vec_SetIncLimitS( word * p, int nWords ) { return ((int*)p)[1] += nWords; }
|
||||
|
||||
static inline void Vec_SetWriteLimit( word * p, int nWords ) { ((int*)p)[0] = nWords; }
|
||||
static inline void Vec_SetWriteLimitS( word * p, int nWords ) { ((int*)p)[1] = nWords; }
|
||||
|
||||
static inline int Vec_SetHandCurrent( Vec_Set_t * p ) { return (p->iPage << 16) + Vec_SetLimit(p->pPages[p->iPage]); }
|
||||
static inline int Vec_SetHandCurrentS( Vec_Set_t * p ) { return (p->iPageS << 16) + Vec_SetLimitS(p->pPages[p->iPageS]); }
|
||||
|
||||
static inline int Vec_SetHandMemory( Vec_Set_t * p, int h ) { return Vec_SetHandPage(h) * 0x8FFFF + Vec_SetHandShift(h) * 8; }
|
||||
static inline int Vec_SetMemory( Vec_Set_t * p ) { return Vec_SetHandMemory(p, Vec_SetHandCurrent(p)); }
|
||||
static inline int Vec_SetMemoryS( Vec_Set_t * p ) { return Vec_SetHandMemory(p, Vec_SetHandCurrentS(p)); }
|
||||
static inline int Vec_SetMemoryAll( Vec_Set_t * p ) { return (p->iPage+1) * 0x8FFFF; }
|
||||
|
||||
// Type is the Set type
|
||||
// pVec is vector of set
|
||||
// nSize should be given by the user
|
||||
// pSet is the pointer to the set
|
||||
// p (page) and s (shift) are variables used here
|
||||
#define Vec_SetForEachEntry( Type, pVec, nSize, pSet, p, s ) \
|
||||
for ( p = 0; p <= pVec->iPage; p++ ) \
|
||||
for ( s = 1; s < Vec_SetLimit(pVec->pPages[p]) && ((pSet) = (Type)(pVec->pPages[p] + (s))); s += nSize )
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// FUNCTION DEFINITIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Allocating vector.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline void Vec_SetAlloc_( Vec_Set_t * p )
|
||||
{
|
||||
memset( p, 0, sizeof(Vec_Set_t) );
|
||||
p->nPagesAlloc = 256;
|
||||
p->pPages = ABC_CALLOC( word *, p->nPagesAlloc );
|
||||
p->pPages[0] = ABC_ALLOC( word, 0x10000 );
|
||||
p->pPages[0][0] = ~0;
|
||||
Vec_SetWriteLimit( p->pPages[0], 1 );
|
||||
}
|
||||
static inline Vec_Set_t * Vec_SetAlloc()
|
||||
{
|
||||
Vec_Set_t * p;
|
||||
p = ABC_CALLOC( Vec_Set_t, 1 );
|
||||
Vec_SetAlloc_( p );
|
||||
return p;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Resetting vector.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline void Vec_SetRestart( Vec_Set_t * p )
|
||||
{
|
||||
p->nEntries = 0;
|
||||
p->iPage = 0;
|
||||
p->iPageS = 0;
|
||||
p->pPages[0][0] = ~0;
|
||||
Vec_SetWriteLimit( p->pPages[0], 1 );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Freeing vector.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline void Vec_SetFree_( Vec_Set_t * p )
|
||||
{
|
||||
int i;
|
||||
for ( i = 0; i < p->nPagesAlloc; i++ )
|
||||
ABC_FREE( p->pPages[i] );
|
||||
ABC_FREE( p->pPages );
|
||||
}
|
||||
static inline void Vec_SetFree( Vec_Set_t * p )
|
||||
{
|
||||
Vec_SetFree_( p );
|
||||
ABC_FREE( p );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Appending entries to vector.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline int Vec_SetAppend( Vec_Set_t * p, int * pArray, int nSize )
|
||||
{
|
||||
int nWords = (nSize + 1) >> 1;
|
||||
assert( nWords < 0x10000 );
|
||||
p->nEntries++;
|
||||
if ( Vec_SetLimit( p->pPages[p->iPage] ) + nWords > 0x10000 )
|
||||
{
|
||||
if ( ++p->iPage == p->nPagesAlloc )
|
||||
{
|
||||
p->pPages = ABC_REALLOC( word *, p->pPages, p->nPagesAlloc * 2 );
|
||||
memset( p->pPages + p->nPagesAlloc, 0, sizeof(word *) * p->nPagesAlloc );
|
||||
p->nPagesAlloc *= 2;
|
||||
}
|
||||
if ( p->pPages[p->iPage] == NULL )
|
||||
p->pPages[p->iPage] = ABC_ALLOC( word, 0x10000 );
|
||||
p->pPages[p->iPage][0] = ~0;
|
||||
Vec_SetWriteLimit( p->pPages[p->iPage], 1 );
|
||||
}
|
||||
if ( pArray )
|
||||
memmove( p->pPages[p->iPage] + Vec_SetLimit(p->pPages[p->iPage]), pArray, sizeof(int) * nSize );
|
||||
Vec_SetIncLimit( p->pPages[p->iPage], nWords );
|
||||
return Vec_SetHandCurrent(p) - nWords;
|
||||
}
|
||||
static inline int Vec_SetAppendS( Vec_Set_t * p, int nSize )
|
||||
{
|
||||
int nWords = (nSize + 1) >> 1;
|
||||
assert( nWords < 0x10000 );
|
||||
if ( Vec_SetLimitS( p->pPages[p->iPageS] ) + nWords > 0x10000 )
|
||||
Vec_SetWriteLimitS( p->pPages[++p->iPageS], 1 );
|
||||
Vec_SetIncLimitS( p->pPages[p->iPageS], nWords );
|
||||
return Vec_SetHandCurrentS(p) - nWords;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Shrinking vector size.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects [This procedure does not update the number of entries.]
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
static inline void Vec_SetShrink( Vec_Set_t * p, int h )
|
||||
{
|
||||
assert( h <= Vec_SetHandCurrent(p) );
|
||||
p->iPage = Vec_SetHandPage(h);
|
||||
Vec_SetWriteLimit( p->pPages[p->iPage], Vec_SetHandShift(h) );
|
||||
}
|
||||
static inline void Vec_SetShrinkS( Vec_Set_t * p, int h )
|
||||
{
|
||||
assert( h <= Vec_SetHandCurrent(p) );
|
||||
p->iPageS = Vec_SetHandPage(h);
|
||||
Vec_SetWriteLimitS( p->pPages[p->iPageS], Vec_SetHandShift(h) );
|
||||
}
|
||||
|
||||
|
||||
ABC_NAMESPACE_HEADER_END
|
||||
|
||||
#endif
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// END OF FILE ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Loading…
Reference in New Issue