33#ifdef ABC_USE_PTHREADS
36#include "../lib/pthread.h"
51#define DSD_VERSION "dsd1"
113static inline int If_DsdObjWordNum(
int nFans ) {
return sizeof(
If_DsdObj_t) / 8 + nFans / 2 + ((nFans & 1) > 0); }
119static inline int If_DsdObjId(
If_DsdObj_t * pObj ) {
return pObj->
Id; }
120static inline int If_DsdObjType(
If_DsdObj_t * pObj ) {
return pObj->
Type; }
122static inline int If_DsdObjSuppSize(
If_DsdObj_t * pObj ) {
return pObj->
nSupp; }
123static inline int If_DsdObjFaninNum(
If_DsdObj_t * pObj ) {
return pObj->
nFans; }
124static inline int If_DsdObjFaninC(
If_DsdObj_t * pObj,
int i ) {
assert(i < (
int)pObj->
nFans);
return Abc_LitIsCompl(pObj->
pFans[i]); }
130static inline int If_DsdVecObjSuppSize(
Vec_Ptr_t *
p,
int iObj ) {
return If_DsdVecObj(
p, iObj )->nSupp; }
131static inline int If_DsdVecLitSuppSize(
Vec_Ptr_t *
p,
int iLit ) {
return If_DsdVecObjSuppSize(
p, Abc_Lit2Var(iLit) ); }
132static inline int If_DsdVecObjRef(
Vec_Ptr_t *
p,
int iObj ) {
return If_DsdVecObj(
p, iObj )->Count; }
133static inline void If_DsdVecObjIncRef(
Vec_Ptr_t *
p,
int iObj ) {
if ( If_DsdVecObjRef(
p, iObj) < 0x3FFFF ) If_DsdVecObj(
p, iObj )->Count++; }
135static inline int If_DsdVecObjMark(
Vec_Ptr_t *
p,
int iObj ) {
return If_DsdVecObj(
p, iObj )->fMark; }
136static inline void If_DsdVecObjSetMark(
Vec_Ptr_t *
p,
int iObj ) { If_DsdVecObj(
p, iObj )->fMark = 1; }
137static inline void If_DsdVecObjClearMark(
Vec_Ptr_t *
p,
int iObj ) { If_DsdVecObj(
p, iObj )->fMark = 0; }
139#define If_DsdVecForEachObj( vVec, pObj, i ) \
140 Vec_PtrForEachEntry( If_DsdObj_t *, vVec, pObj, i )
141#define If_DsdVecForEachObjStart( vVec, pObj, i, Start ) \
142 Vec_PtrForEachEntryStart( If_DsdObj_t *, vVec, pObj, i, Start )
143#define If_DsdVecForEachObjVec( vNodes, vVec, pObj, i ) \
144 for ( i = 0; (i < Vec_IntSize(vNodes)) && ((pObj) = If_DsdVecObj(vVec, Vec_IntEntry(vNodes,i))); i++ )
145#define If_DsdVecForEachNode( vVec, pObj, i ) \
146 Vec_PtrForEachEntryStart( If_DsdObj_t *, vVec, pObj, i, 2 )
147#define If_DsdObjForEachFanin( vVec, pObj, pFanin, i ) \
148 for ( i = 0; (i < If_DsdObjFaninNum(pObj)) && ((pFanin) = If_DsdObjFanin(vVec, pObj, i)); i++ )
149#define If_DsdObjForEachFaninLit( vVec, pObj, iLit, i ) \
150 for ( i = 0; (i < If_DsdObjFaninNum(pObj)) && ((iLit) = If_DsdObjFaninLit(pObj, i)); i++ )
179 return Vec_PtrSize( &
p->vObjs );
191 return (Abc_Base2Log(
p->nVars + 1) + 1) *
p->nVars;
195 p->LutSize = nLutSize;
199 return If_DsdVecLitSuppSize( &
p->vObjs, iDsd );
203 return If_DsdVecObjMark( &
p->vObjs, Abc_Lit2Var(iDsd) );
207 return If_DsdVecObjMark( &
p->vObjs, Abc_Lit2Var(iDsd) );
211 if (
p->nObjsPrev == 0 )
213 p->fNewAsUseless = 1;
217 return p->vConfigs ? Vec_WrdEntryP(
p->vConfigs,
p->nConfigWords * Abc_Lit2Var(iDsd)) : NULL;
235static inline word ** If_ManDsdTtElems()
238 if ( pTtElems[0] == NULL )
242 pTtElems[v] = TtElems[v];
249 int nWords = If_DsdObjWordNum( nFans );
251 If_DsdObjClean( pObj );
254 pObj->
Id = Vec_PtrSize( &
p->vObjs );
255 pObj->
fMark =
p->fNewAsUseless;
257 Vec_PtrPush( &
p->vObjs, pObj );
258 Vec_IntPush( &
p->vNexts, 0 );
259 Vec_IntPush( &
p->vTruths, -1 );
260 assert( Vec_IntSize(&
p->vNexts) == Vec_PtrSize(&
p->vObjs) );
261 assert( Vec_IntSize(&
p->vTruths) == Vec_PtrSize(&
p->vObjs) );
269 sprintf( pFileName,
"%02d.dsd", nVars );
271 p->pStore = Abc_UtilStrsav( pFileName );
273 p->LutSize = LutSize;
274 p->nWords = Abc_TtWordNum( nVars );
275 p->nBins = Abc_PrimeCudd( 100000 );
279 Vec_PtrGrow( &
p->vObjs, 10000 );
280 Vec_IntGrow( &
p->vNexts, 10000 );
281 Vec_IntGrow( &
p->vTruths, 10000 );
284 p->vTemp1 = Vec_IntAlloc( 32 );
285 p->vTemp2 = Vec_IntAlloc( 32 );
286 p->pTtElems = If_ManDsdTtElems();
287 for ( v = 3; v <= nVars; v++ )
289 p->vTtMem[v] = Vec_MemAlloc( Abc_TtWordNum(v), 12 );
290 Vec_MemHashAlloc(
p->vTtMem[v], 10000 );
291 p->vTtDecs[v] = Vec_PtrAlloc( 1000 );
299 for ( v = 2; v < nVars; v++ )
303 p->vCover = Vec_IntAlloc( 0 );
311 if (
p->vIsops[3] != NULL )
313 if ( Vec_PtrSize(&
p->vObjs) > 2 )
314 printf(
"Warning: DSD manager is already started without ISOPs.\n" );
315 for ( v = 3; v <= nLutSize; v++ )
317 p->vIsops[v] = Vec_WecAlloc( 100 );
320 vLevel = Vec_WecPushLevel(
p->vIsops[v] );
322 if ( fCompl >= 0 && Vec_IntSize(
p->vCover) <= 8 )
324 Vec_IntGrow( vLevel, Vec_IntSize(
p->vCover) );
325 Vec_IntAppend( vLevel,
p->vCover );
327 vLevel->nCap ^= (1<<16);
330 assert( Vec_WecSize(
p->vIsops[v]) == Vec_MemEntryNum(
p->vTtMem[v]) );
342 for ( v = 3; v <=
p->nVars; v++ )
344 sprintf( FileName,
"dumpdsd%02d", v );
345 Vec_MemDumpTruthTables(
p->vTtMem[v], FileName, v );
348 for ( v = 2; v <
p->nVars; v++ )
350 for ( v = 3; v <=
p->nVars; v++ )
352 Vec_MemHashFree(
p->vTtMem[v] );
353 Vec_MemFree(
p->vTtMem[v] );
356 Vec_WecFree(
p->vIsops[v] );
358 Vec_WrdFreeP( &
p->vConfigs );
359 Vec_IntFreeP( &
p->vTemp1 );
360 Vec_IntFreeP( &
p->vTemp2 );
366 Vec_IntFreeP( &
p->vCover );
375 char * pFileName =
"tts_nondsd.txt";
378 FILE * pFile = fopen( pFileName,
"wb" );
382 printf(
"Cannot open file \"%s\".\n", pFileName );
385 for ( v = 3; v <=
p->nVars; v++ )
387 vMap = Vec_IntStart( Vec_MemEntryNum(
p->vTtMem[v]) );
390 if ( Support && Support != If_DsdObjSuppSize(pObj) )
394 if ( Vec_IntEntry(vMap, If_DsdObjTruthId(
p, pObj)) )
396 Vec_IntWriteEntry(vMap, If_DsdObjTruthId(
p, pObj), 1);
397 fprintf( pFile,
"0x" );
398 Abc_TtPrintHexRev( pFile, If_DsdObjTruth(
p, pObj), Support ? Abc_MaxInt(Support, 6) : v );
399 fprintf( pFile,
"\n" );
410 char * pFileName =
"tts_all.txt";
413 FILE * pFile = fopen( pFileName,
"wb" );
416 printf(
"Cannot open file \"%s\".\n", pFileName );
421 if ( Support && Support != If_DsdObjSuppSize(pObj) )
424 fprintf( pFile,
"0x" );
425 Abc_TtPrintHexRev( pFile, pRes, Support ? Abc_MaxInt(Support, 6) :
p->nVars );
426 fprintf( pFile,
"\n" );
458 for ( i = 0; i <
p->nBins; i++ )
461 for ( pSpot =
p->pBins + i; *pSpot; pSpot = (
unsigned *)Vec_IntEntryP(&
p->vNexts, pObj->
Id), Counter++ )
462 pObj = If_DsdVecObj( &
p->vObjs, *pSpot );
474 pObj = If_DsdVecObj( &
p->vObjs, Id );
488 char OpenType[7] = {0, 0, 0,
'(',
'[',
'<',
'{'};
489 char CloseType[7] = {0, 0, 0,
')',
']',
'>',
'}'};
492 fprintf( pFile,
"%s", Abc_LitIsCompl(iDsdLit) ?
"!" :
"" );
493 pObj = If_DsdVecObj( &
p->vObjs, Abc_Lit2Var(iDsdLit) );
495 { fprintf( pFile,
"0" );
return; }
498 int iPermLit = pPermLits ? (int)pPermLits[(*pnSupp)++] : Abc_Var2Lit((*pnSupp)++, 0);
499 fprintf( pFile,
"%s%c", Abc_LitIsCompl(iPermLit)?
"!":
"",
'a' + Abc_Lit2Var(iPermLit) );
503 Abc_TtPrintHexRev( pFile, If_DsdObjTruth(
p, pObj), If_DsdObjFaninNum(pObj) );
504 fprintf( pFile,
"%c", OpenType[If_DsdObjType(pObj)] );
507 fprintf( pFile,
"%c", CloseType[If_DsdObjType(pObj)] );
512 fprintf( pFile,
"%6d : ", iObjId );
513 fprintf( pFile,
"%2d ", If_DsdVecObjSuppSize(&
p->vObjs, iObjId) );
514 fprintf( pFile,
"%8d ", If_DsdVecObjRef(&
p->vObjs, iObjId) );
515 fprintf( pFile,
"%d ", If_DsdVecObjMark(&
p->vObjs, iObjId) );
518 fprintf( pFile,
"\n" );
519 assert( nSupp == If_DsdVecObjSuppSize(&
p->vObjs, iObjId) );
521#define DSD_ARRAY_LIMIT 16
525 int i, k, v, nSuppSize, nDecMax = 0;
531 for ( v = 3; v <=
p->nVars; v++ )
533 assert( Vec_MemEntryNum(
p->vTtMem[v]) == Vec_PtrSize(
p->vTtDecs[v]) );
537 pTruth = Vec_MemReadEntry(
p->vTtMem[v], i );
538 nSuppSize = Abc_TtSupportSize( pTruth,
p->nVars );
539 pDecMax[nSuppSize] = Abc_MaxInt( pDecMax[nSuppSize], Vec_IntSize(vDecs) );
540 nDecMax = Abc_MaxInt( nDecMax, Vec_IntSize(vDecs) );
545 pTruth = Vec_MemReadEntry(
p->vTtMem[v], i );
546 nSuppSize = Abc_TtSupportSize( pTruth,
p->nVars );
547 pCountsAll[nSuppSize]++;
548 pCountsSSizes[nSuppSize] += Vec_IntSize(vDecs);
549 pCounts[nSuppSize][Abc_MinInt(
DSD_ARRAY_LIMIT+1,Vec_IntSize(vDecs))]++;
562 fprintf( pFile,
" N : " );
563 fprintf( pFile,
" Total " );
565 fprintf( pFile,
"%6d", k );
566 fprintf( pFile,
" " );
567 fprintf( pFile,
" More" );
568 fprintf( pFile,
" Ave" );
569 fprintf( pFile,
" Max" );
570 fprintf( pFile,
"\n" );
572 for ( i = 0; i <=
p->nVars; i++ )
574 fprintf( pFile,
"%2d : ", i );
575 fprintf( pFile,
"%6d ", pCountsAll[i] );
578 fprintf( pFile,
"%6.1f", 100.0*pCounts[i][k]/Abc_MaxInt(1,pCountsAll[i]) );
579 fprintf( pFile,
" " );
581 fprintf( pFile,
"%6.1f", 100.0*pCounts[i][k]/Abc_MaxInt(1,pCountsAll[i]) );
582 fprintf( pFile,
" " );
583 fprintf( pFile,
"%6.1f", 1.0*pCountsSSizes[i]/Abc_MaxInt(1,pCountsAll[i]) );
584 fprintf( pFile,
" " );
585 fprintf( pFile,
"%6d", pDecMax[i] );
586 fprintf( pFile,
"\n" );
594 int nOccurs, nOccursMax, nOccursAll;
595 int i, k, nSizeMax, Counter = 0;
597 nOccursMax = nOccursAll = 0;
600 nOccurs = pObj->
Count;
601 nOccursAll += nOccurs;
602 nOccursMax = Abc_MaxInt( nOccursMax, nOccurs );
605 nSizeMax = 10 * (Abc_Base10Log(nOccursMax) + 1);
606 vOccurs = Vec_IntStart( nSizeMax );
610 nOccurs = pObj->
Count;
612 Vec_IntAddToEntry( vOccurs, nOccurs, 1 );
613 else if ( nOccurs < 100 )
614 Vec_IntAddToEntry( vOccurs, 10 + nOccurs/10, 1 );
615 else if ( nOccurs < 1000 )
616 Vec_IntAddToEntry( vOccurs, 20 + nOccurs/100, 1 );
617 else if ( nOccurs < 10000 )
618 Vec_IntAddToEntry( vOccurs, 30 + nOccurs/1000, 1 );
619 else if ( nOccurs < 100000 )
620 Vec_IntAddToEntry( vOccurs, 40 + nOccurs/10000, 1 );
621 else if ( nOccurs < 1000000 )
622 Vec_IntAddToEntry( vOccurs, 50 + nOccurs/100000, 1 );
623 else if ( nOccurs < 10000000 )
624 Vec_IntAddToEntry( vOccurs, 60 + nOccurs/1000000, 1 );
626 fprintf( pFile,
"The distribution of object occurrences:\n" );
627 for ( k = 0; k < nSizeMax; k++ )
629 if ( Vec_IntEntry(vOccurs, k) == 0 )
632 fprintf( pFile,
"%15d : ", k );
635 sprintf( Buffer,
"%d - %d", (
int)pow((
double)10, k/10) * (k%10), (
int)pow((
double)10, k/10) * (k%10+1) - 1 );
636 fprintf( pFile,
"%15s : ", Buffer );
638 fprintf( pFile,
"%12d ", Vec_IntEntry(vOccurs, k) );
639 Counter += Vec_IntEntry(vOccurs, k);
640 fprintf( pFile,
"(%6.2f %%)", 100.0*Counter/Vec_PtrSize(&
p->vObjs) );
641 fprintf( pFile,
"\n" );
643 Vec_IntFree( vOccurs );
644 fprintf( pFile,
"Fanins: Max = %d. Ave = %.2f.\n", nOccursMax, 1.0*nOccursAll/Vec_PtrSize(&
p->vObjs) );
656 for ( i = 3; i <=
p->nVars; i++ )
658 CountObjNpn[i] = Vec_MemEntryNum(
p->vTtMem[i]);
659 CountObjNpn[
p->nVars+1] += Vec_MemEntryNum(
p->vTtMem[i]);
663 CountObj[If_DsdObjFaninNum(pObj)]++, CountObj[
p->nVars+1]++;
665 CountObjNon[If_DsdObjFaninNum(pObj)]++, CountObjNon[
p->nVars+1]++;
666 CountStr[If_DsdObjSuppSize(pObj)]++, CountStr[
p->nVars+1]++;
668 CountStrNon[If_DsdObjSuppSize(pObj)]++, CountStrNon[
p->nVars+1]++;
669 if ( If_DsdVecObjMark(&
p->vObjs, i) )
670 CountMarked[If_DsdObjSuppSize(pObj)]++, CountMarked[
p->nVars+1]++;
672 printf(
"***** DSD MANAGER STATISTICS *****\n" );
673 printf(
"Support " );
675 printf(
"ObjNDSD " );
676 printf(
"NPNNDSD " );
678 printf(
"StrNDSD " );
681 for ( i = 0; i <=
p->nVars + 1; i++ )
683 if ( i ==
p->nVars + 1 )
686 printf(
"%3d : ", i );
687 printf(
"%9d ", CountObj[i] );
688 printf(
"%9d ", CountObjNon[i] );
689 printf(
"%6.2f %% ", 100.0 * CountObjNon[i] / Abc_MaxInt(1, CountObj[i]) );
690 printf(
"%9d ", CountObjNpn[i] );
691 printf(
"%6.2f %% ", 100.0 * CountObjNpn[i] / Abc_MaxInt(1, CountObj[i]) );
693 printf(
"%9d ", CountStr[i] );
694 printf(
"%9d ", CountStrNon[i] );
695 printf(
"%6.2f %% ", 100.0 * CountStrNon[i] / Abc_MaxInt(1, CountStr[i]) );
696 printf(
"%9d ", CountMarked[i] );
697 printf(
"%6.2f %%", 100.0 * CountMarked[i] / Abc_MaxInt(1, CountStr[i]) );
705 int CountUsed = 0, CountNonDsd = 0, CountNonDsdStr = 0, CountMarked = 0, CountPrime = 0;
706 int i, v, * pPerm, DsdMax = 0, MemSizeTTs = 0, MemSizeDecs = 0;
708 pFile = pFileName ? fopen( pFileName,
"wb" ) : stdout;
709 if ( pFileName && pFile == NULL )
711 printf(
"cannot open output file\n" );
716 fprintf( pFile,
"***** NOTATIONS USED BELOW *****\n" );
717 fprintf( pFile,
"Support -- the support size\n" );
718 fprintf( pFile,
"Obj -- the number of nodes in the DSD manager for each support size\n" );
719 fprintf( pFile,
" (the constant node and the primary input node have no support)\n" );
720 fprintf( pFile,
"ObjNDSD -- the number of prime nodes (that is, nodes whose function has no DSD)\n" );
721 fprintf( pFile,
" (percentage is relative to the number of all nodes of that size)\n" );
722 fprintf( pFile,
"NPNNDSD -- the number of different NPN classes of prime nodes\n" );
723 fprintf( pFile,
" (Each NPN class may appear more than once. For example: F1 = 17(ab(cd))\n" );
724 fprintf( pFile,
" and F2 = 17(ab[cd]) both have prime majority node (hex TT is 17),\n" );
725 fprintf( pFile,
" but in one case the majority node is fed by AND, and in another by XOR.\n" );
726 fprintf( pFile,
" These two majority nodes are different nodes in the DSD manager\n" );
727 fprintf( pFile,
"Str -- the number of structures for each support size\n" );
728 fprintf( pFile,
" (each structure is composed of one or more nodes)\n" );
729 fprintf( pFile,
"StrNDSD -- the number of DSD structures containing at least one prime node\n" );
730 fprintf( pFile,
"Marked -- the number of DSD structures matchable with the LUT structure (say, \"44\")\n" );
735 DsdMax = Abc_MaxInt( DsdMax, pObj->
nFans );
738 CountUsed += ( If_DsdVecObjRef(&
p->vObjs, pObj->
Id) > 0 );
739 CountMarked += If_DsdVecObjMark( &
p->vObjs, i );
741 for ( v = 3; v <=
p->nVars; v++ )
743 CountNonDsd += Vec_MemEntryNum(
p->vTtMem[v]);
744 MemSizeTTs += Vec_MemEntrySize(
p->vTtMem[v]) * Vec_MemEntryNum(
p->vTtMem[v]);
745 MemSizeDecs += (int)Vec_VecMemoryInt((
Vec_Vec_t *)(
p->vTtDecs[v]));
748 printf(
"Number of inputs = %d. LUT size = %d. Marks = %s. NewAsUseless = %s. Bookmark = %d.\n",
751 printf(
"Symbolic cell description: %s\n",
p->pCellStr );
753 fprintf( pFile,
"Non-DSD AIG nodes = %8d\n", Gia_ManAndNum(
p->pTtGia) );
754 fprintf( pFile,
"Unique table misses = %8d\n",
p->nUniqueMisses );
755 fprintf( pFile,
"Unique table hits = %8d\n",
p->nUniqueHits );
756 fprintf( pFile,
"Memory used for objects = %8.2f MB.\n", 1.0*
Mem_FlexReadMemUsage(
p->pMem)/(1<<20) );
757 fprintf( pFile,
"Memory used for functions = %8.2f MB.\n", 8.0*(MemSizeTTs+
sizeof(
int)*Vec_IntCap(&
p->vTruths))/(1<<20) );
758 fprintf( pFile,
"Memory used for hash table = %8.2f MB.\n", 1.0*
sizeof(
int)*(
p->nBins+Vec_IntCap(&
p->vNexts))/(1<<20) );
759 fprintf( pFile,
"Memory used for bound sets = %8.2f MB.\n", 1.0*MemSizeDecs/(1<<20) );
760 fprintf( pFile,
"Memory used for array = %8.2f MB.\n", 1.0*
sizeof(
void *)*Vec_PtrCap(&
p->vObjs)/(1<<20) );
762 fprintf( pFile,
"Memory used for AIG = %8.2f MB.\n", 8.0*Gia_ManAndNum(
p->pTtGia)/(1<<20) );
765 Abc_PrintTime( 1,
"Time DSD ",
p->timeDsd );
766 Abc_PrintTime( 1,
"Time canon ",
p->timeCanon-
p->timeCheck );
767 Abc_PrintTime( 1,
"Time check ",
p->timeCheck );
768 Abc_PrintTime( 1,
"Time check2",
p->timeCheck2 );
769 Abc_PrintTime( 1,
"Time verify",
p->timeVerify );
781 vStructs = Vec_IntAlloc( 1000 );
782 vCounts = Vec_IntAlloc( 1000 );
785 if ( Number && i % Number )
787 if ( Support && Support != If_DsdObjSuppSize(pObj) )
789 Vec_IntPush( vStructs, i );
790 Vec_IntPush( vCounts, -(
int)pObj->
Count );
795 for ( i = 0; i < Abc_MinInt(Vec_IntSize(vCounts), 20); i++ )
797 printf(
"%2d : ", i+1 );
798 pObj = If_DsdVecObj( &
p->vObjs, Vec_IntEntry(vStructs, pPerm[i]) );
802 Vec_IntFree( vStructs );
803 Vec_IntFree( vCounts );
822 pObj = If_DsdVecObj( &
p->vObjs, Id );
825 if ( If_DsdObjFaninNum(pObj) == nVars )
828 if ( Abc_Lit2Var(iFanin) == 1 && i == iVarMax )
849 if ( If_DsdObjType(p0) < If_DsdObjType(p1) )
851 if ( If_DsdObjType(p0) > If_DsdObjType(p1) )
855 if ( If_DsdObjFaninNum(p0) < If_DsdObjFaninNum(p1) )
857 if ( If_DsdObjFaninNum(p0) > If_DsdObjFaninNum(p1) )
861 if ( If_DsdObjTruthId(pMan, p0) < If_DsdObjTruthId(pMan, p1) )
863 if ( If_DsdObjTruthId(pMan, p0) > If_DsdObjTruthId(pMan, p1) )
866 for ( i = 0; i < If_DsdObjFaninNum(p0); i++ )
868 Res =
If_DsdObjCompare( pMan,
p, If_DsdObjFaninLit(p0, i), If_DsdObjFaninLit(p1, i) );
872 if ( Abc_LitIsCompl(iLit0) > Abc_LitIsCompl(iLit1) )
874 if ( Abc_LitIsCompl(iLit0) < Abc_LitIsCompl(iLit1) )
882 for ( i = 0; i < nLits-1; i++ )
885 for ( j = i+1; j < nLits; j++ )
890 ABC_SWAP(
int, pLits[i], pLits[best_i] );
892 ABC_SWAP(
int, pPerm[i], pPerm[best_i] );
907static inline unsigned If_DsdObjHashKey(
If_DsdMan_t *
p,
int Type,
int * pLits,
int nLits,
int truthId )
909 static int s_Primes[24] = { 1049, 1297, 1559, 1823, 2089, 2371, 2663, 2909,
910 3221, 3517, 3779, 4073, 4363, 4663, 4973, 5281,
911 5573, 5861, 6199, 6481, 6803, 7109, 7477, 7727 };
913 unsigned uHash = Type * 7873 + nLits * 8147;
914 for ( i = 0; i < nLits; i++ )
915 uHash += pLits[i] * s_Primes[i & 0xF];
917 uHash += truthId * s_Primes[i & 0xF];
918 return uHash %
p->nBins;
923 unsigned * pSpot =
p->pBins + If_DsdObjHashKey(
p, Type, pLits, nLits, truthId);
924 for ( ; *pSpot; pSpot = (
unsigned *)Vec_IntEntryP(&
p->vNexts, pObj->
Id) )
926 pObj = If_DsdVecObj( &
p->vObjs, *pSpot );
927 if ( If_DsdObjType(pObj) == Type &&
928 If_DsdObjFaninNum(pObj) == nLits &&
929 !
memcmp(pObj->
pFans, pLits,
sizeof(
int)*If_DsdObjFaninNum(pObj)) &&
930 truthId == If_DsdObjTruthId(
p, pObj) )
943 int i, Prev =
p->nUniqueMisses;
944 p->nBins = Abc_PrimeCudd( 2 *
p->nBins );
946 memset(
p->pBins, 0,
sizeof(
unsigned) *
p->nBins );
947 Vec_IntFill( &
p->vNexts, Vec_PtrSize(&
p->vObjs), 0 );
954 assert(
p->nUniqueMisses - Prev == Vec_PtrSize(&
p->vObjs) - 2 );
955 p->nUniqueMisses = Prev;
965 assert( Type !=
DAU_DSD_MUX || !Abc_LitIsCompl(pLits[1]) || !Abc_LitIsCompl(pLits[2]) );
969 for ( i = 0; i < nLits; i++ )
971 pFanin = If_DsdVecObj( &
p->vObjs, Abc_Lit2Var(pLits[i]) );
981 If_DsdObjSetTruth(
p, pObj, truthId );
983 for ( i = 0; i < nLits; i++ )
985 pObj->
pFans[i] = pLits[i];
986 pObj->
nSupp += If_DsdVecLitSuppSize(&
p->vObjs, pLits[i]);
990 If_DsdVecObjSetMark( &
p->vObjs, pObj->
Id );
995 int PrevSize = (Type ==
IF_DSD_PRIME) ? Vec_MemEntryNum(
p->vTtMem[nLits] ) : -1;
996 int objId, truthId = (Type ==
IF_DSD_PRIME) ? Vec_MemHashInsert(
p->vTtMem[nLits], pTruth) : -1;
1002 if (
p->LutSize && truthId >= 0 && truthId == Vec_PtrSize(
p->vTtDecs[nLits]) )
1005 assert( truthId == Vec_MemEntryNum(
p->vTtMem[nLits])-1 );
1006 Vec_PtrPush(
p->vTtDecs[nLits], vSets );
1009 if (
p->vIsops[nLits] && truthId >= 0 && PrevSize != Vec_MemEntryNum(
p->vTtMem[nLits]) )
1011 Vec_Int_t * vLevel = Vec_WecPushLevel(
p->vIsops[nLits] );
1012 int fCompl =
Kit_TruthIsop( (
unsigned *)pTruth, nLits,
p->vCover, 1 );
1013 if ( fCompl >= 0 && Vec_IntSize(
p->vCover) <= 8 )
1015 Vec_IntGrow( vLevel, Vec_IntSize(
p->vCover) );
1016 Vec_IntAppend( vLevel,
p->vCover );
1018 vLevel->nCap ^= (1<<16);
1020 assert( Vec_WecSize(
p->vIsops[nLits]) == Vec_MemEntryNum(
p->vTtMem[nLits]) );
1022 if (
p->pTtGia && truthId >= 0 && truthId == Vec_MemEntryNum(
p->vTtMem[nLits])-1 )
1025 int Lit =
Kit_TruthToGia(
p->pTtGia, (
unsigned *)pTruth, nLits,
p->vCover, NULL, 1 );
1027 Gia_ManAppendCo(
p->pTtGia, Lit );
1030 *pSpot = Vec_PtrSize( &
p->vObjs );
1032 if ( Vec_PtrSize(&
p->vObjs) >
p->nBins )
1033 If_DsdObjHashResize(
p );
1055 FILE * pFile = fopen( pFileName ? pFileName :
p->pStore,
"wb" );
1056 if ( pFile == NULL )
1058 printf(
"Writing DSD manager file \"%s\" has failed.\n", pFileName ? pFileName :
p->pStore );
1063 fwrite( &Num, 4, 1, pFile );
1065 fwrite( &Num, 4, 1, pFile );
1066 Num = Vec_PtrSize(&
p->vObjs);
1067 fwrite( &Num, 4, 1, pFile );
1070 Num = If_DsdObjWordNum( pObj->
nFans );
1071 fwrite( &Num, 4, 1, pFile );
1072 fwrite( pObj,
sizeof(
word)*Num, 1, pFile );
1074 fwrite( Vec_IntEntryP(&
p->vTruths, i), 4, 1, pFile );
1076 for ( v = 3; v <=
p->nVars; v++ )
1078 int nBytes =
sizeof(
word)*Vec_MemEntrySize(
p->vTtMem[v]);
1079 Num = Vec_MemEntryNum(
p->vTtMem[v]);
1080 fwrite( &Num, 4, 1, pFile );
1082 fwrite( pTruth, nBytes, 1, pFile );
1083 Num = Vec_PtrSize(
p->vTtDecs[v]);
1084 fwrite( &Num, 4, 1, pFile );
1087 Num = Vec_IntSize(vSets);
1088 fwrite( &Num, 4, 1, pFile );
1089 fwrite( Vec_IntArray(vSets),
sizeof(
int)*Num, 1, pFile );
1092 Num =
p->nConfigWords;
1093 fwrite( &Num, 4, 1, pFile );
1095 fwrite( &Num, 4, 1, pFile );
1096 Num =
p->vConfigs ? Vec_WrdSize(
p->vConfigs) : 0;
1097 fwrite( &Num, 4, 1, pFile );
1099 fwrite( Vec_WrdArray(
p->vConfigs),
sizeof(
word)*Num, 1, pFile );
1100 Num =
p->pCellStr ?
strlen(
p->pCellStr) : 0;
1101 fwrite( &Num, 4, 1, pFile );
1103 fwrite(
p->pCellStr,
sizeof(
char)*Num, 1, pFile );
1114 int i, v, Num, Num2, RetValue;
1115 FILE * pFile = fopen( pFileName,
"rb" );
1116 if ( pFile == NULL )
1118 printf(
"Reading DSD manager file \"%s\" has failed.\n", pFileName );
1121 RetValue = fread( pBuffer, 4, 1, pFile );
1124 printf(
"Unrecognized format of file \"%s\".\n", pFileName );
1127 RetValue = fread( &Num, 4, 1, pFile );
1130 p->pStore = Abc_UtilStrsav( pFileName );
1131 RetValue = fread( &Num, 4, 1, pFile );
1134 RetValue = fread( &Num, 4, 1, pFile );
1136 Vec_PtrFillExtra( &
p->vObjs, Num, NULL );
1137 Vec_IntFill( &
p->vNexts, Num, 0 );
1138 Vec_IntFill( &
p->vTruths, Num, -1 );
1139 p->nBins = Abc_PrimeCudd( 2*Num );
1141 memset(
p->pBins, 0,
sizeof(
unsigned) *
p->nBins );
1142 for ( i = 2; i < Vec_PtrSize(&
p->vObjs); i++ )
1144 RetValue = fread( &Num, 4, 1, pFile );
1146 RetValue = fread( pObj,
sizeof(
word)*Num, 1, pFile );
1147 Vec_PtrWriteEntry( &
p->vObjs, i, pObj );
1150 RetValue = fread( &Num, 4, 1, pFile );
1151 Vec_IntWriteEntry( &
p->vTruths, i, Num );
1157 assert(
p->nUniqueMisses == Vec_PtrSize(&
p->vObjs) - 2 );
1158 p->nUniqueMisses = 0;
1160 for ( v = 3; v <=
p->nVars; v++ )
1162 int nBytes =
sizeof(
word)*Vec_MemEntrySize(
p->vTtMem[v]);
1163 RetValue = fread( &Num, 4, 1, pFile );
1164 for ( i = 0; i < Num; i++ )
1166 RetValue = fread( pTruth, nBytes, 1, pFile );
1167 Vec_MemHashInsert(
p->vTtMem[v], pTruth );
1169 assert( Num == Vec_MemEntryNum(
p->vTtMem[v]) );
1170 RetValue = fread( &Num2, 4, 1, pFile );
1171 for ( i = 0; i < Num2; i++ )
1173 RetValue = fread( &Num, 4, 1, pFile );
1174 vSets = Vec_IntAlloc( Num );
1175 RetValue = fread( Vec_IntArray(vSets),
sizeof(
int)*Num, 1, pFile );
1177 Vec_PtrPush(
p->vTtDecs[v], vSets );
1179 assert( Num2 == Vec_PtrSize(
p->vTtDecs[v]) );
1182 RetValue = fread( &Num, 4, 1, pFile );
1183 p->nConfigWords = Num;
1184 RetValue = fread( &Num, 4, 1, pFile );
1186 RetValue = fread( &Num, 4, 1, pFile );
1187 if ( RetValue && Num )
1189 p->vConfigs = Vec_WrdStart( Num );
1190 RetValue = fread( Vec_WrdArray(
p->vConfigs),
sizeof(
word)*Num, 1, pFile );
1192 RetValue = fread( &Num, 4, 1, pFile );
1193 if ( RetValue && Num )
1196 RetValue = fread(
p->pCellStr,
sizeof(
char)*Num, 1, pFile );
1206 int i, k, iFanin, Id;
1207 if (
p->nVars < pNew->
nVars )
1209 printf(
"The number of variables should be the same or smaller.\n" );
1214 printf(
"LUT size should be the same.\n" );
1220 printf(
"Warning! Old manager has %smarks while new manager has %smarks.\n",
1222 vMap = Vec_IntAlloc( Vec_PtrSize(&pNew->
vObjs) );
1223 Vec_IntPush( vMap, 0 );
1224 Vec_IntPush( vMap, 1 );
1226 Vec_WrdFillExtra(
p->vConfigs,
p->nConfigWords * (Vec_PtrSize(&
p->vObjs) + Vec_PtrSize(&pNew->
vObjs)), 0 );
1230 pFanins[k] = Abc_Lit2LitV( Vec_IntArray(vMap), iFanin );
1233 If_DsdVecObjSetMark( &
p->vObjs, Id );
1234 if (
p->vConfigs && pNew->
vConfigs &&
p->nConfigWords * i < Vec_WrdSize(pNew->
vConfigs) )
1237 word * pConfigNew = Vec_WrdEntryP(pNew->
vConfigs,
p->nConfigWords * i);
1238 word * pConfigOld = Vec_WrdEntryP(
p->vConfigs,
p->nConfigWords * Id);
1239 memcpy( pConfigOld, pConfigNew,
sizeof(
word) *
p->nConfigWords );
1241 Vec_IntPush( vMap, Id );
1243 assert( Vec_IntSize(vMap) == Vec_PtrSize(&pNew->
vObjs) );
1244 Vec_IntFree( vMap );
1246 Vec_WrdShrink(
p->vConfigs,
p->nConfigWords * Vec_PtrSize(&
p->vObjs) );
1260 Vec_WrdFreeP( &
p->vConfigs );
1278 if ( Vec_IntEntry(vMap, i) >= 0 )
1281 pObj = If_DsdVecObj( &
p->vObjs, i );
1286 pFanins[k] = Abc_Lit2LitV( Vec_IntArray(vMap), iFanin );
1289 If_DsdVecObjSetMark( &pNew->
vObjs, Id );
1290 If_DsdVecObj( &pNew->
vObjs, Id )->Count = pObj->
Count;
1292 Vec_IntWriteEntry( vMap, i, Id );
1300 vMap = Vec_IntStartFull( Vec_PtrSize(&
p->vObjs) );
1301 Vec_IntWriteEntry( vMap, 0, 0 );
1302 Vec_IntWriteEntry( vMap, 1, 1 );
1304 if ( (
int)pObj->
Count >= Limit )
1306 Vec_IntFree( vMap );
1323 int i, iFanin, iFirst;
1335 Vec_IntPush( vNodes, Id );
1336 Vec_IntPush( vFirsts, iFirst );
1341 Vec_IntClear( vNodes );
1342 Vec_IntClear( vFirsts );
1359 int i, iFanin, fCompl = Abc_LitIsCompl(iDsd);
1360 If_DsdObj_t * pObj = If_DsdVecObj( &
p->vObjs, Abc_Lit2Var(iDsd) );
1363 int iPermLit = pPermLits ? (int)pPermLits[*pnSupp] : Abc_Var2Lit(*pnSupp, 0);
1365 assert( (*pnSupp) <=
p->nVars );
1366 Abc_TtCopy( pRes,
p->pTtElems[Abc_Lit2Var(iPermLit)],
p->nWords, fCompl ^ Abc_LitIsCompl(iPermLit) );
1373 Abc_TtConst1( pRes,
p->nWords );
1375 Abc_TtConst0( pRes,
p->nWords );
1380 Abc_TtAnd( pRes, pRes, pTtTemp,
p->nWords, 0 );
1382 Abc_TtXor( pRes, pRes, pTtTemp,
p->nWords, 0 );
1384 if ( fCompl ) Abc_TtNot( pRes,
p->nWords );
1393 Abc_TtMux( pRes, pTtTemp[0], pTtTemp[1], pTtTemp[2],
p->nWords );
1394 if ( fCompl ) Abc_TtNot( pRes,
p->nWords );
1403 if ( fCompl ) Abc_TtNot( pRes,
p->nWords );
1412 If_DsdObj_t * pObj = If_DsdVecObj( &
p->vObjs, Abc_Lit2Var(iDsd) );
1414 Abc_TtConst0( pRes,
p->nWords );
1415 else if ( iDsd == 1 )
1416 Abc_TtConst1( pRes,
p->nWords );
1419 int iPermLit = pPermLits ? (int)pPermLits[nSupp] : Abc_Var2Lit(nSupp, 0);
1421 Abc_TtCopy( pRes,
p->pTtElems[Abc_Lit2Var(iPermLit)],
p->nWords, Abc_LitIsCompl(iDsd) ^ Abc_LitIsCompl(iPermLit) );
1425 assert( nSupp == If_DsdVecLitSuppSize(&
p->vObjs, iDsd) );
1449 pObj = If_DsdVecObj( &
p->vObjs, Abc_Lit2Var(iLit) );
1470 pObj = If_DsdVecObj( &
p->vObjs, Abc_Lit2Var(iLit) );
1472 pPerm[0] = (
unsigned char)Abc_LitNot((
int)pPerm[0]);
1473 else if ( If_DsdObjType(pObj) ==
IF_DSD_XOR )
1482 pPerm += If_DsdVecLitSuppSize(&
p->vObjs, iFanin);
1485 else if ( If_DsdObjType(pObj) ==
IF_DSD_MUX )
1488 pPerm += If_DsdVecLitSuppSize(&
p->vObjs, pObj->
pFans[0]);
1490 pPerm += If_DsdVecLitSuppSize(&
p->vObjs, pObj->
pFans[1]);
1517 for ( i = 0; i < nLits; i++ )
1519 pFirsts[i] = nSSize;
1520 nSSize += If_DsdVecLitSuppSize(&
p->vObjs, pLits[i]);
1531 unsigned char pPermNew[
DAU_MAX_VAR], * pPermStart = pPerm;
1533 int i, k, j, Id, iFanin, fCompl = 0, nSSize = 0;
1536 for ( k = 0; k < nLits; k++ )
1538 if ( Type ==
IF_DSD_XOR && Abc_LitIsCompl(pLits[k]) )
1540 pLits[k] = Abc_LitNot(pLits[k]);
1543 pObj = If_DsdVecObj( &
p->vObjs, Abc_Lit2Var(pLits[k]) );
1544 if ( Type == If_DsdObjType(pObj) && (Type ==
IF_DSD_XOR || !Abc_LitIsCompl(pLits[k])) )
1549 pChildren[nChildren] = iFanin;
1550 pBegEnd[nChildren++] = (nSSize << 16) | (nSSize + If_DsdVecLitSuppSize(&
p->vObjs, iFanin));
1551 nSSize += If_DsdVecLitSuppSize(&
p->vObjs, iFanin);
1556 pChildren[nChildren] = Abc_LitNotCond( pLits[k],
If_DsdManPushInv(
p, pLits[k], pPermStart) );
1557 pBegEnd[nChildren++] = (nSSize << 16) | (nSSize + If_DsdObjSuppSize(pObj));
1558 nSSize += If_DsdObjSuppSize(pObj);
1560 pPermStart += If_DsdObjSuppSize(pObj);
1564 for ( j = i = 0; i < nChildren; i++ )
1565 for ( k = (pBegEnd[i] >> 16); k < (pBegEnd[i] & 0xFF); k++ )
1566 pPermNew[j++] = pPerm[k];
1568 for ( j = 0; j < nSSize; j++ )
1569 pPerm[j] = pPermNew[j];
1575 for ( k = 0; k < nLits; k++ )
1577 pFanin = If_DsdVecObj( &
p->vObjs, Abc_Lit2Var(pLits[k]) );
1578 pLits[k] = Abc_LitNotCond( pLits[k],
If_DsdManPushInv(
p, pLits[k], pPermStart) );
1579 pPermStart += pFanin->
nSupp;
1582 if ( RetValue == 1 || (RetValue == 0 && Abc_LitIsCompl(pLits[0])) )
1584 int nSupp0 = If_DsdVecLitSuppSize( &
p->vObjs, pLits[0] );
1585 int nSupp1 = If_DsdVecLitSuppSize( &
p->vObjs, pLits[1] );
1586 int nSupp2 = If_DsdVecLitSuppSize( &
p->vObjs, pLits[2] );
1587 pLits[0] = Abc_LitNot(pLits[0]);
1588 ABC_SWAP(
int, pLits[1], pLits[2] );
1589 for ( j = k = 0; k < nSupp0; k++ )
1590 pPermNew[j++] = pPerm[k];
1591 for ( k = 0; k < nSupp2; k++ )
1592 pPermNew[j++] = pPerm[nSupp0 + nSupp1 + k];
1593 for ( k = 0; k < nSupp1; k++ )
1594 pPermNew[j++] = pPerm[nSupp0 + k];
1595 for ( j = 0; j < nSupp0 + nSupp1 + nSupp2; j++ )
1596 pPerm[j] = pPermNew[j];
1598 if ( Abc_LitIsCompl(pLits[1]) )
1600 pLits[1] = Abc_LitNot(pLits[1]);
1601 pLits[2] = Abc_LitNot(pLits[2]);
1605 for ( k = 0; k < nLits; k++ )
1607 pFanin = If_DsdVecObj( &
p->vObjs, Abc_Lit2Var(pLits[k]) );
1608 pChildren[nChildren++] = Abc_LitNotCond( pLits[k],
If_DsdManPushInv(
p, pLits[k], pPermStart) );
1609 pPermStart += pFanin->
nSupp;
1617 fCompl = ((uCanonPhase >> nLits) & 1);
1619 for ( j = i = 0; i < nLits; i++ )
1621 int iLitNew = Abc_LitNotCond( pLits[(
int)pCanonPerm[i]], ((uCanonPhase>>i)&1) );
1622 pFanin = If_DsdVecObj( &
p->vObjs, Abc_Lit2Var(iLitNew) );
1623 pPermStart = pPerm + pFirsts[(int)pCanonPerm[i]];
1624 pChildren[nChildren++] = Abc_LitNotCond( iLitNew,
If_DsdManPushInv(
p, iLitNew, pPermStart) );
1625 for ( k = 0; k < (int)pFanin->
nSupp; k++ )
1626 pPermNew[j++] = pPermStart[k];
1629 for ( j = 0; j < nSSize; j++ )
1630 pPerm[j] = pPermNew[j];
1631 Abc_TtStretch6( pTruth, nLits,
p->nVars );
1636 return Abc_Var2Lit( Id, fCompl );
1650static inline void If_DsdMergeMatches(
char * pDsd,
int * pMatches )
1654 for ( i = 0; pDsd[i]; i++ )
1657 if ( pDsd[i] ==
'(' || pDsd[i] ==
'[' || pDsd[i] ==
'<' || pDsd[i] ==
'{' )
1658 pNested[nNested++] = i;
1659 else if ( pDsd[i] ==
')' || pDsd[i] ==
']' || pDsd[i] ==
'>' || pDsd[i] ==
'}' )
1660 pMatches[pNested[--nNested]] = i;
1667 unsigned char * pPermStart = pPerm + *pnSupp;
1668 int iRes = -1, fCompl = 0;
1674 if ( **
p >=
'a' && **
p <=
'z' )
1676 pPerm[(*pnSupp)++] = Abc_Var2Lit( **
p -
'a', fCompl );
1679 if ( **
p ==
'(' || **
p ==
'[' || **
p ==
'<' || **
p ==
'{' )
1682 char * q = pStr + pMatches[ *
p - pStr ];
1685 else if ( **
p ==
'[' )
1687 else if ( **
p ==
'<' )
1689 else if ( **
p ==
'{' )
1692 assert( *q == **
p + 1 + (**
p !=
'(') );
1693 for ( (*
p)++; *
p < q; (*p)++ )
1697 return Abc_LitNotCond( iRes, fCompl );
1699 if ( (**
p >=
'A' && **
p <=
'F') || (**
p >=
'0' && **
p <=
'9') )
1704 int i, nVarsF = Abc_TtReadHex( pFunc, *
p );
1705 *
p += Abc_TtHexDigitNum( nVarsF );
1706 q = pStr + pMatches[ *
p - pStr ];
1707 assert( **
p ==
'{' && *q ==
'}' );
1708 for ( i = 0, (*
p)++; *
p < q; (*p)++, i++ )
1713 return Abc_LitNotCond( iRes, fCompl );
1720 int iRes = -1, fCompl = 0;
1723 if ( Dau_DsdIsConst0(pDsd) )
1725 else if ( Dau_DsdIsConst1(pDsd) )
1727 else if ( Dau_DsdIsVar(pDsd) )
1729 pPerm[(*pnSupp)++] = Dau_DsdReadVar(pDsd);
1735 If_DsdMergeMatches( pDsd, pMatches );
1738 return Abc_LitNotCond( iRes, fCompl );
1755 unsigned uSign = 0;
int i;
1758 return (1 << (2*(*pnSupp)++));
1765 If_DsdObj_t * pFanin = If_DsdObjFanin( &
p->vObjs, pObj, iFan );
1767 return fShared ? (uSign << 1) | uSign : uSign;
1774 pSSizes[i] = If_DsdObjSuppSize(pFanin);
1779 int i[6], LimitOut, SizeIn, SizeOut, pSSizes[
DAU_MAX_VAR];
1780 int nFans = If_DsdObjFaninNum(pObj), pFirsts[
DAU_MAX_VAR];
1783 assert( If_DsdObjSuppSize(pObj) > LutSize );
1785 LimitOut = LutSize - (nSuppAll - pObj->
nSupp + 1);
1786 assert( LimitOut < LutSize );
1787 for ( i[0] = 0; i[0] < nFans; i[0]++ )
1788 for ( i[1] = i[0]+1; i[1] < nFans; i[1]++ )
1790 SizeIn = pSSizes[i[0]] + pSSizes[i[1]];
1791 SizeOut = pObj->
nSupp - SizeIn;
1792 if ( SizeIn > LutSize || SizeOut > LimitOut )
1797 uRes =
If_DsdSign(
p, pObj, i[0], iFirst + pFirsts[i[0]], 0) |
1798 If_DsdSign(
p, pObj, i[1], iFirst + pFirsts[i[1]], 0);
1799 if ( uRes & uMaskNot )
1803 if ( pObj->
nFans == 3 )
1805 for ( i[0] = 0; i[0] < nFans; i[0]++ )
1806 for ( i[1] = i[0]+1; i[1] < nFans; i[1]++ )
1807 for ( i[2] = i[1]+1; i[2] < nFans; i[2]++ )
1809 SizeIn = pSSizes[i[0]] + pSSizes[i[1]] + pSSizes[i[2]];
1810 SizeOut = pObj->
nSupp - SizeIn;
1811 if ( SizeIn > LutSize || SizeOut > LimitOut )
1816 uRes =
If_DsdSign(
p, pObj, i[0], iFirst + pFirsts[i[0]], 0) |
1817 If_DsdSign(
p, pObj, i[1], iFirst + pFirsts[i[1]], 0) |
1818 If_DsdSign(
p, pObj, i[2], iFirst + pFirsts[i[2]], 0);
1819 if ( uRes & uMaskNot )
1823 if ( pObj->
nFans == 4 )
1825 for ( i[0] = 0; i[0] < nFans; i[0]++ )
1826 for ( i[1] = i[0]+1; i[1] < nFans; i[1]++ )
1827 for ( i[2] = i[1]+1; i[2] < nFans; i[2]++ )
1828 for ( i[3] = i[2]+1; i[3] < nFans; i[3]++ )
1830 SizeIn = pSSizes[i[0]] + pSSizes[i[1]] + pSSizes[i[2]] + pSSizes[i[3]];
1831 SizeOut = pObj->
nSupp - SizeIn;
1832 if ( SizeIn > LutSize || SizeOut > LimitOut )
1837 uRes =
If_DsdSign(
p, pObj, i[0], iFirst + pFirsts[i[0]], 0) |
1838 If_DsdSign(
p, pObj, i[1], iFirst + pFirsts[i[1]], 0) |
1839 If_DsdSign(
p, pObj, i[2], iFirst + pFirsts[i[2]], 0) |
1840 If_DsdSign(
p, pObj, i[3], iFirst + pFirsts[i[3]], 0);
1841 if ( uRes & uMaskNot )
1852 assert( If_DsdObjFaninNum(pObj) == 3 );
1853 assert( If_DsdObjSuppSize(pObj) > LutSize );
1855 LimitOut = LutSize - (nSuppAll - If_DsdObjSuppSize(pObj) + 1);
1856 assert( LimitOut < LutSize );
1858 SizeIn = pSSizes[0] + pSSizes[1];
1859 SizeOut = pSSizes[0] + pSSizes[2] + 1;
1860 if ( SizeIn <= LutSize && SizeOut <= LimitOut )
1866 if ( (uRes & uMaskNot) == 0 )
1870 SizeIn = pSSizes[0] + pSSizes[2];
1871 SizeOut = pSSizes[0] + pSSizes[1] + 1;
1872 if ( SizeIn <= LutSize && SizeOut <= LimitOut )
1878 if ( (uRes & uMaskNot) == 0 )
1887 int truthId = If_DsdObjTruthId(
p, pObj);
1888 int nFans = If_DsdObjFaninNum(pObj);
1894 assert( If_DsdObjFaninNum(pObj) > 2 );
1895 assert( If_DsdObjSuppSize(pObj) > LutSize );
1897 LimitOut = LutSize - (nSuppAll - If_DsdObjSuppSize(pObj) + 1);
1898 assert( LimitOut < LutSize );
1901 SizeIn = SizeOut = 0;
1902 for ( v = 0; v < nFans; v++ )
1904 int Value = ((set >> (v << 1)) & 3);
1906 SizeOut += pSSizes[v];
1907 else if ( Value == 1 )
1908 SizeIn += pSSizes[v];
1909 else if ( Value == 3 )
1911 SizeIn += pSSizes[v];
1912 SizeOut += pSSizes[v];
1915 if ( SizeIn > LutSize || SizeOut > LimitOut )
1924 for ( v = 0; v < nFans; v++ )
1926 int Value = ((set >> (v << 1)) & 3);
1929 else if ( Value == 1 )
1930 uRes |=
If_DsdSign(
p, pObj, v, iFirst + pFirsts[v], 0);
1931 else if ( Value == 3 )
1932 uRes |=
If_DsdSign(
p, pObj, v, iFirst + pFirsts[v], 1);
1935 if ( uRes & uMaskNot )
1945 int i, Mask, iFirst;
1947 pObj = If_DsdVecObj( &
p->vObjs, Abc_Lit2Var(iDsd) );
1950 if ( If_DsdObjSuppSize(pObj) <= LutSize )
1953 printf(
" Trivial\n" );
1958 if ( If_DsdObjSuppSize(pTemp) <= LutSize && If_DsdObjSuppSize(pObj) - If_DsdObjSuppSize(pTemp) <= LutSize - 1 )
1961 printf(
" Dec using node " );
1964 iFirst = Vec_IntEntry(
p->vTemp2, i);
1966 if ( uRes & uMaskNot )
1971 if ( (If_DsdObjType(pTemp) ==
IF_DSD_AND || If_DsdObjType(pTemp) ==
IF_DSD_XOR) && If_DsdObjFaninNum(pTemp) > 2 && If_DsdObjSuppSize(pTemp) > LutSize )
1973 if ( (Mask =
If_DsdManCheckAndXor(
p, Vec_IntEntry(
p->vTemp2, i), uMaskNot, pTemp, If_DsdObjSuppSize(pObj), LutSize, fDerive, fVerbose)) )
1978 Abc_TtPrintBinary( (
word *)&Mask, 4 );
1980 printf(
" Using multi-input AND/XOR node\n" );
1985 if ( If_DsdObjType(pTemp) ==
IF_DSD_MUX && If_DsdObjSuppSize(pTemp) > LutSize )
1987 if ( (Mask =
If_DsdManCheckMux(
p, Vec_IntEntry(
p->vTemp2, i), uMaskNot, pTemp, If_DsdObjSuppSize(pObj), LutSize, fDerive, fVerbose)) )
1992 Abc_TtPrintBinary( (
word *)&Mask, 4 );
1994 printf(
" Using multi-input MUX node\n" );
1999 if ( If_DsdObjType(pTemp) ==
IF_DSD_PRIME && If_DsdObjSuppSize(pTemp) > LutSize )
2001 if ( (Mask =
If_DsdManCheckPrime(
p, Vec_IntEntry(
p->vTemp2, i), uMaskNot, pTemp, If_DsdObjSuppSize(pObj), LutSize, fDerive, fVerbose)) )
2008 printf(
" Using prime node\n" );
2013 printf(
" UNDEC\n" );
2020 if ( uSet == 0 && fHighEffort )
2023 int nVars = If_DsdVecLitSuppSize( &
p->vObjs, iDsd );
2067 int iDsd, nSizeNonDec, nSupp = 0;
2068 int nWords = Abc_TtWordNum(nLeaves);
2071 Abc_TtCopy( pCopy, pTruth,
nWords, 0 );
2075 if ( nSizeNonDec > 0 )
2076 Abc_TtStretch6( pCopy, nSizeNonDec,
p->nVars );
2077 memset( pPerm, 0xFF, (
size_t)nLeaves );
2081 assert( nSupp == nLeaves );
2086 if ( !Abc_TtEqual(pRes, pTruth,
nWords) )
2090 printf(
"Verification failed!\n" );
2091 printf(
"%s\n", pDsd );
2097 If_DsdVecObjIncRef( &
p->vObjs, Abc_Lit2Var(iDsd) );
2098 assert( If_DsdVecLitSuppSize(&
p->vObjs, iDsd) == nLeaves );
2117 t = Abc_Tt6Stretch( t, 4 );
2120 Vec_IntFree( vSets );
2140 int iCutVar = Abc_Lit2Var(pPermLits[(*pnSupp)++]);
2141 *pRes = If_CutPinDelayInit(iCutVar);
2142 return pTimes[iCutVar];
2146 word pFaninRes[3], Res0, Res1;
2147 int i, iFanin, Delays[3];
2150 Res0 = If_CutPinDelayMax( pFaninRes[0], pFaninRes[1], nSuppAll, 1 );
2151 Res1 = If_CutPinDelayMax( pFaninRes[0], pFaninRes[2], nSuppAll, 1 );
2152 *pRes = If_CutPinDelayMax( Res0, Res1, nSuppAll, 1 );
2153 return 2 + Abc_MaxInt(Delays[0], Abc_MaxInt(Delays[1], Delays[2]));
2159 Vec_Int_t * vCover = Vec_WecEntry(
p->vIsops[pObj->
nFans], If_DsdObjTruthId(
p, pObj) );
2160 assert( Vec_IntSize(vCover) > 0 );
2168 int i, iFanin, Delay, Result = 0;
2174 Result = If_LogCounterPinDelays( pCounter, &nCounter, pFaninRes, Delay, pFaninRes[i], nSuppAll, fXor );
2178 Result = If_LogCounterDelayXor( pCounter, nCounter );
2179 *pRes = If_LogPinDelaysMulti( pFaninRes, nCounter, nSuppAll, fXor );
2190 return (
int)If_ObjCutBest(If_CutLeaf(
p, pCut, 0))->Delay;
2196 for ( i = 0; i < If_CutLeaveNum(pCut); i++ )
2197 pTimes[i] = (
int)If_ObjCutBest(If_CutLeaf(
p, pCut, i))->Delay;
2198 Delay =
If_CutDsdBalancePinDelays_rec(
p->pIfDsdMan, Abc_Lit2Var(If_CutDsdLit(
p, pCut)), pTimes, &Result, &nSupp, If_CutLeaveNum(pCut), If_CutDsdPerm(
p, pCut) );
2199 assert( nSupp == If_CutLeaveNum(pCut) );
2200 If_CutPinDelayTranslate( Result, If_CutLeaveNum(pCut), pPerm );
2220 assert( iVar >= 0 && iVar < nVars );
2221 for ( i = 0; i < nVars; i++ )
2222 if ( iVar == Abc_Lit2Var((
int)pPermLits[i]) )
2244 int iCutVar = Abc_Lit2Var( pPermLits[*pnSupp] );
2246 *piLit = Abc_Var2Lit( iCutVar, Abc_LitIsCompl(pPermLits[*pnSupp]) );
2248 return pTimes[iCutVar];
2252 int i, iFanin, Delays[3], pFaninLits[3];
2255 Delays[i] =
If_CutDsdBalanceEval_rec(
p, Abc_Lit2Var(iFanin), pTimes, pnSupp, vAig, pFaninLits+i, nSuppAll, pArea, pPermLits );
2256 if ( Delays[i] == -1 )
2259 pFaninLits[i] = Abc_LitNotCond( pFaninLits[i], Abc_LitIsCompl(iFanin) );
2262 *piLit = If_LogCreateMux( vAig, pFaninLits[0], pFaninLits[1], pFaninLits[2], nSuppAll );
2265 return 2 + Abc_MaxInt(Delays[0], Abc_MaxInt(Delays[1], Delays[2]));
2270 Vec_Int_t * vCover = Vec_WecEntry(
p->vIsops[pObj->
nFans], If_DsdObjTruthId(
p, pObj) );
2271 if ( Vec_IntSize(vCover) == 0 )
2275 Delays[i] =
If_CutDsdBalanceEval_rec(
p, Abc_Lit2Var(iFanin), pTimes, pnSupp, vAig, pFaninLits+i, nSuppAll, pArea, pPermLits );
2276 if ( Delays[i] == -1 )
2279 pFaninLits[i] = Abc_LitNotCond( pFaninLits[i], Abc_LitIsCompl(iFanin) );
2285 int i, iFanin, Delay, Result = 0;
2287 int fXorFunc = (If_DsdObjType(pObj) ==
IF_DSD_XOR);
2291 Delay =
If_CutDsdBalanceEval_rec(
p, Abc_Lit2Var(iFanin), pTimes, pnSupp, vAig, pFaninLits+i, nSuppAll, pArea, pPermLits );
2295 pFaninLits[i] = Abc_LitNotCond( pFaninLits[i], Abc_LitIsCompl(iFanin) );
2296 Result = If_LogCounterAddAig( pCounter, &nCounter, pFaninLits, Delay, vAig ? pFaninLits[i] : -1, vAig, nSuppAll, fXor, fXorFunc );
2300 Result = If_LogCounterDelayXor( pCounter, nCounter );
2302 *piLit = If_LogCreateAndXorMulti( vAig, pFaninLits, nCounter, nSuppAll, fXorFunc );
2304 *pArea += (pObj->
nFans - 1) * (1 + 2 * fXor);
2310 int nSupp = 0, iLit = 0;
2311 int nSuppAll = If_DsdVecLitSuppSize( &
p->vObjs, iDsd );
2315 assert( nSupp == nSuppAll );
2316 assert( vAig == NULL || Abc_Lit2Var(iLit) == nSupp + Abc_Lit2Var(Vec_IntSize(vAig)) - 1 );
2318 Vec_IntPush( vAig, Abc_LitIsCompl(iLit) ^ Abc_LitIsCompl(iDsd) );
2319 assert( vAig == NULL || (Vec_IntSize(vAig) & 1) );
2327 Vec_IntClear( vAig );
2330 assert( Abc_Lit2Var(If_CutDsdLit(
p, pCut)) == 0 );
2332 Vec_IntPush( vAig, Abc_LitIsCompl(If_CutDsdLit(
p, pCut)) );
2338 assert( Abc_Lit2Var(If_CutDsdLit(
p, pCut)) == 1 );
2340 Vec_IntPush( vAig, 0 );
2342 Vec_IntPush( vAig, Abc_LitIsCompl(If_CutDsdLit(
p, pCut)) );
2344 return (
int)If_ObjCutBest(If_CutLeaf(
p, pCut, 0))->Delay;
2350 int Delay, Area = 0;
2351 char * pPermLits = If_CutDsdPerm(
p, pCut);
2352 for ( i = 0; i < If_CutLeaveNum(pCut); i++ )
2353 pTimes[i] = (
int)If_ObjCutBest(If_CutLeaf(
p, pCut, i))->Delay;
2360 int iMax = 0, nCountMax = 1;
2361 for ( i = 1; i < If_CutLeaveNum(pCut); i++ )
2362 if ( pTimes[i] > pTimes[iMax] )
2363 iMax = i, nCountMax = 1;
2364 else if ( pTimes[i] == pTimes[iMax] )
2367 if ( nCountMax == 1 && pTimes[iMax] + 2 < Delay &&
If_DsdManCheckNonTriv(
p->pIfDsdMan, Abc_Lit2Var(If_CutDsdLit(
p, pCut)),
2371 Delay = pTimes[iMax] + 2;
2387 for ( i = 0; i < If_CutLeaveNum(pCut); i++ )
2388 printf(
"%3d ", pTimes[Abc_Lit2Var(pPermLits[i])] );
2389 for ( ; i <
p->pPars->nLutSize; i++ )
2391 printf(
"-> %3d ", Delay );
2417 int i, Value, nVars;
2419 if ( !fAdd || !LutSize )
2424 vLits = Vec_IntAlloc( 1000 );
2429 Extra_ProgressBarUpdate( pProgress, i, NULL );
2430 nVars = If_DsdObjSuppSize(pObj);
2431 if ( nVars <= LutSize )
2433 if ( fAdd && !pObj->
fMark )
2447 If_DsdVecObjSetMark( &
p->vObjs, i );
2451 Vec_IntFree( vLits );
2471 int fVeryVerbose = 0;
2474 word * pTruth, * pConfig;
2475 int i, nVars, Value, LutSize;
2488 p->pCellStr = Abc_UtilStrsav( pStruct );
2493 p->nConfigWords = 1 + Abc_Bit6WordNum(
p->nTtBits );
2497 printf(
"Considering programmable cell: " );
2499 printf(
"Largest LUT size = %d.\n", LutSize );
2501 if (
p->nObjsPrev > 0 )
2502 printf(
"Starting the tuning process from object %d (out of %d).\n",
p->nObjsPrev, Vec_PtrSize(&
p->vObjs) );
2505 if ( i >=
p->nObjsPrev )
2507 if (
p->vConfigs == NULL )
2508 p->vConfigs = Vec_WrdStart(
p->nConfigWords * Vec_PtrSize(&
p->vObjs) );
2510 Vec_WrdFillExtra(
p->vConfigs,
p->nConfigWords * Vec_PtrSize(&
p->vObjs), 0 );
2514 if ( (i & 0xFF) == 0 )
2515 Extra_ProgressBarUpdate( pProgress, i, NULL );
2516 nVars = If_DsdObjSuppSize(pObj);
2523 printf(
"%6d : %2d ", i, nVars );
2524 pConfig = Vec_WrdEntryP(
p->vConfigs,
p->nConfigWords * i );
2525 Value =
Ifn_NtkMatch( pNtk, pTruth, nVars, nConfls, fVerbose, fVeryVerbose, pConfig );
2530 If_DsdVecObjSetMark( &
p->vObjs, i );
2531 memset( pConfig, 0,
sizeof(
word) *
p->nConfigWords );
2537 printf(
"Finished matching %d functions. ", Vec_PtrSize(&
p->vObjs) );
2538 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
2556#ifndef ABC_USE_PTHREADS
2564#define PAR_THR_MAX 100
2565typedef struct Ifn_ThData_t_
2578void * Ifn_WorkerThread(
void * pArg )
2580 Ifn_ThData_t * pThData = (Ifn_ThData_t *)pArg;
2581 volatile int * pPlace = &pThData->Status;
2585 while ( *pPlace == 0 );
2586 assert( pThData->Status == 1 );
2587 if ( pThData->Id == -1 )
2589 pthread_exit( NULL );
2594 memset( pThData->pConfig, 0,
sizeof(
word) * pThData->nConfigWords );
2595 pThData->Result =
Ifn_NtkMatch( pThData->pNtk, pThData->pTruth, pThData->nVars, pThData->nConfls, 0, 0, pThData->pConfig );
2596 pThData->clkUsed += Abc_Clock() - clk;
2597 pThData->Status = 0;
2605 int fVeryVerbose = 0;
2607 int i, k, nVars, LutSize;
2618 printf(
"The number of processes (%d) exceeds the precompiled limit (%d).\n", nProcs,
PAR_THR_MAX );
2632 p->pCellStr = Abc_UtilStrsav( pStruct );
2638 p->nConfigWords = 1 + Abc_Bit6WordNum(
p->nTtBits );
2639 assert(
p->nConfigWords <= 10 );
2642 printf(
"Considering programmable cell: " );
2644 printf(
"Largest LUT size = %d.\n", LutSize );
2647 if (
p->nObjsPrev > 0 )
2648 printf(
"Starting the tuning process from object %d (out of %d).\n",
p->nObjsPrev, Vec_PtrSize(&
p->vObjs) );
2651 if ( i >=
p->nObjsPrev )
2653 if (
p->vConfigs == NULL )
2654 p->vConfigs = Vec_WrdStart(
p->nConfigWords * Vec_PtrSize(&
p->vObjs) );
2656 Vec_WrdFillExtra(
p->vConfigs,
p->nConfigWords * Vec_PtrSize(&
p->vObjs), 0 );
2664 int status, fRunning = 1, iCurrentObj =
p->nObjsPrev;
2666 for ( i = 0; i < nProcs; i++ )
2669 ThData[i].nVars = -1;
2671 ThData[i].nConfls = nConfls;
2672 ThData[i].Result = -1;
2673 ThData[i].Status = 0;
2674 ThData[i].clkUsed = 0;
2675 ThData[i].nConfigWords =
p->nConfigWords;
2676 status = pthread_create( WorkerThread + i, NULL, Ifn_WorkerThread, (
void *)(ThData + i) );
assert( status == 0 );
2679 while ( fRunning || iCurrentObj < Vec_PtrSize(&
p->vObjs) )
2681 for ( i = 0; i < nProcs; i++ )
2683 if ( ThData[i].Status )
2685 assert( ThData[i].Status == 0 );
2686 if ( ThData[i].Id >= 0 )
2689 assert( ThData[i].Result == 0 || ThData[i].Result == 1 );
2690 if ( ThData[i].Result == 0 )
2691 If_DsdVecObjSetMark( &
p->vObjs, ThData[i].Id );
2694 word * pTtWords = Vec_WrdEntryP(
p->vConfigs,
p->nConfigWords * ThData[i].Id );
2695 memcpy( pTtWords, ThData[i].pConfig,
sizeof(
word) *
p->nConfigWords );
2698 ThData[i].Result = -1;
2700 for ( k = iCurrentObj; k < Vec_PtrSize(&
p->vObjs); k++ )
2702 if ( (k & 0xFF) == 0 )
2703 Extra_ProgressBarUpdate( pProgress, k, NULL );
2704 pObj = If_DsdVecObj( &
p->vObjs, k );
2705 nVars = If_DsdObjSuppSize(pObj);
2706 if ( nInputs && nVars < nInputs )
2710 clkUsed += Abc_Clock() - clk;
2711 ThData[i].nVars = nVars;
2713 ThData[i].Result = -1;
2714 ThData[i].Status = 1;
2721 for ( i = 0; i < nProcs; i++ )
2722 if ( ThData[i].Status == 1 || (ThData[i].Status == 0 && ThData[i].Id >= 0) )
2727 for ( i = 0; i < nProcs; i++ )
2729 assert( ThData[i].Status == 0 );
2731 ThData[i].Status = 1;
2736 printf(
"Main : " );
2737 Abc_PrintTime( 1,
"Time", clkUsed );
2738 for ( i = 0; i < nProcs; i++ )
2740 printf(
"Thread %d : ", i );
2741 Abc_PrintTime( 1,
"Time", ThData[i].clkUsed );
2749 printf(
"Finished matching %d functions. ", Vec_PtrSize(&
p->vObjs) );
2750 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
2774 int fVeryVerbose = 0;
2778 word * pTruth, Perm;
2779 int i, nVars, Value;
2781 assert( fUnate + fThresh + fThreshHeuristic <= 1 );
2782 if (
p->nObjsPrev > 0 )
2783 printf(
"Starting the tuning process from object %d (out of %d).\n",
p->nObjsPrev, Vec_PtrSize(&
p->vObjs) );
2786 if ( i >=
p->nObjsPrev )
2788 if (
p->vConfigs == NULL )
2789 p->vConfigs = Vec_WrdStart( Vec_PtrSize(&
p->vObjs) );
2791 Vec_WrdFillExtra(
p->vConfigs, Vec_PtrSize(&
p->vObjs), 0 );
2795 if ( (i & 0xFF) == 0 )
2796 Extra_ProgressBarUpdate( pProgress, i, NULL );
2797 nVars = If_DsdObjSuppSize(pObj);
2804 printf(
"%6d : %2d ", i, nVars );
2806 Value = Abc_TtIsUnate( pTruth, nVars );
2809 else if ( fThreshHeuristic )
2817 If_DsdVecObjSetMark( &
p->vObjs, i );
2819 Vec_WrdWriteEntry(
p->vConfigs, i, Perm );
2824 printf(
"Finished matching %d functions. ", Vec_PtrSize(&
p->vObjs) );
2825 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
#define ABC_SWAP(Type, a, b)
int * Abc_MergeSortCost(int *pCosts, int nSize)
#define ABC_ALLOC(type, num)
#define ABC_REALLOC(type, obj, num)
#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 ///.
ABC_NAMESPACE_IMPL_START typedef char ProgressBar
#define PAR_THR_MAX
DECLARATIONS ///.
void Dau_DecPrintSet(unsigned set, int nVars, int fNewLine)
int Dau_DsdDecompose(word *pTruth, int nVarsInit, int fSplitPrime, int fWriteTruth, char *pRes)
Vec_Int_t * Dau_DecFindSets(word *pInit, int nVars)
void Dau_DsdTruthCompose_rec(word *pFunc, word pFanins[DAU_MAX_VAR][DAU_MAX_WORD], word *pRes, int nVars, int nWordsR)
void Dau_DsdPrintFromTruth(word *pTruth, int nVarsInit)
void Dau_DecPrintSets(Vec_Int_t *vSets, int nVars)
#define DAU_MAX_VAR
INCLUDES ///.
Vec_Int_t * Dau_DecFindSets_int(word *pInit, int nVars, int *pSched[16])
unsigned Abc_TtCanonicize(word *pTruth, int nVars, char *pCanonPerm)
FUNCTION DECLARATIONS ///.
void Gia_ManStopP(Gia_Man_t **p)
struct Gia_Man_t_ Gia_Man_t
void If_DsdManDumpDsd(If_DsdMan_t *p, int Support)
void If_DsdManPrintOne(FILE *pFile, If_DsdMan_t *p, int iObjId, unsigned char *pPermLits, int fNewLine)
int If_DsdManCheckNonTriv(If_DsdMan_t *p, int Id, int nVars, int iVarMax)
If_DsdMan_t * If_DsdManFilter(If_DsdMan_t *p, int Limit)
int If_CutDsdBalanceEval_rec(If_DsdMan_t *p, int Id, int *pTimes, int *pnSupp, Vec_Int_t *vAig, int *piLit, int nSuppAll, int *pArea, char *pPermLits)
void If_DsdManCleanOccur(If_DsdMan_t *p, int fVerbose)
#define DSD_VERSION
DECLARATIONS ///.
unsigned If_DsdManCheckXY(If_DsdMan_t *p, int iDsd, int LutSize, int fDerive, unsigned uMaskNot, int fHighEffort, int fVerbose)
void If_DsdManSetNewAsUseless(If_DsdMan_t *p)
unsigned If_DsdManCheckMux(If_DsdMan_t *p, int iFirst, unsigned uMaskNot, If_DsdObj_t *pObj, int nSuppAll, int LutSize, int fDerive, int fVerbose)
int If_DsdObjFindOrAdd(If_DsdMan_t *p, int Type, int *pLits, int nLits, word *pTruth)
struct If_DsdObj_t_ If_DsdObj_t
void If_DsdManPrint(If_DsdMan_t *p, char *pFileName, int Number, int Support, int fOccurs, int fTtDump, int fVerbose)
void If_DsdManCleanMarks(If_DsdMan_t *p, int fVerbose)
int If_DsdManOperation(If_DsdMan_t *p, int Type, int *pLits, int nLits, unsigned char *pPerm, word *pTruth)
int If_DsdManLutSize(If_DsdMan_t *p)
void Id_DsdManTuneStr1(If_DsdMan_t *p, char *pStruct, int nConfls, int fVerbose)
unsigned If_DsdSign_rec(If_DsdMan_t *p, If_DsdObj_t *pObj, int *pnSupp)
int If_DsdManComputeFirstArray(If_DsdMan_t *p, int *pLits, int nLits, int *pFirsts)
void If_DsdManPrint_rec(FILE *pFile, If_DsdMan_t *p, int iDsdLit, unsigned char *pPermLits, int *pnSupp)
void Id_DsdManTuneStr(If_DsdMan_t *p, char *pStruct, int nConfls, int nProcs, int nInputs, int fVerbose)
void If_DsdManMerge(If_DsdMan_t *p, If_DsdMan_t *pNew)
int If_DsdManSuppSize(If_DsdMan_t *p, int iDsd)
unsigned If_DsdManCheckAndXor(If_DsdMan_t *p, int iFirst, unsigned uMaskNot, If_DsdObj_t *pObj, int nSuppAll, int LutSize, int fDerive, int fVerbose)
unsigned If_DsdManCheckPrime(If_DsdMan_t *p, int iFirst, unsigned uMaskNot, If_DsdObj_t *pObj, int nSuppAll, int LutSize, int fDerive, int fVerbose)
int If_CutDsdBalanceEvalInt(If_DsdMan_t *p, int iDsd, int *pTimes, Vec_Int_t *vAig, int *pArea, char *pPermLits)
char * If_DsdManGetCellStr(If_DsdMan_t *p)
int If_CutDsdBalancePinDelays_rec(If_DsdMan_t *p, int Id, int *pTimes, word *pRes, int *pnSupp, int nSuppAll, char *pPermLits)
int If_DsdManAddDsd(If_DsdMan_t *p, char *pDsd, word *pTruth, unsigned char *pPerm, int *pnSupp)
unsigned * If_DsdObjHashLookup(If_DsdMan_t *p, int Type, int *pLits, int nLits, int truthId)
void If_DsdObjSort(If_DsdMan_t *pMan, Vec_Ptr_t *p, int *pLits, int nLits, int *pPerm)
#define If_DsdVecForEachObjVec(vNodes, vVec, pObj, i)
int If_DsdManObjNum(If_DsdMan_t *p)
int If_DsdObjCreate(If_DsdMan_t *p, int Type, int *pLits, int nLits, int truthId)
int If_DsdManCheckNonDec_rec(If_DsdMan_t *p, int Id)
void If_DsdManInvertMarks(If_DsdMan_t *p, int fVerbose)
void If_DsdManFilter_rec(If_DsdMan_t *pNew, If_DsdMan_t *p, int i, Vec_Int_t *vMap)
void If_DsdManComputeTruth_rec(If_DsdMan_t *p, int iDsd, word *pRes, unsigned char *pPermLits, int *pnSupp)
int If_DsdManCompute(If_DsdMan_t *p, word *pTruth, int nLeaves, unsigned char *pPerm, char *pLutStruct)
int If_CutDsdPermLitMax(char *pPermLits, int nVars, int iVar)
void If_DsdManTune(If_DsdMan_t *p, int LutSize, int fFast, int fAdd, int fSpec, int fVerbose)
int If_DsdManVarNum(If_DsdMan_t *p)
#define If_DsdVecForEachObj(vVec, pObj, i)
void If_DsdManPrintDistrib(If_DsdMan_t *p)
int If_CutDsdBalanceEval(If_Man_t *p, If_Cut_t *pCut, Vec_Int_t *vAig)
#define If_DsdVecForEachObjStart(vVec, pObj, i, Start)
word * If_DsdManGetFuncConfig(If_DsdMan_t *p, int iDsd)
void If_DsdManSave(If_DsdMan_t *p, char *pFileName)
unsigned If_DsdSign(If_DsdMan_t *p, If_DsdObj_t *pObj, int iFan, int iFirst, int fShared)
int If_DsdManPushInv(If_DsdMan_t *p, int iLit, unsigned char *pPerm)
unsigned If_DsdManCheckXYZ(If_DsdMan_t *p, int iDsd, int LutSize, int fDerive, int fVerbose)
void If_DsdManAllocIsops(If_DsdMan_t *p, int nLutSize)
void If_DsdManPrintOccurs(FILE *pFile, If_DsdMan_t *p)
#define If_DsdObjForEachFaninLit(vVec, pObj, iLit, i)
unsigned If_DsdManCheckXY_int(If_DsdMan_t *p, int iDsd, int LutSize, int fDerive, unsigned uMaskNot, int fVerbose)
void If_DsdManDumpAll(If_DsdMan_t *p, int Support)
void If_DsdManGetSuppSizes(If_DsdMan_t *p, If_DsdObj_t *pObj, int *pSSizes)
void If_DsdManComputeTruthPtr(If_DsdMan_t *p, int iDsd, unsigned char *pPermLits, word *pRes)
int If_DsdManAddDsd_rec(char *pStr, char **p, int *pMatches, If_DsdMan_t *pMan, word *pTruth, unsigned char *pPerm, int *pnSupp)
int If_DsdManPushInv_rec(If_DsdMan_t *p, int iLit, unsigned char *pPerm)
int Kit_TruthToGia(Gia_Man_t *pMan, unsigned *pTruth, int nVars, Vec_Int_t *vMemory, Vec_Int_t *vLeaves, int fHash)
DECLARATIONS ///.
int If_DsdObjCompare(If_DsdMan_t *pMan, Vec_Ptr_t *p, int iLit0, int iLit1)
int If_DsdManReadMark(If_DsdMan_t *p, int iDsd)
int If_DsdManHasMarks(If_DsdMan_t *p)
void If_DsdManPrintDecs(FILE *pFile, If_DsdMan_t *p)
#define If_DsdVecForEachNode(vVec, pObj, i)
If_DsdMan_t * If_DsdManAlloc(int nVars, int LutSize)
void If_DsdManCollect(If_DsdMan_t *p, int Id, Vec_Int_t *vNodes, Vec_Int_t *vFirsts)
word * If_DsdManComputeTruth(If_DsdMan_t *p, int iDsd, unsigned char *pPermLits)
int If_DsdManComputeFirst(If_DsdMan_t *p, If_DsdObj_t *pObj, int *pFirsts)
int If_DsdManCheckInv_rec(If_DsdMan_t *p, int iLit)
int If_DsdManPermBitNum(If_DsdMan_t *p)
void If_DsdManCollect_rec(If_DsdMan_t *p, int Id, Vec_Int_t *vNodes, Vec_Int_t *vFirsts, int *pnSupp)
If_DsdMan_t * If_DsdManLoad(char *pFileName)
void If_DsdManFree(If_DsdMan_t *p, int fVerbose)
void If_DsdManSetLutSize(If_DsdMan_t *p, int nLutSize)
If_DsdObj_t * If_DsdObjAlloc(If_DsdMan_t *p, int Type, int nFans)
#define If_DsdObjForEachFanin(vVec, pObj, pFanin, i)
int If_DsdManCheckDec(If_DsdMan_t *p, int iDsd)
int If_DsdManTtBitNum(If_DsdMan_t *p)
int If_CutDsdBalancePinDelays(If_Man_t *p, If_Cut_t *pCut, char *pPerm)
char * If_DsdManFileName(If_DsdMan_t *p)
FUNCTION DEFINITIONS ///.
void If_DsdManHashProfile(If_DsdMan_t *p)
int Ifn_NtkInputNum(Ifn_Ntk_t *p)
unsigned If_DsdManCheckXY(If_DsdMan_t *p, int iDsd, int LutSize, int fDerive, unsigned uMaskNot, int fHighEffort, int fVerbose)
void Ifn_NtkPrint(Ifn_Ntk_t *p)
struct If_Cut_t_ If_Cut_t
Ifn_Ntk_t * Ifn_NtkParse(char *pStr)
unsigned If_ManSatCheckXYall(void *pSat, int nLutSize, word *pTruth, int nVars, Vec_Int_t *vLits)
int Ifn_NtkMatch(Ifn_Ntk_t *p, word *pTruth, int nVars, int nConfls, int fVerbose, int fVeryVerbose, word *pConfig)
void Id_DsdManTuneThresh(If_DsdMan_t *p, int fUnate, int fThresh, int fThreshHeuristic, int fVerbose)
int Ifn_NtkTtBits(char *pStr)
void * If_ManSatBuildXY(int nLutSize)
DECLARATIONS ///.
struct If_DsdMan_t_ If_DsdMan_t
int Ifn_NtkLutSizeMax(Ifn_Ntk_t *p)
struct Ifn_Ntk_t_ Ifn_Ntk_t
#define IF_MAX_FUNC_LUTSIZE
struct If_Man_t_ If_Man_t
BASIC TYPES ///.
int If_CutSopBalanceEvalInt(Vec_Int_t *vCover, int *pTimes, int *pFaninLits, Vec_Int_t *vAig, int *piRes, int nSuppAll, int *pArea)
void If_ManSatUnbuild(void *p)
int If_CutSopBalancePinDelaysInt(Vec_Int_t *vCover, int *pTimes, word *pFaninRes, int nSuppAll, word *pRes)
unsigned __int64 word
DECLARATIONS ///.
int Kit_TruthIsop(unsigned *puTruth, int nVars, Vec_Int_t *vMemory, int fTryBoth)
Mem_Flex_t * Mem_FlexStart()
char * Mem_FlexEntryFetch(Mem_Flex_t *p, int nBytes)
int Mem_FlexReadMemUsage(Mem_Flex_t *p)
void Mem_FlexStop(Mem_Flex_t *p, int fVerbose)
struct Mem_Flex_t_ Mem_Flex_t
Vec_Ptr_t * vTtDecs[IF_MAX_FUNC_LUTSIZE+1]
Vec_Wec_t * vIsops[IF_MAX_FUNC_LUTSIZE+1]
Vec_Mem_t * vTtMem[IF_MAX_FUNC_LUTSIZE+1]
int * pSched[IF_MAX_FUNC_LUTSIZE+1]
typedefABC_NAMESPACE_IMPL_START struct Vec_Mem_t_ Vec_Mem_t
DECLARATIONS ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_MemForEachEntry(p, pEntry, i)
MACRO DEFINITIONS ///.
#define Vec_PtrForEachEntryStart(Type, vVec, pEntry, i, Start)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.