mirror of https://github.com/YosysHQ/abc.git
132 lines
3.7 KiB
C
132 lines
3.7 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [verParse.c]
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
PackageName [Verilog parser.]
|
|
|
|
Synopsis [Performs some Verilog parsing tasks.]
|
|
|
|
Author [Alan Mishchenko]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - August 19, 2006.]
|
|
|
|
Revision [$Id: verParse.c,v 1.00 2006/08/19 00:00:00 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#include "ver.h"
|
|
|
|
ABC_NAMESPACE_IMPL_START
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DEFINITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Skips the comments of they are present.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
int Ver_ParseSkipComments( Ver_Man_t * pMan )
|
|
{
|
|
Ver_Stream_t * p = pMan->pReader;
|
|
char Symbol;
|
|
// skip spaces
|
|
Ver_StreamSkipChars( p, " \t\n\r" );
|
|
if ( !Ver_StreamIsOkey(pMan->pReader) )
|
|
return 1;
|
|
// read the first symbol
|
|
Symbol = Ver_StreamScanChar( p );
|
|
if ( Symbol != '/' )
|
|
return 1;
|
|
Ver_StreamPopChar( p );
|
|
// read the second symbol
|
|
Symbol = Ver_StreamScanChar( p );
|
|
if ( Symbol == '/' )
|
|
{ // skip till the end of line
|
|
Ver_StreamSkipToChars( p, "\n" );
|
|
return Ver_ParseSkipComments( pMan );
|
|
}
|
|
if ( Symbol == '*' )
|
|
{ // skip till the next occurrence of */
|
|
Ver_StreamPopChar( p );
|
|
do {
|
|
Ver_StreamSkipToChars( p, "*" );
|
|
Ver_StreamPopChar( p );
|
|
} while ( Ver_StreamScanChar( p ) != '/' );
|
|
Ver_StreamPopChar( p );
|
|
return Ver_ParseSkipComments( pMan );
|
|
}
|
|
sprintf( pMan->sError, "Cannot parse after symbol \"/\"." );
|
|
Ver_ParsePrintErrorMessage( pMan );
|
|
return 0;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Parses a Verilog name that can be being with a slash.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
char * Ver_ParseGetName( Ver_Man_t * pMan )
|
|
{
|
|
Ver_Stream_t * p = pMan->pReader;
|
|
char Symbol;
|
|
char * pWord;
|
|
pMan->fNameLast = 0;
|
|
if ( !Ver_StreamIsOkey(p) )
|
|
return NULL;
|
|
if ( !Ver_ParseSkipComments( pMan ) )
|
|
return NULL;
|
|
Symbol = Ver_StreamScanChar( p );
|
|
if ( Symbol == '\\' )
|
|
{
|
|
pMan->fNameLast = 1;
|
|
Ver_StreamPopChar( p );
|
|
pWord = Ver_StreamGetWord( p, " \r\n" );
|
|
Ver_StreamSkipChars( p, " \r\n" );
|
|
if ( Ver_StreamScanChar(p) == '[' )
|
|
{
|
|
char This, * pEnd = pWord + strlen( pWord );
|
|
while ( (This = Ver_StreamPopChar(p)) != ']' )
|
|
*pEnd++ = This;
|
|
*pEnd++ = This;
|
|
*pEnd = 0;
|
|
}
|
|
}
|
|
else
|
|
pWord = Ver_StreamGetWord( p, " \t\n\r(),;" );
|
|
if ( Ver_StreamIsOkey(p) && !Ver_ParseSkipComments( pMan ) )
|
|
return NULL;
|
|
return pWord;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
ABC_NAMESPACE_IMPL_END
|
|
|