32static unsigned Ivy_NodeGetTruth(
Ivy_Obj_t * pObj,
int * pNums,
int nNums );
35 Vec_Ptr_t * vFaninsCur,
int nNodesSaved,
int LevelMax,
int * pGainBest,
unsigned uTruth );
60 abctime clk, clkStart = Abc_Clock();
64 if ( pManRwt == NULL )
67 if ( fUpdateLevel &&
p->fFanout == 0 )
75 nNodes = Ivy_ManObjIdMax(
p);
80 if ( Ivy_ObjIsBuf(pNode) )
86 nGain = Ivy_NodeRewrite(
p, pManRwt, pNode, fUpdateLevel, fUseZeroCost );
87 if ( nGain > 0 || (nGain == 0 && fUseZeroCost) )
109 if ( fCompl ) Dec_GraphComplement( pGraph );
110 Ivy_GraphUpdateNetwork(
p, pNode, pGraph, fUpdateLevel, nGain );
111 if ( fCompl ) Dec_GraphComplement( pGraph );
124 Vec_IntFree(
p->vRequired ),
p->vRequired = NULL;
129 printf(
"Cleanup after rewriting removed %d dangling nodes.\n", i );
131 printf(
"Ivy_ManRewritePre(): The check has failed.\n" );
155 int fVeryVerbose = 0;
161 unsigned uTruthBest = 0;
164 int Required, nNodesSaved;
165 int nNodesSaveCur = -1;
166 int i, c, GainCur = -1, GainBest = -1;
169 p->nNodesConsidered++;
171 Required = fUpdateLevel? Vec_IntEntry( pMan->vRequired, pNode->
Id ) : 1000000;
175p->timeCut += Abc_Clock() - clk;
179 for ( c = 1; c < pStore->
nCuts; c++ )
181 pCut = pStore->
pCuts + c;
183 if ( pCut->
nSize != 4 )
186 for ( i = 0; i < (int)pCut->
nSize; i++ )
187 if ( Ivy_ObjIsBuf( Ivy_ManObj(pMan, pCut->
pArray[i]) ) )
189 if ( i != pCut->
nSize )
197 uTruth = 0xFFFF & Ivy_NodeGetTruth( pNode, pCut->
pArray, pCut->
nSize );
198p->timeTruth += Abc_Clock() - clk2;
199 pPerm =
p->pPerms4[ (int)
p->pPerms[uTruth] ];
200 uPhase =
p->pPhases[uTruth];
202 Vec_PtrClear(
p->vFaninsCur );
203 Vec_PtrFill(
p->vFaninsCur, (
int)pCut->
nSize, 0 );
204 for ( i = 0; i < (int)pCut->
nSize; i++ )
206 pFanin = Ivy_ManObj( pMan, pCut->
pArray[(
int)pPerm[i]] );
207 assert( Ivy_ObjIsNode(pFanin) || Ivy_ObjIsCi(pFanin) );
208 pFanin = Ivy_NotCond(pFanin, ((uPhase & (1<<i)) > 0) );
209 Vec_PtrWriteEntry(
p->vFaninsCur, i, pFanin );
220 Ivy_ObjRefsInc( Ivy_Regular(pFanin) );
226 Ivy_ObjRefsDec( Ivy_Regular(pFanin) );
227p->timeMffc += Abc_Clock() - clk2;
231 pGraph = Rwt_CutEvaluate( pMan,
p, pNode,
p->vFaninsCur, nNodesSaved, Required, &GainCur, uTruth );
232p->timeEval += Abc_Clock() - clk2;
235 if ( pGraph != NULL && GainBest < GainCur )
238 nNodesSaveCur = nNodesSaved;
241 p->fCompl = ((uPhase & (1<<4)) > 0);
244 Vec_PtrClear(
p->vFanins );
246 Vec_PtrPush(
p->vFanins, pFanin );
249p->timeRes += Abc_Clock() - clk;
251 if ( GainBest == -1 )
279 Dec_GraphNode((
Dec_Graph_t *)
p->pGraph, i)->pFunc = pFanin;
281 p->nScores[
p->pMap[uTruthBest]]++;
282 p->nNodesGained += GainBest;
283 if ( fUseZeroCost || GainBest > 0 )
284 p->nNodesRewritten++;
287 if ( fVeryVerbose && GainBest > 0 )
289 printf(
"Node %6d : ", Ivy_ObjId(pNode) );
290 printf(
"Fanins = %d. ",
p->vFanins->nSize );
291 printf(
"Save = %d. ", nNodesSaveCur );
292 printf(
"Add = %d. ", nNodesSaveCur-GainBest );
293 printf(
"GAIN = %d. ", GainBest );
294 printf(
"Cone = %d. ",
p->pGraph? Dec_GraphNodeNum((
Dec_Graph_t *)
p->pGraph) : 0 );
295 printf(
"Class = %d. ",
p->pMap[uTruthBest] );
314 static unsigned uMasks[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 };
315 unsigned uTruth0, uTruth1;
317 for ( i = 0; i < nNums; i++ )
318 if ( pObj->
Id == pNums[i] )
320 assert( Ivy_ObjIsNode(pObj) || Ivy_ObjIsBuf(pObj) );
322 if ( Ivy_ObjFaninC0(pObj) )
324 if ( Ivy_ObjIsBuf(pObj) )
327 if ( Ivy_ObjFaninC1(pObj) )
329 return uTruth0 & uTruth1;
344unsigned Ivy_NodeGetTruth(
Ivy_Obj_t * pObj,
int * pNums,
int nNums )
367 int nNodesAdded, GainBest, i, k;
369 vSubgraphs = Vec_VecEntry(
p->vClasses,
p->pMap[uTruth] );
370 p->nSubgraphs += vSubgraphs->nSize;
379 Dec_GraphNode(pGraphCur, k)->pFunc = pFanin;
381 nNodesAdded = Ivy_GraphToNetworkCount( pMan, pRoot, pGraphCur, nNodesSaved, LevelMax );
382 if ( nNodesAdded == -1 )
384 assert( nNodesSaved >= nNodesAdded );
386 if ( GainBest < nNodesSaved - nNodesAdded )
388 GainBest = nNodesSaved - nNodesAdded;
389 pGraphBest = pGraphCur;
392 if ( GainBest == -1 )
394 *pGainBest = GainBest;
417 int i, Counter, LevelNew, LevelOld;
419 if ( Dec_GraphIsConst(pGraph) || Dec_GraphIsVar(pGraph) )
429 pNode0 = Dec_GraphNode( pGraph, pNode->
eEdge0.Node );
430 pNode1 = Dec_GraphNode( pGraph, pNode->
eEdge1.Node );
434 if ( pAnd0 && pAnd1 )
437 pAnd0 = Ivy_NotCond( pAnd0, pNode->
eEdge0.fCompl );
438 pAnd1 = Ivy_NotCond( pAnd1, pNode->
eEdge1.fCompl );
441 if ( Ivy_Regular(pAnd) == pRoot )
447 if ( pAnd == NULL || Ivy_ObjIsTravIdCurrent(
p, Ivy_Regular(pAnd)) )
449 if ( ++Counter > NodeMax )
456 if ( Ivy_Regular(pAnd) ==
p->pConst1 )
458 else if ( Ivy_Regular(pAnd) == Ivy_Regular(pAnd0) )
459 LevelNew = (int)Ivy_Regular(pAnd0)->Level;
460 else if ( Ivy_Regular(pAnd) == Ivy_Regular(pAnd1) )
461 LevelNew = (int)Ivy_Regular(pAnd1)->Level;
462 LevelOld = (int)Ivy_Regular(pAnd)->Level;
465 if ( LevelNew > LevelMax )
468 pNode->
Level = LevelNew;
491 if ( Dec_GraphIsConst(pGraph) )
492 return Ivy_NotCond( Ivy_ManConst1(
p), Dec_GraphIsComplement(pGraph) );
494 if ( Dec_GraphIsVar(pGraph) )
495 return Ivy_NotCond( (
Ivy_Obj_t *)Dec_GraphVar(pGraph)->pFunc, Dec_GraphIsComplement(pGraph) );
499 pAnd0 = Ivy_NotCond( (
Ivy_Obj_t *)Dec_GraphNode(pGraph, pNode->
eEdge0.Node)->pFunc, pNode->
eEdge0.fCompl );
500 pAnd1 = Ivy_NotCond( (
Ivy_Obj_t *)Dec_GraphNode(pGraph, pNode->
eEdge1.Node)->pFunc, pNode->
eEdge1.fCompl );
504 return Ivy_NotCond( (
Ivy_Obj_t *)pNode->
pFunc, Dec_GraphIsComplement(pGraph) );
521 int nNodesNew, nNodesOld, Required;
522 Required = fUpdateLevel? Vec_IntEntry(
p->vRequired, pRoot->
Id ) : 1000000;
523 nNodesOld = Ivy_ManNodeNum(
p);
526 assert( (
int)Ivy_Regular(pRootNew)->Level <= Required );
542 nNodesNew = Ivy_ManNodeNum(
p);
543 assert( nGain <= nNodesOld - nNodesNew );
562 int nNodesNew, nNodesOld, i, nRefsOld;
563 nNodesOld = Ivy_ManNodeNum(
p);
568 Ivy_ObjRefsInc( Ivy_Regular(pFanin) );
570 nRefsOld = pRoot->
nRefs;
573 pRoot->
nRefs = nRefsOld;
576 Ivy_ObjRefsDec( Ivy_Regular(pFanin) );
599 pFanin = Ivy_Regular(pFanin);
600 if ( !Ivy_ObjIsNone(pFanin) && Ivy_ObjRefs(pFanin) == 0 )
607 nNodesNew = Ivy_ManNodeNum(
p);
608 assert( nGain <= nNodesOld - nNodesNew );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
struct Dec_Node_t_ Dec_Node_t
#define Dec_GraphForEachLeaf(pGraph, pLeaf, i)
ITERATORS ///.
#define Dec_GraphForEachNode(pGraph, pAnd, i)
struct Dec_Graph_t_ Dec_Graph_t
void Ivy_GraphUpdateNetwork3(Ivy_Man_t *p, Ivy_Obj_t *pRoot, Dec_Graph_t *pGraph, int fUpdateLevel, int nGain)
unsigned Ivy_NodeGetTruth_rec(Ivy_Obj_t *pObj, int *pNums, int nNums)
Ivy_Obj_t * Ivy_GraphToNetwork(Ivy_Man_t *p, Dec_Graph_t *pGraph)
int Ivy_ManRewritePre(Ivy_Man_t *p, int fUpdateLevel, int fUseZeroCost, int fVerbose)
FUNCTION DEFINITIONS ///.
int Ivy_ManCheck(Ivy_Man_t *p)
DECLARATIONS ///.
struct Ivy_Cut_t_ Ivy_Cut_t
int Ivy_ObjMffcLabel(Ivy_Man_t *p, Ivy_Obj_t *pObj)
typedefABC_NAMESPACE_HEADER_START struct Ivy_Man_t_ Ivy_Man_t
INCLUDES ///.
Vec_Int_t * Ivy_ManRequiredLevels(Ivy_Man_t *p)
void Ivy_ManIncrementTravId(Ivy_Man_t *p)
DECLARATIONS ///.
Ivy_Obj_t * Ivy_TableLookup(Ivy_Man_t *p, Ivy_Obj_t *pObj)
FUNCTION DEFINITIONS ///.
void Ivy_ManResetLevels(Ivy_Man_t *p)
int Ivy_ManCleanup(Ivy_Man_t *p)
#define Ivy_ManForEachNode(p, pObj, i)
struct Ivy_Store_t_ Ivy_Store_t
struct Ivy_Obj_t_ Ivy_Obj_t
void Ivy_ObjReplace(Ivy_Man_t *p, Ivy_Obj_t *pObjOld, Ivy_Obj_t *pObjNew, int fDeleteOld, int fFreeTop, int fUpdateLevel)
int Ivy_ManPropagateBuffers(Ivy_Man_t *p, int fUpdateLevel)
Ivy_Store_t * Ivy_NodeFindCutsAll(Ivy_Man_t *p, Ivy_Obj_t *pObj, int nLeaves)
void Ivy_NodeFixBufferFanins(Ivy_Man_t *p, Ivy_Obj_t *pNode, int fUpdateLevel)
void Ivy_ManStartFanout(Ivy_Man_t *p)
FUNCTION DEFINITIONS ///.
void Ivy_ObjDelete_rec(Ivy_Man_t *p, Ivy_Obj_t *pObj, int fFreeTop)
Ivy_Obj_t * Ivy_And(Ivy_Man_t *p, Ivy_Obj_t *p0, Ivy_Obj_t *p1)
struct Rwt_Man_t_ Rwt_Man_t
void Rwt_ManPrintStats(Rwt_Man_t *p)
struct Rwt_Node_t_ Rwt_Node_t
int Rwt_ManReadCompl(Rwt_Man_t *p)
void Rwt_ManAddTimeUpdate(Rwt_Man_t *p, abctime Time)
void * Rwt_ManReadDecs(Rwt_Man_t *p)
void Rwt_ManAddTimeTotal(Rwt_Man_t *p, abctime Time)
void Rwt_ManStop(Rwt_Man_t *p)
Rwt_Man_t * Rwt_ManStart(int fPrecompute)
int pArray[IVY_CUT_INPUT]
Ivy_Cut_t pCuts[IVY_CUT_LIMIT]
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.