blob: 0e6c86f835383fa2c84f56df0597b47abf17476f [file] [log] [blame]
/**CFile****************************************************************
FileName [fraigFanout.c]
PackageName [FRAIG: Functionally reduced AND-INV graphs.]
Synopsis [Procedures to manipulate fanouts of the FRAIG nodes.]
Author [Alan Mishchenko <alanmi@eecs.berkeley.edu>]
Affiliation [UC Berkeley]
Date [Ver. 2.0. Started - October 1, 2004]
Revision [$Id: fraigFanout.c,v 1.5 2005/07/08 01:01:31 alanmi Exp $]
***********************************************************************/
#include "fraigInt.h"
ABC_NAMESPACE_IMPL_START
#ifdef FRAIG_ENABLE_FANOUTS
////////////////////////////////////////////////////////////////////////
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis [Add the fanout to the node.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Fraig_NodeAddFaninFanout( Fraig_Node_t * pFanin, Fraig_Node_t * pFanout )
{
Fraig_Node_t * pPivot;
// pFanins is a fanin of pFanout
assert( !Fraig_IsComplement(pFanin) );
assert( !Fraig_IsComplement(pFanout) );
assert( Fraig_Regular(pFanout->p1) == pFanin || Fraig_Regular(pFanout->p2) == pFanin );
pPivot = pFanin->pFanPivot;
if ( pPivot == NULL )
{
pFanin->pFanPivot = pFanout;
return;
}
if ( Fraig_Regular(pPivot->p1) == pFanin )
{
if ( Fraig_Regular(pFanout->p1) == pFanin )
{
pFanout->pFanFanin1 = pPivot->pFanFanin1;
pPivot->pFanFanin1 = pFanout;
}
else // if ( Fraig_Regular(pFanout->p2) == pFanin )
{
pFanout->pFanFanin2 = pPivot->pFanFanin1;
pPivot->pFanFanin1 = pFanout;
}
}
else // if ( Fraig_Regular(pPivot->p2) == pFanin )
{
assert( Fraig_Regular(pPivot->p2) == pFanin );
if ( Fraig_Regular(pFanout->p1) == pFanin )
{
pFanout->pFanFanin1 = pPivot->pFanFanin2;
pPivot->pFanFanin2 = pFanout;
}
else // if ( Fraig_Regular(pFanout->p2) == pFanin )
{
pFanout->pFanFanin2 = pPivot->pFanFanin2;
pPivot->pFanFanin2 = pFanout;
}
}
}
/**Function*************************************************************
Synopsis [Add the fanout to the node.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Fraig_NodeRemoveFaninFanout( Fraig_Node_t * pFanin, Fraig_Node_t * pFanoutToRemove )
{
Fraig_Node_t * pFanout, * pFanout2, ** ppFanList;
// start the linked list of fanouts
ppFanList = &pFanin->pFanPivot;
// go through the fanouts
Fraig_NodeForEachFanoutSafe( pFanin, pFanout, pFanout2 )
{
// skip the fanout-to-remove
if ( pFanout == pFanoutToRemove )
continue;
// add useful fanouts to the list
*ppFanList = pFanout;
ppFanList = Fraig_NodeReadNextFanoutPlace( pFanin, pFanout );
}
*ppFanList = NULL;
}
/**Function*************************************************************
Synopsis [Transfers fanout to a different node.]
Description [Assumes that the other node currently has no fanouts.]
SideEffects []
SeeAlso []
***********************************************************************/
void Fraig_NodeTransferFanout( Fraig_Node_t * pNodeFrom, Fraig_Node_t * pNodeTo )
{
Fraig_Node_t * pFanout;
assert( pNodeTo->pFanPivot == NULL );
assert( pNodeTo->pFanFanin1 == NULL );
assert( pNodeTo->pFanFanin2 == NULL );
// go through the fanouts and update their fanins
Fraig_NodeForEachFanout( pNodeFrom, pFanout )
{
if ( Fraig_Regular(pFanout->p1) == pNodeFrom )
pFanout->p1 = Fraig_NotCond( pNodeTo, Fraig_IsComplement(pFanout->p1) );
else if ( Fraig_Regular(pFanout->p2) == pNodeFrom )
pFanout->p2 = Fraig_NotCond( pNodeTo, Fraig_IsComplement(pFanout->p2) );
}
// move the pointers
pNodeTo->pFanPivot = pNodeFrom->pFanPivot;
pNodeTo->pFanFanin1 = pNodeFrom->pFanFanin1;
pNodeTo->pFanFanin2 = pNodeFrom->pFanFanin2;
pNodeFrom->pFanPivot = NULL;
pNodeFrom->pFanFanin1 = NULL;
pNodeFrom->pFanFanin2 = NULL;
}
/**Function*************************************************************
Synopsis [Returns the number of fanouts of a node.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int Fraig_NodeGetFanoutNum( Fraig_Node_t * pNode )
{
Fraig_Node_t * pFanout;
int Counter = 0;
Fraig_NodeForEachFanout( pNode, pFanout )
Counter++;
return Counter;
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
#endif
ABC_NAMESPACE_IMPL_END