blob: 443dbd3f42ed4ec3f498a0db1892ca3880f19d75 [file] [log] [blame]
/**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