mirror of https://github.com/YosysHQ/abc.git
Version abc60920
This commit is contained in:
parent
370578bf1c
commit
0da555cb48
8
abc.dsp
8
abc.dsp
|
|
@ -2114,6 +2114,14 @@ SOURCE=.\src\temp\ivy\ivyUtil.c
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\src\temp\ivy\satMem.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\src\temp\ivy\satMem.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\src\temp\ivy\satSolver.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
|
|
|||
4
abc.rc
4
abc.rc
|
|
@ -2,8 +2,8 @@
|
|||
#set check # checks intermediate networks
|
||||
#set checkfio # prints warnings when fanins/fanouts are duplicated
|
||||
#set checkread # checks new networks after reading from file
|
||||
#set backup # saves backup networks retrived by "undo" and "recall"
|
||||
#set savesteps 1 # sets the maximum number of backup networks to save
|
||||
set backup # saves backup networks retrived by "undo" and "recall"
|
||||
set savesteps 1 # sets the maximum number of backup networks to save
|
||||
set progressbar # display the progress bar
|
||||
|
||||
# program names for internal calls
|
||||
|
|
|
|||
|
|
@ -601,8 +601,8 @@ extern Abc_Obj_t * Abc_NtkDupBox( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pBox,
|
|||
extern Abc_Obj_t * Abc_NtkCloneObj( Abc_Obj_t * pNode );
|
||||
extern Abc_Obj_t * Abc_NtkFindNode( Abc_Ntk_t * pNtk, char * pName );
|
||||
extern Abc_Obj_t * Abc_NtkFindNet( Abc_Ntk_t * pNtk, char * pName );
|
||||
extern Abc_Obj_t * Abc_NtkFindTerm( Abc_Ntk_t * pNtk, char * pName );
|
||||
extern Abc_Obj_t * Abc_NtkFindCi( Abc_Ntk_t * pNtk, char * pName );
|
||||
extern Abc_Obj_t * Abc_NtkFindCo( Abc_Ntk_t * pNtk, char * pName );
|
||||
extern Abc_Obj_t * Abc_NtkFindOrCreateNet( Abc_Ntk_t * pNtk, char * pName );
|
||||
extern Abc_Obj_t * Abc_NodeCreateConst0( Abc_Ntk_t * pNtk );
|
||||
extern Abc_Obj_t * Abc_NodeCreateConst1( Abc_Ntk_t * pNtk );
|
||||
|
|
|
|||
|
|
@ -97,7 +97,9 @@ static int Abc_CommandICut ( Abc_Frame_t * pAbc, int argc, char ** arg
|
|||
static int Abc_CommandIRewrite ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||
static int Abc_CommandIRewriteSeq ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||
static int Abc_CommandIResyn ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||
static int Abc_CommandISat ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||
static int Abc_CommandIFraig ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||
static int Abc_CommandIProve ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||
static int Abc_CommandHaig ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||
static int Abc_CommandMini ( Abc_Frame_t * pAbc, int argc, char ** argv );
|
||||
|
||||
|
|
@ -224,7 +226,9 @@ void Abc_Init( Abc_Frame_t * pAbc )
|
|||
Cmd_CommandAdd( pAbc, "New AIG", "irw", Abc_CommandIRewrite, 1 );
|
||||
Cmd_CommandAdd( pAbc, "New AIG", "irws", Abc_CommandIRewriteSeq, 1 );
|
||||
Cmd_CommandAdd( pAbc, "New AIG", "iresyn", Abc_CommandIResyn, 1 );
|
||||
Cmd_CommandAdd( pAbc, "New AIG", "isat", Abc_CommandISat, 1 );
|
||||
Cmd_CommandAdd( pAbc, "New AIG", "ifraig", Abc_CommandIFraig, 1 );
|
||||
Cmd_CommandAdd( pAbc, "New AIG", "iprove", Abc_CommandIProve, 1 );
|
||||
Cmd_CommandAdd( pAbc, "New AIG", "haig", Abc_CommandHaig, 1 );
|
||||
Cmd_CommandAdd( pAbc, "New AIG", "mini", Abc_CommandMini, 1 );
|
||||
|
||||
|
|
@ -3354,7 +3358,8 @@ int Abc_CommandAppend( Abc_Frame_t * pAbc, int argc, char ** argv )
|
|||
return 1;
|
||||
}
|
||||
Abc_NtkDelete( pNtk2 );
|
||||
|
||||
// sweep dangling logic
|
||||
Abc_AigCleanup( pNtk->pManFunc );
|
||||
// replace the current network
|
||||
// Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes );
|
||||
return 0;
|
||||
|
|
@ -5430,6 +5435,93 @@ usage:
|
|||
return 1;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Abc_CommandISat( Abc_Frame_t * pAbc, int argc, char ** argv )
|
||||
{
|
||||
FILE * pOut, * pErr;
|
||||
Abc_Ntk_t * pNtk, * pNtkRes;
|
||||
int c, fUpdateLevel, fVerbose;
|
||||
int nConfLimit;
|
||||
|
||||
extern Abc_Ntk_t * Abc_NtkIvySat( Abc_Ntk_t * pNtk, int nConfLimit, int fVerbose );
|
||||
|
||||
pNtk = Abc_FrameReadNtk(pAbc);
|
||||
pOut = Abc_FrameReadOut(pAbc);
|
||||
pErr = Abc_FrameReadErr(pAbc);
|
||||
|
||||
// set defaults
|
||||
nConfLimit = 100000;
|
||||
fUpdateLevel = 1;
|
||||
fVerbose = 0;
|
||||
Extra_UtilGetoptReset();
|
||||
while ( ( c = Extra_UtilGetopt( argc, argv, "Clzvh" ) ) != EOF )
|
||||
{
|
||||
switch ( c )
|
||||
{
|
||||
case 'C':
|
||||
if ( globalUtilOptind >= argc )
|
||||
{
|
||||
fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" );
|
||||
goto usage;
|
||||
}
|
||||
nConfLimit = atoi(argv[globalUtilOptind]);
|
||||
globalUtilOptind++;
|
||||
if ( nConfLimit < 0 )
|
||||
goto usage;
|
||||
break;
|
||||
case 'l':
|
||||
fUpdateLevel ^= 1;
|
||||
break;
|
||||
case 'v':
|
||||
fVerbose ^= 1;
|
||||
break;
|
||||
case 'h':
|
||||
goto usage;
|
||||
default:
|
||||
goto usage;
|
||||
}
|
||||
}
|
||||
if ( pNtk == NULL )
|
||||
{
|
||||
fprintf( pErr, "Empty network.\n" );
|
||||
return 1;
|
||||
}
|
||||
if ( Abc_NtkIsSeq(pNtk) )
|
||||
{
|
||||
fprintf( pErr, "Only works for non-sequential networks.\n" );
|
||||
return 1;
|
||||
}
|
||||
|
||||
pNtkRes = Abc_NtkIvySat( pNtk, nConfLimit, fVerbose );
|
||||
if ( pNtkRes == NULL )
|
||||
{
|
||||
fprintf( pErr, "Command has failed.\n" );
|
||||
return 0;
|
||||
}
|
||||
// replace the current network
|
||||
Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes );
|
||||
return 0;
|
||||
|
||||
usage:
|
||||
fprintf( pErr, "usage: isat [-C num] [-vh]\n" );
|
||||
fprintf( pErr, "\t tries to prove the miter constant 0\n" );
|
||||
fprintf( pErr, "\t-C num : limit on the number of conflicts [default = %d]\n", nConfLimit );
|
||||
// fprintf( pErr, "\t-l : toggle preserving the number of levels [default = %s]\n", fUpdateLevel? "yes": "no" );
|
||||
fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" );
|
||||
fprintf( pErr, "\t-h : print the command usage\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
|
@ -5446,8 +5538,95 @@ int Abc_CommandIFraig( Abc_Frame_t * pAbc, int argc, char ** argv )
|
|||
FILE * pOut, * pErr;
|
||||
Abc_Ntk_t * pNtk, * pNtkRes;
|
||||
int c, fUpdateLevel, fVerbose;
|
||||
int nConfLimit;
|
||||
|
||||
extern Abc_Ntk_t * Abc_NtkIvyFraig( Abc_Ntk_t * pNtk );
|
||||
extern Abc_Ntk_t * Abc_NtkIvyFraig( Abc_Ntk_t * pNtk, int nConfLimit, int fVerbose );
|
||||
|
||||
pNtk = Abc_FrameReadNtk(pAbc);
|
||||
pOut = Abc_FrameReadOut(pAbc);
|
||||
pErr = Abc_FrameReadErr(pAbc);
|
||||
|
||||
// set defaults
|
||||
nConfLimit = 100;
|
||||
fUpdateLevel = 1;
|
||||
fVerbose = 0;
|
||||
Extra_UtilGetoptReset();
|
||||
while ( ( c = Extra_UtilGetopt( argc, argv, "Clzvh" ) ) != EOF )
|
||||
{
|
||||
switch ( c )
|
||||
{
|
||||
case 'C':
|
||||
if ( globalUtilOptind >= argc )
|
||||
{
|
||||
fprintf( pErr, "Command line switch \"-C\" should be followed by an integer.\n" );
|
||||
goto usage;
|
||||
}
|
||||
nConfLimit = atoi(argv[globalUtilOptind]);
|
||||
globalUtilOptind++;
|
||||
if ( nConfLimit < 0 )
|
||||
goto usage;
|
||||
break;
|
||||
case 'l':
|
||||
fUpdateLevel ^= 1;
|
||||
break;
|
||||
case 'v':
|
||||
fVerbose ^= 1;
|
||||
break;
|
||||
case 'h':
|
||||
goto usage;
|
||||
default:
|
||||
goto usage;
|
||||
}
|
||||
}
|
||||
if ( pNtk == NULL )
|
||||
{
|
||||
fprintf( pErr, "Empty network.\n" );
|
||||
return 1;
|
||||
}
|
||||
if ( Abc_NtkIsSeq(pNtk) )
|
||||
{
|
||||
fprintf( pErr, "Only works for non-sequential networks.\n" );
|
||||
return 1;
|
||||
}
|
||||
|
||||
pNtkRes = Abc_NtkIvyFraig( pNtk, nConfLimit, fVerbose );
|
||||
if ( pNtkRes == NULL )
|
||||
{
|
||||
fprintf( pErr, "Command has failed.\n" );
|
||||
return 0;
|
||||
}
|
||||
// replace the current network
|
||||
Abc_FrameReplaceCurrentNetwork( pAbc, pNtkRes );
|
||||
return 0;
|
||||
|
||||
usage:
|
||||
fprintf( pErr, "usage: ifraig [-C num] [-vh]\n" );
|
||||
fprintf( pErr, "\t performs fraiging using a new method\n" );
|
||||
fprintf( pErr, "\t-C num : limit on the number of conflicts [default = %d]\n", nConfLimit );
|
||||
// fprintf( pErr, "\t-l : toggle preserving the number of levels [default = %s]\n", fUpdateLevel? "yes": "no" );
|
||||
fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" );
|
||||
fprintf( pErr, "\t-h : print the command usage\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Abc_CommandIProve( Abc_Frame_t * pAbc, int argc, char ** argv )
|
||||
{
|
||||
FILE * pOut, * pErr;
|
||||
Abc_Ntk_t * pNtk, * pNtkRes;
|
||||
int c, fUpdateLevel, fVerbose;
|
||||
|
||||
extern Abc_Ntk_t * Abc_NtkIvyProve( Abc_Ntk_t * pNtk );
|
||||
|
||||
pNtk = Abc_FrameReadNtk(pAbc);
|
||||
pOut = Abc_FrameReadOut(pAbc);
|
||||
|
|
@ -5484,7 +5663,7 @@ int Abc_CommandIFraig( Abc_Frame_t * pAbc, int argc, char ** argv )
|
|||
return 1;
|
||||
}
|
||||
|
||||
pNtkRes = Abc_NtkIvyFraig( pNtk );
|
||||
pNtkRes = Abc_NtkIvyProve( pNtk );
|
||||
if ( pNtkRes == NULL )
|
||||
{
|
||||
fprintf( pErr, "Command has failed.\n" );
|
||||
|
|
@ -5495,8 +5674,8 @@ int Abc_CommandIFraig( Abc_Frame_t * pAbc, int argc, char ** argv )
|
|||
return 0;
|
||||
|
||||
usage:
|
||||
fprintf( pErr, "usage: ifraig [-h]\n" );
|
||||
fprintf( pErr, "\t performs fraiging using a new method\n" );
|
||||
fprintf( pErr, "usage: iprove [-h]\n" );
|
||||
fprintf( pErr, "\t performs CEC using a new method\n" );
|
||||
// fprintf( pErr, "\t-l : toggle preserving the number of levels [default = %s]\n", fUpdateLevel? "yes": "no" );
|
||||
// fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" );
|
||||
fprintf( pErr, "\t-h : print the command usage\n");
|
||||
|
|
|
|||
|
|
@ -338,7 +338,7 @@ Abc_Ntk_t * Abc_NtkIvyResyn( Abc_Ntk_t * pNtk, int fUpdateLevel, int fVerbose )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Abc_Ntk_t * Abc_NtkIvyFraig( Abc_Ntk_t * pNtk )
|
||||
Abc_Ntk_t * Abc_NtkIvySat( Abc_Ntk_t * pNtk, int nConfLimit, int fVerbose )
|
||||
{
|
||||
Ivy_FraigParams_t Params, * pParams = &Params;
|
||||
Abc_Ntk_t * pNtkAig;
|
||||
|
|
@ -347,6 +347,38 @@ Abc_Ntk_t * Abc_NtkIvyFraig( Abc_Ntk_t * pNtk )
|
|||
if ( pMan == NULL )
|
||||
return NULL;
|
||||
Ivy_FraigParamsDefault( pParams );
|
||||
pParams->nBTLimitMiter = nConfLimit;
|
||||
pParams->fVerbose = fVerbose;
|
||||
// pMan = Ivy_FraigPerform( pTemp = pMan, pParams );
|
||||
pMan = Ivy_FraigMiter( pTemp = pMan, pParams );
|
||||
Ivy_ManStop( pTemp );
|
||||
pNtkAig = Abc_NtkIvyAfter( pNtk, pMan, 0, 0 );
|
||||
Ivy_ManStop( pMan );
|
||||
return pNtkAig;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Gives the current ABC network to AIG manager for processing.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Abc_Ntk_t * Abc_NtkIvyFraig( Abc_Ntk_t * pNtk, int nConfLimit, int fVerbose )
|
||||
{
|
||||
Ivy_FraigParams_t Params, * pParams = &Params;
|
||||
Abc_Ntk_t * pNtkAig;
|
||||
Ivy_Man_t * pMan, * pTemp;
|
||||
pMan = Abc_NtkIvyBefore( pNtk, 0, 0 );
|
||||
if ( pMan == NULL )
|
||||
return NULL;
|
||||
Ivy_FraigParamsDefault( pParams );
|
||||
pParams->nBTLimitNode = nConfLimit;
|
||||
pParams->fVerbose = fVerbose;
|
||||
pMan = Ivy_FraigPerform( pTemp = pMan, pParams );
|
||||
Ivy_ManStop( pTemp );
|
||||
pNtkAig = Abc_NtkIvyAfter( pNtk, pMan, 0, 0 );
|
||||
|
|
@ -354,6 +386,33 @@ Abc_Ntk_t * Abc_NtkIvyFraig( Abc_Ntk_t * pNtk )
|
|||
return pNtkAig;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Gives the current ABC network to AIG manager for processing.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Abc_Ntk_t * Abc_NtkIvyProve( Abc_Ntk_t * pNtk )
|
||||
{
|
||||
Ivy_FraigParams_t Params, * pParams = &Params;
|
||||
Abc_Ntk_t * pNtkAig;
|
||||
Ivy_Man_t * pMan, * pTemp;
|
||||
pMan = Abc_NtkIvyBefore( pNtk, 0, 0 );
|
||||
if ( pMan == NULL )
|
||||
return NULL;
|
||||
Ivy_FraigParamsDefault( pParams );
|
||||
pMan = Ivy_FraigProve( pTemp = pMan, pParams );
|
||||
Ivy_ManStop( pTemp );
|
||||
pNtkAig = Abc_NtkIvyAfter( pNtk, pMan, 0, 0 );
|
||||
Ivy_ManStop( pMan );
|
||||
return pNtkAig;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Gives the current ABC network to AIG manager for processing.]
|
||||
|
|
|
|||
|
|
@ -135,9 +135,8 @@ Abc_Ntk_t * Abc_NtkStrash( Abc_Ntk_t * pNtk, bool fAllNodes, bool fCleanup )
|
|||
Synopsis [Appends the second network to the first.]
|
||||
|
||||
Description [Modifies the first network by adding the logic of the second.
|
||||
Performs structural hashing while appending the networks. Does not add
|
||||
the COs of the second. Does not change the second network. Returns 0
|
||||
if the appending failed, 1 otherise.]
|
||||
Performs structural hashing while appending the networks. Does not change
|
||||
the second network. Returns 0 if the appending failed, 1 otherise.]
|
||||
|
||||
SideEffects []
|
||||
|
||||
|
|
@ -159,11 +158,15 @@ int Abc_NtkAppend( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int fAddPos )
|
|||
// check that the networks have the same PIs
|
||||
// reorder PIs of pNtk2 according to pNtk1
|
||||
if ( !Abc_NtkCompareSignals( pNtk1, pNtk2, 1, 1 ) )
|
||||
return 0;
|
||||
printf( "Abc_NtkAppend(): The union of the network PIs is computed (warning).\n" );
|
||||
// perform strashing
|
||||
Abc_NtkCleanCopy( pNtk2 );
|
||||
Abc_NtkForEachCi( pNtk2, pObj, i )
|
||||
pObj->pCopy = Abc_NtkCi(pNtk1, i);
|
||||
{
|
||||
pObj->pCopy = Abc_NtkFindCi(pNtk1, Abc_ObjName(pObj));
|
||||
if ( pObj->pCopy == NULL )
|
||||
pObj->pCopy = Abc_NtkDupObj(pNtk1, pObj, 1);
|
||||
}
|
||||
// add pNtk2 to pNtk1 while strashing
|
||||
if ( Abc_NtkIsLogic(pNtk2) )
|
||||
Abc_NtkStrashPerform( pNtk2, pNtk1, 1 );
|
||||
|
|
|
|||
|
|
@ -853,9 +853,16 @@ static lbool solver_search(solver* s, int nof_conflicts, int nof_learnts)
|
|||
|
||||
// reset the activities
|
||||
if ( s->factors )
|
||||
{
|
||||
s->var_inc = 1.0;
|
||||
for ( i = 0; i < s->size; i++ )
|
||||
{
|
||||
s->activity[i] = (double)s->factors[i];
|
||||
// if ( s->orderpos[i] != -1 )
|
||||
// order_update(s, i );
|
||||
}
|
||||
// s->activity[i] = 1.0;
|
||||
}
|
||||
|
||||
for (;;){
|
||||
clause* confl = solver_propagate(s);
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ extern void solver_delete(solver* s);
|
|||
|
||||
extern bool solver_addclause(solver* s, lit* begin, lit* end);
|
||||
extern bool solver_simplify(solver* s);
|
||||
extern int solver_solve(solver* s, lit* begin, lit* end, sint64 nConfLimit, sint64 nInsLimit );
|
||||
extern int solver_solve(solver* s, lit* begin, lit* end, sint64 nConfLimit, sint64 nInsLimit);
|
||||
extern int * solver_get_model( solver * p, int * pVars, int nVars );
|
||||
|
||||
extern int solver_nvars(solver* s);
|
||||
|
|
|
|||
|
|
@ -300,6 +300,7 @@ int Fraig_NodeIsEquivalent( Fraig_Man_t * p, Fraig_Node_t * pOld, Fraig_Node_t *
|
|||
{
|
||||
int RetValue, RetValue1, i, fComp, clk;
|
||||
int fVerbose = 0;
|
||||
int fSwitch = 0;
|
||||
|
||||
// make sure the nodes are not complemented
|
||||
assert( !Fraig_IsComplement(pNew) );
|
||||
|
|
@ -318,6 +319,7 @@ int Fraig_NodeIsEquivalent( Fraig_Man_t * p, Fraig_Node_t * pOld, Fraig_Node_t *
|
|||
if ( nBTLimit <= 10 )
|
||||
return 0;
|
||||
nBTLimit = (int)sqrt(nBTLimit);
|
||||
// fSwitch = 1;
|
||||
}
|
||||
|
||||
p->nSatCalls++;
|
||||
|
|
@ -417,6 +419,8 @@ PRT( "time", clock() - clk );
|
|||
// if ( pOld->fFailTfo || pNew->fFailTfo )
|
||||
// printf( "*" );
|
||||
// printf( "s(%d)", pNew->Level );
|
||||
if ( fSwitch )
|
||||
printf( "s(%d)", pNew->Level );
|
||||
p->nSatCounter++;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -433,6 +437,8 @@ p->time3 += clock() - clk;
|
|||
pOld->fFailTfo = 1;
|
||||
pNew->fFailTfo = 1;
|
||||
// p->nSatFails++;
|
||||
if ( fSwitch )
|
||||
printf( "T(%d)", pNew->Level );
|
||||
p->nSatFailsReal++;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -491,6 +497,8 @@ PRT( "time", clock() - clk );
|
|||
// if ( pOld->fFailTfo || pNew->fFailTfo )
|
||||
// printf( "*" );
|
||||
// printf( "s(%d)", pNew->Level );
|
||||
if ( fSwitch )
|
||||
printf( "s(%d)", pNew->Level );
|
||||
return 0;
|
||||
}
|
||||
else // if ( RetValue1 == MSAT_UNKNOWN )
|
||||
|
|
@ -500,6 +508,8 @@ p->time3 += clock() - clk;
|
|||
// if ( pOld->fFailTfo || pNew->fFailTfo )
|
||||
// printf( "*" );
|
||||
// printf( "T(%d)", pNew->Level );
|
||||
if ( fSwitch )
|
||||
printf( "T(%d)", pNew->Level );
|
||||
|
||||
// mark the node as the failed node
|
||||
pOld->fFailTfo = 1;
|
||||
|
|
@ -515,6 +525,10 @@ p->time3 += clock() - clk;
|
|||
// if ( pOld->fFailTfo || pNew->fFailTfo )
|
||||
// printf( "*" );
|
||||
// printf( "u(%d)", pNew->Level );
|
||||
|
||||
if ( fSwitch )
|
||||
printf( "u(%d)", pNew->Level );
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -128,8 +128,17 @@ struct Ivy_Man_t_
|
|||
|
||||
struct Ivy_FraigParams_t_
|
||||
{
|
||||
int nSimWords; // the number of words in the simulation info
|
||||
double SimSatur; // the ratio of refined classes when saturation is reached
|
||||
int nSimWords; // the number of words in the simulation info
|
||||
double SimSatur; // the ratio of refined classes when saturation is reached
|
||||
int fPatScores; // enables simulation pattern scoring
|
||||
int MaxScore; // max score after which resimulation is used
|
||||
int fVerbose; // verbose output
|
||||
int nBTLimitNode; // conflict limit at a node
|
||||
int nBTLimitMiter; // conflict limit at an output
|
||||
int nBTLimitGlobal; // conflict limit global
|
||||
int nInsLimitNode; // inspection limit at a node
|
||||
int nInsLimitMiter; // inspection limit at an output
|
||||
int nInsLimitGlobal; // inspection limit global
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -441,7 +450,9 @@ extern void Ivy_FastMapStop( Ivy_Man_t * pAig );
|
|||
extern void Ivy_FastMapReadSupp( Ivy_Man_t * pAig, Ivy_Obj_t * pObj, Vec_Int_t * vLeaves );
|
||||
extern void Ivy_FastMapReverseLevel( Ivy_Man_t * pAig );
|
||||
/*=== ivyFraig.c ==========================================================*/
|
||||
extern Ivy_Man_t * Ivy_FraigMiter( Ivy_Man_t * pManAig, Ivy_FraigParams_t * pParams );
|
||||
extern Ivy_Man_t * Ivy_FraigPerform( Ivy_Man_t * pManAig, Ivy_FraigParams_t * pParams );
|
||||
extern Ivy_Man_t * Ivy_FraigProve( Ivy_Man_t * pManAig, Ivy_FraigParams_t * pParams );
|
||||
extern void Ivy_FraigParamsDefault( Ivy_FraigParams_t * pParams );
|
||||
/*=== ivyHaig.c ==========================================================*/
|
||||
extern void Ivy_ManHaigStart( Ivy_Man_t * p, int fVerbose );
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,527 @@
|
|||
/**CFile****************************************************************
|
||||
|
||||
FileName [satMem.c]
|
||||
|
||||
PackageName [SAT solver.]
|
||||
|
||||
Synopsis [Memory management.]
|
||||
|
||||
Author [Alan Mishchenko <alanmi@eecs.berkeley.edu>]
|
||||
|
||||
Affiliation [UC Berkeley]
|
||||
|
||||
Date [Ver. 1.0. Started - January 1, 2004.]
|
||||
|
||||
Revision [$Id: satMem.c,v 1.0 2004/01/01 1:00:00 alanmi Exp $]
|
||||
|
||||
***********************************************************************/
|
||||
|
||||
#include "satMem.h"
|
||||
#include "extra.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// DECLARATIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
struct Sat_MmFixed_t_
|
||||
{
|
||||
// information about individual entries
|
||||
int nEntrySize; // the size of one entry
|
||||
int nEntriesAlloc; // the total number of entries allocated
|
||||
int nEntriesUsed; // the number of entries in use
|
||||
int nEntriesMax; // the max number of entries in use
|
||||
char * pEntriesFree; // the linked list of free entries
|
||||
|
||||
// this is where the memory is stored
|
||||
int nChunkSize; // the size of one chunk
|
||||
int nChunksAlloc; // the maximum number of memory chunks
|
||||
int nChunks; // the current number of memory chunks
|
||||
char ** pChunks; // the allocated memory
|
||||
|
||||
// statistics
|
||||
int nMemoryUsed; // memory used in the allocated entries
|
||||
int nMemoryAlloc; // memory allocated
|
||||
};
|
||||
|
||||
struct Sat_MmFlex_t_
|
||||
{
|
||||
// information about individual entries
|
||||
int nEntriesUsed; // the number of entries allocated
|
||||
char * pCurrent; // the current pointer to free memory
|
||||
char * pEnd; // the first entry outside the free memory
|
||||
|
||||
// this is where the memory is stored
|
||||
int nChunkSize; // the size of one chunk
|
||||
int nChunksAlloc; // the maximum number of memory chunks
|
||||
int nChunks; // the current number of memory chunks
|
||||
char ** pChunks; // the allocated memory
|
||||
|
||||
// statistics
|
||||
int nMemoryUsed; // memory used in the allocated entries
|
||||
int nMemoryAlloc; // memory allocated
|
||||
};
|
||||
|
||||
struct Sat_MmStep_t_
|
||||
{
|
||||
int nMems; // the number of fixed memory managers employed
|
||||
Sat_MmFixed_t ** pMems; // memory managers: 2^1 words, 2^2 words, etc
|
||||
int nMapSize; // the size of the memory array
|
||||
Sat_MmFixed_t ** pMap; // maps the number of bytes into its memory manager
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// FUNCTION DEFINITIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Allocates memory pieces of fixed size.]
|
||||
|
||||
Description [The size of the chunk is computed as the minimum of
|
||||
1024 entries and 64K. Can only work with entry size at least 4 byte long.]
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Sat_MmFixed_t * Sat_MmFixedStart( int nEntrySize )
|
||||
{
|
||||
Sat_MmFixed_t * p;
|
||||
|
||||
p = ALLOC( Sat_MmFixed_t, 1 );
|
||||
memset( p, 0, sizeof(Sat_MmFixed_t) );
|
||||
|
||||
p->nEntrySize = nEntrySize;
|
||||
p->nEntriesAlloc = 0;
|
||||
p->nEntriesUsed = 0;
|
||||
p->pEntriesFree = NULL;
|
||||
|
||||
if ( nEntrySize * (1 << 10) < (1<<16) )
|
||||
p->nChunkSize = (1 << 10);
|
||||
else
|
||||
p->nChunkSize = (1<<16) / nEntrySize;
|
||||
if ( p->nChunkSize < 8 )
|
||||
p->nChunkSize = 8;
|
||||
|
||||
p->nChunksAlloc = 64;
|
||||
p->nChunks = 0;
|
||||
p->pChunks = ALLOC( char *, p->nChunksAlloc );
|
||||
|
||||
p->nMemoryUsed = 0;
|
||||
p->nMemoryAlloc = 0;
|
||||
return p;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Sat_MmFixedStop( Sat_MmFixed_t * p, int fVerbose )
|
||||
{
|
||||
int i;
|
||||
if ( p == NULL )
|
||||
return;
|
||||
if ( fVerbose )
|
||||
{
|
||||
printf( "Fixed memory manager: Entry = %5d. Chunk = %5d. Chunks used = %5d.\n",
|
||||
p->nEntrySize, p->nChunkSize, p->nChunks );
|
||||
printf( " Entries used = %8d. Entries peak = %8d. Memory used = %8d. Memory alloc = %8d.\n",
|
||||
p->nEntriesUsed, p->nEntriesMax, p->nEntrySize * p->nEntriesUsed, p->nMemoryAlloc );
|
||||
}
|
||||
for ( i = 0; i < p->nChunks; i++ )
|
||||
free( p->pChunks[i] );
|
||||
free( p->pChunks );
|
||||
free( p );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
char * Sat_MmFixedEntryFetch( Sat_MmFixed_t * p )
|
||||
{
|
||||
char * pTemp;
|
||||
int i;
|
||||
|
||||
// check if there are still free entries
|
||||
if ( p->nEntriesUsed == p->nEntriesAlloc )
|
||||
{ // need to allocate more entries
|
||||
assert( p->pEntriesFree == NULL );
|
||||
if ( p->nChunks == p->nChunksAlloc )
|
||||
{
|
||||
p->nChunksAlloc *= 2;
|
||||
p->pChunks = REALLOC( char *, p->pChunks, p->nChunksAlloc );
|
||||
}
|
||||
p->pEntriesFree = ALLOC( char, p->nEntrySize * p->nChunkSize );
|
||||
p->nMemoryAlloc += p->nEntrySize * p->nChunkSize;
|
||||
// transform these entries into a linked list
|
||||
pTemp = p->pEntriesFree;
|
||||
for ( i = 1; i < p->nChunkSize; i++ )
|
||||
{
|
||||
*((char **)pTemp) = pTemp + p->nEntrySize;
|
||||
pTemp += p->nEntrySize;
|
||||
}
|
||||
// set the last link
|
||||
*((char **)pTemp) = NULL;
|
||||
// add the chunk to the chunk storage
|
||||
p->pChunks[ p->nChunks++ ] = p->pEntriesFree;
|
||||
// add to the number of entries allocated
|
||||
p->nEntriesAlloc += p->nChunkSize;
|
||||
}
|
||||
// incrememt the counter of used entries
|
||||
p->nEntriesUsed++;
|
||||
if ( p->nEntriesMax < p->nEntriesUsed )
|
||||
p->nEntriesMax = p->nEntriesUsed;
|
||||
// return the first entry in the free entry list
|
||||
pTemp = p->pEntriesFree;
|
||||
p->pEntriesFree = *((char **)pTemp);
|
||||
return pTemp;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Sat_MmFixedEntryRecycle( Sat_MmFixed_t * p, char * pEntry )
|
||||
{
|
||||
// decrement the counter of used entries
|
||||
p->nEntriesUsed--;
|
||||
// add the entry to the linked list of free entries
|
||||
*((char **)pEntry) = p->pEntriesFree;
|
||||
p->pEntriesFree = pEntry;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description [Relocates all the memory except the first chunk.]
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Sat_MmFixedRestart( Sat_MmFixed_t * p )
|
||||
{
|
||||
int i;
|
||||
char * pTemp;
|
||||
|
||||
// deallocate all chunks except the first one
|
||||
for ( i = 1; i < p->nChunks; i++ )
|
||||
free( p->pChunks[i] );
|
||||
p->nChunks = 1;
|
||||
// transform these entries into a linked list
|
||||
pTemp = p->pChunks[0];
|
||||
for ( i = 1; i < p->nChunkSize; i++ )
|
||||
{
|
||||
*((char **)pTemp) = pTemp + p->nEntrySize;
|
||||
pTemp += p->nEntrySize;
|
||||
}
|
||||
// set the last link
|
||||
*((char **)pTemp) = NULL;
|
||||
// set the free entry list
|
||||
p->pEntriesFree = p->pChunks[0];
|
||||
// set the correct statistics
|
||||
p->nMemoryAlloc = p->nEntrySize * p->nChunkSize;
|
||||
p->nMemoryUsed = 0;
|
||||
p->nEntriesAlloc = p->nChunkSize;
|
||||
p->nEntriesUsed = 0;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Sat_MmFixedReadMemUsage( Sat_MmFixed_t * p )
|
||||
{
|
||||
return p->nMemoryAlloc;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Allocates entries of flexible size.]
|
||||
|
||||
Description [Can only work with entry size at least 4 byte long.]
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Sat_MmFlex_t * Sat_MmFlexStart()
|
||||
{
|
||||
Sat_MmFlex_t * p;
|
||||
|
||||
p = ALLOC( Sat_MmFlex_t, 1 );
|
||||
memset( p, 0, sizeof(Sat_MmFlex_t) );
|
||||
|
||||
p->nEntriesUsed = 0;
|
||||
p->pCurrent = NULL;
|
||||
p->pEnd = NULL;
|
||||
|
||||
p->nChunkSize = (1 << 12);
|
||||
p->nChunksAlloc = 64;
|
||||
p->nChunks = 0;
|
||||
p->pChunks = ALLOC( char *, p->nChunksAlloc );
|
||||
|
||||
p->nMemoryUsed = 0;
|
||||
p->nMemoryAlloc = 0;
|
||||
return p;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Sat_MmFlexStop( Sat_MmFlex_t * p, int fVerbose )
|
||||
{
|
||||
int i;
|
||||
if ( p == NULL )
|
||||
return;
|
||||
if ( fVerbose )
|
||||
{
|
||||
printf( "Flexible memory manager: Chunk size = %d. Chunks used = %d.\n",
|
||||
p->nChunkSize, p->nChunks );
|
||||
printf( " Entries used = %d. Memory used = %d. Memory alloc = %d.\n",
|
||||
p->nEntriesUsed, p->nMemoryUsed, p->nMemoryAlloc );
|
||||
}
|
||||
for ( i = 0; i < p->nChunks; i++ )
|
||||
free( p->pChunks[i] );
|
||||
free( p->pChunks );
|
||||
free( p );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
char * Sat_MmFlexEntryFetch( Sat_MmFlex_t * p, int nBytes )
|
||||
{
|
||||
char * pTemp;
|
||||
// check if there are still free entries
|
||||
if ( p->pCurrent == NULL || p->pCurrent + nBytes > p->pEnd )
|
||||
{ // need to allocate more entries
|
||||
if ( p->nChunks == p->nChunksAlloc )
|
||||
{
|
||||
p->nChunksAlloc *= 2;
|
||||
p->pChunks = REALLOC( char *, p->pChunks, p->nChunksAlloc );
|
||||
}
|
||||
if ( nBytes > p->nChunkSize )
|
||||
{
|
||||
// resize the chunk size if more memory is requested than it can give
|
||||
// (ideally, this should never happen)
|
||||
p->nChunkSize = 2 * nBytes;
|
||||
}
|
||||
p->pCurrent = ALLOC( char, p->nChunkSize );
|
||||
p->pEnd = p->pCurrent + p->nChunkSize;
|
||||
p->nMemoryAlloc += p->nChunkSize;
|
||||
// add the chunk to the chunk storage
|
||||
p->pChunks[ p->nChunks++ ] = p->pCurrent;
|
||||
}
|
||||
assert( p->pCurrent + nBytes <= p->pEnd );
|
||||
// increment the counter of used entries
|
||||
p->nEntriesUsed++;
|
||||
// keep track of the memory used
|
||||
p->nMemoryUsed += nBytes;
|
||||
// return the next entry
|
||||
pTemp = p->pCurrent;
|
||||
p->pCurrent += nBytes;
|
||||
return pTemp;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Sat_MmFlexReadMemUsage( Sat_MmFlex_t * p )
|
||||
{
|
||||
return p->nMemoryAlloc;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Starts the hierarchical memory manager.]
|
||||
|
||||
Description [This manager can allocate entries of any size.
|
||||
Iternally they are mapped into the entries with the number of bytes
|
||||
equal to the power of 2. The smallest entry size is 8 bytes. The
|
||||
next one is 16 bytes etc. So, if the user requests 6 bytes, he gets
|
||||
8 byte entry. If we asks for 25 bytes, he gets 32 byte entry etc.
|
||||
The input parameters "nSteps" says how many fixed memory managers
|
||||
are employed internally. Calling this procedure with nSteps equal
|
||||
to 10 results in 10 hierarchically arranged internal memory managers,
|
||||
which can allocate up to 4096 (1Kb) entries. Requests for larger
|
||||
entries are handed over to malloc() and then free()ed.]
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Sat_MmStep_t * Sat_MmStepStart( int nSteps )
|
||||
{
|
||||
Sat_MmStep_t * p;
|
||||
int i, k;
|
||||
p = ALLOC( Sat_MmStep_t, 1 );
|
||||
p->nMems = nSteps;
|
||||
// start the fixed memory managers
|
||||
p->pMems = ALLOC( Sat_MmFixed_t *, p->nMems );
|
||||
for ( i = 0; i < p->nMems; i++ )
|
||||
p->pMems[i] = Sat_MmFixedStart( (8<<i) );
|
||||
// set up the mapping of the required memory size into the corresponding manager
|
||||
p->nMapSize = (4<<p->nMems);
|
||||
p->pMap = ALLOC( Sat_MmFixed_t *, p->nMapSize+1 );
|
||||
p->pMap[0] = NULL;
|
||||
for ( k = 1; k <= 4; k++ )
|
||||
p->pMap[k] = p->pMems[0];
|
||||
for ( i = 0; i < p->nMems; i++ )
|
||||
for ( k = (4<<i)+1; k <= (8<<i); k++ )
|
||||
p->pMap[k] = p->pMems[i];
|
||||
//for ( i = 1; i < 100; i ++ )
|
||||
//printf( "%10d: size = %10d\n", i, p->pMap[i]->nEntrySize );
|
||||
return p;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Stops the memory manager.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Sat_MmStepStop( Sat_MmStep_t * p, int fVerbose )
|
||||
{
|
||||
int i;
|
||||
for ( i = 0; i < p->nMems; i++ )
|
||||
Sat_MmFixedStop( p->pMems[i], fVerbose );
|
||||
free( p->pMems );
|
||||
free( p->pMap );
|
||||
free( p );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Creates the entry.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
char * Sat_MmStepEntryFetch( Sat_MmStep_t * p, int nBytes )
|
||||
{
|
||||
if ( nBytes == 0 )
|
||||
return NULL;
|
||||
if ( nBytes > p->nMapSize )
|
||||
{
|
||||
// printf( "Allocating %d bytes.\n", nBytes );
|
||||
return ALLOC( char, nBytes );
|
||||
}
|
||||
return Sat_MmFixedEntryFetch( p->pMap[nBytes] );
|
||||
}
|
||||
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Recycles the entry.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Sat_MmStepEntryRecycle( Sat_MmStep_t * p, char * pEntry, int nBytes )
|
||||
{
|
||||
if ( nBytes == 0 )
|
||||
return;
|
||||
if ( nBytes > p->nMapSize )
|
||||
{
|
||||
free( pEntry );
|
||||
return;
|
||||
}
|
||||
Sat_MmFixedEntryRecycle( p->pMap[nBytes], pEntry );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis []
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Sat_MmStepReadMemUsage( Sat_MmStep_t * p )
|
||||
{
|
||||
int i, nMemTotal = 0;
|
||||
for ( i = 0; i < p->nMems; i++ )
|
||||
nMemTotal += p->pMems[i]->nMemoryAlloc;
|
||||
return nMemTotal;
|
||||
}
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
/**CFile****************************************************************
|
||||
|
||||
FileName [satMem.h]
|
||||
|
||||
PackageName [SAT solver.]
|
||||
|
||||
Synopsis [Memory management.]
|
||||
|
||||
Author [Alan Mishchenko <alanmi@eecs.berkeley.edu>]
|
||||
|
||||
Affiliation [UC Berkeley]
|
||||
|
||||
Date [Ver. 1.0. Started - January 1, 2004.]
|
||||
|
||||
Revision [$Id: satMem.h,v 1.0 2004/01/01 1:00:00 alanmi Exp $]
|
||||
|
||||
***********************************************************************/
|
||||
|
||||
#ifndef __SAT_MEM_H__
|
||||
#define __SAT_MEM_H__
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// INCLUDES ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//#include "leaks.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// PARAMETERS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// STRUCTURE DEFINITIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
typedef struct Sat_MmFixed_t_ Sat_MmFixed_t;
|
||||
typedef struct Sat_MmFlex_t_ Sat_MmFlex_t;
|
||||
typedef struct Sat_MmStep_t_ Sat_MmStep_t;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// GLOBAL VARIABLES ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// MACRO DEFINITIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// FUNCTION DECLARATIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// fixed-size-block memory manager
|
||||
extern Sat_MmFixed_t * Sat_MmFixedStart( int nEntrySize );
|
||||
extern void Sat_MmFixedStop( Sat_MmFixed_t * p, int fVerbose );
|
||||
extern char * Sat_MmFixedEntryFetch( Sat_MmFixed_t * p );
|
||||
extern void Sat_MmFixedEntryRecycle( Sat_MmFixed_t * p, char * pEntry );
|
||||
extern void Sat_MmFixedRestart( Sat_MmFixed_t * p );
|
||||
extern int Sat_MmFixedReadMemUsage( Sat_MmFixed_t * p );
|
||||
// flexible-size-block memory manager
|
||||
extern Sat_MmFlex_t * Sat_MmFlexStart();
|
||||
extern void Sat_MmFlexStop( Sat_MmFlex_t * p, int fVerbose );
|
||||
extern char * Sat_MmFlexEntryFetch( Sat_MmFlex_t * p, int nBytes );
|
||||
extern int Sat_MmFlexReadMemUsage( Sat_MmFlex_t * p );
|
||||
// hierarchical memory manager
|
||||
extern Sat_MmStep_t * Sat_MmStepStart( int nSteps );
|
||||
extern void Sat_MmStepStop( Sat_MmStep_t * p, int fVerbose );
|
||||
extern char * Sat_MmStepEntryFetch( Sat_MmStep_t * p, int nBytes );
|
||||
extern void Sat_MmStepEntryRecycle( Sat_MmStep_t * p, char * pEntry, int nBytes );
|
||||
extern int Sat_MmStepReadMemUsage( Sat_MmStep_t * p );
|
||||
|
||||
#endif
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// END OF FILE ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
|
@ -26,6 +26,8 @@ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWA
|
|||
|
||||
#include "satSolver.h"
|
||||
|
||||
//#define ASAT_USE_SYSTEM_MEMORY_MANAGEMENT
|
||||
|
||||
//=================================================================================================
|
||||
// Debug:
|
||||
|
||||
|
|
@ -142,6 +144,7 @@ static inline void order_unassigned(sat_solver* s, int v) // undoorder
|
|||
orderpos[v] = veci_size(&s->order);
|
||||
veci_push(&s->order,v);
|
||||
order_update(s,v);
|
||||
//printf( "+%d ", v );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -202,6 +205,7 @@ static int order_select(sat_solver* s, float random_var_freq) // selectvar
|
|||
orderpos[heap[i]] = i;
|
||||
}
|
||||
|
||||
//printf( "-%d ", next );
|
||||
if (values[next] == l_Undef)
|
||||
return next;
|
||||
}
|
||||
|
|
@ -209,6 +213,21 @@ static int order_select(sat_solver* s, float random_var_freq) // selectvar
|
|||
return var_Undef;
|
||||
}
|
||||
|
||||
void sat_solver_order_clean(sat_solver* s) // removes all variables from the queue
|
||||
{
|
||||
while ( order_select(s, 0.0) != var_Undef );
|
||||
}
|
||||
|
||||
void sat_solver_order_unassigned(sat_solver* s, int v) // undoorder
|
||||
{
|
||||
order_unassigned(s, v);
|
||||
}
|
||||
|
||||
void sat_solver_order_update(sat_solver* s, int v) // updateorder
|
||||
{
|
||||
order_update(s, v);
|
||||
}
|
||||
|
||||
//=================================================================================================
|
||||
// Activity functions:
|
||||
|
||||
|
|
@ -232,6 +251,18 @@ static inline void act_var_bump(sat_solver* s, int v) {
|
|||
|
||||
}
|
||||
|
||||
void sat_solver_act_var_bump_factor(sat_solver* s, int v, double factor) {
|
||||
double* activity = s->activity;
|
||||
if ((activity[v] += s->var_inc * factor) > 1e100)
|
||||
act_var_rescale(s);
|
||||
|
||||
//printf("bump %d %f\n", v-1, activity[v]);
|
||||
|
||||
if (s->orderpos[v] != -1)
|
||||
order_update(s,v);
|
||||
|
||||
}
|
||||
|
||||
static inline void act_var_decay(sat_solver* s) { s->var_inc *= s->var_decay; }
|
||||
|
||||
static inline void act_clause_rescale(sat_solver* s) {
|
||||
|
|
@ -253,6 +284,7 @@ static inline void act_clause_bump(sat_solver* s, clause *c) {
|
|||
|
||||
static inline void act_clause_decay(sat_solver* s) { s->cla_inc *= s->cla_decay; }
|
||||
|
||||
double* sat_solver_activity(sat_solver* s) { return s->activity; }
|
||||
|
||||
//=================================================================================================
|
||||
// Clause functions:
|
||||
|
|
@ -268,7 +300,13 @@ static clause* clause_new(sat_solver* s, lit* begin, lit* end, int learnt)
|
|||
assert(end - begin > 1);
|
||||
assert(learnt >= 0 && learnt < 2);
|
||||
size = end - begin;
|
||||
c = (clause*)malloc(sizeof(clause) + sizeof(lit) * size + learnt * sizeof(float));
|
||||
// c = (clause*)malloc(sizeof(clause) + sizeof(lit) * size + learnt * sizeof(float));
|
||||
#ifdef ASAT_USE_SYSTEM_MEMORY_MANAGEMENT
|
||||
c = (clause*)malloc(sizeof(clause) + sizeof(lit) * size + learnt * sizeof(float));
|
||||
#else
|
||||
c = (clause*)Sat_MmStepEntryFetch( s->pMem, sizeof(clause) + sizeof(lit) * size + learnt * sizeof(float) );
|
||||
#endif
|
||||
|
||||
c->size_learnt = (size << 1) | learnt;
|
||||
assert(((unsigned int)c & 1) == 0);
|
||||
|
||||
|
|
@ -317,7 +355,11 @@ static void clause_remove(sat_solver* s, clause* c)
|
|||
s->stats.clauses_literals -= clause_size(c);
|
||||
}
|
||||
|
||||
#ifdef ASAT_USE_SYSTEM_MEMORY_MANAGEMENT
|
||||
free(c);
|
||||
#else
|
||||
Sat_MmStepEntryRecycle( s->pMem, (char *)c, sizeof(clause) + sizeof(lit) * clause_size(c) + clause_learnt(c) * sizeof(float) );
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -833,6 +875,16 @@ static lbool sat_solver_search(sat_solver* s, int nof_conflicts, int nof_learnts
|
|||
veci_delete(&learnt_clause);
|
||||
return l_Undef; }
|
||||
|
||||
if ( s->nConfLimit && s->stats.conflicts > s->nConfLimit ||
|
||||
s->nInsLimit && s->stats.inspects > s->nInsLimit )
|
||||
{
|
||||
// Reached bound on number of conflicts:
|
||||
s->progress_estimate = sat_solver_progress(s);
|
||||
sat_solver_canceluntil(s,s->root_level);
|
||||
veci_delete(&learnt_clause);
|
||||
return l_Undef;
|
||||
}
|
||||
|
||||
if (sat_solver_dlevel(s) == 0)
|
||||
// Simplify the set of problem clauses:
|
||||
sat_solver_simplify(s);
|
||||
|
|
@ -931,18 +983,27 @@ sat_solver* sat_solver_new(void)
|
|||
s->stats.max_literals = 0;
|
||||
s->stats.tot_literals = 0;
|
||||
|
||||
#ifdef ASAT_USE_SYSTEM_MEMORY_MANAGEMENT
|
||||
s->pMem = NULL;
|
||||
#else
|
||||
s->pMem = Sat_MmStepStart( 10 );
|
||||
#endif
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
void sat_solver_delete(sat_solver* s)
|
||||
{
|
||||
|
||||
#ifdef ASAT_USE_SYSTEM_MEMORY_MANAGEMENT
|
||||
int i;
|
||||
for (i = 0; i < vecp_size(&s->clauses); i++)
|
||||
free(vecp_begin(&s->clauses)[i]);
|
||||
|
||||
for (i = 0; i < vecp_size(&s->learnts); i++)
|
||||
free(vecp_begin(&s->learnts)[i]);
|
||||
#else
|
||||
Sat_MmStepStop( s->pMem, 0 );
|
||||
#endif
|
||||
|
||||
// delete vectors
|
||||
vecp_delete(&s->clauses);
|
||||
|
|
@ -1065,14 +1126,26 @@ bool sat_solver_simplify(sat_solver* s)
|
|||
}
|
||||
|
||||
|
||||
int sat_solver_solve(sat_solver* s, lit* begin, lit* end)
|
||||
int sat_solver_solve(sat_solver* s, lit* begin, lit* end, sint64 nConfLimit, sint64 nInsLimit, sint64 nConfLimitGlobal, sint64 nInsLimitGlobal)
|
||||
{
|
||||
double nof_conflicts = 100;
|
||||
double nof_learnts = sat_solver_nclauses(s) / 3;
|
||||
lbool status = l_Undef;
|
||||
lbool* values = s->assigns;
|
||||
lit* i;
|
||||
|
||||
|
||||
// set the external limits
|
||||
s->nConfLimit = 0;
|
||||
s->nInsLimit = 0;
|
||||
if ( nConfLimit )
|
||||
s->nConfLimit = s->stats.conflicts + nConfLimit;
|
||||
if ( nInsLimit )
|
||||
s->nInsLimit = s->stats.inspects + nInsLimit;
|
||||
if ( nConfLimitGlobal && s->nConfLimit > nConfLimitGlobal )
|
||||
s->nConfLimit = nConfLimitGlobal;
|
||||
if ( nInsLimitGlobal && s->nInsLimit > nInsLimitGlobal )
|
||||
s->nInsLimit = nInsLimitGlobal;
|
||||
|
||||
//printf("solve: "); printlits(begin, end); printf("\n");
|
||||
for (i = begin; i < end; i++){
|
||||
switch (lit_sign(*i) ? -values[lit_var(*i)] : values[lit_var(*i)]){
|
||||
|
|
@ -1117,6 +1190,18 @@ int sat_solver_solve(sat_solver* s, lit* begin, lit* end)
|
|||
status = sat_solver_search(s,(int)nof_conflicts, (int)nof_learnts);
|
||||
nof_conflicts *= 1.5;
|
||||
nof_learnts *= 1.1;
|
||||
|
||||
// quit the loop if reached an external limit
|
||||
if ( s->nConfLimit && s->stats.conflicts > s->nConfLimit )
|
||||
{
|
||||
// printf( "Reached the limit on the number of conflicts (%d).\n", s->nConfLimit );
|
||||
break;
|
||||
}
|
||||
if ( s->nInsLimit && s->stats.inspects > s->nInsLimit )
|
||||
{
|
||||
// printf( "Reached the limit on the number of implications (%d).\n", s->nInsLimit );
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (s->verbosity >= 1)
|
||||
printf("==============================================================================\n");
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWA
|
|||
#endif
|
||||
|
||||
#include "satVec.h"
|
||||
#include "satMem.h"
|
||||
|
||||
//=================================================================================================
|
||||
// Simple types:
|
||||
|
|
@ -70,7 +71,7 @@ extern void sat_solver_delete(sat_solver* s);
|
|||
|
||||
extern bool sat_solver_addclause(sat_solver* s, lit* begin, lit* end);
|
||||
extern bool sat_solver_simplify(sat_solver* s);
|
||||
extern int sat_solver_solve(sat_solver* s, lit* begin, lit* end);
|
||||
extern int sat_solver_solve(sat_solver* s, lit* begin, lit* end, sint64 nConfLimit, sint64 nInsLimit, sint64 nConfLimitGlobal, sint64 nInsLimitGlobal);
|
||||
|
||||
extern int sat_solver_nvars(sat_solver* s);
|
||||
extern int sat_solver_nclauses(sat_solver* s);
|
||||
|
|
@ -78,6 +79,13 @@ extern int sat_solver_nconflicts(sat_solver* s);
|
|||
|
||||
extern void sat_solver_setnvars(sat_solver* s,int n);
|
||||
|
||||
extern void sat_solver_order_clean(sat_solver* s);
|
||||
extern void sat_solver_order_unassigned(sat_solver* s, int v);
|
||||
extern void sat_solver_order_update(sat_solver* s, int v);
|
||||
|
||||
extern double* sat_solver_activity(sat_solver* s);
|
||||
extern void sat_solver_act_var_bump_factor(sat_solver* s, int v, double factor);
|
||||
|
||||
struct stats_t
|
||||
{
|
||||
sint64 starts, decisions, propagations, inspects, conflicts;
|
||||
|
|
@ -136,6 +144,11 @@ struct sat_solver_t
|
|||
int verbosity; // Verbosity level. 0=silent, 1=some progress report, 2=everything
|
||||
|
||||
stats stats;
|
||||
|
||||
sint64 nConfLimit; // external limit on the number of conflicts
|
||||
sint64 nInsLimit; // external limit on the number of implications
|
||||
|
||||
Sat_MmStep_t * pMem;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in New Issue