48 if ( Aig_ObjIsTravIdCurrent(pAig, pObj) )
50 Aig_ObjSetTravIdCurrent( pAig, pObj );
51 assert( Llb_ObjBddVar(vOrder, pObj) < 0 );
52 if ( Aig_ObjIsCi(pObj) )
54 Vec_IntWriteEntry( vOrder, Aig_ObjId(pObj), (*pCounter)++ );
58 pFanin0 = Aig_ObjFanin0(pObj);
59 pFanin1 = Aig_ObjFanin1(pObj);
71 if ( fSaveAll || pObj->
fMarkA )
72 Vec_IntWriteEntry( vOrder, Aig_ObjId(pObj), (*pCounter)++ );
92 vOrder = Vec_IntStartFull( Aig_ManObjNumMax(pAig) );
94 Aig_ObjSetTravIdCurrent( pAig, Aig_ManConst1(pAig) );
97 Vec_IntWriteEntry( vOrder, Aig_ObjId(pObj), Counter++ );
101 if ( Llb_ObjBddVar(vOrder, pObj) < 0 )
102 Vec_IntWriteEntry( vOrder, Aig_ObjId(pObj), Counter++ );
105 *pCounter = Counter - Aig_ManCiNum(pAig) - Aig_ManCoNum(pAig);
124 DdNode * bFunc0, * bFunc1, * bFunc;
126 int i, Counter = 0, Counter1 = 0;
127 dd = Cudd_Init( Aig_ManObjNumMax(pAig), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
131 pObj->
pData = Cudd_bddIthVar( dd, Llb_ObjBddVar(vOrder, pObj) );
144 bFunc0 = Cudd_NotCond( (DdNode *)Aig_ObjFanin0(pObj)->pData, Aig_ObjFaninC0(pObj) );
145 bFunc1 = Cudd_NotCond( (DdNode *)Aig_ObjFanin1(pObj)->pData, Aig_ObjFaninC1(pObj) );
146 bFunc = Cudd_bddAnd( dd, bFunc0, bFunc1 ); Cudd_Ref( bFunc );
147 if ( Cudd_DagSize(bFunc) > nBddLimit )
153 Cudd_RecursiveDeref( dd, bFunc );
154 if ( Cudd_DagSize(bFunc0) >= Cudd_DagSize(bFunc1) )
156 Cudd_RecursiveDeref( dd, (DdNode *)Aig_ObjFanin0(pObj)->pData );
157 bFunc = Cudd_bddIthVar( dd, Llb_ObjBddVar(vOrder, Aig_ObjFanin0(pObj)) );
158 Aig_ObjFanin0(pObj)->pData = bFunc; Cudd_Ref( bFunc );
159 Aig_ObjFanin0(pObj)->fMarkA = 1;
166 Cudd_RecursiveDeref( dd, (DdNode *)Aig_ObjFanin1(pObj)->pData );
167 bFunc = Cudd_bddIthVar( dd, Llb_ObjBddVar(vOrder, Aig_ObjFanin1(pObj)) );
168 Aig_ObjFanin1(pObj)->pData = bFunc; Cudd_Ref( bFunc );
169 Aig_ObjFanin1(pObj)->fMarkA = 1;
175 bFunc0 = Cudd_NotCond( (DdNode *)Aig_ObjFanin0(pObj)->pData, Aig_ObjFaninC0(pObj) );
176 bFunc1 = Cudd_NotCond( (DdNode *)Aig_ObjFanin1(pObj)->pData, Aig_ObjFaninC1(pObj) );
177 bFunc = Cudd_bddAnd( dd, bFunc0, bFunc1 ); Cudd_Ref( bFunc );
190 Cudd_RecursiveDeref( dd, (DdNode *)pObj->
pData );
194 printf(
"Added %d cut points. Used %d high fanout points.\n", Counter, Counter1 );
195 return Counter + Counter1;
211 DdNode * bBdd, * bBdd0, * bBdd1, * bPart, * vVar;
212 if ( Aig_ObjIsConst1(pObj) )
213 return Cudd_ReadOne(dd);
214 if ( Aig_ObjIsCi(pObj) )
215 return Cudd_bddIthVar( dd, Llb_ObjBddVar(vOrder, pObj) );
217 return (DdNode *)pObj->
pData;
218 if ( Aig_ObjIsCo(pObj) )
221 bPart = Cudd_bddXnor( dd, Cudd_bddIthVar( dd, Llb_ObjBddVar(vOrder, pObj) ), bBdd0 ); Cudd_Ref( bPart );
222 Vec_PtrPush( vRoots, bPart );
227 bBdd = Cudd_bddAnd( dd, bBdd0, bBdd1 ); Cudd_Ref( bBdd );
228 if ( Llb_ObjBddVar(vOrder, pObj) >= 0 )
230 vVar = Cudd_bddIthVar( dd, Llb_ObjBddVar(vOrder, pObj) );
231 bPart = Cudd_bddXnor( dd, vVar, bBdd ); Cudd_Ref( bPart );
232 Vec_PtrPush( vRoots, bPart );
233 Cudd_RecursiveDeref( dd, bBdd );
234 bBdd = vVar; Cudd_Ref( vVar );
257 vRoots = Vec_PtrAlloc( 100 );
270 Cudd_RecursiveDeref( dd, (DdNode *)pObj->
pData );
288 DdNode * bRes, * bVar, * bTemp;
291 TimeStop = dd->TimeStop; dd->TimeStop = 0;
292 bRes = Cudd_ReadOne( dd ); Cudd_Ref( bRes );
295 bVar = Cudd_bddIthVar( dd, Llb_ObjBddVar(vOrder, pObj) );
296 bRes = Cudd_bddAnd( dd, bTemp = bRes, Cudd_Not(bVar) ); Cudd_Ref( bRes );
297 Cudd_RecursiveDeref( dd, bTemp );
300 dd->TimeStop = TimeStop;
301 return Cudd_Not(bRes);
320 vVars2Q = Vec_IntAlloc( 0 );
321 Vec_IntFill( vVars2Q, Aig_ManObjNumMax(pAig), 1 );
324 Vec_IntWriteEntry( vVars2Q, Llb_ObjBddVar(vOrder, pObj), 0 );
328 Vec_IntWriteEntry( vVars2Q, Llb_ObjBddVar(vOrder, pObj), 0 );
348 Cudd_RecursiveDeref( dd, bFunc );
349 Vec_PtrFree( vParts );
367 printf(
"(%d) ", Vec_PtrSize(vFuncs) );
369 printf(
"%d ", Cudd_DagSize(bFunc) );
389 DdNode * bMonitor, * bImage;
393 dd = Cudd_Init( nVars, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
399 Cudd_AutodynEnable( dd, CUDD_REORDER_SYMM_SIFT );
400 bImage =
Llb_Nonlin4Image( dd, vParts, bMonitor, vVars2Q ); Cudd_Ref( bImage );
401 Cudd_RecursiveDeref( dd, bMonitor );
403 Vec_IntFree( vVars2Q );
428 dd = Cudd_Init( nVars, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
434 Cudd_AutodynEnable( dd, CUDD_REORDER_SYMM_SIFT );
445 Vec_IntFree( vVars2Q );
465 int nSuppAll = 0, nSuppPi = 0, nSuppPo = 0, nSuppLi = 0, nSuppLo = 0, nSuppAnd = 0;
472 if ( Llb_ObjBddVar(vOrder, pObj) < 0 )
475 if ( pSupp[Llb_ObjBddVar(vOrder, pObj)] == 0 )
477 if ( Aig_ObjIsNode(pObj) )
478 Vec_IntWriteEntry( vOrder, Aig_ObjId(pObj), -1 );
482 if ( Saig_ObjIsPi(pAig, pObj) )
484 else if ( Saig_ObjIsLo(pAig, pObj) )
486 else if ( Saig_ObjIsPo(pAig, pObj) )
488 else if ( Saig_ObjIsLi(pAig, pObj) )
497 printf(
"Groups =%3d ", Vec_PtrSize(vGroups) );
498 printf(
"Variables: all =%4d ", nSuppAll );
499 printf(
"pi =%4d ", nSuppPi );
500 printf(
"po =%4d ", nSuppPo );
501 printf(
"lo =%4d ", nSuppLo );
502 printf(
"li =%4d ", nSuppLi );
503 printf(
"and =%4d", nSuppAnd );
522 DdManager * ddBad, * ddWork;
525 int Counter, nCutPoints;
530 assert( Counter == Aig_ManNodeNum(pAig) );
533 Vec_IntFree( vOrder );
536 assert( Counter == nCutPoints );
541 ddWork =
Llb4_Nonlin4SweepGroups( pAig, vOrder, nCutPoints + Aig_ManCiNum(pAig) + Aig_ManCoNum(pAig), &vGroups, nClusterMax, fVerbose );
544 ddWork->bFunc = Cudd_bddTransfer( ddBad, ddWork, ddBad->bFunc ); Cudd_Ref( ddWork->bFunc );
545 Cudd_RecursiveDeref( ddBad, ddBad->bFunc ); ddBad->bFunc = NULL;
578 Cudd_RecursiveDeref( dd, dd->bFunc );
580 Vec_IntFree( vOrder );
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManCleanMarkA(Aig_Man_t *p)
#define Aig_ManForEachObj(p, pObj, i)
void Aig_ManIncrementTravId(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
struct Aig_Obj_t_ Aig_Obj_t
#define Aig_ManForEachNode(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
#define Aig_ManForEachCo(p, pObj, i)
void Aig_ManCleanData(Aig_Man_t *p)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
DdNode * Llb_Nonlin4Image(DdManager *dd, Vec_Ptr_t *vParts, DdNode *bCurrent, Vec_Int_t *vVars2Q)
Vec_Ptr_t * Llb_Nonlin4Group(DdManager *dd, Vec_Ptr_t *vParts, Vec_Int_t *vVars2Q, int nSizeMax)
DdNode * Llb4_Nonlin4SweepBadMonitor(Aig_Man_t *pAig, Vec_Int_t *vOrder, DdManager *dd)
DdNode * Llb_Nonlin4SweepPartitions_rec(DdManager *dd, Aig_Obj_t *pObj, Vec_Int_t *vOrder, Vec_Ptr_t *vRoots)
DdManager * Llb4_Nonlin4SweepGroups(Aig_Man_t *pAig, Vec_Int_t *vOrder, int nVars, Vec_Ptr_t **pvGroups, int nBddLimitClp, int fVerbose)
Vec_Int_t * Llb_Nonlin4SweepVars2Q(Aig_Man_t *pAig, Vec_Int_t *vOrder, int fAddLis)
void Llb_Nonlin4SweepPrint(Vec_Ptr_t *vFuncs)
void Llb_Nonlin4SweepPrintSuppProfile(DdManager *dd, Aig_Man_t *pAig, Vec_Int_t *vOrder, Vec_Ptr_t *vGroups, int fVerbose)
DdManager * Llb4_Nonlin4SweepBadStates(Aig_Man_t *pAig, Vec_Int_t *vOrder, int nVars)
void Llb4_Nonlin4SweepExperiment(Aig_Man_t *pAig)
int Llb4_Nonlin4SweepCutpoints(Aig_Man_t *pAig, Vec_Int_t *vOrder, int nBddLimit, int fVerbose)
Vec_Ptr_t * Llb_Nonlin4SweepPartitions(DdManager *dd, Aig_Man_t *pAig, Vec_Int_t *vOrder, int fTransition)
void Llb4_Nonlin4Sweep(Aig_Man_t *pAig, int nSweepMax, int nClusterMax, DdManager **pdd, Vec_Int_t **pvOrder, Vec_Ptr_t **pvGroups, int fVerbose)
ABC_NAMESPACE_IMPL_START void Llb_Nonlin4SweepOrder_rec(Aig_Man_t *pAig, Aig_Obj_t *pObj, Vec_Int_t *vOrder, int *pCounter, int fSaveAll)
DECLARATIONS ///.
void Llb_Nonlin4SweepDeref(DdManager *dd, Vec_Ptr_t *vParts)
Vec_Int_t * Llb_Nonlin4SweepOrder(Aig_Man_t *pAig, int *pCounter, int fSaveAll)
#define Saig_ManForEachLi(p, pObj, i)
#define Saig_ManForEachPo(p, pObj, i)
#define Saig_ManForEachLo(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.