30#define IVY_EVAL_LIMIT 128
64 int nEvals, nEvalsOld, i, k, x, nLeaves;
68 nLeaves = Vec_PtrSize(vLeaves);
70 if ( nLeaves > 32 || nLeaves + Vec_PtrSize(vCone) >
IVY_EVAL_LIMIT )
78 uMaskAll = ((1 << nLeaves) - 1);
82 pEval = pEvals + nEvals;
84 pEval->
Mask = (1 << nEvals);
87 Ivy_Regular(pObj)->TravId = nEvals;
95 if ( Ivy_ObjIsBuf(pObj) )
96 pEvals[pObj->
TravId].
Mask = pEvals[Ivy_ObjFanin0(pObj)->TravId].
Mask;
98 pEvals[pObj->
TravId].
Mask = pEvals[Ivy_ObjFanin0(pObj)->TravId].
Mask | pEvals[Ivy_ObjFanin1(pObj)->TravId].
Mask;
104 if ( i == Vec_PtrSize(vCone) - 1 )
107 if ( Ivy_ObjIsBuf(pObj) )
110 if ( Ivy_ObjRefs(pObj) == 0 )
112 assert( !Ivy_IsComplement(pObj) );
113 pEval = pEvals + nEvals;
116 pEval->
Weight = Extra_WordCountOnes(pEval->
Mask);
124 for ( i = 1; i < nEvals; i++ )
125 for ( k = 0; k < i; k++ )
131 if ( pTemp == NULL || pTemp->
fMarkB )
134 for ( x = 0; x < nLeaves; x++ )
135 if ( pTemp == Ivy_Regular((
Ivy_Obj_t *)vLeaves->pArray[x]) )
139 pEval = pEvals + nEvals;
150 if ( pEval->
Mask == uMaskAll )
156 if ( !Ivy_MultiCover(
p, pEvals, nLeaves, nEvals, nLimit, vSols ) )
158 assert( Vec_PtrSize( vSols ) > 0 );
177 for ( i = nLeaves; i < nEvals; i++ )
180 printf(
"%2d (id = %5d) : |", i-nLeaves, Ivy_ObjId(pEval->
pArg) );
181 for ( k = 0; k < nLeaves; k++ )
183 if ( pEval->
Mask & (1 << k) )
188 printf(
"| Lev = %d.\n", Ivy_ObjLevel(pEval->
pArg) );
203static inline int Ivy_MultiWeight(
unsigned uMask,
int nMaskOnes,
unsigned uFound )
205 assert( uMask & ~uFound );
206 if ( (uMask & uFound) == 0 )
208 return Extra_WordCountOnes( uMask & ~uFound );
227 unsigned uMaskAll, uFound, uTemp;
233 uMaskAll = (nLeaves == 32)? (~(
unsigned)0) : ((1 << nLeaves) - 1);
237 printf(
"Solution: " );
238 Vec_PtrClear( vSols );
239 for ( i = 0; i < nLimit; i++ )
242 for ( k = nEvals - 1; k >= 0; k-- )
245 if ( (pEval->
Mask & ~uFound) == 0 )
251 WeightBest = Ivy_MultiWeight( pEvalBest->
Mask, pEvalBest->
Weight, uFound );
252 LevelBest = Ivy_ObjLevel( Ivy_Regular(pEvalBest->
pArg) );
256 WeightCur = Ivy_MultiWeight( pEval->
Mask, pEval->
Weight, uFound );
257 LevelCur = Ivy_ObjLevel( Ivy_Regular(pEval->
pArg) );
258 if ( WeightBest < WeightCur ||
259 (WeightBest == WeightCur && LevelBest > LevelCur) )
263 WeightBest = WeightCur;
264 LevelBest = LevelCur;
269 if ( WeightBest == 1 && BestK >= nLeaves )
271 uTemp = (pEvalBest->
Mask & ~uFound);
272 for ( k = 0; k < nLeaves; k++ )
273 if ( uTemp & (1 << k) )
277 pEvalBest = pEvals + BestK;
281 if ( BestK < nLeaves )
282 printf(
"L(%d) ", BestK );
284 printf(
"%d ", BestK - nLeaves );
287 Vec_PtrPush( vSols, pEvalBest->
pArg );
288 uFound |= pEvalBest->
Mask;
289 if ( uFound == uMaskAll )
292 if ( uFound == uMaskAll )
295 printf(
" Found \n\n" );
301 printf(
" Not found \n\n" );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
struct Ivy_Eva_t_ Ivy_Eva_t
#define IVY_EVAL_LIMIT
DECLARATIONS ///.
int Ivy_MultiPlus(Ivy_Man_t *p, Vec_Ptr_t *vLeaves, Vec_Ptr_t *vCone, Ivy_Type_t Type, int nLimit, Vec_Ptr_t *vSols)
FUNCTION DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Ivy_Man_t_ Ivy_Man_t
INCLUDES ///.
Ivy_Obj_t * Ivy_TableLookup(Ivy_Man_t *p, Ivy_Obj_t *pObj)
FUNCTION DEFINITIONS ///.
struct Ivy_Obj_t_ Ivy_Obj_t
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.