Commit f9073474 by Alan Mishchenko

Enabling circuit solver in &fraig.

parent 90552653
...@@ -28931,7 +28931,7 @@ int Abc_CommandAbc9Fraig( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -28931,7 +28931,7 @@ int Abc_CommandAbc9Fraig( Abc_Frame_t * pAbc, int argc, char ** argv )
Cec_ManFraSetDefaultParams( pPars ); Cec_ManFraSetDefaultParams( pPars );
pPars->fSatSweeping = 1; pPars->fSatSweeping = 1;
Extra_UtilGetoptReset(); Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "WRILDCrmdwvh" ) ) != EOF ) while ( ( c = Extra_UtilGetopt( argc, argv, "WRILDCrmdcwvh" ) ) != EOF )
{ {
switch ( c ) switch ( c )
{ {
...@@ -29010,6 +29010,9 @@ int Abc_CommandAbc9Fraig( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -29010,6 +29010,9 @@ int Abc_CommandAbc9Fraig( Abc_Frame_t * pAbc, int argc, char ** argv )
case 'd': case 'd':
pPars->fDualOut ^= 1; pPars->fDualOut ^= 1;
break; break;
case 'c':
pPars->fRunCSat ^= 1;
break;
case 'w': case 'w':
pPars->fVeryVerbose ^= 1; pPars->fVeryVerbose ^= 1;
break; break;
...@@ -29030,7 +29033,7 @@ int Abc_CommandAbc9Fraig( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -29030,7 +29033,7 @@ int Abc_CommandAbc9Fraig( Abc_Frame_t * pAbc, int argc, char ** argv )
return 0; return 0;
usage: usage:
Abc_Print( -2, "usage: &fraig [-WRILDC <num>] [-rmdwvh]\n" ); Abc_Print( -2, "usage: &fraig [-WRILDC <num>] [-rmdcwvh]\n" );
Abc_Print( -2, "\t performs combinational SAT sweeping\n" ); Abc_Print( -2, "\t performs combinational SAT sweeping\n" );
Abc_Print( -2, "\t-W num : the number of simulation words [default = %d]\n", pPars->nWords ); Abc_Print( -2, "\t-W num : the number of simulation words [default = %d]\n", pPars->nWords );
Abc_Print( -2, "\t-R num : the number of simulation rounds [default = %d]\n", pPars->nRounds ); Abc_Print( -2, "\t-R num : the number of simulation rounds [default = %d]\n", pPars->nRounds );
...@@ -29041,6 +29044,7 @@ usage: ...@@ -29041,6 +29044,7 @@ usage:
Abc_Print( -2, "\t-r : toggle the use of AIG rewriting [default = %s]\n", pPars->fRewriting? "yes": "no" ); Abc_Print( -2, "\t-r : toggle the use of AIG rewriting [default = %s]\n", pPars->fRewriting? "yes": "no" );
Abc_Print( -2, "\t-m : toggle miter vs. any circuit [default = %s]\n", pPars->fCheckMiter? "miter": "circuit" ); Abc_Print( -2, "\t-m : toggle miter vs. any circuit [default = %s]\n", pPars->fCheckMiter? "miter": "circuit" );
Abc_Print( -2, "\t-d : toggle using double output miters [default = %s]\n", pPars->fDualOut? "yes": "no" ); Abc_Print( -2, "\t-d : toggle using double output miters [default = %s]\n", pPars->fDualOut? "yes": "no" );
Abc_Print( -2, "\t-c : toggle using circuit-based solver [default = %s]\n", pPars->fRunCSat? "yes": "no" );
Abc_Print( -2, "\t-w : toggle printing even more verbose information [default = %s]\n", pPars->fVeryVerbose? "yes": "no" ); Abc_Print( -2, "\t-w : toggle printing even more verbose information [default = %s]\n", pPars->fVeryVerbose? "yes": "no" );
Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", pPars->fVerbose? "yes": "no" ); Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", pPars->fVerbose? "yes": "no" );
Abc_Print( -2, "\t-h : print the command usage\n"); Abc_Print( -2, "\t-h : print the command usage\n");
...@@ -107,6 +107,7 @@ struct Cec_ParFra_t_ ...@@ -107,6 +107,7 @@ struct Cec_ParFra_t_
int fDualOut; // miter with separate outputs int fDualOut; // miter with separate outputs
int fColorDiff; // miter with separate outputs int fColorDiff; // miter with separate outputs
int fSatSweeping; // enable SAT sweeping int fSatSweeping; // enable SAT sweeping
int fRunCSat; // enable another solver
int fVeryVerbose; // verbose stats int fVeryVerbose; // verbose stats
int fVerbose; // verbose stats int fVerbose; // verbose stats
int iOutFail; // the failed output int iOutFail; // the failed output
......
...@@ -426,7 +426,10 @@ p->timeSim += Abc_Clock() - clk; ...@@ -426,7 +426,10 @@ p->timeSim += Abc_Clock() - clk;
break; break;
} }
clk = Abc_Clock(); clk = Abc_Clock();
Cec_ManSatSolve( pPat, pSrm, pParsSat ); if ( pPars->fRunCSat )
Cec_ManSatSolveCSat( pPat, pSrm, pParsSat );
else
Cec_ManSatSolve( pPat, pSrm, pParsSat );
p->timeSat += Abc_Clock() - clk; p->timeSat += Abc_Clock() - clk;
if ( Cec_ManFraClassesUpdate( p, pSim, pPat, pSrm ) ) if ( Cec_ManFraClassesUpdate( p, pSim, pPat, pSrm ) )
{ {
......
...@@ -190,6 +190,7 @@ extern Cec_ManFra_t * Cec_ManFraStart( Gia_Man_t * pAig, Cec_ParFra_t * p ...@@ -190,6 +190,7 @@ extern Cec_ManFra_t * Cec_ManFraStart( Gia_Man_t * pAig, Cec_ParFra_t * p
extern void Cec_ManFraStop( Cec_ManFra_t * p ); extern void Cec_ManFraStop( Cec_ManFra_t * p );
/*=== cecPat.c ============================================================*/ /*=== cecPat.c ============================================================*/
extern void Cec_ManPatSavePattern( Cec_ManPat_t * pPat, Cec_ManSat_t * p, Gia_Obj_t * pObj ); extern void Cec_ManPatSavePattern( Cec_ManPat_t * pPat, Cec_ManSat_t * p, Gia_Obj_t * pObj );
extern void Cec_ManPatSavePatternCSat( Cec_ManPat_t * pMan, Vec_Int_t * vPat );
extern Vec_Ptr_t * Cec_ManPatCollectPatterns( Cec_ManPat_t * pMan, int nInputs, int nWords ); extern Vec_Ptr_t * Cec_ManPatCollectPatterns( Cec_ManPat_t * pMan, int nInputs, int nWords );
extern Vec_Ptr_t * Cec_ManPatPackPatterns( Vec_Int_t * vCexStore, int nInputs, int nRegs, int nWordsInit ); extern Vec_Ptr_t * Cec_ManPatPackPatterns( Vec_Int_t * vCexStore, int nInputs, int nRegs, int nWordsInit );
/*=== cecSeq.c ============================================================*/ /*=== cecSeq.c ============================================================*/
...@@ -201,6 +202,7 @@ extern int Cec_ManCheckNonTrivialCands( Gia_Man_t * pAig ); ...@@ -201,6 +202,7 @@ extern int Cec_ManCheckNonTrivialCands( Gia_Man_t * pAig );
/*=== cecSolve.c ============================================================*/ /*=== cecSolve.c ============================================================*/
extern int Cec_ObjSatVarValue( Cec_ManSat_t * p, Gia_Obj_t * pObj ); extern int Cec_ObjSatVarValue( Cec_ManSat_t * p, Gia_Obj_t * pObj );
extern void Cec_ManSatSolve( Cec_ManPat_t * pPat, Gia_Man_t * pAig, Cec_ParSat_t * pPars ); extern void Cec_ManSatSolve( Cec_ManPat_t * pPat, Gia_Man_t * pAig, Cec_ParSat_t * pPars );
extern void Cec_ManSatSolveCSat( Cec_ManPat_t * pPat, Gia_Man_t * pAig, Cec_ParSat_t * pPars );
extern Vec_Str_t * Cec_ManSatSolveSeq( Vec_Ptr_t * vPatts, Gia_Man_t * pAig, Cec_ParSat_t * pPars, int nRegs, int * pnPats ); extern Vec_Str_t * Cec_ManSatSolveSeq( Vec_Ptr_t * vPatts, Gia_Man_t * pAig, Cec_ParSat_t * pPars, int nRegs, int * pnPats );
extern Vec_Int_t * Cec_ManSatSolveMiter( Gia_Man_t * pAig, Cec_ParSat_t * pPars, Vec_Str_t ** pvStatus ); extern Vec_Int_t * Cec_ManSatSolveMiter( Gia_Man_t * pAig, Cec_ParSat_t * pPars, Vec_Str_t ** pvStatus );
extern int Cec_ManSatCheckNode( Cec_ManSat_t * p, Gia_Obj_t * pObj ); extern int Cec_ManSatCheckNode( Cec_ManSat_t * p, Gia_Obj_t * pObj );
......
...@@ -360,20 +360,21 @@ void Cec_ManPatSavePattern( Cec_ManPat_t * pMan, Cec_ManSat_t * p, Gia_Obj_t * ...@@ -360,20 +360,21 @@ void Cec_ManPatSavePattern( Cec_ManPat_t * pMan, Cec_ManSat_t * p, Gia_Obj_t *
{ {
Vec_Int_t * vPat; Vec_Int_t * vPat;
int nPatLits; int nPatLits;
abctime clk, clkTotal = Abc_Clock(); abctime clkTotal = Abc_Clock();
// abctime clk;
assert( Gia_ObjIsCo(pObj) ); assert( Gia_ObjIsCo(pObj) );
pMan->nPats++; pMan->nPats++;
pMan->nPatsAll++; pMan->nPatsAll++;
// compute values in the cone of influence // compute values in the cone of influence
clk = Abc_Clock(); //clk = Abc_Clock();
Gia_ManIncrementTravId( p->pAig ); Gia_ManIncrementTravId( p->pAig );
nPatLits = Cec_ManPatComputePattern_rec( p, p->pAig, Gia_ObjFanin0(pObj) ); nPatLits = Cec_ManPatComputePattern_rec( p, p->pAig, Gia_ObjFanin0(pObj) );
assert( (Gia_ObjFanin0(pObj)->fMark1 ^ Gia_ObjFaninC0(pObj)) == 1 ); assert( (Gia_ObjFanin0(pObj)->fMark1 ^ Gia_ObjFaninC0(pObj)) == 1 );
pMan->nPatLits += nPatLits; pMan->nPatLits += nPatLits;
pMan->nPatLitsAll += nPatLits; pMan->nPatLitsAll += nPatLits;
pMan->timeFind += Abc_Clock() - clk; //pMan->timeFind += Abc_Clock() - clk;
// compute sensitizing path // compute sensitizing path
clk = Abc_Clock(); //clk = Abc_Clock();
Vec_IntClear( pMan->vPattern1 ); Vec_IntClear( pMan->vPattern1 );
Gia_ManIncrementTravId( p->pAig ); Gia_ManIncrementTravId( p->pAig );
Cec_ManPatComputePattern1_rec( p->pAig, Gia_ObjFanin0(pObj), pMan->vPattern1 ); Cec_ManPatComputePattern1_rec( p->pAig, Gia_ObjFanin0(pObj), pMan->vPattern1 );
...@@ -385,19 +386,26 @@ clk = Abc_Clock(); ...@@ -385,19 +386,26 @@ clk = Abc_Clock();
vPat = Vec_IntSize(pMan->vPattern1) < Vec_IntSize(pMan->vPattern2) ? pMan->vPattern1 : pMan->vPattern2; vPat = Vec_IntSize(pMan->vPattern1) < Vec_IntSize(pMan->vPattern2) ? pMan->vPattern1 : pMan->vPattern2;
pMan->nPatLitsMin += Vec_IntSize(vPat); pMan->nPatLitsMin += Vec_IntSize(vPat);
pMan->nPatLitsMinAll += Vec_IntSize(vPat); pMan->nPatLitsMinAll += Vec_IntSize(vPat);
pMan->timeShrink += Abc_Clock() - clk; //pMan->timeShrink += Abc_Clock() - clk;
// verify pattern using ternary simulation // verify pattern using ternary simulation
clk = Abc_Clock(); //clk = Abc_Clock();
Cec_ManPatVerifyPattern( p->pAig, pObj, vPat ); // Cec_ManPatVerifyPattern( p->pAig, pObj, vPat );
pMan->timeVerify += Abc_Clock() - clk; //pMan->timeVerify += Abc_Clock() - clk;
// sort pattern // sort pattern
clk = Abc_Clock(); //clk = Abc_Clock();
Vec_IntSort( vPat, 0 ); Vec_IntSort( vPat, 0 );
pMan->timeSort += Abc_Clock() - clk; //pMan->timeSort += Abc_Clock() - clk;
// save pattern // save pattern
Cec_ManPatStore( pMan, vPat ); Cec_ManPatStore( pMan, vPat );
pMan->timeTotal += Abc_Clock() - clkTotal; pMan->timeTotal += Abc_Clock() - clkTotal;
} }
void Cec_ManPatSavePatternCSat( Cec_ManPat_t * pMan, Vec_Int_t * vPat )
{
// sort pattern
Vec_IntSort( vPat, 0 );
// save pattern
Cec_ManPatStore( pMan, vPat );
}
/**Function************************************************************* /**Function*************************************************************
......
...@@ -735,6 +735,75 @@ clk2 = Abc_Clock(); ...@@ -735,6 +735,75 @@ clk2 = Abc_Clock();
Cec_ManSatStop( p ); Cec_ManSatStop( p );
} }
/**Function*************************************************************
Synopsis [Performs one round of solving for the POs of the AIG.]
Description [Labels the nodes that have been proved (pObj->fMark1)
and returns the set of satisfying assignments.]
SideEffects []
SeeAlso []
***********************************************************************/
int Cec_ManSatSolveExractPattern( Vec_Int_t * vCexStore, int iStart, Vec_Int_t * vPat )
{
int k, nSize;
Vec_IntClear( vPat );
// skip the output number
iStart++;
// get the number of items
nSize = Vec_IntEntry( vCexStore, iStart++ );
if ( nSize <= 0 )
return iStart;
// extract pattern
for ( k = 0; k < nSize; k++ )
Vec_IntPush( vPat, Vec_IntEntry( vCexStore, iStart++ ) );
return iStart;
}
void Cec_ManSatSolveCSat( Cec_ManPat_t * pPat, Gia_Man_t * pAig, Cec_ParSat_t * pPars )
{
Vec_Str_t * vStatus;
Vec_Int_t * vPat = Vec_IntAlloc( 1000 );
Vec_Int_t * vCexStore = Cbs_ManSolveMiterNc( pAig, pPars->nBTLimit, &vStatus, 0 );
Gia_Obj_t * pObj;
int i, status, iStart = 0;
assert( Vec_StrSize(vStatus) == Gia_ManCoNum(pAig) );
// reset the manager
if ( pPat )
{
pPat->iStart = Vec_StrSize(pPat->vStorage);
pPat->nPats = 0;
pPat->nPatLits = 0;
pPat->nPatLitsMin = 0;
}
Gia_ManForEachCo( pAig, pObj, i )
{
status = (int)Vec_StrEntry(vStatus, i);
pObj->fMark0 = (status == 0);
pObj->fMark1 = (status == 1);
if ( Vec_IntSize(vCexStore) > 0 && status != 1 )
iStart = Cec_ManSatSolveExractPattern( vCexStore, iStart, vPat );
if ( status != 0 )
continue;
// save the pattern
if ( pPat && Vec_IntSize(vPat) > 0 )
{
abctime clk3 = Abc_Clock();
Cec_ManPatSavePatternCSat( pPat, vPat );
pPat->timeTotalSave += Abc_Clock() - clk3;
}
// quit if one of them is solved
if ( pPars->fCheckMiter )
break;
}
assert( iStart == Vec_IntSize(vCexStore) );
Vec_IntFree( vPat );
Vec_StrFree( vStatus );
Vec_IntFree( vCexStore );
}
/**Function************************************************************* /**Function*************************************************************
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment