103 int fVeryVerbose = 0;
105 int RetValue, RetValue2 = -1, iVar, i;
115 RetValue =
sat_solver_solve(
p->pSat, pCands, pCands + nCands, (ABC_INT64_T)
p->pPars->nBTLimit, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
118 if ( RetValue !=
l_Undef && RetValue2 != -1 )
142 pData = (
unsigned *)Vec_PtrEntry(
p->vDivCexes, i );
143 if ( !sat_solver_var_value(
p->pSat, iVar ) )
145 assert( Abc_InfoHasBit(pData,
p->nCexes) );
146 Abc_InfoXorBit( pData,
p->nCexes );
167 int fVeryVerbose = 0;
170 int RetValue, iVar, i, nCands,
nWords, w;
178 Vec_PtrFillSimInfo(
p->vDivCexes, 0,
p->nDivWords );
180 if (
p->pPars->fVeryVerbose )
183 printf(
"%5d : Lev =%3d. Leaf =%3d. Node =%3d. Divs =%3d. Fanin = %4d (%d/%d), MFFC = %d\n",
184 pNode->
Id, pNode->
Level, Vec_PtrSize(
p->vSupp), Vec_PtrSize(
p->vNodes), Vec_PtrSize(
p->vDivs)-Abc_ObjFaninNum(pNode),
185 Abc_ObjFaninId(pNode, iFanin), iFanin, Abc_ObjFaninNum(pNode),
186 Abc_ObjFanoutNum(Abc_ObjFanin(pNode, iFanin)) == 1 ?
Abc_NodeMffcLabel(Abc_ObjFanin(pNode, iFanin), NULL) : 0 );
191 Vec_PtrClear(
p->vMfsFanins );
196 Vec_PtrPush(
p->vMfsFanins, pFanin );
197 iVar = Vec_PtrSize(
p->vDivs) - Abc_ObjFaninNum(pNode) + i;
198 pCands[nCands++] = toLitCond( Vec_IntEntry(
p->vProjVarsSat, iVar ), 1 );
201 if ( RetValue == -1 )
205 if (
p->pPars->fVeryVerbose )
206 printf(
"Node %d: Fanin %d can be removed.\n", pNode->
Id, iFanin );
208 p->nNodesGainedLevel++;
218p->timeInt += Abc_Clock() - clk;
223 if ( fOnlyRemove ||
p->pPars->fRrOnly )
229 for ( i = 0; i < 9; i++ )
231 for ( i = 0; i < Vec_PtrSize(
p->vDivs)-Abc_ObjFaninNum(pNode); i++ )
232 printf(
"%d", i % 10 );
233 for ( i = 0; i < Abc_ObjFaninNum(pNode); i++ )
237 printf(
"%c",
'a' + i );
245 printf(
"%3d: %3d ",
p->nCexes, iVar );
246 for ( i = 0; i < Vec_PtrSize(
p->vDivs); i++ )
248 pData = (
unsigned *)Vec_PtrEntry(
p->vDivCexes, i );
249 printf(
"%d", Abc_InfoHasBit(pData,
p->nCexes-1) );
255 nWords = Abc_BitWordNum(
p->nCexes);
257 for ( iVar = 0; iVar < Vec_PtrSize(
p->vDivs)-Abc_ObjFaninNum(pNode); iVar++ )
259 if (
p->pPars->fPower )
263 if ( Abc_MfsObjProb(
p, pDiv) >= 0.15 )
266 pData = (
unsigned *)Vec_PtrEntry(
p->vDivCexes, iVar );
267 for ( w = 0; w <
nWords; w++ )
268 if ( pData[w] != ~0 )
273 if ( iVar == Vec_PtrSize(
p->vDivs)-Abc_ObjFaninNum(pNode) )
276 pCands[nCands] = toLitCond( Vec_IntEntry(
p->vProjVarsSat, iVar), 1 );
278 if ( RetValue == -1 )
282 if (
p->pPars->fVeryVerbose )
283 printf(
"Node %d: Fanin %d can be replaced by divisor %d.\n", pNode->
Id, iFanin, iVar );
285 p->nNodesGainedLevel++;
294 Vec_PtrPush(
p->vMfsFanins, Vec_PtrEntry(
p->vDivs, iVar) );
296p->timeInt += Abc_Clock() - clk;
300 if (
p->nCexes >=
p->pPars->nWinMax )
303 if (
p->pPars->fVeryVerbose )
304 printf(
"Node %d: Cannot find replacement for fanin %d.\n", pNode->
Id, iFanin );
321 int fVeryVerbose =
p->pPars->fVeryVerbose && Vec_PtrSize(
p->vDivs) < 80;
322 unsigned * pData, * pData2;
324 int RetValue, iVar, iVar2, i, w, nCands,
nWords, fBreak;
329 assert( iFanin2 >= 0 || iFanin2 == -1 );
332 Vec_PtrFillSimInfo(
p->vDivCexes, 0,
p->nDivWords );
337 printf(
"Node %5d : Level = %2d. Divs = %3d. Fanins = %d/%d (out of %d). MFFC = %d\n",
338 pNode->
Id, pNode->
Level, Vec_PtrSize(
p->vDivs)-Abc_ObjFaninNum(pNode),
339 iFanin, iFanin2, Abc_ObjFaninNum(pNode),
340 Abc_ObjFanoutNum(Abc_ObjFanin(pNode, iFanin)) == 1 ?
Abc_NodeMffcLabel(Abc_ObjFanin(pNode, iFanin), NULL) : 0 );
345 Vec_PtrClear(
p->vMfsFanins );
348 if ( i == iFanin || i == iFanin2 )
350 Vec_PtrPush(
p->vMfsFanins, pFanin );
351 iVar = Vec_PtrSize(
p->vDivs) - Abc_ObjFaninNum(pNode) + i;
352 pCands[nCands++] = toLitCond( Vec_IntEntry(
p->vProjVarsSat, iVar ), 1 );
355 if ( RetValue == -1 )
360 printf(
"Node %d: Fanins %d/%d can be removed.\n", pNode->
Id, iFanin, iFanin2 );
362 p->nNodesGainedLevel++;
370p->timeInt += Abc_Clock() - clk;
376 for ( i = 0; i < 11; i++ )
378 for ( i = 0; i < Vec_PtrSize(
p->vDivs)-Abc_ObjFaninNum(pNode); i++ )
379 printf(
"%d", i % 10 );
380 for ( i = 0; i < Abc_ObjFaninNum(pNode); i++ )
381 if ( i == iFanin || i == iFanin2 )
384 printf(
"%c",
'a' + i );
394 printf(
"%3d: %2d %2d ",
p->nCexes, iVar, iVar2 );
395 for ( i = 0; i < Vec_PtrSize(
p->vDivs); i++ )
397 pData = (
unsigned *)Vec_PtrEntry(
p->vDivCexes, i );
398 printf(
"%d", Abc_InfoHasBit(pData,
p->nCexes-1) );
404 nWords = Abc_BitWordNum(
p->nCexes);
407 for ( iVar = 1; iVar < Vec_PtrSize(
p->vDivs)-Abc_ObjFaninNum(pNode); iVar++ )
409 pData = (
unsigned *)Vec_PtrEntry(
p->vDivCexes, iVar );
411 if (
p->pPars->fPower )
415 if ( Abc_MfsObjProb(
p, pDiv) >= 0.12 )
419 for ( iVar2 = 0; iVar2 < iVar; iVar2++ )
421 pData2 = (
unsigned *)Vec_PtrEntry(
p->vDivCexes, iVar2 );
423 if (
p->pPars->fPower )
427 if ( Abc_MfsObjProb(
p, pDiv) >= 0.12 )
431 for ( w = 0; w <
nWords; w++ )
432 if ( (pData[w] | pData2[w]) != ~0 )
443 if ( iVar == Vec_PtrSize(
p->vDivs)-Abc_ObjFaninNum(pNode) )
446 pCands[nCands] = toLitCond( Vec_IntEntry(
p->vProjVarsSat, iVar2), 1 );
447 pCands[nCands+1] = toLitCond( Vec_IntEntry(
p->vProjVarsSat, iVar), 1 );
449 if ( RetValue == -1 )
454 printf(
"Node %d: Fanins %d/%d can be replaced by divisors %d/%d.\n", pNode->
Id, iFanin, iFanin2, iVar, iVar2 );
456 p->nNodesGainedLevel++;
463 Vec_PtrPush(
p->vMfsFanins, Vec_PtrEntry(
p->vDivs, iVar2) );
464 Vec_PtrPush(
p->vMfsFanins, Vec_PtrEntry(
p->vDivs, iVar) );
465 assert( Vec_PtrSize(
p->vMfsFanins) == nCands + 2 );
467p->timeInt += Abc_Clock() - clk;
470 if (
p->nCexes >=
p->pPars->nWinMax )