| /**CFile**************************************************************** |
| |
| FileName [ioReadEqn.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [Command processing package.] |
| |
| Synopsis [Procedures to read equation format files.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - June 20, 2005.] |
| |
| Revision [$Id: ioReadEqn.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "ioAbc.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| static Abc_Ntk_t * Io_ReadEqnNetwork( Extra_FileReader_t * p ); |
| static void Io_ReadEqnStrCompact( char * pStr ); |
| static int Io_ReadEqnStrFind( Vec_Ptr_t * vTokens, char * pName ); |
| static void Io_ReadEqnStrCutAt( char * pStr, char * pStop, int fUniqueOnly, Vec_Ptr_t * vTokens ); |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [Reads the network from a BENCH file.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Abc_Ntk_t * Io_ReadEqn( char * pFileName, int fCheck ) |
| { |
| Extra_FileReader_t * p; |
| Abc_Ntk_t * pNtk; |
| |
| // start the file |
| p = Extra_FileReaderAlloc( pFileName, "#", ";", "=" ); |
| if ( p == NULL ) |
| return NULL; |
| |
| // read the network |
| pNtk = Io_ReadEqnNetwork( p ); |
| Extra_FileReaderFree( p ); |
| if ( pNtk == NULL ) |
| return NULL; |
| |
| // make sure that everything is okay with the network structure |
| if ( fCheck && !Abc_NtkCheckRead( pNtk ) ) |
| { |
| printf( "Io_ReadEqn: The network check has failed.\n" ); |
| Abc_NtkDelete( pNtk ); |
| return NULL; |
| } |
| return pNtk; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Abc_Ntk_t * Io_ReadEqnNetwork( Extra_FileReader_t * p ) |
| { |
| ProgressBar * pProgress; |
| Vec_Ptr_t * vTokens; |
| Vec_Ptr_t * vVars; |
| Abc_Ntk_t * pNtk; |
| Abc_Obj_t * pNode; |
| char * pNodeName, * pFormula, * pFormulaCopy, * pVarName; |
| int iLine, i; |
| |
| // allocate the empty network |
| pNtk = Abc_NtkAlloc( ABC_NTK_NETLIST, ABC_FUNC_AIG, 1 ); |
| // set the specs |
| pNtk->pName = Extra_FileNameGeneric(Extra_FileReaderGetFileName(p)); |
| pNtk->pSpec = Extra_UtilStrsav(Extra_FileReaderGetFileName(p)); |
| |
| // go through the lines of the file |
| vVars = Vec_PtrAlloc( 100 ); |
| pProgress = Extra_ProgressBarStart( stdout, Extra_FileReaderGetFileSize(p) ); |
| for ( iLine = 0; (vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p)); iLine++ ) |
| { |
| Extra_ProgressBarUpdate( pProgress, Extra_FileReaderGetCurPosition(p), NULL ); |
| |
| // check if the first token contains anything |
| Io_ReadEqnStrCompact( (char *)vTokens->pArray[0] ); |
| if ( strlen((char *)vTokens->pArray[0]) == 0 ) |
| break; |
| |
| // if the number of tokens is different from two, error |
| if ( vTokens->nSize != 2 ) |
| { |
| printf( "%s: Wrong input file format.\n", Extra_FileReaderGetFileName(p) ); |
| Abc_NtkDelete( pNtk ); |
| return NULL; |
| } |
| |
| // get the type of the line |
| if ( strncmp( (char *)vTokens->pArray[0], "INORDER", 7 ) == 0 ) |
| { |
| Io_ReadEqnStrCutAt( (char *)vTokens->pArray[1], " \n\r\t", 0, vVars ); |
| Vec_PtrForEachEntry( char *, vVars, pVarName, i ) |
| Io_ReadCreatePi( pNtk, pVarName ); |
| } |
| else if ( strncmp( (char *)vTokens->pArray[0], "OUTORDER", 8 ) == 0 ) |
| { |
| Io_ReadEqnStrCutAt( (char *)vTokens->pArray[1], " \n\r\t", 0, vVars ); |
| Vec_PtrForEachEntry( char *, vVars, pVarName, i ) |
| Io_ReadCreatePo( pNtk, pVarName ); |
| } |
| else |
| { |
| extern Hop_Obj_t * Parse_FormulaParserEqn( FILE * pOutput, char * pFormInit, Vec_Ptr_t * vVarNames, Hop_Man_t * pMan ); |
| |
| // get hold of the node name and its formula |
| pNodeName = (char *)vTokens->pArray[0]; |
| pFormula = (char *)vTokens->pArray[1]; |
| // compact the formula |
| Io_ReadEqnStrCompact( pFormula ); |
| |
| // consider the case of the constant node |
| if ( pFormula[1] == 0 && (pFormula[0] == '0' || pFormula[0] == '1') ) |
| { |
| pFormulaCopy = NULL; |
| Vec_PtrClear( vVars ); |
| } |
| else |
| { |
| // make a copy of formula for names |
| pFormulaCopy = Extra_UtilStrsav( pFormula ); |
| // find the names of the fanins of this node |
| Io_ReadEqnStrCutAt( pFormulaCopy, "!*+()", 1, vVars ); |
| } |
| // create the node |
| pNode = Io_ReadCreateNode( pNtk, pNodeName, (char **)Vec_PtrArray(vVars), Vec_PtrSize(vVars) ); |
| // derive the function |
| pNode->pData = Parse_FormulaParserEqn( stdout, pFormula, vVars, (Hop_Man_t *)pNtk->pManFunc ); |
| // remove the cubes |
| ABC_FREE( pFormulaCopy ); |
| } |
| } |
| Extra_ProgressBarStop( pProgress ); |
| Vec_PtrFree( vVars ); |
| Abc_NtkFinalizeRead( pNtk ); |
| return pNtk; |
| } |
| |
| |
| |
| /**Function************************************************************* |
| |
| Synopsis [Compacts the string by throwing away space-like chars.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Io_ReadEqnStrCompact( char * pStr ) |
| { |
| char * pCur, * pNew; |
| for ( pNew = pCur = pStr; *pCur; pCur++ ) |
| if ( !(*pCur == ' ' || *pCur == '\n' || *pCur == '\r' || *pCur == '\t') ) |
| *pNew++ = *pCur; |
| *pNew = 0; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Determines unique variables in the string.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Io_ReadEqnStrFind( Vec_Ptr_t * vTokens, char * pName ) |
| { |
| char * pToken; |
| int i; |
| Vec_PtrForEachEntry( char *, vTokens, pToken, i ) |
| if ( strcmp( pToken, pName ) == 0 ) |
| return i; |
| return -1; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Cuts the string into pieces using stop chars.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Io_ReadEqnStrCutAt( char * pStr, char * pStop, int fUniqueOnly, Vec_Ptr_t * vTokens ) |
| { |
| char * pToken; |
| Vec_PtrClear( vTokens ); |
| for ( pToken = strtok( pStr, pStop ); pToken; pToken = strtok( NULL, pStop ) ) |
| if ( !fUniqueOnly || Io_ReadEqnStrFind( vTokens, pToken ) == -1 ) |
| Vec_PtrPush( vTokens, pToken ); |
| } |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |