mirror of
https://github.com/YosysHQ/abc.git
synced 2026-09-02 18:48:46 +02:00
225 lines
7.3 KiB
C
225 lines
7.3 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [plaRead.c]
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
PackageName [SOP manager.]
|
|
|
|
Synopsis [Scalable SOP transformations.]
|
|
|
|
Author [Alan Mishchenko]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - March 18, 2015.]
|
|
|
|
Revision [$Id: plaRead.c,v 1.00 2014/09/12 00:00:00 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#include "pla.h"
|
|
|
|
ABC_NAMESPACE_IMPL_START
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DEFINITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
char * Pla_ReadFile( char * pFileName, char ** ppLimit )
|
|
{
|
|
char * pBuffer;
|
|
int nFileSize, RetValue;
|
|
FILE * pFile = fopen( pFileName, "rb" );
|
|
if ( pFile == NULL )
|
|
{
|
|
printf( "Cannot open input file.\n" );
|
|
return NULL;
|
|
}
|
|
// get the file size, in bytes
|
|
fseek( pFile, 0, SEEK_END );
|
|
nFileSize = ftell( pFile );
|
|
// move the file current reading position to the beginning
|
|
rewind( pFile );
|
|
// load the contents of the file into memory
|
|
pBuffer = ABC_ALLOC( char, nFileSize + 16 );
|
|
pBuffer[0] = '\n';
|
|
RetValue = fread( pBuffer+1, nFileSize, 1, pFile );
|
|
fclose( pFile );
|
|
// terminate the string with '\0'
|
|
pBuffer[nFileSize + 1] = '\n';
|
|
pBuffer[nFileSize + 2] = '\0';
|
|
*ppLimit = pBuffer + nFileSize + 3;
|
|
return pBuffer;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Pla_ReadPlaRemoveComments( char * pBuffer, char * pLimit )
|
|
{
|
|
char * pTemp;
|
|
for ( pTemp = pBuffer; pTemp < pLimit; pTemp++ )
|
|
if ( *pTemp == '#' )
|
|
while ( *pTemp && *pTemp != '\n' )
|
|
*pTemp++ = ' ';
|
|
}
|
|
int Pla_ReadPlaHeader( char * pBuffer, char * pLimit, int * pnIns, int * pnOuts, int * pnCubes, int * pType )
|
|
{
|
|
char * pTemp;
|
|
*pType = PLA_FILE_FD;
|
|
*pnIns = *pnOuts = *pnCubes = -1;
|
|
for ( pTemp = pBuffer; pTemp < pLimit; pTemp++ )
|
|
{
|
|
if ( *pTemp != '.' )
|
|
continue;
|
|
if ( !strncmp(pTemp, ".i ", 3) )
|
|
*pnIns = atoi( pTemp + 3 );
|
|
else if ( !strncmp(pTemp, ".o ", 3) )
|
|
*pnOuts = atoi( pTemp + 3 );
|
|
else if ( !strncmp(pTemp, ".p ", 3) )
|
|
*pnCubes = atoi( pTemp + 3 );
|
|
else if ( !strncmp(pTemp, ".e ", 3) )
|
|
break;
|
|
else if ( !strncmp(pTemp, ".type ", 6) )
|
|
{
|
|
char Buffer[100];
|
|
*pType = PLA_FILE_NONE;
|
|
sscanf( pTemp+6, "%s", Buffer );
|
|
if ( !strcmp(Buffer, "f") )
|
|
*pType = PLA_FILE_F;
|
|
else if ( !strcmp(Buffer, "fr") )
|
|
*pType = PLA_FILE_FR;
|
|
else if ( !strcmp(Buffer, "fd") )
|
|
*pType = PLA_FILE_FD;
|
|
else if ( !strcmp(Buffer, "fdr") )
|
|
*pType = PLA_FILE_FDR;
|
|
}
|
|
}
|
|
if ( *pnIns <= 0 )
|
|
printf( "The number of inputs (.i) should be positive.\n" );
|
|
if ( *pnOuts <= 0 )
|
|
printf( "The number of outputs (.o) should be positive.\n" );
|
|
return *pnIns > 0 && *pnOuts > 0;
|
|
}
|
|
Vec_Str_t * Pla_ReadPlaBody( char * pBuffer, char * pLimit, Pla_File_t Type )
|
|
{
|
|
char * pTemp;
|
|
Vec_Str_t * vLits;
|
|
vLits = Vec_StrAlloc( 10000 );
|
|
for ( pTemp = pBuffer; pTemp < pLimit; pTemp++ )
|
|
{
|
|
if ( *pTemp == '.' )
|
|
while ( *pTemp && *pTemp != '\n' )
|
|
pTemp++;
|
|
if ( *pTemp == '0' )
|
|
Vec_StrPush( vLits, (char)PLA_LIT_ZERO );
|
|
else if ( *pTemp == '1' )
|
|
Vec_StrPush( vLits, (char)PLA_LIT_ONE );
|
|
else if ( *pTemp == '-' || *pTemp == '2' )
|
|
Vec_StrPush( vLits, (char)PLA_LIT_DASH );
|
|
else if ( *pTemp == '~' ) // no meaning
|
|
{
|
|
if ( Type == PLA_FILE_F || Type == PLA_FILE_FD )
|
|
Vec_StrPush( vLits, (char)PLA_LIT_ZERO );
|
|
else if ( Type == PLA_FILE_FR )
|
|
Vec_StrPush( vLits, (char)PLA_LIT_DASH );
|
|
else if ( Type == PLA_FILE_FDR )
|
|
Vec_StrPush( vLits, (char)PLA_LIT_FULL );
|
|
else assert( 0 );
|
|
}
|
|
}
|
|
return vLits;
|
|
}
|
|
void Pla_ReadAddBody( Pla_Man_t * p, Vec_Str_t * vLits )
|
|
{
|
|
word * pCubeIn, * pCubeOut;
|
|
int i, k, Lit, Count = 0;
|
|
int nCubesReal = Vec_StrSize(vLits) / (p->nIns + p->nOuts);
|
|
assert( Vec_StrSize(vLits) % (p->nIns + p->nOuts) == 0 );
|
|
if ( nCubesReal != Pla_ManCubeNum(p) )
|
|
{
|
|
printf( "Warning: Declared number of cubes (%d) differs from the actual (%d).\n",
|
|
Pla_ManCubeNum(p), nCubesReal );
|
|
if ( nCubesReal < Pla_ManCubeNum(p) )
|
|
Vec_IntShrink( &p->vCubes, nCubesReal );
|
|
else
|
|
{
|
|
assert( nCubesReal > Pla_ManCubeNum(p) );
|
|
Vec_IntFillNatural( &p->vCubes, nCubesReal );
|
|
Vec_WrdFillExtra( &p->vInBits, nCubesReal * p->nInWords, 0 );
|
|
Vec_WrdFillExtra( &p->vOutBits, nCubesReal * p->nOutWords, 0 );
|
|
}
|
|
}
|
|
Pla_ForEachCubeInOut( p, pCubeIn, pCubeOut, i )
|
|
{
|
|
Pla_CubeForEachLit( p->nIns, pCubeIn, Lit, k )
|
|
Pla_CubeSetLit( pCubeIn, k, (Pla_Lit_t)Vec_StrEntry(vLits, Count++) );
|
|
Pla_CubeForEachLit( p->nOuts, pCubeOut, Lit, k )
|
|
Pla_CubeSetLit( pCubeOut, k, (Pla_Lit_t)Vec_StrEntry(vLits, Count++) );
|
|
}
|
|
assert( Count == Vec_StrSize(vLits) );
|
|
}
|
|
Pla_Man_t * Pla_ReadPla( char * pFileName )
|
|
{
|
|
Pla_Man_t * p;
|
|
Vec_Str_t * vLits;
|
|
int nIns, nOuts, nCubes, Type;
|
|
char * pBuffer, * pLimit;
|
|
pBuffer = Pla_ReadFile( pFileName, &pLimit );
|
|
if ( pBuffer == NULL )
|
|
return NULL;
|
|
Pla_ReadPlaRemoveComments( pBuffer, pLimit );
|
|
if ( Pla_ReadPlaHeader( pBuffer, pLimit, &nIns, &nOuts, &nCubes, &Type ) )
|
|
{
|
|
vLits = Pla_ReadPlaBody( pBuffer, pLimit, (Pla_File_t)Type );
|
|
if ( Vec_StrSize(vLits) % (nIns + nOuts) == 0 )
|
|
{
|
|
if ( nCubes == -1 )
|
|
nCubes = Vec_StrSize(vLits) / (nIns + nOuts);
|
|
p = Pla_ManAlloc( pFileName, nIns, nOuts, nCubes );
|
|
p->Type = (Pla_File_t)Type;
|
|
Pla_ReadAddBody( p, vLits );
|
|
Vec_StrFree( vLits );
|
|
ABC_FREE( pBuffer );
|
|
return p;
|
|
}
|
|
printf( "Literal count is incorrect (in = %d; out = %d; lit = %d).\n", nIns, nOuts, Vec_StrSize(vLits) );
|
|
Vec_StrFree( vLits );
|
|
}
|
|
ABC_FREE( pBuffer );
|
|
return NULL;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
ABC_NAMESPACE_IMPL_END
|
|
|