diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/base/abc/abc.h | 2 | ||||
-rw-r--r-- | src/base/abci/abc.c | 22 | ||||
-rw-r--r-- | src/base/abci/abcMiter.c | 4 | ||||
-rw-r--r-- | src/base/abci/abcVerify.c | 3 | ||||
-rw-r--r-- | src/sat/bsat/module.make | 1 | ||||
-rw-r--r-- | src/sat/bsat/satSolver2.c | 17 | ||||
-rw-r--r-- | src/sat/bsat/satSolver2.h | 11 |
7 files changed, 48 insertions, 12 deletions
diff --git a/src/base/abc/abc.h b/src/base/abc/abc.h index 2d3e7588..4b8a88eb 100644 --- a/src/base/abc/abc.h +++ b/src/base/abc/abc.h @@ -689,7 +689,7 @@ extern ABC_DLL Abc_Ntk_t * Abc_NtkMiterQuantifyPis( Abc_Ntk_t * pNtk ); extern ABC_DLL int Abc_NtkMiterIsConstant( Abc_Ntk_t * pMiter ); extern ABC_DLL void Abc_NtkMiterReport( Abc_Ntk_t * pMiter ); extern ABC_DLL Abc_Ntk_t * Abc_NtkFrames( Abc_Ntk_t * pNtk, int nFrames, int fInitial, int fVerbose ); -extern ABC_DLL int Abc_NtkCombinePos( Abc_Ntk_t * pNtk, int fAnd ); +extern ABC_DLL int Abc_NtkCombinePos( Abc_Ntk_t * pNtk, int fAnd, int fXor ); /*=== abcNames.c ====================================================*/ extern ABC_DLL char * Abc_ObjName( Abc_Obj_t * pNode ); extern ABC_DLL char * Abc_ObjAssignName( Abc_Obj_t * pObj, char * pName, char * pSuffix ); diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index b45fde8f..74525e26 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -6560,18 +6560,22 @@ int Abc_CommandOrPos( Abc_Frame_t * pAbc, int argc, char ** argv ) Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);//, * pNtkRes; int fReverse = 0; int fComb = 0; + int fXor = 0; int c; - extern int Abc_NtkCombinePos( Abc_Ntk_t * pNtk, int fAnd ); + extern int Abc_NtkCombinePos( Abc_Ntk_t * pNtk, int fAnd, int fXor ); // set defaults Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "rh" ) ) != EOF ) + while ( ( c = Extra_UtilGetopt( argc, argv, "rxh" ) ) != EOF ) { switch ( c ) { case 'r': fReverse ^= 1; break; + case 'x': + fXor ^= 1; + break; case 'c': fComb ^= 1; break; @@ -6612,7 +6616,7 @@ int Abc_CommandOrPos( Abc_Frame_t * pAbc, int argc, char ** argv ) } else { - if ( !Abc_NtkCombinePos( pNtk, 0 ) ) + if ( !Abc_NtkCombinePos( pNtk, 0, fXor ) ) { Abc_Print( -1, "ORing the POs has failed.\n" ); return 1; @@ -6626,9 +6630,10 @@ int Abc_CommandOrPos( Abc_Frame_t * pAbc, int argc, char ** argv ) return 0; usage: - Abc_Print( -2, "usage: orpos [-rh]\n" ); + Abc_Print( -2, "usage: orpos [-rxh]\n" ); Abc_Print( -2, "\t creates single-output miter by ORing the POs of the current network\n" ); Abc_Print( -2, "\t-r : performs the reverse transform (OR decomposition) [default = %s]\n", fReverse? "yes": "no" ); + Abc_Print( -2, "\t-x : toggles combining the PO using XOR [default = %s]\n", fXor? "yes": "no" ); Abc_Print( -2, "\t-h : print the command usage\n"); return 1; } @@ -6689,7 +6694,7 @@ int Abc_CommandAndPos( Abc_Frame_t * pAbc, int argc, char ** argv ) } // get the new network - if ( !Abc_NtkCombinePos( pNtk, 1 ) ) + if ( !Abc_NtkCombinePos( pNtk, 1, 0 ) ) { Abc_Print( -1, "ANDing the POs has failed.\n" ); return 1; @@ -22100,7 +22105,7 @@ int Abc_CommandBmcInter( Abc_Frame_t * pAbc, int argc, char ** argv ) { Abc_Ntk_t * pNtkNew = Abc_NtkDup( pNtk ); Abc_Print( 0, "All %d outputs will be ORed together.\n", Abc_NtkPoNum(pNtk) ); - if ( !Abc_NtkCombinePos( pNtkNew, 0 ) ) + if ( !Abc_NtkCombinePos( pNtkNew, 0, 0 ) ) { Abc_NtkDelete( pNtkNew ); Abc_Print( -1, "ORing outputs has failed.\n" ); @@ -32953,7 +32958,7 @@ usage: ***********************************************************************/ int Abc_CommandAbc9Test( Abc_Frame_t * pAbc, int argc, char ** argv ) { -// Gia_Man_t * pTemp = NULL; + Gia_Man_t * pTemp = NULL; int c, fVerbose = 0; int nFrames = 3; int fSwitch = 0; @@ -32973,6 +32978,7 @@ int Abc_CommandAbc9Test( Abc_Frame_t * pAbc, int argc, char ** argv ) // extern Gia_Man_t * Bmc_CexTarget( Gia_Man_t * p, int nFrames ); // extern void Gia_ManMuxProfiling( Gia_Man_t * p ); // extern Gia_Man_t * Mig_ManTest( Gia_Man_t * pGia ); + extern Gia_Man_t * Gia_ManInterTest( Gia_Man_t * p ); Extra_UtilGetoptReset(); while ( ( c = Extra_UtilGetopt( argc, argv, "Fsvh" ) ) != EOF ) @@ -33044,6 +33050,8 @@ int Abc_CommandAbc9Test( Abc_Frame_t * pAbc, int argc, char ** argv ) // Gia_ManMuxProfiling( pAbc->pGia ); // pTemp = Mig_ManTest( pAbc->pGia ); // Abc_FrameUpdateGia( pAbc, pTemp ); + pTemp = Gia_ManInterTest( pAbc->pGia ); + Abc_FrameUpdateGia( pAbc, pTemp ); return 0; usage: Abc_Print( -2, "usage: &test [-F num] [-svh]\n" ); diff --git a/src/base/abci/abcMiter.c b/src/base/abci/abcMiter.c index 8c5a4a83..747fe263 100644 --- a/src/base/abci/abcMiter.c +++ b/src/base/abci/abcMiter.c @@ -1148,7 +1148,7 @@ int Abc_NtkDemiter( Abc_Ntk_t * pNtk ) SeeAlso [] ***********************************************************************/ -int Abc_NtkCombinePos( Abc_Ntk_t * pNtk, int fAnd ) +int Abc_NtkCombinePos( Abc_Ntk_t * pNtk, int fAnd, int fXor ) { Abc_Obj_t * pNode, * pMiter; int i; @@ -1165,6 +1165,8 @@ int Abc_NtkCombinePos( Abc_Ntk_t * pNtk, int fAnd ) Abc_NtkForEachPo( pNtk, pNode, i ) if ( fAnd ) pMiter = Abc_AigAnd( (Abc_Aig_t *)pNtk->pManFunc, pMiter, Abc_ObjChild0(pNode) ); + else if ( fXor ) + pMiter = Abc_AigXor( (Abc_Aig_t *)pNtk->pManFunc, pMiter, Abc_ObjChild0(pNode) ); else pMiter = Abc_AigOr( (Abc_Aig_t *)pNtk->pManFunc, pMiter, Abc_ObjChild0(pNode) ); // remove the POs and their names diff --git a/src/base/abci/abcVerify.c b/src/base/abci/abcVerify.c index 7d9973b1..25d1d113 100644 --- a/src/base/abci/abcVerify.c +++ b/src/base/abci/abcVerify.c @@ -362,7 +362,6 @@ void Abc_NtkCecFraigPart( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds, in ***********************************************************************/ void Abc_NtkCecFraigPartAuto( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds, int fVerbose ) { - extern int Abc_NtkCombinePos( Abc_Ntk_t * pNtk, int fAnd ); extern Vec_Ptr_t * Abc_NtkPartitionSmart( Abc_Ntk_t * pNtk, int nPartSizeLimit, int fVerbose ); extern void Abc_NtkConvertCos( Abc_Ntk_t * pNtk, Vec_Int_t * vOuts, Vec_Ptr_t * vOnePtr ); @@ -416,7 +415,7 @@ void Abc_NtkCecFraigPartAuto( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds // get this part of the miter Abc_NtkConvertCos( pMiter, vOne, vOnePtr ); pMiterPart = Abc_NtkCreateConeArray( pMiter, vOnePtr, 0 ); - Abc_NtkCombinePos( pMiterPart, 0 ); + Abc_NtkCombinePos( pMiterPart, 0, 0 ); // check the miter for being constant RetValue = Abc_NtkMiterIsConstant( pMiterPart ); if ( RetValue == 0 ) diff --git a/src/sat/bsat/module.make b/src/sat/bsat/module.make index e54dc891..4e85bece 100644 --- a/src/sat/bsat/module.make +++ b/src/sat/bsat/module.make @@ -6,6 +6,7 @@ SRC += src/sat/bsat/satMem.c \ src/sat/bsat/satProof.c \ src/sat/bsat/satSolver.c \ src/sat/bsat/satSolver2.c \ + src/sat/bsat/satSolver2i.c \ src/sat/bsat/satStore.c \ src/sat/bsat/satTrace.c \ src/sat/bsat/satTruth.c \ diff --git a/src/sat/bsat/satSolver2.c b/src/sat/bsat/satSolver2.c index 84d59f62..96656b5b 100644 --- a/src/sat/bsat/satSolver2.c +++ b/src/sat/bsat/satSolver2.c @@ -169,6 +169,8 @@ static inline void proof_chain_start( sat_solver2* s, clause* c ) { if ( !s->fProofLogging ) return; + if ( s->pInt2 ) + s->tempInter = Int2_ManChainStart( s->pInt2, c ); if ( s->pPrf2 ) Prf_ManChainStart( s->pPrf2, c ); if ( s->pPrf1 ) @@ -186,6 +188,11 @@ static inline void proof_chain_resolve( sat_solver2* s, clause* cls, int Var ) { if ( !s->fProofLogging ) return; + if ( s->pInt2 ) + { + clause* c = cls ? cls : var_unit_clause( s, Var ); + s->tempInter = Int2_ManChainResolve( s->pInt2, c, s->tempInter, var_is_partA(s,Var) ); + } if ( s->pPrf2 ) { clause* c = cls ? cls : var_unit_clause( s, Var ); @@ -204,6 +211,12 @@ static inline int proof_chain_stop( sat_solver2* s ) { if ( !s->fProofLogging ) return 0; + if ( s->pInt2 ) + { + int h = s->tempInter; + s->tempInter = -1; + return h; + } if ( s->pPrf2 ) Prf_ManChainStop( s->pPrf2 ); if ( s->pPrf1 ) @@ -410,7 +423,7 @@ static int clause2_create_new(sat_solver2* s, lit* begin, lit* end, int learnt, assert( proof_id ); c->lbd = sat_clause_compute_lbd( s, c ); assert( clause_id(c) == veci_size(&s->act_clas) ); - if ( s->pPrf1 ) + if ( s->pPrf1 || s->pInt2 ) veci_push(&s->claProofs, proof_id); // veci_push(&s->act_clas, (1<<10)); veci_push(&s->act_clas, 0); @@ -1141,6 +1154,7 @@ sat_solver2* sat_solver2_new(void) // proof-logging veci_new(&s->claProofs); // s->pPrf1 = Vec_SetAlloc( 20 ); + s->tempInter = -1; // initialize clause pointers s->hLearntLast = -1; // the last learnt clause @@ -1244,6 +1258,7 @@ void sat_solver2_delete(sat_solver2* s) // veci_delete(&s->proofs); Vec_SetFree( s->pPrf1 ); Prf_ManStop( s->pPrf2 ); + Int2_ManStop( s->pInt2 ); // delete arrays if (s->vi != 0){ diff --git a/src/sat/bsat/satSolver2.h b/src/sat/bsat/satSolver2.h index d7d16d73..41dfc680 100644 --- a/src/sat/bsat/satSolver2.h +++ b/src/sat/bsat/satSolver2.h @@ -42,6 +42,7 @@ ABC_NAMESPACE_HEADER_START struct sat_solver2_t; typedef struct sat_solver2_t sat_solver2; +typedef struct Int2_Man_t_ Int2_Man_t; extern sat_solver2* sat_solver2_new(void); extern void sat_solver2_delete(sat_solver2* s); @@ -72,6 +73,14 @@ extern void * Sat_ProofInterpolant( sat_solver2 * s, void * pGloVars ); extern word * Sat_ProofInterpolantTruth( sat_solver2 * s, void * pGloVars ); extern void Sat_ProofCheck( sat_solver2 * s ); +// interpolation APIs +extern Int2_Man_t * Int2_ManStart( sat_solver2 * pSat, int * pGloVars, int nGloVars ); +extern void Int2_ManStop( Int2_Man_t * p ); +extern int Int2_ManChainStart( Int2_Man_t * p, clause * c ); +extern int Int2_ManChainResolve( Int2_Man_t * p, clause * c, int iLit, int varA ); +extern void * Int2_ManReadInterpolant( sat_solver2 * s ); + + //================================================================================================= // Solver representation: @@ -156,6 +165,8 @@ struct sat_solver2_t int hProofLast; // in proof-logging mode, the ID of the final conflict clause (conf_final) Prf_Man_t * pPrf2; // another proof manager double dPrfMemory; // memory used by the proof-logger + Int2_Man_t * pInt2; // interpolation manager + int tempInter; // temporary storage for the interpolant // statistics stats_t stats; |