32#define TREE_MAX_VARS 16
67 pSto->
pMem = Abc_TtDup( pSto->
pMem,
p->nOuts*Abc_TtWordNum(
p->nIns), 0 );
71 Vec_IntPush( pSto->
vCofs+i, Obj );
86 nNodes +=
p->nNodes[i];
93 for ( i =
p->nIns-1; i >= 0; i-- )
94 printf(
"Level %2d Var %2d : %s Nodes = %3d Cofs = %3d\n",
95 i,
p->pIPerm[i],
p->pTried[i]?
"*":
" ",
p->nNodes[i], Vec_IntSize(
p->vCofs+i) );
116 int nWords = Abc_TtWordNum(iVar);
118 if ( Abc_TtEqual( pSto->
pMem + Obj, pCof,
nWords ) )
120 Vec_IntPush( pSto->
vCofs+iVar, pCof - pSto->
pMem );
127 Vec_IntPush( pSto->
vCofs+iVar, Truth );
133 int k, Obj, nNodes = 0;
135 Vec_IntClear( pSto->
vCofs+iVar );
138 int nWords = Abc_TtWordNum(iVar);
144 if ( Abc_TtEqual( pCof0, pCof1,
nWords ) )
154 unsigned Cof0 = iVar < 5 ? Abc_Tt5Cofactor0( Obj, iVar ) : (unsigned) pSto->
pMem[Obj];
155 unsigned Cof1 = iVar < 5 ? Abc_Tt5Cofactor1( Obj, iVar ) : (unsigned)(pSto->
pMem[Obj] >> 32);
173 pSto->
pMem = Abc_TtDup(pTruths, nOuts*
nWords, 0);
176 for ( i = 0; i < nIns; i++ )
178 for ( i = 0; i < nOuts; i++ )
180 for ( i = nIns-1; i >= 0; i-- )
207 assert( i >= 0 && i < pSto->nIns-1 );
208 for ( o = 0; o < pSto->
nOuts; o++ )
210 for ( v = 5; v > i+1; v-- )
228 for ( v = nIns-2; v >= 0; v-- )
231 if ( fMoveMore ? nNodesMin >= nNodesCur : nNodesMin > nNodesCur )
233 nNodesMin = nNodesCur;
237 printf(
"Level %2d -> %2d : Nodes = %4d. ", v+1, v, nNodesCur );
242 assert( vBest != nIns-1 );
245 printf(
"Best level = %d. Best nodes = %d.\n", vBest, nNodesMin );
247 *pnNodesMin = nNodesMin;
253 for ( v = nIns-1; v >= 0; v-- )
254 printf(
"Level = %2d : Var = %2d Tried = %2d\n", v, pIPerm[v], pTried[v] );
263 int v, r,
Pos, nNodesPrev = -1, nNodesMin = 0, nNoChange = 0;
264 int nNodesBeg, nNodesEnd;
266 for ( v = 0; v < nIns; v++ )
273 for ( v = 0; v < nIns; v++ )
277 for ( o = 0; o < nOuts; o++ )
278 Abc_TtSwapVars( pTruths + o*
nWords, nIns, v, vRand );
279 ABC_SWAP(
int, pIPerm[vRand], pIPerm[v] );
281 for ( r = 0; r < 10*nIns; r++ )
283 nNodesPrev = nNodesMin;
285 printf(
"\nRound %d:\n", r );
289 for ( v = nIns-2; v >=
Pos; v-- )
291 ABC_SWAP(
int, pTried[v+1], pTried[v] );
292 ABC_SWAP(
int, pIPerm[v+1], pIPerm[v] );
296 nNoChange = nNodesPrev == nNodesMin ? nNoChange + 1 : 0;
297 if ( nNoChange == 4 )
304 printf(
"Nodes %5d -> %5d. ", nNodesBeg, nNodesEnd );
308 memcpy( pIPermOut, pIPerm,
sizeof(
int)*nIns );
314 word * pTruthDup = Abc_TtDup( pTruths, nOuts*
nWords, 0 );
318 for ( r = 0; r < 100; r++ )
321 Abc_TtCopy( pTruthDup, pTruths, nOuts*
nWords, 0 );
324 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
338#define TT_UNDEF ABC_CONST(0x1234567887654321)
342 word uF0, uF1, uR0, uR1, uRes0, uRes1, uRes2;
int i,
Var;
353 if ( Abc_Tt6HasVar( uF,
Var ) || Abc_Tt6HasVar( uR,
Var ) )
358 if ( !(uF & ~uRes2) && !(uRes2 & uR) )
362 uF0 = Abc_Tt6Cofactor0( uF,
Var );
363 uF1 = Abc_Tt6Cofactor1( uF,
Var );
364 uR0 = Abc_Tt6Cofactor0( uR,
Var );
365 uR1 = Abc_Tt6Cofactor1( uR,
Var );
366 uRes0 = Abc_Tt6Min_rec( uF0, uR0,
Var, vNodes );
367 uRes1 = Abc_Tt6Min_rec( uF1, uR1,
Var, vNodes );
374 if ( uRes0 == uRes1 )
382 uRes2 = (uRes0 & s_Truths6Neg[
Var]) | (uRes1 & s_Truths6[
Var]);
386 Vec_WrdPush( vNodes, uRes2 );
391 int i, Entry,
nWords = Abc_TtWordNum(nVars);
392 word * pRes0, * pRes1, * pRes2 = Vec_WrdFetch( vMemory,
nWords );
395 pRes2[0] = Abc_Tt6Min_rec( pF[0], pR[0], nVars, vNodes );
399 if ( Abc_TtIsConst0(pF,
nWords) && Abc_TtIsConst0(pR,
nWords) )
401 if ( Abc_TtIsConst0(pF,
nWords) && Abc_TtIsConst1(pR,
nWords) )
403 Abc_TtClear( pRes2,
nWords );
406 if ( Abc_TtIsConst1(pF,
nWords) && Abc_TtIsConst0(pR,
nWords) )
408 Abc_TtFill( pRes2,
nWords );
412 if ( !Abc_TtHasVar( pF, nVars, nVars-1 ) && !Abc_TtHasVar( pR, nVars, nVars-1 ) )
414 pRes0 =
Abc_TtMin_rec( pF, pR, nVars-1, vMemory, vNodes, vNodes2 );
415 Abc_TtCopy( pRes2, pRes0,
nWords, 0 );
421 Vec_Int_t * vLayer = Vec_WecEntry( vNodes2, nVars );
424 word * pTemp = Vec_WrdEntryP( vMemory, Entry );
425 if ( !Abc_TtIntersect(pTemp, pF, 2*
nWords, 1) && !Abc_TtIntersect(pTemp, pR, 2*
nWords, 0) )
437 pRes0 =
Abc_TtMin_rec( pF, pR, nVars-1, vMemory, vNodes, vNodes2 );
439 if ( pRes0 == NULL && pRes1 == NULL )
441 if ( pRes0 == NULL || pRes1 == NULL || Abc_TtEqual(pRes0, pRes1,
nWords) )
443 Abc_TtCopy( pRes2, pRes0 ? pRes0 : pRes1,
nWords, 0 );
444 Abc_TtCopy( pRes2 +
nWords, pRes0 ? pRes0 : pRes1,
nWords, 0 );
447 Abc_TtCopy( pRes2, pRes0,
nWords, 0 );
452 Vec_WecPush( vNodes2, nVars, pRes2 - Vec_WrdArray(vMemory) );
458 int i,
nWords = Abc_TtWordNum(nVars);
459 assert( nVars >= 0 && nVars <= 16 );
460 for ( i = nVars; i < 6; i++ )
461 assert( !Abc_Tt6HasVar(pF[0], i) && !Abc_Tt6HasVar(pR[0], i) );
462 Vec_WrdClear( vMemory );
463 Vec_WrdGrow( vMemory, 1 << 20 );
464 pResult =
Abc_TtMin_rec( pF, pR, nVars, vMemory, vNodes, vNodes2 );
465 if ( pResult == NULL )
467 Vec_WrdFill( vMemory,
nWords, 0 );
468 return Vec_WrdArray( vMemory );
471 Abc_TtCopy( Vec_WrdArray(vMemory), pResult,
nWords, 0 );
472 Vec_WrdShrink( vMemory,
nWords );
473 return Vec_WrdArray(vMemory);
477 int o, i,
nWords = Abc_TtWordNum(nVars);
479 Vec_Wrd_t * vMemory = Vec_WrdAlloc( 100 );
480 Vec_Wrd_t * vNodes = Vec_WrdAlloc( 100 );
481 Vec_Wec_t * vNodes2 = Vec_WecStart( nVars+1 );
482 Vec_WrdGrow( vMemory, 1 << 20 );
483 for ( o = 0; o < nOuts/2; o++ )
487 for ( i = nVars; i < 6; i++ )
488 assert( !Abc_Tt6HasVar(pF[0], i) && !Abc_Tt6HasVar(pR[0], i) );
489 pRes =
Abc_TtMin_rec( pF, pR, nVars, vMemory, vNodes, vNodes2 );
490 if ( pResult == NULL )
496 printf(
"Nodes = %5d. Nodes2 = %5d. Total = %5d. ",
497 Vec_WrdSize(vNodes), Vec_WecSizeSize(vNodes2), Vec_WrdSize(vNodes) + Vec_WecSizeSize(vNodes2) );
500 *pnNodes = Vec_WrdSize(vNodes) + Vec_WecSizeSize(vNodes2);
501 Vec_WrdFree( vMemory );
502 Vec_WrdFree( vNodes );
503 Vec_WecFree( vNodes2 );
520 word uF0, uF1, uC0, uC1, uRes0, uRes1, uRes2;
int i,
Var, iLit0, iLit1;
540 if ( !((uF ^ uRes2) & uC) )
542 *piLit = (unsigned)iLit;
545 else if ( !((uF ^ ~uRes2) & uC) )
547 *piLit = Abc_LitNot( (
unsigned)iLit );
552 if ( Abc_Tt6HasVar( uF,
Var ) )
555 uC = Abc_Tt6Cofactor0(uC,
Var) | Abc_Tt6Cofactor1(uC,
Var);
557 uF0 = Abc_Tt6Cofactor0( uF,
Var );
558 uF1 = Abc_Tt6Cofactor1( uF,
Var );
559 uC0 = Abc_Tt6Cofactor0( uC,
Var );
560 uC1 = Abc_Tt6Cofactor1( uC,
Var );
561 uRes0 = Abc_TtSimple6Min_rec(
p, uF0, uC0,
Var, vNodes, &iLit0, pPerm );
562 uRes1 = Abc_TtSimple6Min_rec(
p, uF1, uC1,
Var, vNodes, &iLit1, pPerm );
563 if ( uRes0 == uRes1 )
568 uRes2 = (uRes0 & s_Truths6Neg[
Var]) | (uRes1 & s_Truths6[
Var]);
571 if ( !(uRes0 & ~uRes1) )
574 else if ( !(uRes1 & ~uRes0) )
578 assert( !(uFC & ~uRes2) );
581 Vec_WrdPushTwo( vNodes, uRes2, (
word)*piLit );
586 int i, Entry,
Var, iLit0, iLit1,
nWords = Abc_TtWordNum(nVars);
587 word * pRes0, * pRes1, * pRes2 = Vec_WrdFetch( vMemory,
nWords );
591 pRes2[0] = Abc_TtSimple6Min_rec(
p, pF[0], pC[0], nVars, vNodes, piLit, pPerm );
594 if ( !Abc_TtIntersect(pF, pC,
nWords, 0) )
597 Abc_TtClear( pRes2,
nWords );
600 if ( !Abc_TtIntersect(pF, pC,
nWords, 1) )
603 Abc_TtFill( pRes2,
nWords );
607 if ( !Abc_TtHasVar( pF, nVars, nVars-1 ) )
612 Abc_TtCopy( pRes2, pRes0,
nWords, 0 );
618 Vec_Int_t * vLayer = Vec_WecEntry( vNodes2, nVars );
int iLit;
621 word * pTemp = Vec_WrdEntryP( vMemory, Entry );
622 if ( Abc_TtEqualCare(pTemp, pF, pC, 0, 2*
nWords) )
627 else if ( Abc_TtEqualCare(pTemp, pF, pC, 1, 2*
nWords) )
629 *piLit = Abc_LitNot(iLit);
630 Abc_TtCopy( pRes2, pTemp, 2*
nWords, 1 );
638 if ( Abc_TtEqual(pRes0, pRes1,
nWords) )
641 Abc_TtCopy( pRes2, pRes0,
nWords, 0 );
645 Abc_TtCopy( pRes2, pRes0,
nWords, 0 );
647 Var = pPerm ? pPerm[nVars-1] : nVars-1;
649 if ( !Abc_TtIntersect(pRes1, pRes0,
nWords, 1) )
652 else if ( !Abc_TtIntersect(pRes0, pRes1,
nWords, 1) )
659 Vec_Int_t * vLayer = Vec_WecEntry( vNodes2, nVars );
660 Vec_IntPushTwo( vLayer, pRes2 - Vec_WrdArray(vMemory), *piLit );
667 int o, i, iLit,
nWords = Abc_TtWordNum(nVars);
670 Vec_Wrd_t * vMemory = Vec_WrdAlloc( 100 );
671 Vec_Wrd_t * vNodes = Vec_WrdAlloc( 100 );
672 Vec_Wec_t * vNodes2 = Vec_WecStart( nVars+1 );
673 Vec_WrdGrow( vMemory, 1 << 20 );
675 pNew->
pName = Abc_UtilStrsav(
"muxes" );
676 for ( i = 0; i < nVars; i++ )
677 Gia_ManAppendCi(pNew);
680 for ( o = 0; o < nOuts; o++ )
684 for ( i = nVars; i < 6; i++ )
685 assert( !Abc_Tt6HasVar(pTruth[0], i) && !Abc_Tt6HasVar(pCare[0], i) );
686 Abc_TtSimpleMin_rec( pNew, pTruth, pCare, nVars, vMemory, vNodes, vNodes2, &iLit, pIPerm );
687 Gia_ManAppendCo( pNew, iLit );
690 printf(
"Nodes = %5d. Nodes2 = %5d. Total = %5d. ",
691 Vec_WrdSize(vNodes), Vec_WecSizeSize(vNodes2), Vec_WrdSize(vNodes) + Vec_WecSizeSize(vNodes2) );
694 *pnNodes = Vec_WrdSize(vNodes) + Vec_WecSizeSize(vNodes2);
695 Vec_WrdFree( vMemory );
696 Vec_WrdFree( vNodes );
697 Vec_WecFree( vNodes2 );
722 word uF0, uF1, uR0, uR1, uRes0, uRes1, uRes2;
int i,
Var, iLit0, iLit1;
740 if ( Abc_Tt6HasVar( uF,
Var ) || Abc_Tt6HasVar( uR,
Var ) )
747 if ( !(uF & ~uRes2) && !(uRes2 & uR) )
749 *piLit = (unsigned)iLit;
752 else if ( !(uF & uRes2) && !(~uRes2 & uR) )
754 *piLit = Abc_LitNot( (
unsigned)iLit );
758 uF0 = Abc_Tt6Cofactor0( uF,
Var );
759 uF1 = Abc_Tt6Cofactor1( uF,
Var );
760 uR0 = Abc_Tt6Cofactor0( uR,
Var );
761 uR1 = Abc_Tt6Cofactor1( uR,
Var );
762 uRes0 = Abc_TtGia6Min_rec(
p, uF0, uR0,
Var, vNodes, &iLit0, pPerm );
763 uRes1 = Abc_TtGia6Min_rec(
p, uF1, uR1,
Var, vNodes, &iLit1, pPerm );
771 if ( uRes1 ==
TT_UNDEF || uRes0 == uRes1 )
782 uRes2 = (uRes0 & s_Truths6Neg[
Var]) | (uRes1 & s_Truths6[
Var]);
784 if ( !(uRes0 & ~uRes1) )
786 else if ( !(uRes1 & ~uRes0) )
793 Vec_WrdPushTwo( vNodes, uRes2, (
word)*piLit );
798 int i, Entry,
Var, iLit0, iLit1,
nWords = Abc_TtWordNum(nVars);
799 word * pRes0, * pRes1, * pRes2 = Vec_WrdFetch( vMemory,
nWords );
803 pRes2[0] = Abc_TtGia6Min_rec(
p, pF[0], pR[0], nVars, vNodes, piLit, pPerm );
807 if ( Abc_TtIsConst0(pF,
nWords) && Abc_TtIsConst0(pR,
nWords) )
809 if ( Abc_TtIsConst0(pF,
nWords) && Abc_TtIsConst1(pR,
nWords) )
812 Abc_TtClear( pRes2,
nWords );
815 if ( Abc_TtIsConst1(pF,
nWords) && Abc_TtIsConst0(pR,
nWords) )
818 Abc_TtFill( pRes2,
nWords );
822 if ( !Abc_TtHasVar( pF, nVars, nVars-1 ) && !Abc_TtHasVar( pR, nVars, nVars-1 ) )
824 pRes0 =
Abc_TtGiaMin_rec(
p, pF, pR, nVars-1, vMemory, vNodes, vNodes2, piLit, pPerm );
825 Abc_TtCopy( pRes2, pRes0,
nWords, 0 );
831 Vec_Int_t * vLayer = Vec_WecEntry( vNodes2, nVars );
int iLit;
834 word * pTemp = Vec_WrdEntryP( vMemory, Entry );
835 if ( !Abc_TtIntersect(pTemp, pF, 2*
nWords, 1) && !Abc_TtIntersect(pTemp, pR, 2*
nWords, 0) )
840 else if ( !Abc_TtIntersect(pTemp, pF, 2*
nWords, 0) && !Abc_TtIntersect(pTemp, pR, 2*
nWords, 1) )
842 *piLit = Abc_LitNot(iLit);
843 Abc_TtCopy( pRes2, pTemp, 2*
nWords, 1 );
870 pRes0 =
Abc_TtGiaMin_rec(
p, pF, pR, nVars-1, vMemory, vNodes, vNodes2, &iLit0, pPerm );
872 if ( pRes0 == NULL && pRes1 == NULL )
874 if ( pRes0 == NULL || pRes1 == NULL || Abc_TtEqual(pRes0, pRes1,
nWords) )
876 *piLit = pRes0 ? iLit0 : iLit1;
877 Abc_TtCopy( pRes2, pRes0 ? pRes0 : pRes1,
nWords, 0 );
878 Abc_TtCopy( pRes2 +
nWords, pRes0 ? pRes0 : pRes1,
nWords, 0 );
881 Abc_TtCopy( pRes2, pRes0,
nWords, 0 );
883 Var = pPerm ? pPerm[nVars-1] : nVars-1;
884 if ( !Abc_TtIntersect(pRes1, pRes0,
nWords, 1) )
886 else if ( !Abc_TtIntersect(pRes0, pRes1,
nWords, 1) )
894 Vec_Int_t * vLayer = Vec_WecEntry( vNodes2, nVars );
895 Vec_IntPushTwo( vLayer, pRes2 - Vec_WrdArray(vMemory), *piLit );
902 int o, i, iLit,
nWords = Abc_TtWordNum(nVars);
904 Vec_Wrd_t * vMemory = Vec_WrdAlloc( 100 );
905 Vec_Wrd_t * vNodes = Vec_WrdAlloc( 100 );
906 Vec_Wec_t * vNodes2 = Vec_WecStart( nVars+1 );
907 Vec_WrdGrow( vMemory, 1 << 20 );
909 pNew->
pName = Abc_UtilStrsav(
"muxes" );
910 for ( i = 0; i < nVars; i++ )
911 Gia_ManAppendCi(pNew);
914 for ( o = 0; o < nOuts/2; o++ )
918 for ( i = nVars; i < 6; i++ )
919 assert( !Abc_Tt6HasVar(pF[0], i) && !Abc_Tt6HasVar(pR[0], i) );
920 pRes =
Abc_TtGiaMin_rec( pNew, pF, pR, nVars, vMemory, vNodes, vNodes2, &iLit, pIPerm );
921 if ( pResult == NULL )
924 Gia_ManAppendCo( pNew, 0 );
929 Gia_ManAppendCo( pNew, iLit );
933 printf(
"Nodes = %5d. Nodes2 = %5d. Total = %5d. ",
934 Vec_WrdSize(vNodes), Vec_WecSizeSize(vNodes2), Vec_WrdSize(vNodes) + Vec_WecSizeSize(vNodes2) );
937 *pnNodes = Vec_WrdSize(vNodes) + Vec_WecSizeSize(vNodes2);
938 Vec_WrdFree( vMemory );
939 Vec_WrdFree( vNodes );
940 Vec_WecFree( vNodes2 );
951 int o, i, iLit,
nWords = Abc_TtWordNum(nVars);
954 Vec_Wrd_t * vMemory = Vec_WrdAlloc( 100 );
955 Vec_Wrd_t * vNodes = Vec_WrdAlloc( 100 );
956 Vec_Wec_t * vNodes2 = Vec_WecStart( nVars+1 );
957 Vec_WrdGrow( vMemory, 1 << 20 );
959 pNew->
pName = Abc_UtilStrsav(
"muxes" );
960 for ( i = 0; i < nVars; i++ )
961 Gia_ManAppendCi(pNew);
964 for ( o = 0; o < nOuts; o++ )
968 Abc_TtAnd( pF, pCare, pTruth,
nWords, 0 );
969 Abc_TtSharp( pR, pCare, pTruth,
nWords );
970 for ( i = nVars; i < 6; i++ )
971 assert( !Abc_Tt6HasVar(pF[0], i) && !Abc_Tt6HasVar(pR[0], i) );
972 Abc_TtGiaMin_rec( pNew, pF, pR, nVars, vMemory, vNodes, vNodes2, &iLit, pIPerm );
973 Gia_ManAppendCo( pNew, iLit );
976 printf(
"Nodes = %5d. Nodes2 = %5d. Total = %5d. ",
977 Vec_WrdSize(vNodes), Vec_WecSizeSize(vNodes2), Vec_WrdSize(vNodes) + Vec_WecSizeSize(vNodes2) );
980 *pnNodes = Vec_WrdSize(vNodes) + Vec_WecSizeSize(vNodes2);
981 Vec_WrdFree( vMemory );
982 Vec_WrdFree( vNodes );
983 Vec_WecFree( vNodes2 );
1007 int iLit0, iLit1,
Var;
1015 if ( Abc_Tt6HasVar( t,
Var ) )
1021 return Gia_ManAppendMux(
p, Abc_Var2Lit(1+
Var, 0), iLit1, iLit0 );
1025 int iLit0, iLit1,
Var,
nWords = Abc_TtWordNum(nVars);
1028 if ( Abc_TtIsConst0(pTruth,
nWords) )
1030 if ( Abc_TtIsConst1(pTruth,
nWords) )
1042 if ( Abc_TtHasVar( pTruth, nVars,
Var ) )
1050 return Gia_ManAppendMux(
p, Abc_Var2Lit(1+
Var, 0), iLit1, iLit0 );
1055 int i,
nWords = Abc_TtWordNum(nIns);
1057 pNew->
pName = Abc_UtilStrsav(
"muxes" );
1058 for ( i = 0; i < nIns; i++ )
1059 Gia_ManAppendCi(pNew);
1061 for ( i = 0; i < nOuts; i++ )
1077 printf(
"Finished dumping tree into AIG file \"%s\".\n", pFileName );
1110 word * pTruthDup = Abc_TtDup( pTruths, nOuts*
nWords, 0 );
1114 int r, rBest = -1, nNodes = -1, nNodesBest =
ABC_INFINITY;
1118 for ( r = 0; r < nRounds; r++ )
1121 if ( nNodesBest > nNodes )
1123 nNodesBest = nNodes;
1124 memcpy( pIPermBest, pIPerm,
sizeof(
int)*nIns );
1125 Abc_TtCopy( pTruthBest, pTruthDup, nOuts*
nWords, 0 );
1128 Abc_TtCopy( pTruthDup, pTruths, nOuts*
nWords, 0 );
1133 printf(
"Best round %3d. Best nodes %5d. ", rBest, nNodesBest );
1136 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
1147 word * pRes, * pTruthDup = Abc_TtDup( pTruths, nOuts*
nWords, 0 );
1151 int r, rBest = -1, nNodes = -1, nNodesBest =
ABC_INFINITY;
1152 assert( nOuts % 2 == 0 );
1159 for ( r = 0; r < nRounds; r++ )
1162 pRes =
Abc_TtMinArray( pTruthDup, nOuts, nIns, &nNodes, fVerbose );
1163 if ( nNodesBest > nNodes )
1165 nNodesBest = nNodes;
1166 memcpy( pIPermBest, pIPerm,
sizeof(
int)*nIns );
1167 Abc_TtCopy( pTruthBest, pRes, nOuts*
nWords/2, 0 );
1171 Abc_TtCopy( pTruthDup, pTruths, nOuts*
nWords, 0 );
1177 printf(
"Best round %3d. Best nodes %5d. ", rBest, nNodesBest );
1180 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
1190 word * pTruthDup = Abc_TtDup( pTruths, nOuts*
nWords, 0 );
1193 int r, rBest = -1, nNodes2 = -1, nNodesBest =
ABC_INFINITY;
1194 assert( nOuts % 2 == 0 );
1197 for ( r = 0; r < nRounds; r++ )
1201 nNodes2 = Gia_ManAndNum(pTemp);
1202 if ( nNodesBest > nNodes2 )
1204 nNodesBest = nNodes2;
1205 memcpy( pIPermBest, pIPerm,
sizeof(
int)*nIns );
1213 Abc_TtCopy( pTruthDup, pTruths, nOuts*
nWords, 0 );
1215 printf(
"Permuted = %5d. AIG = %5d.\n", nNodesAll, nNodes2 );
1219 printf(
"Best round %3d. Best nodes %5d. ", rBest, nNodesBest );
1222 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
1229 word * pTruthDup = Abc_TtDup( pTruths, (nOuts+1)*
nWords, 0 );
1232 int r, rBest = -1, nNodes2 = -1, nNodesBest =
ABC_INFINITY;
1235 for ( r = 0; r < nRounds; r++ )
1238 Abc_TtPermute( pTruthDup + nOuts*
nWords, pIPerm, nIns );
1241 nNodes2 = Gia_ManAndNum(pTemp);
1242 if ( nNodesBest > nNodes2 )
1244 nNodesBest = nNodes2;
1245 memcpy( pIPermBest, pIPerm,
sizeof(
int)*nIns );
1261 Abc_TtCopy( pTruthDup, pTruths, (nOuts+1)*
nWords, 0 );
1263 printf(
"Permuted = %5d. AIG = %5d.\n", nNodesAll, nNodes2 );
1267 printf(
"Best round %3d. Best nodes %5d. ", rBest, nNodesBest );
1270 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
1291 Vec_Wrd_t * vNodes = Vec_WrdAlloc( 100 );
1292 word Res = Abc_Tt6Min_rec( f, r, 6, vNodes );
1293 printf(
"Nodes = %d.\n", Vec_WrdSize(vNodes) );
1295 printf(
"Verification successful.\n" );
1297 printf(
"Verification FAILED.\n" );
1298 Vec_WrdFree( vNodes );
1303 int i,
nWords = Abc_TtWordNum(Gia_ManCiNum(
p));
1305 word * pRes = NULL, * pTruths[3] = { pTruth, pTruth+
nWords, pTruth+2*
nWords };
1307 Vec_Int_t * vSupp = Vec_IntAlloc( 100 );
1308 Vec_Wrd_t * vNodes = Vec_WrdAlloc( 100 );
1309 Vec_Wec_t * vNodes2 = Vec_WecAlloc( 100 );
1310 Vec_Wrd_t * vMemory = Vec_WrdAlloc( 0 );
1314 Vec_IntPush( vSupp, Gia_ObjId(
p, pObj) );
1317 assert( Gia_ManCoNum(
p) == 3 );
1321 Abc_TtCopy( pTruths[i], pTruth,
nWords, Gia_ObjFaninC0(pObj) );
1327 Abc_TtReverseVars( pTruths[0], Gia_ManCiNum(
p) );
1328 Abc_TtCopy( pTruths[1], pTruths[0],
nWords, 1 );
1330 pRes =
Abc_TtMin( pTruths[0], pTruths[1], Gia_ManCiNum(
p), vMemory, vNodes, vNodes2 );
1331 printf(
"Nodes = %d.\n", Vec_WrdSize(vNodes) );
1332 printf(
"Nodes2 = %d.\n", Vec_WecSizeSize(vNodes2) );
1333 if ( Abc_TtEqual(pRes, pTruths[0],
nWords) )
1334 printf(
"Verification successful.\n" );
1336 printf(
"Verification FAILED.\n" );
1358 Vec_WrdFree( vMemory );
1359 Vec_WrdFree( vNodes );
1360 Vec_WecFree( vNodes2 );
1361 Vec_IntFree( vSupp );
#define ABC_SWAP(Type, a, b)
#define ABC_FALLOC(type, num)
#define ABC_ALLOC(type, num)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_CALLOC(type, num)
#define ABC_CONST(number)
PARAMETERS ///.
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Gia_Man_t * Gia_ManBuildMuxes(Tree_Sto_t *p, int *pIPerm)
int Gia_ManPermuteTreeOne(word *pTruths, int nIns, int nOuts, int nWords, int fRandom, int *pIPermOut, int fVeryVerbose, int fVerbose)
word * Abc_TtGiaMin_rec(Gia_Man_t *p, word *pF, word *pR, int nVars, Vec_Wrd_t *vMemory, Vec_Wrd_t *vNodes, Vec_Wec_t *vNodes2, int *piLit, int *pPerm)
int Gia_ManFindBestPosition(word *pTruths, int nIns, int nOuts, int nWords, word *pStore, int fMoveMore, int *pnNodesMin, int fVerbose)
Gia_Man_t * Gia_TryPermOpt2(word *pTruths, int nIns, int nOuts, int nWords, int nRounds, int fVerbose)
Gia_Man_t * Gia_TryPermOpt(word *pTruths, int nIns, int nOuts, int nWords, int nRounds, int fVerbose)
int Gia_ManProcessLevel(Tree_Sto_t *pSto, int iVar)
Gia_Man_t * Abc_TtSimpleMinArrayNew(word *p, int nVars, int nOuts, int *pnNodes, int fVerbose, int *pIPerm)
int Gia_ManFindOrAddNode(Tree_Sto_t *pSto, int iVar, int Truth, word *pCof)
Gia_Man_t * Abc_TtGiaMinArrayNew(word *p, int nVars, int nOuts, int *pnNodes, int fVerbose, int *pIPerm)
void Abc_Tt6MinTest3(Gia_Man_t *p)
void Abc_Tt6MinTest2(Gia_Man_t *p)
Gia_Man_t * Gia_ManBuildMuxesTest(word *pTruth, int nIns, int nOuts, int *pPerm)
Gia_Man_t * Abc_TtGiaMinArray(word *p, int nVars, int nOuts, int *pnNodes, int fVerbose, int *pIPerm)
void Gia_ManPermStats(int nIns, int *pIPerm, int *pTried)
void Gia_ManTreeFree(Tree_Sto_t *p)
void Gia_ManPermuteTree(word *pTruths, int nIns, int nOuts, int nWords, int fRandom, int fVerbose)
int Gia_ManBuildMuxes_rec(Gia_Man_t *p, word *pTruth, int nVars, int *pPerm)
void Gia_ManContructTreeTest(word *pTruths, int nIns, int nOuts, int nWords)
word * Abc_TtMinArray(word *p, int nOuts, int nVars, int *pnNodes, int fVerbose)
Tree_Sto_t * Gia_ManContructTree(word *pTruths, int nIns, int nOuts, int nWords)
struct Tree_Sto_t_ Tree_Sto_t
word * Abc_TtMin_rec(word *pF, word *pR, int nVars, Vec_Wrd_t *vMemory, Vec_Wrd_t *vNodes, Vec_Wec_t *vNodes2)
word * Abc_TtSimpleMin_rec(Gia_Man_t *p, word *pF, word *pC, int nVars, Vec_Wrd_t *vMemory, Vec_Wrd_t *vNodes, Vec_Wec_t *vNodes2, int *piLit, int *pPerm)
int Gia_ManSwapTree(Tree_Sto_t *pSto, int i)
void Gia_ManTreePrint(Tree_Sto_t *p)
Gia_Man_t * Gia_ManCreateMuxGia(word *pTruths, int nIns, int nOuts, int nWords, int *pIPerm)
void Gia_ManDumpMuxGia(word *pTruths, int nIns, int nOuts, int nWords, int *pIPerm, char *pFileName)
Gia_Man_t * Gia_TryPermOptCare(word *pTruths, int nIns, int nOuts, int nWords, int nRounds, int fVerbose)
word * Abc_TtMin(word *pF, word *pR, int nVars, Vec_Wrd_t *vMemory, Vec_Wrd_t *vNodes, Vec_Wec_t *vNodes2)
#define TREE_MAX_VARS
DECLARATIONS ///.
Gia_Man_t * Gia_TryPermOptNew(word *pTruths, int nIns, int nOuts, int nWords, int nRounds, int fVerbose)
int Gia_ManBuildMuxes6_rec(Gia_Man_t *p, word t, int nVars, int *pPerm)
int Gia_ManTreeCountNodes(Tree_Sto_t *p)
void Gia_ManDumpMuxes(Tree_Sto_t *p, char *pFileName, int *pIPerm)
Tree_Sto_t * Gia_ManTreeDup(Tree_Sto_t *p)
FUNCTION DEFINITIONS ///.
void Gia_ManStop(Gia_Man_t *p)
word * Gia_ObjComputeTruthTableCut(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vLeaves)
void Gia_ManStopP(Gia_Man_t **p)
void Gia_ManHashAlloc(Gia_Man_t *p)
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
int Gia_ManHashOr(Gia_Man_t *p, int iLit0, int iLit1)
struct Gia_Obj_t_ Gia_Obj_t
struct Gia_Man_t_ Gia_Man_t
int Gia_ManHashMux(Gia_Man_t *p, int iCtrl, int iData1, int iData0)
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
void Gia_ObjComputeTruthTableStart(Gia_Man_t *p, int nVarsMax)
void Gia_ObjComputeTruthTableStop(Gia_Man_t *p)
int Gia_ManHashAnd(Gia_Man_t *p, int iLit0, int iLit1)
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachCi(p, pObj, i)
void Gia_ManHashStop(Gia_Man_t *p)
unsigned Gia_ManRandom(int fReset)
FUNCTION DEFINITIONS ///.
void Gia_AigerWrite(Gia_Man_t *p, char *pFileName, int fWriteSymbols, int fCompact, int fWriteNewLine)
unsigned __int64 word
DECLARATIONS ///.
int pIPerm[TREE_MAX_VARS]
Vec_Int_t vCofs[TREE_MAX_VARS]
int pTried[TREE_MAX_VARS]
int nNodes[TREE_MAX_VARS]
#define Vec_IntForEachEntryDouble(vVec, Entry1, Entry2, i)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.
#define Vec_WrdForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.
#define Vec_WrdForEachEntryDouble(vVec, Entry1, Entry2, i)