32#define GIA_MAX_CUTSIZE 8
33#define GIA_MAX_CUTNUM 257
34#define GIA_MAX_TT_WORDS ((GIA_MAX_CUTSIZE > 6) ? 1 << (GIA_MAX_CUTSIZE-6) : 1)
36#define GIA_CUT_NO_LEAF 0xF
75#define Sdb_ForEachCut( pList, pCut, i ) for ( i = 0, pCut = pList + 1; i < pList[0]; i++, pCut += pCut[0] + 2 )
95 for ( i = 0; i < (int)pCut->
nLeaves; i++ )
105 for ( i = 0; i < nSizeC; i++ )
107 for ( k = 0; k < nSizeB; k++ )
108 if ( pC[i] == pB[k] )
115static inline int Gia_CutSetCheckArray(
Gia_Cut_t ** ppCuts,
int nCuts )
118 int i, k, m, n, Value;
120 for ( i = 0; i < nCuts; i++ )
124 assert( pCut0->
Sign == Gia_CutGetSign(pCut0) );
126 for ( m = 0; m < (int)pCut0->
nLeaves; m++ )
127 for ( n = m + 1; n < (int)pCut0->
nLeaves; n++ )
130 for ( k = 0; k < nCuts; k++ )
133 if ( pCut0 == pCut1 )
136 Value = Gia_CutCheck( pCut0, pCut1 );
163 if ( nSize0 == nCutSize && nSize1 == nCutSize )
165 for ( i = 0; i < nSize0; i++ )
167 if ( pC0[i] != pC1[i] )
return 0;
177 if ( nSize0 == 0 )
goto FlushCut1;
178 if ( nSize1 == 0 )
goto FlushCut0;
181 if ( c == nCutSize )
return 0;
182 if ( pC0[i] < pC1[k] )
185 if ( i >= nSize0 )
goto FlushCut1;
187 else if ( pC0[i] > pC1[k] )
190 if ( k >= nSize1 )
goto FlushCut0;
194 pC[c++] = pC0[i++]; k++;
195 if ( i >= nSize0 )
goto FlushCut1;
196 if ( k >= nSize1 )
goto FlushCut0;
201 if ( c + nSize0 > nCutSize + i )
return 0;
210 if ( c + nSize1 > nCutSize + k )
return 0;
222 int xMin, c = 0, * pC = pCut->
pLeaves;
227 xMin = Abc_MinInt(x0, x1);
229 if ( c == nCutSize )
return 0;
231 if (x0 == xMin) i0++;
232 if (x1 == xMin) i1++;
241 int i, nSizeB = pBase->
nLeaves;
243 if ( nSizeB == nSizeC )
245 for ( i = 0; i < nSizeB; i++ )
250 assert( nSizeB > nSizeC );
253 for ( i = k = 0; i < nSizeB; i++ )
265static inline int Gia_CutSetLastCutIsContained(
Gia_Cut_t ** pCuts,
int nCuts )
268 for ( i = 0; i < nCuts; i++ )
269 if ( pCuts[i]->nLeaves <= pCuts[nCuts]->nLeaves && (pCuts[i]->Sign & pCuts[nCuts]->Sign) == pCuts[i]->Sign && Gia_CutSetCutIsContainedOrder(pCuts[nCuts], pCuts[i]) )
301static inline int Gia_CutSetLastCutContains(
Gia_Cut_t ** pCuts,
int nCuts )
303 int i, k, fChanges = 0;
304 for ( i = 0; i < nCuts; i++ )
305 if ( pCuts[nCuts]->nLeaves < pCuts[i]->nLeaves && (pCuts[nCuts]->Sign & pCuts[i]->Sign) == pCuts[nCuts]->Sign && Gia_CutSetCutIsContainedOrder(pCuts[i], pCuts[nCuts]) )
309 for ( i = k = 0; i <= nCuts; i++ )
319static inline void Gia_CutSetSortByCost(
Gia_Cut_t ** pCuts,
int nCuts )
322 for ( i = nCuts; i > 0; i-- )
324 if ( Gia_CutCompare(pCuts[i - 1], pCuts[i]) < 0 )
329static inline int Gia_CutSetAddCut(
Gia_Cut_t ** pCuts,
int nCuts,
int nCutNum )
333 nCuts = Gia_CutSetLastCutContains(pCuts, nCuts);
335 Gia_CutSetSortByCost( pCuts, nCuts );
337 return Abc_MinInt( nCuts + 1, nCutNum - 1 );
353 int nOldSupp = pCutR->
nLeaves, truthId, fCompl;
word t;
354 word t0 = *Gia_CutTruth(
p, pCut0);
355 word t1 = *Gia_CutTruth(
p, pCut1);
356 if ( Abc_LitIsCompl(pCut0->
iFunc) ^ fCompl0 ) t0 = ~t0;
357 if ( Abc_LitIsCompl(pCut1->
iFunc) ^ fCompl1 ) t1 = ~t1;
360 t = fIsXor ? t0 ^ t1 : t0 & t1;
361 if ( (fCompl = (
int)(t & 1)) ) t = ~t;
364 assert( (
int)(t & 1) == 0 );
365 truthId = Vec_MemHashInsert(
p->vTtMem, &t);
366 pCutR->
iFunc = Abc_Var2Lit( truthId, fCompl );
368 return (
int)pCutR->
nLeaves < nOldSupp;
372 if (
p->nCutSize <= 6 )
373 return Gia_CutComputeTruth6(
p, pCut0, pCut1, fCompl0, fCompl1, pCutR, fIsXor );
376 int nOldSupp = pCutR->
nLeaves, truthId;
377 int nCutSize =
p->nCutSize, fCompl;
378 int nWords = Abc_Truth6WordNum(nCutSize);
379 word * pTruth0 = Gia_CutTruth(
p, pCut0);
380 word * pTruth1 = Gia_CutTruth(
p, pCut1);
381 Abc_TtCopy( uTruth0, pTruth0,
nWords, Abc_LitIsCompl(pCut0->
iFunc) ^ fCompl0 );
382 Abc_TtCopy( uTruth1, pTruth1,
nWords, Abc_LitIsCompl(pCut1->
iFunc) ^ fCompl1 );
386 Abc_TtXor( uTruth, uTruth0, uTruth1,
nWords, (fCompl = (
int)((uTruth0[0] ^ uTruth1[0]) & 1)) );
388 Abc_TtAnd( uTruth, uTruth0, uTruth1,
nWords, (fCompl = (
int)((uTruth0[0] & uTruth1[0]) & 1)) );
391 assert( (uTruth[0] & 1) == 0 );
393 truthId = Vec_MemHashInsert(
p->vTtMem, uTruth);
394 pCutR->
iFunc = Abc_Var2Lit( truthId, fCompl );
396 return (
int)pCutR->
nLeaves < nOldSupp;
411static inline int Gia_CutCountBits(
word i )
413 i = i - ((i >> 1) & 0x5555555555555555);
414 i = (i & 0x3333333333333333) + ((i >> 2) & 0x3333333333333333);
415 i = ((i + (i >> 4)) & 0x0F0F0F0F0F0F0F0F);
416 return (i*(0x0101010101010101))>>56;
418static inline void Gia_CutAddUnit(
Gia_Sto_t *
p,
int iObj )
420 Vec_Int_t * vThis = Vec_WecEntry(
p->vCuts, iObj );
421 if ( Vec_IntSize(vThis) == 0 )
422 Vec_IntPush( vThis, 1 );
424 Vec_IntAddToEntry( vThis, 0, 1 );
425 Vec_IntPush( vThis, 1 );
426 Vec_IntPush( vThis, iObj );
427 Vec_IntPush( vThis, 2 );
429static inline void Gia_CutAddZero(
Gia_Sto_t *
p,
int iObj )
431 Vec_Int_t * vThis = Vec_WecEntry(
p->vCuts, iObj );
432 assert( Vec_IntSize(vThis) == 0 );
433 Vec_IntPush( vThis, 1 );
434 Vec_IntPush( vThis, 0 );
435 Vec_IntPush( vThis, 0 );
440 for ( i = 0; i < (int)pCut->
nLeaves; i++ )
441 Cost += Vec_IntEntry(
p->vRefs, pCut->
pLeaves[i] ) == 1;
447 for ( i = 0; i < (int)pCut->
nLeaves; i++ )
448 Cost += Vec_IntEntry(
p->vRefs, pCut->
pLeaves[i] );
449 return (
float)Cost / Abc_MaxInt(1, pCut->
nLeaves);
451static inline int Gia_StoPrepareSet(
Gia_Sto_t *
p,
int iObj,
int Index )
453 Vec_Int_t * vThis = Vec_WecEntry(
p->vCuts, iObj );
454 int i, v, * pCut, * pList = Vec_IntArray( vThis );
459 for ( v = 1; v <= pCut[0]; v++ )
460 pCutTemp->
pLeaves[v-1] = pCut[v];
461 pCutTemp->
iFunc = pCut[pCut[0]+1];
462 pCutTemp->
Sign = Gia_CutGetSign( pCutTemp );
463 pCutTemp->
nTreeLeaves = Gia_CutTreeLeaves(
p, pCutTemp );
464 pCutTemp->
CostF = Gia_CutGetCost(
p, pCutTemp );
468static inline void Gia_StoInitResult(
Gia_Sto_t *
p )
472 p->ppCuts[i] = &
p->pCuts[2][i];
474static inline void Gia_StoStoreResult(
Gia_Sto_t *
p,
int iObj,
Gia_Cut_t ** pCuts,
int nCuts )
477 Vec_Int_t * vList = Vec_WecEntry(
p->vCuts, iObj );
478 Vec_IntPush( vList, nCuts );
479 for ( i = 0; i < nCuts; i++ )
481 Vec_IntPush( vList, pCuts[i]->nLeaves );
482 for ( v = 0; v < (int)pCuts[i]->
nLeaves; v++ )
483 Vec_IntPush( vList, pCuts[i]->pLeaves[v] );
484 Vec_IntPush( vList, pCuts[i]->iFunc );
489 int i, nDigits = Abc_Base10Log(Gia_ManObjNum(
p->pGia));
490 if ( pCut == NULL ) { printf(
"No cut.\n" );
return; }
491 printf(
"%d {", pCut->
nLeaves );
492 for ( i = 0; i < (int)pCut->
nLeaves; i++ )
493 printf(
" %*d", nDigits, pCut->
pLeaves[i] );
494 for ( ; i < (int)
p->nCutSize; i++ )
495 printf(
" %*s", nDigits,
" " );
496 printf(
" } Cost = %3d CostL = %3d Tree = %d ",
503 int fIsXor = Gia_ObjIsXor(pObj);
504 int nCutSize =
p->nCutSize;
505 int nCutNum =
p->nCutNum;
506 int fComp0 = Gia_ObjFaninC0(pObj);
507 int fComp1 = Gia_ObjFaninC1(pObj);
508 int Fan0 = Gia_ObjFaninId0(pObj, iObj);
509 int Fan1 = Gia_ObjFaninId1(pObj, iObj);
510 int nCuts0 = Gia_StoPrepareSet(
p, Fan0, 0 );
511 int nCuts1 = Gia_StoPrepareSet(
p, Fan1, 1 );
512 int i, k, nCutsR = 0;
513 Gia_Cut_t * pCut0, * pCut1, ** pCutsR =
p->ppCuts;
514 assert( !Gia_ObjIsBuf(pObj) );
515 assert( !Gia_ObjIsMux(
p->pGia, pObj) );
516 Gia_StoInitResult(
p );
517 p->CutCount[0] += nCuts0 * nCuts1;
518 for ( i = 0, pCut0 =
p->pCuts[0]; i < nCuts0; i++, pCut0++ )
519 for ( k = 0, pCut1 =
p->pCuts[1]; k < nCuts1; k++, pCut1++ )
521 if ( (
int)(pCut0->
nLeaves + pCut1->
nLeaves) > nCutSize && Gia_CutCountBits(pCut0->
Sign | pCut1->
Sign) > nCutSize )
524 if ( !Gia_CutMergeOrder(pCut0, pCut1, pCutsR[nCutsR], nCutSize) )
526 if ( Gia_CutSetLastCutIsContained(pCutsR, nCutsR) )
529 if (
p->fCutMin && Gia_CutComputeTruth(
p, pCut0, pCut1, fComp0, fComp1, pCutsR[nCutsR], fIsXor) )
530 pCutsR[nCutsR]->
Sign = Gia_CutGetSign(pCutsR[nCutsR]);
531 pCutsR[nCutsR]->
nTreeLeaves = Gia_CutTreeLeaves(
p, pCutsR[nCutsR] );
532 pCutsR[nCutsR]->
CostF = Gia_CutGetCost(
p, pCutsR[nCutsR] );
533 nCutsR = Gia_CutSetAddCut( pCutsR, nCutsR, nCutNum );
535 p->CutCount[3] += nCutsR;
536 p->nCutsOver += nCutsR == nCutNum-1;
542 printf(
"*** Obj = %4d NumCuts = %4d\n", iObj, nCutsR );
543 for ( i = 0; i < nCutsR; i++ )
544 Gia_CutPrint(
p, iObj, pCutsR[i] );
548 assert( nCutsR > 0 && nCutsR < nCutNum );
549 assert( Gia_CutSetCheckArray(pCutsR, nCutsR) );
551 Gia_StoStoreResult(
p, iObj, pCutsR, nCutsR );
552 if ( nCutsR > 1 || pCutsR[0]->nLeaves > 1 )
553 Gia_CutAddUnit(
p, iObj );
575 p->clkStart = Abc_Clock();
576 p->nCutSize = nCutSize;
577 p->nCutNum = nCutNum;
578 p->fCutMin = fCutMin;
579 p->fTruthMin = fTruthMin;
580 p->fVerbose = fVerbose;
582 p->vRefs = Vec_IntAlloc( Gia_ManObjNum(pGia) );
583 p->vCuts = Vec_WecStart( Gia_ManObjNum(pGia) );
584 p->vTtMem = fCutMin ? Vec_MemAllocForTT( nCutSize, 0 ) : NULL;
589 Vec_IntFree(
p->vRefs );
590 Vec_WecFree(
p->vCuts );
592 Vec_MemHashFree(
p->vTtMem );
594 Vec_MemFree(
p->vTtMem );
599 Gia_CutAddZero(
p, iObj );
603 Gia_CutAddUnit(
p, iObj );
612 assert( iObj == Vec_IntSize(
p->vRefs) );
613 Vec_IntPush(
p->vRefs, 0 );
614 if ( Gia_ObjIsAnd(pObj) )
616 Vec_IntAddToEntry(
p->vRefs, Gia_ObjFaninId0(pObj, iObj), 1 );
617 Vec_IntAddToEntry(
p->vRefs, Gia_ObjFaninId1(pObj, iObj), 1 );
619 else if ( Gia_ObjIsCo(pObj) )
620 Vec_IntAddToEntry(
p->vRefs, Gia_ObjFaninId0(pObj, iObj), 1 );
644 printf(
"Running cut computation with CutSize = %d CutNum = %d CutMin = %s TruthMin = %s\n",
645 p->nCutSize,
p->nCutNum,
p->fCutMin ?
"yes":
"no",
p->fTruthMin ?
"yes":
"no" );
646 printf(
"CutPair = %.0f ",
p->CutCount[0] );
647 printf(
"Merge = %.0f (%.2f %%) ",
p->CutCount[1], 100.0*
p->CutCount[1]/
p->CutCount[0] );
648 printf(
"Eval = %.0f (%.2f %%) ",
p->CutCount[2], 100.0*
p->CutCount[2]/
p->CutCount[0] );
649 printf(
"Cut = %.0f (%.2f %%) ",
p->CutCount[3], 100.0*
p->CutCount[3]/
p->CutCount[0] );
650 printf(
"Cut/Node = %.2f ",
p->CutCount[3] / Gia_ManAndNum(
p->pGia) );
652 printf(
"The number of nodes with cut count over the limit (%d cuts) = %d nodes (out of %d). ",
653 p->nCutNum,
p->nCutsOver, Gia_ManAndNum(pGia) );
654 Abc_PrintTime( 0,
"Time", Abc_Clock() -
p->clkStart );
673 Vec_Int_t * vThis = Vec_WecEntry( vCuts, iObj );
674 int i, v, * pCut, * pList = Vec_IntArray( vThis );
677 Vec_IntClear( vCut );
680 if ( pCut[0] < nCutSizeMin )
682 for ( v = 0; v <= pCut[0]; v++ )
683 Vec_IntPush( vCut, pCut[v] );
690 Vec_Wec_t * vCutsSel = Vec_WecStart( nCuts );
691 int i; srand( time(NULL) );
692 for ( i = 0; i < nCuts; i++ )
693 while ( !
Gia_StoSelectOneCut(vCuts, (rand() | (rand() << 15)) % Vec_WecSize(vCuts), Vec_WecEntry(vCutsSel, i), nCutSizeMin) );
698 int nCutSize = nCutSize0;
702 int fVerbose = fVerbose0;
719 printf(
"Running cut computation with CutSize = %d CutNum = %d CutMin = %s TruthMin = %s\n",
720 p->nCutSize,
p->nCutNum,
p->fCutMin ?
"yes":
"no",
p->fTruthMin ?
"yes":
"no" );
721 printf(
"CutPair = %.0f ",
p->CutCount[0] );
722 printf(
"Merge = %.0f (%.2f %%) ",
p->CutCount[1], 100.0*
p->CutCount[1]/
p->CutCount[0] );
723 printf(
"Eval = %.0f (%.2f %%) ",
p->CutCount[2], 100.0*
p->CutCount[2]/
p->CutCount[0] );
724 printf(
"Cut = %.0f (%.2f %%) ",
p->CutCount[3], 100.0*
p->CutCount[3]/
p->CutCount[0] );
725 printf(
"Cut/Node = %.2f ",
p->CutCount[3] / Gia_ManAndNum(
p->pGia) );
727 printf(
"The number of nodes with cut count over the limit (%d cuts) = %d nodes (out of %d). ",
728 p->nCutNum,
p->nCutsOver, Gia_ManAndNum(pGia) );
729 Abc_PrintTime( 0,
"Time", Abc_Clock() -
p->clkStart );
738 Vec_Wec_t * vWins = Vec_WecStart( Gia_ManObjNum(pGia) );
743 Vec_IntPush( Vec_WecEntry(vWins, Obj), i );
746 Vec_Int_t * vWin = Vec_WecEntry(vWins, Obj);
747 Vec_Int_t * vWin0 = Vec_WecEntry(vWins, Gia_ObjFaninId0(pObj, Obj));
748 Vec_Int_t * vWin1 = Vec_WecEntry(vWins, Gia_ObjFaninId1(pObj, Obj));
749 Vec_IntTwoFindCommon( vWin0, vWin1, vTemp );
752 Vec_IntPushUniqueOrder( vWin, Cut );
753 Vec_IntPush( Vec_WecEntry(vCuts, Cut), Obj );
756 Vec_WecFree( vWins );
757 Vec_IntFree( vTemp );
764 int nInputs = Vec_IntEntry(vCut, 0);
765 printf(
"Cut %5d : ", i );
766 printf(
"Supp = %d ", nInputs );
767 printf(
"Nodes = %d ", Vec_IntSize(vCut) - 1 - nInputs );
769 printf(
"%d ", Obj );
772 printf(
"%d ", Obj );
778 Vec_Int_t * vCut;
int i, nInputs = 0, nNodes = 0;
781 nInputs += Vec_IntEntry(vCut, 0);
782 nNodes += Vec_IntSize(vCut) - 1 - Vec_IntEntry(vCut, 0);
784 printf(
"Computed %d windows with average support %.3f and average volume %.3f.\n",
785 Vec_WecSize(vCuts), 1.0*nInputs/Vec_WecSize(vCuts), 1.0*nNodes/Vec_WecSize(vCuts) );
796 Vec_WecFree( vCutsSel );
797 Abc_PrintTime( 0,
"Creating windows", Abc_Clock() - clk );
815 for ( v = 1; v <= pCut[0]; v++ )
816 printf(
" %d", pCut[v] );
822 printf(
"Cuts of node %d (size = %d):\n", iObj, nCutSize );
824 if ( !nCutSize || pCut[0] == nCutSize )
829 abctime clkStart = Abc_Clock();
830 Vec_Wec_t * vCutsSel = Vec_WecAlloc( nCuts );
831 Vec_Int_t * vLevel, * vCut = Vec_IntAlloc( 10 );
832 Vec_Wec_t * vCuts = Vec_WecAlloc( 1000 );
836 int v, k, * pCut, Value;
842 for ( v = 1; v <= pCut[0]; v++ )
848 Vec_IntClear( vCut );
849 Vec_IntPushArray( vCut, pCut+1, pCut[0] );
850 Value = Hsh_VecManAdd(
p, vCut );
851 if ( Value == Vec_WecSize(vCuts) )
853 Vec_Int_t * vTemp = Vec_WecPushLevel(vCuts);
854 Vec_IntPush( vTemp, 0 );
855 Vec_IntAppend( vTemp, vCut );
857 Vec_IntAddToEntry( Vec_WecEntry(vCuts, Value), 0, 1 );
860 printf(
"Collected cuts = %d.\n", Vec_WecSize(vCuts) );
861 for ( s = 3; s <= nCutSize; s++ )
863 if ( Vec_IntSize(vLevel) - 1 == s )
865 int * pCut = Vec_IntEntryP(vLevel, 1);
867 for ( u = 0; u < s; u++ )
869 Vec_IntClear( vCut );
870 for ( v = 0; v < s; v++ )
if ( v != u )
871 Vec_IntPush( vCut, pCut[v] );
872 assert( Vec_IntSize(vCut) == s-1 );
873 Value = Hsh_VecManAdd(
p, vCut );
874 if ( Value < Vec_WecSize(vCuts) )
875 Vec_IntAddToEntry( vLevel, 0, Vec_IntEntry(Vec_WecEntry(vCuts, Value), 0) );
881 Vec_WecSortByFirstInt( vCuts, 1 );
883 Vec_IntAppend( Vec_WecPushLevel(vCutsSel), vLevel );
884 Abc_PrintTime( 0,
"Cut filtering time", Abc_Clock() - clkStart );
889 int i, iObj, nRefs = 0;
891 nRefs += Gia_ObjRefNumId(pGia, iObj);
897 Vec_WrdFreeP( &pGia->
vSimsPi );
898 pGia->
vSimsPi = Vec_WrdStartTruthTables( Gia_ManCiNum(pGia) );
904 int nWords = Vec_WrdSize(pGia->
vSimsPi) / Gia_ManCiNum(pGia);
905 int i, w, iObj, Res = 0, Pres[256] = {0}, nMints = 1 << Vec_IntSize(vLevel);
906 for ( w = 0; w < 64*
nWords; w++ )
910 if ( Abc_TtGetBit( Vec_WrdEntryP(vSims, iObj*
nWords), w ) )
914 for ( i = 0; i < nMints; i++ )
924 Vec_IntSort( vIns, 0 );
926 Vec_IntPush( vRes, 0 );
927 Vec_IntAppend( vRes, vIns );
932 Gia_ObjSetTravIdCurrent(
p, pObj );
935 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
937 else if ( Gia_ObjIsTravIdCurrent(
p, Gia_ObjFanin0(pObj)) && Gia_ObjIsTravIdCurrent(
p, Gia_ObjFanin1(pObj)) )
939 if ( !Gia_ObjIsTravIdPrevious(
p, pObj) )
940 Vec_IntPush( vRes, i );
941 Gia_ObjSetTravIdCurrent(
p, pObj );
945 Res = Vec_IntSize(vRes);
957 printf(
"Cut %3d ", i );
958 printf(
"Ref = %3d : ", Vec_IntEntry(vLevel, 0) );
960 Vec_IntShift( vLevel, 1 );
964 Vec_IntPrint( vLevel );
965 Vec_IntShift( vLevel, -1 );
967 Vec_WrdFree( vSims );
973 int nCutSize = nCutSize0;
977 int fVerbose = fVerbose0;
994 printf(
"Running cut computation with CutSize = %d CutNum = %d CutMin = %s TruthMin = %s\n",
995 p->nCutSize,
p->nCutNum,
p->fCutMin ?
"yes":
"no",
p->fTruthMin ?
"yes":
"no" );
996 printf(
"CutPair = %.0f ",
p->CutCount[0] );
997 printf(
"Merge = %.0f (%.2f %%) ",
p->CutCount[1], 100.0*
p->CutCount[1]/
p->CutCount[0] );
998 printf(
"Eval = %.0f (%.2f %%) ",
p->CutCount[2], 100.0*
p->CutCount[2]/
p->CutCount[0] );
999 printf(
"Cut = %.0f (%.2f %%) ",
p->CutCount[3], 100.0*
p->CutCount[3]/
p->CutCount[0] );
1000 printf(
"Cut/Node = %.2f ",
p->CutCount[3] / Gia_ManAndNum(
p->pGia) );
1002 printf(
"The number of nodes with cut count over the limit (%d cuts) = %d nodes (out of %d). ",
1003 p->nCutNum,
p->nCutsOver, Gia_ManAndNum(pGia) );
1004 Abc_PrintTime( 0,
"Time", Abc_Clock() -
p->clkStart );
1014 Vec_WecPrint( vCutSel, 0 );
1015 Vec_WecFree( vCutSel );
1032 int nCutSize = nCutSize0;
1033 int nCutNum = nCutNum0;
1036 int fVerbose = fVerbose0;
1052 printf(
"Running cut computation with CutSize = %d CutNum = %d CutMin = %s TruthMin = %s\n",
1053 p->nCutSize,
p->nCutNum,
p->fCutMin ?
"yes":
"no",
p->fTruthMin ?
"yes":
"no" );
1054 printf(
"CutPair = %.0f ",
p->CutCount[0] );
1055 printf(
"Merge = %.0f (%.2f %%) ",
p->CutCount[1], 100.0*
p->CutCount[1]/
p->CutCount[0] );
1056 printf(
"Eval = %.0f (%.2f %%) ",
p->CutCount[2], 100.0*
p->CutCount[2]/
p->CutCount[0] );
1057 printf(
"Cut = %.0f (%.2f %%) ",
p->CutCount[3], 100.0*
p->CutCount[3]/
p->CutCount[0] );
1058 printf(
"Cut/Node = %.2f ",
p->CutCount[3] / Gia_ManAndNum(
p->pGia) );
1060 printf(
"The number of nodes with cut count over the limit (%d cuts) = %d nodes (out of %d). ",
1061 p->nCutNum,
p->nCutsOver, Gia_ManAndNum(pGia) );
1062 Abc_PrintTime( 0,
"Time", Abc_Clock() -
p->clkStart );
1069 Vec_Int_t * vLevel;
int i, j, k, * pCut;
1070 Vec_Int_t * vNodes = Vec_IntAlloc( 100 );
1071 Vec_Wec_t * vCuts = Vec_WecAlloc( 100 );
1072 abctime clkStart = Abc_Clock();
1073 assert( Abc_Truth6WordNum(nCutSize) == Vec_MemEntrySize(vTtMem) );
1076 Sdb_ForEachCut( Vec_IntArray(vLevel), pCut, k )
if ( pCut[0] > 1 )
1078 word * pTruth = Vec_MemReadEntry(
p->vTtMem, Abc_Lit2Var(pCut[pCut[0]+1]) );
1079 int * pSpot = Vec_MemHashLookup( vTtMem, pTruth );
1082 Vec_IntPush( vNodes, i );
1083 vLevel = Vec_WecPushLevel( vCuts );
1084 Vec_IntPush( vLevel, i );
1085 for ( j = 1; j <= pCut[0]; j++ )
1086 Vec_IntPush( vLevel, pCut[j] );
1090 printf(
"Nodes with matching cuts: " );
1091 Vec_IntPrint( vNodes );
1092 if ( Vec_WecSize(vCuts) > 32 )
1093 Vec_WecShrink(vCuts, 32);
1094 Vec_WecPrint( vCuts, 0 );
1095 Vec_WecFree( vCuts );
1096 Vec_IntFree( vNodes );
1099 Abc_PrintTime( 1,
"Cut matching time", Abc_Clock() - clkStart );
1103 Vec_Ptr_t * vRes = Vec_PtrAlloc( Vec_PtrSize(vTtMems) );
1105 Vec_Int_t * vLevel, * vTemp;
int i, k, c, * pCut;
1106 abctime clkStart = Abc_Clock();
1107 for ( i = 0; i < Vec_PtrSize(vTtMems); i++ )
1108 Vec_PtrPush( vRes, Vec_WecAlloc(100) );
1111 Sdb_ForEachCut( Vec_IntArray(vLevel), pCut, k )
if ( pCut[0] > 1 )
1116 word * pTruth = Vec_MemReadEntry(
p->vTtMem, Abc_Lit2Var(pCut[pCut[0]+1]) );
1117 int * pSpot = Vec_MemHashLookup( vTtMem, pTruth );
1120 vTemp = Vec_WecPushLevel( (
Vec_Wec_t *)Vec_PtrEntry(vRes, m) );
1121 Vec_IntPush( vTemp, i );
1122 for ( c = 1; c <= pCut[0]; c++ )
1123 Vec_IntPush( vTemp, pCut[c] );
1130 printf(
"Detected nodes by type: " );
1132 printf(
"Type%d = %d ", i, Vec_WecSize(vCuts) );
1133 Abc_PrintTime( 1,
"Cut matching time", Abc_Clock() - clkStart );
1140 Vec_Int_t * vLevel;
int i, j, k, * pCut;
1141 abctime clkStart = Abc_Clock();
1142 assert( Abc_Truth6WordNum(nCutSize) == Vec_MemEntrySize(vTtMem) );
1143 Vec_Ptr_t * vRes = Vec_PtrAlloc( nFuncs );
1144 for ( i = 0; i < nFuncs; i++ )
1145 Vec_PtrPush( vRes, Vec_WecAlloc(10) );
1148 Sdb_ForEachCut( Vec_IntArray(vLevel), pCut, k )
if ( pCut[0] > 1 )
1150 word * pTruth = Vec_MemReadEntry(
p->vTtMem, Abc_Lit2Var(pCut[pCut[0]+1]) );
1151 assert( (pTruth[0] & 1) == 0 );
1152 int * pSpot = Vec_MemHashLookup( vTtMem, pTruth );
1155 int iFunc = vMap ? Vec_IntEntry( vMap, *pSpot ) : 0;
1156 assert( iFunc < nFuncs );
1158 vLevel = Vec_WecPushLevel( vCuts );
1159 Vec_IntPush( vLevel, i );
1160 for ( j = 1; j <= pCut[0]; j++ )
1161 Vec_IntPush( vLevel, pCut[j] );
1167 Abc_PrintTime( 1,
"Cut matching time", Abc_Clock() - clkStart );
1184 FILE * pFile = fopen(
"input.txt",
"wb" );
if ( !pFile )
return;
1186 Vec_Int_t * vLevel;
int i, k, c, * pCut, nCuts = 0, nNodes = 0;
1188 if ( !Gia_ObjIsAnd(Gia_ManObj(
p, i)) )
1193 fprintf( pFile,
"%d ", i );
1194 for ( c = 1; c <= pCut[0]; c++ )
1195 fprintf( pFile,
"%d ", pCut[c] );
1196 fprintf( pFile,
"1\n" );
1203 fprintf( pFile,
"%d %d 0\n", Gia_ObjId(
p, pObj), Gia_ObjFaninId0p(
p, pObj) );
1208 printf(
"Dumped %d cuts for %d nodes into file \"input.txt\".\n", nCuts, nNodes );
1227 Sdb_ForEachCut( Vec_IntArray(vLevel), pCut, k )
if ( pCut[0] == nCutSize ) {
1228 word * pTruth = Vec_MemReadEntry( pSto->
vTtMem, Abc_Lit2Var(pCut[pCut[0]+1]) );
1229 Vec_WrdPush( vFuncs, pTruth[0] );
1233 printf(
"Collected %d cut functions using the AIG with %d nodes.\n", Vec_WrdSize(vFuncs), Gia_ManAndNum(
p) );
1238 assert( Vec_MemEntryNum(vTtMem) == Vec_IntSize(vMap) );
1239 Vec_Int_t * vClassCounts = Vec_IntStart( nClasses );
int i;
word Func;
1241 int * pSpot = Vec_MemHashLookup( vTtMem, &Func );
1244 int iClass = Vec_IntEntry( vMap, *pSpot );
1247 assert( iClass < Vec_IntSize(vClassCounts) );
1248 Vec_IntAddToEntry( vClassCounts, iClass, 1 );
1250 return vClassCounts;
1254 int * pPerm =
Abc_MergeSortCost( Vec_IntArray(vClassCounts), Vec_IntSize(vClassCounts) );
1255 Vec_Wrd_t * vBest = Vec_WrdAlloc( nNumFuncs );
int i, k, Entry;
1256 Vec_Int_t * vMapNew = Vec_IntStartFull( Vec_IntSize(vMap) );
1257 for ( i = Vec_IntSize(vClassCounts)-1; i >= 0; i-- ) {
1260 if ( Entry != pPerm[i] )
1262 if ( Best > Vec_MemReadEntry(vTtMem, k)[0] )
1263 Best = Vec_MemReadEntry(vTtMem, k)[0];
1264 Vec_IntWriteEntry( vMapNew, k, Vec_WrdSize(vBest) );
1266 Vec_WrdPush( vBest, Best );
1268 if ( Vec_WrdSize(vBest) == nNumFuncs )
1272 Vec_IntFree( vMapNew );
1275 printf(
"Isolated %d (out of %d) most frequently occuring classes.\n", Vec_WrdSize(vBest), Vec_IntSize(vClassCounts) );
1283 word Repr;
int c, i, MaxCount = Vec_IntFindMax( vCounts );
1286 int nSymb = BarSize*Vec_IntEntry(vCounts, c)/Abc_MaxInt(MaxCount, 1);
1287 printf(
"Class%4d : ", c );
1288 printf(
"Count =%6d ", Vec_IntEntry(vCounts, c) );
1289 for ( i = 0; i < nSymb; i++ )
1291 for ( i = nSymb; i < BarSize+3; i++ )
1295 Vec_IntFree( vCounts );
1299 abctime clkStart = Abc_Clock();
1303 Vec_Wrd_t * vOrig = Vec_WrdDup( vFuncs );
1307 Vec_WrdFree( vFuncs );
1310 assert( Vec_WrdSize(vBestReprs) == nNumFuncs );
1311 Vec_IntFree( vClassCounts );
1312 printf(
"Frequency profile for %d most popular classes in the small AIG:\n", nNumFuncs );
1314 Vec_WrdFree( vOrig );
1316 for ( n = 0; n < nNumCones; n++ ) {
1317 int nRand =
Abc_Random( 0 ) % Gia_ManCoNum(pBig);
1320 printf(
"ITER %d: Considering output cone %d with %d and-nodes. ", n+1, nRand, Gia_ManAndNum(pCone) );
1321 printf(
"Profiling %d functions of %d-cuts:\n", Vec_WrdSize(vCutFuncs), nCutSize );
1323 Vec_WrdFree( vCutFuncs );
1326 Vec_WrdFree( vBestReprs );
1327 Vec_IntFree( vMap );
1328 Vec_MemHashFree( vTtMem );
1329 Vec_MemFree( vTtMem );
1330 Abc_PrintTime( 1,
"Total computation time", Abc_Clock() - clkStart );
1347 int nWordsMax = Abc_Truth6WordNum( nVarsMax ),
nWords;
1348 int i, k = 0, nTruths = Vec_WrdSize(vSims) / nWordsMax;
1349 assert( nTruths * nWordsMax == Vec_WrdSize(vSims) );
1351 for ( i = 0; i < nTruths; i++ ) {
1352 word * pTruth = Vec_WrdEntryP( vSims, i * nWordsMax );
1353 int nVarsCur = Abc_TtMinBase( pTruth, NULL, nVarsMax, nVarsMax );
1354 nVars = Abc_MaxInt( nVars, nVarsCur );
1357 nWords = Abc_Truth6WordNum( nVars );
1358 for ( i = 0; i < nTruths; i++ ) {
1359 word * pTruth = Vec_WrdEntryP( vSims, i * nWordsMax );
1360 word * pTruth2 = Vec_WrdEntryP( vSims, k *
nWords );
1361 if ( Abc_TtSupportSize(pTruth, nVars) < 3 )
1367 printf(
"Type%d : ", i );
1372 Vec_WrdShrink ( vSims, k *
nWords );
1378 printf(
"Nodes with matching cuts:\n" );
1381 printf(
"Type %d:\n", i );
1382 Vec_WecPrint( vCuts, 0 );
1385 printf(
"Type %d present in %d cuts\n", i, Vec_WecSize(vCuts) );
1392 Vec_WecFree( vCuts );
1397 abctime clkStart = Abc_Clock();
1399 Vec_Wrd_t * vSimsPi = Vec_WrdStartTruthTables( Gia_ManCiNum(pSmall) );
1402 Vec_WrdFree( vSimsPi );
1404 printf(
"Some output functions have support size more than 10.\n" );
1405 Vec_WrdFree( vSims );
1410 int nFuncs = Vec_WrdSize(vSims) / Abc_Truth6WordNum(nVars);
1411 assert( Vec_WrdSize(vSims) == nFuncs * Abc_Truth6WordNum(nVars) );
1412 Vec_WrdFree( vSims );
1413 printf(
"Using %d output functions with the support size between 3 and %d.\n", nFuncs, nVars );
1415 Vec_MemHashFree( vTtMem );
1416 Vec_MemFree( vTtMem );
1417 Vec_IntFree( vMap );
1420 Abc_PrintTime( 1,
"Total computation time", Abc_Clock() - clkStart );
#define ABC_SWAP(Type, a, b)
int * Abc_MergeSortCost(int *pCosts, int nSize)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
unsigned Abc_Random(int fReset)
#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 ///.
void Dau_CanonicizeArray(Vec_Wrd_t *vFuncs, int nVars, int fVerbose)
Vec_Mem_t * Dau_CollectNpnFunctionsArray(Vec_Wrd_t *vFuncs, int nVars, Vec_Int_t **pvMap, int fVerbose)
void Dau_DsdPrintFromTruth(word *pTruth, int nVarsInit)
void Gia_ManDumpCuts(Gia_Man_t *p, int nCutSize, int nCutNum, int fVerbose)
Vec_Int_t * Gia_ManCountNpnClasses(Vec_Mem_t *vTtMem, Vec_Int_t *vMap, int nClasses, Vec_Wrd_t *vOrig)
Vec_Wec_t * Gia_ManFilterCuts(Gia_Man_t *pGia, Vec_Wec_t *vStore, int nCutSize, int nCuts)
Vec_Ptr_t * Gia_ManMatchCutsMany(Vec_Mem_t *vTtMem, Vec_Int_t *vMap, int nFuncs, Gia_Man_t *pGia, int nCutSize, int nCutNum, int fVerbose)
void Gia_StoComputeCutsConst0(Gia_Sto_t *p, int iObj)
void Gia_ManMatchConesOutputFree(Vec_Ptr_t *p)
#define Sdb_ForEachCut(pList, pCut, i)
void Gia_StoCutPrint(int *pCut)
Vec_Wec_t * Gia_ManSelectCuts(Vec_Wec_t *vCuts, int nCuts, int nCutSizeMin)
Gia_Sto_t * Gia_ManMatchCutsInt(Gia_Man_t *pGia, int nCutSize0, int nCutNum0, int fVerbose0)
Vec_Wrd_t * Gia_ManMatchFilterClasses(Vec_Mem_t *vTtMem, Vec_Int_t *vMap, Vec_Int_t *vClassCounts, int nNumFuncs, int fVerbose)
void Gia_ManExtractTest(Gia_Man_t *pGia)
Vec_Wrd_t * Gia_ManCollectCutFuncs(Gia_Man_t *p, int nCutSize, int nCutNum, int fVerbose)
void Gia_StoFree(Gia_Sto_t *p)
void Gia_ManCreateWins(Gia_Man_t *pGia, Vec_Wec_t *vCuts)
Vec_Wrd_t * Gia_ManGenSims(Gia_Man_t *pGia)
void Gia_StoPrintCuts(Vec_Int_t *vThis, int iObj, int nCutSize)
void Gia_ManExploreCutsTest(Gia_Man_t *pGia, int nCutSize0, int nCuts0, int fVerbose0)
void Gia_ManMatchConesOutput(Gia_Man_t *pBig, Gia_Man_t *pSmall, int nCutNum, int fVerbose)
void Gia_StoComputeCutsCi(Gia_Sto_t *p, int iObj)
struct Gia_Cut_t_ Gia_Cut_t
void Gia_StoComputeCuts(Gia_Man_t *pGia)
void Gia_ManMatchProfileFunctions(Vec_Wrd_t *vBestReprs, Vec_Mem_t *vTtMem, Vec_Int_t *vMap, Vec_Wrd_t *vFuncs, int nCutSize)
Vec_Ptr_t * Gia_ManMatchCutsArray(Vec_Ptr_t *vTtMems, Gia_Man_t *pGia, int nCutSize, int nCutNum, int fVerbose)
int Gia_ManCollectCutDivs(Gia_Man_t *p, Vec_Int_t *vIns)
int Gia_ManFindSatDcs(Gia_Man_t *pGia, Vec_Wrd_t *vSims, Vec_Int_t *vLevel)
void Gia_ManMatchCuts(Vec_Mem_t *vTtMem, Gia_Man_t *pGia, int nCutSize, int nCutNum, int fVerbose)
int Gia_StoSelectOneCut(Vec_Wec_t *vCuts, int iObj, Vec_Int_t *vCut, int nCutSizeMin)
int Gia_ManCountRefs(Gia_Man_t *pGia, Vec_Int_t *vLevel)
#define GIA_MAX_CUTSIZE
DECLARATIONS ///.
struct Gia_Sto_t_ Gia_Sto_t
void Gia_StoComputeCutsNode(Gia_Sto_t *p, int iObj)
Vec_Wec_t * Gia_ManExtractCuts(Gia_Man_t *pGia, int nCutSize0, int nCuts0, int fVerbose0)
Vec_Wec_t * Gia_ManExploreCuts(Gia_Man_t *pGia, int nCutSize0, int nCuts0, int fVerbose0)
void Gia_StoRefObj(Gia_Sto_t *p, int iObj)
void Gia_ManConsiderCuts(Gia_Man_t *pGia, Vec_Wec_t *vCuts)
int Gia_ManMatchConesMinimizeTts(Vec_Wrd_t *vSims, int nVarsMax)
void Gia_ManPrintWinStats(Vec_Wec_t *vCuts)
void Gia_StoMergeCuts(Gia_Sto_t *p, int iObj)
Gia_Sto_t * Gia_StoAlloc(Gia_Man_t *pGia, int nCutSize, int nCutNum, int fCutMin, int fTruthMin, int fVerbose)
void Gia_ManMatchConesOutputPrint(Vec_Ptr_t *p, int fVerbose)
void Gia_ManPrintWins(Vec_Wec_t *vCuts)
void Gia_ManMatchCones(Gia_Man_t *pBig, Gia_Man_t *pSmall, int nCutSize, int nCutNum, int nNumFuncs, int nNumCones, int fVerbose)
Vec_Wec_t * Gia_ManExtractCuts2(Gia_Man_t *p, int nCutSize, int nCuts, int fVerbose)
void Gia_ManStop(Gia_Man_t *p)
Vec_Wrd_t * Gia_ManSimPatSimOut(Gia_Man_t *pGia, Vec_Wrd_t *vSimsPi, int fOuts)
#define Gia_ManForEachAnd(p, pObj, i)
struct Gia_Obj_t_ Gia_Obj_t
struct Gia_Man_t_ Gia_Man_t
Vec_Wrd_t * Gia_ManSimPatSim(Gia_Man_t *p)
#define Gia_ManForEachObjVec(vVec, p, pObj, i)
Gia_Man_t * Gia_ManDupCones(Gia_Man_t *p, int *pPos, int nPos, int fTrimPis)
void Gia_ManCreateRefs(Gia_Man_t *p)
void Gia_ManIncrementTravId(Gia_Man_t *p)
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachCiId(p, Id, i)
unsigned __int64 word
DECLARATIONS ///.
int pLeaves[GIA_MAX_CUTSIZE]
Gia_Cut_t pCuts[3][GIA_MAX_CUTNUM]
Gia_Cut_t * ppCuts[GIA_MAX_CUTNUM]
typedefABC_NAMESPACE_IMPL_START struct Vec_Mem_t_ Vec_Mem_t
DECLARATIONS ///.
struct Hsh_VecMan_t_ Hsh_VecMan_t
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryStartStop(vVec, Entry, i, Start, Stop)
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
#define Vec_WecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.
#define Vec_WecForEachLevelStop(vGlob, vVec, i, LevelStop)
#define Vec_WrdForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.