Commit 755e0995 by Alan Mishchenko

Added computation of mapping overlap in &ps.

parent 6132d7cb
...@@ -211,7 +211,7 @@ void Gia_ManSetRefsMapped( Gia_Man_t * p ) ...@@ -211,7 +211,7 @@ void Gia_ManSetRefsMapped( Gia_Man_t * p )
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
int Gia_ManComputeOverlapOne_rec( Gia_Man_t * p, int iObj, Vec_Str_t * vLabel, Vec_Int_t * vVisit ) int Gia_ManComputeOverlap2One_rec( Gia_Man_t * p, int iObj, Vec_Str_t * vLabel, Vec_Int_t * vVisit )
{ {
Gia_Obj_t * pObj; Gia_Obj_t * pObj;
int Counter; int Counter;
...@@ -220,34 +220,34 @@ int Gia_ManComputeOverlapOne_rec( Gia_Man_t * p, int iObj, Vec_Str_t * vLabel, V ...@@ -220,34 +220,34 @@ int Gia_ManComputeOverlapOne_rec( Gia_Man_t * p, int iObj, Vec_Str_t * vLabel, V
Vec_StrWriteEntry( vLabel, iObj, 1 ); Vec_StrWriteEntry( vLabel, iObj, 1 );
pObj = Gia_ManObj( p, iObj ); pObj = Gia_ManObj( p, iObj );
assert( Gia_ObjIsAnd(pObj) ); assert( Gia_ObjIsAnd(pObj) );
Counter = Gia_ManComputeOverlapOne_rec( p, Gia_ObjFaninId0(pObj, iObj), vLabel, vVisit ); Counter = Gia_ManComputeOverlap2One_rec( p, Gia_ObjFaninId0(pObj, iObj), vLabel, vVisit );
Counter += Gia_ManComputeOverlapOne_rec( p, Gia_ObjFaninId1(pObj, iObj), vLabel, vVisit ); Counter += Gia_ManComputeOverlap2One_rec( p, Gia_ObjFaninId1(pObj, iObj), vLabel, vVisit );
Vec_IntPush( vVisit, iObj ); Vec_IntPush( vVisit, iObj );
return Counter + 1; return Counter + 1;
} }
int Gia_ManComputeOverlapOne( Gia_Man_t * p, int iObj, Vec_Str_t * vLabel, Vec_Int_t * vVisit ) int Gia_ManComputeOverlap2One( Gia_Man_t * p, int iObj, Vec_Str_t * vLabel, Vec_Int_t * vVisit )
{ {
int iFan, k, Counter; int iFan, k, Counter;
Vec_IntClear( vVisit ); Vec_IntClear( vVisit );
Gia_LutForEachFanin( p, iObj, iFan, k ) Gia_LutForEachFanin( p, iObj, iFan, k )
Vec_StrWriteEntry( vLabel, iFan, 1 ); Vec_StrWriteEntry( vLabel, iFan, 1 );
Counter = Gia_ManComputeOverlapOne_rec( p, iObj, vLabel, vVisit ); Counter = Gia_ManComputeOverlap2One_rec( p, iObj, vLabel, vVisit );
Gia_LutForEachFanin( p, iObj, iFan, k ) Gia_LutForEachFanin( p, iObj, iFan, k )
Vec_StrWriteEntry( vLabel, iFan, 0 ); Vec_StrWriteEntry( vLabel, iFan, 0 );
Vec_IntForEachEntry( vVisit, iFan, k ) Vec_IntForEachEntry( vVisit, iFan, k )
Vec_StrWriteEntry( vLabel, iFan, 0 ); Vec_StrWriteEntry( vLabel, iFan, 0 );
return Counter; return Counter;
} }
int Gia_ManComputeOverlap( Gia_Man_t * p ) int Gia_ManComputeOverlap2( Gia_Man_t * p )
{ {
Vec_Int_t * vVisit; Vec_Int_t * vVisit;
Vec_Str_t * vLabel; Vec_Str_t * vLabel;
int i, Count = 0; int i, Count = -Gia_ManAndNum(p);
assert( Gia_ManHasMapping(p) ); assert( Gia_ManHasMapping(p) );
vVisit = Vec_IntAlloc( 100 ); vVisit = Vec_IntAlloc( 100 );
vLabel = Vec_StrStart( Gia_ManObjNum(p) ); vLabel = Vec_StrStart( Gia_ManObjNum(p) );
Gia_ManForEachLut( p, i ) Gia_ManForEachLut( p, i )
Count += Gia_ManComputeOverlapOne( p, i, vLabel, vVisit ); Count += Gia_ManComputeOverlap2One( p, i, vLabel, vVisit );
Vec_StrFree( vLabel ); Vec_StrFree( vLabel );
Vec_IntFree( vVisit ); Vec_IntFree( vVisit );
return Count; return Count;
...@@ -255,6 +255,45 @@ int Gia_ManComputeOverlap( Gia_Man_t * p ) ...@@ -255,6 +255,45 @@ int Gia_ManComputeOverlap( Gia_Man_t * p )
/**Function************************************************************* /**Function*************************************************************
Synopsis [Calculate mapping overlap.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int Gia_ManComputeOverlapOne_rec( Gia_Man_t * p, int iObj )
{
Gia_Obj_t * pObj;
if ( Gia_ObjIsTravIdCurrentId(p, iObj) )
return 0;
Gia_ObjSetTravIdCurrentId( p, iObj );
pObj = Gia_ManObj( p, iObj );
assert( Gia_ObjIsAnd(pObj) );
return 1 + Gia_ManComputeOverlapOne_rec( p, Gia_ObjFaninId0(pObj, iObj) )
+ Gia_ManComputeOverlapOne_rec( p, Gia_ObjFaninId1(pObj, iObj) );
}
int Gia_ManComputeOverlapOne( Gia_Man_t * p, int iObj )
{
int iFan, k;
Gia_ManIncrementTravId(p);
Gia_LutForEachFanin( p, iObj, iFan, k )
Gia_ObjSetTravIdCurrentId( p, iFan );
return Gia_ManComputeOverlapOne_rec( p, iObj );
}
int Gia_ManComputeOverlap( Gia_Man_t * p )
{
int i, Count = -Gia_ManAndNum(p);
assert( Gia_ManHasMapping(p) );
Gia_ManForEachLut( p, i )
Count += Gia_ManComputeOverlapOne( p, i );
return Count;
}
/**Function*************************************************************
Synopsis [Prints mapping statistics.] Synopsis [Prints mapping statistics.]
Description [] Description []
...@@ -286,7 +325,7 @@ void Gia_ManPrintMappingStats( Gia_Man_t * p ) ...@@ -286,7 +325,7 @@ void Gia_ManPrintMappingStats( Gia_Man_t * p )
Abc_Print( 1, "lut =%7d ", nLuts ); Abc_Print( 1, "lut =%7d ", nLuts );
Abc_Print( 1, "edge =%8d ", nFanins ); Abc_Print( 1, "edge =%8d ", nFanins );
Abc_Print( 1, "lev =%5d ", LevelMax ); Abc_Print( 1, "lev =%5d ", LevelMax );
Abc_Print( 1, "over =%5.1f %% ", 100.0 * Gia_ManComputeOverlap(p) / Gia_ManAndNum(p) - 100.0 ); Abc_Print( 1, "over =%5.1f %% ", 100.0 * Gia_ManComputeOverlap(p) / Gia_ManAndNum(p) );
Abc_Print( 1, "mem =%5.2f MB", 4.0*(Gia_ManObjNum(p) + 2*nLuts + nFanins)/(1<<20) ); Abc_Print( 1, "mem =%5.2f MB", 4.0*(Gia_ManObjNum(p) + 2*nLuts + nFanins)/(1<<20) );
Abc_Print( 1, "\n" ); Abc_Print( 1, "\n" );
/* /*
......
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