summaryrefslogtreecommitdiffstats
path: root/src/base/cba/cbaNtk.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2015-09-03 14:33:53 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2015-09-03 14:33:53 -0700
commit6352d0b626472443887d9600b5ab0e3963734737 (patch)
treef79428d295c0e153366f4c716768ddf6abfa7c26 /src/base/cba/cbaNtk.c
parentaf828a499da1f3357f8b170c9be12f4695190750 (diff)
downloadabc-6352d0b626472443887d9600b5ab0e3963734737.tar.gz
abc-6352d0b626472443887d9600b5ab0e3963734737.tar.bz2
abc-6352d0b626472443887d9600b5ab0e3963734737.zip
Improvements to Cba data-structure.
Diffstat (limited to 'src/base/cba/cbaNtk.c')
-rw-r--r--src/base/cba/cbaNtk.c266
1 files changed, 265 insertions, 1 deletions
diff --git a/src/base/cba/cbaNtk.c b/src/base/cba/cbaNtk.c
index 6c312e88..d5598c43 100644
--- a/src/base/cba/cbaNtk.c
+++ b/src/base/cba/cbaNtk.c
@@ -18,6 +18,7 @@
***********************************************************************/
+#include <math.h>
#include "cba.h"
ABC_NAMESPACE_IMPL_START
@@ -32,6 +33,269 @@ ABC_NAMESPACE_IMPL_START
/**Function*************************************************************
+ Synopsis [Prints distribution of operator types.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+static inline void Vec_WrdSelectSortCost2( word * pArray, int nSize, word * pCosts )
+{
+ int i, j, best_i;
+ for ( i = 0; i < nSize-1; i++ )
+ {
+ best_i = i;
+ for ( j = i+1; j < nSize; j++ )
+ if ( pCosts[j] < pCosts[best_i] )
+ best_i = j;
+ ABC_SWAP( word, pArray[i], pArray[best_i] );
+ ABC_SWAP( word, pCosts[i], pCosts[best_i] );
+ }
+}
+static inline word Cba_NtkPrintDistribMakeSign( int s, int s0, int s1 )
+{
+ return ((word)s1 << 42) | ((word)s0 << 21) | (word)s;
+}
+static inline void Cba_NtkPrintDistribFromSign( word sss, int * s, int * s0, int * s1 )
+{
+ *s1 = (int)(sss >> 42); *s0 = (int)(sss >> 21) & 0x1FFFFF; *s = (int)sss & 0x1FFFFF;
+}
+static inline void Cba_NtkPrintDistribAddOne( Vec_Ptr_t * vTypes, Vec_Ptr_t * vOccurs, int Type, word Sign )
+{
+ Vec_Wrd_t * vType = (Vec_Wrd_t *)Vec_PtrEntry( vTypes, Type );
+ Vec_Wrd_t * vOccur = (Vec_Wrd_t *)Vec_PtrEntry( vOccurs, Type );
+ word Entry; int i;
+ Vec_WrdForEachEntry( vType, Entry, i )
+ if ( Entry == Sign )
+ {
+ Vec_WrdAddToEntry( vOccur, i, 1 );
+ return;
+ }
+ Vec_WrdPush( vType, Sign );
+ Vec_WrdPush( vOccur, 1 );
+}
+void Cba_NtkPrintDistribSortOne( Vec_Ptr_t * vTypes, Vec_Ptr_t * vOccurs, int Type )
+{
+ Vec_Wrd_t * vType = (Vec_Wrd_t *)Vec_PtrEntry( vTypes, Type );
+ Vec_Wrd_t * vOccur = (Vec_Wrd_t *)Vec_PtrEntry( vOccurs, Type );
+ Vec_WrdSelectSortCost2( Vec_WrdArray(vType), Vec_WrdSize(vType), Vec_WrdArray(vOccur) );
+ Vec_WrdReverseOrder( vType );
+ Vec_WrdReverseOrder( vOccur );
+}
+void Cba_NtkPrintDistrib( Cba_Ntk_t * p, int fVerbose )
+{
+ Vec_Ptr_t * vTypes, * vOccurs;
+ Vec_Int_t * vAnds = Vec_IntStart( CBA_BOX_LAST );
+ int iRnObj = -1, nCountRange = 0;
+ int i, k, s, s0, s1, Type; word Sign;
+ char * pTypeNames[CBA_BOX_LAST];
+ Cba_ManCreatePrimMap( pTypeNames );
+ // allocate statistics arrays
+ vTypes = Vec_PtrStart( CBA_BOX_LAST );
+ vOccurs = Vec_PtrStart( CBA_BOX_LAST );
+ for ( i = 0; i < CBA_BOX_LAST; i++ )
+ Vec_PtrWriteEntry( vTypes, i, Vec_WrdAlloc(16) );
+ for ( i = 0; i < CBA_BOX_LAST; i++ )
+ Vec_PtrWriteEntry( vOccurs, i, Vec_WrdAlloc(16) );
+ // add nodes
+ Cba_NtkForEachObj( p, i )
+ {
+// char * pName = Cba_ObjName(p, i);
+ Type = Cba_ObjType( p, i );
+ if ( Cba_ObjSign(p, i) > 0x1FFFFF )
+ printf( "Object %6d has range %d, which is reduced to %d in the statistics.\n",
+ i, Cba_ObjRangeSize(p, i), Cba_ObjRangeSize(p, i) & 0xFFFFF );
+ if ( Cba_ObjLeft(p, i) && Cba_ObjRight(p, i) )
+ {
+ if ( iRnObj == -1 )
+ iRnObj = 1;
+ nCountRange++;
+ }
+ // 0-input types
+ if ( Cba_ObjIsPi(p, i) || (Type == CBA_BOX_BUF && Cba_FonIsConst(Cba_ObjFinFon(p, i, 0))) || Type == CBA_BOX_CONCAT )
+ Sign = Cba_NtkPrintDistribMakeSign( Cba_ObjSign(p, i), 0, 0 );
+ // 1-input types
+ else if ( Cba_TypeIsUnary(Type) )
+ Sign = Cba_NtkPrintDistribMakeSign( Cba_ObjSign(p, i), Cba_ObjSign(p, Cba_ObjFinFon(p, i, 0)), 0 );
+ // 2-input types (including MUX)
+ else if ( Cba_ObjFinNum(p, i) == 1 )
+ Sign = Cba_NtkPrintDistribMakeSign( Cba_ObjSign(p, i), Cba_ObjSign(p, Cba_ObjFinFon(p, i, 0)), 0 );
+ else
+ {
+ assert( Cba_ObjFinNum(p, i) >= 2 );
+ Sign = Cba_NtkPrintDistribMakeSign( Cba_ObjSign(p, i), Cba_ObjSign(p, Cba_ObjFinFon(p, i, 0)), Cba_ObjSign(p, Cba_ObjFinFon(p, i, 1)) );
+ }
+ // add to storage
+ Cba_NtkPrintDistribAddOne( vTypes, vOccurs, Type, Sign );
+ // count the number of AIG nodes
+ if ( Type == CBA_BOX_MUX )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_MUX, 3 * Cba_ObjRangeSize(p, i) * (Cba_ObjFinNum(p, i) - 2) );
+ else if ( Type == CBA_BOX_SHIR )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_SHIR, Abc_MinInt(Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)), Abc_Base2Log(Cba_ObjRangeSize(p, i))) * 3 );
+ else if ( Type == CBA_BOX_SHIRA )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_SHIRA, Cba_ObjRangeSize(p, i) * Abc_MinInt(Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)), Abc_Base2Log(Cba_ObjRangeSize(p, i))) * 3 );
+ else if ( Type == CBA_BOX_SHIL )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_SHIL, Cba_ObjRangeSize(p, i) * Abc_MinInt(Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)), Abc_Base2Log(Cba_ObjRangeSize(p, i))) * 3 );
+ else if ( Type == CBA_BOX_SHILA )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_SHILA, Cba_ObjRangeSize(p, i) * Abc_MinInt(Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)), Abc_Base2Log(Cba_ObjRangeSize(p, i))) * 3 );
+ else if ( Type == CBA_BOX_ROTR )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_ROTR, Cba_ObjRangeSize(p, i) * Abc_MinInt(Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)), Abc_Base2Log(Cba_ObjRangeSize(p, i))) * 3 );
+ else if ( Type == CBA_BOX_ROTL )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_ROTL, Cba_ObjRangeSize(p, i) * Abc_MinInt(Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)), Abc_Base2Log(Cba_ObjRangeSize(p, i))) * 3 );
+ else if ( Type == CBA_BOX_INV )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_INV, 0 );
+ else if ( Type == CBA_BOX_AND )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_AND, Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) );
+ else if ( Type == CBA_BOX_OR )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_OR, Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) );
+ else if ( Type == CBA_BOX_XOR )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_XOR, 3 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) );
+ else if ( Type == CBA_BOX_SLICE )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_SLICE, 0 );
+ else if ( Type == CBA_BOX_CONCAT )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_CONCAT, 0 );
+ else if ( Type == CBA_BOX_LNOT )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_LNOT, Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) - 1 );
+ else if ( Type == CBA_BOX_LAND )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_LAND, Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) + Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 1)) - 1 );
+ else if ( Type == CBA_BOX_LOR )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_LOR, Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) + Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 1)) - 1 );
+ else if ( Type == CBA_BOX_LXOR )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_LXOR, Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) + Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 1)) + 1 );
+ else if ( Type == CBA_BOX_EQU )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_EQU, 4 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) - 1 );
+ else if ( Type == CBA_BOX_NEQU )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_NEQU, 4 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) - 1 );
+ else if ( Type == CBA_BOX_LTHAN )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_LTHAN, 6 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) - 6 );
+ else if ( Type == CBA_BOX_MTHAN )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_MTHAN, 6 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) - 6 );
+ else if ( Type == CBA_BOX_LETHAN )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_LETHAN, 6 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) - 6 );
+ else if ( Type == CBA_BOX_METHAN )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_METHAN, 6 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) - 6 );
+ else if ( Type == CBA_BOX_RAND )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_RAND, Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) - 1 );
+ else if ( Type == CBA_BOX_ROR )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_ROR, Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) - 1 );
+ else if ( Type == CBA_BOX_RXOR )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_RXOR, 3 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) - 3 );
+ else if ( Type == CBA_BOX_ADD )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_ADD, 9 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) );
+ else if ( Type == CBA_BOX_SUB )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_SUB, 9 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) );
+ else if ( Type == CBA_BOX_MUL )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_MUL, 9 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 1)) );
+ else if ( Type == CBA_BOX_DIV )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_DIV, 13 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) - 19 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) + 10 );
+ else if ( Type == CBA_BOX_MOD )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_MOD, 13 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) - 7 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) - 2 );
+ else if ( Type == CBA_BOX_POW )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_POW, 10 * (int)pow(Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)),Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0))) );
+ else if ( Type == CBA_BOX_MIN )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_MIN, 4 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) );
+ else if ( Type == CBA_BOX_SQRT )
+ Vec_IntAddToEntry( vAnds, CBA_BOX_SQRT, 11 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) / 8 + 5 * Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)) / 2 - 5 );
+ }
+ if ( nCountRange )
+ {
+ printf( "Warning: %d objects of the design have non-zero-based ranges.\n", nCountRange );
+ printf( "In particular, object %6d with name \"%s\" has range %d=[%d:%d]\n",
+ iRnObj, Cba_FonName(p, Cba_ObjFon0(p, iRnObj)),
+ Cba_ObjRangeSize(p, iRnObj), Cba_ObjLeft(p, iRnObj), Cba_ObjRight(p, iRnObj) );
+ }
+ // print by occurrence
+ printf( "ID : name occurrence and2 (occurrence)<output_range>=<input_range>.<input_range> ...\n" );
+ for ( i = 0; i < CBA_BOX_LAST; i++ )
+ {
+ Vec_Wrd_t * vType = (Vec_Wrd_t *)Vec_PtrEntry( vTypes, i );
+ Vec_Wrd_t * vOccur = (Vec_Wrd_t *)Vec_PtrEntry( vOccurs, i );
+ if ( p->pDesign->nObjs[i] == 0 )
+ continue;
+ printf( "%2d : %-8s %6d%8d ", i, pTypeNames[i], p->pDesign->nObjs[i], Vec_IntEntry(vAnds, i) );
+ // sort by occurence
+ Cba_NtkPrintDistribSortOne( vTypes, vOccurs, i );
+ Vec_WrdForEachEntry( vType, Sign, k )
+ {
+ Cba_NtkPrintDistribFromSign( Sign, &s, &s0, &s1 );
+ if ( ((k % 6) == 5 && s1) || ((k % 8) == 7 && !s1) )
+ printf( "\n " );
+ printf( "(%d)", (int)Vec_WrdEntry( vOccur, k ) );
+ printf( "%s%d", Abc_LitIsCompl(s)?"-":"", Abc_Lit2Var(s) );
+ if ( s0 )
+ printf( "=%s%d", Abc_LitIsCompl(s0)?"-":"", Abc_Lit2Var(s0) );
+ if ( s1 )
+ printf( ".%s%d", Abc_LitIsCompl(s1)?"-":"", Abc_Lit2Var(s1) );
+ printf( " " );
+ }
+ printf( "\n" );
+ }
+ Vec_VecFree( (Vec_Vec_t *)vTypes );
+ Vec_VecFree( (Vec_Vec_t *)vOccurs );
+ Vec_IntFree( vAnds );
+}
+void Cba_NtkPrintNodes( Cba_Ntk_t * p, int Type )
+{
+ int i, iFon0, iFon1, Counter = 0;
+ char * pTypeNames[CBA_BOX_LAST];
+ Cba_ManCreatePrimMap( pTypeNames );
+ printf( "Operation %s\n", pTypeNames[Type] );
+ Cba_NtkForEachObj( p, i )
+ {
+ if ( (int)Type != Type )
+ continue;
+ iFon0 = Cba_ObjFinFon(p, i, 0);
+ iFon1 = Cba_ObjFinFon(p, i, 1);
+
+ printf( "%8d :", Counter++ );
+ printf( "%8d : ", i );
+ printf( "%3d%s = ", Cba_ObjRangeSize(p, i), Cba_ObjSigned(p, i) ? "s" : " " );
+ printf( "%3d%s %s ", Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 0)), Cba_ObjSigned(p, iFon0) ? "s" : " ", pTypeNames[Type] );
+ printf( "%3d%s ", Cba_ObjRangeSize(p, Cba_ObjFinFon(p, i, 1)), Cba_ObjSigned(p, iFon1) ? "s" : " " );
+ printf( " : " );
+ printf( "%-12s = ", Cba_ObjName(p, i) );
+ printf( "%-12s %s ", Cba_FonIsConst(iFon0) ? Cba_NtkConst(p, Cba_FonConst(iFon0)) : Cba_FonNameStr(p, iFon0), pTypeNames[Type] );
+ printf( "%-12s ", Cba_FonIsConst(iFon1) ? Cba_NtkConst(p, Cba_FonConst(iFon1)) : Cba_FonNameStr(p, iFon1) );
+ printf( "\n" );
+ }
+}
+void Cba_NtkPrintStatsFull( Cba_Ntk_t * p, int fDistrib, int fVerbose )
+{
+ int i;
+ char * pTypeNames[CBA_BOX_LAST];
+ Cba_ManCreatePrimMap( pTypeNames );
+ printf( "%-20s : ", Cba_NtkName(p) );
+ printf( "PI = %4d ", Cba_NtkPiNum(p) );
+ printf( "PO = %4d ", Cba_NtkPoNum(p) );
+ printf( "FF = %4d ", Cba_NtkBoxSeqNum(p) );
+ printf( "Obj = %6d ", Cba_NtkObjNum(p) );
+ printf( "Mem = %.3f MB", 1.0*Cba_NtkMemory(p)/(1<<20) );
+ printf( "\n" );
+ if ( fDistrib )
+ {
+ Cba_NtkPrintDistrib( p, fVerbose );
+ return;
+ }
+ if ( !fVerbose )
+ return;
+ printf( "Node type statistics:\n" );
+ for ( i = 1; i < CBA_BOX_LAST; i++ )
+ {
+ if ( !p->pDesign->nObjs[i] )
+ continue;
+ if ( p->pDesign->nAnds[0] && p->pDesign->nAnds[i] )
+ printf( "%2d : %-8s %6d %7.2f %%\n", i, pTypeNames[i], p->pDesign->nObjs[i], 100.0*p->pDesign->nAnds[i]/p->pDesign->nAnds[0] );
+ else
+ printf( "%2d : %-8s %6d\n", i, pTypeNames[i], p->pDesign->nObjs[i] );
+ }
+}
+
+
+/**Function*************************************************************
+
Synopsis []
Description []
@@ -63,7 +327,7 @@ void Cba_NtkPrintDistribStat( Cba_Ntk_t * p, int * pCounts, int * pUserCounts )
if ( pUserCounts[i] )
printf( "%-20s = %5d\n", Cba_NtkName(pNtk), pUserCounts[i] );
}
-void Cba_NtkPrintDistrib( Cba_Ntk_t * p )
+void Cba_NtkPrintDistribOld( Cba_Ntk_t * p )
{
int pCounts[CBA_BOX_LAST] = {0};
int * pUserCounts = ABC_CALLOC( int, Cba_ManNtkNum(p->pDesign) + 1 );