34static inline int Acb_ObjIsDelayCriticalFanin(
Acb_Ntk_t *
p,
int i,
int f ) {
return !Acb_ObjIsCi(
p, f) && Acb_ObjLevelR(
p, i) + Acb_ObjLevelD(
p, f) ==
p->LevelMax; }
35static inline int Acb_ObjIsAreaCritical(
Acb_Ntk_t *
p,
int f ) {
return !Acb_ObjIsCi(
p, f) && Acb_ObjFanoutNum(
p, f) == 1; }
36static inline int Acb_ObjIsCritical(
Acb_Ntk_t *
p,
int i,
int f,
int fDel ) {
return fDel ? Acb_ObjIsDelayCriticalFanin(
p, i, f) : Acb_ObjIsAreaCritical(
p, f); }
56 if ( Truth == 0 || ~Truth == 0 )
59 Vec_StrPush( vCnf, (
char)(Truth == 0) );
60 Vec_StrPush( vCnf, (
char)-1 );
65 int i, k, c, RetValue, Literal,
Cube, nCubes = 0;
67 for ( c = 0; c < 2; c ++ )
69 Truth = c ? ~Truth : Truth;
70 RetValue =
Kit_TruthIsop( (
unsigned *)&Truth, nVars, vCover, 0 );
72 nCubes += Vec_IntSize( vCover );
75 for ( k = 0; k < nVars; k++ )
77 Literal = 3 & (
Cube >> (k << 1));
79 Vec_StrPush( vCnf, (
char)Abc_Var2Lit(k, 0) );
80 else if ( Literal == 2 )
81 Vec_StrPush( vCnf, (
char)Abc_Var2Lit(k, 1) );
82 else if ( Literal != 0 )
85 Vec_StrPush( vCnf, (
char)Abc_Var2Lit(nVars, c) );
86 Vec_StrPush( vCnf, (
char)-1 );
97 assert( Vec_StrSize(vCnfBase) == 0 );
98 assert( Vec_WecSize(vCnfs) == Acb_NtkObjNumMax(
p) );
100 Vec_StrGrow( vCnfBase, Vec_StrSize(&
p->vCnf) );
101 memcpy( Vec_StrArray(vCnfBase), Vec_StrArray(&
p->vCnf), (
size_t)Vec_StrSize(&
p->vCnf) );
102 vCnfBase->
nSize = Vec_StrSize(&
p->vCnf);
108 assert( Vec_WecSize(vCnfs) == Acb_NtkObjNumMax(
p) );
111 if ( Abc_LitIsCompl(iObj) && i < PivotVar )
113 iObj = Abc_Lit2Var(iObj);
114 vCnfBase = Acb_ObjCnfs(
p, iObj );
115 if ( Vec_StrSize(vCnfBase) > 0 )
145 if ( (
int)Entry == -1 )
147 Vec_IntPush( vClas, Vec_IntSize(vLits) );
150 Lit = Abc_Lit2LitV( Vec_IntArray(vSatVars), (
int)Entry );
151 Lit = Abc_LitNotCond( Lit, Abc_Lit2Var(Lit) == iPivotVar );
152 Vec_IntPush( vLits, Lit );
157 int i, iObjLit, nRoots = 0;
159 nRoots += Abc_LitIsCompl(iObjLit);
168 int k, iFanin, * pFanins, Prev, This;
170 Vec_IntClear( vFaninVars );
173 assert( Acb_ObjFunc(
p, iFanin) >= 0 );
174 Vec_IntPush( vFaninVars, Acb_ObjFunc(
p, iFanin) );
176 Vec_IntPush( vFaninVars, OutVar );
184 printf(
"Error: SAT solver became UNSAT at a wrong place (while adding new CNF).\n" );
187 Vec_IntFree( vClas );
188 Vec_IntFree( vLits );
193 Vec_Int_t * vFaninVars = Vec_IntAlloc( 8 );
194 int PivotVar = Vec_IntFind(vWinObjs, Abc_Var2Lit(Pivot, 0));
196 int TfoStart = PivotVar + 1;
197 int nTfoSize = Vec_IntSize(vWinObjs) - TfoStart;
198 int nVarsAll = Vec_IntSize(vWinObjs) + nTfoSize + nRoots;
199 int i, k, iObj, iObjLit, iFanin, * pFanins, Entry;
202 Vec_Int_t * vLits = Vec_IntAlloc( 1000 );
205 Acb_ObjSetFunc(
p, Abc_Lit2Var(iObj), i );
207 Vec_IntPush( vClas, Vec_IntSize(vLits) );
210 if ( Abc_LitIsCompl(iObjLit) && i < PivotVar )
212 iObj = Abc_Lit2Var(iObjLit);
213 assert( !Acb_ObjIsCio(
p, iObj) );
215 Vec_IntClear( vFaninVars );
217 Vec_IntPush( vFaninVars, Acb_ObjFunc(
p, iFanin) );
218 Vec_IntPush( vFaninVars, Acb_ObjFunc(
p, iObj) );
225 iObj = Abc_Lit2Var(iObjLit);
226 assert( !Acb_ObjIsCio(
p, iObj) );
228 Vec_IntClear( vFaninVars );
230 Vec_IntPush( vFaninVars, Acb_ObjFunc(
p, iFanin) + (Acb_ObjFunc(
p, iFanin) > PivotVar) * nTfoSize );
231 Vec_IntPush( vFaninVars, Acb_ObjFunc(
p, iObj) + nTfoSize );
238 int nVars = Vec_IntSize(vWinObjs) + nTfoSize;
239 Vec_IntClear( vFaninVars );
242 if ( !Abc_LitIsCompl(iObjLit) )
244 iObj = Abc_Lit2Var(iObjLit);
246 Vec_IntPushThree( vLits, Abc_Var2Lit(Acb_ObjFunc(
p, iObj), 1), Abc_Var2Lit(Acb_ObjFunc(
p, iObj) + nTfoSize, 0), Abc_Var2Lit(nVars, 0) );
247 Vec_IntPush( vClas, Vec_IntSize(vLits) );
248 Vec_IntPushThree( vLits, Abc_Var2Lit(Acb_ObjFunc(
p, iObj), 0), Abc_Var2Lit(Acb_ObjFunc(
p, iObj) + nTfoSize, 1), Abc_Var2Lit(nVars, 0) );
249 Vec_IntPush( vClas, Vec_IntSize(vLits) );
250 Vec_IntPushThree( vLits, Abc_Var2Lit(Acb_ObjFunc(
p, iObj), 0), Abc_Var2Lit(Acb_ObjFunc(
p, iObj) + nTfoSize, 0), Abc_Var2Lit(nVars, 1) );
251 Vec_IntPush( vClas, Vec_IntSize(vLits) );
252 Vec_IntPushThree( vLits, Abc_Var2Lit(Acb_ObjFunc(
p, iObj), 1), Abc_Var2Lit(Acb_ObjFunc(
p, iObj) + nTfoSize, 1), Abc_Var2Lit(nVars, 1) );
253 Vec_IntPush( vClas, Vec_IntSize(vLits) );
254 Vec_IntPush( vFaninVars, Abc_Var2Lit(nVars++, 0) );
256 Vec_IntAppend( vLits, vFaninVars );
257 Vec_IntPush( vClas, Vec_IntSize(vLits) );
258 assert( nRoots == Vec_IntSize(vFaninVars) );
259 assert( nVars == nVarsAll );
261 Vec_IntFree( vFaninVars );
264 pCnf->
nVars = nVarsAll;
265 pCnf->
nClauses = Vec_IntSize(vClas)-1;
268 pCnf->
pClauses[0] = Vec_IntReleaseArray(vLits);
272 Vec_IntFree( vClas );
273 Vec_IntFree( vLits );
282 assert( Vec_IntEntry(&
p->vObjFunc, Abc_Lit2Var(iObj)) != -1 );
283 Vec_IntWriteEntry( &
p->vObjFunc, Abc_Lit2Var(iObj), -1 );
300 int n, i, RetValue, Test = pCnf->
pClauses[0][0];
301 int nGroups = nTimes <= 2 ? nTimes-1 : 2;
302 int nRounds = nTimes <= 2 ? nTimes-1 : nTimes;
305 assert( nTimes == 1 || nTimes == 2 || nTimes == 6 );
306 for ( n = 0; n < nTimes; n++ )
310 for ( i = 0; i < pCnf->
nClauses; i++ )
312 printf(
"Error: SAT solver became UNSAT at a wrong place.\n" );
315 if ( n < nTimes - 1 )
322 for ( n = 0; n < nRounds; n++ )
324 int BaseA = n * pCnf->
nVars;
325 int BaseB = ((n + 1) % nTimes) * pCnf->
nVars;
326 int BaseC = nTimes * pCnf->
nVars + (n & 1) * nDivs;
327 for ( i = 0; i < nDivs; i++ )
328 sat_solver_add_buffer_enable( pSat, BaseA + i, BaseB + i, BaseC + i, 0 );
332 if ( !RetValue ) printf(
"Error: SAT solver became UNSAT at a wrong place.\n" );
350 word uCube, uTruth = 0;
351 Vec_Int_t * vTempLits = Vec_IntAlloc( 100 );
352 int status, i, iVar, iLit, nFinal, * pFinal, pLits[2];
357 pLits[0] = Abc_Var2Lit( PivotVar, fCompl );
358 pLits[1] = Abc_Var2Lit( FreeVar, 0 );
365 Vec_IntFree( vTempLits );
372 Vec_IntFill( vTempLits, 1, Abc_LitNot(pLits[0]) );
374 Vec_IntPush( vTempLits, sat_solver_var_literal(pSat, iVar) );
376 status =
sat_solver_solve( pSat, Vec_IntArray(vTempLits), Vec_IntLimit(vTempLits), 0, 0, 0, 0 );
378 printf(
"Failed internal check during function comptutation.\n" );
381 nFinal = sat_solver_final( pSat, &pFinal );
382 Vec_IntFill( vTempLits, 1, Abc_LitNot(pLits[1]) );
383 for ( i = 0; i < nFinal; i++ )
384 if ( pFinal[i] != pLits[0] )
385 Vec_IntPush( vTempLits, pFinal[i] );
390 Vec_IntFill( vTempLits, 1, Abc_LitNot(pLits[1]) );
392 Vec_IntPush( vTempLits, Abc_LitNot(sat_solver_var_literal(pSat, iVar)) );
397 iVar = Vec_IntFind( vDivVars, Abc_Lit2Var(iLit) );
assert( iVar >= 0 );
398 uCube &= Abc_LitIsCompl(iLit) ? s_Truths6[iVar] : ~s_Truths6[iVar];
404 Vec_IntFree( vTempLits );
408 Vec_IntFree( vTempLits );
431 printf(
"%s: ", pName );
432 for ( i = 0; i < vVec->nSize; i++ )
433 printf(
"%d ", vVec->pArray[i] );
439 printf(
"%s: \n", pName );
440 for ( i = 0; i < vVec->nSize; i++ )
447 printf(
"%s: \n", pName );
448 for ( i = 0; i < vVec->nSize; i++ )
466 int k, iFanin, * pFanins;
468 if ( !Acb_ObjIsCi(
p, iObj) && nTfiLevMin < 0 )
470 if ( Acb_ObjSetTravIdCur(
p, iObj) )
474 Vec_IntPush( vDivs, iObj );
478 int k, iFanin, * pFanins;
480 Acb_NtkIncTravId(
p );
485 assert( Acb_ObjLevelD(
p, Pivot ) > 1 );
487 if ( Acb_ObjIsDelayCriticalFanin(
p, Pivot, iFanin ) )
491 if ( !Acb_ObjIsDelayCriticalFanin(
p, Pivot, iFanin ) )
492 if ( !Acb_ObjSetTravIdCur(
p, iFanin) )
493 Vec_IntPush( vDivs, iFanin );
498 assert( Vec_IntEntryLast(vDivs) == Pivot );
502 if ( !Acb_ObjSetTravIdCur(
p, iFanin) )
503 Vec_IntPush( vDivs, iFanin );
534 if ( Acb_ObjSetTravIdCur(
p, iObj) )
536 Vec_IntPush( vMarked, iObj );
537 if ( Acb_ObjLevelD(
p, iObj) > nTfoLevMax || Acb_ObjFanoutNum(
p, iObj) > nFanMax )
544 Vec_Int_t * vMarked = Vec_IntAlloc( 1000 );
546 Acb_NtkIncTravId(
p );
547 Acb_ObjSetTravIdCur(
p, Pivot );
548 Vec_IntPush( vMarked, Pivot );
556 Acb_NtkIncTravId(
p );
558 Acb_ObjSetTravIdCur(
p, Node );
574 int iFanout, i, Diff, fHasNone = 0;
575 if ( (Diff = Acb_ObjTravIdDiff(
p, iObj)) <= 2 )
577 Acb_ObjSetTravIdDiff(
p, iObj, 2 );
578 if ( Acb_ObjIsCo(
p, iObj) || Acb_ObjLevelD(
p, iObj) > nTfoLevMax )
580 if ( Acb_ObjLevelD(
p, iObj) == nTfoLevMax || Acb_ObjFanoutNum(
p, iObj) > nFanMax )
583 Acb_ObjSetTravIdDiff(
p, iObj, 1 );
584 return Acb_ObjTravIdDiff(
p, iObj);
587 if ( !fFirst || Acb_ObjIsDelayCriticalFanin(
p, iFanout, iObj) )
589 if ( fHasNone && Diff == 3 )
590 Acb_ObjSetTravIdDiff(
p, iObj, 1 );
591 else if ( !fHasNone )
592 Acb_ObjSetTravIdDiff(
p, iObj, 0 );
593 return Acb_ObjTravIdDiff(
p, iObj);
597 Acb_NtkIncTravId(
p );
598 Acb_NtkIncTravId(
p );
599 Acb_NtkIncTravId(
p );
600 assert( Acb_ObjTravIdDiff(
p, Root) > 2 );
617 int iFanout, i, Diff = Acb_ObjTravIdDiff(
p, iObj);
618 if ( Acb_ObjSetTravIdCur(
p, iObj) )
622 Vec_IntPush( vRoots, iObj );
623 Vec_IntPush( vTfo, iObj );
628 if ( !fFirst || Acb_ObjIsDelayCriticalFanin(
p, iFanout, iObj) )
630 Vec_IntPush( vTfo, iObj );
635 Vec_Int_t * vTfo = *pvTfo = Vec_IntAlloc( 10 );
636 Vec_Int_t * vRoots = *pvRoots = Vec_IntAlloc( 10 );
639 Acb_NtkIncTravId(
p );
641 assert( Vec_IntEntryLast(vTfo) == Pivot );
643 assert( Vec_IntEntryLast(vRoots) != Pivot );
644 Vec_IntReverseOrder( vTfo );
645 Vec_IntReverseOrder( vRoots );
663 int i, k, Node, iFanin, * pFanins;
664 Acb_NtkIncTravId(
p );
665 Vec_IntPush( vTfo, Pivot );
667 Acb_ObjSetTravIdCur(
p, Node );
670 if ( !Acb_ObjSetTravIdCur(
p, iFanin) && iFanin != Pivot )
671 Vec_IntPush( vSide, iFanin );
689 int i, iFanin, * pFanins;
690 if ( !Acb_ObjIsTravIdPrev(
p, iObj) )
692 if ( Acb_ObjSetTravIdCur(
p, iObj) )
696 Vec_IntPush( vTfiNew, iObj );
700 int i, iFanin, * pFanins;
701 int fTravIdPrev = Acb_ObjIsTravIdPrev(
p, iObj);
702 if ( Acb_ObjSetTravIdCur(
p, iObj) )
704 if ( fTravIdPrev && !Acb_ObjIsCi(
p, iObj) )
707 Vec_IntPush( vTfiNew, iObj );
711 Vec_Int_t * vTfiNew = Vec_IntAlloc( 100 );
713 Acb_NtkIncTravId(
p );
720 assert( Vec_IntEntryLast(vTfiNew) == Pivot );
721 Vec_IntPop( vTfiNew );
729 *pnDivs = Vec_IntSize(vTfiNew);
732 Vec_IntPush( vTfiNew, Pivot );
750 int i, k, iObj, iFanin, * pFanins;
751 assert( Vec_IntEntryLast(vTfi) == Pivot );
753 Acb_NtkIncTravId(
p );
755 Acb_ObjSetTravIdCur(
p, iObj);
761 if ( !Acb_ObjIsTravIdCur(
p, iFanin) )
763 Vec_IntPush( vWin, Abc_Var2Lit(iObj, Acb_ObjIsCi(
p, iObj) || fIsTfiInput) );
766 Acb_NtkIncTravId(
p );
768 Acb_ObjSetTravIdCur(
p, iObj);
772 assert( !Acb_ObjIsCo(
p, iObj) );
773 Vec_IntPush( vWin, Abc_Var2Lit(iObj, Acb_ObjIsTravIdCur(
p, iObj)) );
793 int nTfoLevMax = Acb_ObjLevelD(
p, Pivot) + nTfoLevs;
794 Vec_Int_t * vWin, * vDivs, * vMarked, * vTfo, * vRoots, * vSide, * vTfi;
810 Vec_IntFree( vMarked );
814 Vec_IntFree( vSide );
815 Vec_IntFree( vDivs );
821 Vec_IntFree( vRoots );
838static inline void Vec_IntVars2Vars(
Vec_Int_t *
p,
int Shift )
841 for ( i = 0; i <
p->nSize; i++ )
842 p->pArray[i] += Shift;
844static inline void Vec_IntVars2Lits(
Vec_Int_t *
p,
int Shift,
int fCompl )
847 for ( i = 0; i <
p->nSize; i++ )
848 p->pArray[i] = Abc_Var2Lit(
p->pArray[i] + Shift, fCompl );
850static inline void Vec_IntLits2Vars(
Vec_Int_t *
p,
int Shift )
853 for ( i = 0; i <
p->nSize; i++ )
854 p->pArray[i] = Abc_Lit2Var(
p->pArray[i] ) + Shift;
859 for ( i = 0; i <
p->nSize; i++ )
860 p->pArray[i] = Vec_IntEntry(vMap,
p->pArray[i]);
866 printf(
"Window for node %d with %d divisors:\n", Pivot, nDivs );
871 if ( Abc_Lit2Var(Node) == Pivot )
872 printf(
"(%d) ", Pivot );
874 printf(
"%s%d ", Abc_LitIsCompl(Node) ?
"*":
"", Abc_Lit2Var(Node) );
881 int i, j, best_i, nSize = Vec_IntSize(vSupp);
882 int * pArray = Vec_IntArray(vSupp);
883 for ( i = 0; i < nSize-1; i++ )
886 for ( j = i+1; j < nSize; j++ )
887 if ( Acb_ObjFanoutNum(
p, pArray[j]) > Acb_ObjFanoutNum(
p, pArray[best_i]) )
889 ABC_SWAP(
int, pArray[i], pArray[best_i] );
898 assert( Acb_ObjFunc(
p, iFanin) >= 0 );
899 Vec_IntWriteEntry( vSupp, k, Acb_ObjFunc(
p, iFanin) );
916 int nSuppNew, status, k, iFanin, * pFanins;
917 Vec_IntClear( vSupp );
919 Vec_IntPush( vSupp, iFanin );
920 Acb_NtkOrderByRefCount(
p, vSupp );
921 Acb_NtkRemapIntoSatVariables(
p, vSupp );
922 Vec_IntVars2Lits( vSupp, 2*nVars, 0 );
923 status =
sat_solver_solve( pSat, Vec_IntArray(vSupp), Vec_IntLimit(vSupp), 0, 0, 0, 0 );
925 printf(
"Failed internal check at node %d.\n", Pivot );
928 Vec_IntShrink( vSupp, nSuppNew );
929 Vec_IntLits2Vars( vSupp, -2*nVars );
930 return Vec_IntSize(vSupp) < Acb_ObjFaninNum(
p, Pivot);
933static int StrCount = 0;
937 int nSuppNew, status, k, iFanin, * pFanins, k2, iFanin2, * pFanins2;
939 assert( Acb_ObjFunc(
p, iFanin) >= 0 && Acb_ObjFunc(
p, iFanin) < nDivs );
943 int nNonCrits, k2, iFanin2 = 0, * pFanins2;
944 assert( Acb_ObjLevelD(
p, Pivot ) > 1 );
945 Vec_IntClear( vSupp );
947 if ( !Acb_ObjIsDelayCriticalFanin(
p, Pivot, iFanin ) )
948 Vec_IntPush( vSupp, iFanin );
949 nNonCrits = Vec_IntSize(vSupp);
952 if ( Acb_ObjIsDelayCriticalFanin(
p, Pivot, iFanin ) )
954 Vec_IntPushUnique( vSupp, iFanin2 );
955 assert( nNonCrits < Vec_IntSize(vSupp) );
957 Vec_IntSelectSortCost( Vec_IntArray(vSupp) + nNonCrits, Vec_IntSize(vSupp) - nNonCrits, &
p->vLevelD );
961 assert( Acb_ObjFunc(
p, iFanin) >= 0 );
962 Vec_IntWriteEntry( vSupp, k, Acb_ObjFunc(
p, iFanin) );
965 Vec_IntVars2Lits( vSupp, 2*nVars, 0 );
966 status =
sat_solver_solve( pSat, Vec_IntArray(vSupp), Vec_IntLimit(vSupp), 0, 0, 0, 0 );
968 printf(
"Failed internal check at node %d.\n", Pivot );
971 Vec_IntShrink( vSupp, nSuppNew );
972 Vec_IntLits2Vars( vSupp, -2*nVars );
973 return Vec_IntSize(vSupp) <= nLutSize;
978 if ( !Acb_ObjIsAreaCritical(
p, iFanin) )
981 Vec_IntClear( vSupp );
983 if ( iFanin != iFanin2 )
984 Vec_IntPush( vSupp, iFanin2 );
987 Vec_IntPushUnique( vSupp, iFanin2 );
989 Vec_IntSelectSortCost( Vec_IntArray(vSupp), Vec_IntSize(vSupp), &
p->vLevelD );
991 Acb_NtkRemapIntoSatVariables(
p, vSupp );
993 Vec_IntVars2Lits( vSupp, 2*nVars, 0 );
994 status =
sat_solver_solve( pSat, Vec_IntArray(vSupp), Vec_IntLimit(vSupp), 0, 0, 0, 0 );
996 printf(
"Failed internal check at node %d.\n", Pivot );
999 Vec_IntShrink( vSupp, nSuppNew );
1000 Vec_IntLits2Vars( vSupp, -2*nVars );
1001 if ( Vec_IntSize(vSupp) <= nLutSize )
1009 int nSuppNew, status, k, iFanin, * pFanins, k2, iFanin2, * pFanins2, k3, iFanin3, * pFanins3, NodeMark;
1017 if ( !Acb_ObjIsAreaCritical(
p, iFanin) )
1021 if ( !Acb_ObjIsAreaCritical(
p, iFanin2) || k2 == k )
1024 assert( iFanin != iFanin2 );
1027 Vec_IntClear( vSupp );
1029 if ( iFanin3 != iFanin && iFanin3 != iFanin2 )
1031 assert( Acb_ObjFunc(
p, iFanin3) >= 0 );
1032 Vec_IntPush( vSupp, Abc_Var2Lit(Acb_ObjFunc(
p, iFanin3) + 6*nVars, 0) );
1034 NodeMark = Vec_IntSize(vSupp);
1039 assert( Acb_ObjFunc(
p, iFanin3) >= 0 );
1040 Vec_IntPush( vSupp, Abc_Var2Lit(Acb_ObjFunc(
p, iFanin3) + 6*nVars + nDivs, 0) );
1045 assert( Acb_ObjFunc(
p, iFanin3) >= 0 );
1046 Vec_IntPushUnique( vSupp, Abc_Var2Lit(Acb_ObjFunc(
p, iFanin3) + 6*nVars + nDivs, 0) );
1048 assert( Vec_IntCheckUniqueSmall(vSupp) );
1053 status =
sat_solver_solve( pSat, Vec_IntArray(vSupp), Vec_IntLimit(vSupp), 0, 0, 0, 0 );
1058 Vec_IntShrink( vSupp, nSuppNew );
1059 Vec_IntLits2Vars( vSupp, -6*nVars );
1060 Vec_IntSort( vSupp, 1 );
1064 if ( iFanin3 >= nDivs )
1065 Vec_IntWriteEntry( vSupp, k3, iFanin3 - nDivs );
1068 if ( NodeMark == 0 )
1074 if ( Vec_IntSize(vSupp) - NodeMark <= nLutSize )
1082 if ( !Acb_ObjIsAreaCritical(
p, iFanin) )
1086 if ( !Acb_ObjIsAreaCritical(
p, iFanin2) )
1089 assert( iFanin != iFanin2 );
1092 Vec_IntClear( vSupp );
1094 if ( iFanin3 != iFanin && iFanin3 != iFanin2 )
1095 Vec_IntPush( vSupp, Abc_Var2Lit(Acb_ObjFunc(
p, iFanin3) + 6*nVars, 0) );
1096 NodeMark = Vec_IntSize(vSupp);
1100 if ( iFanin3 != iFanin2 )
1101 Vec_IntPush( vSupp, Abc_Var2Lit(Acb_ObjFunc(
p, iFanin3) + 6*nVars + nDivs, 0) );
1105 assert( Acb_ObjFunc(
p, iFanin3) >= 0 );
1106 Vec_IntPushUnique( vSupp, Abc_Var2Lit(Acb_ObjFunc(
p, iFanin3) + 6*nVars + nDivs, 0) );
1108 assert( Vec_IntCheckUniqueSmall(vSupp) );
1114 status =
sat_solver_solve( pSat, Vec_IntArray(vSupp), Vec_IntLimit(vSupp), 0, 0, 0, 0 );
1116 printf(
"Failed internal check at node %d.\n", Pivot );
1119 Vec_IntShrink( vSupp, nSuppNew );
1120 Vec_IntLits2Vars( vSupp, -6*nVars );
1121 Vec_IntSort( vSupp, 1 );
1125 if ( iFanin3 >= nDivs )
1126 Vec_IntWriteEntry( vSupp, k3, iFanin3 - nDivs );
1129 if ( NodeMark == 0 )
1135 if ( Vec_IntSize(vSupp) - NodeMark <= nLutSize )
1183 p->timeTotal = Abc_Clock();
1187 p->vSupp = Vec_IntAlloc(100);
1188 p->vFlip = Vec_IntAlloc(100);
1189 p->vValues = Vec_IntAlloc(100);
1194 Vec_IntFree(
p->vFlip );
1195 Vec_IntFree(
p->vSupp );
1196 Vec_IntFree(
p->vValues );
1202static inline int Acb_NtkObjMffcEstimate(
Acb_Ntk_t * pNtk,
int iObj )
1204 int k, iFanin, * pFanins, Count = 0, iFaninCrit = -1;
1206 if ( Acb_ObjIsAreaCritical(pNtk, iFanin) )
1207 iFaninCrit = iFanin, Count++;
1211 if ( Acb_ObjIsAreaCritical(pNtk, iFanin) )
1229 word OnSet[64] = {0};
1230 word OffSet[64] = {0};
1231 word Diffs[64] = {0};
1232 int s, nScope = 1 + 2*nDivs, d, i;
1233 int f, nFrames = nValues / nScope;
1234 int start = nDivs < 64 ? 0 : nDivs - 64;
1235 int stop = nDivs < 64 ? nDivs : 64;
1236 assert( nValues % nScope == 0 );
1238 for ( f = 0; f < nFrames; f++ )
1240 int * pStart = pValues + f * nScope;
1241 int * pOnSet = pStart + 1 + (pStart[0] ? 0 : nDivs);
1242 int * pOffSet = pStart + 1 + (pStart[0] ? nDivs : 0);
1244 printf(
"%2d:", f );
1245 for ( s = start; s < stop; s++ )
1246 printf(
"%d", pOnSet[s] );
1249 printf(
"%2d:", f );
1250 for ( s = start; s < stop; s++ )
1251 printf(
"%d", pOffSet[s] );
1254 for ( s = start; s < stop; s++ )
1256 if ( pOnSet[s] ) OnSet[f] |= (((
word)1) << (s-start));
1257 if ( pOffSet[s] ) OffSet[f] |= (((
word)1) << (s-start));
1261 for ( f = 0; f < nFrames; f++ )
1262 for ( s = 0; s < nFrames; s++ )
1264 for ( i = 0; i < d; i++ )
1265 if ( Diffs[i] == (OnSet[f] ^ OffSet[s]) )
1270 Diffs[d++] = OnSet[f] ^ OffSet[s];
1273 printf(
"Divisors = %d. Frames = %d. Patterns = %d.\n", nDivs, nFrames, d );
1275 for ( s = start; s < stop; s++ )
1276 printf(
"%d", s / 10 );
1279 for ( s = start; s < stop; s++ )
1280 printf(
"%d", s % 10 );
1283 for ( s = start; s < stop; s++ )
1284 printf(
"%c", Vec_IntFind(vSupp, s) >= 0 ?
'a' + Vec_IntFind(vSupp, s) :
' ' );
1286 for ( s = 0; s < d; s++ )
1288 printf(
"%2d:", s );
1289 for ( f = 0; f < stop; f++ )
1290 printf(
"%c", ((Diffs[s] >> f) & 1) ?
'*' :
' ' );
1299 int Result, PivotVar, nDivs = 0, RetValue = 0, c;
1300 assert( Acb_ObjFanoutNum(
p->pNtk, Pivot) > 0 );
1305 vWin =
Acb_NtkWindow(
p->pNtk, Pivot,
p->pPars->nTfiLevMax,
p->pPars->nTfoLevMax,
p->pPars->nFanoutMax, !
p->pPars->fArea, &nDivs );
1306 p->nWinsAll += Vec_IntSize(vWin);
1307 p->nDivsAll += nDivs;
1308 p->timeWin += Abc_Clock() - clk;
1309 PivotVar = Vec_IntFind( vWin, Abc_Var2Lit(Pivot, 0) );
1310 if (
p->pPars->fVerbose )
1311 printf(
"Node %d: Window contains %d objects and %d divisors. ", Pivot, Vec_IntSize(vWin), nDivs );
1314 if ( Vec_IntSize(vWin) >
p->pPars->nWinNodeMax )
1317 if (
p->pPars->fVerbose )
1318 printf(
"Too many divisors.\n" );
1325 assert( PivotVar == Acb_ObjFunc(
p->pNtk, Pivot) );
1327 p->timeCnf += Abc_Clock() - clk;
1332 p->timeSol += Abc_Clock() - clk;
1334 for ( c = 0; c < 2; c++ )
1336 int Lit = Abc_Var2Lit( PivotVar, c );
1341 if (
p->pPars->fVerbose )
1342 printf(
"Found constant %d.\n", c );
1353 p->timeSol += Abc_Clock() - clk;
1356 if (
p->pPars->fArea )
1358 int fEnableProfile = 0;
1359 if ( fEnableProfile )
1362 if (
p->pSat[1]->user_values.cap == 0 )
1363 veci_new(&
p->pSat[1]->user_values);
1365 p->pSat[1]->user_values.size = 0;
1366 if (
p->pSat[1]->user_vars.cap == 0 )
1367 veci_new(&
p->pSat[1]->user_vars);
1369 p->pSat[1]->user_vars.size = 0;
1371 veci_push(&
p->pSat[1]->user_vars, PivotVar);
1372 for ( c = 0; c < nDivs; c++ )
1373 veci_push(&
p->pSat[1]->user_vars, c);
1374 for ( c = 0; c < nDivs; c++ )
1375 veci_push(&
p->pSat[1]->user_vars, c+pCnf->
nVars);
1381 p->timeSat += Abc_Clock() - clk;
1383 p->pSat[1]->user_vars.size = 0;
1386 if ( Vec_IntSize(
p->vSupp) == 0 )
1390 assert( Vec_IntSize(
p->vSupp) <
p->pPars->nLutSize );
1391 if (
p->pPars->fVerbose )
1392 printf(
"Found %d inputs: ", Vec_IntSize(
p->vSupp) );
1394 if (
p->pPars->fVerbose )
1396 if (
p->pPars->fVerbose )
1399 Vec_IntRemap(
p->vSupp, vWin );
1400 Vec_IntLits2Vars(
p->vSupp, 0 );
1405 if ( fEnableProfile )
1409 p->pSat[1]->user_values.size = 0;
1413 if ( Acb_NtkObjMffcEstimate(
p->pNtk, Pivot) >= 1 )
1417 Result =
Acb_NtkFindSupp2(
p->pNtk, Pivot,
p->pSat[1], pCnf->
nVars, nDivs, vWin,
p->vSupp,
p->pPars->nLutSize, !
p->pPars->fArea );
1418 p->timeSat += Abc_Clock() - clk;
1422 assert( Vec_IntSize(
p->vSupp) <=
p->pPars->nLutSize );
1423 if (
p->pPars->fVerbose )
1424 printf(
"Found %d inputs: ", Vec_IntSize(
p->vSupp) );
1426 if (
p->pPars->fVerbose )
1428 if (
p->pPars->fVerbose )
1431 Vec_IntRemap(
p->vSupp, vWin );
1432 Vec_IntLits2Vars(
p->vSupp, 0 );
1440 if (
p->pPars->fUseAshen && Acb_NtkObjMffcEstimate(
p->pNtk, Pivot) >= 2 )
1446 p->timeSol += Abc_Clock() - clk;
1450 Result =
Acb_NtkFindSupp3(
p->pNtk, Pivot,
p->pSat[2], pCnf->
nVars, nDivs, vWin,
p->vSupp,
p->pPars->nLutSize, !
p->pPars->fArea );
1451 p->timeSat += Abc_Clock() - clk;
1455 int i, k, Lit,
Var, Var2, status, NodeNew, fBecameUnsat = 0, fCompl = 0;
1456 assert( Result < p->pPars->nLutSize );
1457 assert( Vec_IntSize(
p->vSupp)-Result <= p->pPars->nLutSize );
1458 if ( fVerbose ||
p->pPars->fVerbose )
1459 printf(
"Obj %5d: Found %d Hvars and %d Gvars: ", Pivot, Result, Vec_IntSize(
p->vSupp)-Result );
1469 Lit = Abc_Var2Lit(
Var + 2*pCnf->
nVars, 0 );
1471 {
if ( fVerbose ||
p->pPars->fVerbose ) printf(
"Error: SAT solver became UNSAT at a wrong place (place 2). " ); fBecameUnsat = 1; }
1477 fCompl = !sat_solver_var_value(
p->pSat[1], PivotVar );
1485 if ( k < Vec_IntSize(
p->vSupp) )
1487 if ( fVerbose ||
p->pPars->fVerbose )
1488 printf(
"Found C-var in object %d. ", Pivot );
1492 Lit = sat_solver_var_literal(
p->pSat[1],
Var + pCnf->
nVars );
1494 {
if ( fVerbose ||
p->pPars->fVerbose ) printf(
"Error: SAT solver became UNSAT at a wrong place (place 1). " ); fBecameUnsat = 1; }
1499 if ( fVerbose ||
p->pPars->fVerbose )
1500 printf(
" Quitting.\n" );
1504 p->vSupp->nSize -= Result;
1507 if ( fVerbose ||
p->pPars->fVerbose )
1509 if ( uTruth == 0 || ~uTruth == 0 )
1511 if ( fVerbose ||
p->pPars->fVerbose )
1512 printf(
" Quitting.\n" );
1517 Vec_IntRemap(
p->vSupp, vWin );
1518 Vec_IntLits2Vars(
p->vSupp, 0 );
1522 p->vSupp->nSize += Result;
1525 Vec_IntWriteEntry(
p->vSupp, i-(Vec_IntSize(
p->vSupp)-Result),
Var );
1526 Vec_IntShrink(
p->vSupp, Result );
1531 if ( fVerbose ||
p->pPars->fVerbose )
1533 if ( fVerbose ||
p->pPars->fVerbose )
1535 if ( fVerbose ||
p->pPars->fVerbose )
1538 Vec_IntPop(
p->vSupp );
1539 Vec_IntRemap(
p->vSupp, vWin );
1540 Vec_IntLits2Vars(
p->vSupp, 0 );
1541 Vec_IntPush(
p->vSupp, NodeNew );
1549 if (
p->pPars->fVerbose )
1561 Vec_IntFreeP( &vWin );
1579 if ( pPars->fVerbose )
1580 printf(
"%s-optimization parameters: TfiLev(I) = %d TfoLev(O) = %d WinMax(W) = %d LutSize = %d\n",
1581 pMan->
pPars->fArea ?
"Area" :
"Delay", pMan->
pPars->nTfiLevMax, pMan->
pPars->nTfoLevMax, pMan->
pPars->nWinNodeMax, pMan->
pPars->nLutSize );
1582 Acb_NtkCreateFanout( pNtk );
1583 Acb_NtkCleanObjFuncs( pNtk );
1584 Acb_NtkCleanObjCnfs( pNtk );
1585 if ( pMan->
pPars->fArea )
1587 int n = 0, iObj, RetValue, nNodes = Acb_NtkObjNumMax(pNtk);
1588 Vec_Bit_t * vVisited = Vec_BitStart( Acb_NtkObjNumMax(pNtk) );
1590 for ( n = 2; n >= 0; n-- )
1592 if ( iObj < nNodes && !Vec_BitEntry(vVisited, iObj) && Acb_NtkObjMffcEstimate(pNtk, iObj) >= n )
1598 while ( (RetValue =
Acb_NtkOptNode(pMan, iObj)) && Acb_ObjFaninNum(pNtk, iObj) );
1599 Vec_BitWriteEntry( vVisited, iObj, 1 );
1601 Vec_BitFree( vVisited );
1607 while ( (Value = (
int)Vec_QueTopPriority(pNtk->
vQue)) > 0 )
1609 int iObj = Vec_QuePop(pNtk->
vQue);
1610 if ( !Acb_ObjType(pNtk, iObj) )
1618 if ( pPars->fVerbose )
1621 printf(
"Node = %d Win = %d (Ave = %d) DivAve = %d Change = %d C = %d N1 = %d N2 = %d N3 = %d Over = %d Str = %d 2Node = %d.\n",
#define ABC_SWAP(Type, a, b)
#define ABC_ALLOC(type, num)
#define ABC_PRTP(a, t, T)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Acb_DeriveCnfForWindowOne(Acb_Ntk_t *p, int iObj)
void Acb_MfsStop(Acb_Mfs_t *p)
Vec_Wec_t * Acb_DeriveCnfForWindow(Acb_Ntk_t *p, Vec_Int_t *vWin, int PivotVar)
void Acb_NtkOptNodeAnalyze(Acb_Mfs_t *p, int PivotVar, int nDivs, int nValues, int *pValues, Vec_Int_t *vSupp)
int Acb_NtkFindSupp2(Acb_Ntk_t *p, int Pivot, sat_solver *pSat, int nVars, int nDivs, Vec_Int_t *vWin, Vec_Int_t *vSupp, int nLutSize, int fDelay)
Cnf_Dat_t * Acb_NtkWindow2Cnf(Acb_Ntk_t *p, Vec_Int_t *vWinObjs, int Pivot)
void Acb_ObjMarkTfo2(Acb_Ntk_t *p, Vec_Int_t *vMarked)
void Acb_NtkDivisors_rec(Acb_Ntk_t *p, int iObj, int nTfiLevMin, Vec_Int_t *vDivs)
void Acb_TranslateCnf(Vec_Int_t *vClas, Vec_Int_t *vLits, Vec_Str_t *vCnf, Vec_Int_t *vSatVars, int iPivotVar)
void Acb_NtkPrintVecWin(Acb_Ntk_t *p, Vec_Int_t *vVec, char *pName)
void Acb_ObjMarkTfo_rec(Acb_Ntk_t *p, int iObj, int nTfoLevMax, int nFanMax, Vec_Int_t *vMarked)
int Acb_NtkOptNode(Acb_Mfs_t *p, int Pivot)
Vec_Int_t * Acb_NtkCollectTfoSideInputs(Acb_Ntk_t *p, int Pivot, Vec_Int_t *vTfo)
void Acb_NtkCollectNewTfi1_rec(Acb_Ntk_t *p, int iObj, Vec_Int_t *vTfiNew)
Vec_Int_t * Acb_ObjMarkTfo(Acb_Ntk_t *p, Vec_Int_t *vDivs, int Pivot, int nTfoLevMax, int nFanMax)
Vec_Int_t * Acb_NtkDivisors(Acb_Ntk_t *p, int Pivot, int nTfiLevMin, int fDelay)
int Acb_NtkCountRoots(Vec_Int_t *vWinObjs, int PivotVar)
struct Acb_Mfs_t_ Acb_Mfs_t
void Acb_ObjDeriveTfo(Acb_Ntk_t *p, int Pivot, int nTfoLevMax, int nFanMax, Vec_Int_t **pvTfo, Vec_Int_t **pvRoots, int fDelay)
int Acb_DeriveCnfFromTruth(word Truth, int nVars, Vec_Int_t *vCover, Vec_Str_t *vCnf)
FUNCTION DEFINITIONS ///.
void Acb_NtkPrintVec(Acb_Ntk_t *p, Vec_Int_t *vVec, char *pName)
void Acb_ObjDeriveTfo_rec(Acb_Ntk_t *p, int iObj, Vec_Int_t *vTfo, Vec_Int_t *vRoots, int fFirst)
void Acb_NtkWindowUndo(Acb_Ntk_t *p, Vec_Int_t *vWin)
int Acb_NtkWindow2Solver(sat_solver *pSat, Cnf_Dat_t *pCnf, Vec_Int_t *vFlip, int PivotVar, int nDivs, int nTimes)
int Acb_ObjLabelTfo_rec(Acb_Ntk_t *p, int iObj, int nTfoLevMax, int nFanMax, int fFirst)
void Acb_NtkOpt(Acb_Ntk_t *pNtk, Acb_Par_t *pPars)
Vec_Int_t * Acb_NtkWindow(Acb_Ntk_t *p, int Pivot, int nTfiLevs, int nTfoLevs, int nFanMax, int fDelay, int *pnDivs)
Vec_Int_t * Acb_NtkCollectNewTfi(Acb_Ntk_t *p, int Pivot, Vec_Int_t *vDivs, Vec_Int_t *vSide, int *pnDivs)
Vec_Int_t * Acb_NtkCollectWindow(Acb_Ntk_t *p, int Pivot, Vec_Int_t *vTfi, Vec_Int_t *vTfo, Vec_Int_t *vRoots)
void Acb_NtkPrintVec2(Acb_Ntk_t *p, Vec_Int_t *vVec, char *pName)
int Acb_NtkFindSupp3(Acb_Ntk_t *p, int Pivot, sat_solver *pSat, int nVars, int nDivs, Vec_Int_t *vWin, Vec_Int_t *vSupp, int nLutSize, int fDelay)
void Acb_NtkCollectNewTfi2_rec(Acb_Ntk_t *p, int iObj, Vec_Int_t *vTfiNew)
void Acb_DeriveCnfForNode(Acb_Ntk_t *p, int iObj, sat_solver *pSat, int OutVar)
int Acb_ObjLabelTfo(Acb_Ntk_t *p, int Root, int nTfoLevMax, int nFanMax, int fDelay)
int Acb_NtkFindSupp1(Acb_Ntk_t *p, int Pivot, sat_solver *pSat, int nVars, int nDivs, Vec_Int_t *vWin, Vec_Int_t *vSupp)
Acb_Mfs_t * Acb_MfsStart(Acb_Ntk_t *pNtk, Acb_Par_t *pPars)
word Acb_ComputeFunction(sat_solver *pSat, int PivotVar, int FreeVar, Vec_Int_t *vDivVars, int fCompl)
typedefABC_NAMESPACE_HEADER_START struct Acb_Par_t_ Acb_Par_t
INCLUDES ///.
void Acb_NtkUpdateLevelD(Acb_Ntk_t *p, int iObj)
struct Acb_Ntk_t_ Acb_Ntk_t
#define Acb_ObjForEachFanout(p, iObj, iFanout, k)
void Acb_NtkUpdateNode(Acb_Ntk_t *p, int Pivot, word uTruth, Vec_Int_t *vSupp)
int Acb_NtkCreateNode(Acb_Ntk_t *p, word uTruth, Vec_Int_t *vSupp)
void Acb_NtkPrintNode(Acb_Ntk_t *p, int iObj)
void Acb_NtkUpdateTiming(Acb_Ntk_t *p, int iObj)
#define Acb_NtkForEachNode(p, i)
#define Acb_ObjForEachFaninFast(p, iObj, pFanins, iFanin, k)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Vec_Str_t_ Vec_Str_t
#define sat_solver_addclause
void Cnf_DataCollectFlipLits(Cnf_Dat_t *p, int iFlipVar, Vec_Int_t *vFlips)
struct Cnf_Dat_t_ Cnf_Dat_t
void Cnf_DataLiftAndFlipLits(Cnf_Dat_t *p, int nVarsPlus, Vec_Int_t *vLits)
void Cnf_DataFree(Cnf_Dat_t *p)
void Cnf_DataLift(Cnf_Dat_t *p, int nVarsPlus)
void Extra_PrintHex(FILE *pFile, unsigned *pTruth, int nVars)
unsigned __int64 word
DECLARATIONS ///.
int Kit_TruthIsop(unsigned *puTruth, int nVars, Vec_Int_t *vMemory, int fTryBoth)
sat_solver * sat_solver_new(void)
int sat_solver_simplify(sat_solver *s)
void sat_solver_restart(sat_solver *s)
void sat_solver_setnvars(sat_solver *s, int n)
int sat_solver_nvars(sat_solver *s)
void sat_solver_delete(sat_solver *s)
int sat_solver_minimize_assumptions(sat_solver *s, int *pLits, int nLits, int nConfLimit)
typedefABC_NAMESPACE_HEADER_START struct Vec_Bit_t_ Vec_Bit_t
INCLUDES ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryStop(vVec, Entry, i, Stop)
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
#define Vec_StrForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.