117 p->vCuts = Vec_VecStart( pPars->
nCutsMax );
118 p->vTruthElem = Vec_PtrAllocTruthTables( pPars->
nLeafMax );
119 p->vTruthStore = Vec_PtrAllocSimInfo( 1024, Kit_TruthWordNum(pPars->
nLeafMax) );
120 p->vMemory = Vec_IntAlloc( 1 << 16 );
121 p->vCutNodes = Vec_PtrAlloc( 256 );
122 p->vLeavesBest = Vec_PtrAlloc( pPars->
nLeafMax );
126 p->DecPars.fVeryVerbose = 0;
144 int Gain =
p->nNodesInit - Aig_ManNodeNum(
p->pAig);
145 printf(
"NodesBeg = %8d. NodesEnd = %8d. Gain = %6d. (%6.2f %%).\n",
146 p->nNodesInit, Aig_ManNodeNum(
p->pAig), Gain, 100.0*Gain/
p->nNodesInit );
147 printf(
"Tried = %6d. Below = %5d. Extended = %5d. Used = %5d. Levels = %4d.\n",
148 p->nNodesTried,
p->nNodesBelow,
p->nNodesExten,
p->nCutsUsed,
Aig_ManLevels(
p->pAig) );
170 if (
p->pPars->fVerbose )
172 Vec_VecFree(
p->vCuts );
173 Vec_PtrFree(
p->vTruthElem );
174 Vec_PtrFree(
p->vTruthStore );
175 Vec_PtrFree(
p->vLeavesBest );
176 Vec_IntFree(
p->vMemory );
177 Vec_PtrFree(
p->vCutNodes );
209 printf(
"%d", pObj? Aig_Regular(pObj)->Id : -1 );
211 printf(
"(%d) ", Aig_IsComplement(pObj) );
232 int i, Counter, LevelNew, LevelOld;
234 if ( Kit_GraphIsConst(pGraph) || Kit_GraphIsVar(pGraph) )
239 pNode->
pFunc = Vec_PtrEntry(vCut, i);
249 pNode0 = Kit_GraphNode( pGraph, pNode->
eEdge0.
Node );
250 pNode1 = Kit_GraphNode( pGraph, pNode->
eEdge1.
Node );
254 if ( pAnd0 && pAnd1 )
261 if ( Aig_Regular(pAnd) == pRoot )
267 if ( pAnd == NULL || Aig_ObjIsTravIdCurrent(pAig, Aig_Regular(pAnd)) )
269 if ( ++Counter > NodeMax )
273 LevelNew = 1 + Abc_MaxInt( pNode0->
Level, pNode1->
Level );
276 if ( Aig_Regular(pAnd) == Aig_ManConst1(pAig) )
278 else if ( Aig_Regular(pAnd) == Aig_Regular(pAnd0) )
279 LevelNew = (int)Aig_Regular(pAnd0)->Level;
280 else if ( Aig_Regular(pAnd) == Aig_Regular(pAnd1) )
281 LevelNew = (int)Aig_Regular(pAnd1)->Level;
282 LevelOld = (int)Aig_Regular(pAnd)->Level;
285 if ( LevelNew > LevelMax )
288 pNode->
Level = LevelNew;
319 if ( Kit_GraphIsConst(pGraph) )
320 return Aig_NotCond( Aig_ManConst1(pAig), Kit_GraphIsComplement(pGraph) );
323 pNode->
pFunc = Vec_PtrEntry(vCut, i);
325 if ( Kit_GraphIsVar(pGraph) )
326 return Aig_NotCond( (
Aig_Obj_t *)Kit_GraphVar(pGraph)->pFunc, Kit_GraphIsComplement(pGraph) );
345 return Aig_NotCond( (
Aig_Obj_t *)pNode->
pFunc, Kit_GraphIsComplement(pGraph) );
363 int k, RetValue, GainCur, nNodesAdded;
367 p->pGraphBest = NULL;
370 if ( Vec_PtrSize(vCut) == 0 )
380 if ( Kit_TruthIsConst0(pTruth, Vec_PtrSize(vCut)) )
384 Vec_PtrCopy(
p->vLeavesBest, vCut );
387 if ( Kit_TruthIsConst1(pTruth, Vec_PtrSize(vCut)) )
391 Vec_PtrCopy(
p->vLeavesBest, vCut );
396 RetValue =
Kit_TruthIsop( pTruth, Vec_PtrSize(vCut),
p->vMemory, 0 );
399 pGraphCur =
Kit_SopFactor(
p->vMemory, 0, Vec_PtrSize(vCut),
p->vMemory );
407 nNodesAdded =
Dar_RefactTryGraph(
p->pAig, pObj, vCut, pGraphCur, nNodesSaved - !
p->pPars->fUseZeros, Required );
408 if ( nNodesAdded > -1 )
410 GainCur = nNodesSaved - nNodesAdded;
411 if (
p->GainBest < GainCur || (
p->GainBest == GainCur &&
412 (Kit_GraphIsConst(pGraphCur) || Kit_GraphRootLevel(pGraphCur) < Kit_GraphRootLevel(
p->pGraphBest))) )
414 p->GainBest = GainCur;
417 p->pGraphBest = pGraphCur;
418 Vec_PtrCopy(
p->vLeavesBest, vCut );
427 Kit_TruthNot( pTruth, pTruth, Vec_PtrSize(vCut) );
428 RetValue =
Kit_TruthIsop( pTruth, Vec_PtrSize(vCut),
p->vMemory, 0 );
432 pGraphCur =
Kit_SopFactor(
p->vMemory, 1, Vec_PtrSize(vCut),
p->vMemory );
440 nNodesAdded =
Dar_RefactTryGraph(
p->pAig, pObj, vCut, pGraphCur, nNodesSaved - !
p->pPars->fUseZeros, Required );
441 if ( nNodesAdded > -1 )
443 GainCur = nNodesSaved - nNodesAdded;
444 if (
p->GainBest < GainCur || (
p->GainBest == GainCur &&
445 (Kit_GraphIsConst(pGraphCur) || Kit_GraphRootLevel(pGraphCur) < Kit_GraphRootLevel(
p->pGraphBest))) )
447 p->GainBest = GainCur;
450 p->pGraphBest = pGraphCur;
451 Vec_PtrCopy(
p->vLeavesBest, vCut );
480 if ( !Aig_ObjIsCi(pObj) && (
int)pObj->
Level <= nLevelMin )
502 int nNodesOld, nNodeBefore, nNodeAfter, nNodesSaved, nNodesSaved2;
503 int i, Required, nLevelMin;
512 if (
p->pPars->fUpdateLevel )
516 clkStart = Abc_Clock();
517 vCut = Vec_VecEntry(
p->vCuts, 0 );
518 vCut2 = Vec_VecEntry(
p->vCuts, 1 );
519 p->nNodesInit = Aig_ManNodeNum(pAig);
520 nNodesOld = Vec_PtrSize( pAig->vObjs );
525 if ( !Aig_ObjIsNode(pObj) )
529 if ( pAig->Time2Quit && !(i & 256) && Abc_Clock() > pAig->Time2Quit )
531 Vec_VecClear(
p->vCuts );
536 nLevelMin = Abc_MaxInt( 0, Aig_ObjLevel(pObj) - 10 );
538 if ( nNodesSaved < p->pPars->
nMffcMin )
540p->timeCuts += Abc_Clock() - clk;
544 if ( Vec_PtrSize(vCut) >
p->pPars->nLeafMax )
549 else if ( Vec_PtrSize(vCut) <
p->pPars->nLeafMax - 2 &&
p->pPars->fExtend )
556 assert( nNodesSaved2 == nNodesSaved );
558 if ( Vec_PtrSize(vCut2) >
p->pPars->nLeafMax )
560 if ( Vec_PtrSize(vCut2) > 0 )
569p->timeCuts += Abc_Clock() - clk;
575p->timeEval += Abc_Clock() - clk;
578 if ( !(
p->GainBest > 0 || (
p->GainBest == 0 &&
p->pPars->fUseZeros)) )
587 nNodeBefore = Aig_ManNodeNum( pAig );
593 nNodeAfter = Aig_ManNodeNum( pAig );
594 assert(
p->GainBest <= nNodeBefore - nNodeAfter );
599p->timeTotal = Abc_Clock() - clkStart;
600p->timeOther =
p->timeTotal -
p->timeCuts -
p->timeEval;
607 if (
p->pPars->fUpdateLevel )
626 printf(
"Dar_ManRefactor: The network check has failed.\n" );
#define ABC_ALLOC(type, num)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManFanoutStart(Aig_Man_t *p)
FUNCTION DEFINITIONS ///.
void Aig_ObjCollectCut(Aig_Obj_t *pRoot, Vec_Ptr_t *vLeaves, Vec_Ptr_t *vNodes)
void Aig_ManFanoutStop(Aig_Man_t *p)
int Aig_NodeMffcExtendCut(Aig_Man_t *p, Aig_Obj_t *pNode, Vec_Ptr_t *vLeaves, Vec_Ptr_t *vResult)
#define Aig_ManForEachObj(p, pObj, i)
void Aig_ManStartReverseLevels(Aig_Man_t *p, int nMaxLevelIncrease)
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
void Aig_ManFindCut(Aig_Obj_t *pRoot, Vec_Ptr_t *vFront, Vec_Ptr_t *vVisited, int nSizeLimit, int nFanoutLimit)
struct Aig_Obj_t_ Aig_Obj_t
void Aig_ManStopReverseLevels(Aig_Man_t *p)
int Aig_ManLevels(Aig_Man_t *p)
unsigned * Aig_ManCutTruth(Aig_Obj_t *pRoot, Vec_Ptr_t *vLeaves, Vec_Ptr_t *vNodes, Vec_Ptr_t *vTruthElem, Vec_Ptr_t *vTruthStore)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int Aig_ManCleanup(Aig_Man_t *p)
void Aig_ObjReplace(Aig_Man_t *p, Aig_Obj_t *pObjOld, Aig_Obj_t *pObjNew, int fUpdateLevel)
int Aig_NodeMffcLabelCut(Aig_Man_t *p, Aig_Obj_t *pNode, Vec_Ptr_t *vLeaves)
int Aig_ObjRequiredLevel(Aig_Man_t *p, Aig_Obj_t *pObj)
int Aig_NodeMffcSupp(Aig_Man_t *p, Aig_Obj_t *pNode, int LevelMin, Vec_Ptr_t *vSupp)
Aig_Obj_t * Aig_TableLookupTwo(Aig_Man_t *p, Aig_Obj_t *pFanin0, Aig_Obj_t *pFanin1)
ABC_DLL int Aig_ManCheck(Aig_Man_t *p)
FUNCTION DECLARATIONS ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Bdc_Par_t_ Bdc_Par_t
struct Bdc_Man_t_ Bdc_Man_t
void Bdc_ManFree(Bdc_Man_t *p)
Aig_Obj_t * Dar_RefactBuildGraph(Aig_Man_t *pAig, Vec_Ptr_t *vCut, Kit_Graph_t *pGraph)
void Ref_ObjPrint(Aig_Obj_t *pObj)
int Dar_ManRefactor(Aig_Man_t *pAig, Dar_RefPar_t *pPars)
void Dar_ManRefStop(Ref_Man_t *p)
int Dar_RefactTryGraph(Aig_Man_t *pAig, Aig_Obj_t *pRoot, Vec_Ptr_t *vCut, Kit_Graph_t *pGraph, int NodeMax, int LevelMax)
void Dar_ManDefaultRefParams(Dar_RefPar_t *pPars)
FUNCTION DEFINITIONS ///.
typedefABC_NAMESPACE_IMPL_START struct Ref_Man_t_ Ref_Man_t
DECLARATIONS ///.
void Dar_ManRefPrintStats(Ref_Man_t *p)
Ref_Man_t * Dar_ManRefStart(Aig_Man_t *pAig, Dar_RefPar_t *pPars)
void Ref_ObjComputeCuts(Aig_Man_t *pAig, Aig_Obj_t *pRoot, Vec_Vec_t *vCuts)
int Dar_ObjCutLevelAchieved(Vec_Ptr_t *vCut, int nLevelMin)
int Dar_ManRefactorTryCuts(Ref_Man_t *p, Aig_Obj_t *pObj, int nNodesSaved, int Required)
struct Dar_RefPar_t_ Dar_RefPar_t
#define Kit_GraphForEachNode(pGraph, pAnd, i)
struct Kit_Graph_t_ Kit_Graph_t
int Kit_TruthIsop(unsigned *puTruth, int nVars, Vec_Int_t *vMemory, int fTryBoth)
Kit_Graph_t * Kit_SopFactor(Vec_Int_t *vCover, int fCompl, int nVars, Vec_Int_t *vMemory)
FUNCTION DEFINITIONS ///.
Kit_Graph_t * Kit_GraphCreateConst1()
struct Kit_Node_t_ Kit_Node_t
void Kit_GraphFree(Kit_Graph_t *pGraph)
#define Kit_GraphForEachLeaf(pGraph, pLeaf, i)
Kit_Graph_t * Kit_GraphCreateConst0()
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
#define Vec_VecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.