63 vId2Part = Vec_IntStart( Aig_ManObjNumMax(
p) );
83 int i, k, Counter = 0;
85 vId2Part = Vec_IntStart( Aig_ManObjNumMax(
p) );
87 Vec_IntWriteEntry( vId2Part, Aig_ObjId(pObj), Counter++/nPartSize );
88 Vec_VecFree( vNodes );
109 vId2Part = Vec_IntStart( Aig_ManObjNumMax(
p) );
114 Vec_IntWriteEntry( vId2Part, Aig_ObjId(pObj), Counter++/nPartSize );
120 Vec_IntWriteEntry( vId2Part, Aig_ObjId(pObj), Counter++/nPartSize );
122 Vec_PtrFree( vNodes );
139 if ( !Aig_ObjIsTravIdCurrent(
p, pObj ) )
141 Aig_ObjSetTravIdCurrent(
p, pObj );
155 Vec_IntPush( vPio2Id, Aig_ObjId(pObj) );
163 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
187 Aig_ObjSetTravIdCurrent(
p, pObj );
192 vPio2Id = Vec_IntAlloc( 100 );
201 Vec_IntPush( vPio2Id, Aig_ObjId(pObj) );
203 assert( Aig_ManNodeNum(pNew) == Vec_PtrSize(vNodes) );
232 int i, nodePart, nParts;
233 vAigs = Vec_PtrAlloc( 100 );
234 vPio2Id = Vec_PtrAlloc( 100 );
236 nParts = Vec_IntFindMax(vNode2Part) + 1;
238 vGroups = Vec_VecAlloc( nParts );
241 pObj = Aig_ManObj(
p, i );
242 if ( Aig_ObjIsNode(pObj) )
243 Vec_VecPush( vGroups, nodePart, pObj );
249 pDriver = Aig_ObjFanin0(pObj);
250 if ( Aig_ObjIsCi(pDriver) )
252 if ( Aig_ObjFaninC0(pObj) )
262 if ( Vec_PtrSize(vNodes) == 0 )
264 printf(
"Aig_ManPartSplit(): Skipping partition # %d without nodes (warning).\n", i );
268 Vec_PtrPush( vPio2Id, vPio2IdOne );
269 Vec_PtrPush( vAigs, pAig );
271 Vec_VecFree( vGroups );
274 vPart2Pos = Vec_VecStart( Vec_PtrSize(vAigs) );
277 pDriver = Aig_ObjFanin0(pObj);
278 if ( Aig_ObjIsCi(pDriver) )
281 Vec_VecPush( vPart2Pos, Vec_IntEntry(vNode2Part, Aig_ObjFaninId0(pObj)), pObj );
323 Aig_ManConst1(pPart)->fPhase = 1;
326 pObjInit = Aig_ManObj(
p, Vec_IntEntry(vPio2Id, i) );
330 pObj->
fPhase = (Aig_ObjFanin0(pObj)->fPhase ^ Aig_ObjFaninC0(pObj)) & (Aig_ObjFanin1(pObj)->fPhase ^ Aig_ObjFaninC1(pObj));
333 pObjInit = Aig_ManObj(
p, Vec_IntEntry(vPio2Id, Aig_ManCiNum(pPart) + i) );
334 pObj->
fPhase = (Aig_ObjFanin0(pObj)->fPhase ^ Aig_ObjFaninC0(pObj));
357 vPisIds = Vec_IntAlloc( Aig_ManCiNum(
p) );
359 Vec_IntPush( vPisIds, Vec_IntEntry(vNode2Var, Aig_ObjId(pObj)) );
362 Vec_IntFree( vPisIds );
384 int i, Lits[2], iSatVarOld, iNodeIdOld;
386 pCnf =
Cnf_Derive( pAig, Aig_ManCoNum(pAig) );
401 iNodeIdOld = Vec_IntEntry( vPioIds, i );
402 iSatVarOld = Vec_IntEntry( vNode2Var, iNodeIdOld );
403 if ( iSatVarOld == 0 )
406 Vec_IntWriteEntry( vNode2Var, iNodeIdOld, pCnf->
pVarNums[Aig_ObjId(pObj)] );
410 Lits[0] = toLitCond( iSatVarOld, 0 );
411 Lits[1] = toLitCond( pCnf->
pVarNums[Aig_ObjId(pObj)], 1 );
414 Lits[0] = toLitCond( iSatVarOld, 1 );
415 Lits[1] = toLitCond( pCnf->
pVarNums[Aig_ObjId(pObj)], 0 );
422 iNodeIdOld = Vec_IntEntry( vPioIds, Aig_ManCiNum(pAig) + i );
423 iSatVarOld = Vec_IntEntry( vNode2Var, iNodeIdOld );
424 if ( iSatVarOld == 0 )
427 Vec_IntWriteEntry( vNode2Var, iNodeIdOld, pCnf->
pVarNums[Aig_ObjId(pObj)] );
431 Lits[0] = toLitCond( iSatVarOld, 0 );
432 Lits[1] = toLitCond( pCnf->
pVarNums[Aig_ObjId(pObj)], 1 );
435 Lits[0] = toLitCond( iSatVarOld, 1 );
436 Lits[1] = toLitCond( pCnf->
pVarNums[Aig_ObjId(pObj)], 0 );
441 if ( Vec_IntEntry( vNode2Var, 0 ) == 0 )
442 Vec_IntWriteEntry( vNode2Var, 0, pCnf->
pVarNums[0] );
448 iNodeIdOld = Aig_ObjFaninId0( pObj );
449 iSatVarOld = Vec_IntEntry( vNode2Var, iNodeIdOld );
450 assert( iSatVarOld != 0 );
452 Lits[0] = toLitCond( iSatVarOld, Aig_ObjFaninC0(pObj) );
454 if ( fAlignPol && Aig_ObjFanin0(pObj)->fPhase )
455 Lits[0] = lit_neg( Lits[0] );
467 iNodeIdOld = Vec_IntEntry( vPioIds, i );
468 iSatVarOld = Vec_IntEntry( vNode2Var, iNodeIdOld );
469 Lits[0] = toLitCond( iSatVarOld, pObj->
fMarkA );
492 int nConfPart,
int nConfTotal,
int fAlignPol,
int fSynthesize,
int fVerbose )
499 int nConfRemaining = nConfTotal, nNodes = 0;
500 int i, status, RetValue = -1;
520 printf(
"Unknown partitioning algorithm.\n" );
526 printf(
"Partitioning derived %d partitions. ", Vec_IntFindMax(vNode2Part) + 1 );
527 ABC_PRT(
"Time", Abc_Clock() - clk );
534 Vec_IntFree( vNode2Part );
538 printf(
"Partions were transformed into AIGs. " );
539 ABC_PRT(
"Time", Abc_Clock() - clk );
547 Vec_PtrWriteEntry( vAigs, i, pAig );
555 vNode2Var = Vec_IntStart( Aig_ManObjNumMax(
p) );
568 Vec_VecEntryInt(vPio2Id,i), Vec_VecEntry(vPart2Pos,i), fAlignPol ) )
574 status =
sat_solver_solve( pSat, NULL, NULL, (ABC_INT64_T)nConfRemaining, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
577 printf(
"%4d : Aig = %6d. Vs = %7d. RootCs = %7d. LearnCs = %6d. ",
580ABC_PRT(
"Time", Abc_Clock() - clk );
588 else if ( status ==
l_True )
593 if ( nConfRemaining <= 0 )
595 printf(
"Exceeded the limit on the total number of conflicts (%d).\n", nConfTotal );
605 Vec_PtrFree( vAigs );
606 Vec_VecFree( vPio2Id );
607 Vec_VecFree( vPart2Pos );
608 Vec_IntFree( vNode2Var );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_NAMESPACE_IMPL_START Aig_Man_t * Dar_ManRwsat(Aig_Man_t *pAig, int fBalance, int fVerbose)
DECLARATIONS ///.
Vec_Int_t * Aig_ManPartitionLevelized(Aig_Man_t *p, int nPartSize)
void Aig_ManPartSetNodePolarity(Aig_Man_t *p, Aig_Man_t *pPart, Vec_Int_t *vPio2Id)
Vec_Ptr_t * Aig_ManPartSplit(Aig_Man_t *p, Vec_Int_t *vNode2Part, Vec_Ptr_t **pvPio2Id, Vec_Ptr_t **pvPart2Pos)
void Aig_ManPartResetNodePolarity(Aig_Man_t *pPart)
int Aig_ManAddNewCnfToSolver(sat_solver *pSat, Aig_Man_t *pAig, Vec_Int_t *vNode2Var, Vec_Int_t *vPioIds, Vec_Ptr_t *vPartPos, int fAlignPol)
void Aig_ManDeriveCounterExample(Aig_Man_t *p, Vec_Int_t *vNode2Var, sat_solver *pSat)
int Aig_ManPartitionedSat(Aig_Man_t *p, int nAlgo, int nPartSize, int nConfPart, int nConfTotal, int fAlignPol, int fSynthesize, int fVerbose)
Vec_Int_t * Aig_ManPartitionDfs(Aig_Man_t *p, int nPartSize, int fPreorder)
Aig_Man_t * Aig_ManPartSplitOne(Aig_Man_t *p, Vec_Ptr_t *vNodes, Vec_Int_t **pvPio2Id)
void Aig_ManPartSplitOne_rec(Aig_Man_t *pNew, Aig_Man_t *p, Aig_Obj_t *pObj, Vec_Int_t *vPio2Id)
Vec_Int_t * Aig_ManPartitionMonolithic(Aig_Man_t *p)
FUNCTION DEFINITIONS ///.
#define Aig_ManForEachObj(p, pObj, i)
void Aig_ManStop(Aig_Man_t *p)
void Aig_ManIncrementTravId(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
struct Aig_Obj_t_ Aig_Obj_t
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
#define Aig_ManForEachNode(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
Vec_Vec_t * Aig_ManLevelize(Aig_Man_t *p)
#define Aig_ManForEachCo(p, pObj, i)
Vec_Ptr_t * Aig_ManDfs(Aig_Man_t *p, int fNodesOnly)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
Vec_Ptr_t * Aig_ManDfsPreorder(Aig_Man_t *p, int fNodesOnly)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define sat_solver_addclause
Cnf_Dat_t * Cnf_Derive(Aig_Man_t *pAig, int nOutputs)
void Cnf_DataTranformPolarity(Cnf_Dat_t *pCnf, int fTransformPos)
#define Cnf_CnfForClause(p, pBeg, pEnd, i)
MACRO DEFINITIONS ///.
struct Cnf_Dat_t_ Cnf_Dat_t
void Cnf_DataFree(Cnf_Dat_t *p)
void Cnf_DataLift(Cnf_Dat_t *p, int nVarsPlus)
sat_solver * sat_solver_new(void)
void sat_solver_setnvars(sat_solver *s, int n)
int sat_solver_nvars(sat_solver *s)
void sat_solver_delete(sat_solver *s)
int * Sat_SolverGetModel(sat_solver *p, int *pVars, int nVars)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_PtrForEachEntryReverse(Type, vVec, pEntry, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
#define Vec_VecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
#define Vec_VecForEachEntryReverseReverse(Type, vGlob, pEntry, i, k)
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.