From 3a1efd48f72ac916d954035fc166d6d76efe198f Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Fri, 24 Oct 2025 11:46:55 -0700 Subject: [PATCH] Enabling multiple LUT libraries. --- src/base/abci/abc.c | 12 +++---- src/base/main/main.h | 5 +++ src/base/main/mainFrame.c | 6 ++-- src/base/main/mainInt.h | 2 +- src/map/if/ifCom.c | 75 +++++++++++++++++++++++++-------------- src/map/mpm/mpmMan.c | 5 +-- 6 files changed, 67 insertions(+), 38 deletions(-) diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index 688ea3e96..490167206 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -42941,12 +42941,12 @@ int Abc_CommandAbc9If( Abc_Frame_t * pAbc, int argc, char ** argv ) int c; // set defaults Gia_ManSetIfParsDefault( pPars ); - if ( pAbc->pLibLut == NULL ) + if ( Abc_FrameReadLibLut() == NULL ) { Abc_Print( -1, "LUT library is not given. Using default LUT library.\n" ); - pAbc->pLibLut = If_LibLutSetSimple( 6 ); + Abc_FrameSetLibLut( If_LibLutSetSimple( 6 ) ); } - pPars->pLutLib = (If_LibLut_t *)pAbc->pLibLut; + pPars->pLutLib = (If_LibLut_t *)Abc_FrameReadLibLut(); Extra_UtilGetoptReset(); while ( ( c = Extra_UtilGetopt( argc, argv, "KCFAGRDEWSJTXYZqalepmrsdbgxyofuijkztncvwh" ) ) != EOF ) { @@ -43621,12 +43621,12 @@ int Abc_CommandAbc9Iff( Abc_Frame_t * pAbc, int argc, char ** argv ) Abc_Print( -1, "Abc_CommandAbc9Iff(): Mapping of the AIG is not defined.\n" ); return 1; } - if ( pAbc->pLibLut == NULL ) + if ( Abc_FrameReadLibLut() == NULL ) { Abc_Print( -1, "Abc_CommandAbc9Iff(): LUT library is not defined.\n" ); return 1; } - Gia_ManIffTest( pAbc->pGia, (If_LibLut_t *)pAbc->pLibLut, fVerbose ); + Gia_ManIffTest( pAbc->pGia, (If_LibLut_t *)Abc_FrameReadLibLut(), fVerbose ); return 0; usage: @@ -47296,7 +47296,7 @@ int Abc_CommandAbc9Trace( Abc_Frame_t * pAbc, int argc, char ** argv ) Abc_Print( -1, "Abc_CommandAbc9Speedup(): Mapping of the AIG is not defined.\n" ); return 1; } - pAbc->pGia->pLutLib = fUseLutLib ? pAbc->pLibLut : NULL; + pAbc->pGia->pLutLib = fUseLutLib ? Abc_FrameReadLibLut() : NULL; Gia_ManDelayTraceLutPrint( pAbc->pGia, fVerbose ); return 0; diff --git a/src/base/main/main.h b/src/base/main/main.h index f3457e27f..768cebd07 100644 --- a/src/base/main/main.h +++ b/src/base/main/main.h @@ -62,6 +62,9 @@ ABC_NAMESPACE_HEADER_START /// MACRO DEFINITIONS /// //////////////////////////////////////////////////////////////////////// +// the maximum number of LUT libraries +#define ABC_LUT_LIBS 4 + //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// @@ -96,6 +99,7 @@ extern ABC_DLL Abc_Frame_t * Abc_FrameReadGlobalFrame(); extern ABC_DLL Vec_Ptr_t * Abc_FrameReadStore(); extern ABC_DLL int Abc_FrameReadStoreSize(); extern ABC_DLL void * Abc_FrameReadLibLut(); +extern ABC_DLL void * Abc_FrameReadLibLutI( int i ); extern ABC_DLL void * Abc_FrameReadLibBox(); extern ABC_DLL void * Abc_FrameReadLibGen(); extern ABC_DLL void * Abc_FrameReadLibGen2(); @@ -134,6 +138,7 @@ extern ABC_DLL int Abc_FrameReadCexFrame( Abc_Frame_t * p ); extern ABC_DLL void Abc_FrameSetNtkStore( Abc_Ntk_t * pNtk ); extern ABC_DLL void Abc_FrameSetNtkStoreSize( int nStored ); extern ABC_DLL void Abc_FrameSetLibLut( void * pLib ); +extern ABC_DLL void Abc_FrameSetLibLutI( void * pLib, int i ); extern ABC_DLL void Abc_FrameSetLibBox( void * pLib ); extern ABC_DLL void Abc_FrameSetLibGen( void * pLib ); extern ABC_DLL void Abc_FrameSetLibGen2( void * pLib ); diff --git a/src/base/main/mainFrame.c b/src/base/main/mainFrame.c index 77faabb0d..4027f8ad7 100644 --- a/src/base/main/mainFrame.c +++ b/src/base/main/mainFrame.c @@ -54,7 +54,8 @@ static Abc_Frame_t * s_GlobalFrame = NULL; ***********************************************************************/ Vec_Ptr_t * Abc_FrameReadStore() { return s_GlobalFrame->vStore; } int Abc_FrameReadStoreSize() { return Vec_PtrSize(s_GlobalFrame->vStore); } -void * Abc_FrameReadLibLut() { return s_GlobalFrame->pLibLut; } +void * Abc_FrameReadLibLut() { return s_GlobalFrame->pLibLut[0]; } +void * Abc_FrameReadLibLutI( int i ) { return s_GlobalFrame->pLibLut[i]; } void * Abc_FrameReadLibBox() { return s_GlobalFrame->pLibBox; } void * Abc_FrameReadLibGen() { return s_GlobalFrame->pLibGen; } void * Abc_FrameReadLibGen2() { return s_GlobalFrame->pLibGen2; } @@ -90,7 +91,8 @@ void Abc_FrameInputNdr( Abc_Frame_t * pAbc, void * pData ) { Ndr_Delete(s void * Abc_FrameOutputNdr( Abc_Frame_t * pAbc ) { void * pData = s_GlobalFrame->pNdr; s_GlobalFrame->pNdr = NULL; return pData; } int * Abc_FrameOutputNdrArray( Abc_Frame_t * pAbc ) { int * pArray = s_GlobalFrame->pNdrArray; s_GlobalFrame->pNdrArray = NULL; return pArray; } -void Abc_FrameSetLibLut( void * pLib ) { s_GlobalFrame->pLibLut = pLib; } +void Abc_FrameSetLibLut( void * pLib ) { s_GlobalFrame->pLibLut[0]= pLib; } +void Abc_FrameSetLibLutI( void * pLib, int i ) { s_GlobalFrame->pLibLut[i]= pLib; } void Abc_FrameSetLibBox( void * pLib ) { s_GlobalFrame->pLibBox = pLib; } void Abc_FrameSetLibGen( void * pLib ) { s_GlobalFrame->pLibGen = pLib; } void Abc_FrameSetLibGen2( void * pLib ) { s_GlobalFrame->pLibGen2 = pLib; } diff --git a/src/base/main/mainInt.h b/src/base/main/mainInt.h index dd86642cb..118b6916e 100644 --- a/src/base/main/mainInt.h +++ b/src/base/main/mainInt.h @@ -98,7 +98,7 @@ struct Abc_Frame_t_ void * pManDsd; // decomposition manager void * pManDsd2; // decomposition manager // libraries for mapping - void * pLibLut; // the current LUT library + void * pLibLut[ABC_LUT_LIBS]; // the current LUT library void * pLibBox; // the current box library void * pLibGen; // the current genlib void * pLibGen2; // the current genlib diff --git a/src/map/if/ifCom.c b/src/map/if/ifCom.c index a2f54ae35..97fefea1d 100644 --- a/src/map/if/ifCom.c +++ b/src/map/if/ifCom.c @@ -78,7 +78,10 @@ void If_Init( Abc_Frame_t * pAbc ) ***********************************************************************/ void If_End( Abc_Frame_t * pAbc ) { - If_LibLutFree( (If_LibLut_t *) Abc_FrameReadLibLut() ); + int i; + for ( i = 0; i < ABC_LUT_LIBS; i++ ) + if ( Abc_FrameReadLibLutI(i) ) + If_LibLutFree( (If_LibLut_t *)Abc_FrameReadLibLutI(i) ); If_LibBoxFree( (If_LibBox_t *)Abc_FrameReadLibBox() ); } @@ -125,36 +128,51 @@ int If_CommandReadLut( Abc_Frame_t * pAbc, int argc, char **argv ) } } - if ( argc != globalUtilOptind + 1 ) - goto usage; - - // get the input file name - FileName = argv[globalUtilOptind]; - if ( (pFile = fopen( FileName, "r" )) == NULL ) - { - fprintf( pErr, "Cannot open input file \"%s\". ", FileName ); - if ( (FileName = Extra_FileGetSimilarName( FileName, ".genlib", ".lib", ".gen", ".g", NULL )) ) - fprintf( pErr, "Did you mean \"%s\"?", FileName ); - fprintf( pErr, "\n" ); - return 1; - } - fclose( pFile ); - - // set the new network - pLib = If_LibLutRead( FileName ); - if ( pLib == NULL ) - { - fprintf( pErr, "Reading LUT library has failed.\n" ); + if ( argc == globalUtilOptind ) { + fprintf( pErr, "The library file should be specified in the command line.\n" ); goto usage; } - // replace the current library - If_LibLutFree( (If_LibLut_t *)Abc_FrameReadLibLut() ); - Abc_FrameSetLibLut( pLib ); + if ( argc > globalUtilOptind + ABC_LUT_LIBS ) { + fprintf( pErr, "Can read at most %d libraries. Quitting...\n", ABC_LUT_LIBS ); + goto usage; + } + + // remove current libraries + int i; + for ( i = 0; i < ABC_LUT_LIBS; i++ ) + if ( Abc_FrameReadLibLutI(i) ) { + If_LibLutFree( (If_LibLut_t *)Abc_FrameReadLibLutI(i) ); + Abc_FrameSetLibLutI( NULL, i ); + } + + // input new libraries + for ( i = globalUtilOptind; i < argc; i++ ) { + // get the input file name + FileName = argv[i]; + if ( (pFile = fopen( FileName, "r" )) == NULL ) + { + fprintf( pErr, "Cannot open input file \"%s\". ", FileName ); + if ( (FileName = Extra_FileGetSimilarName( FileName, ".genlib", ".lib", ".gen", ".g", NULL )) ) + fprintf( pErr, "Did you mean \"%s\"?", FileName ); + fprintf( pErr, "\n" ); + return 1; + } + fclose( pFile ); + // set the new network + pLib = If_LibLutRead( FileName ); + if ( pLib == NULL ) + { + fprintf( pErr, "Reading LUT library has failed.\n" ); + goto usage; + } + // replace the current library + Abc_FrameSetLibLutI( pLib, i-globalUtilOptind ); + } return 0; usage: - fprintf( pErr, "\nusage: read_lut [-vh]\n"); - fprintf( pErr, "\t read the LUT library from the file\n" ); + fprintf( pErr, "\nusage: read_lut [-vh] ... \n"); + fprintf( pErr, "\t read the LUT library from the file(s)\n" ); fprintf( pErr, "\t-v : toggles enabling of verbose output [default = %s]\n", (fVerbose? "yes" : "no") ); fprintf( pErr, "\t-h : print the command usage\n"); fprintf( pErr, "\t \n"); @@ -216,7 +234,10 @@ int If_CommandPrintLut( Abc_Frame_t * pAbc, int argc, char **argv ) goto usage; // set the new network - If_LibLutPrint( (If_LibLut_t *)Abc_FrameReadLibLut() ); + int i; + for ( i = 0; i < ABC_LUT_LIBS; i++ ) + if ( Abc_FrameReadLibLutI(i) ) + If_LibLutPrint( (If_LibLut_t *)Abc_FrameReadLibLutI(i) ); return 0; usage: diff --git a/src/map/mpm/mpmMan.c b/src/map/mpm/mpmMan.c index 4648148de..cdcee1388 100644 --- a/src/map/mpm/mpmMan.c +++ b/src/map/mpm/mpmMan.c @@ -19,6 +19,7 @@ ***********************************************************************/ #include "mpmInt.h" +#include "base/main/main.h" ABC_NAMESPACE_IMPL_START @@ -55,8 +56,8 @@ Mpm_Man_t * Mpm_ManStart( Mig_Man_t * pMig, Mpm_Par_t * pPars ) p = ABC_CALLOC( Mpm_Man_t, 1 ); p->pMig = pMig; p->pPars = pPars; - p->pLibLut = pPars->pLib; - p->nLutSize = pPars->pLib->LutMax; + p->pLibLut = (Mpm_LibLut_t *)Abc_FrameReadLibLut(); + p->nLutSize = p->pLibLut->LutMax; p->nTruWords = pPars->fUseTruth ? Abc_Truth6WordNum(p->nLutSize) : 0; p->nNumCuts = pPars->nNumCuts; // cuts