| /**CFile**************************************************************** |
| |
| FileName [ioWriteEqn.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [Command processing package.] |
| |
| Synopsis [Procedures to write equation representation of the network.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - June 20, 2005.] |
| |
| Revision [$Id: ioWriteEqn.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "ioAbc.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| static void Io_NtkWriteEqnOne( FILE * pFile, Abc_Ntk_t * pNtk ); |
| static void Io_NtkWriteEqnCis( FILE * pFile, Abc_Ntk_t * pNtk ); |
| static void Io_NtkWriteEqnCos( FILE * pFile, Abc_Ntk_t * pNtk ); |
| static int Io_NtkWriteEqnCheck( Abc_Ntk_t * pNtk ); |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [Writes the logic network in the equation format.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Io_WriteEqn( Abc_Ntk_t * pNtk, char * pFileName ) |
| { |
| FILE * pFile; |
| |
| assert( Abc_NtkIsAigNetlist(pNtk) ); |
| if ( Abc_NtkLatchNum(pNtk) > 0 ) |
| printf( "Warning: only combinational portion is being written.\n" ); |
| |
| // check that the names are fine for the EQN format |
| if ( !Io_NtkWriteEqnCheck(pNtk) ) |
| return; |
| |
| // start the output stream |
| pFile = fopen( pFileName, "w" ); |
| if ( pFile == NULL ) |
| { |
| fprintf( stdout, "Io_WriteEqn(): Cannot open the output file \"%s\".\n", pFileName ); |
| return; |
| } |
| fprintf( pFile, "# Equations for \"%s\" written by ABC on %s\n", pNtk->pName, Extra_TimeStamp() ); |
| |
| // write the equations for the network |
| Io_NtkWriteEqnOne( pFile, pNtk ); |
| fprintf( pFile, "\n" ); |
| fclose( pFile ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Write one network.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Io_NtkWriteEqnOne( FILE * pFile, Abc_Ntk_t * pNtk ) |
| { |
| Vec_Vec_t * vLevels; |
| ProgressBar * pProgress; |
| Abc_Obj_t * pNode, * pFanin; |
| int i, k; |
| |
| // write the PIs |
| fprintf( pFile, "INORDER =" ); |
| Io_NtkWriteEqnCis( pFile, pNtk ); |
| fprintf( pFile, ";\n" ); |
| |
| // write the POs |
| fprintf( pFile, "OUTORDER =" ); |
| Io_NtkWriteEqnCos( pFile, pNtk ); |
| fprintf( pFile, ";\n" ); |
| |
| // write each internal node |
| vLevels = Vec_VecAlloc( 10 ); |
| pProgress = Extra_ProgressBarStart( stdout, Abc_NtkObjNumMax(pNtk) ); |
| Abc_NtkForEachNode( pNtk, pNode, i ) |
| { |
| Extra_ProgressBarUpdate( pProgress, i, NULL ); |
| fprintf( pFile, "%s = ", Abc_ObjName(Abc_ObjFanout0(pNode)) ); |
| // set the input names |
| Abc_ObjForEachFanin( pNode, pFanin, k ) |
| Hop_IthVar((Hop_Man_t *)pNtk->pManFunc, k)->pData = Abc_ObjName(pFanin); |
| // write the formula |
| Hop_ObjPrintEqn( pFile, (Hop_Obj_t *)pNode->pData, vLevels, 0 ); |
| fprintf( pFile, ";\n" ); |
| } |
| Extra_ProgressBarStop( pProgress ); |
| Vec_VecFree( vLevels ); |
| } |
| |
| |
| /**Function************************************************************* |
| |
| Synopsis [Writes the primary input list.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Io_NtkWriteEqnCis( FILE * pFile, Abc_Ntk_t * pNtk ) |
| { |
| Abc_Obj_t * pTerm, * pNet; |
| int LineLength; |
| int AddedLength; |
| int NameCounter; |
| int i; |
| |
| LineLength = 9; |
| NameCounter = 0; |
| |
| Abc_NtkForEachCi( pNtk, pTerm, i ) |
| { |
| pNet = Abc_ObjFanout0(pTerm); |
| // get the line length after this name is written |
| AddedLength = strlen(Abc_ObjName(pNet)) + 1; |
| if ( NameCounter && LineLength + AddedLength + 3 > IO_WRITE_LINE_LENGTH ) |
| { // write the line extender |
| fprintf( pFile, " \n" ); |
| // reset the line length |
| LineLength = 0; |
| NameCounter = 0; |
| } |
| fprintf( pFile, " %s", Abc_ObjName(pNet) ); |
| LineLength += AddedLength; |
| NameCounter++; |
| } |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Writes the primary input list.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Io_NtkWriteEqnCos( FILE * pFile, Abc_Ntk_t * pNtk ) |
| { |
| Abc_Obj_t * pTerm, * pNet; |
| int LineLength; |
| int AddedLength; |
| int NameCounter; |
| int i; |
| |
| LineLength = 10; |
| NameCounter = 0; |
| |
| Abc_NtkForEachCo( pNtk, pTerm, i ) |
| { |
| pNet = Abc_ObjFanin0(pTerm); |
| // get the line length after this name is written |
| AddedLength = strlen(Abc_ObjName(pNet)) + 1; |
| if ( NameCounter && LineLength + AddedLength + 3 > IO_WRITE_LINE_LENGTH ) |
| { // write the line extender |
| fprintf( pFile, " \n" ); |
| // reset the line length |
| LineLength = 0; |
| NameCounter = 0; |
| } |
| fprintf( pFile, " %s", Abc_ObjName(pNet) ); |
| LineLength += AddedLength; |
| NameCounter++; |
| } |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Make sure the network does not have offending names.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Io_NtkWriteEqnCheck( Abc_Ntk_t * pNtk ) |
| { |
| Abc_Obj_t * pObj; |
| char * pName = NULL; |
| int i, k, Length; |
| int RetValue = 1; |
| |
| // make sure the network does not have proper names, such as "0" or "1" or containing parentheses |
| Abc_NtkForEachObj( pNtk, pObj, i ) |
| { |
| pName = Nm_ManFindNameById(pNtk->pManName, i); |
| if ( pName == NULL ) |
| continue; |
| Length = strlen(pName); |
| if ( pName[0] == '0' || pName[0] == '1' ) |
| { |
| RetValue = 0; |
| break; |
| } |
| for ( k = 0; k < Length; k++ ) |
| if ( pName[k] == '(' || pName[k] == ')' || pName[k] == '!' || pName[k] == '*' || pName[k] == '+' ) |
| { |
| RetValue = 0; |
| break; |
| } |
| if ( k < Length ) |
| break; |
| } |
| if ( RetValue == 0 ) |
| { |
| printf( "The network cannot be written in the EQN format because object %d has name \"%s\".\n", i, pName ); |
| printf( "Consider renaming the objects using command \"short_names\" and trying again.\n" ); |
| } |
| return RetValue; |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |