54 p->nCutsMax = nCutsMax;
55 p->nLeafMax = nLeafMax;
57 p->fVerbose = fVerbose;
61 p->nTruthWords = Abc_TruthWordNum(nLeafMax);
62 p->nCutSize =
sizeof(
Aig_Cut_t) +
sizeof(
int) * nLeafMax + fTruth *
sizeof(unsigned) *
p->nTruthWords;
67 p->puTemp[0] =
ABC_ALLOC(
unsigned, 4 *
p->nTruthWords );
68 p->puTemp[1] =
p->puTemp[0] +
p->nTruthWords;
69 p->puTemp[2] =
p->puTemp[1] +
p->nTruthWords;
70 p->puTemp[3] =
p->puTemp[2] +
p->nTruthWords;
109 for ( i = 0; i < pCut->
nFanins; i++ )
110 printf(
" %d", pCut->
pFanins[i] );
129 printf(
"Cuts for node %d:\n", pObj->
Id );
151 int i, k, nCuts = 0, nCutsK = 0;
183 Cost += pLeaf->
nRefs;
184 return Cost * 1000 / pCut->
nFanins;
205 Cost += (float)1.0/pLeaf->
nRefs;
229 if ( pCutMax == NULL || pCutMax->
Cost < pCut->
Cost )
232 assert( pCutMax != NULL );
252 for ( i = k = 0; i < pCut->
nFanins; i++ )
280 Kit_TruthNot(
p->puTemp[0], Aig_CutTruth(pCut0),
p->nLeafMax );
282 Kit_TruthCopy(
p->puTemp[0], Aig_CutTruth(pCut0),
p->nLeafMax );
286 Kit_TruthNot(
p->puTemp[1], Aig_CutTruth(pCut1),
p->nLeafMax );
288 Kit_TruthCopy(
p->puTemp[1], Aig_CutTruth(pCut1),
p->nLeafMax );
291 Kit_TruthAnd( Aig_CutTruth(pCut),
p->puTemp[2],
p->puTemp[3],
p->nLeafMax );
293 return Aig_CutTruth(pCut);
310 int uSupp, nFansNew, i, k;
312 pTruth = Aig_CutTruth( pCut );
316 nFansNew = Kit_WordCountOnes( uSupp );
318 if ( nFansNew == pCut->
nFanins )
320 assert( nFansNew < pCut->nFanins );
323 for ( i = k = 0; i < pCut->
nFanins; i++ )
324 if ( uSupp & (1 << i) )
347 for ( i = 0; i < (int)pDom->
nFanins; i++ )
349 for ( k = 0; k < (int)pCut->
nFanins; k++ )
387 if ( Aig_CutCheckDominance( pCut, pTemp ) )
399 if ( Aig_CutCheckDominance( pTemp, pCut ) )
428 for ( i = 0; i < pC0->
nFanins; i++ )
431 for ( i = 0; i < pC0->
nFanins; i++ )
439 for ( i = 0; i < pC1->
nFanins; i++ )
441 for ( k = pC0->
nFanins - 1; k >= 0; k-- )
447 for ( i = 0; i < pC0->
nFanins; i++ )
455 for ( c = 0; c <
p->nLeafMax; c++ )
490 if ( i < pC0->nFanins || k < pC1->nFanins )
513 if ( !Aig_CutMergeOrdered(
p, pCut1, pCut0, pCut ) )
518 if ( !Aig_CutMergeOrdered(
p, pCut0, pCut1, pCut ) )
542 Aig_ObjSetCuts(
p, pObj, pCutSet );
558 pCut->
uSign = Aig_ObjCutSign( pObj->
Id );
560 memset( Aig_CutTruth(pCut), 0xAA,
sizeof(
unsigned) *
p->nTruthWords );
578 Aig_Cut_t * pCut0, * pCut1, * pCut, * pCutSet;
579 Aig_Obj_t * pFanin0 = Aig_ObjFanin0(pObj);
580 Aig_Obj_t * pFanin1 = Aig_ObjFanin1(pObj);
583 assert( Aig_ObjIsNode(pObj) );
584 assert( Aig_ObjCuts(
p, pObj) == NULL );
594 if ( Kit_WordCountOnes(pCut0->
uSign | pCut1->
uSign) >
p->nLeafMax )
597 pCut = Aig_CutFindFree(
p, pObj );
614 pCut->
Cost = Aig_CutFindCost(
p, pCut );
637 assert( pAig->pManCuts == NULL );
651 printf(
"Nodes = %6d. Total cuts = %6d. %d-input cuts = %6d.\n",
652 Aig_ManObjNum(pAig), nCuts, nLeafMax, nCutsK );
653 printf(
"Cut size = %2d. Truth size = %2d. Total mem = %5.2f MB ",
655 ABC_PRT(
"Runtime", Abc_Clock() - clk );
#define ABC_ALLOC(type, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int Aig_CutMerge(Aig_ManCut_t *p, Aig_Cut_t *pCut0, Aig_Cut_t *pCut1, Aig_Cut_t *pCut)
void Aig_ObjComputeCuts(Aig_ManCut_t *p, Aig_Obj_t *pObj, int fTriv)
void Aig_ManCutStop(Aig_ManCut_t *p)
int Aig_ManCutCount(Aig_ManCut_t *p, int *pnCutsK)
void Aig_ObjCutPrint(Aig_ManCut_t *p, Aig_Obj_t *pObj)
ABC_NAMESPACE_IMPL_START Aig_ManCut_t * Aig_ManCutStart(Aig_Man_t *pMan, int nCutsMax, int nLeafMax, int fTruth, int fVerbose)
DECLARATIONS ///.
void Aig_CutPrint(Aig_Cut_t *pCut)
Aig_ManCut_t * Aig_ComputeCuts(Aig_Man_t *pAig, int nCutsMax, int nLeafMax, int fTruth, int fVerbose)
int Aig_CutSupportMinimize(Aig_ManCut_t *p, Aig_Cut_t *pCut)
unsigned * Aig_CutComputeTruth(Aig_ManCut_t *p, Aig_Cut_t *pCut, Aig_Cut_t *pCut0, Aig_Cut_t *pCut1, int fCompl0, int fCompl1)
Aig_Cut_t * Aig_ObjPrepareCuts(Aig_ManCut_t *p, Aig_Obj_t *pObj, int fTriv)
int Aig_CutFilter(Aig_ManCut_t *p, Aig_Obj_t *pObj, Aig_Cut_t *pCut)
int Aig_MmFixedReadMemUsage(Aig_MmFixed_t *p)
char * Aig_MmFixedEntryFetch(Aig_MmFixed_t *p)
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
struct Aig_Obj_t_ Aig_Obj_t
#define Aig_ObjForEachCut(p, pObj, pCut, i)
struct Aig_Cut_t_ Aig_Cut_t
#define Aig_ManForEachNode(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
struct Aig_ManCut_t_ Aig_ManCut_t
#define Aig_CutForEachLeaf(p, pCut, pLeaf, i)
Aig_MmFixed_t * Aig_MmFixedStart(int nEntrySize, int nEntriesMax)
FUNCTION DEFINITIONS ///.
void Aig_MmFixedStop(Aig_MmFixed_t *p, int fVerbose)
unsigned Kit_TruthSupport(unsigned *pTruth, int nVars)
void Kit_TruthShrink(unsigned *pOut, unsigned *pIn, int nVars, int nVarsAll, unsigned Phase, int fReturnIn)
void Kit_TruthStretch(unsigned *pOut, unsigned *pIn, int nVars, int nVarsAll, unsigned Phase, int fReturnIn)