66#define Llb_MgrForEachVar( p, pVar, i ) \
67 for ( i = 0; (i < p->nVars) && (((pVar) = Llb_MgrVar(p, i)), 1); i++ ) if ( pVar == NULL ) {} else
69#define Llb_MgrForEachPart( p, pPart, i ) \
70 for ( i = 0; (i < p->iPartFree) && (((pPart) = Llb_MgrPart(p, i)), 1); i++ ) if ( pPart == NULL ) {} else
73#define Llb_PartForEachVar( p, pPart, pVar, i ) \
74 for ( i = 0; (i < Vec_IntSize(pPart->vVars)) && (((pVar) = Llb_MgrVar(p, Vec_IntEntry(pPart->vVars,i))), 1); i++ )
76#define Llb_VarForEachPart( p, pVar, pPart, i ) \
77 for ( i = 0; (i < Vec_IntSize(pVar->vParts)) && (((pPart) = Llb_MgrPart(p, Vec_IntEntry(pVar->vParts,i))), 1); i++ )
100 assert(
p->pVars[pVar->iVar] == pVar );
101 p->pVars[pVar->iVar] = NULL;
102 Vec_IntFree( pVar->vParts );
121 p->pParts[pPart->
iPart] = NULL;
122 Vec_IntFree( pPart->
vVars );
123 Cudd_RecursiveDeref(
p->dd, pPart->
bFunc );
140 DdNode * bCube, * bTemp;
144 TimeStop =
p->dd->TimeStop;
p->dd->TimeStop = 0;
145 bCube = Cudd_ReadOne(
p->dd); Cudd_Ref( bCube );
148 assert( Vec_IntSize(pVar->vParts) > 0 );
149 if ( Vec_IntSize(pVar->vParts) != 1 )
151 assert( Vec_IntEntry(pVar->vParts, 0) == pPart->
iPart );
152 bCube = Cudd_bddAnd(
p->dd, bTemp = bCube, Cudd_bddIthVar(
p->dd, pVar->iVar) ); Cudd_Ref( bCube );
153 Cudd_RecursiveDeref(
p->dd, bTemp );
156 p->dd->TimeStop = TimeStop;
173 DdNode * bCube, * bTemp;
177 TimeStop =
p->dd->TimeStop;
p->dd->TimeStop = 0;
178 bCube = Cudd_ReadOne(
p->dd); Cudd_Ref( bCube );
181 assert( Vec_IntSize(pVar->vParts) > 0 );
182 if ( Vec_IntSize(pVar->vParts) != 2 )
184 if ( (Vec_IntEntry(pVar->vParts, 0) == pPart1->
iPart && Vec_IntEntry(pVar->vParts, 1) == pPart2->
iPart) ||
185 (Vec_IntEntry(pVar->vParts, 0) == pPart2->
iPart && Vec_IntEntry(pVar->vParts, 1) == pPart1->
iPart) )
187 bCube = Cudd_bddAnd(
p->dd, bTemp = bCube, Cudd_bddIthVar(
p->dd, pVar->iVar) ); Cudd_Ref( bCube );
188 Cudd_RecursiveDeref(
p->dd, bTemp );
192 p->dd->TimeStop = TimeStop;
212 if ( Vec_IntSize(pVar->vParts) == 1 )
236 printf(
"Var %3d : ", i );
238 printf(
"%d ", pPart->
iPart );
243 printf(
"Part %3d : ", i );
245 printf(
"%d ", pVar->iVar );
266 DdNode * bCube, * bTemp;
267 int i, RetValue, nSizeNew;
272 pPart->
bFunc = Cudd_bddExistAbstract(
p->dd, bTemp = pPart->
bFunc, bCube ); Cudd_Ref( pPart->
bFunc );
273 Cudd_RecursiveDeref(
p->dd, bTemp );
274 Cudd_RecursiveDeref(
p->dd, bCube );
276 vSingles = Vec_PtrAlloc( 0 );
277 nSizeNew = Cudd_DagSize(pPart->
bFunc);
280 if (
p->pSupp[pVar->iVar] )
282 assert( Vec_IntSize(pVar->vParts) > 1 );
283 pVar->nScore -= pPart->
nSize - nSizeNew;
287 RetValue = Vec_IntRemove( pVar->vParts, pPart->
iPart );
289 pVar->nScore -= pPart->
nSize;
290 if ( Vec_IntSize(pVar->vParts) == 0 )
292 else if ( Vec_IntSize(pVar->vParts) == 1 )
293 Vec_PtrPushUnique( vSingles, Llb_MgrPart(
p, Vec_IntEntry(pVar->vParts,0)) );
297 pPart->
nSize = nSizeNew;
298 Vec_IntClear( pPart->
vVars );
299 for ( i = 0; i <
p->nVars; i++ )
300 if (
p->pSupp[i] && Vec_IntEntry(
p->vVars2Q, i) )
301 Vec_IntPush( pPart->
vVars, i );
305 Vec_PtrFree( vSingles );
326 DdNode * bCube, * bFunc;
327 int i, RetValue, nSuppSize;
330 int liveBeg, liveEnd;
342printf(
"Conjoining partitions %d and %d.\n", pPart1->
iPart, pPart2->
iPart );
345liveBeg =
p->dd->keys -
p->dd->dead;
346 bFunc = Cudd_bddAndAbstract(
p->dd, pPart1->
bFunc, pPart2->
bFunc, bCube );
347liveEnd =
p->dd->keys -
p->dd->dead;
352 Cudd_RecursiveDeref(
p->dd, bCube );
356 Cudd_RecursiveDeref(
p->dd, bCube );
364 pTemp->
iPart =
p->iPartFree++;
365 pTemp->
nSize = Cudd_DagSize(bFunc);
366 pTemp->
bFunc = bFunc;
367 pTemp->
vVars = Vec_IntAlloc( 8 );
371 RetValue = Vec_IntRemove( pVar->vParts, pPart1->
iPart );
373 pVar->nScore -= pPart1->
nSize;
378 RetValue = Vec_IntRemove( pVar->vParts, pPart2->
iPart );
380 pVar->nScore -= pPart2->
nSize;
385 for ( i = 0; i <
p->nVars; i++ )
387 nSuppSize +=
p->pSupp[i];
388 if (
p->pSupp[i] && Vec_IntEntry(
p->vVars2Q, i) )
390 pVar = Llb_MgrVar(
p, i );
391 pVar->nScore += pTemp->
nSize;
392 Vec_IntPush( pVar->vParts, pTemp->
iPart );
393 Vec_IntPush( pTemp->
vVars, i );
396 p->nSuppMax = Abc_MaxInt(
p->nSuppMax, nSuppSize );
398 vSingles = Vec_PtrAlloc( 0 );
401 if ( Vec_IntSize(pVar->vParts) == 0 )
403 else if ( Vec_IntSize(pVar->vParts) == 1 )
406 printf(
"Adding partition %d because of var %d.\n",
407 Llb_MgrPart(
p, Vec_IntEntry(pVar->vParts,0))->iPart, pVar->iVar );
408 Vec_PtrPushUnique( vSingles, Llb_MgrPart(
p, Vec_IntEntry(pVar->vParts,0)) );
415 if ( Vec_IntSize(pVar->vParts) == 0 )
417 else if ( Vec_IntSize(pVar->vParts) == 1 )
420 printf(
"Adding partition %d because of var %d.\n",
421 Llb_MgrPart(
p, Vec_IntEntry(pVar->vParts,0))->iPart, pVar->iVar );
422 Vec_PtrPushUnique( vSingles, Llb_MgrPart(
p, Vec_IntEntry(pVar->vParts,0)) );
434printf(
"Updating partitiong %d with singlton vars.\n", pTemp->
iPart );
439 Vec_PtrFree( vSingles );
456 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
458 Aig_ObjSetTravIdCurrent(
p, pObj);
459 if ( Saig_ObjIsLi(
p, pObj) )
464 if ( Aig_ObjIsConst1(pObj) )
466 assert( Aig_ObjIsNode(pObj) );
469 Vec_PtrPush( vNodes, pObj );
491 Aig_ObjSetTravIdCurrent(
p, pObj );
493 vNodes = Vec_PtrAlloc( 100 );
512 if (
p->pVars[iVar] == NULL )
515 p->pVars[iVar]->iVar = iVar;
516 p->pVars[iVar]->nScore = 0;
517 p->pVars[iVar]->vParts = Vec_IntAlloc( 8 );
519 Vec_IntPush(
p->pVars[iVar]->vParts, iPart );
520 Vec_IntPush(
p->pParts[iPart]->vVars, iVar );
537 assert( !Cudd_IsConstant(bFunc) );
541 p->pParts[i]->iPart = i;
542 p->pParts[i]->bFunc = bFunc; Cudd_Ref( bFunc );
543 p->pParts[i]->vVars = Vec_IntAlloc( 8 );
547 for ( k = 0; k <
p->nVars; k++ )
549 nSuppSize +=
p->pSupp[k];
550 if (
p->pSupp[k] && Vec_IntEntry(
p->vVars2Q, k) )
553 p->nSuppMax = Abc_MaxInt(
p->nSuppMax, nSuppSize );
571 assert( Vec_IntSize(pVar->vParts) > 1 );
588 Llb_Prt_t * pPart, * pPart1Best = NULL, * pPart2Best = NULL;
594 if (
p->nSizeMax && pVar->nScore >
p->nSizeMax )
597 if ( pVarBest == NULL || pVarBest->nScore > pVar->nScore )
602 if ( pVarBest == NULL )
607 if ( pPart1Best == NULL )
609 else if ( pPart2Best == NULL )
611 else if ( pPart1Best->
nSize > pPart->
nSize || pPart2Best->nSize > pPart->
nSize )
613 if ( pPart1Best->
nSize > pPart2Best->nSize )
623 *ppPart1 = pPart1Best;
624 *ppPart2 = pPart2Best;
650 pVar->nScore += pPart->
nSize;
676 nScore += pPart->
nSize;
677 assert( nScore == pVar->nScore );
699 p->nSizeMax = nSizeMax;
700 p->vVars2Q = vVars2Q;
701 p->nVars = Cudd_ReadSize(dd);
702 p->iPartFree = Vec_PtrSize(vParts);
705 p->pSupp =
ABC_ALLOC(
int, Cudd_ReadSize(dd) );
756 DdNode * bFunc, * bTemp;
769 nReorders = Cudd_ReadReorderings(dd);
775 if ( nReorders < Cudd_ReadReorderings(dd) )
781 bFunc = Cudd_ReadOne(
p->dd); Cudd_Ref( bFunc );
784 bFunc = Cudd_bddAnd(
p->dd, bTemp = bFunc, pPart->
bFunc ); Cudd_Ref( bFunc );
785 Cudd_RecursiveDeref(
p->dd, bTemp );
823 nReorders = Cudd_ReadReorderings(dd);
829 if ( nReorders < Cudd_ReadReorderings(dd) )
835 vGroups = Vec_PtrAlloc( 1000 );
839 if ( Cudd_IsConstant(pPart->
bFunc) )
846 Vec_PtrPush( vGroups, pPart->
bFunc );
847 Cudd_Ref( pPart->
bFunc );
#define ABC_ALLOC(type, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManIncrementTravId(Aig_Man_t *p)
DECLARATIONS ///.
struct Aig_Obj_t_ Aig_Obj_t
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Llb_Mgr_t_ Llb_Mgr_t
struct Llb_Prt_t_ Llb_Prt_t
typedefABC_NAMESPACE_IMPL_START struct Llb_Var_t_ Llb_Var_t
DECLARATIONS ///.
int Llb_Nonlin4NextPartitions(Llb_Mgr_t *p, Llb_Prt_t **ppPart1, Llb_Prt_t **ppPart2)
int Llb_Nonlin4Quantify2(Llb_Mgr_t *p, Llb_Prt_t *pPart1, Llb_Prt_t *pPart2)
void Llb_Nonlin4RemovePart(Llb_Mgr_t *p, Llb_Prt_t *pPart)
void Llb_Nonlin4RecomputeScores(Llb_Mgr_t *p)
DdNode * Llb_Nonlin4CreateCube2(Llb_Mgr_t *p, Llb_Prt_t *pPart1, Llb_Prt_t *pPart2)
int Llb_Nonlin4HasSingletonVars(Llb_Mgr_t *p, Llb_Prt_t *pPart)
#define Llb_VarForEachPart(p, pVar, pPart, i)
#define Llb_MgrForEachPart(p, pPart, i)
void Llb_Nonlin4RemoveVar(Llb_Mgr_t *p, Llb_Var_t *pVar)
FUNCTION DEFINITIONS ///.
DdNode * Llb_Nonlin4CreateCube1(Llb_Mgr_t *p, Llb_Prt_t *pPart)
int Llb_Nonlin4Quantify1(Llb_Mgr_t *p, Llb_Prt_t *pPart)
DdNode * Llb_Nonlin4Image(DdManager *dd, Vec_Ptr_t *vParts, DdNode *bCurrent, Vec_Int_t *vVars2Q)
Llb_Mgr_t * Llb_Nonlin4Alloc(DdManager *dd, Vec_Ptr_t *vParts, DdNode *bCurrent, Vec_Int_t *vVars2Q, int nSizeMax)
#define Llb_PartForEachVar(p, pPart, pVar, i)
void Llb_Nonlin4CutNodes_rec(Aig_Man_t *p, Aig_Obj_t *pObj, Vec_Ptr_t *vNodes)
void Llb_Nonlin4CheckVars(Llb_Mgr_t *p)
void Llb_Nonlin4AddPartition(Llb_Mgr_t *p, int i, DdNode *bFunc)
Vec_Ptr_t * Llb_Nonlin4Group(DdManager *dd, Vec_Ptr_t *vParts, Vec_Int_t *vVars2Q, int nSizeMax)
void Llb_Nonlin4AddPair(Llb_Mgr_t *p, int iPart, int iVar)
void Llb_Nonlin4Free(Llb_Mgr_t *p)
void Llb_Nonlin4VerifyScores(Llb_Mgr_t *p)
#define Llb_MgrForEachVar(p, pVar, i)
Vec_Ptr_t * Llb_Nonlin4CutNodes(Aig_Man_t *p, Vec_Ptr_t *vLower, Vec_Ptr_t *vUpper)
void Llb_Nonlin4Print(Llb_Mgr_t *p)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.