From f936cc0680c98ffe51b3a1716c996072d5dbf76c Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Sun, 18 Jan 2009 08:01:00 -0800 Subject: Version abc90118 --- src/map/mio/mio.c | 193 +++++++++++++++++++++++++++++++++++++++++++++-- src/map/mio/mio.h | 3 + src/map/mio/mio81214.zip | Bin 0 -> 16939 bytes src/map/mio/mioApi.c | 25 +++--- src/map/mio/mioGENERIC.c | 46 ----------- src/map/mio/mioInt.h | 5 +- src/map/mio/mioRead.c | 81 ++++++++++++++++++++ src/map/mio/mioUtils.c | 13 +++- 8 files changed, 297 insertions(+), 69 deletions(-) create mode 100644 src/map/mio/mio81214.zip delete mode 100644 src/map/mio/mioGENERIC.c (limited to 'src/map/mio') diff --git a/src/map/mio/mio.c b/src/map/mio/mio.c index 37ba82c2..1326dbbf 100644 --- a/src/map/mio/mio.c +++ b/src/map/mio/mio.c @@ -28,6 +28,10 @@ #include "mioInt.h" #include "mapper.h" +extern void Amap_LibFree( void * p ); +extern void Amap_LibPrintSelectedGates( void * p, int fAllGates ); +extern void * Amap_LibReadAndPrepare( char * pFileName, int fVerbose, int fVeryVerbose ); + //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// @@ -35,6 +39,9 @@ static int Mio_CommandReadLibrary( Abc_Frame_t * pAbc, int argc, char **argv ); static int Mio_CommandPrintLibrary( Abc_Frame_t * pAbc, int argc, char **argv ); +static int Mio_CommandReadLibrary2( Abc_Frame_t * pAbc, int argc, char **argv ); +static int Mio_CommandPrintLibrary2( Abc_Frame_t * pAbc, int argc, char **argv ); + // internal version of GENLIB library static char * pMcncGenlib[25] = { "GATE inv1 1 O=!a; PIN * INV 1 999 0.9 0.0 0.9 0.0\n", @@ -78,7 +85,7 @@ static char * pMcncGenlib[25] = { void Mio_Init( Abc_Frame_t * pAbc ) { char * pFileTemp = "mcnc_temp.genlib"; - Mio_Library_t * pLibGen; + void * pLibGen; FILE * pFile; int i; @@ -90,6 +97,9 @@ void Mio_Init( Abc_Frame_t * pAbc ) // read genlib from file pLibGen = Mio_LibraryRead( pAbc, pFileTemp, NULL, 0 ); Abc_FrameSetLibGen( pLibGen ); + pLibGen = Amap_LibReadAndPrepare( pFileTemp, 0, 0 ); + Abc_FrameSetLibGen2( pLibGen ); + #ifdef WIN32 _unlink( pFileTemp ); #else @@ -98,6 +108,9 @@ void Mio_Init( Abc_Frame_t * pAbc ) Cmd_CommandAdd( pAbc, "SC mapping", "read_library", Mio_CommandReadLibrary, 0 ); Cmd_CommandAdd( pAbc, "SC mapping", "print_library", Mio_CommandPrintLibrary, 0 ); + + Cmd_CommandAdd( pAbc, "SC mapping", "read_library2", Mio_CommandReadLibrary2, 0 ); + Cmd_CommandAdd( pAbc, "SC mapping", "print_library2", Mio_CommandPrintLibrary2, 0 ); } /**Function************************************************************* @@ -115,6 +128,7 @@ void Mio_End() { // Mio_LibraryDelete( s_pLib ); Mio_LibraryDelete( Abc_FrameReadLibGen() ); + Amap_LibFree( Abc_FrameReadLibGen2() ); } @@ -190,25 +204,124 @@ int Mio_CommandReadLibrary( Abc_Frame_t * pAbc, int argc, char **argv ) if ( Abc_FrameReadLibSuper() ) { extern void Map_SuperLibFree( Map_SuperLib_t * p ); -// Map_SuperLibFree( s_pSuperLib ); -// s_pSuperLib = NULL; Map_SuperLibFree( Abc_FrameReadLibSuper() ); Abc_FrameSetLibSuper( NULL ); } // replace the current library -// Mio_LibraryDelete( s_pLib ); -// s_pLib = pLib; Mio_LibraryDelete( Abc_FrameReadLibGen() ); Abc_FrameSetLibGen( pLib ); + + // set the new network + pLib = Amap_LibReadAndPrepare( FileName, 1, 0 ); + if ( pLib == NULL ) + { + fprintf( pErr, "Reading GENLIB library has failed.\n" ); + return 1; + } + // replace the current library + Amap_LibFree( Abc_FrameReadLibGen2() ); + Abc_FrameSetLibGen2( pLib ); return 0; usage: fprintf( pErr, "usage: read_library [-vh]\n"); fprintf( pErr, "\t read the library from a genlib file\n" ); fprintf( pErr, "\t (if the library contains more than one gate\n" ); - fprintf( pErr, "\t with the same Boolean function, only the first gate\n" ); - fprintf( pErr, "\t in the order of their appearance in the file is used)\n" ); + fprintf( pErr, "\t with the same Boolean function, only the gate\n" ); + fprintf( pErr, "\t with the smallest area will be used)\n" ); + fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); + fprintf( pErr, "\t-h : enable verbose output\n"); + return 1; /* error exit */ +} + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Mio_CommandReadLibrary2( Abc_Frame_t * pAbc, int argc, char **argv ) +{ + FILE * pFile; + FILE * pOut, * pErr; + Mio_Library_t * pLib; + Abc_Ntk_t * pNet; + char * FileName; + int fVerbose; + int fVeryVerbose; + int c; + + pNet = Abc_FrameReadNtk(pAbc); + pOut = Abc_FrameReadOut(pAbc); + pErr = Abc_FrameReadErr(pAbc); + + // set the defaults + fVerbose = 1; + fVeryVerbose = 0; + Extra_UtilGetoptReset(); + while ( (c = Extra_UtilGetopt(argc, argv, "vwh")) != EOF ) + { + switch (c) + { + case 'v': + fVerbose ^= 1; + break; + case 'w': + fVeryVerbose ^= 1; + break; + case 'h': + goto usage; + break; + default: + goto usage; + } + } + + + if ( argc != globalUtilOptind + 1 ) + { + goto usage; + } + + // get the input file name + FileName = argv[globalUtilOptind]; + if ( (pFile = Io_FileOpen( FileName, "open_path", "r", 0 )) == 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 = Amap_LibReadAndPrepare( FileName, fVerbose, fVeryVerbose ); + if ( pLib == NULL ) + { + fprintf( pErr, "Reading GENLIB library has failed.\n" ); + return 1; + } + + // replace the current library + Amap_LibFree( Abc_FrameReadLibGen2() ); + Abc_FrameSetLibGen2( pLib ); + return 0; + +usage: + fprintf( pErr, "usage: read_library2 [-vh]\n"); + fprintf( pErr, "\t read the library from a genlib file\n" ); + fprintf( pErr, "\t (if the library contains more than one gate\n" ); + fprintf( pErr, "\t with the same Boolean function, only the gate\n" ); + fprintf( pErr, "\t with the smallest area will be used)\n" ); + fprintf( pErr, "\t-v : toggle verbose printout [default = %s]\n", fVerbose? "yes": "no" ); + fprintf( pErr, "\t-w : toggle detailed printout [default = %s]\n", fVeryVerbose? "yes": "no" ); fprintf( pErr, "\t-h : enable verbose output\n"); return 1; /* error exit */ } @@ -271,6 +384,72 @@ usage: fprintf( pErr, "\t-h : print the command usage\n"); return 1; /* error exit */ } + + +/**Function************************************************************* + + Synopsis [Command procedure to read LUT libraries.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Mio_CommandPrintLibrary2( Abc_Frame_t * pAbc, int argc, char **argv ) +{ + FILE * pOut, * pErr; + Abc_Ntk_t * pNet; + int fPrintAll; + int fVerbose; + int c; + + pNet = Abc_FrameReadNtk(pAbc); + pOut = Abc_FrameReadOut(pAbc); + pErr = Abc_FrameReadErr(pAbc); + + // set the defaults + fPrintAll = 0; + fVerbose = 1; + Extra_UtilGetoptReset(); + while ( (c = Extra_UtilGetopt(argc, argv, "avh")) != EOF ) + { + switch (c) + { + case 'a': + fPrintAll ^= 1; + break; + case 'v': + fVerbose ^= 1; + break; + case 'h': + goto usage; + break; + default: + goto usage; + } + } + + + if ( argc != globalUtilOptind ) + { + goto usage; + } + + // set the new network + Amap_LibPrintSelectedGates( Abc_FrameReadLibGen2(), fPrintAll ); + return 0; + +usage: + fprintf( pErr, "\nusage: print_library2 [-avh]\n"); + fprintf( pErr, "\t print gates used for area-oriented tech-mapping\n" ); + fprintf( pErr, "\t-a : toggles printing all gates [default = %s]\n", (fPrintAll? "yes" : "no") ); + fprintf( pErr, "\t-v : toggles enabling of verbose output [default = %s]\n", (fVerbose? "yes" : "no") ); + fprintf( pErr, "\t-h : print the command usage\n"); + return 1; /* error exit */ +} + //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// diff --git a/src/map/mio/mio.h b/src/map/mio/mio.h index dbe2420b..0e5a39d3 100644 --- a/src/map/mio/mio.h +++ b/src/map/mio/mio.h @@ -79,6 +79,7 @@ typedef struct Mio_PinStruct_t_ Mio_Pin_t; extern char * Mio_LibraryReadName ( Mio_Library_t * pLib ); extern int Mio_LibraryReadGateNum ( Mio_Library_t * pLib ); extern Mio_Gate_t * Mio_LibraryReadGates ( Mio_Library_t * pLib ); +extern Mio_Gate_t ** Mio_LibraryReadGatesByName( Mio_Library_t * pLib ); extern DdManager * Mio_LibraryReadDd ( Mio_Library_t * pLib ); extern Mio_Gate_t * Mio_LibraryReadGateByName ( Mio_Library_t * pLib, char * pName ); extern char * Mio_LibraryReadSopByName ( Mio_Library_t * pLib, char * pName ); @@ -110,6 +111,8 @@ extern int Mio_GateReadInputs ( Mio_Gate_t * pGate ); extern double Mio_GateReadDelayMax ( Mio_Gate_t * pGate ); extern char * Mio_GateReadSop ( Mio_Gate_t * pGate ); extern DdNode * Mio_GateReadFunc ( Mio_Gate_t * pGate ); +extern int Mio_GateReadValue ( Mio_Gate_t * pGate ); +extern void Mio_GateSetValue ( Mio_Gate_t * pGate, int Value ); extern char * Mio_PinReadName ( Mio_Pin_t * pPin ); extern Mio_PinPhase_t Mio_PinReadPhase ( Mio_Pin_t * pPin ); extern double Mio_PinReadInputLoad ( Mio_Pin_t * pPin ); diff --git a/src/map/mio/mio81214.zip b/src/map/mio/mio81214.zip new file mode 100644 index 00000000..12f766a9 Binary files /dev/null and b/src/map/mio/mio81214.zip differ diff --git a/src/map/mio/mioApi.c b/src/map/mio/mioApi.c index 73473f8b..61cc2509 100644 --- a/src/map/mio/mioApi.c +++ b/src/map/mio/mioApi.c @@ -40,6 +40,7 @@ char * Mio_LibraryReadName ( Mio_Library_t * pLib ) { return pLib->pName; } int Mio_LibraryReadGateNum ( Mio_Library_t * pLib ) { return pLib->nGates; } Mio_Gate_t * Mio_LibraryReadGates ( Mio_Library_t * pLib ) { return pLib->pGates; } +Mio_Gate_t ** Mio_LibraryReadGatesByName ( Mio_Library_t * pLib ) { return pLib->ppGatesName;} DdManager * Mio_LibraryReadDd ( Mio_Library_t * pLib ) { return pLib->dd; } Mio_Gate_t * Mio_LibraryReadBuf ( Mio_Library_t * pLib ) { return pLib->pGateBuf; } Mio_Gate_t * Mio_LibraryReadInv ( Mio_Library_t * pLib ) { return pLib->pGateInv; } @@ -131,17 +132,19 @@ char * Mio_LibraryReadSopByName( Mio_Library_t * pLib, char * pName ) SeeAlso [] ***********************************************************************/ -char * Mio_GateReadName ( Mio_Gate_t * pGate ) { return pGate->pName; } -char * Mio_GateReadOutName ( Mio_Gate_t * pGate ) { return pGate->pOutName; } -double Mio_GateReadArea ( Mio_Gate_t * pGate ) { return pGate->dArea; } -char * Mio_GateReadForm ( Mio_Gate_t * pGate ) { return pGate->pForm; } -Mio_Pin_t * Mio_GateReadPins ( Mio_Gate_t * pGate ) { return pGate->pPins; } -Mio_Library_t * Mio_GateReadLib ( Mio_Gate_t * pGate ) { return pGate->pLib; } -Mio_Gate_t * Mio_GateReadNext ( Mio_Gate_t * pGate ) { return pGate->pNext; } -int Mio_GateReadInputs ( Mio_Gate_t * pGate ) { return pGate->nInputs; } -double Mio_GateReadDelayMax( Mio_Gate_t * pGate ) { return pGate->dDelayMax; } -char * Mio_GateReadSop ( Mio_Gate_t * pGate ) { return pGate->pSop; } -DdNode * Mio_GateReadFunc ( Mio_Gate_t * pGate ) { return pGate->bFunc; } +char * Mio_GateReadName ( Mio_Gate_t * pGate ) { return pGate->pName; } +char * Mio_GateReadOutName ( Mio_Gate_t * pGate ) { return pGate->pOutName; } +double Mio_GateReadArea ( Mio_Gate_t * pGate ) { return pGate->dArea; } +char * Mio_GateReadForm ( Mio_Gate_t * pGate ) { return pGate->pForm; } +Mio_Pin_t * Mio_GateReadPins ( Mio_Gate_t * pGate ) { return pGate->pPins; } +Mio_Library_t * Mio_GateReadLib ( Mio_Gate_t * pGate ) { return pGate->pLib; } +Mio_Gate_t * Mio_GateReadNext ( Mio_Gate_t * pGate ) { return pGate->pNext; } +int Mio_GateReadInputs ( Mio_Gate_t * pGate ) { return pGate->nInputs; } +double Mio_GateReadDelayMax( Mio_Gate_t * pGate ) { return pGate->dDelayMax; } +char * Mio_GateReadSop ( Mio_Gate_t * pGate ) { return pGate->pSop; } +DdNode * Mio_GateReadFunc ( Mio_Gate_t * pGate ) { return pGate->bFunc; } +int Mio_GateReadValue ( Mio_Gate_t * pGate ) { return pGate->Value; } +void Mio_GateSetValue ( Mio_Gate_t * pGate, int Value ) { pGate->Value = Value; } /**Function************************************************************* diff --git a/src/map/mio/mioGENERIC.c b/src/map/mio/mioGENERIC.c deleted file mode 100644 index 972c4ffc..00000000 --- a/src/map/mio/mioGENERIC.c +++ /dev/null @@ -1,46 +0,0 @@ -/**CFile**************************************************************** - - FileName [mio___.c] - - PackageName [MVSIS 1.3: Multi-valued logic synthesis system.] - - Synopsis [File reading/writing for technology mapping.] - - Author [MVSIS Group] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - September 8, 2003.] - - Revision [$Id: mio___.h,v 1.0 2003/09/08 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "mioInt.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - diff --git a/src/map/mio/mioInt.h b/src/map/mio/mioInt.h index 3f90b625..654b7e19 100644 --- a/src/map/mio/mioInt.h +++ b/src/map/mio/mioInt.h @@ -54,6 +54,8 @@ struct Mio_LibraryStruct_t_ { char * pName; // the name of the library int nGates; // the number of the gates + Mio_Gate_t ** ppGates0; // the array of gates in the original order + Mio_Gate_t ** ppGatesName; // the array of gates sorted by name Mio_Gate_t * pGates; // the linked list of all gates in no particular order Mio_Gate_t * pGate0; // the constant zero gate Mio_Gate_t * pGate1; // the constant one gate @@ -84,7 +86,8 @@ struct Mio_GateStruct_t_ int nInputs; // the number of inputs double dDelayMax; // the maximum delay DdNode * bFunc; // the functionality - char * pSop; + char * pSop; // sum-of-products + int Value; // user's information }; struct Mio_PinStruct_t_ diff --git a/src/map/mio/mioRead.c b/src/map/mio/mioRead.c index 5b92d3e1..ae33c942 100644 --- a/src/map/mio/mioRead.c +++ b/src/map/mio/mioRead.c @@ -407,6 +407,85 @@ char * chomp( char *s ) return a; } +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Mio_LibraryCompareGatesByArea( Mio_Gate_t ** pp1, Mio_Gate_t ** pp2 ) +{ + double Diff = (*pp1)->dArea - (*pp2)->dArea; + if ( Diff < 0.0 ) + return -1; + if ( Diff > 0.0 ) + return 1; + return 0; +} + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Mio_LibraryCompareGatesByName( Mio_Gate_t ** pp1, Mio_Gate_t ** pp2 ) +{ + int Diff = strcmp( (*pp1)->pName, (*pp2)->pName ); + if ( Diff < 0.0 ) + return -1; + if ( Diff > 0.0 ) + return 1; + return 0; +} + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Mio_LibrarySortGates( Mio_Library_t * pLib ) +{ + Mio_Gate_t ** ppGates, * pGate; + int i = 0; + ppGates = ALLOC( Mio_Gate_t *, pLib->nGates ); + Mio_LibraryForEachGate( pLib, pGate ) + ppGates[i++] = pGate; + assert( i == pLib->nGates ); + // sort gates by area + pLib->ppGates0 = ALLOC( Mio_Gate_t *, pLib->nGates ); + for ( i = 0; i < pLib->nGates; i++ ) + pLib->ppGates0[i] = ppGates[i]; + qsort( (void *)ppGates, pLib->nGates, sizeof(void *), + (int (*)(const void *, const void *)) Mio_LibraryCompareGatesByArea ); + for ( i = 0; i < pLib->nGates; i++ ) + ppGates[i]->pNext = (i < pLib->nGates-1)? ppGates[i+1] : NULL; + pLib->pGates = ppGates[0]; + free( ppGates ); + // sort gates by name + pLib->ppGatesName = ALLOC( Mio_Gate_t *, pLib->nGates ); + for ( i = 0; i < pLib->nGates; i++ ) + pLib->ppGatesName[i] = pLib->ppGates0[i]; + qsort( (void *)pLib->ppGatesName, pLib->nGates, sizeof(void *), + (int (*)(const void *, const void *)) Mio_LibraryCompareGatesByName ); +} + /**Function************************************************************* Synopsis [] @@ -423,6 +502,8 @@ void Mio_LibraryDetectSpecialGates( Mio_Library_t * pLib ) Mio_Gate_t * pGate; DdNode * bFuncBuf, * bFuncInv, * bFuncNand2, * bFuncAnd2; + Mio_LibrarySortGates( pLib ); + bFuncBuf = pLib->dd->vars[0]; Cudd_Ref( bFuncBuf ); bFuncInv = Cudd_Not( pLib->dd->vars[0] ); Cudd_Ref( bFuncInv ); bFuncNand2 = Cudd_bddNand( pLib->dd, pLib->dd->vars[0], pLib->dd->vars[1] ); Cudd_Ref( bFuncNand2 ); diff --git a/src/map/mio/mioUtils.c b/src/map/mio/mioUtils.c index bd3d01f7..2a1d1f30 100644 --- a/src/map/mio/mioUtils.c +++ b/src/map/mio/mioUtils.c @@ -59,6 +59,8 @@ void Mio_LibraryDelete( Mio_Library_t * pLib ) st_free_table( pLib->tName2Gate ); if ( pLib->dd ) Cudd_Quit( pLib->dd ); + FREE( pLib->ppGates0 ); + FREE( pLib->ppGatesName ); free( pLib ); } @@ -82,7 +84,7 @@ void Mio_GateDelete( Mio_Gate_t * pGate ) if ( pGate->bFunc ) Cudd_RecursiveDeref( pGate->pLib->dd, pGate->bFunc ); Mio_GateForEachPinSafe( pGate, pPin, pPin2 ) - Mio_PinDelete( pPin ); + Mio_PinDelete( pPin ); free( pGate ); } @@ -142,11 +144,14 @@ Mio_Pin_t * Mio_PinDup( Mio_Pin_t * pPin ) ***********************************************************************/ void Mio_WriteLibrary( FILE * pFile, Mio_Library_t * pLib, int fPrintSops ) { - Mio_Gate_t * pGate; +// Mio_Gate_t * pGate; + int i; fprintf( pFile, "# The genlib library \"%s\".\n", pLib->pName ); - Mio_LibraryForEachGate( pLib, pGate ) - Mio_WriteGate( pFile, pGate, fPrintSops ); +// Mio_LibraryForEachGate( pLib, pGate ) +// Mio_WriteGate( pFile, pGate, fPrintSops ); + for ( i = 0; i < pLib->nGates; i++ ) + Mio_WriteGate( pFile, pLib->ppGates0[i], fPrintSops ); } /**Function************************************************************* -- cgit v1.2.3