Commit d350b1a8 by Alan Mishchenko

Experiments with MFFC computation.

parent ecafca53
...@@ -1548,68 +1548,97 @@ void Mf_ManComputeCuts( Mf_Man_t * p ) ...@@ -1548,68 +1548,97 @@ void Mf_ManComputeCuts( Mf_Man_t * p )
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
int Mf_CutRef2_rec( Mf_Man_t * p, int * pCut, Vec_Int_t * vTemp, int Limit ) int Mf_CutRef_rec( Mf_Man_t * p, int * pCut )
{ {
int i, Count = Mf_CutArea(p, Mf_CutSize(pCut), Mf_CutFunc(pCut)); int i, Count = Mf_CutArea(p, Mf_CutSize(pCut), Mf_CutFunc(pCut));
if ( Limit == 0 ) return Count;
for ( i = 1; i <= Mf_CutSize(pCut); i++ ) for ( i = 1; i <= Mf_CutSize(pCut); i++ )
{
Vec_IntPush( vTemp, pCut[i] );
if ( !Mf_ObjMapRefInc(p, pCut[i]) && Mf_ManObj(p, pCut[i])->iCutSet ) if ( !Mf_ObjMapRefInc(p, pCut[i]) && Mf_ManObj(p, pCut[i])->iCutSet )
Count += Mf_CutRef2_rec( p, Mf_ObjCutBest(p, pCut[i]), vTemp, Limit-1 ); Count += Mf_CutRef_rec( p, Mf_ObjCutBest(p, pCut[i]) );
}
return Count; return Count;
} }
static inline int Mf_CutAreaDerefed2( Mf_Man_t * p, int * pCut ) int Mf_CutDeref_rec( Mf_Man_t * p, int * pCut )
{ {
int Ela1, iObj, i; int i, Count = Mf_CutArea(p, Mf_CutSize(pCut), Mf_CutFunc(pCut));
Vec_IntClear( &p->vTemp ); for ( i = 1; i <= Mf_CutSize(pCut); i++ )
Ela1 = Mf_CutRef2_rec( p, pCut, &p->vTemp, 8 ); if ( !Mf_ObjMapRefDec(p, pCut[i]) && Mf_ManObj(p, pCut[i])->iCutSet )
Vec_IntForEachEntry( &p->vTemp, iObj, i ) Count += Mf_CutDeref_rec( p, Mf_ObjCutBest(p, pCut[i]) );
Mf_ObjMapRefDec( p, iObj ); return Count;
}
static inline int Mf_CutAreaRefed( Mf_Man_t * p, int * pCut )
{
int Ela1 = Mf_CutDeref_rec( p, pCut );
int Ela2 = Mf_CutRef_rec( p, pCut );
assert( Ela1 == Ela2 );
return Ela1; return Ela1;
} }
static inline int Mf_CutAreaDerefed2Multi( Mf_Man_t * p, int ** ppCuts, int nCuts ) static inline int Mf_CutAreaDerefed( Mf_Man_t * p, int * pCut )
{ {
int Ela1 = 0, iObj, i; int Ela1 = Mf_CutRef_rec( p, pCut );
Vec_IntClear( &p->vTemp ); int Ela2 = Mf_CutDeref_rec( p, pCut );
for ( i = 0; i < nCuts; i++ ) assert( Ela1 == Ela2 );
Ela1 += Mf_CutRef2_rec( p, ppCuts[i], &p->vTemp, ABC_INFINITY );
Vec_IntForEachEntry( &p->vTemp, iObj, i )
Mf_ObjMapRefDec( p, iObj );
return Ela1; return Ela1;
} }
static inline int Mf_CutAreaMffc( Mf_Man_t * p, int iObj )
{
return Mf_ObjMapRefNum(p, iObj) ?
Mf_CutAreaRefed (p, Mf_ObjCutBest(p, iObj)) :
Mf_CutAreaDerefed(p, Mf_ObjCutBest(p, iObj));
}
int Mf_CutRef_rec( Mf_Man_t * p, int * pCut ) int Mf_CutRef2_rec( Mf_Man_t * p, int * pCut, Vec_Int_t * vTemp, int Limit )
{ {
int i, Count = Mf_CutArea(p, Mf_CutSize(pCut), Mf_CutFunc(pCut)); int i, Count = Mf_CutArea(p, Mf_CutSize(pCut), Mf_CutFunc(pCut));
if ( Limit == 0 ) return Count;
for ( i = 1; i <= Mf_CutSize(pCut); i++ ) for ( i = 1; i <= Mf_CutSize(pCut); i++ )
{
Vec_IntPush( vTemp, pCut[i] );
if ( !Mf_ObjMapRefInc(p, pCut[i]) && Mf_ManObj(p, pCut[i])->iCutSet ) if ( !Mf_ObjMapRefInc(p, pCut[i]) && Mf_ManObj(p, pCut[i])->iCutSet )
Count += Mf_CutRef_rec( p, Mf_ObjCutBest(p, pCut[i]) ); Count += Mf_CutRef2_rec( p, Mf_ObjCutBest(p, pCut[i]), vTemp, Limit-1 );
}
return Count; return Count;
} }
int Mf_CutDeref_rec( Mf_Man_t * p, int * pCut ) int Mf_CutDeref2_rec( Mf_Man_t * p, int * pCut, Vec_Int_t * vTemp, int Limit )
{ {
int i, Count = Mf_CutArea(p, Mf_CutSize(pCut), Mf_CutFunc(pCut)); int i, Count = Mf_CutArea(p, Mf_CutSize(pCut), Mf_CutFunc(pCut));
if ( Limit == 0 ) return Count;
for ( i = 1; i <= Mf_CutSize(pCut); i++ ) for ( i = 1; i <= Mf_CutSize(pCut); i++ )
{
Vec_IntPush( vTemp, pCut[i] );
if ( !Mf_ObjMapRefDec(p, pCut[i]) && Mf_ManObj(p, pCut[i])->iCutSet ) if ( !Mf_ObjMapRefDec(p, pCut[i]) && Mf_ManObj(p, pCut[i])->iCutSet )
Count += Mf_CutDeref_rec( p, Mf_ObjCutBest(p, pCut[i]) ); Count += Mf_CutDeref2_rec( p, Mf_ObjCutBest(p, pCut[i]), vTemp, Limit-1 );
}
return Count; return Count;
} }
static inline int Mf_CutAreaRefed( Mf_Man_t * p, int * pCut ) static inline int Mf_CutAreaRefed2( Mf_Man_t * p, int * pCut )
{ {
int Ela1 = Mf_CutDeref_rec( p, pCut ); int Ela1, iObj, i;
int Ela2 = Mf_CutRef_rec( p, pCut ); Vec_IntClear( &p->vTemp );
assert( Ela1 == Ela2 ); Ela1 = Mf_CutDeref2_rec( p, pCut, &p->vTemp, 8 );
Vec_IntForEachEntry( &p->vTemp, iObj, i )
Mf_ObjMapRefInc( p, iObj );
return Ela1; return Ela1;
} }
static inline int Mf_CutAreaDerefed( Mf_Man_t * p, int * pCut ) static inline int Mf_CutAreaDerefed2( Mf_Man_t * p, int * pCut )
{ {
int Ela1 = Mf_CutRef_rec( p, pCut ); int Ela1, iObj, i;
int Ela2 = Mf_CutDeref_rec( p, pCut ); Vec_IntClear( &p->vTemp );
assert( Ela1 == Ela2 ); Ela1 = Mf_CutRef2_rec( p, pCut, &p->vTemp, 8 );
Vec_IntForEachEntry( &p->vTemp, iObj, i )
Mf_ObjMapRefDec( p, iObj );
return Ela1;
}
static inline int Mf_CutAreaRefed2Multi( Mf_Man_t * p, int iObj, int ** ppCuts, int nCuts )
{
int Ela1 = 0, iTemp, i;
Vec_IntClear( &p->vTemp );
for ( i = 0; i < nCuts; i++ )
Ela1 += Mf_CutDeref2_rec( p, ppCuts[i], &p->vTemp, ABC_INFINITY );
assert( Mf_ObjMapRefNum(p, iObj) == 0 );
Vec_IntForEachEntry( &p->vTemp, iTemp, i )
Mf_ObjMapRefInc( p, iTemp );
return Ela1; return Ela1;
} }
static inline float Mf_CutFlow( Mf_Man_t * p, int * pCut, int * pTime ) static inline float Mf_CutFlow( Mf_Man_t * p, int * pCut, int * pTime )
{ {
Mf_Obj_t * pObj; Mf_Obj_t * pObj;
...@@ -1668,6 +1697,41 @@ static inline void Mf_ObjComputeBestCut( Mf_Man_t * p, int iObj ) ...@@ -1668,6 +1697,41 @@ static inline void Mf_ObjComputeBestCut( Mf_Man_t * p, int iObj )
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
int Mf_ManMappingFromMapping( Mf_Man_t * p )
{
Gia_Man_t * pGia = p->pGia0;
Gia_Obj_t * pObj;
int i, iObj, Count = 0;
Vec_Int_t * vMapping = Vec_IntAlloc( 3 * Gia_ManObjNum(pGia) );
Vec_IntFill( vMapping, Gia_ManObjNum(pGia), 0 );
Gia_ManForEachAnd( pGia, pObj, iObj )
if ( Mf_ObjMapRefNum(p, iObj) )
{
int * pCut = Mf_ObjCutBest(p, iObj);
Vec_IntWriteEntry( vMapping, iObj, Vec_IntSize(vMapping) );
Vec_IntPush( vMapping, Mf_CutSize(pCut) );
for ( i = 1; i <= Mf_CutSize(pCut); i++ )
Vec_IntPush( vMapping, pCut[i] );
Vec_IntPush( vMapping, iObj );
Count++;
}
assert( pGia->vMapping == NULL );
pGia->vMapping = vMapping;
printf( "Mapping is %.2fx larger than AIG manager.\n", 1.0*Vec_IntSize(vMapping)/Gia_ManObjNum(pGia) );
return Count;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Mf_ManPrintFanoutProfile( Mf_Man_t * p, Vec_Int_t * vFanCounts ) void Mf_ManPrintFanoutProfile( Mf_Man_t * p, Vec_Int_t * vFanCounts )
{ {
Gia_Man_t * pGia = p->pGia0; Gia_Man_t * pGia = p->pGia0;
...@@ -1685,11 +1749,9 @@ void Mf_ManPrintFanoutProfile( Mf_Man_t * p, Vec_Int_t * vFanCounts ) ...@@ -1685,11 +1749,9 @@ void Mf_ManPrintFanoutProfile( Mf_Man_t * p, Vec_Int_t * vFanCounts )
int Mf_ManPrintMfccStats( Mf_Man_t * p, int iObj ) int Mf_ManPrintMfccStats( Mf_Man_t * p, int iObj )
{ {
Gia_Man_t * pGia = p->pGia0; Gia_Man_t * pGia = p->pGia0;
int Area = Mf_ObjMapRefNum(p, iObj) > 0 ? int Area;
Mf_CutAreaRefed (p, Mf_ObjCutBest(p, iObj)) :
Mf_CutAreaDerefed(p, Mf_ObjCutBest(p, iObj));
printf( "%5d : Level = %5d Refs = %5d Mffc = %5d\n", printf( "%5d : Level = %5d Refs = %5d Mffc = %5d\n",
iObj, Gia_ObjLevelId(pGia, iObj), Mf_ObjMapRefNum(p, iObj), Area ); iObj, Gia_ObjLevelId(pGia, iObj), Mf_ObjMapRefNum(p, iObj), (Area = Mf_CutAreaMffc(p, iObj)) );
return Area; return Area;
} }
void Mf_ManOptimizationOne( Mf_Man_t * p, int iObj ) void Mf_ManOptimizationOne( Mf_Man_t * p, int iObj )
...@@ -1697,10 +1759,14 @@ void Mf_ManOptimizationOne( Mf_Man_t * p, int iObj ) ...@@ -1697,10 +1759,14 @@ void Mf_ManOptimizationOne( Mf_Man_t * p, int iObj )
Gia_Man_t * pGia = p->pGia0; Gia_Man_t * pGia = p->pGia0;
int * ppCuts[32], nCuts = 0; int * ppCuts[32], nCuts = 0;
int iFanout, i, nAreaSum = 0, nAreaBest = 0; int iFanout, i, nAreaSum = 0, nAreaBest = 0;
// skip pivots whose MFFC fanouts are not used in the mapping or pointed to by COs // skip pivots whose MFFC fanouts are pointed to by COs
Gia_ObjForEachFanoutStaticId( pGia, iObj, iFanout, i ) Gia_ObjForEachFanoutStaticId( pGia, iObj, iFanout, i )
if ( Mf_ObjMapRefNum(p, iFanout) == 0 || Gia_ObjIsCo(Gia_ManObj(pGia, iFanout)) ) if ( Gia_ObjIsCo(Gia_ManObj(pGia, iFanout)) )
return; return;
// the pivot is used in the mapping as well as all of its fanouts
assert( Mf_ObjMapRefNum(p, iObj) > 1 );
Gia_ObjForEachFanoutStaticId( pGia, iObj, iFanout, i )
assert( Mf_ObjMapRefNum(p, iFanout) > 0 );
// print this pivot and its fanouts // print this pivot and its fanouts
printf( "\nPivot node = %d\n", iObj ); printf( "\nPivot node = %d\n", iObj );
printf( "Pivot " ), Mf_ManPrintMfccStats( p, iObj ); printf( "Pivot " ), Mf_ManPrintMfccStats( p, iObj );
...@@ -1711,21 +1777,21 @@ void Mf_ManOptimizationOne( Mf_Man_t * p, int iObj ) ...@@ -1711,21 +1777,21 @@ void Mf_ManOptimizationOne( Mf_Man_t * p, int iObj )
Mf_ObjMapRefInc( p, iFanout ); Mf_ObjMapRefInc( p, iFanout );
Gia_ObjForEachFanoutStaticId( pGia, iObj, iFanout, i ) Gia_ObjForEachFanoutStaticId( pGia, iObj, iFanout, i )
ppCuts[nCuts++] = Mf_ObjCutBest( p, iFanout ); ppCuts[nCuts++] = Mf_ObjCutBest( p, iFanout );
nAreaBest = Mf_CutAreaDerefed2Multi( p, ppCuts, nCuts ); nAreaBest = Mf_CutAreaRefed2Multi( p, iObj, ppCuts, nCuts );
Gia_ObjForEachFanoutStaticId( pGia, iObj, iFanout, i ) Gia_ObjForEachFanoutStaticId( pGia, iObj, iFanout, i )
Mf_ObjMapRefDec( p, iFanout ); Mf_ObjMapRefDec( p, iFanout );
printf( "Sum of MFFC size = %d\n", nAreaSum ); printf( "Sum of MFFC sizes = %d\n", nAreaSum );
printf( "Shared MFFC size = %d\n", nAreaBest ); printf( "Shared MFFC size = %d\n", nAreaBest );
} }
void Mf_ManOptimization( Mf_Man_t * p ) void Mf_ManOptimization( Mf_Man_t * p )
{ {
int nOutMax = 3; int nOutMax = 3;
Gia_Man_t * pGia = p->pGia0; Gia_Man_t * pGia = p->pGia0;
int i, Count, nNodes = Gia_NodeMffcMapping( pGia ); int i, Count, nNodes = Mf_ManMappingFromMapping( p );
Gia_ManLevelNum( pGia ); Gia_ManLevelNum( pGia );
Gia_ManStaticMappingFanoutStart( pGia ); Gia_ManStaticMappingFanoutStart( pGia );
Mf_ManPrintFanoutProfile( p, pGia->vFanoutNums ); Mf_ManPrintFanoutProfile( p, pGia->vFanoutNums );
printf( "\nIndividual logic cones:\n" ); printf( "\nIndividual logic cones for mapping with %d nodes:\n", nNodes );
Vec_IntForEachEntry( pGia->vFanoutNums, Count, i ) Vec_IntForEachEntry( pGia->vFanoutNums, Count, i )
if ( Count >= 2 && Count <= nOutMax && Gia_ObjIsAnd(Gia_ManObj(pGia, i)) ) if ( Count >= 2 && Count <= nOutMax && Gia_ObjIsAnd(Gia_ManObj(pGia, i)) )
Mf_ManOptimizationOne( p, i ); Mf_ManOptimizationOne( p, i );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment