/**CFile**************************************************************** FileName [abcDress.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Network and node package.] Synopsis [Transfers names from one netlist to the other.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: abcDress.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "base/abc/abc.h" #include "base/io/ioAbc.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// static stmm_table * Abc_NtkDressDeriveMapping( Abc_Ntk_t * pNtk ); static void Abc_NtkDressTransferNames( Abc_Ntk_t * pNtk, stmm_table * tMapping, int fVerbose ); extern Abc_Ntk_t * Abc_NtkIvyFraig( Abc_Ntk_t * pNtk, int nConfLimit, int fDoSparse, int fProve, int fTransfer, int fVerbose ); //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Transfers names from one netlist to the other.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Abc_NtkDress( Abc_Ntk_t * pNtkLogic, char * pFileName, int fVerbose ) { Abc_Ntk_t * pNtkOrig, * pNtkLogicOrig; Abc_Ntk_t * pMiter, * pMiterFraig; stmm_table * tMapping; assert( Abc_NtkIsLogic(pNtkLogic) ); // get the original netlist pNtkOrig = Io_ReadNetlist( pFileName, Io_ReadFileType(pFileName), 1 ); if ( pNtkOrig == NULL ) return; assert( Abc_NtkIsNetlist(pNtkOrig) ); Abc_NtkCleanCopy(pNtkLogic); Abc_NtkCleanCopy(pNtkOrig); // convert it into the logic network pNtkLogicOrig = Abc_NtkToLogic( pNtkOrig ); // check that the networks have the same PIs/POs/latches if ( !Abc_NtkCompareSignals( pNtkLogic, pNtkLogicOrig, 1, 1 ) ) { Abc_NtkDelete( pNtkOrig ); Abc_NtkDelete( pNtkLogicOrig ); return; } // convert the current logic network into an AIG pMiter = Abc_NtkStrash( pNtkLogic, 1, 0, 0 ); // convert it into the AIG and make the netlist point to the AIG Abc_NtkAppend( pMiter, pNtkLogicOrig, 1 ); Abc_NtkTransferCopy( pNtkOrig ); Abc_NtkDelete( pNtkLogicOrig ); if ( fVerbose ) { printf( "After mitering:\n" ); printf( "Logic: Nodes = %5d. Copy = %5d. \n", Abc_NtkNodeNum(pNtkLogic), Abc_NtkCountCopy(pNtkLogic) ); printf( "Orig: Nodes = %5d. Copy = %5d. \n", Abc_NtkNodeNum(pNtkOrig), Abc_NtkCountCopy(pNtkOrig) ); } // fraig the miter (miter nodes point to the fraiged miter) pMiterFraig = Abc_NtkIvyFraig( pMiter, 100, 1, 0, 1, 0 ); // make netlists point to the fraiged miter Abc_NtkTransferCopy( pNtkLogic ); Abc_NtkTransferCopy( pNtkOrig ); Abc_NtkDelete( pMiter ); if ( fVerbose ) { printf( "After fraiging:\n" ); printf( "Logic: Nodes = %5d. Copy = %5d. \n", Abc_NtkNodeNum(pNtkLogic), Abc_NtkCountCopy(pNtkLogic) ); printf( "Orig: Nodes = %5d. Copy = %5d. \n", Abc_NtkNodeNum(pNtkOrig), Abc_NtkCountCopy(pNtkOrig) ); } // derive mapping from the fraiged nodes into their prototype nodes in the original netlist tMapping = Abc_NtkDressDeriveMapping( pNtkOrig ); // transfer the names to the new netlist Abc_NtkDressTransferNames( pNtkLogic, tMapping, fVerbose ); // clean up stmm_free_table( tMapping ); Abc_NtkDelete( pMiterFraig ); Abc_NtkDelete( pNtkOrig ); } /**Function************************************************************* Synopsis [Returns the mapping from the fraig nodes point into the nodes of the netlist.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ stmm_table * Abc_NtkDressDeriveMapping( Abc_Ntk_t * pNtk ) { stmm_table * tResult; Abc_Obj_t * pNode, * pNodeMap, * pNodeFraig; int i; assert( Abc_NtkIsNetlist(pNtk) ); tResult = stmm_init_table(stmm_ptrcmp,stmm_ptrhash); Abc_NtkForEachNode( pNtk, pNode, i ) { // get the fraiged node pNodeFraig = Abc_ObjRegular(pNode->pCopy); // if this node is already mapped, skip if ( stmm_is_member( tResult, (char *)pNodeFraig ) ) continue; // get the mapping of this node pNodeMap = Abc_ObjNotCond( pNode, Abc_ObjIsComplement(pNode->pCopy) ); // add the mapping stmm_insert( tResult, (char *)pNodeFraig, (char *)pNodeMap ); } return tResult; } /**Function************************************************************* Synopsis [Attaches the names of to the new netlist.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Abc_NtkDressTransferNames( Abc_Ntk_t * pNtk, stmm_table * tMapping, int fVerbose ) { Abc_Obj_t * pNet, * pNode, * pNodeMap, * pNodeFraig; char * pName; int i, Counter = 0, CounterInv = 0, CounterInit = stmm_count(tMapping); assert( Abc_NtkIsLogic(pNtk) ); Abc_NtkForEachNode( pNtk, pNode, i ) { // if the node already has a name, quit pName = Nm_ManFindNameById( pNtk->pManName, pNode->Id ); if ( pName != NULL ) continue; // get the fraiged node pNodeFraig = Abc_ObjRegular(pNode->pCopy); // find the matching node of the original netlist if ( !stmm_lookup( tMapping, (char *)pNodeFraig, (char **)&pNodeMap ) ) continue; // find the true match pNodeMap = Abc_ObjNotCond( pNodeMap, Abc_ObjIsComplement(pNode->pCopy) ); // get the name pNet = Abc_ObjFanout0(Abc_ObjRegular(pNodeMap)); pName = Nm_ManFindNameById( pNet->pNtk->pManName, pNet->Id ); assert( pName != NULL ); // set the name if ( Abc_ObjIsComplement(pNodeMap) ) { Abc_ObjAssignName( pNode, pName, "_inv" ); CounterInv++; } else { Abc_ObjAssignName( pNode, pName, NULL ); Counter++; } // remove the name stmm_delete( tMapping, (char **)&pNodeFraig, (char **)&pNodeMap ); } if ( fVerbose ) { printf( "Total number of names collected = %5d.\n", CounterInit ); printf( "Total number of names assigned = %5d. (Dir = %5d. Compl = %5d.)\n", Counter + CounterInv, Counter, CounterInv ); } } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END