diff options
Diffstat (limited to 'src/map/scl/sclUtil.c')
-rw-r--r-- | src/map/scl/sclUtil.c | 174 |
1 files changed, 1 insertions, 173 deletions
diff --git a/src/map/scl/sclUtil.c b/src/map/scl/sclUtil.c index d535ee66..5543fff8 100644 --- a/src/map/scl/sclUtil.c +++ b/src/map/scl/sclUtil.c @@ -18,9 +18,8 @@ ***********************************************************************/ -#include "sclInt.h" +#include "sclSize.h" #include "map/mio/mio.h" -#include "bool/kit/kit.h" ABC_NAMESPACE_IMPL_START @@ -35,177 +34,6 @@ ABC_NAMESPACE_IMPL_START /**Function************************************************************* - Synopsis [Reading library from file.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static unsigned Abc_SclHashString( char * pName, int TableSize ) -{ - static int s_Primes[10] = { 1291, 1699, 2357, 4177, 5147, 5647, 6343, 7103, 7873, 8147 }; - unsigned i, Key = 0; - for ( i = 0; pName[i] != '\0'; i++ ) - Key += s_Primes[i%10]*pName[i]*pName[i]; - return Key % TableSize; -} -int * Abc_SclHashLookup( SC_Lib * p, char * pName ) -{ - int i; - for ( i = Abc_SclHashString(pName, p->nBins); i < p->nBins; i = (i + 1) % p->nBins ) - if ( p->pBins[i] == -1 || !strcmp(pName, SC_LibCell(p, p->pBins[i])->pName) ) - return p->pBins + i; - assert( 0 ); - return NULL; -} -void Abc_SclHashCells( SC_Lib * p ) -{ - SC_Cell * pCell; - int i, * pPlace; - assert( p->nBins == 0 ); - p->nBins = Abc_PrimeCudd( 5 * Vec_PtrSize(p->vCells) ); - p->pBins = ABC_FALLOC( int, p->nBins ); - SC_LibForEachCell( p, pCell, i ) - { - pPlace = Abc_SclHashLookup( p, pCell->pName ); - assert( *pPlace == -1 ); - *pPlace = i; - } -} -int Abc_SclCellFind( SC_Lib * p, char * pName ) -{ - return *Abc_SclHashLookup( p, pName ); -} - -/**Function************************************************************* - - Synopsis [Links equal gates into rings while sorting them by area.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static int Abc_SclCompareCells( SC_Cell ** pp1, SC_Cell ** pp2 ) -{ - if ( (*pp1)->n_inputs < (*pp2)->n_inputs ) - return -1; - if ( (*pp1)->n_inputs > (*pp2)->n_inputs ) - return 1; - if ( (*pp1)->area < (*pp2)->area ) - return -1; - if ( (*pp1)->area > (*pp2)->area ) - return 1; - return strcmp( (*pp1)->pName, (*pp2)->pName ); -} -void Abc_SclLinkCells( SC_Lib * p ) -{ - SC_Cell * pCell, * pRepr = NULL; - int i, k; - assert( Vec_PtrSize(p->vCellClasses) == 0 ); - SC_LibForEachCell( p, pCell, i ) - { - // find gate with the same function - SC_LibForEachCellClass( p, pRepr, k ) - if ( pCell->n_inputs == pRepr->n_inputs && - pCell->n_outputs == pRepr->n_outputs && - Vec_WrdEqual(SC_CellFunc(pCell), SC_CellFunc(pRepr)) ) - break; - if ( k == Vec_PtrSize(p->vCellClasses) ) - { - Vec_PtrPush( p->vCellClasses, pCell ); - pCell->pNext = pCell->pPrev = pCell; - continue; - } - // add it to the list before the cell - pRepr->pPrev->pNext = pCell; pCell->pNext = pRepr; - pCell->pPrev = pRepr->pPrev; pRepr->pPrev = pCell; - } - // sort cells by size the then by name - qsort( (void *)Vec_PtrArray(p->vCellClasses), Vec_PtrSize(p->vCellClasses), sizeof(void *), (int(*)(const void *,const void *))Abc_SclCompareCells ); - // sort cell lists - SC_LibForEachCellClass( p, pRepr, k ) - { - Vec_Ptr_t * vList = Vec_PtrAlloc( 100 ); - SC_RingForEachCell( pRepr, pCell, i ) - Vec_PtrPush( vList, pCell ); - qsort( (void *)Vec_PtrArray(vList), Vec_PtrSize(vList), sizeof(void *), (int(*)(const void *,const void *))Abc_SclCompareCells ); - // create new representative - pRepr = (SC_Cell *)Vec_PtrEntry( vList, 0 ); - pRepr->pNext = pRepr->pPrev = pRepr; - pRepr->Order = 0; - // relink cells - Vec_PtrForEachEntryStart( SC_Cell *, vList, pCell, i, 1 ) - { - pRepr->pPrev->pNext = pCell; pCell->pNext = pRepr; - pCell->pPrev = pRepr->pPrev; pRepr->pPrev = pCell; - pCell->Order = i; - } - // update list - Vec_PtrWriteEntry( p->vCellClasses, k, pRepr ); - Vec_PtrFree( vList ); - } -} -void Abc_SclPrintCells( SC_Lib * p ) -{ - SC_Cell * pCell, * pRepr; - int i, k, j, nLength = 0; - assert( Vec_PtrSize(p->vCellClasses) > 0 ); - printf( "Library \"%s\" ", p->pName ); - printf( "containing %d cells in %d classes.\n", - Vec_PtrSize(p->vCells), Vec_PtrSize(p->vCellClasses) ); - // find the longest name - SC_LibForEachCellClass( p, pRepr, k ) - SC_RingForEachCell( pRepr, pCell, i ) - nLength = Abc_MaxInt( nLength, strlen(pRepr->pName) ); - // print cells - SC_LibForEachCellClass( p, pRepr, k ) - { - printf( "Class%3d : ", k ); - printf( "Ins = %d ", pRepr->n_inputs ); - printf( "Outs = %d", pRepr->n_outputs ); - for ( i = 0; i < pRepr->n_outputs; i++ ) - { - printf( " " ); - Kit_DsdPrintFromTruth( (unsigned *)Vec_WrdArray(SC_CellPin(pRepr, pRepr->n_inputs+i)->vFunc), pRepr->n_inputs ); - } - printf( "\n" ); - SC_RingForEachCell( pRepr, pCell, i ) - { - printf( " %3d : ", i+1 ); - printf( "%-*s ", nLength, pCell->pName ); - printf( "%2d ", pCell->drive_strength ); - printf( "A =%8.2f D =", pCell->area ); - // print linear approximation - for ( j = 0; j < 3; j++ ) - { - SC_Pin * pPin = SC_CellPin( pCell, pCell->n_inputs ); - if ( Vec_PtrSize(pPin->vRTimings) > 0 ) - { - SC_Timings * pRTime = (SC_Timings *)Vec_PtrEntry( pPin->vRTimings, 0 ); - SC_Timing * pTime = (SC_Timing *)Vec_PtrEntry( pRTime->vTimings, 0 ); - printf( " %6.2f", j ? pTime->pCellRise->approx[0][j] : SC_LibTimePs(p, pTime->pCellRise->approx[0][j]) ); - } - } - // print input capacitance - printf( " Cap =" ); - for ( j = 0; j < pCell->n_inputs; j++ ) - { - SC_Pin * pPin = SC_CellPin( pCell, j ); - printf( " %6.2f", SC_LibCapFf(p, pPin->rise_cap) ); - } - printf( "\n" ); - } - } -} - -/**Function************************************************************* - Synopsis [Converts pNode->pData gates into array of SC_Lit gate IDs and back.] Description [] |