30#define SBD_MAX_CUTSIZE 10
31#define SBD_MAX_CUTNUM 501
32#define SBD_MAX_TT_WORDS ((SBD_MAX_CUTSIZE > 6) ? 1 << (SBD_MAX_CUTSIZE-6) : 1)
34#define SBD_CUT_NO_LEAF 0xF
78#define Sbd_ForEachCut( pList, pCut, i ) for ( i = 0, pCut = pList + 1; i < pList[0]; i++, pCut += pCut[0] + 2 )
98 for ( i = 0; i < (int)pCut->
nLeaves; i++ )
108 for ( i = 0; i < nSizeC; i++ )
110 for ( k = 0; k < nSizeB; k++ )
111 if ( pC[i] == pB[k] )
118static inline int Sbd_CutSetCheckArray(
Sbd_Cut_t ** ppCuts,
int nCuts )
121 int i, k, m, n, Value;
123 for ( i = 0; i < nCuts; i++ )
127 assert( pCut0->
Sign == Sbd_CutGetSign(pCut0) );
129 for ( m = 0; m < (int)pCut0->
nLeaves; m++ )
130 for ( n = m + 1; n < (int)pCut0->
nLeaves; n++ )
133 for ( k = 0; k < nCuts; k++ )
136 if ( pCut0 == pCut1 )
139 Value = Sbd_CutCheck( pCut0, pCut1 );
166 if ( nSize0 == nCutSize && nSize1 == nCutSize )
168 for ( i = 0; i < nSize0; i++ )
170 if ( pC0[i] != pC1[i] )
return 0;
180 if ( nSize0 == 0 )
goto FlushCut1;
181 if ( nSize1 == 0 )
goto FlushCut0;
184 if ( c == nCutSize )
return 0;
185 if ( pC0[i] < pC1[k] )
188 if ( i >= nSize0 )
goto FlushCut1;
190 else if ( pC0[i] > pC1[k] )
193 if ( k >= nSize1 )
goto FlushCut0;
197 pC[c++] = pC0[i++]; k++;
198 if ( i >= nSize0 )
goto FlushCut1;
199 if ( k >= nSize1 )
goto FlushCut0;
204 if ( c + nSize0 > nCutSize + i )
return 0;
213 if ( c + nSize1 > nCutSize + k )
return 0;
225 int xMin, c = 0, * pC = pCut->
pLeaves;
230 xMin = Abc_MinInt(x0, x1);
232 if ( c == nCutSize )
return 0;
234 if (x0 == xMin) i0++;
235 if (x1 == xMin) i1++;
244 int i, nSizeB = pBase->
nLeaves;
246 if ( nSizeB == nSizeC )
248 for ( i = 0; i < nSizeB; i++ )
253 assert( nSizeB > nSizeC );
256 for ( i = k = 0; i < nSizeB; i++ )
268static inline int Sbd_CutSetLastCutIsContained(
Sbd_Cut_t ** pCuts,
int nCuts )
271 for ( i = 0; i < nCuts; i++ )
272 if ( pCuts[i]->nLeaves <= pCuts[nCuts]->nLeaves && (pCuts[i]->Sign & pCuts[nCuts]->Sign) == pCuts[i]->Sign && Sbd_CutSetCutIsContainedOrder(pCuts[nCuts], pCuts[i]) )
294 if ( pCut0->
Cost < pCut1->
Cost )
return -1;
295 if ( pCut0->
Cost > pCut1->
Cost )
return 1;
299 else if ( pCut0->
nLeaves <= 4 )
301 else if ( pCut1->
nLeaves <= 4 )
307 if ( pCut0->
Cost < pCut1->
Cost )
return -1;
308 if ( pCut0->
Cost > pCut1->
Cost )
return 1;
323 if ( pCut0->
Cost < pCut1->
Cost )
return -1;
324 if ( pCut0->
Cost > pCut1->
Cost )
return 1;
332static inline int Sbd_CutSetLastCutContains(
Sbd_Cut_t ** pCuts,
int nCuts )
334 int i, k, fChanges = 0;
335 for ( i = 0; i < nCuts; i++ )
336 if ( pCuts[nCuts]->nLeaves < pCuts[i]->nLeaves && (pCuts[nCuts]->Sign & pCuts[i]->Sign) == pCuts[nCuts]->Sign && Sbd_CutSetCutIsContainedOrder(pCuts[i], pCuts[nCuts]) )
340 for ( i = k = 0; i <= nCuts; i++ )
350static inline void Sbd_CutSetSortByCost(
Sbd_Cut_t ** pCuts,
int nCuts )
353 for ( i = nCuts; i > 0; i-- )
355 if ( Sbd_CutCompare(pCuts[i - 1], pCuts[i]) < 0 )
360static inline int Sbd_CutSetAddCut(
Sbd_Cut_t ** pCuts,
int nCuts,
int nCutNum )
364 nCuts = Sbd_CutSetLastCutContains(pCuts, nCuts);
366 Sbd_CutSetSortByCost( pCuts, nCuts );
368 return Abc_MinInt( nCuts + 1, nCutNum - 1 );
384 int nOldSupp = pCutR->
nLeaves, truthId, fCompl;
word t;
385 word t0 = *Sbd_CutTruth(
p, pCut0);
386 word t1 = *Sbd_CutTruth(
p, pCut1);
387 if ( Abc_LitIsCompl(pCut0->
iFunc) ^ fCompl0 ) t0 = ~t0;
388 if ( Abc_LitIsCompl(pCut1->
iFunc) ^ fCompl1 ) t1 = ~t1;
391 t = fIsXor ? t0 ^ t1 : t0 & t1;
392 if ( (fCompl = (
int)(t & 1)) ) t = ~t;
394 assert( (
int)(t & 1) == 0 );
395 truthId = Vec_MemHashInsert(
p->vTtMem, &t);
396 pCutR->
iFunc = Abc_Var2Lit( truthId, fCompl );
398 return (
int)pCutR->
nLeaves < nOldSupp;
402 if (
p->nCutSize <= 6 )
403 return Sbd_CutComputeTruth6(
p, pCut0, pCut1, fCompl0, fCompl1, pCutR, fIsXor );
406 int nOldSupp = pCutR->
nLeaves, truthId;
407 int nCutSize =
p->nCutSize, fCompl;
408 int nWords = Abc_Truth6WordNum(nCutSize);
409 word * pTruth0 = Sbd_CutTruth(
p, pCut0);
410 word * pTruth1 = Sbd_CutTruth(
p, pCut1);
411 Abc_TtCopy( uTruth0, pTruth0,
nWords, Abc_LitIsCompl(pCut0->
iFunc) ^ fCompl0 );
412 Abc_TtCopy( uTruth1, pTruth1,
nWords, Abc_LitIsCompl(pCut1->
iFunc) ^ fCompl1 );
416 Abc_TtXor( uTruth, uTruth0, uTruth1,
nWords, (fCompl = (
int)((uTruth0[0] ^ uTruth1[0]) & 1)) );
418 Abc_TtAnd( uTruth, uTruth0, uTruth1,
nWords, (fCompl = (
int)((uTruth0[0] & uTruth1[0]) & 1)) );
420 assert( (uTruth[0] & 1) == 0 );
422 truthId = Vec_MemHashInsert(
p->vTtMem, uTruth);
423 pCutR->
iFunc = Abc_Var2Lit( truthId, fCompl );
425 return (
int)pCutR->
nLeaves < nOldSupp;
440static inline int Sbd_CutCountBits(
word i )
442 i = i - ((i >> 1) & 0x5555555555555555);
443 i = (i & 0x3333333333333333) + ((i >> 2) & 0x3333333333333333);
444 i = ((i + (i >> 4)) & 0x0F0F0F0F0F0F0F0F);
445 return (i*(0x0101010101010101))>>56;
450 for ( i = 0; i < (int)pCut->
nLeaves; i++ )
451 Cost += Vec_IntEntry(
p->vDelays, pCut->
pLeaves[i] );
457 for ( i = 0; i < (int)pCut->
nLeaves; i++ )
458 Cost += Vec_IntEntry(
p->vLevels, pCut->
pLeaves[i] );
464 for ( i = 0; i < (int)pCut->
nLeaves; i++ )
465 Cost += Vec_IntEntry(
p->vRefs, pCut->
pLeaves[i] ) == 1;
470 int i, Count = 0, Delay = Vec_IntEntry(
p->vDelays, iObj);
471 for ( i = 0; i < (int)pCut->
nLeaves; i++ )
472 Count += (Vec_IntEntry(
p->vDelays, pCut->
pLeaves[i]) - Delay >= -1);
477 int i, Count = 0, Delay = Vec_IntEntry(
p->vDelays, iObj);
478 for ( i = 0; i < (int)pCut->
nLeaves; i++ )
479 Count += (Vec_IntEntry(
p->vDelays, pCut->
pLeaves[i]) - Delay == -2);
482static inline void Sbd_CutAddUnit(
Sbd_Sto_t *
p,
int iObj )
484 Vec_Int_t * vThis = Vec_WecEntry(
p->vCuts, iObj );
485 if ( Vec_IntSize(vThis) == 0 )
486 Vec_IntPush( vThis, 1 );
488 Vec_IntAddToEntry( vThis, 0, 1 );
489 Vec_IntPush( vThis, 1 );
490 Vec_IntPush( vThis, iObj );
491 Vec_IntPush( vThis, 2 );
493static inline void Sbd_CutAddZero(
Sbd_Sto_t *
p,
int iObj )
495 Vec_Int_t * vThis = Vec_WecEntry(
p->vCuts, iObj );
496 assert( Vec_IntSize(vThis) == 0 );
497 Vec_IntPush( vThis, 1 );
498 Vec_IntPush( vThis, 0 );
499 Vec_IntPush( vThis, 0 );
501static inline int Sbd_StoPrepareSet(
Sbd_Sto_t *
p,
int iObj,
int Index )
503 Vec_Int_t * vThis = Vec_WecEntry(
p->vCuts, iObj );
504 int i, v, * pCut, * pList = Vec_IntArray( vThis );
509 for ( v = 1; v <= pCut[0]; v++ )
510 pCutTemp->
pLeaves[v-1] = pCut[v];
511 pCutTemp->
iFunc = pCut[pCut[0]+1];
512 pCutTemp->
Sign = Sbd_CutGetSign( pCutTemp );
513 pCutTemp->
Cost = Sbd_CutCost(
p, pCutTemp );
514 pCutTemp->
CostLev = Sbd_CutCostLev(
p, pCutTemp );
515 pCutTemp->
nTreeLeaves = Sbd_CutTreeLeaves(
p, pCutTemp );
516 pCutTemp->
nSlowLeaves = Sbd_CutSlowLeaves(
p, iObj, pCutTemp );
517 pCutTemp->
nTopLeaves = Sbd_CutTopLeaves(
p, iObj, pCutTemp );
521static inline void Sbd_StoInitResult(
Sbd_Sto_t *
p )
525 p->ppCuts[i] = &
p->pCuts[2][i];
527static inline void Sbd_StoStoreResult(
Sbd_Sto_t *
p,
int iObj,
Sbd_Cut_t ** pCuts,
int nCuts )
530 Vec_Int_t * vList = Vec_WecEntry(
p->vCuts, iObj );
531 Vec_IntPush( vList, nCuts );
532 for ( i = 0; i < nCuts; i++ )
534 Vec_IntPush( vList, pCuts[i]->nLeaves );
535 for ( v = 0; v < (int)pCuts[i]->
nLeaves; v++ )
536 Vec_IntPush( vList, pCuts[i]->pLeaves[v] );
537 Vec_IntPush( vList, pCuts[i]->iFunc );
540static inline void Sbd_StoComputeDelay(
Sbd_Sto_t *
p,
int iObj,
Sbd_Cut_t ** pCuts,
int nCuts )
545 for ( i = 0; i < nCuts; i++ )
547 if ( (
int)pCuts[i]->nLeaves >
p->nLutSize )
550 for ( v = 0; v < (int)pCuts[i]->
nLeaves; v++ )
551 Delay = Abc_MaxInt( Delay, Vec_IntEntry(
p->vDelays, pCuts[i]->pLeaves[v]) );
553 if ( DelayMin > Delay )
558 else if ( DelayMin == Delay &&
p->iCutBest >= 0 && pCuts[
p->iCutBest]->nLeaves > pCuts[i]->nLeaves )
563 DelayMin = (nCuts > 1 || pCuts[0]->
nLeaves > 1) ? DelayMin + 1 : DelayMin;
564 Vec_IntWriteEntry(
p->vDelays, iObj, DelayMin );
565 p->DelayMin = Abc_MaxInt(
p->DelayMin, DelayMin );
567static inline void Sbd_StoComputeSpec(
Sbd_Sto_t *
p,
int iObj,
Sbd_Cut_t ** pCuts,
int nCuts )
570 for ( i = 0; i < nCuts; i++ )
572 pCuts[i]->
nTopLeaves = Sbd_CutTopLeaves(
p, iObj, pCuts[i] );
573 pCuts[i]->
nSlowLeaves = Sbd_CutSlowLeaves(
p, iObj, pCuts[i] );
579 int i, nDigits = Abc_Base10Log(Gia_ManObjNum(
p->pGia));
580 int Delay = Vec_IntEntry(
p->vDelays, iObj);
581 if ( pCut == NULL ) { printf(
"No cut.\n" );
return; }
582 printf(
"%d {", pCut->
nLeaves );
583 for ( i = 0; i < (int)pCut->
nLeaves; i++ )
584 printf(
" %*d", nDigits, pCut->
pLeaves[i] );
585 for ( ; i < (int)
p->nCutSize; i++ )
586 printf(
" %*s", nDigits,
" " );
587 printf(
" } Cost = %3d CostL = %3d Tree = %d Slow = %d Top = %d ",
589 printf(
"%c ", pCut->
nSlowLeaves == 0 ?
'*' :
' ' );
590 for ( i = 0; i < (int)pCut->
nLeaves; i++ )
591 printf(
"%3d ", Vec_IntEntry(
p->vDelays, pCut->
pLeaves[i]) - Delay );
597 int fIsXor = Gia_ObjIsXor(pObj);
598 int nCutSize =
p->nCutSize;
599 int nCutNum =
p->nCutNum;
600 int Lit0m =
p->vMirrors ? Vec_IntEntry(
p->vMirrors, Gia_ObjFaninId0(pObj, iObj) ) : -1;
601 int Lit1m =
p->vMirrors ? Vec_IntEntry(
p->vMirrors, Gia_ObjFaninId1(pObj, iObj) ) : -1;
602 int fComp0 = Gia_ObjFaninC0(pObj) ^ (Lit0m >= 0 && Abc_LitIsCompl(Lit0m));
603 int fComp1 = Gia_ObjFaninC1(pObj) ^ (Lit1m >= 0 && Abc_LitIsCompl(Lit1m));
604 int Fan0 = Lit0m >= 0 ? Abc_Lit2Var(Lit0m) : Gia_ObjFaninId0(pObj, iObj);
605 int Fan1 = Lit1m >= 0 ? Abc_Lit2Var(Lit1m) : Gia_ObjFaninId1(pObj, iObj);
606 int nCuts0 = Sbd_StoPrepareSet(
p, Fan0, 0 );
607 int nCuts1 = Sbd_StoPrepareSet(
p, Fan1, 1 );
608 int i, k, nCutsR = 0;
609 Sbd_Cut_t * pCut0, * pCut1, ** pCutsR =
p->ppCuts;
610 assert( !Gia_ObjIsBuf(pObj) );
611 assert( !Gia_ObjIsMux(
p->pGia, pObj) );
612 Sbd_StoInitResult(
p );
613 p->CutCount[0] += nCuts0 * nCuts1;
614 for ( i = 0, pCut0 =
p->pCuts[0]; i < nCuts0; i++, pCut0++ )
615 for ( k = 0, pCut1 =
p->pCuts[1]; k < nCuts1; k++, pCut1++ )
617 if ( (
int)(pCut0->
nLeaves + pCut1->
nLeaves) > nCutSize && Sbd_CutCountBits(pCut0->
Sign | pCut1->
Sign) > nCutSize )
620 if ( !Sbd_CutMergeOrder(pCut0, pCut1, pCutsR[nCutsR], nCutSize) )
622 if ( Sbd_CutSetLastCutIsContained(pCutsR, nCutsR) )
625 if (
p->fCutMin && Sbd_CutComputeTruth(
p, pCut0, pCut1, fComp0, fComp1, pCutsR[nCutsR], fIsXor) )
626 pCutsR[nCutsR]->
Sign = Sbd_CutGetSign(pCutsR[nCutsR]);
627 pCutsR[nCutsR]->
Cost = Sbd_CutCost(
p, pCutsR[nCutsR] );
628 pCutsR[nCutsR]->
CostLev = Sbd_CutCostLev(
p, pCutsR[nCutsR] );
629 pCutsR[nCutsR]->
nTreeLeaves = Sbd_CutTreeLeaves(
p, pCutsR[nCutsR] );
630 nCutsR = Sbd_CutSetAddCut( pCutsR, nCutsR, nCutNum );
632 Sbd_StoComputeDelay(
p, iObj, pCutsR, nCutsR );
633 Sbd_StoComputeSpec(
p, iObj, pCutsR, nCutsR );
634 p->CutCount[3] += nCutsR;
635 p->nCutsOver += nCutsR == nCutNum-1;
641 printf(
"*** Obj = %4d Delay = %4d NumCuts = %4d\n", iObj, Vec_IntEntry(
p->vDelays, iObj), nCutsR );
642 for ( i = 0; i < nCutsR; i++ )
643 if ( (
int)pCutsR[i]->nLeaves <= p->nLutSize || pCutsR[i]->nSlowLeaves < 2 )
644 Sbd_CutPrint(
p, iObj, pCutsR[i] );
648 assert( nCutsR > 0 && nCutsR < nCutNum );
649 assert( Sbd_CutSetCheckArray(pCutsR, nCutsR) );
651 Sbd_StoStoreResult(
p, iObj, pCutsR, nCutsR );
652 if ( nCutsR > 1 || pCutsR[0]->nLeaves > 1 )
653 Sbd_CutAddUnit(
p, iObj );
670 assert( nLutSize <= nCutSize );
675 p->clkStart = Abc_Clock();
676 p->nLutSize = nLutSize;
677 p->nCutSize = nCutSize;
678 p->nCutNum = nCutNum;
679 p->fCutMin = fCutMin;
680 p->fVerbose = fVerbose;
682 p->vMirrors = vMirrors;
683 p->vDelays = Vec_IntStart( Gia_ManObjNum(pGia) );
684 p->vLevels = Vec_IntStart( Gia_ManObjNum(pGia) );
685 p->vRefs = Vec_IntAlloc( Gia_ManObjNum(pGia) );
686 p->vCuts = Vec_WecStart( Gia_ManObjNum(pGia) );
687 p->vTtMem = fCutMin ? Vec_MemAllocForTT( nCutSize, 0 ) : NULL;
692 Vec_IntFree(
p->vDelays );
693 Vec_IntFree(
p->vLevels );
694 Vec_IntFree(
p->vRefs );
695 Vec_WecFree(
p->vCuts );
697 Vec_MemHashFree(
p->vTtMem );
699 Vec_MemFree(
p->vTtMem );
704 if ( iObj < Vec_IntSize(
p->vDelays) )
706 Vec_IntWriteEntry(
p->vDelays, iObj, Delay );
707 Vec_IntWriteEntry(
p->vLevels, iObj, Level );
711 assert( iObj == Vec_IntSize(
p->vDelays) );
712 assert( iObj == Vec_IntSize(
p->vLevels) );
713 assert( iObj == Vec_WecSize(
p->vCuts) );
714 Vec_IntPush(
p->vDelays, Delay );
715 Vec_IntPush(
p->vLevels, Level );
716 Vec_WecPushLevel(
p->vCuts );
722 Sbd_CutAddZero(
p, iObj );
727 Sbd_CutAddUnit(
p, iObj );
732 int Lev0 = Vec_IntEntry(
p->vLevels, Gia_ObjFaninId0(pObj, iObj) );
733 int Lev1 = Vec_IntEntry(
p->vLevels, Gia_ObjFaninId1(pObj, iObj) );
736 return Vec_IntEntry(
p->vDelays, iObj );
740 Sbd_Cut_t * pCutBest =
p->ppCuts[
p->iCutBest];
int i;
743 for ( i = 0; i < (int)pCutBest->
nLeaves; i++ )
744 pCut[i+1] = pCutBest->
pLeaves[i];
748 return Vec_IntEntry(
p->vRefs, iObj);
753 assert( iObj == Vec_IntSize(
p->vRefs) );
755 Vec_IntPush(
p->vRefs, 0 );
759 Vec_IntWriteEntry(
p->vRefs, iObj, Vec_IntEntry(
p->vRefs, iMirror) );
760 Vec_IntWriteEntry(
p->vRefs, iMirror, 1 );
762 if ( Gia_ObjIsAnd(pObj) )
764 int Lit0m = Vec_IntEntry(
p->vMirrors, Gia_ObjFaninId0(pObj, iObj) );
765 int Lit1m = Vec_IntEntry(
p->vMirrors, Gia_ObjFaninId1(pObj, iObj) );
766 int Fan0 = Lit0m >= 0 ? Abc_Lit2Var(Lit0m) : Gia_ObjFaninId0(pObj, iObj);
767 int Fan1 = Lit1m >= 0 ? Abc_Lit2Var(Lit1m) : Gia_ObjFaninId1(pObj, iObj);
768 Vec_IntAddToEntry(
p->vRefs, Fan0, 1 );
769 Vec_IntAddToEntry(
p->vRefs, Fan1, 1 );
771 else if ( Gia_ObjIsCo(pObj) )
773 int Lit0m = Vec_IntEntry(
p->vMirrors, Gia_ObjFaninId0(pObj, iObj) );
775 Vec_IntAddToEntry(
p->vRefs, Gia_ObjFaninId0(pObj, iObj), 1 );
781 int Lit0m, Lit1m, Fan0, Fan1;
784 pObj = Gia_ManObj(
p->pGia, iObj);
785 if ( Vec_IntEntry(
p->vRefs, iObj) == 0 )
786 printf(
"Ref count mismatch at node %d\n", iObj );
787 assert( Vec_IntEntry(
p->vRefs, iObj) > 0 );
788 Vec_IntAddToEntry(
p->vRefs, iObj, -1 );
789 if ( Vec_IntEntry(
p->vRefs, iObj ) > 0 )
791 if ( Gia_ObjIsCi(pObj) )
794 assert( Gia_ObjIsAnd(pObj) );
795 Lit0m = Vec_IntEntry(
p->vMirrors, Gia_ObjFaninId0(pObj, iObj) );
796 Lit1m = Vec_IntEntry(
p->vMirrors, Gia_ObjFaninId1(pObj, iObj) );
797 Fan0 = Lit0m >= 0 ? Abc_Lit2Var(Lit0m) : Gia_ObjFaninId0(pObj, iObj);
798 Fan1 = Lit1m >= 0 ? Abc_Lit2Var(Lit1m) : Gia_ObjFaninId1(pObj, iObj);
807 if ( fVerbose && iObj % 1000 == 0 )
808 printf(
"Node %6d : \n", iObj );
809 for ( i = 0; i <
p->nCutsR; i++ )
811 if ( fVerbose && iObj % 1000 == 0 )
812 Sbd_CutPrint(
p, iObj,
p->ppCuts[i] );
813 if ( nSize && (
int)
p->ppCuts[i]->nLeaves != nSize )
815 if ( (
int)
p->ppCuts[i]->nLeaves >
p->nLutSize &&
816 (
int)
p->ppCuts[i]->nSlowLeaves <= 1 &&
817 (
int)
p->ppCuts[i]->nTopLeaves <=
p->nLutSize-1 &&
818 (pCutBest == NULL || Sbd_CutCompare2(pCutBest,
p->ppCuts[i]) == 1) )
819 pCutBest =
p->ppCuts[i];
821 if ( fVerbose && iObj % 1000 == 0 )
823 printf(
"Best cut of size %d:\n", nSize );
824 Sbd_CutPrint(
p, iObj, pCutBest );
826 if ( pCutBest == NULL )
829 for ( i = 0; i < (int)pCutBest->
nLeaves; i++ )
830 pLeaves[i] = pCutBest->
pLeaves[i];
849 printf(
"Running cut computation with LutSize = %d CutSize = %d CutNum = %d:\n",
p->nLutSize,
p->nCutSize,
p->nCutNum );
850 printf(
"CutPair = %.0f ",
p->CutCount[0] );
851 printf(
"Merge = %.0f (%.2f %%) ",
p->CutCount[1], 100.0*
p->CutCount[1]/
p->CutCount[0] );
852 printf(
"Eval = %.0f (%.2f %%) ",
p->CutCount[2], 100.0*
p->CutCount[2]/
p->CutCount[0] );
853 printf(
"Cut = %.0f (%.2f %%) ",
p->CutCount[3], 100.0*
p->CutCount[3]/
p->CutCount[0] );
854 printf(
"Cut/Node = %.2f ",
p->CutCount[3] / Gia_ManAndNum(
p->pGia) );
856 printf(
"Spec = %4d ",
p->nCutsSpec );
857 printf(
"Over = %4d ",
p->nCutsOver );
858 printf(
"Lev = %4d ",
p->DelayMin );
859 Abc_PrintTime( 0,
"Time", Abc_Clock() -
p->clkStart );
#define ABC_SWAP(Type, a, b)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define Gia_ManForEachAnd(p, pObj, i)
struct Gia_Obj_t_ Gia_Obj_t
struct Gia_Man_t_ Gia_Man_t
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
#define Gia_ManForEachCiId(p, Id, i)
unsigned __int64 word
DECLARATIONS ///.
#define SBD_MAX_CUTSIZE
DECLARATIONS ///.
Sbd_Sto_t * Sbd_StoAlloc(Gia_Man_t *pGia, Vec_Int_t *vMirrors, int nLutSize, int nCutSize, int nCutNum, int fCutMin, int fVerbose)
MACRO DEFINITIONS ///.
int Sbd_StoObjRefs(Sbd_Sto_t *p, int iObj)
void Sbd_StoComputeCutsTest(Gia_Man_t *pGia)
void Sbd_StoFree(Sbd_Sto_t *p)
#define SBD_MAX_CUTSIZE
DECLARATIONS ///.
#define Sbd_ForEachCut(pList, pCut, i)
int Sbd_StoComputeCutsNode(Sbd_Sto_t *p, int iObj)
void Sbd_StoMergeCuts(Sbd_Sto_t *p, int iObj)
void Sbd_StoSaveBestDelayCut(Sbd_Sto_t *p, int iObj, int *pCut)
void Sbd_StoComputeCutsConst0(Sbd_Sto_t *p, int iObj)
void Sbd_StoComputeCutsObj(Sbd_Sto_t *p, int iObj, int Delay, int Level)
struct Sbd_Cut_t_ Sbd_Cut_t
void Sbd_StoRefObj(Sbd_Sto_t *p, int iObj, int iMirror)
void Sbd_StoDerefObj(Sbd_Sto_t *p, int iObj)
int Sbd_StoObjBestCut(Sbd_Sto_t *p, int iObj, int nSize, int *pLeaves)
void Sbd_StoComputeCutsCi(Sbd_Sto_t *p, int iObj, int Delay, int Level)
struct Sbd_Sto_t_ Sbd_Sto_t
BASIC TYPES ///.
int pLeaves[SBD_MAX_CUTSIZE]
Sbd_Cut_t pCuts[3][SBD_MAX_CUTNUM]
Sbd_Cut_t * ppCuts[SBD_MAX_CUTNUM]
typedefABC_NAMESPACE_IMPL_START struct Vec_Mem_t_ Vec_Mem_t
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.