37# define __builtin_popcount __popcnt
49#define NF_NO_FUNC 0x3FFFFFF
50#define NF_EPSILON 0.001
121static inline int Nf_Cfg2Int(
Nf_Cfg_t Mat ) {
union {
int x;
Nf_Cfg_t y; } v; v.y = Mat;
return v.x; }
122static inline Nf_Cfg_t Nf_Int2Cfg(
int Int ) {
union {
int x;
Nf_Cfg_t y; } v; v.x = Int;
return v.y; }
126static inline int * Nf_ManCutSet(
Nf_Man_t *
p,
int i ) {
return (
int *)Vec_PtrEntry(&
p->vPages, i >> 16) + (i & 0xFFFF); }
127static inline int Nf_ObjCutSetId(
Nf_Man_t *
p,
int i ) {
return Vec_IntEntry( &
p->vCutSets, i ); }
128static inline int * Nf_ObjCutSet(
Nf_Man_t *
p,
int i ) {
return Nf_ManCutSet(
p, Nf_ObjCutSetId(
p, i)); }
129static inline int Nf_ObjHasCuts(
Nf_Man_t *
p,
int i ) {
return (
int)(Vec_IntEntry(&
p->vCutSets, i) > 0); }
130static inline int * Nf_ObjCutBest(
Nf_Man_t *
p,
int i ) {
return NULL; }
131static inline int Nf_ObjCutUseless(
Nf_Man_t *
p,
int TruthId ) {
return (
int)(TruthId >= Vec_WecSize(
p->vTt2Match)); }
133static inline float Nf_ObjCutFlow(
Nf_Man_t *
p,
int i ) {
return Vec_FltEntry(&
p->vCutFlows, i); }
134static inline int Nf_ObjCutDelay(
Nf_Man_t *
p,
int i ) {
return Vec_IntEntry(&
p->vCutDelays, i); }
135static inline void Nf_ObjSetCutFlow(
Nf_Man_t *
p,
int i,
float a ) { Vec_FltWriteEntry(&
p->vCutFlows, i, a); }
136static inline void Nf_ObjSetCutDelay(
Nf_Man_t *
p,
int i,
int d ) { Vec_IntWriteEntry(&
p->vCutDelays, i, d); }
138static inline int Nf_ObjMapRefNum(
Nf_Man_t *
p,
int i,
int c ) {
return Vec_IntEntry(&
p->vMapRefs, Abc_Var2Lit(i,c)); }
139static inline int Nf_ObjMapRefInc(
Nf_Man_t *
p,
int i,
int c ) {
return (*Vec_IntEntryP(&
p->vMapRefs, Abc_Var2Lit(i,c)))++; }
140static inline int Nf_ObjMapRefDec(
Nf_Man_t *
p,
int i,
int c ) {
return --(*Vec_IntEntryP(&
p->vMapRefs, Abc_Var2Lit(i,c))); }
141static inline float Nf_ObjFlowRefs(
Nf_Man_t *
p,
int i,
int c ) {
return Vec_FltEntry(&
p->vFlowRefs, Abc_Var2Lit(i,c)); }
142static inline int Nf_ObjRequired(
Nf_Man_t *
p,
int i,
int c ) {
return Vec_IntEntry(&
p->vRequired, Abc_Var2Lit(i,c)); }
143static inline void Nf_ObjSetRequired(
Nf_Man_t *
p,
int i,
int c,
int f ) { Vec_IntWriteEntry(&
p->vRequired, Abc_Var2Lit(i,c), f); }
144static inline void Nf_ObjUpdateRequired(
Nf_Man_t *
p,
int i,
int c,
int f ) {
if (Nf_ObjRequired(
p, i, c) > f) Nf_ObjSetRequired(
p, i, c, f); }
146static inline Nf_Mat_t * Nf_ObjMatchD(
Nf_Man_t *
p,
int i,
int c ) {
return &Nf_ManObj(
p, i)->M[c][0]; }
147static inline Nf_Mat_t * Nf_ObjMatchA(
Nf_Man_t *
p,
int i,
int c ) {
return &Nf_ManObj(
p, i)->M[c][1]; }
149static inline int Nf_CutSize(
int * pCut ) {
return pCut[0] &
NF_NO_LEAF; }
150static inline int Nf_CutFunc(
int * pCut ) {
return ((
unsigned)pCut[0] >> 5); }
151static inline int * Nf_CutLeaves(
int * pCut ) {
return pCut + 1; }
152static inline int Nf_CutSetBoth(
int n,
int f ) {
return n | (f << 5); }
153static inline int Nf_CutIsTriv(
int * pCut,
int i ) {
return Nf_CutSize(pCut) == 1 && pCut[1] == i; }
154static inline int Nf_CutHandle(
int * pCutSet,
int * pCut ) {
assert( pCut > pCutSet );
return pCut - pCutSet; }
155static inline int * Nf_CutFromHandle(
int * pCutSet,
int h ) {
assert( h > 0 );
return pCutSet + h; }
157static inline int Nf_CfgVar(
Nf_Cfg_t Cfg,
int i ) {
return (Cfg.
Perm >> (i<<2)) & 15; }
158static inline int Nf_CfgCompl(
Nf_Cfg_t Cfg,
int i ) {
return (Cfg.
Phase >> i) & 1; }
160#define Nf_SetForEachCut( pList, pCut, i ) for ( i = 0, pCut = pList + 1; i < pList[0]; i++, pCut += Nf_CutSize(pCut) + 1 )
161#define Nf_CutForEachVarCompl( pCut, Cfg, iVar, fCompl, i ) for ( i = 0; i < Nf_CutSize(pCut) && (iVar = Nf_CutLeaves(pCut)[Nf_CfgVar(Cfg, i)]) && ((fCompl = Nf_CfgCompl(Cfg, i)), 1); i++ )
162#define Nf_CfgForEachVarCompl( Cfg, Size, iVar, fCompl, i ) for ( i = 0; i < Size && ((iVar = Nf_CfgVar(Cfg, i)), 1) && ((fCompl = Nf_CfgCompl(Cfg, i)), 1); i++ )
184 for ( k = 0; k < (int)pCell->
nFanins; k++ )
185 if ( pCell->
iDelays[Abc_Lit2Var(pFans[k])] < pProf[k+1] )
189void Nf_StoCreateGateAdd(
Vec_Mem_t * vTtMem,
Vec_Wec_t * vTt2Match,
Mio_Cell2_t * pCell,
word uTruth,
int * pFans,
int nFans,
Vec_Wec_t * vProfs,
Vec_Int_t * vStore,
int fPinFilter,
int fPinPerm,
int fPinQuick )
191 Vec_Int_t * vArray, * vArrayProfs = NULL;
192 int i, k, GateId, Entry, fCompl = (int)(uTruth & 1);
193 word uFunc = fCompl ? ~uTruth : uTruth;
194 int iFunc = Vec_MemHashInsert( vTtMem, &uFunc );
197 if ( iFunc == Vec_WecSize(vTt2Match) )
198 Vec_WecPushLevel( vTt2Match );
199 vArray = Vec_WecEntry( vTt2Match, iFunc );
203 for ( i = 0; i < nFans; i++ )
205 Mat.
Perm |= (unsigned)(i << (Abc_Lit2Var(pFans[i]) << 2));
206 Mat.
Phase |= (unsigned)(Abc_LitIsCompl(pFans[i]) << Abc_Lit2Var(pFans[i]));
212 assert( Vec_WecSize(vTt2Match) == Vec_WecSize(vProfs) );
213 if ( iFunc == Vec_WecSize(vProfs) )
214 Vec_WecPushLevel( vProfs );
215 vArrayProfs = Vec_WecEntry( vProfs, iFunc );
216 assert( Vec_IntSize(vArray) == 2 * Vec_IntSize(vArrayProfs) );
219 if ( Nf_Int2Cfg(Entry).Phase == Mat.
Phase && Nf_Int2Cfg(Entry).fCompl == Mat.
fCompl )
221 int Offset = Vec_IntEntry(vArrayProfs, i/2);
222 int * pProf = Vec_IntEntryP(vStore, Offset);
233 if ( GateId == (
int)pCell->
Id && __builtin_popcount( Nf_Int2Cfg(Entry).Phase & 0xff ) == __builtin_popcount( Mat.
Phase & 0xff ) )
239 if ( GateId == (
int)pCell->
Id && Nf_Int2Cfg(Entry).Phase == Mat.
Phase )
244 Vec_IntPush( vArray, pCell->
Id );
245 Vec_IntPush( vArray, Nf_Cfg2Int(Mat) );
249 Vec_IntPush( vArrayProfs, Vec_IntSize(vStore) );
250 Vec_IntPush( vStore, Abc_Float2Int(pCell->
AreaF) );
251 for ( k = 0; k < nFans; k++ )
252 Vec_IntPush( vStore, pCell->
iDelays[Abc_Lit2Var(pFans[k])] );
255void Nf_StoCreateGateMaches(
Vec_Mem_t * vTtMem,
Vec_Wec_t * vTt2Match,
Mio_Cell2_t * pCell,
int ** pComp,
int ** pPerm,
int * pnPerms,
Vec_Wec_t * vProfs,
Vec_Int_t * vStore,
int fPinFilter,
int fPinPerm,
int fPinQuick )
258 int nPerms = pnPerms[pCell->
nFanins];
259 int nMints = (1 << pCell->
nFanins);
260 word tCur, tTemp1, tTemp2;
263 for ( i = 0; i < (int)pCell->
nFanins; i++ )
264 Perm[i] = Abc_Var2Lit( i, 0 );
265 tCur = tTemp1 = pCell->
uTruth;
266 for (
p = 0;
p < nPerms;
p++ )
269 for ( c = 0; c < nMints; c++ )
271 Nf_StoCreateGateAdd( vTtMem, vTt2Match, pCell, tCur, Perm, pCell->
nFanins, vProfs, vStore, fPinFilter, fPinPerm, fPinQuick );
273 tCur = Abc_Tt6Flip( tCur, pComp[pCell->
nFanins][c] );
274 Perm1 = Perm + pComp[pCell->
nFanins][c];
275 *Perm1 = Abc_LitNot( *Perm1 );
281 tCur = Abc_Tt6SwapAdjacent( tCur, pPerm[pCell->
nFanins][
p] );
282 Perm1 = Perm + pPerm[pCell->
nFanins][
p];
292 Vec_Wec_t * vProfs = Vec_WecAlloc( 1000 );
293 Vec_Int_t * vStore = Vec_IntAlloc( 10000 );
294 int * pComp[7], * pPerm[7], nPerms[7], i;
296 Vec_WecPushLevel( vProfs );
297 Vec_WecPushLevel( vProfs );
298 for ( i = 1; i <= 6; i++ )
300 for ( i = 1; i <= 6; i++ )
302 for ( i = 1; i <= 6; i++ )
305 if ( pCells != NULL )
306 for ( i = 2; i < *pnCells; i++ )
307 Nf_StoCreateGateMaches( vTtMem, vTt2Match, pCells+i, pComp, pPerm, nPerms, vProfs, vStore, fPinFilter, fPinPerm, fPinQuick );
308 for ( i = 1; i <= 6; i++ )
310 for ( i = 1; i <= 6; i++ )
312 Vec_WecFree( vProfs );
313 Vec_IntFree( vStore );
320 word * pTruth = Vec_MemReadEntry(
p->vTtMem, t);
321 int k, nSuppSize = Abc_TtSupportSize(pTruth, 6);
322 printf(
"%6d : ", Count );
323 printf(
"%6d : ", t );
324 printf(
"%6d : ", i );
325 printf(
"Gate %16s ", pC->
pName );
326 printf(
"Area =%8.2f ", pC->
AreaF );
327 printf(
"In = %d ", pC->
nFanins );
332 for ( k = 0; k < (int)pC->
nFanins; k++ )
334 int fComplF = (Mat.
Phase >> k) & 1;
335 int iFanin = (Mat.
Perm >> (3*k)) & 7;
336 printf(
"%c",
'a' + iFanin - fComplF * (
'a' -
'A') );
343 int t, i, GateId, Entry, Count = 0;
344 for ( t = 2; t < Vec_WecSize(
p->vTt2Match); t++ )
346 Vec_Int_t * vArr = Vec_WecEntry(
p->vTt2Match, t );
356 printf(
"Gates = %d. Truths = %d. Matches = %d.\n",
357 p->nCells, Vec_MemEntryNum(
p->vTtMem), Count );
383 if ( Gia_ManHasChoices(pGia) )
387 p->clkStart = Abc_Clock();
394 Vec_PtrGrow( &
p->vPages, 256 );
395 Vec_IntFill( &
p->vMapRefs, 2*Gia_ManObjNum(pGia), 0 );
396 Vec_FltFill( &
p->vFlowRefs, 2*Gia_ManObjNum(pGia), 0 );
397 Vec_IntFill( &
p->vRequired, 2*Gia_ManObjNum(pGia),
SCL_INFINITY );
398 Vec_IntFill( &
p->vCutSets, Gia_ManObjNum(pGia), 0 );
399 Vec_FltFill( &
p->vCutFlows, Gia_ManObjNum(pGia), 0 );
400 Vec_IntFill( &
p->vCutDelays,Gia_ManObjNum(pGia), 0 );
401 Vec_IntGrow( &
p->vBackup, 1000 );
403 vFlowRefs = Vec_IntAlloc(0);
407 Vec_FltWriteEntry( &
p->vFlowRefs, 2*i, Entry );
408 Vec_FltWriteEntry( &
p->vFlowRefs, 2*i+1, Entry );
410 Vec_IntFree(vFlowRefs);
413 if (
p->pCells == NULL )
415 p->InvDelayI =
p->pCells[3].iDelays[0];
416 p->InvAreaW =
p->pCells[3].AreaW;
417 p->InvAreaF =
p->pCells[3].AreaF;
418 Nf_ObjMatchD(
p, 0, 0)->Gate = 0;
419 Nf_ObjMatchD(
p, 0, 1)->Gate = 1;
425 Vec_PtrFreeData( &
p->vPages );
455 int nOldSupp = pCutR->
nLeaves, truthId, fCompl;
word t;
456 word t0 = *Vec_MemReadEntry(
p->vTtMem, Abc_Lit2Var(pCut0->
iFunc));
457 word t1 = *Vec_MemReadEntry(
p->vTtMem, Abc_Lit2Var(pCut1->
iFunc));
458 if ( Abc_LitIsCompl(pCut0->
iFunc) ^ fCompl0 ) t0 = ~t0;
459 if ( Abc_LitIsCompl(pCut1->
iFunc) ^ fCompl1 ) t1 = ~t1;
462 t = fIsXor ? t0 ^ t1 : t0 & t1;
463 if ( (fCompl = (
int)(t & 1)) ) t = ~t;
465 assert( (
int)(t & 1) == 0 );
466 truthId = Vec_MemHashInsert(
p->vTtMem, &t);
467 pCutR->
iFunc = Abc_Var2Lit( truthId, fCompl );
468 pCutR->
Useless = Nf_ObjCutUseless(
p, truthId );
470 return (
int)pCutR->
nLeaves < nOldSupp;
474 int nOldSupp = pCutR->
nLeaves, truthId, fCompl;
word t;
475 word t0 = *Vec_MemReadEntry(
p->vTtMem, Abc_Lit2Var(pCut0->
iFunc));
476 word t1 = *Vec_MemReadEntry(
p->vTtMem, Abc_Lit2Var(pCut1->
iFunc));
477 word tC = *Vec_MemReadEntry(
p->vTtMem, Abc_Lit2Var(pCutC->
iFunc));
478 if ( Abc_LitIsCompl(pCut0->
iFunc) ^ fCompl0 ) t0 = ~t0;
479 if ( Abc_LitIsCompl(pCut1->
iFunc) ^ fCompl1 ) t1 = ~t1;
480 if ( Abc_LitIsCompl(pCutC->
iFunc) ^ fComplC ) tC = ~tC;
484 t = (tC & t1) | (~tC & t0);
485 if ( (fCompl = (
int)(t & 1)) ) t = ~t;
487 assert( (
int)(t & 1) == 0 );
488 truthId = Vec_MemHashInsert(
p->vTtMem, &t);
489 pCutR->
iFunc = Abc_Var2Lit( truthId, fCompl );
490 pCutR->
Useless = Nf_ObjCutUseless(
p, truthId );
492 return (
int)pCutR->
nLeaves < nOldSupp;
507static inline int Nf_CutCountBits(
word i )
509 i = i - ((i >> 1) & 0x5555555555555555);
510 i = (i & 0x3333333333333333) + ((i >> 2) & 0x3333333333333333);
511 i = ((i + (i >> 4)) & 0x0F0F0F0F0F0F0F0F);
512 return (i*(0x0101010101010101))>>56;
514static inline word Nf_CutGetSign(
int * pLeaves,
int nLeaves )
516 word Sign = 0;
int i;
517 for ( i = 0; i < nLeaves; i++ )
518 Sign |= ((
word)1) << (pLeaves[i] & 0x3F);
521static inline int Nf_CutCreateUnit(
Nf_Cut_t *
p,
int i )
528 p->Sign = ((
word)1) << (i & 0x3F);
533 int i, nDigits = Abc_Base10Log(Gia_ManObjNum(
p->pGia));
534 printf(
"%d {", pCut->
nLeaves );
535 for ( i = 0; i < (int)pCut->
nLeaves; i++ )
536 printf(
" %*d", nDigits, pCut->
pLeaves[i] );
537 for ( ; i < (int)
p->pPars->nLutSize; i++ )
538 printf(
" %*s", nDigits,
" " );
539 printf(
" } Useless = %d. D = %4d A = %9.4f F = %6d ",
546static inline int Nf_ManPrepareCuts(
Nf_Cut_t * pCuts,
Nf_Man_t *
p,
int iObj,
int fAddUnit )
548 if ( Nf_ObjHasCuts(
p, iObj) )
551 int i, * pCut, * pList = Nf_ObjCutSet(
p, iObj);
556 pMfCut->
iFunc = Nf_CutFunc( pCut );
557 pMfCut->
nLeaves = Nf_CutSize( pCut );
558 pMfCut->
Sign = Nf_CutGetSign( pCut+1, Nf_CutSize(pCut) );
559 pMfCut->
Useless = Nf_ObjCutUseless(
p, Abc_Lit2Var(pMfCut->
iFunc) );
560 memcpy( pMfCut->
pLeaves, pCut+1,
sizeof(
int) * Nf_CutSize(pCut) );
563 if ( fAddUnit && pCuts->
nLeaves > 1 )
564 return pList[0] + Nf_CutCreateUnit( pMfCut, iObj );
567 return Nf_CutCreateUnit( pCuts, iObj );
569static inline int Nf_ManSaveCuts(
Nf_Man_t *
p,
Nf_Cut_t ** pCuts,
int nCuts,
int fUseful )
571 int i, * pPlace, iCur, nInts = 1, nCutsNew = 0;
572 for ( i = 0; i < nCuts; i++ )
573 if ( !fUseful || !pCuts[i]->Useless )
574 nInts += pCuts[i]->
nLeaves + 1, nCutsNew++;
575 if ( (
p->iCur & 0xFFFF) + nInts > 0xFFFF )
576 p->iCur = ((
p->iCur >> 16) + 1) << 16;
577 if ( Vec_PtrSize(&
p->vPages) == (
p->iCur >> 16) )
578 Vec_PtrPush( &
p->vPages,
ABC_ALLOC(
int, (1<<16)) );
579 iCur =
p->iCur;
p->iCur += nInts;
580 pPlace = Nf_ManCutSet(
p, iCur );
581 *pPlace++ = nCutsNew;
582 for ( i = 0; i < nCuts; i++ )
583 if ( !fUseful || !pCuts[i]->Useless )
585 *pPlace++ = Nf_CutSetBoth( pCuts[i]->nLeaves, pCuts[i]->iFunc );
586 memcpy( pPlace, pCuts[i]->pLeaves,
sizeof(
int) * pCuts[i]->nLeaves );
591static inline int Nf_ManCountUseful(
Nf_Cut_t ** pCuts,
int nCuts )
594 for ( i = 0; i < nCuts; i++ )
595 Count += !pCuts[i]->Useless;
598static inline int Nf_ManCountMatches(
Nf_Man_t *
p,
Nf_Cut_t ** pCuts,
int nCuts )
601 for ( i = 0; i < nCuts; i++ )
602 if ( !pCuts[i]->Useless )
603 Count += Vec_IntSize(Vec_WecEntry(
p->vTt2Match, Abc_Lit2Var(pCuts[i]->iFunc))) / 2;
624 for ( i = 0; i < nSizeC; i++ )
626 for ( k = 0; k < nSizeB; k++ )
627 if ( pC[i] == pB[k] )
634static inline int Nf_SetCheckArray(
Nf_Cut_t ** ppCuts,
int nCuts )
637 int i, k, m, n, Value;
639 for ( i = 0; i < nCuts; i++ )
645 for ( m = 0; m < (int)pCut0->
nLeaves; m++ )
646 for ( n = m + 1; n < (int)pCut0->
nLeaves; n++ )
649 for ( k = 0; k < nCuts; k++ )
652 if ( pCut0 == pCut1 )
655 Value = Nf_CutCheck( pCut0, pCut1 );
682 if ( nSize0 == nLutSize && nSize1 == nLutSize )
684 for ( i = 0; i < nSize0; i++ )
686 if ( pC0[i] != pC1[i] )
return 0;
696 if ( nSize0 == 0 )
goto FlushCut1;
697 if ( nSize1 == 0 )
goto FlushCut0;
700 if ( c == nLutSize )
return 0;
701 if ( pC0[i] < pC1[k] )
704 if ( i >= nSize0 )
goto FlushCut1;
706 else if ( pC0[i] > pC1[k] )
709 if ( k >= nSize1 )
goto FlushCut0;
713 pC[c++] = pC0[i++]; k++;
714 if ( i >= nSize0 )
goto FlushCut1;
715 if ( k >= nSize1 )
goto FlushCut0;
720 if ( c + nSize0 > nLutSize + i )
return 0;
729 if ( c + nSize1 > nLutSize + k )
return 0;
742 int xMin, c = 0, * pC = pCut->
pLeaves;
748 xMin = Abc_MinInt( Abc_MinInt(x0, x1), x2 );
750 if ( c == nLutSize )
return 0;
752 if (x0 == xMin) i0++;
753 if (x1 == xMin) i1++;
754 if (x2 == xMin) i2++;
761static inline int Nf_SetCutIsContainedOrder(
Nf_Cut_t * pBase,
Nf_Cut_t * pCut )
763 int i, nSizeB = pBase->
nLeaves;
765 if ( nSizeB == nSizeC )
767 for ( i = 0; i < nSizeB; i++ )
772 assert( nSizeB > nSizeC );
775 for ( i = k = 0; i < nSizeB; i++ )
787static inline int Nf_SetLastCutIsContained(
Nf_Cut_t ** pCuts,
int nCuts )
790 for ( i = 0; i < nCuts; i++ )
791 if ( pCuts[i]->nLeaves <= pCuts[nCuts]->nLeaves && (pCuts[i]->Sign & pCuts[nCuts]->Sign) == pCuts[i]->Sign && Nf_SetCutIsContainedOrder(pCuts[nCuts], pCuts[i]) )
795static inline int Nf_SetLastCutContainsArea(
Nf_Cut_t ** pCuts,
int nCuts )
797 int i, k, fChanges = 0;
798 for ( i = 0; i < nCuts; i++ )
799 if ( pCuts[nCuts]->nLeaves < pCuts[i]->nLeaves && (pCuts[nCuts]->Sign & pCuts[i]->Sign) == pCuts[nCuts]->Sign && Nf_SetCutIsContainedOrder(pCuts[i], pCuts[nCuts]) )
803 for ( i = k = 0; i <= nCuts; i++ )
825static inline void Nf_SetSortByArea(
Nf_Cut_t ** pCuts,
int nCuts )
828 for ( i = nCuts; i > 0; i-- )
830 if ( Nf_CutCompareArea(pCuts[i - 1], pCuts[i]) < 0 )
835static inline int Nf_SetAddCut(
Nf_Cut_t ** pCuts,
int nCuts,
int nCutNum )
839 nCuts = Nf_SetLastCutContainsArea(pCuts, nCuts);
840 Nf_SetSortByArea( pCuts, nCuts );
841 return Abc_MinInt( nCuts + 1, nCutNum - 1 );
843static inline int Nf_CutArea(
Nf_Man_t *
p,
int nLeaves )
847 return nLeaves +
p->pPars->nAreaTuner;
851 int i, nLeaves = pCut->
nLeaves;
852 assert( nLeaves <= p->pPars->nLutSize );
855 for ( i = 0; i < nLeaves; i++ )
860 pCut->
Delay += (int)(nLeaves > 1);
861 pCut->
Flow = (pCut->
Flow + Nf_CutArea(
p, nLeaves)) / FlowRefs;
868 float dFlowRefs = Nf_ObjFlowRefs(
p, iObj, 0) + Nf_ObjFlowRefs(
p, iObj, 1);
869 int nLutSize =
p->pPars->nLutSize;
870 int nCutNum =
p->pPars->nCutNum;
871 int nCuts0 = Nf_ManPrepareCuts(pCuts0,
p, Gia_ObjFaninId0(pObj, iObj), 1);
872 int nCuts1 = Nf_ManPrepareCuts(pCuts1,
p, Gia_ObjFaninId1(pObj, iObj), 1);
873 int fComp0 = Gia_ObjFaninC0(pObj);
874 int fComp1 = Gia_ObjFaninC1(pObj);
875 int iSibl = Gia_ObjSibl(
p->pGia, iObj);
876 Nf_Cut_t * pCut0, * pCut1, * pCut0Lim = pCuts0 + nCuts0, * pCut1Lim = pCuts1 + nCuts1;
877 int i, nCutsUse, nCutsR = 0;
878 assert( !Gia_ObjIsBuf(pObj) );
879 for ( i = 0; i < nCutNum; i++ )
880 pCutsR[i] = pCuts + i;
884 Gia_Obj_t * pObjE = Gia_ObjSiblObj(
p->pGia, iObj);
885 int fCompE = Gia_ObjPhase(pObj) ^ Gia_ObjPhase(pObjE);
886 int nCuts2 = Nf_ManPrepareCuts(pCuts2,
p, iSibl, 0);
887 Nf_Cut_t * pCut2, * pCut2Lim = pCuts2 + nCuts2;
888 for ( pCut2 = pCuts2; pCut2 < pCut2Lim; pCut2++ )
890 *pCutsR[nCutsR] = *pCut2;
891 pCutsR[nCutsR]->
iFunc = Abc_LitNotCond( pCutsR[nCutsR]->iFunc, fCompE );
892 Nf_CutParams(
p, pCutsR[nCutsR], dFlowRefs );
893 nCutsR = Nf_SetAddCut( pCutsR, nCutsR, nCutNum );
896 if ( Gia_ObjIsMuxId(
p->pGia, iObj) )
899 int nCuts2 = Nf_ManPrepareCuts(pCuts2,
p, Gia_ObjFaninId2(
p->pGia, iObj), 1);
900 int fComp2 = Gia_ObjFaninC2(
p->pGia, pObj);
901 Nf_Cut_t * pCut2, * pCut2Lim = pCuts2 + nCuts2;
902 p->CutCount[0] += nCuts0 * nCuts1 * nCuts2;
903 for ( pCut0 = pCuts0; pCut0 < pCut0Lim; pCut0++ )
904 for ( pCut1 = pCuts1; pCut1 < pCut1Lim; pCut1++ )
905 for ( pCut2 = pCuts2; pCut2 < pCut2Lim; pCut2++ )
907 if ( Nf_CutCountBits(pCut0->
Sign | pCut1->
Sign | pCut2->
Sign) > nLutSize )
910 if ( !Nf_CutMergeOrderMux(pCut0, pCut1, pCut2, pCutsR[nCutsR], nLutSize) )
912 if ( Nf_SetLastCutIsContained(pCutsR, nCutsR) )
915 if ( Nf_CutComputeTruthMux6(
p, pCut0, pCut1, pCut2, fComp0, fComp1, fComp2, pCutsR[nCutsR]) )
916 pCutsR[nCutsR]->
Sign = Nf_CutGetSign(pCutsR[nCutsR]->pLeaves, pCutsR[nCutsR]->nLeaves);
917 Nf_CutParams(
p, pCutsR[nCutsR], dFlowRefs );
918 nCutsR = Nf_SetAddCut( pCutsR, nCutsR, nCutNum );
923 int fIsXor = Gia_ObjIsXor(pObj);
924 p->CutCount[0] += nCuts0 * nCuts1;
925 for ( pCut0 = pCuts0; pCut0 < pCut0Lim; pCut0++ )
926 for ( pCut1 = pCuts1; pCut1 < pCut1Lim; pCut1++ )
928 if ( (
int)(pCut0->
nLeaves + pCut1->
nLeaves) > nLutSize && Nf_CutCountBits(pCut0->
Sign | pCut1->
Sign) > nLutSize )
931 if ( !Nf_CutMergeOrder(pCut0, pCut1, pCutsR[nCutsR], nLutSize) )
933 if ( Nf_SetLastCutIsContained(pCutsR, nCutsR) )
936 if ( Nf_CutComputeTruth6(
p, pCut0, pCut1, fComp0, fComp1, pCutsR[nCutsR], fIsXor) )
937 pCutsR[nCutsR]->
Sign = Nf_CutGetSign(pCutsR[nCutsR]->pLeaves, pCutsR[nCutsR]->nLeaves);
938 Nf_CutParams(
p, pCutsR[nCutsR], dFlowRefs );
939 nCutsR = Nf_SetAddCut( pCutsR, nCutsR, nCutNum );
947 printf(
"*** Obj = %d Useful = %d\n", iObj, Nf_ManCountUseful(pCutsR, nCutsR) );
948 for ( i = 0; i < nCutsR; i++ )
949 Nf_CutPrint(
p, pCutsR[i] );
953 assert( nCutsR > 0 && nCutsR < nCutNum );
956 Nf_ObjSetCutFlow(
p, iObj, pCutsR[0]->Flow );
957 Nf_ObjSetCutDelay(
p, iObj, pCutsR[0]->Delay );
958 *Vec_IntEntryP(&
p->vCutSets, iObj) = Nf_ManSaveCuts(
p, pCutsR, nCutsR, 0);
959 p->CutCount[3] += nCutsR;
960 nCutsUse = Nf_ManCountUseful(pCutsR, nCutsR);
961 p->CutCount[4] += nCutsUse;
962 p->nCutUseAll += nCutsUse == nCutsR;
963 p->CutCount[5] += Nf_ManCountMatches(
p, pCutsR, nCutsR);
967 Gia_Obj_t * pObj;
int i, iFanin, arrTime;
968 float CutFlow = 0, CutFlowAve = 0;
int fFirstCi = 0, nCutFlow = 0;
972 if ( Gia_ObjIsBuf(pObj) )
974 iFanin = Gia_ObjFaninId0(pObj, i);
975 Nf_ObjSetCutFlow(
p, i, Nf_ObjCutFlow(
p, iFanin) );
976 Nf_ObjSetCutDelay(
p, i, Nf_ObjCutDelay(
p, iFanin) );
978 else if ( Gia_ObjIsAnd(pObj) )
980 else if ( Gia_ObjIsCi(pObj) )
983 CutFlowAve = CutFlow / nCutFlow;
989 Nf_ObjSetCutFlow(
p, i, CutFlowAve );
990 Nf_ObjSetCutDelay(
p, i, arrTime );
992 else if ( Gia_ObjIsCo(pObj) )
994 iFanin = Gia_ObjFaninId0(pObj, i);
995 CutFlow += Nf_ObjCutFlow(
p, iFanin);
996 arrTime = Nf_ObjCutDelay(
p, iFanin);
1016 if ( !
p->pPars->fVerbose )
1018 printf(
"%s : ", pTitle );
1019 printf(
"Delay =%8.2f ", Scl_Int2Flt(
p->pPars->MapDelay) );
1020 printf(
"Area =%12.2f ",
p->pPars->MapAreaF );
1021 printf(
"Gate =%6d ", (
int)
p->pPars->Area );
1022 printf(
"Inv =%6d ", (
int)
p->nInvs );
1023 printf(
"Edge =%7d ", (
int)
p->pPars->Edge );
1024 Abc_PrintTime( 1,
"Time", Abc_Clock() -
p->clkStart );
1030 if ( !
p->pPars->fVerbose )
1032 printf(
"LutSize = %d ",
p->pPars->nLutSize );
1033 printf(
"CutNum = %d ",
p->pPars->nCutNum );
1034 printf(
"Iter = %d ",
p->pPars->nRounds );
1035 printf(
"Coarse = %d ",
p->pPars->fCoarsen );
1036 printf(
"Cells = %d ",
p->nCells );
1037 printf(
"Funcs = %d ", Vec_MemEntryNum(
p->vTtMem) );
1038 printf(
"Matches = %d ", Vec_WecSizeSize(
p->vTt2Match)/2 );
1039 printf(
"And = %d ", Gia_ManAndNum(
p->pGia) );
1040 nChoices = Gia_ManChoiceNum(
p->pGia );
1042 printf(
"Choices = %d ", nChoices );
1044 printf(
"Computing cuts...\r" );
1050 float MemMan =(1.0 *
sizeof(
Nf_Obj_t) + 8.0 *
sizeof(int)) * Gia_ManObjNum(
p->pGia) / (1<<20);
1051 float MemCuts = 1.0 *
sizeof(int) * (1 << 16) * Vec_PtrSize(&
p->vPages) / (1<<20);
1052 float MemTt =
p->vTtMem ? Vec_MemMemory(
p->vTtMem) / (1<<20) : 0;
1053 if (
p->CutCount[0] == 0 )
1055 if ( !
p->pPars->fVerbose )
1057 printf(
"CutPair = %.0f ",
p->CutCount[0] );
1058 printf(
"Merge = %.0f (%.1f) ",
p->CutCount[1], 1.0*
p->CutCount[1]/Gia_ManAndNum(
p->pGia) );
1059 printf(
"Eval = %.0f (%.1f) ",
p->CutCount[2], 1.0*
p->CutCount[2]/Gia_ManAndNum(
p->pGia) );
1060 printf(
"Cut = %.0f (%.1f) ",
p->CutCount[3], 1.0*
p->CutCount[3]/Gia_ManAndNum(
p->pGia) );
1061 printf(
"Use = %.0f (%.1f) ",
p->CutCount[4], 1.0*
p->CutCount[4]/Gia_ManAndNum(
p->pGia) );
1062 printf(
"Mat = %.0f (%.1f) ",
p->CutCount[5], 1.0*
p->CutCount[5]/Gia_ManAndNum(
p->pGia) );
1065 printf(
"Gia = %.2f MB ", MemGia );
1066 printf(
"Man = %.2f MB ", MemMan );
1067 printf(
"Cut = %.2f MB ", MemCuts );
1068 printf(
"TT = %.2f MB ", MemTt );
1069 printf(
"Total = %.2f MB ", MemGia + MemMan + MemCuts + MemTt );
1071 Abc_PrintTime( 1,
"Time", Abc_Clock() -
p->clkStart );
1091 printf(
"%5d %s : ", iObj, pStr );
1092 if ( pM->
CutH == 0 )
1094 printf(
"Unassigned\n" );
1097 pCell = Nf_ManCell(
p, pM->
Gate );
1098 pCut = Nf_CutFromHandle( Nf_ObjCutSet(
p, iObj), pM->
CutH );
1099 printf(
"D =%6.2f ", Scl_Int2Flt(pM->
D) );
1100 printf(
"A =%6.2f ", pM->
F );
1101 printf(
"C = %d ", pM->
fCompl );
1104 printf(
"Cut = {" );
1105 for ( i = 0; i < (int)pCell->
nFanins; i++ )
1106 printf(
"%4d ", Nf_CutLeaves(pCut)[i] );
1107 for ( ; i < 6; i++ )
1110 printf(
"%10s ", pCell->
pName );
1111 printf(
"%d ", pCell->
nFanins );
1113 for ( i = 0; i < (int)pCell->
nFanins; i++ )
1114 printf(
"%6.2f ", Scl_Int2Flt(pCell->
iDelays[i]) );
1115 for ( ; i < 6; i++ )
1118 for ( i = 0; i < (int)pCell->
nFanins; i++ )
1119 printf(
"%s%d ", Nf_CfgCompl(pM->
Cfg, i) ?
"!":
" ", Nf_CfgVar(pM->
Cfg, i) );
1120 for ( ; i < 6; i++ )
1127 int * pFans = Nf_CutLeaves(pCut);
1128 int nFans = Nf_CutSize(pCut);
1129 int iFuncLit = Nf_CutFunc(pCut);
1130 int fComplExt = Abc_LitIsCompl(iFuncLit);
1131 Vec_Int_t * vArr = Vec_WecEntry(
p->vTt2Match, Abc_Lit2Var(iFuncLit) );
1132 int i, k, c, Info, Offset, iFanin, fComplF;
1133 int ArrivalD, ArrivalA;
1137 for ( i = 0; i < nFans; i++ )
1138 pBestF[i] = Nf_ManObj(
p, pFans[i] );
1142 int Const = (iFuncLit == 1);
1143 assert( iFuncLit == 0 || iFuncLit == 1 );
1144 for ( c = 0; c < 2; c++ )
1146 pD = Nf_ObjMatchD(
p, iObj, c );
1147 pA = Nf_ObjMatchA(
p, iObj, c );
1149 pD->
F = pA->
F =
p->pCells[c ^ Const].AreaF;
1150 pD->
CutH = pA->
CutH = Nf_CutHandle(pCutSet, pCut);
1153 pD->
Cfg = pA->
Cfg = Nf_Int2Cfg(0);
1162 int fCompl = Cfg.
fCompl ^ fComplExt;
1163 int Required = Nf_ObjRequired(
p, iObj, fCompl ), Delay = 0;
1166 float AreaF = pC->
AreaF;
1170 ArrivalD = pBestF[iFanin]->
M[fComplF][0].
D;
1171 ArrivalA = pBestF[iFanin]->
M[fComplF][1].
D;
1174 Delay = Abc_MaxInt( Delay, ArrivalA + pC->
iDelays[k] );
1175 if ( AreaF >= (
float)1e32 || pBestF[iFanin]->
M[fComplF][1].F >= (
float)1e32 )
1176 AreaF = (float)1e32;
1178 AreaF += pBestF[iFanin]->
M[fComplF][1].
F;
1184 Delay = Abc_MaxInt( Delay, ArrivalD + pC->
iDelays[k] );
1186 if ( AreaF >= (
float)1e32 || pBestF[iFanin]->
M[fComplF][0].F >= (
float)1e32 )
1187 AreaF = (float)1e32;
1189 AreaF += pBestF[iFanin]->
M[fComplF][0].
F;
1195 if ( pD->
D > Delay )
1199 pD->
CutH = Nf_CutHandle(pCutSet, pCut);
1209 pA->
CutH = Nf_CutHandle(pCutSet, pCut);
1216static inline void Nf_ObjPrepareCi(
Nf_Man_t *
p,
int iObj,
int Time )
1218 Nf_Mat_t * pD0 = Nf_ObjMatchD(
p, iObj, 0 );
1219 Nf_Mat_t * pA0 = Nf_ObjMatchA(
p, iObj, 0 );
1220 Nf_Mat_t * pD = Nf_ObjMatchD(
p, iObj, 1 );
1221 Nf_Mat_t * pA = Nf_ObjMatchA(
p, iObj, 1 );
1222 pD0->
D = pA0->
D = pD->
D = pA->
D = Time;
1224 pD->
D +=
p->InvDelayI;
1225 pD->
F =
p->InvAreaF;
1227 pA->
D +=
p->InvDelayI;
1228 pA->
F =
p->InvAreaF;
1229 Nf_ObjMatchD(
p, iObj, 0 )->fBest = 1;
1230 Nf_ObjMatchD(
p, iObj, 1 )->fBest = 1;
1235 int iObj = Gia_ObjId(
p->pGia, pObj );
1236 int iFanin = Gia_ObjFaninId0( pObj, iObj );
1237 Nf_Mat_t * pDf = Nf_ObjMatchD(
p, iFanin, Gia_ObjFaninC0(pObj) );
1240 Nf_Mat_t * pDp = Nf_ObjMatchD(
p, iObj, 0 );
1241 Nf_Mat_t * pAp = Nf_ObjMatchA(
p, iObj, 0 );
1242 Nf_Mat_t * pDn = Nf_ObjMatchD(
p, iObj, 1 );
1243 Nf_Mat_t * pAn = Nf_ObjMatchA(
p, iObj, 1 );
1244 assert( Gia_ObjIsBuf(pObj) );
1247 pDp->
D = pAp->
D = pDf->
D;
1248 pDp->
F = pAp->
F = pDf->
F;
1251 pDn->
D = pAn->
D = pDf->
D +
p->InvDelayI;
1252 pDn->
F = pAn->
F = pDf->
F +
p->InvAreaF;
1259 int * pCut = Nf_CutFromHandle( pCutSet, pM->
CutH );
1260 int i, iVar, fCompl;
1261 int Arr, Req, Arrival = 0, Required = 0;
1264 Arr = Nf_ManObj(
p, iVar)->M[fCompl][0].D + pCell->
iDelays[i];
1265 Req = Nf_ObjRequired(
p, iVar, fCompl);
1266 Arrival = Abc_MaxInt( Arrival, Arr );
1268 Required = Abc_MaxInt( Required, Req + pCell->
iDelays[i] );
1270 return Abc_MaxInt( Required +
p->pPars->nReqTimeFlex*
p->InvDelayI, Arrival );
1272static inline void Nf_ObjComputeRequired(
Nf_Man_t *
p,
int iObj )
1275 int c, * pCutSet = Nf_ObjCutSet(
p, iObj );
1276 for ( c = 0; c < 2; c++ )
1278 Nf_ObjSetRequired(
p, iObj, c, Nf_CutRequired(
p, &pBest->
M[c][0], pCutSet) );
1287 float FlowRefPf = Nf_ObjFlowRefs(
p, iObj, 0);
1288 float FlowRefNf = Nf_ObjFlowRefs(
p, iObj, 1);
1289 int i, * pCut, * pCutSet = Nf_ObjCutSet(
p, iObj );
1290 int Required[2] = {0};
1293 Nf_ObjComputeRequired(
p, iObj );
1294 Required[0] = Nf_ObjRequired(
p, iObj, 0 );
1295 Required[1] = Nf_ObjRequired(
p, iObj, 1 );
1304 if ( Abc_Lit2Var(Nf_CutFunc(pCut)) >= Vec_WecSize(
p->vTt2Match) )
1306 assert( !Nf_CutIsTriv(pCut, iObj) );
1307 assert( Nf_CutSize(pCut) <=
p->pPars->nLutSize );
1308 assert( Abc_Lit2Var(Nf_CutFunc(pCut)) < Vec_WecSize(
p->vTt2Match) );
1324 pDp->
F = pDp->
F / FlowRefPf;
1325 pAp->
F = pAp->
F / FlowRefPf;
1326 pDn->
F = pDn->
F / FlowRefNf;
1327 pAn->
F = pAn->
F / FlowRefNf;
1331 if ( pDp->
D > pDn->
D +
p->InvDelayI )
1334 pDp->
D +=
p->InvDelayI;
1335 pDp->
F +=
p->InvAreaF;
1341 else if ( pDn->
D > pDp->
D +
p->InvDelayI )
1344 pDn->
D +=
p->InvDelayI;
1345 pDn->
F +=
p->InvAreaF;
1357 pAp->
D +=
p->InvDelayI;
1358 pAp->
F +=
p->InvAreaF;
1369 pAn->
D +=
p->InvDelayI;
1370 pAn->
F +=
p->InvAreaF;
1378 printf(
"Object %d has pDp unassigned.\n", iObj );
1380 printf(
"Object %d has pDn unassigned.\n", iObj );
1382 printf(
"Object %d has pAp unassigned.\n", iObj );
1384 printf(
"Object %d has pAn unassigned.\n", iObj );
1435 if ( Gia_ObjIsBuf(pObj) )
1436 Nf_ObjPrepareBuf(
p, pObj );
1437 else if ( Gia_ObjIsAnd(pObj) )
1439 else if ( Gia_ObjIsCi(pObj) ) {
1441 Nf_ObjPrepareCi(
p, i, arrTime );
1443 else if ( Gia_ObjIsCo(pObj) ) {
1444 arrTime = Nf_ObjMatchD(
p, Gia_ObjFaninId0(pObj, i), Gia_ObjFaninC0(pObj) )->D;
1464 int Required = 0, MapDelayOld =
p->pPars->MapDelay;
1465 int fUseConMan = Scl_ConIsRunning() && Scl_ConHasOutReqs();
1466 int i, iObj, fCompl, nLits = 2*Gia_ManObjNum(
p->pGia);
1469 p->pPars->MapDelay = 0;
1472 Required = Nf_ObjMatchD(
p, Gia_ObjFaninId0p(
p->pGia, pObj), Gia_ObjFaninC0(pObj) )->D;
1473 p->pPars->MapDelay = Abc_MaxInt(
p->pPars->MapDelay, Required );
1475 if (
p->Iter && MapDelayOld < p->pPars->MapDelay &&
p->pGia->vOutReqs == NULL )
1476 printf(
"******** Critical delay violation %.2f -> %.2f ********\n", Scl_Int2Flt(MapDelayOld), Scl_Int2Flt(
p->pPars->MapDelay) );
1477 p->pPars->MapDelay = Abc_MaxInt(
p->pPars->MapDelay, MapDelayOld );
1479 if (
p->pPars->MapDelayTarget == 0 &&
p->pPars->nRelaxRatio )
1480 p->pPars->MapDelayTarget =
p->pPars->MapDelay * (100 +
p->pPars->nRelaxRatio) / 100;
1481 if (
p->pPars->MapDelayTarget > 0 )
1483 if (
p->pPars->MapDelay <
p->pPars->MapDelayTarget )
1484 p->pPars->MapDelay =
p->pPars->MapDelayTarget;
1485 else if (
p->pPars->nRelaxRatio == 0 )
1486 Abc_Print( 0,
"Relaxing user-specified delay target from %.2f to %.2f.\n", Scl_Int2Flt(
p->pPars->MapDelayTarget), Scl_Int2Flt(
p->pPars->MapDelay) );
1494 iObj = Gia_ObjFaninId0p(
p->pGia, pObj);
1495 fCompl = Gia_ObjFaninC0(pObj);
1496 Required = Nf_ObjMatchD(
p, iObj, fCompl)->D;
1497 Required =
p->pPars->fDoAverage ? Required * (100 +
p->pPars->nRelaxRatio) / 100 :
p->pPars->MapDelay;
1501 if ( Scl_ConGetOutReq(i) > 0 && Required <= Scl_ConGetOutReq(i) )
1502 Required = Scl_ConGetOutReq(i);
1504 else if (
p->pGia->vOutReqs )
1506 int NewRequired = Scl_Flt2Int(Vec_FltEntry(
p->pGia->vOutReqs, i));
1507 if ( NewRequired > 0 && Required <= NewRequired )
1508 Required = Abc_MinInt( 2*Required, NewRequired );
1514 Nf_ObjUpdateRequired(
p, iObj, fCompl, Required );
1515 if ( fPropCompl && iObj > 0 && Nf_ObjMatchBest(
p, iObj, fCompl)->fCompl )
1516 Nf_ObjUpdateRequired(
p, iObj, !fCompl, Required -
p->InvDelayI );
1518 if (
p->pManTim == NULL )
1520 if ( fPropCompl && iObj > 0 && Nf_ObjMatchBest(
p, iObj, fCompl)->fCompl )
1529 int k, iVar, fCompl;
1531 int * pCut = Nf_CutFromHandle( Nf_ObjCutSet(
p, iObj), pM->
CutH );
1534 Nf_ObjMapRefInc(
p, iVar, fCompl );
1535 Nf_ObjUpdateRequired(
p, iVar, fCompl, Required - pCell->
iDelays[k] );
1539 p->pPars->MapAreaF += pCell->
AreaF;
1540 p->pPars->Edge += Nf_CutSize(pCut);
1551 Nf_Mat_t * pDp = Nf_ObjMatchD(
p, i, 0 );
1552 Nf_Mat_t * pAp = Nf_ObjMatchA(
p, i, 0 );
1553 Nf_Mat_t * pDn = Nf_ObjMatchD(
p, i, 1 );
1554 Nf_Mat_t * pAn = Nf_ObjMatchA(
p, i, 1 );
1556 printf(
"%5d : ", i );
1557 printf(
"Dp = %6.2f ", Scl_Int2Flt(pDp->
D) );
1558 printf(
"Dn = %6.2f ", Scl_Int2Flt(pDn->
D) );
1560 printf(
"Ap = %6.2f ", Scl_Int2Flt(pAp->
D) );
1561 printf(
"An = %6.2f ", Scl_Int2Flt(pAn->
D) );
1563 printf(
"Dp = %8s ", Nf_ManCell(
p, pDp->
Gate)->pName );
1564 printf(
"Dn = %8s ", Nf_ManCell(
p, pDn->
Gate)->pName );
1565 printf(
"Ap = %8s ", Nf_ManCell(
p, pAp->
Gate)->pName );
1566 printf(
"An = %8s ", Nf_ManCell(
p, pAn->
Gate)->pName );
1573 float Coef = 1.0 / (1.0 + (
p->Iter + 1) * (
p->Iter + 1));
1574 float * pFlowRefs = Vec_FltArray( &
p->vFlowRefs );
1575 int * pMapRefs = Vec_IntArray( &
p->vMapRefs );
1576 int nLits = 2*Gia_ManObjNum(
p->pGia);
1577 int i, c, Id, nRefs[2], reqTime;
1580 Nf_Mat_t * pDs[2], * pAs[2], * pMs[2];
1581 int Required = 0, Requireds[2];
1587 memset( pMapRefs, 0,
sizeof(
int) * nLits );
1589 Nf_ObjMapRefInc(
p, Gia_ObjFaninId0p(
p->pGia, pObj), Gia_ObjFaninC0(pObj));
1593 p->pPars->MapAreaF = 0;
1594 p->pPars->Area =
p->pPars->Edge = 0;
1597 if ( Gia_ObjIsBuf(pObj) )
1599 if ( Nf_ObjMapRefNum(
p, i, 1) )
1601 Nf_ObjMapRefInc(
p, i, 0 );
1602 Nf_ObjUpdateRequired(
p, i, 0, Nf_ObjRequired(
p, i, 1) -
p->InvDelayI );
1603 p->pPars->MapAreaF +=
p->InvAreaF;
1608 Nf_ObjUpdateRequired(
p, Gia_ObjFaninId0(pObj, i), Gia_ObjFaninC0(pObj), Nf_ObjRequired(
p, i, 0) );
1609 Nf_ObjMapRefInc(
p, Gia_ObjFaninId0(pObj, i), Gia_ObjFaninC0(pObj));
1612 if ( Gia_ObjIsCi(pObj) )
1614 if ( Nf_ObjMapRefNum(
p, i, 1) )
1616 Nf_ObjMapRefInc(
p, i, 0 );
1617 Nf_ObjUpdateRequired(
p, i, 0, Nf_ObjRequired(
p, i, 1) -
p->InvDelayI );
1618 p->pPars->MapAreaF +=
p->InvAreaF;
1626 if ( Gia_ObjIsCo(pObj) )
1629 Nf_ObjUpdateRequired(
p, Gia_ObjFaninId0(pObj, i), Gia_ObjFaninC0(pObj), reqTime );
1630 Nf_ObjMapRefInc(
p, Gia_ObjFaninId0(pObj, i), Gia_ObjFaninC0(pObj));
1634 for ( c = 0; c < 2; c++ )
1635 nRefs[c] = Nf_ObjMapRefNum(
p, i, c);
1636 if ( !nRefs[0] && !nRefs[1] )
1640 if ( nRefs[0] && nRefs[1] )
1643 for ( c = 0; c < 2; c++ )
1645 Requireds[c] = Nf_ObjRequired(
p, i, c );
1647 pDs[c] = Nf_ObjMatchD(
p, i, c );
1648 pAs[c] = Nf_ObjMatchA(
p, i, c );
1649 pMs[c] = (pAs[c]->
D <= Requireds[c]) ? pAs[c] : pDs[c];
1652 if ( pMs[0]->fCompl && pMs[1]->fCompl )
1657 pMs[0] = Nf_ObjMatchD(
p, i, 0 );
1658 pMs[1] = Nf_ObjMatchD(
p, i, 1 );
1659 assert( !pMs[0]->fCompl || !pMs[1]->fCompl );
1662 if ( !pMs[0]->fCompl && !pMs[1]->fCompl )
1664 for ( c = 0; c < 2; c++ )
1670 assert( !pMs[0]->fCompl || !pMs[1]->fCompl );
1672 assert( pMs[c]->fCompl && !pMs[!c]->fCompl );
1677 Required = Requireds[c];
1679 Nf_ObjMapRefInc(
p, i, !c );
1680 Nf_ObjUpdateRequired(
p, i, !c, Required -
p->InvDelayI );
1682 Required = Nf_ObjRequired(
p, i, !c );
1684 pD = Nf_ObjMatchD(
p, i, !c );
1685 pA = Nf_ObjMatchA(
p, i, !c );
1686 pM = (pA->
D <= Required) ? pA : pD;
1691 p->pPars->MapAreaF +=
p->InvAreaF;
1699 c = (int)(nRefs[1] > 0);
1700 assert( nRefs[c] && !nRefs[!c] );
1702 Required = Nf_ObjRequired(
p, i, c );
1704 pD = Nf_ObjMatchD(
p, i, c );
1705 pA = Nf_ObjMatchA(
p, i, c );
1706 pM = (pA->
D <= Required) ? pA : pD;
1713 Nf_ObjMapRefInc(
p, i, !c );
1714 Nf_ObjUpdateRequired(
p, i, !c, Required -
p->InvDelayI );
1716 Required = Nf_ObjRequired(
p, i, !c );
1718 pD = Nf_ObjMatchD(
p, i, !c );
1719 pA = Nf_ObjMatchA(
p, i, !c );
1720 pM = (pA->
D <= Required) ? pA : pD;
1723 p->pPars->MapAreaF +=
p->InvAreaF;
1736 if ( Nf_ObjMapRefNum(
p, Id, 1) )
1738 Nf_ObjMapRefInc(
p, Id, 0 );
1739 Nf_ObjUpdateRequired(
p, Id, 0, Required -
p->InvDelayI );
1740 p->pPars->MapAreaF +=
p->InvAreaF;
1746 for ( i = 0; i < nLits; i++ )
1747 pFlowRefs[i] = Abc_MaxFloat(1.0, Coef * pFlowRefs[i] + (1.0 - Coef) * Abc_MaxFloat(1, pMapRefs[i]));
1749 return p->pPars->Area;
1768 int k, iVar, fCompl, * pCut;
1772 assert( Nf_ObjMapRefNum(
p, i, !c) > 0 );
1773 if ( !Nf_ObjMapRefDec(
p, i, !c) )
1775 return Area +
p->InvAreaW;
1777 if ( Nf_ObjCutSetId(
p, i) == 0 )
1779 pCut = Nf_CutFromHandle( Nf_ObjCutSet(
p, i), pM->
CutH );
1782 assert( Nf_ObjMapRefNum(
p, iVar, fCompl) > 0 );
1783 if ( !Nf_ObjMapRefDec(
p, iVar, fCompl) )
1786 return Area + Nf_ManCell(
p, pM->
Gate)->AreaW;
1792 int k, iVar, fCompl, * pCut;
1797 ReqFanin = Required -
p->InvDelayI;
1799 Vec_IntPush( vBackup, Abc_Var2Lit(i, !c) );
1800 assert( Nf_ObjMapRefNum(
p, i, !c) >= 0 );
1801 if ( !Nf_ObjMapRefInc(
p, i, !c) )
1803 return Area +
p->InvAreaW;
1805 if ( Nf_ObjCutSetId(
p, i) == 0 )
1807 pCut = Nf_CutFromHandle( Nf_ObjCutSet(
p, i), pM->
CutH );
1810 ReqFanin = Required - Nf_ManCell(
p, pM->
Gate)->iDelays[k];
1812 Vec_IntPush( vBackup, Abc_Var2Lit(iVar, fCompl) );
1813 assert( Nf_ObjMapRefNum(
p, iVar, fCompl) >= 0 );
1814 if ( !Nf_ObjMapRefInc(
p, iVar, fCompl) )
1815 Area +=
Nf_MatchRef_rec(
p, iVar, fCompl, Nf_ObjMatchD(
p, iVar, fCompl), ReqFanin, vBackup );
1817 return Area + Nf_ManCell(
p, pM->
Gate)->AreaW;
1821 word Area;
int iLit, k;
1822 Vec_IntClear( &
p->vBackup );
1826 assert( Nf_ObjMapRefNum(
p, Abc_Lit2Var(iLit), Abc_LitIsCompl(iLit)) > 0 );
1827 Nf_ObjMapRefDec(
p, Abc_Lit2Var(iLit), Abc_LitIsCompl(iLit) );
1834 int * pFans = Nf_CutLeaves(pCut);
1835 int nFans = Nf_CutSize(pCut);
1836 int iFuncLit = Nf_CutFunc(pCut);
1837 int fComplExt = Abc_LitIsCompl(iFuncLit);
1838 Vec_Int_t * vArr = Vec_WecEntry(
p->vTt2Match, Abc_Lit2Var(iFuncLit) );
1839 int i, k, Info, Offset, iFanin, fComplF;
1842 for ( i = 0; i < nFans; i++ )
1843 pBestF[i] = Nf_ManObj(
p, pFans[i] );
1850 int Const = (iFuncLit == 1);
1852 assert( iFuncLit == 0 || iFuncLit == 1 );
1854 pMb->
F =
p->pCells[c ^ Const].AreaF;
1855 pMb->
CutH = Nf_CutHandle(pCutSet, pCut);
1856 pMb->
Gate = c ^ Const;
1858 pMb->
Cfg = Nf_Int2Cfg(0);
1870 int fCompl = Cfg.
fCompl ^ fComplExt;
1877 pMd = &pBestF[iFanin]->
M[fComplF][0];
1879 Delay = Abc_MaxInt( Delay, pMd->D + pC->
iDelays[k] );
1880 if ( Delay > Required )
1890 pMb->
CutH = Nf_CutHandle(pCutSet, pCut);
1903 int k, * pCut, * pCutSet = Nf_ObjCutSet(
p, iObj );
1908 if ( Abc_Lit2Var(Nf_CutFunc(pCut)) >= Vec_WecSize(
p->vTt2Match) )
1917 int iVar, fCompl, k;
1919 int * pCut = Nf_CutFromHandle( pCutSet, pM->
CutH );
1923 pMfan = Nf_ObjMatchBest(
p, iVar, fCompl );
1924 Delay = Abc_MaxInt( Delay, pMfan->
D + pCell->
iDelays[k] );
1932 Nf_Mat_t * pDc, * pAc, * pMfan, * pM[2];
1939 if ( Gia_ObjIsBuf(pObj) )
1941 pMfan = Nf_ObjMatchBest(
p, Gia_ObjFaninId0(pObj, i), Gia_ObjFaninC0(pObj) );
1942 for ( c = 0; c < 2; c++ )
1944 pDc = Nf_ObjMatchD(
p, i, c );
1945 pAc = Nf_ObjMatchA(
p, i, c );
1946 pDc->
F = pAc->
F = 0;
1947 pDc->
D = pMfan->
D + (c ?
p->InvDelayI : 0);
1954 if ( Gia_ObjIsCi(pObj) )
1957 Nf_ObjPrepareCi(
p, i, Arrival );
1960 if ( Gia_ObjIsCo(pObj) )
1962 Arrival = Nf_ObjMatchD(
p, Gia_ObjFaninId0(pObj, i), Gia_ObjFaninC0(pObj) )->D;
1967 for ( c = 0; c < 2; c++ )
1969 pDc = Nf_ObjMatchD(
p, i, c );
1970 pAc = Nf_ObjMatchA(
p, i, c );
1971 pDc->
F = pAc->
F = 0;
1972 if ( Nf_ObjMapRefNum(
p, i, c) )
1984 if ( (Round & 1) && !pAc->
fCompl )
1991 pM[0] = Nf_ObjMatchD(
p, i, 0 );
1992 pM[1] = Nf_ObjMatchD(
p, i, 1 );
1993 assert( pM[0]->fBest && pM[1]->fBest );
1995 if ( pM[0]->fCompl && pM[1]->fCompl )
2001 if ( !pM[0]->fCompl && !pM[1]->fCompl )
2003 for ( c = 0; c < 2; c++ )
2015 assert( !pM[c]->fCompl );
2016 assert( pM[!c]->fCompl );
2022 Arrival = pM[!c]->
D;
2024 pM[!c]->
D +=
p->InvDelayI;
2037 word AreaBef, AreaAft, Gain = 0;
2038 int i, c, iVar, Id, fCompl, k, * pCut, Required;
2043 if ( Gia_ObjIsBuf(pObj) )
2045 if ( Nf_ObjMapRefNum(
p, i, 1) )
2046 Nf_ObjUpdateRequired(
p, i, 0, Nf_ObjRequired(
p, i, 1) -
p->InvDelayI );
2047 int reqTime = Nf_ObjRequired(
p, i, 0);
2048 int iObj = Gia_ObjFaninId0p(
p->pGia, pObj);
2049 int fCompl = Gia_ObjFaninC0(pObj);
2050 Nf_ObjUpdateRequired(
p, iObj, fCompl, reqTime );
2051 if ( iObj > 0 && Nf_ObjMatchBest(
p, iObj, fCompl)->fCompl )
2052 Nf_ObjUpdateRequired(
p, iObj, !fCompl, reqTime -
p->InvDelayI );
2055 if ( Gia_ObjIsCi(pObj) )
2057 if ( Nf_ObjMapRefNum(
p, i, 1) )
2058 Nf_ObjUpdateRequired(
p, i, 0, Nf_ObjRequired(
p, i, 1) -
p->InvDelayI );
2062 if ( Gia_ObjIsCo(pObj) )
2065 int iObj = Gia_ObjFaninId0p(
p->pGia, pObj);
2066 int fCompl = Gia_ObjFaninC0(pObj);
2067 Nf_ObjUpdateRequired(
p, iObj, fCompl, reqTime );
2068 if ( iObj > 0 && Nf_ObjMatchBest(
p, iObj, fCompl)->fCompl )
2069 Nf_ObjUpdateRequired(
p, iObj, !fCompl, reqTime -
p->InvDelayI );
2072 for ( c = 0; c < 2; c++ )
2073 if ( Nf_ObjMapRefNum(
p, i, c) )
2075 pM = Nf_ObjMatchBest(
p, i, c );
2076 Required = Nf_ObjRequired(
p, i, c );
2077 assert( pM->D <= Required );
2086 Gain += AreaBef - AreaAft;
2088 if ( fVerbose && Nf_ManCell(
p, pM->Gate)->pName != Nf_ManCell(
p, pMb->
Gate)->pName )
2090 printf(
"%4d (%d) ", i, c );
2091 printf(
"%8s ->%8s ", Nf_ManCell(
p, pM->Gate)->pName, Nf_ManCell(
p, pMb->
Gate)->pName );
2092 printf(
"%d -> %d ", Nf_ManCell(
p, pM->Gate)->nFanins, Nf_ManCell(
p, pMb->
Gate)->nFanins );
2093 printf(
"D: %7.2f -> %7.2f ", Scl_Int2Flt(pM->D), Scl_Int2Flt(pMb->
D) );
2094 printf(
"R: %7.2f ", Required ==
SCL_INFINITY ? 9999.99 : Scl_Int2Flt(Required) );
2095 printf(
"A: %7.2f -> %7.2f ", Scl_Int2Flt((
int)AreaBef), Scl_Int2Flt((
int)AreaAft) );
2096 printf(
"G: %7.2f (%7.2f) ", Scl_Int2Flt((
int)AreaBef - (
int)AreaAft), Scl_Int2Flt((
int)Gain) );
2106 pCell = Nf_ManCell(
p, pMb->
Gate );
2107 pCut = Nf_CutFromHandle( Nf_ObjCutSet(
p, i), pMb->
CutH );
2110 pM = Nf_ObjMatchBest(
p, iVar, fCompl );
2112 Nf_ObjUpdateRequired(
p, iVar, fCompl, Required - pCell->
iDelays[k] );
2115 pM = Nf_ObjMatchBest(
p, iVar, !fCompl );
2117 Nf_ObjUpdateRequired(
p, iVar, !fCompl, Required - pCell->
iDelays[k] -
p->InvDelayI );
2123 if ( Nf_ObjMapRefNum(
p, Id, 1) )
2125 Required = Nf_ObjRequired(
p, i, 1 );
2126 Nf_ObjUpdateRequired(
p, Id, 0, Required -
p->InvDelayI );
2133 int i, iDriver, Count = 0;
2136 iDriver = Gia_ObjFaninId0p(
p->pGia, pObj);
2137 if ( !Gia_ObjIsAnd(Gia_ManObj(
p->pGia, iDriver)) )
2140 if ( !Nf_ObjMapRefNum(
p, iDriver, 0) || !Nf_ObjMapRefNum(
p, iDriver, 1) )
2142 pM = Nf_ObjMatchD(
p, iDriver, Gia_ObjFaninC0(pObj) );
2143 pMc = Nf_ObjMatchD(
p, iDriver, !Gia_ObjFaninC0(pObj) );
2148 if ( pMc->
D +
p->InvDelayI >
p->pPars->MapDelay )
2152 Nf_ObjMapRefInc(
p, iDriver, !Gia_ObjFaninC0(pObj) );
2155 pM->
D +=
p->InvDelayI;
2177 FILE * pFile = fopen(
p->pPars->ZFile,
"wb" );
2181 fprintf( pFile,
"%d input %.2f\n", Abc_Var2Lit(Gia_ObjId(
p->pGia, pObj), 0), 0.0 );
2183 assert( !Gia_ObjIsBuf(pObj) );
2184 for ( n = 0; n < 2; n++ ) {
2185 int c, * pCut, * pCutSet = Nf_ObjCutSet(
p, iObj );
2187 if ( Abc_Lit2Var(Nf_CutFunc(pCut)) >= Vec_WecSize(
p->vTt2Match) )
2189 assert( !Nf_CutIsTriv(pCut, iObj) );
2190 assert( Nf_CutSize(pCut) <=
p->pPars->nLutSize );
2191 assert( Abc_Lit2Var(Nf_CutFunc(pCut)) < Vec_WecSize(
p->vTt2Match) );
2192 int iFuncLit = Nf_CutFunc(pCut);
2193 int fComplExt = Abc_LitIsCompl(iFuncLit);
2194 Vec_Int_t * v = Vec_WecEntry(
p->vTt2Match, Abc_Lit2Var(iFuncLit) );
2195 int j, k, Info, Offset, iFanin, fComplF;
2198 int fCompl = Cfg.
fCompl ^ fComplExt;
2203 fprintf( pFile,
"%d ", Abc_Var2Lit(iObj, n) );
2204 fprintf( pFile,
"%s ", pC->
pName );
2205 fprintf( pFile,
"%.2f", pC->
AreaF );
2207 fprintf( pFile,
" %d", Abc_Var2Lit(iFanin, fComplF) );
2208 fprintf( pFile,
"\n" );
2214 fprintf( pFile,
"%d output %.2f %d\n", Abc_Var2Lit(Gia_ObjId(
p->pGia, pObj), 0), 0.0, Gia_ObjFaninLit0p(
p->pGia, pObj) );
2219 fprintf( pFile,
"L%d %d\n", Abc_Var2Lit(iObj, 0), 0 );
2221 fprintf( pFile,
"L%d %d\n", Abc_Var2Lit(iObj, 0), Gia_ObjLevelId(
p->pGia, iObj) );
2223 fprintf( pFile,
"L%d %d\n", Abc_Var2Lit(iObj, 0), LevelMax+1 );
2226 if ( Nf_ObjMapRefNum(
p, iObj, 1) )
2227 fprintf( pFile,
"M%d %s %.2f %d\n", Abc_Var2Lit(iObj, 1),
p->pCells[3].pName,
p->pCells[3].AreaF, Abc_Var2Lit(iObj, 0) );
2229 for ( n = 0; n < 2; n++ )
2230 if ( Nf_ObjMapRefNum(
p, iObj, n) ) {
2231 Nf_Mat_t * pM = Nf_ObjMatchBest(
p, iObj, n);
2233 fprintf( pFile,
"M%d %s %.2f %d\n", Abc_Var2Lit(iObj, n),
p->pCells[3].pName,
p->pCells[3].AreaF, Abc_Var2Lit(iObj, !n) );
2236 int k, iVar, fCompl, * pCut = Nf_CutFromHandle( Nf_ObjCutSet(
p, iObj), pM->
CutH );
2238 fprintf( pFile,
"M%d ", Abc_Var2Lit(iObj, n) );
2239 fprintf( pFile,
"%s ", pC->
pName );
2240 fprintf( pFile,
"%.2f", pC->
AreaF );
2242 fprintf( pFile,
" %d", Abc_Var2Lit(iVar, fCompl) );
2243 fprintf( pFile,
"\n" );
2263 int i, k, c, Id, iVar, fCompl, * pCut;
2264 assert(
p->pGia->vCellMapping == NULL );
2265 vMapping = Vec_IntAlloc( 2*Gia_ManObjNum(
p->pGia) + (
int)
p->pPars->Edge + (
int)
p->pPars->Area * 2 );
2266 Vec_IntFill( vMapping, 2*Gia_ManObjNum(
p->pGia), 0 );
2269 if ( Nf_ObjMapRefNum(
p, Id, 1) )
2270 Vec_IntWriteEntry( vMapping, Abc_Var2Lit(Id, 1), -1 );
2275 if ( Gia_ObjIsBuf(pObj) )
2277 if ( Nf_ObjMapRefNum(
p, i, 1) )
2278 Vec_IntWriteEntry( vMapping, Abc_Var2Lit(i, 1), -1 );
2279 Vec_IntWriteEntry( vMapping, Abc_Var2Lit(i, 0), -2 );
2282 for ( c = 0; c < 2; c++ )
2283 if ( Nf_ObjMapRefNum(
p, i, c) )
2285 pM = Nf_ObjMatchBest(
p, i, c );
2289 Vec_IntWriteEntry( vMapping, Abc_Var2Lit(i, c), -1 );
2293 pCut = Nf_CutFromHandle( Nf_ObjCutSet(
p, i), pM->
CutH );
2294 Vec_IntWriteEntry( vMapping, Abc_Var2Lit(i, c), Vec_IntSize(vMapping) );
2295 Vec_IntPush( vMapping, Nf_CutSize(pCut) );
2297 Vec_IntPush( vMapping, Abc_Var2Lit(iVar, fCompl) );
2298 Vec_IntPush( vMapping, pM->
Gate );
2302 p->pGia->vCellMapping = vMapping;
2303 if (
p->pPars->ZFile )
2312 int i, c, Id, * pCut;
2313 p->pPars->MapAreaF = 0;
p->nInvs = 0;
2314 p->pPars->Area =
p->pPars->Edge = 0;
2317 if ( Gia_ObjIsBuf(pObj) )
2319 if ( Nf_ObjMapRefNum(
p, i, 1) )
2321 p->pPars->MapAreaF +=
p->InvAreaF;
2328 for ( c = 0; c < 2; c++ )
2329 if ( Nf_ObjMapRefNum(
p, i, c) )
2331 pM = Nf_ObjMatchBest(
p, i, c );
2334 p->pPars->MapAreaF +=
p->InvAreaF;
2340 pCut = Nf_CutFromHandle( Nf_ObjCutSet(
p, i), pM->
CutH );
2341 pCell = Nf_ManCell(
p, pM->
Gate );
2343 p->pPars->MapAreaF += pCell->
AreaF;
2344 p->pPars->Edge += Nf_CutSize(pCut);
2350 if ( Nf_ObjMapRefNum(
p, Id, 1) )
2352 p->pPars->MapAreaF +=
p->InvAreaF;
2384 int nInputs = Gia_ManCiNum(
p->pGia);
2385 int LitShift = 2*nInputs+2;
2388 if ( 2*Gia_ManAndNum(
p->pGia) + Gia_ManCiNum(
p->pGia) > nVars )
2390 printf(
"The number of variables is too large: 2*%d + %d = %d > %d.\n", Gia_ManAndNum(
p->pGia), Gia_ManCiNum(
p->pGia), 2*Gia_ManAndNum(
p->pGia) + Gia_ManCiNum(
p->pGia), nVars );
2393 *pInvArea =
p->InvAreaW;
2395 Vec_IntClear( vRoots );
2398 assert( !Gia_ObjIsCi(Gia_ObjFanin0(pObj)) );
2399 Vec_IntPush( vRoots, Gia_ObjFaninLit0p(
p->pGia, pObj)-LitShift );
2402 Vec_WecClear( vCuts );
2403 Vec_WecClear( vObjCuts );
2404 Vec_IntClear( vSolCuts );
2405 Vec_IntClear( vCutGates );
2406 Vec_WrdClear( vCutAreas );
2411 int iCut, * pCut, * pCutSet;
2412 int iCutInv[2] = {-1, -1};
2415 for ( c = 0; c < 2; c++ )
2417 if ( Nf_ObjMapRefNum(
p, iObj, c) == 0 )
2419 if ( Nf_ObjMatchBest(
p, iObj, c)->fCompl )
2421 assert( iCutInv[c] == -1 );
2422 iCutInv[c] = Vec_IntSize(vSolCuts);
2423 Vec_IntPush( vSolCuts, -1 );
2426 pM[c] = Nf_ObjMatchBest(
p, iObj, c);
2429 assert( Vec_WecSize(vObjCuts) == 2*iObj-LitShift );
2430 for ( c = 0; c < 2; c++ )
2432 vObj[c] = Vec_WecPushLevel( vObjCuts );
2433 Vec_IntPush( vObj[c], Abc_Var2Lit(Abc_Var2Lit(iObj, c)-LitShift, 1) );
2436 pCutSet = Nf_ObjCutSet(
p, iObj );
2439 assert( !Nf_CutIsTriv(pCut, iObj) );
2440 assert( Nf_CutSize(pCut) <=
p->pPars->nLutSize );
2441 if ( Abc_Lit2Var(Nf_CutFunc(pCut)) < Vec_WecSize(
p->vTt2Match) )
2443 int * pFans = Nf_CutLeaves(pCut);
2444 int nFans = Nf_CutSize(pCut);
2445 int iFuncLit = Nf_CutFunc(pCut);
2446 int fComplExt = Abc_LitIsCompl(iFuncLit);
2447 Vec_Int_t * vArr = Vec_WecEntry(
p->vTt2Match, Abc_Lit2Var(iFuncLit) );
2448 int i, k, c, Info, Offset, iFanin, fComplF, iCutLit;
2452 int fCompl = Cfg.
fCompl ^ fComplExt;
2455 Vec_IntPush( vCutGates, Info );
2456 Vec_WrdPush( vCutAreas, pC->
AreaW );
2460 for ( c = 0; c < 2; c++ )
2462 if ( pM[c] == NULL )
2464 if ( (
int)pM[c]->CutH == Nf_CutHandle(pCutSet, pCut) && (
int)pM[c]->Gate == Info && Nf_Cfg2Int(pM[c]->Cfg) == Nf_Cfg2Int(Cfg) )
2466 Vec_IntPush( vSolCuts, Vec_WecSize(vCuts) );
2471 iCutLit = Abc_Var2Lit( StartVar + Vec_WecSize(vCuts), 0 );
2472 vCutOne = Vec_WecPushLevel( vCuts );
2474 Vec_IntPush( vCutOne, Abc_Var2Lit(iObj, fCompl) );
2475 Vec_IntPush( vObj[fCompl], iCutLit );
2477 if ( pFans[iFanin] >= nInputs + 1 )
2479 Vec_IntPush( vCutOne, Abc_Var2Lit(pFans[iFanin], fComplF) );
2483 Vec_IntPush( vCutOne, Abc_Var2Lit(pFans[iFanin], 1) );
2487 assert( iCutInv[0] == -1 || iCutInv[1] == -1 );
2489 for ( c = 0; c < 2; c++ )
2491 if ( iCutInv[c] != -1 )
2492 Vec_IntWriteEntry( vSolCuts, iCutInv[c], Vec_WecSize(vCuts) );
2494 Vec_IntPush( Vec_WecEntry(vObjCuts, Abc_Var2Lit(iObj, c)-LitShift), Abc_Var2Lit(StartVar + Vec_WecSize(vCuts), 0) );
2496 vCutOne = Vec_WecPushLevel( vCuts );
2497 Vec_IntPush( vCutOne, Abc_Var2Lit(iObj, c) );
2498 Vec_IntPush( vCutOne, Abc_Var2Lit(iObj, !c) );
2499 Vec_IntPush( vCutGates, 3 );
2500 Vec_WrdPush( vCutAreas,
p->InvAreaW );
2508 if ( Nf_ObjMapRefNum(
p, iObj, 1) )
2509 Vec_IntPush( vSolCuts, -(2*Gia_ManAndNum(
p->pGia)+c) );
2510 assert( Vec_WecSize(vCuts) == Vec_IntSize(vCutGates) );
2511 assert( Vec_WecSize(vCuts) == Vec_WrdSize(vCutAreas) );
2512 assert( Vec_WecSize(vObjCuts) == 2*Gia_ManAndNum(
p->pGia) );
2560 if ( Gia_ManHasChoices(pGia) || pGia->
pManTime )
2567 p->pGia->iFirstNonPiId =
p->pManTim ?
Tim_ManPiNum(
p->pManTim) : Gia_ManCiNum(
p->pGia);
2568 p->pGia->iFirstPoId =
p->pManTim ? Gia_ManCoNum(
p->pGia) -
Tim_ManPoNum(
p->pManTim) : 0;
2569 p->pGia->iFirstAndObj = 1 +
p->pGia->iFirstNonPiId;
2570 p->pGia->iFirstPoObj = Gia_ManObjNum(
p->pGia) - Gia_ManCoNum(
p->pGia) +
p->pGia->iFirstPoId;
2581 if ( Scl_ConIsRunning() )
2584 Nf_ObjPrepareCi(
p, Id, Scl_ConGetInArr(i) );
2590 Nf_ObjPrepareCi(
p, Id, Scl_Flt2Int(
p->pGia->vInArrs ? Vec_FltEntry(
p->pGia->vInArrs, i) : 0.0) );
2592 for (
p->Iter = 0;
p->Iter <
p->pPars->nRounds;
p->Iter++ )
2600 for ( ;
p->Iter <
p->pPars->nRounds + pPars->
nRoundsEla;
p->Iter++ )
2633 int iFanLit, k, Result = 1;
2634 if ( Abc_LitIsCompl(iLit) && Gia_ObjIsTravIdCurrentId(
p, Abc_Lit2Var(iLit)) )
2636 if ( !Abc_LitIsCompl(iLit) && Gia_ObjIsTravIdPreviousId(
p, Abc_Lit2Var(iLit)) )
2638 if ( Abc_LitIsCompl(iLit) )
2639 Gia_ObjSetTravIdCurrentId(
p, Abc_Lit2Var(iLit));
2641 Gia_ObjSetTravIdPreviousId(
p, Abc_Lit2Var(iLit));
2642 if ( !Gia_ObjIsAndNotBuf(Gia_ManObj(
p, Abc_Lit2Var(iLit))) )
2644 if ( !Gia_ObjIsCell(
p, iLit) )
2646 Abc_Print( -1,
"Gia_ManCellMappingVerify: Internal literal %d does not have mapping.\n", iLit );
2649 if ( Gia_ObjIsCellBuf(
p, iLit) )
2651 if ( Gia_ObjIsCellInv(
p, iLit) )
2661 int i, iLit, Result = 1;
2662 assert( Gia_ManHasCellMapping(
p) );
2667 if ( !Gia_ObjIsAndNotBuf(Gia_ObjFanin0(pObj)) )
2669 iLit = Gia_ObjFaninLit0p(
p, pObj);
2670 if ( !Gia_ObjIsCell(
p, iLit) )
2672 Abc_Print( -1,
"Gia_ManCellMappingVerify: Buffer driver %d does not have mapping.\n", Gia_ObjFaninId0p(
p, pObj) );
2680 if ( !Gia_ObjIsAndNotBuf(Gia_ObjFanin0(pObj)) )
2682 iLit = Gia_ObjFaninLit0p(
p, pObj);
2683 if ( !Gia_ObjIsCell(
p, iLit) )
2685 Abc_Print( -1,
"Gia_ManCellMappingVerify: CO driver %d does not have mapping.\n", Gia_ObjFaninId0p(
p, pObj) );
2697 int iLit, iLitNew, k, iFanLit, iPlace;
2698 if ( !Gia_ManHasCellMapping(pGia) )
2701 Vec_IntFreeP( &
p->vCellMapping );
2702 p->vCellMapping = Vec_IntAlloc( 4 * Gia_ManObjNum(
p) );
2703 Vec_IntFill(
p->vCellMapping, 2 * Gia_ManObjNum(
p), 0 );
2706 Gia_Obj_t * pObj = Gia_ManObj(pGia, Abc_Lit2Var(iLit));
2707 if ( Gia_ObjValue(pObj) == ~0 )
2709 assert( !Abc_LitIsCompl( Gia_ObjValue(pObj) ) );
2710 iLitNew = Abc_LitNotCond( Gia_ObjValue(pObj), Abc_LitIsCompl(iLit) );
2711 if ( Gia_ObjIsCellInv(pGia, iLit) ) {
2712 Vec_IntWriteEntry(
p->vCellMapping, iLitNew, -1 );
2715 if ( Gia_ObjIsCellBuf(pGia, iLit) ) {
2716 Vec_IntWriteEntry(
p->vCellMapping, iLitNew, -2 );
2719 Vec_IntWriteEntry(
p->vCellMapping, iLitNew, Vec_IntSize(
p->vCellMapping) );
2720 iPlace = Vec_IntSize(
p->vCellMapping );
2721 Vec_IntPush(
p->vCellMapping, Gia_ObjCellSize(pGia, iLit) );
2724 int iFanLitNew = Gia_ObjValue( Gia_ManObj(pGia, Abc_Lit2Var(iFanLit)) );
2725 if ( iFanLitNew == ~0 )
2726 Vec_IntAddToEntry(
p->vCellMapping, iPlace, -1 );
2728 Vec_IntPush(
p->vCellMapping, Abc_LitNotCond(iFanLitNew, Abc_LitIsCompl(iFanLit)) );
2730 Vec_IntPush(
p->vCellMapping, Gia_ObjCellId(pGia, iLit) );
#define ABC_SWAP(Type, a, b)
#define ABC_ALLOC(type, num)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_DLL void * Abc_FrameReadLibGen()
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void Dau_DsdPrintFromTruth(word *pTruth, int nVarsInit)
int Gia_ManChoiceLevel(Gia_Man_t *p)
void Mf_ManSetFlowRefs(Gia_Man_t *p, Vec_Int_t *vRefs)
word Nf_MatchRef_rec(Nf_Man_t *p, int i, int c, Nf_Mat_t *pM, int Required, Vec_Int_t *vBackup)
void Nf_ManPrintMatches(Nf_Man_t *p)
int Nf_ManExtractWindow(void *pMan, Vec_Int_t *vRoots, Vec_Wec_t *vCuts, Vec_Wec_t *vObjCuts, Vec_Int_t *vSolCuts, Vec_Int_t *vCutGates, Vec_Wrd_t *vCutAreas, word *pInvArea, int StartVar, int nVars)
void Nf_ManCutMatchOne(Nf_Man_t *p, int iObj, int *pCut, int *pCutSet)
void Nf_ManSetMapRefsGate(Nf_Man_t *p, int iObj, int Required, Nf_Mat_t *pM)
#define Nf_CutForEachVarCompl(pCut, Cfg, iVar, fCompl, i)
void Nf_StoCreateGateMaches(Vec_Mem_t *vTtMem, Vec_Wec_t *vTt2Match, Mio_Cell2_t *pCell, int **pComp, int **pPerm, int *pnPerms, Vec_Wec_t *vProfs, Vec_Int_t *vStore, int fPinFilter, int fPinPerm, int fPinQuick)
void Nf_ManCutMatch(Nf_Man_t *p, int iObj)
void Nf_ManComputeMapping(Nf_Man_t *p)
#define Nf_CfgForEachVarCompl(Cfg, Size, iVar, fCompl, i)
void Nf_ManSetOutputRequireds(Nf_Man_t *p, int fPropCompl)
struct Nf_Obj_t_ Nf_Obj_t
void Nf_StoDelete(Nf_Man_t *p)
void Gia_ManTransferCellMapping(Gia_Man_t *p, Gia_Man_t *pGia)
void Nf_ManResetMatches(Nf_Man_t *p, int Round)
word Nf_MatchRefArea(Nf_Man_t *p, int i, int c, Nf_Mat_t *pM, int Required)
int Nf_StoCellIsDominated(Mio_Cell2_t *pCell, int *pFans, int *pProf)
FUNCTION DEFINITIONS ///.
void Nf_ManSetDefaultPars(Jf_Par_t *pPars)
struct Nf_Mat_t_ Nf_Mat_t
void Nf_ManElaBestMatch(Nf_Man_t *p, int iObj, int c, Nf_Mat_t *pRes, int Required)
struct Nf_Cfg_t_ Nf_Cfg_t
void Nf_ManUpdateStats(Nf_Man_t *p)
void Nf_ManElaBestMatchOne(Nf_Man_t *p, int iObj, int c, int *pCut, int *pCutSet, Nf_Mat_t *pRes, int Required)
void Nf_ManPrintInit(Nf_Man_t *p)
Mio_Cell2_t * Nf_StoDeriveMatches(Vec_Mem_t *vTtMem, Vec_Wec_t *vTt2Match, int *pnCells, int fPinFilter, int fPinPerm, int fPinQuick)
#define NF_LEAF_MAX
DECLARATIONS ///.
Nf_Man_t * Nf_StoCreate(Gia_Man_t *pGia, Jf_Par_t *pPars)
void Nf_ManFixPoDrivers(Nf_Man_t *p)
struct Nf_Man_t_ Nf_Man_t
void Nf_StoPrintOne(Nf_Man_t *p, int Count, int t, int i, int GateId, Nf_Cfg_t Mat)
Gia_Man_t * Nf_ManDeriveMapping(Nf_Man_t *p)
#define Nf_SetForEachCut(pList, pCut, i)
word Nf_MatchDeref_rec(Nf_Man_t *p, int i, int c, Nf_Mat_t *pM)
Gia_Man_t * Nf_ManPerformMapping(Gia_Man_t *p, Jf_Par_t *pPars)
void Nf_ManPrintQuit(Nf_Man_t *p)
int Nf_ManComputeArrival(Nf_Man_t *p, Nf_Mat_t *pM, int *pCutSet)
void Nf_ManCutMatchPrint(Nf_Man_t *p, int iObj, char *pStr, Nf_Mat_t *pM)
int Nf_ManSetMapRefs(Nf_Man_t *p)
void Nf_ManComputeMappingEla(Nf_Man_t *p)
Gia_Man_t * Nf_ManPerformMappingInt(Gia_Man_t *pGia, Jf_Par_t *pPars)
void Nf_StoPrint(Nf_Man_t *p, int fVerbose)
void Nf_StoCreateGateAdd(Vec_Mem_t *vTtMem, Vec_Wec_t *vTt2Match, Mio_Cell2_t *pCell, word uTruth, int *pFans, int nFans, Vec_Wec_t *vProfs, Vec_Int_t *vStore, int fPinFilter, int fPinPerm, int fPinQuick)
struct Nf_Cut_t_ Nf_Cut_t
void Nf_ManComputeCuts(Nf_Man_t *p)
void Nf_ObjMergeOrder(Nf_Man_t *p, int iObj)
int Gia_ManCellMappingVerify_rec(Gia_Man_t *p, int iLit)
void Nf_ManDumpMatches(Nf_Man_t *p)
void Nf_ManPrintStats(Nf_Man_t *p, char *pTitle)
void Gia_ManCellMappingVerify(Gia_Man_t *p)
void Gia_ManStop(Gia_Man_t *p)
Gia_Man_t * Gia_ManDupMuxes(Gia_Man_t *p, int Limit)
#define Gia_ManForEachBuf(p, pObj, i)
double Gia_ManMemory(Gia_Man_t *p)
int Gia_ManIsNormalized(Gia_Man_t *p)
#define Gia_ManForEachAnd(p, pObj, i)
#define Gia_ManForEachCoId(p, Id, i)
#define Gia_ManForEachAndReverse(p, pObj, i)
#define Gia_ManForEachCell(p, i)
struct Gia_Obj_t_ Gia_Obj_t
struct Gia_Man_t_ Gia_Man_t
#define Gia_ManForEachCiIdWithBoxes(p, Id, i)
void Gia_ManPrintMuxStats(Gia_Man_t *p)
void Gia_ManTransferTiming(Gia_Man_t *p, Gia_Man_t *pGia)
Gia_Man_t * Gia_ManDupNormalize(Gia_Man_t *p, int fHashMapping)
void Gia_ManIncrementTravId(Gia_Man_t *p)
struct Jf_Par_t_ Jf_Par_t
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachCi(p, pObj, i)
#define Gia_CellForEachFanin(p, i, iFanLit, k)
void Gia_ManSetPhase(Gia_Man_t *p)
#define Gia_ManForEachObjWithBoxes(p, pObj, i)
Gia_Man_t * Gia_ManDupUnnormalize(Gia_Man_t *p)
#define Gia_ManForEachObjReverseWithBoxes(p, pObj, i)
#define Gia_ManForEachAndId(p, i)
#define Gia_ManForEachCiId(p, Id, i)
#define Gia_ManForEachCoWithBoxes(p, pObj, i)
unsigned __int64 word
DECLARATIONS ///.
word M(word f1, word f2, int n)
struct Mio_LibraryStruct_t_ Mio_Library_t
Mio_Cell2_t * Mio_CollectRootsNewDefault2(int nInputs, int *pnGates, int fVerbose)
struct Mio_Cell2_t_ Mio_Cell2_t
void Mio_LibraryMatchesFetch(Mio_Library_t *pLib, Vec_Mem_t **pvTtMem, Vec_Wec_t **pvTt2Match, Mio_Cell2_t **ppCells, int *pnCells, int fPinFilter, int fPinPerm, int fPinQuick)
int pLeaves[NF_LEAF_MAX+1]
void Tim_ManSetCoArrival(Tim_Man_t *p, int iCo, float Delay)
int Tim_ManBoxNum(Tim_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Tim_Man_t_ Tim_Man_t
INCLUDES ///.
void Tim_ManIncrementTravId(Tim_Man_t *p)
DECLARATIONS ///.
int Tim_ManPoNum(Tim_Man_t *p)
void Tim_ManSetCiRequired(Tim_Man_t *p, int iCi, float Delay)
int Tim_ManPiNum(Tim_Man_t *p)
void Tim_ManSetCoRequired(Tim_Man_t *p, int iCo, float Delay)
float Tim_ManGetCiArrival(Tim_Man_t *p, int iCi)
float Tim_ManGetCoRequired(Tim_Man_t *p, int iCo)
typedefABC_NAMESPACE_IMPL_START struct Vec_Mem_t_ Vec_Mem_t
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Flt_t_ Vec_Flt_t
INCLUDES ///.
#define Vec_IntForEachEntryDouble(vVec, Entry1, Entry2, i)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.