68#define Llb_MgrForEachVar( p, pVar, i ) \
69 for ( i = 0; (i < p->nVars) && (((pVar) = Llb_MgrVar(p, i)), 1); i++ ) if ( pVar == NULL ) {} else
71#define Llb_MgrForEachPart( p, pPart, i ) \
72 for ( i = 0; (i < p->iPartFree) && (((pPart) = Llb_MgrPart(p, i)), 1); i++ ) if ( pPart == NULL ) {} else
75#define Llb_PartForEachVar( p, pPart, pVar, i ) \
76 for ( i = 0; (i < Vec_IntSize(pPart->vVars)) && (((pVar) = Llb_MgrVar(p, Vec_IntEntry(pPart->vVars,i))), 1); i++ )
78#define Llb_VarForEachPart( p, pVar, pPart, i ) \
79 for ( i = 0; (i < Vec_IntSize(pVar->vParts)) && (((pPart) = Llb_MgrPart(p, Vec_IntEntry(pVar->vParts,i))), 1); i++ )
102 assert(
p->pVars[pVar->iVar] == pVar );
103 p->pVars[pVar->iVar] = NULL;
104 Vec_IntFree( pVar->vParts );
122 p->pParts[pPart->
iPart] = NULL;
123 Vec_IntFree( pPart->
vVars );
124 Cudd_RecursiveDeref(
p->dd, pPart->
bFunc );
141 DdNode * bCube, * bTemp;
145 TimeStop =
p->dd->TimeStop;
p->dd->TimeStop = 0;
146 bCube = Cudd_ReadOne(
p->dd); Cudd_Ref( bCube );
149 assert( Vec_IntSize(pVar->vParts) > 0 );
150 if ( Vec_IntSize(pVar->vParts) != 1 )
152 assert( Vec_IntEntry(pVar->vParts, 0) == pPart->
iPart );
153 bCube = Cudd_bddAnd(
p->dd, bTemp = bCube, Cudd_bddIthVar(
p->dd, pVar->iVar) ); Cudd_Ref( bCube );
154 Cudd_RecursiveDeref(
p->dd, bTemp );
157 p->dd->TimeStop = TimeStop;
174 DdNode * bCube, * bTemp;
178 TimeStop =
p->dd->TimeStop;
p->dd->TimeStop = 0;
179 bCube = Cudd_ReadOne(
p->dd); Cudd_Ref( bCube );
182 assert( Vec_IntSize(pVar->vParts) > 0 );
183 if ( Vec_IntSize(pVar->vParts) != 2 )
185 if ( (Vec_IntEntry(pVar->vParts, 0) == pPart1->
iPart && Vec_IntEntry(pVar->vParts, 1) == pPart2->
iPart) ||
186 (Vec_IntEntry(pVar->vParts, 0) == pPart2->
iPart && Vec_IntEntry(pVar->vParts, 1) == pPart1->
iPart) )
188 bCube = Cudd_bddAnd(
p->dd, bTemp = bCube, Cudd_bddIthVar(
p->dd, pVar->iVar) ); Cudd_Ref( bCube );
189 Cudd_RecursiveDeref(
p->dd, bTemp );
193 p->dd->TimeStop = TimeStop;
213 if ( Vec_IntSize(pVar->vParts) == 1 )
237 printf(
"Var %3d : ", i );
239 printf(
"%d ", pPart->
iPart );
244 printf(
"Part %3d : ", i );
246 printf(
"%d ", pVar->iVar );
267 DdNode * bCube, * bTemp;
268 int i, RetValue, nSizeNew;
274 pPart->
bFunc = Cudd_LargestCube(
p->dd, bTemp = pPart->
bFunc, &Length ); Cudd_Ref( pPart->
bFunc );
276 printf(
"Subsetting %3d : ", pPart->
iPart );
277 printf(
"(Supp =%3d Node =%5d) -> ", Cudd_SupportSize(
p->dd, bTemp), Cudd_DagSize(bTemp) );
278 printf(
"(Supp =%3d Node =%5d)\n", Cudd_SupportSize(
p->dd, pPart->
bFunc), Cudd_DagSize(pPart->
bFunc) );
280 RetValue = (Cudd_DagSize(bTemp) == Cudd_DagSize(pPart->
bFunc));
282 Cudd_RecursiveDeref(
p->dd, bTemp );
293 pPart->
bFunc = Cudd_bddExistAbstract(
p->dd, bTemp = pPart->
bFunc, bCube ); Cudd_Ref( pPart->
bFunc );
294 Cudd_RecursiveDeref(
p->dd, bTemp );
295 Cudd_RecursiveDeref(
p->dd, bCube );
298 vSingles = Vec_PtrAlloc( 0 );
299 nSizeNew = Cudd_DagSize(pPart->
bFunc);
302 if (
p->pSupp[pVar->iVar] )
304 assert( Vec_IntSize(pVar->vParts) > 1 );
305 pVar->nScore -= pPart->
nSize - nSizeNew;
309 RetValue = Vec_IntRemove( pVar->vParts, pPart->
iPart );
311 pVar->nScore -= pPart->
nSize;
312 if ( Vec_IntSize(pVar->vParts) == 0 )
314 else if ( Vec_IntSize(pVar->vParts) == 1 )
315 Vec_PtrPushUnique( vSingles, Llb_MgrPart(
p, Vec_IntEntry(pVar->vParts,0)) );
319 pPart->
nSize = nSizeNew;
320 Vec_IntClear( pPart->
vVars );
321 for ( i = 0; i <
p->nVars; i++ )
322 if (
p->pSupp[i] &&
p->pVars2Q[i] )
323 Vec_IntPush( pPart->
vVars, i );
327 Vec_PtrFree( vSingles );
348 DdNode * bCube, * bFunc;
349 int i, RetValue, nSuppSize;
360printf(
"Conjoining partitions %d and %d.\n", pPart1->
iPart, pPart2->
iPart );
385 bFunc = Cudd_bddAndAbstract(
p->dd, pPart1->
bFunc, pPart2->
bFunc, bCube );
388 Cudd_RecursiveDeref(
p->dd, bCube );
392 Cudd_RecursiveDeref(
p->dd, bCube );
396 pTemp->
iPart =
p->iPartFree++;
397 pTemp->
nSize = Cudd_DagSize(bFunc);
398 pTemp->
bFunc = bFunc;
399 pTemp->
vVars = Vec_IntAlloc( 8 );
403 RetValue = Vec_IntRemove( pVar->vParts, pPart1->
iPart );
405 pVar->nScore -= pPart1->
nSize;
410 RetValue = Vec_IntRemove( pVar->vParts, pPart2->
iPart );
412 pVar->nScore -= pPart2->
nSize;
417 for ( i = 0; i <
p->nVars; i++ )
419 nSuppSize +=
p->pSupp[i];
420 if (
p->pSupp[i] &&
p->pVars2Q[i] )
422 pVar = Llb_MgrVar(
p, i );
423 pVar->nScore += pTemp->
nSize;
424 Vec_IntPush( pVar->vParts, pTemp->
iPart );
425 Vec_IntPush( pTemp->
vVars, i );
428 p->nSuppMax = Abc_MaxInt(
p->nSuppMax, nSuppSize );
430 vSingles = Vec_PtrAlloc( 0 );
433 if ( Vec_IntSize(pVar->vParts) == 0 )
435 else if ( Vec_IntSize(pVar->vParts) == 1 )
438 printf(
"Adding partition %d because of var %d.\n",
439 Llb_MgrPart(
p, Vec_IntEntry(pVar->vParts,0))->iPart, pVar->iVar );
440 Vec_PtrPushUnique( vSingles, Llb_MgrPart(
p, Vec_IntEntry(pVar->vParts,0)) );
447 if ( Vec_IntSize(pVar->vParts) == 0 )
449 else if ( Vec_IntSize(pVar->vParts) == 1 )
452 printf(
"Adding partition %d because of var %d.\n",
453 Llb_MgrPart(
p, Vec_IntEntry(pVar->vParts,0))->iPart, pVar->iVar );
454 Vec_PtrPushUnique( vSingles, Llb_MgrPart(
p, Vec_IntEntry(pVar->vParts,0)) );
466printf(
"Updating partitiong %d with singlton vars.\n", pTemp->
iPart );
471 Vec_PtrFree( vSingles );
488 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
490 Aig_ObjSetTravIdCurrent(
p, pObj);
491 if ( Saig_ObjIsLi(
p, pObj) )
496 if ( Aig_ObjIsConst1(pObj) )
498 assert( Aig_ObjIsNode(pObj) );
501 Vec_PtrPush( vNodes, pObj );
523 Aig_ObjSetTravIdCurrent(
p, pObj );
525 vNodes = Vec_PtrAlloc( 100 );
546 DdNode * bBdd0, * bBdd1, * bProd;
549 Aig_ManConst1(
p)->pData = Cudd_ReadOne( dd );
551 pObj->
pData = Cudd_bddIthVar( dd, Aig_ObjId(pObj) );
556 bBdd0 = Cudd_NotCond( (DdNode *)Aig_ObjFanin0(pObj)->pData, Aig_ObjFaninC0(pObj) );
557 bBdd1 = Cudd_NotCond( (DdNode *)Aig_ObjFanin1(pObj)->pData, Aig_ObjFaninC1(pObj) );
559 pObj->
pData = Cudd_bddAnd( dd, bBdd0, bBdd1 );
560 if ( pObj->
pData == NULL )
564 Cudd_RecursiveDeref( dd, (DdNode *)pObj->
pData );
565 Vec_PtrFree( vNodes );
568 Cudd_Ref( (DdNode *)pObj->
pData );
571 vResult = Vec_PtrAlloc( 100 );
574 if ( Aig_ObjIsNode(pObj) )
576 bProd = Cudd_bddXnor( dd, Cudd_bddIthVar(dd, Aig_ObjId(pObj)), (DdNode *)pObj->
pData ); Cudd_Ref( bProd );
580 assert( Saig_ObjIsLi(
p, pObj) );
581 bBdd0 = Cudd_NotCond( (DdNode *)Aig_ObjFanin0(pObj)->pData, Aig_ObjFaninC0(pObj) );
582 bProd = Cudd_bddXnor( dd, Cudd_bddIthVar(dd, Aig_ObjId(pObj)), bBdd0 ); Cudd_Ref( bProd );
584 Vec_PtrPush( vResult, bProd );
587 Cudd_RecursiveDeref( dd, (DdNode *)pObj->
pData );
589 Vec_PtrFree( vNodes );
606 if (
p->pVars[iVar] == NULL )
609 p->pVars[iVar]->iVar = iVar;
610 p->pVars[iVar]->nScore = 0;
611 p->pVars[iVar]->vParts = Vec_IntAlloc( 8 );
613 Vec_IntPush(
p->pVars[iVar]->vParts, iPart );
614 Vec_IntPush(
p->pParts[iPart]->vVars, iVar );
631 assert( !Cudd_IsConstant(bFunc) );
634 p->pParts[i]->iPart = i;
635 p->pParts[i]->bFunc = bFunc;
636 p->pParts[i]->vVars = Vec_IntAlloc( 8 );
640 for ( k = 0; k <
p->nVars; k++ )
642 nSuppSize +=
p->pSupp[k];
643 if (
p->pSupp[k] &&
p->pVars2Q[k] )
646 p->nSuppMax = Abc_MaxInt(
p->nSuppMax, nSuppSize );
667 if ( vRootBdds == NULL )
672 Vec_PtrFree( vRootBdds );
691 assert( Vec_IntSize(pVar->vParts) > 1 );
708 Llb_Prt_t * pPart, * pPart1Best = NULL, * pPart2Best = NULL;
713 if ( pVarBest == NULL || pVarBest->nScore > pVar->nScore )
715 if ( pVarBest == NULL )
720 if ( pPart1Best == NULL )
722 else if ( pPart2Best == NULL )
724 else if ( pPart1Best->
nSize > pPart->
nSize || pPart2Best->nSize > pPart->
nSize )
726 if ( pPart1Best->
nSize > pPart2Best->nSize )
732 *ppPart1 = pPart1Best;
733 *ppPart2 = pPart2Best;
752 Abc_Print( 1,
"Reordering... Before =%5d. ", Cudd_ReadKeys(dd) - Cudd_ReadDead(dd) );
753 Cudd_ReduceHeap( dd, CUDD_REORDER_SYMM_SIFT, 100 );
755 Abc_Print( 1,
"After =%5d. ", Cudd_ReadKeys(dd) - Cudd_ReadDead(dd) );
758 Cudd_ReduceHeap( dd, CUDD_REORDER_SYMM_SIFT, 100 );
760 Abc_Print( 1,
"After =%5d. ", Cudd_ReadKeys(dd) - Cudd_ReadDead(dd) );
763 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
788 pVar->nScore += pPart->
nSize;
814 nScore += pPart->
nSize;
815 assert( nScore == pVar->nScore );
835 p->vLeaves = vLeaves;
838 p->pVars2Q = pVars2Q;
839 p->nVars = Cudd_ReadSize(dd);
840 p->iPartFree = Vec_PtrSize(vRoots);
843 p->pSupp =
ABC_ALLOC(
int, Cudd_ReadSize(dd) );
885 DdManager * dd, DdNode * bCurrent,
int fReorder,
int fVerbose,
int * pOrder )
889 DdNode * bFunc, * bTemp;
890 int i, nReorders, timeInside;
891 abctime clk = Abc_Clock(), clk2;
907 timeInside = Abc_Clock() - clk2;
912 memcpy( pOrder, dd->invperm,
sizeof(
int) * dd->size );
917 nReorders = Cudd_ReadReorderings(dd);
924 timeInside += Abc_Clock() - clk2;
925 if ( nReorders < Cudd_ReadReorderings(dd) )
931 bFunc = Cudd_ReadOne(
p->dd); Cudd_Ref( bFunc );
934 bFunc = Cudd_bddAnd(
p->dd, bTemp = bFunc, pPart->
bFunc ); Cudd_Ref( bFunc );
935 Cudd_RecursiveDeref(
p->dd, bTemp );
942 timeOther += Abc_Clock() - clk - timeInside;
969 dd = Cudd_Init( Aig_ManObjNumMax(pAig), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
970 dd->TimeStop = TimeTarget;
971 Cudd_ShuffleHeap( dd, pOrder );
973 Cudd_AutodynEnable( dd, CUDD_REORDER_SYMM_SIFT );
1002 DdNode * bFunc, * bTemp;
1003 int i, nReorders, timeInside = 0;
1004 abctime clk = Abc_Clock(), clk2;
1016 memcpy( pOrder,
p->dd->invperm,
sizeof(
int) *
p->dd->size );
1024 nReorders = Cudd_ReadReorderings(
p->dd);
1031 timeInside += Abc_Clock() - clk2;
1032 if ( nReorders < Cudd_ReadReorderings(
p->dd) )
1038 bFunc = Cudd_ReadOne(
p->dd); Cudd_Ref( bFunc );
1041 bFunc = Cudd_bddAnd(
p->dd, bTemp = bFunc, pPart->
bFunc );
1042 if ( bFunc == NULL )
1044 Cudd_RecursiveDeref(
p->dd, bTemp );
1049 Cudd_RecursiveDeref(
p->dd, bTemp );
1058 timeOther += Abc_Clock() - clk - timeInside;
1060 Cudd_Deref( bFunc );
1083 Cudd_RecursiveDeref( dd, dd->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 ///.
int Llb_NonlinQuantify1(Llb_Mgr_t *p, Llb_Prt_t *pPart, int fSubset)
Vec_Ptr_t * Llb_NonlinBuildBdds(Aig_Man_t *p, Vec_Ptr_t *vLower, Vec_Ptr_t *vUpper, DdManager *dd)
void Llb_NonlinImageQuit()
int Llb_NonlinHasSingletonVars(Llb_Mgr_t *p, Llb_Prt_t *pPart)
DdNode * Llb_NonlinImage(Aig_Man_t *pAig, Vec_Ptr_t *vLeaves, Vec_Ptr_t *vRoots, int *pVars2Q, DdManager *dd, DdNode *bCurrent, int fReorder, int fVerbose, int *pOrder)
void Llb_NonlinVerifyScores(Llb_Mgr_t *p)
void Llb_NonlinRemovePart(Llb_Mgr_t *p, Llb_Prt_t *pPart)
void Llb_NonlinCheckVars(Llb_Mgr_t *p)
DdNode * Llb_NonlinImageCompute(DdNode *bCurrent, int fReorder, int fDrop, int fVerbose, int *pOrder)
void Llb_NonlinPrint(Llb_Mgr_t *p)
void Llb_NonlinReorder(DdManager *dd, int fTwice, int fVerbose)
#define Llb_VarForEachPart(p, pVar, pPart, i)
#define Llb_MgrForEachPart(p, pPart, i)
struct Llb_Mgr_t_ Llb_Mgr_t
void Llb_NonlinCutNodes_rec(Aig_Man_t *p, Aig_Obj_t *pObj, Vec_Ptr_t *vNodes)
DdManager * Llb_NonlinImageStart(Aig_Man_t *pAig, Vec_Ptr_t *vLeaves, Vec_Ptr_t *vRoots, int *pVars2Q, int *pOrder, int fFirst, abctime TimeTarget)
DdNode * Llb_NonlinCreateCube2(Llb_Mgr_t *p, Llb_Prt_t *pPart1, Llb_Prt_t *pPart2)
void Llb_NonlinAddPartition(Llb_Mgr_t *p, int i, DdNode *bFunc)
#define Llb_PartForEachVar(p, pPart, pVar, i)
struct Llb_Prt_t_ Llb_Prt_t
void Llb_NonlinRecomputeScores(Llb_Mgr_t *p)
void Llb_NonlinAddPair(Llb_Mgr_t *p, DdNode *bFunc, int iPart, int iVar)
void Llb_NonlinFree(Llb_Mgr_t *p)
Llb_Mgr_t * Llb_NonlinAlloc(Aig_Man_t *pAig, Vec_Ptr_t *vLeaves, Vec_Ptr_t *vRoots, int *pVars2Q, DdManager *dd)
int Llb_NonlinQuantify2(Llb_Mgr_t *p, Llb_Prt_t *pPart1, Llb_Prt_t *pPart2)
DdNode * Llb_NonlinCreateCube1(Llb_Mgr_t *p, Llb_Prt_t *pPart)
typedefABC_NAMESPACE_IMPL_START struct Llb_Var_t_ Llb_Var_t
DECLARATIONS ///.
void Llb_NonlinRemoveVar(Llb_Mgr_t *p, Llb_Var_t *pVar)
FUNCTION DEFINITIONS ///.
Vec_Ptr_t * Llb_NonlinCutNodes(Aig_Man_t *p, Vec_Ptr_t *vLower, Vec_Ptr_t *vUpper)
int Llb_NonlinNextPartitions(Llb_Mgr_t *p, Llb_Prt_t **ppPart1, Llb_Prt_t **ppPart2)
#define Llb_MgrForEachVar(p, pVar, i)
int Llb_NonlinStart(Llb_Mgr_t *p)
#define Vec_PtrForEachEntryStop(Type, vVec, pEntry, i, Stop)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.