Commit d332e670 by Alan Mishchenko

Improving Wlc_Ntk_t data-structure by extending bit-ranges up to 4B enabling…

Improving Wlc_Ntk_t data-structure by extending bit-ranges up to 4B enabling printout of AND2 in '%ps -d'.
parent 0aab9356
...@@ -101,16 +101,16 @@ typedef enum { ...@@ -101,16 +101,16 @@ typedef enum {
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
typedef struct Wlc_Obj_t_ Wlc_Obj_t; typedef struct Wlc_Obj_t_ Wlc_Obj_t;
struct Wlc_Obj_t_ // 16 bytes struct Wlc_Obj_t_ // 24 bytes
{ {
unsigned Type : 6; // node type unsigned Type : 6; // node type
unsigned Signed : 1; // signed unsigned Signed : 1; // signed
unsigned Mark : 1; // user mark unsigned Mark : 1; // user mark
unsigned fIsPo : 1; // this is PO unsigned fIsPo : 1; // this is PO
unsigned fIsFi : 1; // this is FI unsigned fIsFi : 1; // this is FI
unsigned nFanins : 22; // fanin count unsigned nFanins; // fanin count
unsigned End : 16; // range end unsigned End; // range end
unsigned Beg : 16; // range begin unsigned Beg; // range begin
union { int Fanins[2]; // fanin IDs union { int Fanins[2]; // fanin IDs
int * pFanins[1]; }; int * pFanins[1]; };
}; };
......
...@@ -290,8 +290,9 @@ void Wlc_NtkPrintDistribSortOne( Vec_Ptr_t * vTypes, Vec_Ptr_t * vOccurs, int Ty ...@@ -290,8 +290,9 @@ void Wlc_NtkPrintDistribSortOne( Vec_Ptr_t * vTypes, Vec_Ptr_t * vOccurs, int Ty
} }
void Wlc_NtkPrintDistrib( Wlc_Ntk_t * p, int fVerbose ) void Wlc_NtkPrintDistrib( Wlc_Ntk_t * p, int fVerbose )
{ {
Wlc_Obj_t * pObj; Wlc_Obj_t * pObj, * pObjRange = NULL; int nCountRange = 0;
Vec_Ptr_t * vTypes, * vOccurs; Vec_Ptr_t * vTypes, * vOccurs;
Vec_Int_t * vAnds = Vec_IntStart( WLC_OBJ_NUMBER );
word Sign; word Sign;
int i, k, s, s0, s1; int i, k, s, s0, s1;
// allocate statistics arrays // allocate statistics arrays
...@@ -309,8 +310,12 @@ void Wlc_NtkPrintDistrib( Wlc_Ntk_t * p, int fVerbose ) ...@@ -309,8 +310,12 @@ void Wlc_NtkPrintDistrib( Wlc_Ntk_t * p, int fVerbose )
printf( "Object %6d has range %d, which is reduced to %d in the statistics.\n", printf( "Object %6d has range %d, which is reduced to %d in the statistics.\n",
i, Wlc_ObjRange(pObj), Wlc_ObjRange(pObj) & 0xFFFFF ); i, Wlc_ObjRange(pObj), Wlc_ObjRange(pObj) & 0xFFFFF );
if ( pObj->Beg ) if ( pObj->Beg )
printf( "Object %6d has non-standard range %d=[%d:%d]\n", i, Wlc_ObjRange(pObj), pObj->End, pObj->Beg ); {
// 0-input types if ( pObjRange == NULL )
pObjRange = pObj;
nCountRange++;
}
// 0-input types
if ( Wlc_ObjIsCi(pObj) || pObj->Type == WLC_OBJ_CONST || pObj->Type == WLC_OBJ_BIT_CONCAT ) if ( Wlc_ObjIsCi(pObj) || pObj->Type == WLC_OBJ_CONST || pObj->Type == WLC_OBJ_BIT_CONCAT )
Sign = Wlc_NtkPrintDistribMakeSign( Wlc_ObjSign(pObj), 0, 0 ); Sign = Wlc_NtkPrintDistribMakeSign( Wlc_ObjSign(pObj), 0, 0 );
// 1-input types // 1-input types
...@@ -328,23 +333,102 @@ void Wlc_NtkPrintDistrib( Wlc_Ntk_t * p, int fVerbose ) ...@@ -328,23 +333,102 @@ void Wlc_NtkPrintDistrib( Wlc_Ntk_t * p, int fVerbose )
} }
// add to storage // add to storage
Wlc_NtkPrintDistribAddOne( vTypes, vOccurs, pObj->Type, Sign ); Wlc_NtkPrintDistribAddOne( vTypes, vOccurs, pObj->Type, Sign );
// count the number of AIG nodes
if ( pObj->Type == WLC_OBJ_MUX )
Vec_IntAddToEntry( vAnds, WLC_OBJ_MUX, 3 * Wlc_ObjRange(pObj) * (Wlc_ObjFaninNum(pObj) - 2) );
else if ( pObj->Type == WLC_OBJ_SHIFT_R )
Vec_IntAddToEntry( vAnds, WLC_OBJ_SHIFT_R, Abc_MinInt(Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)), Abc_Base2Log(Wlc_ObjRange(pObj))) * 3 );
else if ( pObj->Type == WLC_OBJ_SHIFT_RA )
Vec_IntAddToEntry( vAnds, WLC_OBJ_SHIFT_RA, Wlc_ObjRange(pObj) * Abc_MinInt(Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)), Abc_Base2Log(Wlc_ObjRange(pObj))) * 3 );
else if ( pObj->Type == WLC_OBJ_SHIFT_L )
Vec_IntAddToEntry( vAnds, WLC_OBJ_SHIFT_L, Wlc_ObjRange(pObj) * Abc_MinInt(Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)), Abc_Base2Log(Wlc_ObjRange(pObj))) * 3 );
else if ( pObj->Type == WLC_OBJ_SHIFT_LA )
Vec_IntAddToEntry( vAnds, WLC_OBJ_SHIFT_LA, Wlc_ObjRange(pObj) * Abc_MinInt(Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)), Abc_Base2Log(Wlc_ObjRange(pObj))) * 3 );
else if ( pObj->Type == WLC_OBJ_ROTATE_R )
Vec_IntAddToEntry( vAnds, WLC_OBJ_ROTATE_R, Wlc_ObjRange(pObj) * Abc_MinInt(Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)), Abc_Base2Log(Wlc_ObjRange(pObj))) * 3 );
else if ( pObj->Type == WLC_OBJ_ROTATE_L )
Vec_IntAddToEntry( vAnds, WLC_OBJ_ROTATE_L, Wlc_ObjRange(pObj) * Abc_MinInt(Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)), Abc_Base2Log(Wlc_ObjRange(pObj))) * 3 );
else if ( pObj->Type == WLC_OBJ_BIT_NOT )
Vec_IntAddToEntry( vAnds, WLC_OBJ_BIT_NOT, 0 );
else if ( pObj->Type == WLC_OBJ_BIT_AND )
Vec_IntAddToEntry( vAnds, WLC_OBJ_BIT_AND, Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) );
else if ( pObj->Type == WLC_OBJ_BIT_OR )
Vec_IntAddToEntry( vAnds, WLC_OBJ_BIT_OR, Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) );
else if ( pObj->Type == WLC_OBJ_BIT_XOR )
Vec_IntAddToEntry( vAnds, WLC_OBJ_BIT_XOR, 3 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) );
else if ( pObj->Type == WLC_OBJ_BIT_SELECT )
Vec_IntAddToEntry( vAnds, WLC_OBJ_BIT_SELECT, 0 );
else if ( pObj->Type == WLC_OBJ_BIT_CONCAT )
Vec_IntAddToEntry( vAnds, WLC_OBJ_BIT_CONCAT, 0 );
else if ( pObj->Type == WLC_OBJ_BIT_ZEROPAD )
Vec_IntAddToEntry( vAnds, WLC_OBJ_BIT_ZEROPAD, 0 );
else if ( pObj->Type == WLC_OBJ_BIT_SIGNEXT )
Vec_IntAddToEntry( vAnds, WLC_OBJ_BIT_SIGNEXT, 0 );
else if ( pObj->Type == WLC_OBJ_LOGIC_NOT )
Vec_IntAddToEntry( vAnds, WLC_OBJ_LOGIC_NOT, Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) - 1 );
else if ( pObj->Type == WLC_OBJ_LOGIC_AND )
Vec_IntAddToEntry( vAnds, WLC_OBJ_LOGIC_AND, Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) + Wlc_ObjRange(Wlc_ObjFanin1(p, pObj)) - 1 );
else if ( pObj->Type == WLC_OBJ_LOGIC_OR )
Vec_IntAddToEntry( vAnds, WLC_OBJ_LOGIC_OR, Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) + Wlc_ObjRange(Wlc_ObjFanin1(p, pObj)) - 1 );
else if ( pObj->Type == WLC_OBJ_LOGIC_XOR )
Vec_IntAddToEntry( vAnds, WLC_OBJ_LOGIC_XOR, Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) + Wlc_ObjRange(Wlc_ObjFanin1(p, pObj)) + 1 );
else if ( pObj->Type == WLC_OBJ_COMP_EQU )
Vec_IntAddToEntry( vAnds, WLC_OBJ_COMP_EQU, 4 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) - 1 );
else if ( pObj->Type == WLC_OBJ_COMP_NOTEQU )
Vec_IntAddToEntry( vAnds, WLC_OBJ_COMP_NOTEQU, 4 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) - 1 );
else if ( pObj->Type == WLC_OBJ_COMP_LESS )
Vec_IntAddToEntry( vAnds, WLC_OBJ_COMP_LESS, 6 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) - 6 );
else if ( pObj->Type == WLC_OBJ_COMP_MORE )
Vec_IntAddToEntry( vAnds, WLC_OBJ_COMP_MORE, 6 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) - 6 );
else if ( pObj->Type == WLC_OBJ_COMP_LESSEQU )
Vec_IntAddToEntry( vAnds, WLC_OBJ_COMP_LESSEQU, 6 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) - 6 );
else if ( pObj->Type == WLC_OBJ_COMP_MOREEQU )
Vec_IntAddToEntry( vAnds, WLC_OBJ_COMP_MOREEQU, 6 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) - 6 );
else if ( pObj->Type == WLC_OBJ_REDUCT_AND )
Vec_IntAddToEntry( vAnds, WLC_OBJ_REDUCT_AND, Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) - 1 );
else if ( pObj->Type == WLC_OBJ_REDUCT_OR )
Vec_IntAddToEntry( vAnds, WLC_OBJ_REDUCT_OR, Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) - 1 );
else if ( pObj->Type == WLC_OBJ_REDUCT_XOR )
Vec_IntAddToEntry( vAnds, WLC_OBJ_REDUCT_XOR, 3 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) - 3 );
else if ( pObj->Type == WLC_OBJ_ARI_ADD )
Vec_IntAddToEntry( vAnds, WLC_OBJ_ARI_ADD, 9 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) );
else if ( pObj->Type == WLC_OBJ_ARI_SUB )
Vec_IntAddToEntry( vAnds, WLC_OBJ_ARI_SUB, 9 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) );
else if ( pObj->Type == WLC_OBJ_ARI_MULTI )
Vec_IntAddToEntry( vAnds, WLC_OBJ_ARI_MULTI, 9 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) * Wlc_ObjRange(Wlc_ObjFanin1(p, pObj)) );
else if ( pObj->Type == WLC_OBJ_ARI_DIVIDE )
Vec_IntAddToEntry( vAnds, WLC_OBJ_ARI_DIVIDE, 13 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) - 19 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) + 10 );
else if ( pObj->Type == WLC_OBJ_ARI_MODULUS )
Vec_IntAddToEntry( vAnds, WLC_OBJ_ARI_MODULUS, 13 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) - 7 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) - 2 );
else if ( pObj->Type == WLC_OBJ_ARI_POWER )
Vec_IntAddToEntry( vAnds, WLC_OBJ_ARI_POWER, 10 * (int)pow(Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)),Wlc_ObjRange(Wlc_ObjFanin0(p, pObj))) );
else if ( pObj->Type == WLC_OBJ_ARI_MINUS )
Vec_IntAddToEntry( vAnds, WLC_OBJ_ARI_MINUS, 4 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) );
else if ( pObj->Type == WLC_OBJ_ARI_SQRT )
Vec_IntAddToEntry( vAnds, WLC_OBJ_ARI_SQRT, 11 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) / 8 + 5 * Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) / 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", Wlc_ObjId(p, pObjRange),
Abc_NamStr(p->pManName, Wlc_ObjNameId(p, Wlc_ObjId(p, pObjRange))), Wlc_ObjRange(pObjRange), pObjRange->End, pObjRange->Beg );
} }
// print by occurrence // print by occurrence
printf( "ID : name occurrence (occurrence)<output_range>=<input_range>.<input_range> ...\n" ); printf( "ID : name occurrence and2 (occurrence)<output_range>=<input_range>.<input_range> ...\n" );
for ( i = 0; i < WLC_OBJ_NUMBER; i++ ) for ( i = 0; i < WLC_OBJ_NUMBER; i++ )
{ {
Vec_Wrd_t * vType = (Vec_Wrd_t *)Vec_PtrEntry( vTypes, i ); Vec_Wrd_t * vType = (Vec_Wrd_t *)Vec_PtrEntry( vTypes, i );
Vec_Wrd_t * vOccur = (Vec_Wrd_t *)Vec_PtrEntry( vOccurs, i ); Vec_Wrd_t * vOccur = (Vec_Wrd_t *)Vec_PtrEntry( vOccurs, i );
if ( p->nObjs[i] == 0 ) if ( p->nObjs[i] == 0 )
continue; continue;
printf( "%2d : %-8s %6d ", i, Wlc_Names[i], p->nObjs[i] ); printf( "%2d : %-8s %6d%8d ", i, Wlc_Names[i], p->nObjs[i], Vec_IntEntry(vAnds, i) );
// sort by occurence // sort by occurence
Wlc_NtkPrintDistribSortOne( vTypes, vOccurs, i ); Wlc_NtkPrintDistribSortOne( vTypes, vOccurs, i );
Vec_WrdForEachEntry( vType, Sign, k ) Vec_WrdForEachEntry( vType, Sign, k )
{ {
Wlc_NtkPrintDistribFromSign( Sign, &s, &s0, &s1 ); Wlc_NtkPrintDistribFromSign( Sign, &s, &s0, &s1 );
if ( ((k % 8) == 7 && s1) || ((k % 10) == 9 && !s1) ) if ( ((k % 6) == 5 && s1) || ((k % 8) == 7 && !s1) )
printf( "\n " ); printf( "\n " );
printf( "(%d)", (int)Vec_WrdEntry( vOccur, k ) ); printf( "(%d)", (int)Vec_WrdEntry( vOccur, k ) );
printf( "%s%d", Abc_LitIsCompl(s)?"-":"", Abc_Lit2Var(s) ); printf( "%s%d", Abc_LitIsCompl(s)?"-":"", Abc_Lit2Var(s) );
if ( s0 ) if ( s0 )
...@@ -357,6 +441,7 @@ void Wlc_NtkPrintDistrib( Wlc_Ntk_t * p, int fVerbose ) ...@@ -357,6 +441,7 @@ void Wlc_NtkPrintDistrib( Wlc_Ntk_t * p, int fVerbose )
} }
Vec_VecFree( (Vec_Vec_t *)vTypes ); Vec_VecFree( (Vec_Vec_t *)vTypes );
Vec_VecFree( (Vec_Vec_t *)vOccurs ); Vec_VecFree( (Vec_Vec_t *)vOccurs );
Vec_IntFree( vAnds );
} }
void Wlc_NtkPrintNodes( Wlc_Ntk_t * p, int Type ) void Wlc_NtkPrintNodes( Wlc_Ntk_t * p, int Type )
{ {
......
...@@ -43,6 +43,10 @@ struct Wlc_Prs_t_ ...@@ -43,6 +43,10 @@ struct Wlc_Prs_t_
Mem_Flex_t * pMemTable; Mem_Flex_t * pMemTable;
Vec_Ptr_t * vTables; Vec_Ptr_t * vTables;
int nConsts; int nConsts;
int nNonZeroCount;
int nNonZeroEnd;
int nNonZeroBeg;
int nNonZeroLine;
char sError[WLV_PRS_MAX_LINE]; char sError[WLV_PRS_MAX_LINE];
}; };
...@@ -809,7 +813,14 @@ int Wlc_PrsReadDeclaration( Wlc_Prs_t * p, char * pStart ) ...@@ -809,7 +813,14 @@ int Wlc_PrsReadDeclaration( Wlc_Prs_t * p, char * pStart )
if ( pStart == NULL ) if ( pStart == NULL )
return Wlc_PrsWriteErrorMessage( p, pStart, "Cannot read range." ); return Wlc_PrsWriteErrorMessage( p, pStart, "Cannot read range." );
if ( Beg != 0 ) if ( Beg != 0 )
printf( "Warning: Non-zero-based range ([%d:%d]) in line %d.\n", End, Beg, Wlc_PrsFindLine(p, pStart) ); {
if ( p->nNonZeroCount++ == 0 )
{
p->nNonZeroEnd = End;
p->nNonZeroBeg = Beg;
p->nNonZeroLine = Wlc_PrsFindLine(p, pStart);
}
}
while ( 1 ) while ( 1 )
{ {
char * pName; char * pName;
...@@ -1156,6 +1167,11 @@ startword: ...@@ -1156,6 +1167,11 @@ startword:
return Wlc_PrsWriteErrorMessage( p, pStart, "Cannot read line beginning with %s.", pName ); return Wlc_PrsWriteErrorMessage( p, pStart, "Cannot read line beginning with %s.", pName );
} }
} }
if ( p->nNonZeroCount )
{
printf( "Warning: %d objects in the input file have non-zero-based ranges.\n", p->nNonZeroCount );
printf( "In particular, a signal with range [%d:%d] is declared in line %d.\n", p->nNonZeroEnd, p->nNonZeroBeg, p->nNonZeroLine );
}
return 1; return 1;
} }
Wlc_Ntk_t * Wlc_ReadVer( char * pFileName ) Wlc_Ntk_t * Wlc_ReadVer( char * pFileName )
......
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