From 57966de4b4172069f9d081cf4d5fd1012e877929 Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Wed, 14 May 2025 17:01:48 -0700 Subject: [PATCH] Adding flag to skip two-output cells in "read_lib". --- src/map/scl/scl.c | 21 +++++++++++++-------- src/map/scl/sclLib.h | 2 +- src/map/scl/sclLiberty.c | 23 ++++++++++++++++------- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/map/scl/scl.c b/src/map/scl/scl.c index dab44d873..b012435f5 100644 --- a/src/map/scl/scl.c +++ b/src/map/scl/scl.c @@ -141,7 +141,7 @@ void Scl_End( Abc_Frame_t * pAbc ) SeeAlso [] ***********************************************************************/ -SC_Lib * Scl_ReadLibraryFile( Abc_Frame_t * pAbc, char * pFileName, int fVerbose, int fVeryVerbose, SC_DontUse dont_use ) +SC_Lib * Scl_ReadLibraryFile( Abc_Frame_t * pAbc, char * pFileName, int fVerbose, int fVeryVerbose, SC_DontUse dont_use, int fSkipMultiOuts ) { SC_Lib * pLib; FILE * pFile; @@ -152,7 +152,7 @@ SC_Lib * Scl_ReadLibraryFile( Abc_Frame_t * pAbc, char * pFileName, int fVerbose } fclose( pFile ); // read new library - pLib = Abc_SclReadLiberty( pFileName, fVerbose, fVeryVerbose, dont_use); + pLib = Abc_SclReadLiberty( pFileName, fVerbose, fVeryVerbose, dont_use, fSkipMultiOuts); if ( pLib == NULL ) { fprintf( pAbc->Err, "Reading SCL library from file \"%s\" has failed. \n", pFileName ); @@ -186,13 +186,14 @@ int Scl_CommandReadLib( Abc_Frame_t * pAbc, int argc, char ** argv ) int fMerge = 0; int fUsePrefix = 0; int fUseAll = 0; + int fSkipMultiOuts = 0; SC_DontUse dont_use = {0}; dont_use.dont_use_list = ABC_ALLOC(char *, argc); dont_use.size = 0; Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "SGMXdnuvwmpah" ) ) != EOF ) + while ( ( c = Extra_UtilGetopt( argc, argv, "SGMXdnuvwmpash" ) ) != EOF ) { switch ( c ) { @@ -263,6 +264,9 @@ int Scl_CommandReadLib( Abc_Frame_t * pAbc, int argc, char ** argv ) case 'a': fUseAll ^= 1; break; + case 's': + fSkipMultiOuts ^= 1; + break; case 'h': goto usage; default: @@ -270,8 +274,8 @@ int Scl_CommandReadLib( Abc_Frame_t * pAbc, int argc, char ** argv ) } } if ( argc == globalUtilOptind + 2 ) { // expecting two files - SC_Lib * pLib1 = Scl_ReadLibraryFile( pAbc, argv[globalUtilOptind], fVerbose, fVeryVerbose, dont_use ); - SC_Lib * pLib2 = Scl_ReadLibraryFile( pAbc, argv[globalUtilOptind+1], fVerbose, fVeryVerbose, dont_use ); + SC_Lib * pLib1 = Scl_ReadLibraryFile( pAbc, argv[globalUtilOptind], fVerbose, fVeryVerbose, dont_use, fSkipMultiOuts ); + SC_Lib * pLib2 = Scl_ReadLibraryFile( pAbc, argv[globalUtilOptind+1], fVerbose, fVeryVerbose, dont_use, fSkipMultiOuts ); ABC_FREE(dont_use.dont_use_list); if ( pLib1 == NULL || pLib2 == NULL ) { if (pLib1) Abc_SclLibFree(pLib1); @@ -283,7 +287,7 @@ int Scl_CommandReadLib( Abc_Frame_t * pAbc, int argc, char ** argv ) Abc_SclLibFree(pLib2); } else if ( argc == globalUtilOptind + 1 ) { // expecting one file - SC_Lib * pLib1 = Scl_ReadLibraryFile( pAbc, argv[globalUtilOptind], fVerbose, fVeryVerbose, dont_use ); + SC_Lib * pLib1 = Scl_ReadLibraryFile( pAbc, argv[globalUtilOptind], fVerbose, fVeryVerbose, dont_use, fSkipMultiOuts ); SC_Lib * pLib_ext = (SC_Lib *)pAbc->pLibScl; if ( fMerge && pLib_ext != NULL && pLib1 != NULL ) { @@ -328,7 +332,7 @@ int Scl_CommandReadLib( Abc_Frame_t * pAbc, int argc, char ** argv ) return 0; usage: - fprintf( pAbc->Err, "usage: read_lib [-SG float] [-M num] [-dnuvwmpah] [-X cell_name] \n" ); + fprintf( pAbc->Err, "usage: read_lib [-SG float] [-M num] [-dnuvwmpash] [-X cell_name] \n" ); fprintf( pAbc->Err, "\t reads Liberty library from file\n" ); fprintf( pAbc->Err, "\t-S float : the slew parameter used to generate the library [default = %.2f]\n", Slew ); fprintf( pAbc->Err, "\t-G float : the gain parameter used to generate the library [default = %.2f]\n", Gain ); @@ -340,8 +344,9 @@ usage: fprintf( pAbc->Err, "\t-v : toggle writing verbose information [default = %s]\n", fVerbose? "yes": "no" ); fprintf( pAbc->Err, "\t-w : toggle writing information about skipped gates [default = %s]\n", fVeryVerbose? "yes": "no" ); fprintf( pAbc->Err, "\t-m : toggle merging library with exisiting library [default = %s]\n", fMerge? "yes": "no" ); - fprintf( pAbc->Err, "\t-a : toggle reading all cells when using gain-based modeling [default = %s]\n", fUseAll? "yes": "no" ); fprintf( pAbc->Err, "\t-p : toggle using prefix for the cell names [default = %s]\n", fUsePrefix? "yes": "no" ); + fprintf( pAbc->Err, "\t-a : toggle reading all cells when using gain-based modeling [default = %s]\n", fUseAll? "yes": "no" ); + fprintf( pAbc->Err, "\t-s : toggle skipping cells with two outputs [default = %s]\n", fSkipMultiOuts? "yes": "no" ); fprintf( pAbc->Err, "\t-h : prints the command summary\n" ); fprintf( pAbc->Err, "\t : the name of a file to read\n" ); fprintf( pAbc->Err, "\t : the name of a file to read (optional)\n" ); diff --git a/src/map/scl/sclLib.h b/src/map/scl/sclLib.h index 2b616a20d..b50e6ffb7 100644 --- a/src/map/scl/sclLib.h +++ b/src/map/scl/sclLib.h @@ -741,7 +741,7 @@ static inline void Scl_LibHandleInputDriver2( SC_Cell * pCell, SC_PairI * pLoadI } /*=== sclLiberty.c ===============================================================*/ -extern SC_Lib * Abc_SclReadLiberty( char * pFileName, int fVerbose, int fVeryVerbose, SC_DontUse dont_use ); +extern SC_Lib * Abc_SclReadLiberty( char * pFileName, int fVerbose, int fVeryVerbose, SC_DontUse dont_use, int fSkipMultiOuts ); /*=== sclLibScl.c ===============================================================*/ extern SC_Lib * Abc_SclReadFromGenlib( void * pLib ); extern SC_Lib * Abc_SclReadFromStr( Vec_Str_t * vOut ); diff --git a/src/map/scl/sclLiberty.c b/src/map/scl/sclLiberty.c index 8a620086f..461fa56ef 100644 --- a/src/map/scl/sclLiberty.c +++ b/src/map/scl/sclLiberty.c @@ -1500,7 +1500,7 @@ Vec_Ptr_t * Scl_LibertyReadTemplates( Scl_Tree_t * p ) // Scl_LibertyPrintTemplates( vRes ); return vRes; } -Vec_Str_t * Scl_LibertyReadSclStr( Scl_Tree_t * p, int fVerbose, int fVeryVerbose, SC_DontUse dont_use ) +Vec_Str_t * Scl_LibertyReadSclStr( Scl_Tree_t * p, int fVerbose, int fVeryVerbose, SC_DontUse dont_use, int fSkipMultiOuts ) { int fUseFirstTable = 0; Vec_Str_t * vOut; @@ -1509,7 +1509,7 @@ Vec_Str_t * Scl_LibertyReadSclStr( Scl_Tree_t * p, int fVerbose, int fVeryVerbos Vec_Wrd_t * vTruth; char * pFormula, * pName; int i, k, Counter, nOutputs, nCells; - int nSkipped[5] = {0}; + int nSkipped[6] = {0}; // read delay-table templates vTemples = Scl_LibertyReadTemplates( p ); @@ -1567,6 +1567,12 @@ Vec_Str_t * Scl_LibertyReadSclStr( Scl_Tree_t * p, int fVerbose, int fVeryVerbos nSkipped[4]++; continue; } + if ( fSkipMultiOuts && Counter > 1 ) + { + if ( fVeryVerbose ) printf( "Scl_LibertyReadGenlib() skipped cell \"%s\" with two outputs.\n", Scl_LibertyReadString(p, pCell->Head) ); + nSkipped[5]++; + continue; + } nCells++; } // read cells @@ -1585,6 +1591,8 @@ Vec_Str_t * Scl_LibertyReadSclStr( Scl_Tree_t * p, int fVerbose, int fVeryVerbos continue; if ( Counter > 2 ) continue; + if ( fSkipMultiOuts && Counter > 1 ) + continue; // top level information Vec_StrPutS_( vOut, Scl_LibertyReadString(p, pCell->Head) ); pName = Scl_LibertyReadCellArea(p, pCell); @@ -1750,13 +1758,14 @@ Vec_Str_t * Scl_LibertyReadSclStr( Scl_Tree_t * p, int fVerbose, int fVeryVerbos { printf( "Library \"%s\" from \"%s\" has %d cells ", Scl_LibertyReadString(p, Scl_LibertyRoot(p)->Head), p->pFileName, nCells ); - printf( "(%d skipped: %d seq; %d tri-state; %d no func; %d dont_use; %d with 3+ outputs). ", - nSkipped[0]+nSkipped[1]+nSkipped[2]+nSkipped[3]+nSkipped[4], nSkipped[0], nSkipped[1], nSkipped[2], nSkipped[3], nSkipped[4] ); + printf( "(%d skipped: %d seq; %d tri-state; %d no func; %d dont_use; %d with 2 outputs; %d with 3+ outputs). ", + nSkipped[0]+nSkipped[1]+nSkipped[2]+nSkipped[3]+nSkipped[4]+nSkipped[5], + nSkipped[0],nSkipped[1],nSkipped[2],nSkipped[3],nSkipped[5],nSkipped[4] ); Abc_PrintTime( 1, "Time", Abc_Clock() - p->clkStart ); } return vOut; } -SC_Lib * Abc_SclReadLiberty( char * pFileName, int fVerbose, int fVeryVerbose, SC_DontUse dont_use ) +SC_Lib * Abc_SclReadLiberty( char * pFileName, int fVerbose, int fVeryVerbose, SC_DontUse dont_use, int fSkipMultiOuts ) { SC_Lib * pLib; Scl_Tree_t * p; @@ -1766,7 +1775,7 @@ SC_Lib * Abc_SclReadLiberty( char * pFileName, int fVerbose, int fVeryVerbose, S return NULL; // Scl_LibertyParseDump( p, "temp_.lib" ); // collect relevant data - vStr = Scl_LibertyReadSclStr( p, fVerbose, fVeryVerbose, dont_use ); + vStr = Scl_LibertyReadSclStr( p, fVerbose, fVeryVerbose, dont_use, fSkipMultiOuts ); Scl_LibertyStop( p, fVeryVerbose ); if ( vStr == NULL ) return NULL; @@ -1805,7 +1814,7 @@ void Scl_LibertyTest() return; // Scl_LibertyParseDump( p, "temp_.lib" ); SC_DontUse dont_use = {0}; - vStr = Scl_LibertyReadSclStr( p, fVerbose, fVeryVerbose, dont_use); + vStr = Scl_LibertyReadSclStr( p, fVerbose, fVeryVerbose, dont_use, 0); Scl_LibertyStringDump( "test_scl.lib", vStr ); Vec_StrFree( vStr ); Scl_LibertyStop( p, fVerbose );