| /**CFile**************************************************************** |
| |
| FileName [ifLibBox.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [FPGA mapping based on priority cuts.] |
| |
| Synopsis [Box library.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - November 21, 2006.] |
| |
| Revision [$Id: ifLibBox.c,v 1.00 2006/11/21 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "if.h" |
| #include "misc/extra/extra.h" |
| #include "base/main/main.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| #define If_LibBoxForEachBox( p, pBox, i ) \ |
| Vec_PtrForEachEntry( If_Box_t *, p->vBoxes, pBox, i ) if ( pBox == NULL ) {} else |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| If_Box_t * If_BoxStart( char * pName, int Id, int nPis, int nPos, int fSeq, int fBlack, int fOuter ) |
| { |
| If_Box_t * p; |
| p = ABC_CALLOC( If_Box_t, 1 ); |
| p->pName = pName; // consumes memory |
| p->Id = Id; |
| p->fSeq = (char)fSeq; |
| p->fBlack = (char)fBlack; |
| p->fOuter = (char)fOuter; |
| p->nPis = nPis; |
| p->nPos = nPos; |
| p->pDelays = ABC_CALLOC( int, nPis * nPos ); |
| return p; |
| } |
| If_Box_t * If_BoxDup( If_Box_t * p ) |
| { |
| If_Box_t * pNew = NULL; |
| return pNew; |
| } |
| void If_BoxFree( If_Box_t * p ) |
| { |
| ABC_FREE( p->pDelays ); |
| ABC_FREE( p->pName ); |
| ABC_FREE( p ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| If_LibBox_t * If_LibBoxStart() |
| { |
| If_LibBox_t * p; |
| p = ABC_CALLOC( If_LibBox_t, 1 ); |
| p->vBoxes = Vec_PtrAlloc( 100 ); |
| return p; |
| } |
| If_LibBox_t * If_LibBoxDup( If_Box_t * p ) |
| { |
| If_LibBox_t * pNew = NULL; |
| return pNew; |
| } |
| void If_LibBoxFree( If_LibBox_t * p ) |
| { |
| If_Box_t * pBox; |
| int i; |
| if ( p == NULL ) |
| return; |
| If_LibBoxForEachBox( p, pBox, i ) |
| If_BoxFree( pBox ); |
| Vec_PtrFree( p->vBoxes ); |
| ABC_FREE( p ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| If_Box_t * If_LibBoxReadBox( If_LibBox_t * p, int Id ) |
| { |
| return (If_Box_t *)Vec_PtrEntry( p->vBoxes, Id ); |
| } |
| If_Box_t * If_LibBoxFindBox( If_LibBox_t * p, char * pName ) |
| { |
| If_Box_t * pBox; |
| int i; |
| if ( p == NULL ) |
| return NULL; |
| If_LibBoxForEachBox( p, pBox, i ) |
| if ( !strcmp(pBox->pName, pName) ) |
| return pBox; |
| return NULL; |
| } |
| void If_LibBoxAdd( If_LibBox_t * p, If_Box_t * pBox ) |
| { |
| if ( pBox->Id >= Vec_PtrSize(p->vBoxes) ) |
| Vec_PtrFillExtra( p->vBoxes, 2 * pBox->Id + 10, NULL ); |
| assert( Vec_PtrEntry( p->vBoxes, pBox->Id ) == NULL ); |
| Vec_PtrWriteEntry( p->vBoxes, pBox->Id, pBox ); |
| p->nBoxes++; |
| } |
| int If_LibBoxNum( If_LibBox_t * p ) |
| { |
| return p->nBoxes; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| If_LibBox_t * If_LibBoxRead2( char * pFileName ) |
| { |
| int nSize = 100000; |
| char * pBuffer; |
| FILE * pFile; |
| If_LibBox_t * p = NULL; |
| If_Box_t * pBox = NULL; |
| char * pToken, * pName; |
| int fSeq, fBlack, fOuter; |
| int i, Id, nPis, nPos; |
| pFile = fopen( pFileName, "rb" ); |
| if ( pFile == NULL ) |
| { |
| printf( "Cannot open file \"%s\".\n", pFileName ); |
| return NULL; |
| } |
| // read lines |
| nPis = nPos = 0; |
| pBuffer = ABC_ALLOC( char, nSize ); |
| while ( fgets( pBuffer, nSize, pFile ) ) |
| { |
| pToken = strtok( pBuffer, " \n\r\t" ); |
| if ( pToken == NULL ) |
| continue; |
| if ( pToken[0] == '.' ) |
| { |
| if ( !strcmp(pToken, ".box") ) |
| { |
| // save ID |
| pToken = strtok( NULL, " \n\r\t" ); |
| Id = atoi( pToken ); |
| // save name |
| pToken = strtok( NULL, " \n\r\t" ); |
| pName = Abc_UtilStrsav(pToken); |
| // save PIs |
| pToken = strtok( NULL, " \n\r\t" ); |
| nPis = atoi( pToken ); |
| // save POs |
| pToken = strtok( NULL, " \n\r\t" ); |
| nPos = atoi( pToken ); |
| // save attributes |
| fSeq = fBlack = fOuter = 0; |
| pToken = strtok( NULL, " \n\r\t" ); |
| while ( pToken ) |
| { |
| if ( !strcmp(pToken, "seq") ) |
| fSeq = 1; |
| else if ( !strcmp(pToken, "black") ) |
| fBlack = 1; |
| else if ( !strcmp(pToken, "outer") ) |
| fOuter = 1; |
| else assert( !strcmp(pToken, "comb") || !strcmp(pToken, "white") || !strcmp(pToken, "inner") ); |
| pToken = strtok( NULL, " \n\r\t" ); |
| } |
| // create library |
| if ( p == NULL ) |
| p = If_LibBoxStart(); |
| // create box |
| pBox = If_BoxStart( pName, Id, nPis, nPos, fSeq, fBlack, fOuter ); |
| If_LibBoxAdd( p, pBox ); |
| } |
| continue; |
| } |
| // read the table |
| assert( nPis > 0 && nPos > 0 ); |
| for ( i = 0; i < nPis * nPos; i++ ) |
| { |
| while ( pToken == NULL ) |
| { |
| if ( fgets( pBuffer, nSize, pFile ) == NULL ) |
| { printf( "The table does not have enough entries.\n" ); fflush(stdout); assert( 0 ); } |
| pToken = strtok( pBuffer, " \n\r\t" ); |
| } |
| pBox->pDelays[i] = (pToken[0] == '-') ? -1 : atoi(pToken); |
| pToken = strtok( NULL, " \n\r\t" ); |
| } |
| pBox = NULL; |
| } |
| ABC_FREE( pBuffer ); |
| fclose( pFile ); |
| return p; |
| } |
| |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| char * If_LibBoxGetToken( FILE * pFile ) |
| { |
| static char pBuffer[1000]; |
| int c; char * pTemp = pBuffer; |
| while ( (c = fgetc(pFile)) != EOF ) |
| { |
| if ( c == '#' ) |
| { |
| while ( (c = fgetc(pFile)) != EOF ) |
| if ( c == '\n' ) |
| break; |
| } |
| if ( c == ' ' || c == '\t' || c == '\n' || c == '\r' ) |
| { |
| if ( pTemp > pBuffer ) |
| break; |
| continue; |
| } |
| *pTemp++ = c; |
| } |
| *pTemp = 0; |
| return pTemp > pBuffer ? pBuffer : NULL; |
| } |
| If_LibBox_t * If_LibBoxRead( char * pFileName ) |
| { |
| FILE * pFile; |
| If_LibBox_t * p; |
| If_Box_t * pBox; |
| char * pToken, * pName; |
| int i, Id, fBlack, nPis, nPos; |
| pFile = fopen( pFileName, "rb" ); |
| if ( pFile == NULL ) |
| { |
| printf( "Cannot open file \"%s\".\n", pFileName ); |
| return NULL; |
| } |
| // get the library name |
| pToken = If_LibBoxGetToken( pFile ); |
| if ( pToken == NULL ) |
| { |
| fclose( pFile ); |
| printf( "Cannot read library name from file \"%s\".\n", pFileName ); |
| return NULL; |
| } |
| if ( pToken[0] == '.' ) |
| { |
| fclose( pFile ); |
| printf( "Wrong box format. Please try \"read_box -e\".\n" ); |
| return NULL; |
| } |
| |
| // create library |
| p = If_LibBoxStart(); |
| while ( pToken ) |
| { |
| // save name |
| pName = Abc_UtilStrsav(pToken); |
| // save ID |
| pToken = If_LibBoxGetToken( pFile ); |
| Id = atoi( pToken ); |
| // save white/black |
| pToken = If_LibBoxGetToken( pFile ); |
| fBlack = !atoi( pToken ); |
| // save PIs |
| pToken = If_LibBoxGetToken( pFile ); |
| nPis = atoi( pToken ); |
| // save POs |
| pToken = If_LibBoxGetToken( pFile ); |
| nPos = atoi( pToken ); |
| // create box |
| pBox = If_BoxStart( pName, Id, nPis, nPos, 0, fBlack, 0 ); |
| If_LibBoxAdd( p, pBox ); |
| // read the table |
| for ( i = 0; i < nPis * nPos; i++ ) |
| { |
| pToken = If_LibBoxGetToken( pFile ); |
| pBox->pDelays[i] = (pToken[0] == '-') ? -ABC_INFINITY : atoi(pToken); |
| } |
| // extract next name |
| pToken = If_LibBoxGetToken( pFile ); |
| } |
| fclose( pFile ); |
| return p; |
| } |
| void If_LibBoxPrint( FILE * pFile, If_LibBox_t * p ) |
| { |
| If_Box_t * pBox; |
| int i, j, k; |
| fprintf( pFile, "# Box library written by ABC on %s.\n", Extra_TimeStamp() ); |
| fprintf( pFile, "# <Name> <ID> <Type> <I> <O>\n" ); |
| If_LibBoxForEachBox( p, pBox, i ) |
| { |
| fprintf( pFile, "%s %d %d %d %d\n", pBox->pName, pBox->Id, !pBox->fBlack, pBox->nPis, pBox->nPos ); |
| for ( j = 0; j < pBox->nPos; j++, printf("\n") ) |
| for ( k = 0; k < pBox->nPis; k++ ) |
| if ( pBox->pDelays[j * pBox->nPis + k] == -ABC_INFINITY ) |
| fprintf( pFile, " - " ); |
| else |
| fprintf( pFile, "%5d ", pBox->pDelays[j * pBox->nPis + k] ); |
| } |
| } |
| void If_LibBoxWrite( char * pFileName, If_LibBox_t * p ) |
| { |
| FILE * pFile; |
| pFile = fopen( pFileName, "wb" ); |
| if ( pFile == NULL ) |
| { |
| printf( "Cannot open file \"%s\".\n", pFileName ); |
| return; |
| } |
| If_LibBoxPrint( pFile, p ); |
| fclose( pFile ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int If_LibBoxLoad( char * pFileName ) |
| { |
| FILE * pFile; |
| If_LibBox_t * pLib; |
| char * pFileNameOther; |
| // check if library can be read |
| pFileNameOther = Extra_FileNameGenericAppend( pFileName, ".cdl" ); |
| pFile = fopen( pFileNameOther, "r" ); |
| if ( pFile == NULL ) |
| return 0; |
| fclose( pFile ); |
| // read library |
| pLib = If_LibBoxRead2( pFileNameOther ); |
| // replace the current library |
| If_LibBoxFree( (If_LibBox_t *)Abc_FrameReadLibBox() ); |
| Abc_FrameSetLibBox( pLib ); |
| return 1; |
| } |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |