00001
00021 #include "lpkInt.h"
00022
00026
00030
00042 If_Obj_t * Lpk_MapPrimeInternal( If_Man_t * pIfMan, Kit_Graph_t * pGraph )
00043 {
00044 Kit_Node_t * pNode;
00045 If_Obj_t * pAnd0, * pAnd1;
00046 int i;
00047
00048 if ( Kit_GraphIsConst(pGraph) )
00049 return If_ManConst1(pIfMan);
00050
00051 if ( Kit_GraphIsVar(pGraph) )
00052 return Kit_GraphVar(pGraph)->pFunc;
00053
00054 Kit_GraphForEachNode( pGraph, pNode, i )
00055 {
00056 pAnd0 = Kit_GraphNode(pGraph, pNode->eEdge0.Node)->pFunc;
00057 pAnd1 = Kit_GraphNode(pGraph, pNode->eEdge1.Node)->pFunc;
00058 pNode->pFunc = If_ManCreateAnd( pIfMan,
00059 If_NotCond( If_Regular(pAnd0), If_IsComplement(pAnd0) ^ pNode->eEdge0.fCompl ),
00060 If_NotCond( If_Regular(pAnd1), If_IsComplement(pAnd1) ^ pNode->eEdge1.fCompl ) );
00061 }
00062 return pNode->pFunc;
00063 }
00064
00076 If_Obj_t * Lpk_MapPrime( Lpk_Man_t * p, unsigned * pTruth, int nVars, If_Obj_t ** ppLeaves )
00077 {
00078 Kit_Graph_t * pGraph;
00079 Kit_Node_t * pNode;
00080 If_Obj_t * pRes;
00081 int i;
00082
00083 pGraph = Kit_TruthToGraph( pTruth, nVars, p->vCover );
00084 if ( pGraph == NULL )
00085 return NULL;
00086
00087 Kit_GraphForEachLeaf( pGraph, pNode, i )
00088 pNode->pFunc = ppLeaves[i];
00089
00090 pRes = Lpk_MapPrimeInternal( p->pIfMan, pGraph );
00091 pRes = If_NotCond( pRes, Kit_GraphIsComplement(pGraph) );
00092 Kit_GraphFree( pGraph );
00093 return pRes;
00094 }
00095
00107 If_Obj_t * Lpk_MapTree_rec( Lpk_Man_t * p, Kit_DsdNtk_t * pNtk, If_Obj_t ** ppLeaves, int iLit, If_Obj_t * pResult )
00108 {
00109 Kit_DsdObj_t * pObj;
00110 If_Obj_t * pObjNew = NULL, * pObjNew2 = NULL, * pFansNew[16];
00111 unsigned i, iLitFanin;
00112
00113 assert( iLit >= 0 );
00114
00115
00116 pObj = Kit_DsdNtkObj( pNtk, Kit_DsdLit2Var(iLit) );
00117 if ( pObj == NULL )
00118 {
00119 pObjNew = ppLeaves[Kit_DsdLit2Var(iLit)];
00120 return If_NotCond( pObjNew, Kit_DsdLitIsCompl(iLit) );
00121 }
00122 if ( pObj->Type == KIT_DSD_CONST1 )
00123 {
00124 return If_NotCond( If_ManConst1(p->pIfMan), Kit_DsdLitIsCompl(iLit) );
00125 }
00126 if ( pObj->Type == KIT_DSD_VAR )
00127 {
00128 pObjNew = ppLeaves[Kit_DsdLit2Var(pObj->pFans[0])];
00129 return If_NotCond( pObjNew, Kit_DsdLitIsCompl(iLit) ^ Kit_DsdLitIsCompl(pObj->pFans[0]) );
00130 }
00131 if ( pObj->Type == KIT_DSD_AND )
00132 {
00133 assert( pObj->nFans == 2 );
00134 pFansNew[0] = Lpk_MapTree_rec( p, pNtk, ppLeaves, pObj->pFans[0], NULL );
00135 pFansNew[1] = pResult? pResult : Lpk_MapTree_rec( p, pNtk, ppLeaves, pObj->pFans[1], NULL );
00136 if ( pFansNew[0] == NULL || pFansNew[1] == NULL )
00137 return NULL;
00138 pObjNew = If_ManCreateAnd( p->pIfMan, pFansNew[0], pFansNew[1] );
00139 return If_NotCond( pObjNew, Kit_DsdLitIsCompl(iLit) );
00140 }
00141 if ( pObj->Type == KIT_DSD_XOR )
00142 {
00143 int fCompl = Kit_DsdLitIsCompl(iLit);
00144 assert( pObj->nFans == 2 );
00145 pFansNew[0] = Lpk_MapTree_rec( p, pNtk, ppLeaves, pObj->pFans[0], NULL );
00146 pFansNew[1] = pResult? pResult : Lpk_MapTree_rec( p, pNtk, ppLeaves, pObj->pFans[1], NULL );
00147 if ( pFansNew[0] == NULL || pFansNew[1] == NULL )
00148 return NULL;
00149 fCompl ^= If_IsComplement(pFansNew[0]) ^ If_IsComplement(pFansNew[1]);
00150 pObjNew = If_ManCreateXor( p->pIfMan, If_Regular(pFansNew[0]), If_Regular(pFansNew[1]) );
00151 return If_NotCond( pObjNew, fCompl );
00152 }
00153 assert( pObj->Type == KIT_DSD_PRIME );
00154 p->nBlocks[pObj->nFans]++;
00155
00156
00157 Kit_DsdObjForEachFanin( pNtk, pObj, iLitFanin, i )
00158 {
00159 if ( i == 0 )
00160 pFansNew[i] = pResult? pResult : Lpk_MapTree_rec( p, pNtk, ppLeaves, iLitFanin, NULL );
00161 else
00162 pFansNew[i] = Lpk_MapTree_rec( p, pNtk, ppLeaves, iLitFanin, NULL );
00163 if ( pFansNew[i] == NULL )
00164 return NULL;
00165 }
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 if ( p->pPars->nVarsShared > 0 && (int)pObj->nFans > p->pPars->nLutSize )
00184 {
00185 pObjNew2 = Lpk_MapSuppRedDec_rec( p, Kit_DsdObjTruth(pObj), pObj->nFans, pFansNew );
00186 if ( pObjNew2 )
00187 return If_NotCond( pObjNew2, Kit_DsdLitIsCompl(iLit) );
00188 }
00189
00190 pObjNew = Lpk_MapPrime( p, Kit_DsdObjTruth(pObj), pObj->nFans, pFansNew );
00191
00192
00193 if ( pObjNew && pObjNew2 )
00194 {
00195 If_ObjSetChoice( If_Regular(pObjNew), If_Regular(pObjNew2) );
00196 If_ManCreateChoice( p->pIfMan, If_Regular(pObjNew) );
00197 }
00198 return If_NotCond( pObjNew, Kit_DsdLitIsCompl(iLit) );
00199 }
00200
00204
00205