/**CFile**************************************************************** FileName [mapperFanout.c] PackageName [FRAIG: Functionally reduced AND-INV graphs.] Synopsis [Procedures to manipulate fanouts of the FRAIG nodes.] Author [Alan Mishchenko ] Affiliation [UC Berkeley] Date [Ver. 2.0. Started - June 1, 2004.] Revision [$Id: mapperFanout.c,v 1.5 2005/01/23 06:59:43 alanmi Exp $] ***********************************************************************/ #include "mapperInt.h" ABC_NAMESPACE_IMPL_START #ifdef MAP_ALLOCATE_FANOUT //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Add the fanout to the node.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Map_NodeAddFaninFanout( Map_Node_t * pFanin, Map_Node_t * pFanout ) { Map_Node_t * pPivot; // pFanins is a fanin of pFanout assert( !Map_IsComplement(pFanin) ); assert( !Map_IsComplement(pFanout) ); assert( Map_Regular(pFanout->p1) == pFanin || Map_Regular(pFanout->p2) == pFanin ); pPivot = pFanin->pFanPivot; if ( pPivot == NULL ) { pFanin->pFanPivot = pFanout; return; } if ( Map_Regular(pPivot->p1) == pFanin ) { if ( Map_Regular(pFanout->p1) == pFanin ) { pFanout->pFanFanin1 = pPivot->pFanFanin1; pPivot->pFanFanin1 = pFanout; } else // if ( Map_Regular(pFanout->p2) == pFanin ) { pFanout->pFanFanin2 = pPivot->pFanFanin1; pPivot->pFanFanin1 = pFanout; } } else // if ( Map_Regular(pPivot->p2) == pFanin ) { assert( Map_Regular(pPivot->p2) == pFanin ); if ( Map_Regular(pFanout->p1) == pFanin ) { pFanout->pFanFanin1 = pPivot->pFanFanin2; pPivot->pFanFanin2 = pFanout; } else // if ( Map_Regular(pFanout->p2) == pFanin ) { pFanout->pFanFanin2 = pPivot->pFanFanin2; pPivot->pFanFanin2 = pFanout; } } } /**Function************************************************************* Synopsis [Add the fanout to the node.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Map_NodeRemoveFaninFanout( Map_Node_t * pFanin, Map_Node_t * pFanoutToRemove ) { Map_Node_t * pFanout, * pFanout2, ** ppFanList; // start the linked list of fanouts ppFanList = &pFanin->pFanPivot; // go through the fanouts Map_NodeForEachFanoutSafe( pFanin, pFanout, pFanout2 ) { // skip the fanout-to-remove if ( pFanout == pFanoutToRemove ) continue; // add useful fanouts to the list *ppFanList = pFanout; ppFanList = Map_NodeReadNextFanoutPlace( pFanin, pFanout ); } *ppFanList = NULL; } /**Function************************************************************* Synopsis [Returns the number of fanouts of a node.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Map_NodeGetFanoutNum( Map_Node_t * pNode ) { Map_Node_t * pFanout; int Counter = 0; Map_NodeForEachFanout( pNode, pFanout ) Counter++; return Counter; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// #endif ABC_NAMESPACE_IMPL_END