30static inline int Llb_ObjSetPath(
Aig_Obj_t * pObj,
Aig_Obj_t * pNext ) { pObj->
pData = (
void *)pNext;
return 1; }
36 assert( Llb_ObjGetPath(pObj) );
38 if ( Llb_ObjGetPath(pFanout) == pObj )
63 Vec_Ptr_t * vSupps, * vOne, * vLower, * vUpper;
65 vSupps = Vec_PtrAlloc( 100 );
66 Vec_PtrPush( vSupps, Vec_PtrAlloc(0) );
67 vLower = (
Vec_Ptr_t *)Vec_PtrEntry( vResult, 0 );
71 Vec_PtrPush( vSupps, vOne );
74 assert( Vec_PtrSize(vSupps) == Vec_PtrSize(vResult) );
95 int * piFirst, * piLast;
96 int i, k, CounterPlus, CounterMinus, Counter;
98 vMaps = Vec_PtrAlloc( 100 );
101 vMap = Vec_IntStart( Aig_ManObjNumMax(
p) );
104 if ( !Saig_ObjIsPi(
p, pObj) )
105 Vec_IntWriteEntry( vMap, pObj->
Id, 1 );
110 Vec_PtrPush( vMaps, vMap );
113 Vec_PtrPush( vMaps, Vec_IntStart( Aig_ManObjNumMax(
p) ) );
114 assert( Vec_PtrSize(vMaps) == Vec_PtrSize(vResult)+1 );
120 piFirst[i] = piLast[i] = -1;
125 if ( !Saig_ObjIsPi(
p, pObj) )
127 if ( piFirst[Aig_ObjCioId(pObj)] == -1 )
128 piFirst[Aig_ObjCioId(pObj)] = i;
129 piLast[Aig_ObjCioId(pObj)] = i;
135 if ( !Saig_ObjIsPi(
p, Aig_ObjFanin0(pObj)) )
137 piLast[Aig_ObjCioId(Aig_ObjFanin0(pObj))] = Vec_PtrSize(vMaps)-1;
143 if ( piFirst[i] == -1 )
145 if ( piFirst[i] == piLast[i] )
147 vMap = (
Vec_Int_t *)Vec_PtrEntry( vMaps, piFirst[i] );
148 Vec_IntWriteEntry( vMap, pObj->
Id, 2 );
153 for ( k = piFirst[i]; k <= piLast[i]; k++ )
155 vMap = (
Vec_Int_t *)Vec_PtrEntry( vMaps, k );
156 Vec_IntWriteEntry( vMap, pObj->
Id, 1 );
164 Counter = Aig_ManRegNum(
p);
165 printf(
"%d ", Counter );
168 vPrev = (
Vec_Int_t *)Vec_PtrEntry( vMaps, i-1 );
169 vNext = (i == Vec_PtrSize(vMaps)-1)? NULL: (
Vec_Int_t *)Vec_PtrEntry( vMaps, i+1 );
171 CounterPlus = CounterMinus = 0;
174 if ( Saig_ObjIsPi(
p, pObj) )
176 if ( Vec_IntEntry(vPrev, k) == 0 && Vec_IntEntry(vMap, k) == 1 )
178 if ( Vec_IntEntry(vMap, k) == 1 && (vNext == NULL || Vec_IntEntry(vNext, k) == 0) )
183 if ( Vec_IntEntry(vPrev, k) == 0 && Vec_IntEntry(vMap, k) == 1 )
185 if ( Vec_IntEntry(vPrev, k) == 1 && Vec_IntEntry(vMap, k) == 0 )
189 Counter = Counter + CounterPlus - CounterMinus;
190 printf(
"%d=%d ", i, Counter );
198 if ( !Aig_ObjIsCi(pObj) && !Aig_ObjIsNode(pObj) )
201 if ( Vec_IntEntry(vMap, i) )
203 if ( k == Vec_PtrSize(vMaps) )
205 printf(
"Obj = %4d : ", i );
206 if ( Saig_ObjIsPi(
p,pObj) )
208 else if ( Saig_ObjIsLo(
p,pObj) )
210 else if ( Aig_ObjIsNode(pObj) )
214 printf(
"%d", Vec_IntEntry(vMap, i) );
236 if ( Saig_ObjIsPi(
p,pObj) )
257 if ( Saig_ObjIsLo(
p,pObj) )
277 int i, k, iFanout = -1, Counter = 0;
280 if ( Aig_ObjIsCi(pObj) )
284 if ( Saig_ObjIsLi(
p, pFanout) )
307 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
309 Aig_ObjSetTravIdCurrent(
p, pObj);
310 assert( Aig_ObjIsNode(pObj) );
333 Aig_ObjSetTravIdCurrent(
p, pObj );
354 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
356 Aig_ObjSetTravIdCurrent(
p, pObj);
357 assert( Aig_ObjIsNode(pObj) );
360 Vec_PtrPush( vNodes, pObj );
382 Aig_ObjSetTravIdCurrent(
p, pObj );
384 vNodes = Vec_PtrAlloc( 100 );
411 assert( Aig_ObjIsNode(pObj) );
412 Aig_ObjSetTravIdCurrent(
p, Aig_ObjFanin0(pObj) );
413 Aig_ObjSetTravIdCurrent(
p, Aig_ObjFanin1(pObj) );
415 Vec_PtrFree( vNodes );
417 vSupp = Vec_PtrAlloc( 100 );
419 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
420 Vec_PtrPush( vSupp, pObj );
444 Aig_ObjSetTravIdCurrent(
p, pObj );
446 vRange = Vec_PtrAlloc( 100 );
448 if ( !Aig_ObjIsTravIdCurrent(
p, pObj) )
449 Vec_PtrPush( vRange, pObj );
474 And = Vec_PtrSize(vLower) - Pis - Ffs;
475 printf(
"Leaf: %3d=%3d+%3d+%3d ", Vec_PtrSize(vLower), Pis, Ffs, And );
479 And = Vec_PtrSize(vUpper) - Pis - Ffs;
480 printf(
"Root: %3d=%3d+%3d+%3d ", Vec_PtrSize(vUpper), Pis, Ffs, And );
485 And = Vec_PtrSize(vSupp) - Pis - Ffs;
486 printf(
"Supp: %3d=%3d+%3d+%3d ", Vec_PtrSize(vSupp), Pis, Ffs, And );
491 And = Vec_PtrSize(vRange) - Pis - Ffs;
492 printf(
"Range: %3d=%3d+%3d+%3d ", Vec_PtrSize(vRange), Pis, Ffs, And );
494 printf(
"S =%3d. V =%3d.\n",
496 Vec_PtrFree( vSupp );
497 Vec_PtrFree( vRange );
531 if ( i < Vec_PtrSize(vResult) - 1 )
551 assert( Aig_ObjIsNode(pObj) || Aig_ObjIsCi(pObj) || Aig_ObjIsConst1(pObj) );
553 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
555 Aig_ObjSetTravIdCurrent(
p, pObj);
557 if ( !Llb_ObjGetPath(pObj) )
561 return Llb_ObjSetPath( pObj, (
Aig_Obj_t *)1 );
566 if ( Aig_ObjIsNode(pObj) )
569 return Llb_ObjSetPath( pObj, Aig_ObjFanin0(pObj) );
571 return Llb_ObjSetPath( pObj, Aig_ObjFanin1(pObj) );
576 pFanout = Llb_ObjGetFanoutPath(
p, pObj );
577 if ( pFanout == NULL )
583 assert( Aig_ObjIsNode(pFanout) );
585 return Llb_ObjSetPath( pFanout, Aig_ObjFanin0(pFanout) );
587 return Llb_ObjSetPath( pFanout, Aig_ObjFanin1(pFanout) );
590 return Llb_ObjSetPath( pFanout, NULL );
608 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
610 Aig_ObjSetTravIdCurrent(
p, pObj);
611 if ( Aig_ObjIsCi(pObj) || Aig_ObjIsConst1(pObj) )
613 assert( Aig_ObjIsNode(pObj) );
638 Vec_PtrClear( vMinCut );
642 if ( !Aig_ObjIsCo(pObj) && !Aig_ObjIsNode(pObj) )
644 if ( Aig_ObjIsTravIdCurrent(
p, pObj) || Aig_ObjIsTravIdPrevious(
p, pObj) )
646 if ( Aig_ObjIsTravIdPrevious(
p, Aig_ObjFanin0(pObj)) )
648 Aig_ObjSetTravIdCurrent(
p, Aig_ObjFanin0(pObj));
649 Vec_PtrPush( vMinCut, Aig_ObjFanin0(pObj) );
651 if ( Aig_ObjIsNode(pObj) && Aig_ObjIsTravIdPrevious(
p, Aig_ObjFanin1(pObj)) )
653 Aig_ObjSetTravIdCurrent(
p, Aig_ObjFanin1(pObj));
654 Vec_PtrPush( vMinCut, Aig_ObjFanin1(pObj) );
676 vMinCut = Vec_PtrAlloc( Aig_ManRegNum(
p) );
680 if ( !Llb_ObjGetPath(pObj) )
683 if ( !Aig_ObjIsTravIdCurrent(
p, pObj) )
686 if ( pObj->
fMarkA || !Aig_ObjIsTravIdCurrent(
p, Llb_ObjGetPath(pObj) ) )
687 Vec_PtrPush( vMinCut, pObj );
706 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
708 Aig_ObjSetTravIdCurrent(
p, pObj);
710 if ( Aig_ObjIsConst1(pObj) )
712 if ( Aig_ObjIsCi(pObj) )
715 assert( Aig_ObjIsNode(pObj) );
741 Aig_ObjSetTravIdCurrent(
p, pObj );
766 int Flow, FlowCur, RetValue, i;
774 if ( !Aig_ObjFanin0(pObj)->fMarkB )
781 if ( Aig_ObjIsNode(pObj) && !Aig_ObjFanin1(pObj)->fMarkB )
797 if ( !Aig_ObjFanin0(pObj)->fMarkB )
802 if ( Aig_ObjIsNode(pObj) && !Aig_ObjFanin1(pObj)->fMarkB )
811 assert( Vec_PtrSize(vMinCut) == Flow );
814 printf(
"Llb_ManFlow() error! The computed min-cut is not a cut!\n" );
834 int Flow, FlowCur, RetValue, i;
844 if ( !Aig_ObjFanin0(pObj)->fMarkB )
852 if ( Aig_ObjIsNode(pObj) && !Aig_ObjFanin1(pObj)->fMarkB )
870 if ( !Aig_ObjFanin0(pObj)->fMarkB )
875 if ( Aig_ObjIsNode(pObj) && !Aig_ObjFanin1(pObj)->fMarkB )
883 assert( Vec_PtrSize(vMinCut) == Flow );
889 printf(
"Llb_ManFlow() error! The computed min-cut is not a cut!\n" );
913 assert( Aig_ObjIsNode(pObj) );
934 if ( Aig_ObjIsCi(pObj) || Aig_ObjIsConst1(pObj) )
936 assert( Aig_ObjIsNode(pObj) );
963 Aig_ManConst1(
p)->fMarkB = 0;
1002 assert( Aig_ObjIsNode(pObj) );
1022 int i, iFanout = -1;
1023 if ( Saig_ObjIsLi(
p, pObj) )
1029 assert( Aig_ObjIsNode(pObj) );
1031 if ( Aig_ObjIsNode(pObj) )
1032 Vec_PtrPush( vCone, pObj );
1053 Vec_PtrClear( vCone );
1080 vMinCut = Vec_PtrAlloc( 100 );
1082 Vec_PtrPush( vMinCut, pObj );
1102 assert( Saig_ManPoNum(
p) == 0 );
1103 vMinCut = Vec_PtrAlloc( 100 );
1107 pObj = Aig_ObjFanin0(pObj);
1108 if ( Aig_ObjIsConst1(pObj) )
1110 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
1112 Aig_ObjSetTravIdCurrent(
p, pObj);
1113 Vec_PtrPush( vMinCut, pObj );
1135 Vec_PtrClear( vSet );
1136 for ( i = 0; i < nSize; i++ )
1138 pObj = (
Aig_Obj_t *)Vec_PtrEntry( vLower, (iStart + i) % Vec_PtrSize(vLower) );
1139 Vec_PtrPush( vSet, pObj );
1156 int nVolMin = Aig_ManNodeNum(
p) / Num / 2;
1160 int i, s, Vol, VolLower, VolUpper, VolCmp;
1165 VolCmp = Abc_MinInt( nVolMin, Vol - nVolMin );
1166 vCone = Vec_PtrAlloc( 100 );
1167 vSet = Vec_PtrAlloc( 100 );
1169 for ( s = 1; s < Aig_ManRegNum(
p); s += 5 )
1175 if ( Vec_PtrSize(vCone) == 0 )
1182 Vol = Abc_MinInt( VolLower, VolUpper );
1183 if ( Vol >= VolCmp && (iMinCut == -1 ||
1184 iMinCut > Vec_PtrSize(vMinCut) ||
1185 (iMinCut == Vec_PtrSize(vMinCut) && iVolBest < Vol)) )
1188 iMinCut = Vec_PtrSize(vMinCut);
1191 Vec_PtrFree( vMinCut );
1199 Vec_PtrFree( vCone );
1200 Vec_PtrFree( vSet );
1210 Vec_PtrFree( vCone );
1211 Vec_PtrFree( vSet );
1228 int nVolMax = Aig_ManNodeNum(
p) / Num;
1229 Vec_Ptr_t * vResult, * vMinCut = NULL, * vLower, * vUpper;
1232 vResult = Vec_PtrAlloc( 100 );
1238 vLower = (
Vec_Ptr_t *)Vec_PtrEntry( vResult, 0 );
1242 if ( nVol <= nVolMax )
1251 if ( vMinCut == NULL )
1254 printf(
"Could not break the cut.\n" );
1270 if ( i == Vec_PtrSize(vResult) )
1273 Vec_PtrPush( vResult, NULL );
1274 for ( k = Vec_PtrSize(vResult) - 1; k > i; k-- )
1275 Vec_PtrWriteEntry( vResult, k, Vec_PtrEntry(vResult, k-1) );
1276 Vec_PtrWriteEntry( vResult, i, vMinCut );
1280 printf(
"Finished computing %d partitions. ", Vec_PtrSize(vResult) - 1 );
1281 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
1301 p->nBddMax = 1000000;
1302 p->nIterMax = 10000000;
1303 p->nClusterMax = 20;
1307 p->nVolumeMax = 100;
1315 p->fVeryVerbose = 0;
1319 p->TimeLimitGlo = 0;
#define ABC_ALLOC(type, num)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManFanoutStart(Aig_Man_t *p)
FUNCTION DEFINITIONS ///.
void Aig_ManFanoutStop(Aig_Man_t *p)
#define Aig_ManForEachObj(p, pObj, i)
void Aig_ManStop(Aig_Man_t *p)
#define Aig_ObjForEachFanout(p, pObj, pFanout, iFan, i)
void Aig_ManIncrementTravId(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
struct Aig_Obj_t_ Aig_Obj_t
void Aig_ManPrintStats(Aig_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
void Aig_ManCleanMarkAB(Aig_Man_t *p)
void Aig_ManCleanData(Aig_Man_t *p)
Aig_Man_t * Aig_ManDupFlopsOnly(Aig_Man_t *p)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
int Llb_CoreExperiment(Aig_Man_t *pInit, Aig_Man_t *pAig, Gia_ParLlb_t *pPars, Vec_Ptr_t *vResult, abctime TimeTarget)
Vec_Ptr_t * Llb_ManFlowFindBestCut(Aig_Man_t *p, Vec_Ptr_t *vLower, Vec_Ptr_t *vUpper, int Num)
Vec_Ptr_t * Llb_ManCutSupps(Aig_Man_t *p, Vec_Ptr_t *vResult)
FUNCTION DEFINITIONS ///.
int Llb_ManCutLiNum(Aig_Man_t *p, Vec_Ptr_t *vMinCut)
int Llb_ManCutVolume(Aig_Man_t *p, Vec_Ptr_t *vLower, Vec_Ptr_t *vUpper)
int Llb_ManFlowVerifyCut_rec(Aig_Man_t *p, Aig_Obj_t *pObj)
int Llb_ManFlowVerifyCut(Aig_Man_t *p, Vec_Ptr_t *vMinCut)
Vec_Ptr_t * Llb_ManCutMap(Aig_Man_t *p, Vec_Ptr_t *vResult, Vec_Ptr_t *vSupps)
void Llb_ManCutNodes_rec(Aig_Man_t *p, Aig_Obj_t *pObj, Vec_Ptr_t *vNodes)
Vec_Ptr_t * Llb_ManCutSupp(Aig_Man_t *p, Vec_Ptr_t *vLower, Vec_Ptr_t *vUpper)
void Llb_ManResultPrint(Aig_Man_t *p, Vec_Ptr_t *vResult)
void Llb_ManFlowUnmarkCone(Aig_Man_t *p, Vec_Ptr_t *vCone)
void Llb_ManFlowSetMarkA_rec(Aig_Obj_t *pObj)
int Llb_ManCutLoNum(Aig_Man_t *p, Vec_Ptr_t *vMinCut)
void Llb_ManFlowGetObjSet(Aig_Man_t *p, Vec_Ptr_t *vLower, int iStart, int nSize, Vec_Ptr_t *vSet)
Vec_Ptr_t * Llb_ManComputeCutLi(Aig_Man_t *p)
void Llb_ManFlowCleanMarkB_rec(Aig_Obj_t *pObj)
void Llb_ManFlowCollectAndMarkCone_rec(Aig_Man_t *p, Aig_Obj_t *pObj, Vec_Ptr_t *vCone)
void Llb_ManFlowUpdateCut(Aig_Man_t *p, Vec_Ptr_t *vMinCut)
void Llb_ManFlowPrepareCut(Aig_Man_t *p, Vec_Ptr_t *vLower, Vec_Ptr_t *vUpper)
int Llb_ManCutPiNum(Aig_Man_t *p, Vec_Ptr_t *vMinCut)
Vec_Ptr_t * Llb_ManComputeCuts(Aig_Man_t *p, int Num, int fVerbose, int fVeryVerbose)
Vec_Ptr_t * Llb_ManComputeCutLo(Aig_Man_t *p)
Vec_Ptr_t * Llb_ManCutNodes(Aig_Man_t *p, Vec_Ptr_t *vLower, Vec_Ptr_t *vUpper)
DECLARATIONS ///.
void Llb_ManCutPrint(Aig_Man_t *p, Vec_Ptr_t *vLower, Vec_Ptr_t *vUpper)
Vec_Ptr_t * Llb_ManFlowMinCut(Aig_Man_t *p)
int Llb_ManFlowBwdPath2_rec(Aig_Man_t *p, Aig_Obj_t *pObj)
Vec_Ptr_t * Llb_ManFlow(Aig_Man_t *p, Vec_Ptr_t *vSources, int *pnFlow)
Vec_Ptr_t * Llb_ManCutRange(Aig_Man_t *p, Vec_Ptr_t *vLower, Vec_Ptr_t *vUpper)
void Llb_ManMinCutTest(Aig_Man_t *pAig, int Num)
void Llb_ManFlowLabelTfi_rec(Aig_Man_t *p, Aig_Obj_t *pObj)
int Llb_ManCutVolume_rec(Aig_Man_t *p, Aig_Obj_t *pObj)
void Llb_BddSetDefaultParams(Gia_ParLlb_t *p)
Vec_Ptr_t * Llb_ManFlowCompute(Aig_Man_t *p)
void Llb_ManFlowCollectAndMarkCone(Aig_Man_t *p, Vec_Ptr_t *vStarts, Vec_Ptr_t *vCone)
typedefABC_NAMESPACE_HEADER_START struct Gia_ParLlb_t_ Gia_ParLlb_t
INCLUDES ///.
#define Saig_ManForEachLi(p, pObj, i)
#define Saig_ManForEachPi(p, pObj, i)
#define Vec_PtrForEachEntryStart(Type, vVec, pEntry, i, Start)
#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 ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.