mirror of https://github.com/YosysHQ/abc.git
402 lines
11 KiB
C
402 lines
11 KiB
C
/**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 );
|
|
}
|
|
|
|
/**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
|
|
|