| /**CFile**************************************************************** |
| |
| FileName [ioWriteBench.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [Command processing package.] |
| |
| Synopsis [Procedures to write the network in BENCH format.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - June 20, 2005.] |
| |
| Revision [$Id: ioWriteBench.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "ioAbc.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| static int Io_WriteBenchCheckNames( Abc_Ntk_t * pNtk ); |
| |
| static int Io_WriteBenchOne( FILE * pFile, Abc_Ntk_t * pNtk ); |
| static int Io_WriteBenchOneNode( FILE * pFile, Abc_Obj_t * pNode ); |
| |
| static int Io_WriteBenchLutOne( FILE * pFile, Abc_Ntk_t * pNtk ); |
| static int Io_WriteBenchLutOneNode( FILE * pFile, Abc_Obj_t * pNode, Vec_Int_t * vTruth ); |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [Writes the network in BENCH format.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Io_WriteBench( Abc_Ntk_t * pNtk, const char * pFileName ) |
| { |
| Abc_Ntk_t * pExdc; |
| FILE * pFile; |
| assert( Abc_NtkIsSopNetlist(pNtk) ); |
| if ( !Io_WriteBenchCheckNames(pNtk) ) |
| { |
| fprintf( stdout, "Io_WriteBench(): Signal names in this benchmark contain parentheses making them impossible to reproduce in the BENCH format. Use \"short_names\".\n" ); |
| return 0; |
| } |
| pFile = fopen( pFileName, "w" ); |
| if ( pFile == NULL ) |
| { |
| fprintf( stdout, "Io_WriteBench(): Cannot open the output file.\n" ); |
| return 0; |
| } |
| fprintf( pFile, "# Benchmark \"%s\" written by ABC on %s\n", pNtk->pName, Extra_TimeStamp() ); |
| // write the network |
| Io_WriteBenchOne( pFile, pNtk ); |
| // write EXDC network if it exists |
| pExdc = Abc_NtkExdc( pNtk ); |
| if ( pExdc ) |
| printf( "Io_WriteBench: EXDC is not written (warning).\n" ); |
| // finalize the file |
| fclose( pFile ); |
| return 1; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Writes the network in BENCH format.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Io_WriteBenchOne( FILE * pFile, Abc_Ntk_t * pNtk ) |
| { |
| ProgressBar * pProgress; |
| Abc_Obj_t * pNode; |
| int i; |
| |
| // write the PIs/POs/latches |
| Abc_NtkForEachPi( pNtk, pNode, i ) |
| fprintf( pFile, "INPUT(%s)\n", Abc_ObjName(Abc_ObjFanout0(pNode)) ); |
| Abc_NtkForEachPo( pNtk, pNode, i ) |
| fprintf( pFile, "OUTPUT(%s)\n", Abc_ObjName(Abc_ObjFanin0(pNode)) ); |
| Abc_NtkForEachLatch( pNtk, pNode, i ) |
| fprintf( pFile, "%-11s = DFF(%s)\n", |
| Abc_ObjName(Abc_ObjFanout0(Abc_ObjFanout0(pNode))), Abc_ObjName(Abc_ObjFanin0(Abc_ObjFanin0(pNode))) ); |
| |
| // write internal nodes |
| pProgress = Extra_ProgressBarStart( stdout, Abc_NtkObjNumMax(pNtk) ); |
| Abc_NtkForEachNode( pNtk, pNode, i ) |
| { |
| Extra_ProgressBarUpdate( pProgress, i, NULL ); |
| Io_WriteBenchOneNode( pFile, pNode ); |
| } |
| Extra_ProgressBarStop( pProgress ); |
| return 1; |
| } |
| |
| |
| /**Function************************************************************* |
| |
| Synopsis [Writes the network in BENCH format.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Io_WriteBenchOneNode( FILE * pFile, Abc_Obj_t * pNode ) |
| { |
| int nFanins; |
| |
| assert( Abc_ObjIsNode(pNode) ); |
| nFanins = Abc_ObjFaninNum(pNode); |
| if ( nFanins == 0 ) |
| { // write the constant 1 node |
| assert( Abc_NodeIsConst1(pNode) ); |
| fprintf( pFile, "%-11s", Abc_ObjName(Abc_ObjFanout0(pNode)) ); |
| fprintf( pFile, " = vdd\n" ); |
| } |
| else if ( nFanins == 1 ) |
| { // write the interver/buffer |
| if ( Abc_NodeIsBuf(pNode) ) |
| { |
| fprintf( pFile, "%-11s = BUFF(", Abc_ObjName(Abc_ObjFanout0(pNode)) ); |
| fprintf( pFile, "%s)\n", Abc_ObjName(Abc_ObjFanin0(pNode)) ); |
| } |
| else |
| { |
| fprintf( pFile, "%-11s = NOT(", Abc_ObjName(Abc_ObjFanout0(pNode)) ); |
| fprintf( pFile, "%s)\n", Abc_ObjName(Abc_ObjFanin0(pNode)) ); |
| } |
| } |
| else |
| { // write the AND gate |
| fprintf( pFile, "%-11s", Abc_ObjName(Abc_ObjFanout0(pNode)) ); |
| fprintf( pFile, " = AND(%s, ", Abc_ObjName(Abc_ObjFanin0(pNode)) ); |
| fprintf( pFile, "%s)\n", Abc_ObjName(Abc_ObjFanin1(pNode)) ); |
| } |
| return 1; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Writes the network in BENCH format with LUTs and DFFRSE.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Io_WriteBenchLut( Abc_Ntk_t * pNtk, char * pFileName ) |
| { |
| Abc_Ntk_t * pExdc; |
| FILE * pFile; |
| assert( Abc_NtkIsAigNetlist(pNtk) ); |
| if ( !Io_WriteBenchCheckNames(pNtk) ) |
| { |
| fprintf( stdout, "Io_WriteBenchLut(): Signal names in this benchmark contain parentheses making them impossible to reproduce in the BENCH format. Use \"short_names\".\n" ); |
| return 0; |
| } |
| pFile = fopen( pFileName, "w" ); |
| if ( pFile == NULL ) |
| { |
| fprintf( stdout, "Io_WriteBench(): Cannot open the output file.\n" ); |
| return 0; |
| } |
| fprintf( pFile, "# Benchmark \"%s\" written by ABC on %s\n", pNtk->pName, Extra_TimeStamp() ); |
| // write the network |
| Io_WriteBenchLutOne( pFile, pNtk ); |
| // write EXDC network if it exists |
| pExdc = Abc_NtkExdc( pNtk ); |
| if ( pExdc ) |
| printf( "Io_WriteBench: EXDC is not written (warning).\n" ); |
| // finalize the file |
| fclose( pFile ); |
| return 1; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Writes the network in BENCH format.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Io_WriteBenchLutOne( FILE * pFile, Abc_Ntk_t * pNtk ) |
| { |
| ProgressBar * pProgress; |
| Abc_Obj_t * pNode; |
| Vec_Int_t * vMemory; |
| int i; |
| |
| // write the PIs/POs/latches |
| Abc_NtkForEachPi( pNtk, pNode, i ) |
| fprintf( pFile, "INPUT(%s)\n", Abc_ObjName(Abc_ObjFanout0(pNode)) ); |
| Abc_NtkForEachPo( pNtk, pNode, i ) |
| fprintf( pFile, "OUTPUT(%s)\n", Abc_ObjName(Abc_ObjFanin0(pNode)) ); |
| Abc_NtkForEachLatch( pNtk, pNode, i ) |
| fprintf( pFile, "%-11s = DFFRSE( %s, gnd, gnd, gnd, gnd )\n", |
| Abc_ObjName(Abc_ObjFanout0(Abc_ObjFanout0(pNode))), Abc_ObjName(Abc_ObjFanin0(Abc_ObjFanin0(pNode))) ); |
| //Abc_NtkLevel(pNtk); |
| // write internal nodes |
| vMemory = Vec_IntAlloc( 10000 ); |
| pProgress = Extra_ProgressBarStart( stdout, Abc_NtkObjNumMax(pNtk) ); |
| Abc_NtkForEachNode( pNtk, pNode, i ) |
| { |
| Extra_ProgressBarUpdate( pProgress, i, NULL ); |
| Io_WriteBenchLutOneNode( pFile, pNode, vMemory ); |
| } |
| Extra_ProgressBarStop( pProgress ); |
| Vec_IntFree( vMemory ); |
| return 1; |
| } |
| |
| |
| /**Function************************************************************* |
| |
| Synopsis [Writes the network in BENCH format.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Io_WriteBenchLutOneNode( FILE * pFile, Abc_Obj_t * pNode, Vec_Int_t * vTruth ) |
| { |
| Abc_Obj_t * pFanin; |
| unsigned * pTruth; |
| int i, nFanins; |
| assert( Abc_ObjIsNode(pNode) ); |
| nFanins = Abc_ObjFaninNum(pNode); |
| assert( nFanins <= 8 ); |
| // compute the truth table |
| pTruth = Hop_ManConvertAigToTruth( (Hop_Man_t *)pNode->pNtk->pManFunc, Hop_Regular((Hop_Obj_t *)pNode->pData), nFanins, vTruth, 0 ); |
| if ( Hop_IsComplement((Hop_Obj_t *)pNode->pData) ) |
| Extra_TruthNot( pTruth, pTruth, nFanins ); |
| // consider simple cases |
| if ( Extra_TruthIsConst0(pTruth, nFanins) ) |
| { |
| fprintf( pFile, "%-11s = gnd\n", Abc_ObjName(Abc_ObjFanout0(pNode)) ); |
| return 1; |
| } |
| if ( Extra_TruthIsConst1(pTruth, nFanins) ) |
| { |
| fprintf( pFile, "%-11s = vdd\n", Abc_ObjName(Abc_ObjFanout0(pNode)) ); |
| return 1; |
| } |
| if ( nFanins == 1 ) |
| { |
| fprintf( pFile, "%-11s = LUT 0x%d ( %s )\n", |
| Abc_ObjName(Abc_ObjFanout0(pNode)), |
| Abc_NodeIsBuf(pNode)? 2 : 1, |
| Abc_ObjName(Abc_ObjFanin0(pNode)) ); |
| return 1; |
| } |
| // write it in the hexadecimal form |
| fprintf( pFile, "%-11s = LUT 0x", Abc_ObjName(Abc_ObjFanout0(pNode)) ); |
| Extra_PrintHexadecimal( pFile, pTruth, nFanins ); |
| /* |
| { |
| extern void Kit_DsdTest( unsigned * pTruth, int nVars ); |
| Abc_ObjForEachFanin( pNode, pFanin, i ) |
| printf( "%c%d ", 'a'+i, Abc_ObjFanin0(pFanin)->Level ); |
| printf( "\n" ); |
| Kit_DsdTest( pTruth, nFanins ); |
| } |
| if ( pNode->Id % 1000 == 0 ) |
| { |
| int x = 0; |
| } |
| */ |
| // write the fanins |
| fprintf( pFile, " (" ); |
| Abc_ObjForEachFanin( pNode, pFanin, i ) |
| fprintf( pFile, " %s%s", Abc_ObjName(pFanin), ((i==nFanins-1)? "" : ",") ); |
| fprintf( pFile, " )\n" ); |
| return 1; |
| } |
| |
| |
| /**Function************************************************************* |
| |
| Synopsis [Returns 1 if the names cannot be written into the bench file.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Io_WriteBenchCheckNames( Abc_Ntk_t * pNtk ) |
| { |
| Abc_Obj_t * pObj; |
| char * pName; |
| int i; |
| Abc_NtkForEachObj( pNtk, pObj, i ) |
| for ( pName = Nm_ManFindNameById(pNtk->pManName, i); pName && *pName; pName++ ) |
| if ( *pName == '(' || *pName == ')' ) |
| return 0; |
| return 1; |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |