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);
72 Vec_IntWriteEntry( vOrder, Aig_ObjId(pObj), (*pCounter)++ );
95 if ( Aig_ObjLevel(pObj) > 3 )
98 Aig_ObjFanin0(pObj)->fMarkA = 0;
101 vOrder = Vec_IntStartFull( Aig_ManObjNumMax(pAig) );
103 Aig_ObjSetTravIdCurrent( pAig, Aig_ManConst1(pAig) );
107 Vec_IntWriteEntry( vOrder, Aig_ObjId(pObj), Counter++ );
111 if ( Llb_ObjBddVar(vOrder, pObj) < 0 )
112 Vec_IntWriteEntry( vOrder, Aig_ObjId(pObj), Counter++ );
114 Vec_IntFreeP( &vNodes );
152 DdNode * bBdd, * bBdd0, * bBdd1, * bPart, * vVar;
153 if ( Aig_ObjIsConst1(pObj) )
154 return Cudd_ReadOne(dd);
155 if ( Aig_ObjIsCi(pObj) )
156 return Cudd_bddIthVar( dd, Llb_ObjBddVar(vOrder, pObj) );
158 return (DdNode *)pObj->
pData;
159 if ( Aig_ObjIsCo(pObj) )
162 bPart = Cudd_bddXnor( dd, Cudd_bddIthVar( dd, Llb_ObjBddVar(vOrder, pObj) ), bBdd0 ); Cudd_Ref( bPart );
163 Vec_PtrPush( vRoots, bPart );
168 bBdd = Cudd_bddAnd( dd, bBdd0, bBdd1 ); Cudd_Ref( bBdd );
169 if ( Llb_ObjBddVar(vOrder, pObj) >= 0 )
171 vVar = Cudd_bddIthVar( dd, Llb_ObjBddVar(vOrder, pObj) );
172 bPart = Cudd_bddXnor( dd, vVar, bBdd ); Cudd_Ref( bPart );
173 Vec_PtrPush( vRoots, bPart );
174 Cudd_RecursiveDeref( dd, bBdd );
175 bBdd = vVar; Cudd_Ref( vVar );
198 vRoots = Vec_PtrAlloc( 100 );
211 Cudd_RecursiveDeref( dd, (DdNode *)pObj->
pData );
231 vVars2Q = Vec_IntAlloc( 0 );
232 Vec_IntFill( vVars2Q, Cudd_ReadSize(dd), 1 );
234 Vec_IntWriteEntry( vVars2Q, Llb_ObjBddVar(vOrder, pObj), 0 );
237 Vec_IntWriteEntry( vVars2Q, Llb_ObjBddVar(vOrder, pObj), 0 );
257 bSupp = Cudd_Support( dd, bFunc ); Cudd_Ref( bSupp );
258 if ( !fCo && !fFlop )
261 if ( Llb_ObjBddVar(vOrder, pObj) >= 0 )
262 Counter += Cudd_bddLeq( dd, bSupp, Cudd_bddIthVar(dd, Llb_ObjBddVar(vOrder, pObj)) );
264 else if ( fCo && !fFlop )
267 if ( Llb_ObjBddVar(vOrder, pObj) >= 0 )
268 Counter += Cudd_bddLeq( dd, bSupp, Cudd_bddIthVar(dd, Llb_ObjBddVar(vOrder, pObj)) );
270 else if ( !fCo && fFlop )
273 if ( Llb_ObjBddVar(vOrder, pObj) >= 0 )
274 Counter += Cudd_bddLeq( dd, bSupp, Cudd_bddIthVar(dd, Llb_ObjBddVar(vOrder, pObj)) );
276 else if ( fCo && fFlop )
279 if ( Llb_ObjBddVar(vOrder, pObj) >= 0 )
280 Counter += Cudd_bddLeq( dd, bSupp, Cudd_bddIthVar(dd, Llb_ObjBddVar(vOrder, pObj)) );
282 Cudd_RecursiveDeref( dd, bSupp );
300 int i, nSuppAll, nSuppPi, nSuppPo, nSuppLi, nSuppLo, nSuppAnd;
304 nSuppAll = Cudd_SupportSize(dd,bTemp);
309 nSuppAnd = nSuppAll - (nSuppPi+nSuppPo+nSuppLi+nSuppLo);
311 if ( Cudd_DagSize(bTemp) <= 10 )
314 printf(
"%4d : bdd =%6d supp =%3d ", i, Cudd_DagSize(bTemp), nSuppAll );
315 printf(
"pi =%3d ", nSuppPi );
316 printf(
"po =%3d ", nSuppPo );
317 printf(
"lo =%3d ", nSuppLo );
318 printf(
"li =%3d ", nSuppLi );
319 printf(
"and =%3d", nSuppAnd );
339 int nSuppAll = 0, nSuppPi = 0, nSuppPo = 0, nSuppLi = 0, nSuppLo = 0, nSuppAnd = 0;
346 if ( Llb_ObjBddVar(vOrder, pObj) < 0 )
349 if ( pSupp[Llb_ObjBddVar(vOrder, pObj)] == 0 )
351 if ( Aig_ObjIsNode(pObj) )
352 Vec_IntWriteEntry( vOrder, Aig_ObjId(pObj), -1 );
356 if ( Saig_ObjIsPi(pAig, pObj) )
358 else if ( Saig_ObjIsLo(pAig, pObj) )
360 else if ( Saig_ObjIsPo(pAig, pObj) )
362 else if ( Saig_ObjIsLi(pAig, pObj) )
369 printf(
"Groups =%3d ", Vec_PtrSize(vGroups) );
370 printf(
"Variables: all =%4d ", nSuppAll );
371 printf(
"pi =%4d ", nSuppPi );
372 printf(
"po =%4d ", nSuppPo );
373 printf(
"lo =%4d ", nSuppLo );
374 printf(
"li =%4d ", nSuppLi );
375 printf(
"and =%4d", nSuppAnd );
400 dd = Cudd_Init( nVarNum, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
407 Vec_IntFree( vVars2Q );
410 Cudd_RecursiveDeref( dd, bTemp );
411 Vec_PtrFree( vParts );
417 printf(
"Before reordering\n" );
428 Vec_IntFree( vOrder );
435 Cudd_RecursiveDeref( dd, bTemp );
436 Vec_PtrFree( vGroups );
#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 ///.
int Llb_Nonlin4CountTerms(DdManager *dd, Aig_Man_t *pAig, Vec_Int_t *vOrder, DdNode *bFunc, int fCo, int fFlop)
DdNode * Llb_Nonlin4FindPartitions_rec(DdManager *dd, Aig_Obj_t *pObj, Vec_Int_t *vOrder, Vec_Ptr_t *vRoots)
void Llb_Nonlin4PrintGroups(DdManager *dd, Aig_Man_t *pAig, Vec_Int_t *vOrder, Vec_Ptr_t *vGroups)
Vec_Int_t * Llb_Nonlin4FindOrder(Aig_Man_t *pAig, int *pCounter)
ABC_NAMESPACE_IMPL_START void Llb_Nonlin4FindOrder_rec(Aig_Man_t *pAig, Aig_Obj_t *pObj, Vec_Int_t *vOrder, int *pCounter)
DECLARATIONS ///.
Vec_Ptr_t * Llb_Nonlin4FindPartitions(DdManager *dd, Aig_Man_t *pAig, Vec_Int_t *vOrder, int fOutputs)
void Llb_Nonlin4Cluster(Aig_Man_t *pAig, DdManager **pdd, Vec_Int_t **pvOrder, Vec_Ptr_t **pvGroups, int nBddMax, int fVerbose)
Vec_Int_t * Llb_Nonlin4FindVars2Q(DdManager *dd, Aig_Man_t *pAig, Vec_Int_t *vOrder)
void Llb_Nonlin4PrintSuppProfile(DdManager *dd, Aig_Man_t *pAig, Vec_Int_t *vOrder, Vec_Ptr_t *vGroups)
Vec_Ptr_t * Llb_Nonlin4Group(DdManager *dd, Vec_Ptr_t *vParts, Vec_Int_t *vVars2Q, int nSizeMax)
#define Saig_ManForEachLi(p, pObj, i)
#define Saig_ManForEachPo(p, pObj, i)
#define Saig_ManForEachLo(p, pObj, i)
#define Saig_ManForEachPi(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.