00001 
00019 #include "fraigInt.h"
00020 
00021 #ifdef FRAIG_ENABLE_FANOUTS
00022 
00026 
00030 
00042 void Fraig_NodeAddFaninFanout( Fraig_Node_t * pFanin, Fraig_Node_t * pFanout )
00043 {
00044     Fraig_Node_t * pPivot;
00045 
00046     
00047     assert( !Fraig_IsComplement(pFanin) );
00048     assert( !Fraig_IsComplement(pFanout) );
00049     assert( Fraig_Regular(pFanout->p1) == pFanin || Fraig_Regular(pFanout->p2) == pFanin );
00050 
00051     pPivot = pFanin->pFanPivot;
00052     if ( pPivot == NULL )
00053     {
00054         pFanin->pFanPivot = pFanout;
00055         return;
00056     }
00057 
00058     if ( Fraig_Regular(pPivot->p1) == pFanin )
00059     {
00060         if ( Fraig_Regular(pFanout->p1) == pFanin )
00061         {
00062             pFanout->pFanFanin1 = pPivot->pFanFanin1;
00063             pPivot->pFanFanin1  = pFanout;
00064         }
00065         else 
00066         {
00067             pFanout->pFanFanin2 = pPivot->pFanFanin1;
00068             pPivot->pFanFanin1  = pFanout;
00069         }
00070     }
00071     else 
00072     {
00073         assert( Fraig_Regular(pPivot->p2) == pFanin );
00074         if ( Fraig_Regular(pFanout->p1) == pFanin )
00075         {
00076             pFanout->pFanFanin1 = pPivot->pFanFanin2;
00077             pPivot->pFanFanin2  = pFanout;
00078         }
00079         else 
00080         {
00081             pFanout->pFanFanin2 = pPivot->pFanFanin2;
00082             pPivot->pFanFanin2  = pFanout;
00083         }
00084     }
00085 }
00086 
00098 void Fraig_NodeRemoveFaninFanout( Fraig_Node_t * pFanin, Fraig_Node_t * pFanoutToRemove )
00099 {
00100     Fraig_Node_t * pFanout, * pFanout2, ** ppFanList;
00101     
00102     ppFanList = &pFanin->pFanPivot; 
00103     
00104     Fraig_NodeForEachFanoutSafe( pFanin, pFanout, pFanout2 )
00105     {
00106         
00107         if ( pFanout == pFanoutToRemove )
00108             continue;
00109         
00110         *ppFanList = pFanout;
00111         ppFanList = Fraig_NodeReadNextFanoutPlace( pFanin, pFanout );
00112     }
00113     *ppFanList = NULL;
00114 }
00115 
00127 void Fraig_NodeTransferFanout( Fraig_Node_t * pNodeFrom, Fraig_Node_t * pNodeTo )
00128 {
00129     Fraig_Node_t * pFanout;
00130     assert( pNodeTo->pFanPivot == NULL );
00131     assert( pNodeTo->pFanFanin1 == NULL );
00132     assert( pNodeTo->pFanFanin2 == NULL );
00133     
00134     Fraig_NodeForEachFanout( pNodeFrom, pFanout )
00135     {
00136         if ( Fraig_Regular(pFanout->p1) == pNodeFrom )
00137             pFanout->p1 = Fraig_NotCond( pNodeTo, Fraig_IsComplement(pFanout->p1) );
00138         else if ( Fraig_Regular(pFanout->p2) == pNodeFrom )
00139             pFanout->p2 = Fraig_NotCond( pNodeTo, Fraig_IsComplement(pFanout->p2) );            
00140     }
00141     
00142     pNodeTo->pFanPivot  = pNodeFrom->pFanPivot;  
00143     pNodeTo->pFanFanin1 = pNodeFrom->pFanFanin1; 
00144     pNodeTo->pFanFanin2 = pNodeFrom->pFanFanin2;
00145     pNodeFrom->pFanPivot  = NULL; 
00146     pNodeFrom->pFanFanin1 = NULL; 
00147     pNodeFrom->pFanFanin2 = NULL;  
00148 }
00149 
00161 int Fraig_NodeGetFanoutNum( Fraig_Node_t * pNode )
00162 {
00163     Fraig_Node_t * pFanout;
00164     int Counter = 0;
00165     Fraig_NodeForEachFanout( pNode, pFanout )
00166         Counter++;
00167     return Counter;
00168 }
00169 
00173 
00174 #endif
00175