00001
00019 #include "mapperInt.h"
00020
00021 #ifdef MAP_ALLOCATE_FANOUT
00022
00026
00030
00042 void Map_NodeAddFaninFanout( Map_Node_t * pFanin, Map_Node_t * pFanout )
00043 {
00044 Map_Node_t * pPivot;
00045
00046
00047 assert( !Map_IsComplement(pFanin) );
00048 assert( !Map_IsComplement(pFanout) );
00049 assert( Map_Regular(pFanout->p1) == pFanin || Map_Regular(pFanout->p2) == pFanin );
00050
00051 pPivot = pFanin->pFanPivot;
00052 if ( pPivot == NULL )
00053 {
00054 pFanin->pFanPivot = pFanout;
00055 return;
00056 }
00057
00058 if ( Map_Regular(pPivot->p1) == pFanin )
00059 {
00060 if ( Map_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( Map_Regular(pPivot->p2) == pFanin );
00074 if ( Map_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 Map_NodeRemoveFaninFanout( Map_Node_t * pFanin, Map_Node_t * pFanoutToRemove )
00099 {
00100 Map_Node_t * pFanout, * pFanout2, ** ppFanList;
00101
00102 ppFanList = &pFanin->pFanPivot;
00103
00104 Map_NodeForEachFanoutSafe( pFanin, pFanout, pFanout2 )
00105 {
00106
00107 if ( pFanout == pFanoutToRemove )
00108 continue;
00109
00110 *ppFanList = pFanout;
00111 ppFanList = Map_NodeReadNextFanoutPlace( pFanin, pFanout );
00112 }
00113 *ppFanList = NULL;
00114 }
00115
00127 int Map_NodeGetFanoutNum( Map_Node_t * pNode )
00128 {
00129 Map_Node_t * pFanout;
00130 int Counter = 0;
00131 Map_NodeForEachFanout( pNode, pFanout )
00132 Counter++;
00133 return Counter;
00134 }
00135
00139
00140 #endif
00141