diff options
Diffstat (limited to 'src/map/if/ifLibBox.c')
-rw-r--r-- | src/map/if/ifLibBox.c | 127 |
1 files changed, 120 insertions, 7 deletions
diff --git a/src/map/if/ifLibBox.c b/src/map/if/ifLibBox.c index 042cb7f1..f420cf36 100644 --- a/src/map/if/ifLibBox.c +++ b/src/map/if/ifLibBox.c @@ -45,13 +45,15 @@ ABC_NAMESPACE_IMPL_START SeeAlso [] ***********************************************************************/ -If_Box_t * If_BoxStart( char * pName, int Id, int fBlack, int nPis, int nPos ) +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->fBlack = fBlack; + 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 ); @@ -119,6 +121,17 @@ 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) ) @@ -127,6 +140,99 @@ void If_LibBoxAdd( If_LibBox_t * p, If_Box_t * pBox ) Vec_PtrWriteEntry( p->vBoxes, pBox->Id, pBox ); } +/**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 ) + { + fgets( pBuffer, nSize, pFile ); + 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************************************************************* @@ -167,9 +273,8 @@ If_LibBox_t * If_LibBoxRead( char * pFileName ) FILE * pFile; If_LibBox_t * p; If_Box_t * pBox; - char * pToken; - char * pName; - int i, Id, fWhite, nPis, nPos; + char * pToken, * pName; + int i, Id, fBlack, nPis, nPos; pFile = fopen( pFileName, "rb" ); if ( pFile == NULL ) { @@ -180,9 +285,17 @@ If_LibBox_t * If_LibBoxRead( char * pFileName ) 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 ) @@ -194,7 +307,7 @@ If_LibBox_t * If_LibBoxRead( char * pFileName ) Id = atoi( pToken ); // save white/black pToken = If_LibBoxGetToken( pFile ); - fWhite = atoi( pToken ); + fBlack = !atoi( pToken ); // save PIs pToken = If_LibBoxGetToken( pFile ); nPis = atoi( pToken ); @@ -202,7 +315,7 @@ If_LibBox_t * If_LibBoxRead( char * pFileName ) pToken = If_LibBoxGetToken( pFile ); nPos = atoi( pToken ); // create box - pBox = If_BoxStart( pName, Id, !fWhite, nPis, nPos ); + pBox = If_BoxStart( pName, Id, nPis, nPos, 0, fBlack, 0 ); If_LibBoxAdd( p, pBox ); // read the table for ( i = 0; i < nPis * nPos; i++ ) |