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