diff options
-rw-r--r-- | src/aig/gia/gia.h | 2 | ||||
-rw-r--r-- | src/aig/gia/giaIf.c | 37 | ||||
-rw-r--r-- | src/aig/gia/giaJf.c | 4 | ||||
-rw-r--r-- | src/aig/gia/giaMan.c | 2 | ||||
-rw-r--r-- | src/base/abci/abc.c | 8 |
5 files changed, 50 insertions, 3 deletions
diff --git a/src/aig/gia/gia.h b/src/aig/gia/gia.h index a2f6aeb1..919c1031 100644 --- a/src/aig/gia/gia.h +++ b/src/aig/gia/gia.h @@ -189,6 +189,7 @@ struct Gps_Par_t_ int fSwitch; int fCut; int fNpn; + int fLutProf; }; typedef struct Emb_Par_t_ Emb_Par_t; @@ -1041,6 +1042,7 @@ extern int Gia_ManHashAndMulti( Gia_Man_t * p, Vec_Int_t * vLits /*=== giaIf.c ===========================================================*/ extern void Gia_ManPrintMappingStats( Gia_Man_t * p ); extern void Gia_ManPrintPackingStats( Gia_Man_t * p ); +extern void Gia_ManPrintLutStats( Gia_Man_t * p ); extern int Gia_ManLutFaninCount( Gia_Man_t * p ); extern int Gia_ManLutSizeMax( Gia_Man_t * p ); extern int Gia_ManLutNum( Gia_Man_t * p ); diff --git a/src/aig/gia/giaIf.c b/src/aig/gia/giaIf.c index c4c5fcda..cf4eef5a 100644 --- a/src/aig/gia/giaIf.c +++ b/src/aig/gia/giaIf.c @@ -312,6 +312,43 @@ void Gia_ManPrintPackingStats( Gia_Man_t * p ) Abc_Print( 1, "\n" ); } +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Gia_ManPrintNodeProfile( int * pCounts, int nSizeMax ) +{ + int i, SizeAll = 0, NodeAll = 0; + for ( i = 0; i <= nSizeMax; i++ ) + { + SizeAll += i * pCounts[i]; + NodeAll += pCounts[i]; + } + Abc_Print( 1, "LUT = %d : ", NodeAll ); + for ( i = 2; i <= nSizeMax; i++ ) + Abc_Print( 1, "%d=%d %.1f %% ", i, pCounts[i], 100.0*pCounts[i]/NodeAll ); + Abc_Print( 1, "Ave = %.2f\n", 1.0*SizeAll/(NodeAll ? NodeAll : 1) ); +} +void Gia_ManPrintLutStats( Gia_Man_t * p ) +{ + int i, nSizeMax, pCounts[33] = {0}; + nSizeMax = Gia_ManLutSizeMax( p ); + if ( nSizeMax > 32 ) + { + Abc_Print( 1, "The max LUT size (%d) is too large.\n", nSizeMax ); + return; + } + Gia_ManForEachLut( p, i ) + pCounts[ Gia_ObjLutSize(p, i) ]++; + Gia_ManPrintNodeProfile( pCounts, nSizeMax ); +} /**Function************************************************************* diff --git a/src/aig/gia/giaJf.c b/src/aig/gia/giaJf.c index 4ee846ab..f66e07f3 100644 --- a/src/aig/gia/giaJf.c +++ b/src/aig/gia/giaJf.c @@ -781,7 +781,8 @@ void Jf_ManDeriveMapping( Jf_Man_t * p ) Vec_Int_t * vMapping; Gia_Obj_t * pObj; int i, k, * pCut; - vMapping = Vec_IntStart( Gia_ManObjNum(p->pGia) ); + vMapping = Vec_IntAlloc( Gia_ManObjNum(p->pGia) + p->pPars->Edge + p->pPars->Area * 2 ); + Vec_IntFill( vMapping, Gia_ManObjNum(p->pGia), 0 ); Gia_ManForEachAnd( p->pGia, pObj, i ) { if ( Gia_ObjIsBuf(pObj) || Gia_ObjRefNum(p->pGia, pObj) == 0 ) @@ -792,6 +793,7 @@ void Jf_ManDeriveMapping( Jf_Man_t * p ) Vec_IntPush( vMapping, pCut[k] ); Vec_IntPush( vMapping, i ); } + assert( Vec_IntSize(vMapping) == Vec_IntCap(vMapping) ); p->pGia->vMapping = vMapping; // Gia_ManMappingVerify( p->pGia ); } diff --git a/src/aig/gia/giaMan.c b/src/aig/gia/giaMan.c index ff48b405..8c5b3d99 100644 --- a/src/aig/gia/giaMan.c +++ b/src/aig/gia/giaMan.c @@ -363,6 +363,8 @@ void Gia_ManPrintStats( Gia_Man_t * p, Gps_Par_t * pPars ) Gia_ManPrintNpnClasses( p ); if ( p->vPacking ) Gia_ManPrintPackingStats( p ); + if ( pPars && pPars->fLutProf && Gia_ManHasMapping(p) ) + Gia_ManPrintLutStats( p ); if ( p->pPlacement ) Gia_ManPrintPlacement( p ); if ( p->pManTime ) diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index 9162f548..1b525041 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -25268,7 +25268,7 @@ int Abc_CommandAbc9Ps( Abc_Frame_t * pAbc, int argc, char ** argv ) int c; memset( pPars, 0, sizeof(Gps_Par_t) ); Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "tpcnh" ) ) != EOF ) + while ( ( c = Extra_UtilGetopt( argc, argv, "tpcnlh" ) ) != EOF ) { switch ( c ) { @@ -25284,6 +25284,9 @@ int Abc_CommandAbc9Ps( Abc_Frame_t * pAbc, int argc, char ** argv ) case 'n': pPars->fNpn ^= 1; break; + case 'l': + pPars->fLutProf ^= 1; + break; case 'h': goto usage; default: @@ -25299,12 +25302,13 @@ int Abc_CommandAbc9Ps( Abc_Frame_t * pAbc, int argc, char ** argv ) return 0; usage: - Abc_Print( -2, "usage: &ps [-tpcnh]\n" ); + Abc_Print( -2, "usage: &ps [-tpcnlh]\n" ); Abc_Print( -2, "\t prints stats of the current AIG\n" ); Abc_Print( -2, "\t-t : toggle printing BMC tents [default = %s]\n", pPars->fTents? "yes": "no" ); Abc_Print( -2, "\t-p : toggle printing switching activity [default = %s]\n", pPars->fSwitch? "yes": "no" ); Abc_Print( -2, "\t-c : toggle printing the size of frontier cut [default = %s]\n", pPars->fCut? "yes": "no" ); Abc_Print( -2, "\t-n : toggle printing NPN classes of functions [default = %s]\n", pPars->fNpn? "yes": "no" ); + Abc_Print( -2, "\t-l : toggle printing LUT size profile [default = %s]\n", pPars->fLutProf? "yes": "no" ); Abc_Print( -2, "\t-h : print the command usage\n"); return 1; } |