51 Gia_Obj_t * pObj, * pFan0, * pFan1;
int i;
52 *pnMuxes = *pnXors = 0;
65 int nAnds, nMuxes, nXors,
nTotal;
68 nAnds = Gia_ManAndNotBufNum(
p)-Gia_ManXorNum(
p)-Gia_ManMuxNum(
p);
69 nXors = Gia_ManXorNum(
p);
70 nMuxes = Gia_ManMuxNum(
p);
71 nTotal = nAnds + 3*nXors + 3*nMuxes;
76 nAnds = Gia_ManAndNotBufNum(
p) - 3*nMuxes - 3*nXors;
77 nTotal = Gia_ManAndNotBufNum(
p);
79 Abc_Print( 1,
"stats: " );
80 Abc_Print( 1,
"xor =%8d %6.2f %% ", nXors, 300.0*nXors/
nTotal );
81 Abc_Print( 1,
"mux =%8d %6.2f %% ", nMuxes, 300.0*nMuxes/
nTotal );
82 Abc_Print( 1,
"and =%8d %6.2f %% ", nAnds, 100.0*nAnds/
nTotal );
83 Abc_Print( 1,
"obj =%8d ", Gia_ManAndNotBufNum(
p) );
101 Gia_Obj_t * pObj, * pFan0, * pFan1, * pFanC, * pSiblNew, * pObjNew;
109 pNew->
pName = Abc_UtilStrsav(
p->pName );
110 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
112 if ( Gia_ManHasChoices(
p) )
114 Gia_ManConst0(
p)->Value = 0;
118 if ( Gia_ObjIsCi(pObj) )
119 pObj->
Value = Gia_ManAppendCi( pNew );
120 else if ( Gia_ObjIsCo(pObj) )
121 pObj->
Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
122 else if ( Gia_ObjIsBuf(pObj) )
123 pObj->
Value = Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(pObj) );
124 else if ( !
Gia_ObjIsMuxType(pObj) || Gia_ObjSibl(
p, Gia_ObjFaninId0(pObj, i)) || Gia_ObjSibl(
p, Gia_ObjFaninId1(pObj, i)) )
128 else if ( Gia_ObjRefNum(
p, Gia_ObjFanin0(pObj)) + Gia_ObjRefNum(
p, Gia_ObjFanin1(pObj)) > Limit )
133 pObj->
Value =
Gia_ManHashMuxReal( pNew, Gia_ObjLitCopy(
p, Gia_ObjToLit(
p, pFanC)), Gia_ObjLitCopy(
p, Gia_ObjToLit(
p, pFan1)), Gia_ObjLitCopy(
p, Gia_ObjToLit(
p, pFan0)) );
135 if ( !Gia_ObjSibl(
p, i) )
137 pObjNew = Gia_ManObj( pNew, Abc_Lit2Var(pObj->
Value) );
138 pSiblNew = Gia_ManObj( pNew, Abc_Lit2Var(Gia_ObjSiblObj(
p, i)->Value) );
139 if ( Gia_ObjIsAnd(pObjNew) && Gia_ObjIsAnd(pSiblNew) && Gia_ObjId(pNew, pObjNew) > Gia_ObjId(pNew, pSiblNew) )
140 pNew->
pSibls[Gia_ObjId(pNew, pObjNew)] = Gia_ObjId(pNew, pSiblNew);
164 Vec_Int_t * vRefs = Vec_IntStart( Gia_ManObjNum(
p) );
165 int i, iLit0, iLit1, nXors = 0, nObjs = 0;
172 Vec_IntAddToEntry( vRefs, Gia_ObjId(
p, Gia_Regular(pFan0)), 1 );
173 Vec_IntAddToEntry( vRefs, Gia_ObjId(
p, Gia_Regular(pFan1)), 1 );
179 Vec_IntAddToEntry( vRefs, Gia_ObjFaninId0(pObj, i), 1 );
180 Vec_IntAddToEntry( vRefs, Gia_ObjFaninId1(pObj, i), 1 );
184 Vec_IntAddToEntry( vRefs, Gia_ObjFaninId0p(
p, pObj), 1 );
186 nObjs += Vec_IntEntry(vRefs, i) > 0;
187 pNew =
Gia_ManStart( 1 + Gia_ManCiNum(
p) + Gia_ManCoNum(
p) + nObjs );
188 pNew->
pName = Abc_UtilStrsav(
p->pName );
189 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
190 Gia_ManConst0(
p)->Value = 0;
193 if ( Gia_ObjIsCi(pObj) )
194 pObj->
Value = Gia_ManAppendCi( pNew );
195 else if ( Gia_ObjIsCo(pObj) )
196 pObj->
Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
197 else if ( Gia_ObjIsBuf(pObj) )
198 pObj->
Value = Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(pObj) );
202 iLit0 = Abc_LitNotCond( Gia_Regular(pFan0)->Value, Gia_IsComplement(pFan0) );
203 iLit1 = Abc_LitNotCond( Gia_Regular(pFan1)->Value, Gia_IsComplement(pFan1) );
204 pObj->
Value = Gia_ManAppendXorReal( pNew, iLit0, iLit1 );
206 else if ( Vec_IntEntry(vRefs, i) > 0 )
207 pObj->
Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
212 Vec_IntFree( vRefs );
233 assert(
p->pMuxes != NULL || Gia_ManXorNum(
p) );
236 pNew->
pName = Abc_UtilStrsav(
p->pName );
237 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
238 Gia_ManConst0(
p)->Value = 0;
242 if ( Gia_ObjIsCi(pObj) )
243 pObj->
Value = Gia_ManAppendCi( pNew );
244 else if ( Gia_ObjIsCo(pObj) )
245 pObj->
Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
246 else if ( Gia_ObjIsBuf(pObj) )
247 pObj->
Value = fSkipBufs ? Gia_ObjFanin0Copy(pObj) : Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(pObj) );
248 else if ( Gia_ObjIsMuxId(
p, i) )
249 pObj->
Value =
Gia_ManHashMux( pNew, Gia_ObjFanin2Copy(
p, pObj), Gia_ObjFanin1Copy(pObj), Gia_ObjFanin0Copy(pObj) );
250 else if ( Gia_ObjIsXor(pObj) )
304 Vec_Bit_t * vUsed = Vec_BitStart( Gia_ManObjNum(
p) );
305 assert( !Gia_ManHasChoices(
p) );
306 assert( !Gia_ManHasMapping(
p) );
312 pNew->
pName = Abc_UtilStrsav(
p->pName );
313 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
315 Gia_ManConst0(
p)->Value = 0;
319 if ( Gia_ObjIsCi(pObj) )
320 pObj->
Value = Gia_ManAppendCi( pNew );
321 else if ( Gia_ObjIsCo(pObj) )
322 pObj->
Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
323 else if ( Gia_ObjIsBuf(pObj) )
324 pObj->
Value = Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(pObj) );
325 else if ( Gia_ObjIsMuxId(
p, i) &&
326 Gia_ObjIsMuxId(
p, Gia_ObjFaninId0(pObj, i)) && !Vec_BitEntry(vUsed, Gia_ObjFaninId0(pObj, i)) &&
327 Gia_ObjIsMuxId(
p, Gia_ObjFaninId1(pObj, i)) && !Vec_BitEntry(vUsed, Gia_ObjFaninId1(pObj, i)) &&
328 Gia_ObjFaninId2(
p, Gia_ObjFaninId0(pObj, i)) == Gia_ObjFaninId2(
p, Gia_ObjFaninId1(pObj, i)) )
331 int Value0 =
Gia_ManHashMux( pNew, Gia_ObjFanin2Copy(
p, pObj), Gia_ObjFanin2Copy(
p, pFan1), Gia_ObjFanin0Copy(pObj) );
332 int Value1 =
Gia_ManHashMux( pNew, Value0, Gia_ObjFanin1Copy(pFan1), Gia_ObjFanin0Copy(pFan1) );
334 Vec_BitWriteEntry( vUsed, Gia_ObjFaninId0(pObj, i), 1 );
335 Vec_BitWriteEntry( vUsed, Gia_ObjFaninId1(pObj, i), 1 );
336 Vec_BitWriteEntry( vUsed, i, 1 );
339 else if ( Gia_ObjIsMuxId(
p, i) )
340 pObj->
Value =
Gia_ManHashMux( pNew, Gia_ObjFanin2Copy(
p, pObj), Gia_ObjFanin1Copy(pObj), Gia_ObjFanin0Copy(pObj) );
341 else if ( Gia_ObjIsXor(pObj) )
346 Vec_BitFree( vUsed );
376 if ( !Gia_ObjIsMuxId(
p, iObj) )
378 pObj = Gia_ManObj(
p, iObj );
379 if ( Gia_ObjRefInc(
p, pObj) )
388 assert( Gia_ObjIsMuxId(
p, iObj) );
396 if ( !Gia_ObjIsMuxId(
p, iObj) )
398 pObj = Gia_ManObj(
p, iObj );
399 if ( Gia_ObjRefDec(
p, pObj) )
408 assert( Gia_ObjIsMuxId(
p, iObj) );
416 if ( !Gia_ObjIsMuxId(
p, iObj) )
420 assert( Count1 == Count2 );
439 if ( !fFirst && (!Gia_ObjIsMuxId(
p, iObj) || Gia_ObjRefNumId(
p, iObj) > 0) )
442 printf(
"<%02d>", Gia_ObjLevelId(
p, iObj) );
445 iCtrl = Gia_ObjFaninId2p(
p, pObj);
447 if ( Gia_ObjIsMuxId(
p, iCtrl) && Gia_ObjRefNumId(
p, iCtrl) == 0 )
451 printf(
"%d", iCtrl );
452 printf(
"<%d>", Gia_ObjLevelId(
p, iCtrl) );
455 if ( Gia_ObjFaninC2(
p, pObj) )
473 assert( Gia_ObjIsMuxId(
p, iObj) );
477 assert( Count1 == Count2 );
496 if ( !fFirst && (!Gia_ObjIsMuxId(
p, iObj) || Gia_ObjRefNumId(
p, iObj) > 0) )
498 iCtrl = Gia_ObjFaninId2p(
p, pObj);
499 Vec_StrPush( vStr,
'[' );
500 Vec_StrPush( vStr,
'(' );
501 if ( Gia_ObjIsMuxId(
p, iCtrl) && Gia_ObjRefNumId(
p, iCtrl) == 0 )
504 Vec_StrPrintNumStar( vStr, iCtrl, nDigitsId );
505 Vec_StrPush( vStr,
')' );
506 if ( Gia_ObjFaninC2(
p, pObj) )
509 Vec_StrPush( vStr,
'|' );
511 Vec_StrPush( vStr,
']' );
516 Vec_StrPush( vStr,
'|' );
518 Vec_StrPush( vStr,
']' );
524 assert( Gia_ObjIsMuxId(
p, iObj) );
526 Vec_StrClear( vStr );
527 Vec_StrPrintNumStar( vStr, Count1, nDigitsNum );
529 Vec_StrPush( vStr,
'\0' );
531 assert( Count1 == Count2 );
548 int Diff =
strcmp( *pp1, *pp2 );
559 Count += (*
p ==
'[');
588 p->vTops = Vec_WecAlloc( 1000 );
589 Vec_WecPushLevel(
p->vTops );
595 Vec_WecFree(
p->vTops );
612 int i, Entry, Counter, Total;
614 vCounts = Vec_IntStart( 1000 );
618 Vec_IntAddToEntry( vCounts, Abc_MinInt(Vec_IntSize(vVec), 999), 1 );
622 for ( i = 1; i < Vec_WecSize(
p->vTops); i++ )
623 Vec_IntAddToEntry( vCounts, Abc_MinInt(atoi(
Abc_NamStr(
p->pNames, i)), 999), 1 );
625 Total = Vec_IntCountPositive(vCounts);
628 printf(
"The distribution of MUX tree %s:\n", fWidth ?
"widths" :
"sizes" );
632 if ( !Entry )
continue;
633 if ( ++Counter == 12 )
634 printf(
"\n" ), Counter = 0;
635 printf(
" %d=%d", i, Entry );
637 printf(
"\nSummary: " );
638 printf(
"Max = %d ", Vec_IntFindMax(vCounts) );
639 printf(
"Ave = %.2f", 1.0*Vec_IntSum(vCounts)/Total );
641 Vec_IntFree( vCounts );
663 int i, Counter, fFound, iStructId, nDigitsId;
667 nDigitsId = Abc_Base10Log( Gia_ManObjNum(pNew) );
674 Gia_ObjRefFanin0Inc( pNew, pObj );
676 vStr = Vec_StrAlloc( 1000 );
681 if ( Gia_ObjRefNumId(pNew, i) == 1 && Gia_ObjIsMuxId(pNew, Vec_IntEntry(vFans, i)) )
689 Vec_WecPushLevel( pMan->
vTops );
691 Vec_IntPush( Vec_WecEntry(pMan->
vTops, iStructId), i );
694 Vec_IntFree( vFans );
696 printf(
"MUX structure profile for AIG \"%s\":\n",
p->pName );
697 printf(
"Total MUXes = %d. Total trees = %d. Unique trees = %d. Memory = %.2f MB ",
698 Gia_ManMuxNum(pNew), Vec_WecSizeSize(pMan->
vTops), Vec_WecSize(pMan->
vTops)-1,
700 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
707 printf(
"The first %d structures: \n", 10 );
711 printf(
"%5d : ", i );
712 printf(
"Occur = %4d ", Vec_IntSize(vVec) );
713 printf(
"Size = %4d ", atoi(pTemp) );
714 printf(
"%s\n", pTemp );
722 if ( Vec_IntSize(vVec) > 5 && atoi(pTemp) > 5 )
725 printf(
"For example, structure %d has %d MUXes and bit-width %d:\n", i, atoi(pTemp), Vec_IntSize(vVec) );
728 if ( ++Counter == 5 )
753#define GIA_FOREACH_ITEM(ITEM) \
780#define GENERATE_ENUM(ENUM) ENUM,
783#define GENERATE_STRING(STRING) #STRING,
789 for ( i = 0; i < GIA_END; i++ )
790 printf(
"%d = %s\n", i, GIA_TYPE_STRINGS[i] );
799 assert( !Gia_ObjIsRi(
p, pObj) );
800 if ( Gia_ObjIsConst0(pObj) )
802 if ( Gia_ObjIsPo(
p, pObj) )
804 if ( Gia_ObjIsPi(
p, pObj) )
806 if ( Gia_ObjIsCi(pObj) )
808 if ( Gia_ObjIsXor(pObj) )
810 if ( Gia_ObjIsMux(
p, pObj) )
812 assert( Gia_ObjIsAnd(pObj) );
818 Gia_Obj_t * pObj = Gia_ManObj(
p, Abc_Lit2Var(iLit) );
819 if ( Gia_ObjIsConst0(pObj) )
821 if ( Gia_ObjIsPi(
p, pObj) )
823 if ( Gia_ObjIsCi(pObj) )
825 if ( Gia_ObjIsXor(pObj) )
827 if ( Gia_ObjIsMux(
p, pObj) )
829 assert( Gia_ObjIsAnd(pObj) );
840 if ( Gia_ObjIsPo(
p, pObj) )
842 if ( Gia_ObjIsCo(pObj) )
844 if ( Gia_ObjIsXor(pObj) )
846 if ( Gia_ObjIsMux(
p, pObj) )
847 return i == 2 ? oMUXc : oMUXd;
848 assert( Gia_ObjIsAnd(pObj) );
860 Vec_IntClear( vArray );
861 for ( k = Vec_IntEntry(vCodeOffsets, i); k < Vec_IntEntry(vCodeOffsets, i+1); k++ )
862 Vec_IntPush( vArray, Vec_IntEntry(vCode, k) );
868 int k, nFanins, nFanouts;
869 if ( Gia_ObjIsRi(
p, pObj) )
871 nFanins = Gia_ObjIsRo(
p, pObj) ? 1 : Gia_ObjFaninNum(
p, pObj);
872 nFanouts = Gia_ObjFanoutNum(
p, pObj);
874 printf(
"%6d : ", i );
875 for ( k = 0; k < nFanins; k++ )
876 printf(
" %5s", GIA_TYPE_STRINGS[Vec_IntEntry(vArray, k + 1)] );
878 printf(
" %5s",
"" );
880 printf(
" %5s", GIA_TYPE_STRINGS[Vec_IntEntry(vArray, 0)] );
884 int Count = 1, Prev = Vec_IntEntry(vArray, 1 + nFanins);
885 for ( k = 1; k < nFanouts; k++ )
887 if ( Prev != Vec_IntEntry(vArray, k + 1 + nFanins) )
889 printf(
" %d x %s", Count, GIA_TYPE_STRINGS[Prev] );
890 Prev = Vec_IntEntry(vArray, k + 1 + nFanins);
895 printf(
" %d x %s", Count, GIA_TYPE_STRINGS[Prev] );
906 vRes = Vec_IntAlloc( Gia_ManObjNum(
p) );
907 pHash = Hsh_VecManStart( Gia_ManObjNum(
p) );
909 vArray = Vec_IntAlloc( 100 );
910 Hsh_VecManAdd( pHash, vArray );
915 Vec_IntPush( vRes, Hsh_VecManAdd( pHash, vArray ) );
917 Hsh_VecManStop( pHash );
918 Vec_IntFree( vArray );
919 assert( Vec_IntSize(vRes) == Gia_ManObjNum(
p) );
927 Vec_Int_t * vCode, * vCodeOffsets, * vArray;
929 int i, k, nFanins, nFanouts, * pPerm, nClasses;
933 vArray = Vec_IntAlloc( 100 );
934 vCode = Vec_IntAlloc( 5 * Gia_ManObjNum(
p) );
935 vCodeOffsets = Vec_IntAlloc( Gia_ManObjNum(
p) );
938 Vec_IntPush( vCodeOffsets, Vec_IntSize(vCode) );
939 if ( Gia_ObjIsRi(
p, pObj) )
941 nFanins = Gia_ObjFaninNum(
p, pObj);
942 nFanouts = Gia_ObjFanoutNum(
p, pObj);
946 int iLit = Gia_ObjFaninLit2p(
p, pObj);
948 if ( Abc_LitIsCompl(iLit) )
959 else if ( nFanins == 2 )
963 Vec_IntPush( vCode, Code0 < Code1 ? Code0 : Code1 );
964 Vec_IntPush( vCode, Code0 < Code1 ? Code1 : Code0 );
966 else if ( nFanins == 1 )
968 else if ( Gia_ObjIsRo(
p, pObj) )
972 Vec_IntClear( vArray );
975 int Index = Gia_ObjWhatFanin(
p, pFanout, pObj );
977 Vec_IntPush( vArray, Type );
979 Vec_IntSort( vArray, 0 );
980 Vec_IntAppend( vCode, vArray );
982 assert( Vec_IntSize(vCodeOffsets) == Gia_ManObjNum(
p) );
983 Vec_IntPush( vCodeOffsets, Vec_IntSize(vCode) );
987 printf(
"Showing TFI/node/TFO structures for all nodes:\n" );
1000 nClasses = Vec_IntFindMax(vRes) + 1;
1001 vCount = Vec_IntStart( nClasses );
1002 vFirst = Vec_IntStart( nClasses );
1005 int Entry = Vec_IntEntry( vRes, i );
1006 if ( Gia_ObjIsRi(
p, pObj) )
1008 if ( Vec_IntEntry(vCount, Entry) == 0 )
1009 Vec_IntWriteEntry( vFirst, Entry, i );
1010 Vec_IntAddToEntry( vCount, Entry, -1 );
1014 printf(
"Showing TFI/node/TFO structures that appear more than %d times.\n", nLimit );
1015 for ( i = 0; i < nClasses-1; i++ )
1017 if ( nLimit > -Vec_IntEntry(vCount, pPerm[i]) )
1019 printf(
"%6d : ", i );
1020 printf(
"%6d : ", pPerm[i] );
1021 printf(
"Weight =%6d ", -Vec_IntEntry(vCount, pPerm[i]) );
1022 printf(
"First obj =" );
1030 Vec_IntFree( vRes );
1031 Vec_IntFree( vCount );
1032 Vec_IntFree( vFirst );
1034 Vec_IntFree( vArray );
1035 Vec_IntFree( vCode );
1036 Vec_IntFree( vCodeOffsets );
1064 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
1066 Gia_ObjSetTravIdCurrent(
p, pObj);
1067 if ( !Gia_ObjIsAnd(pObj) )
1074 Gia_Obj_t * pObj, * pObj2;
int i, k, Value;
1075 Vec_Int_t * vRes = Vec_IntStart( Gia_ManCiNum(
p) );
1081 if ( Gia_ObjIsTravIdCurrent(
p, pObj2) )
1082 Vec_IntAddToEntry( vRes, k, 1 );
1086 if ( Value == Gia_ManCoNum(
p) )
1087 Vec_IntWriteEntry( vRes, k++, i );
1088 Vec_IntShrink( vRes, k );
1090 if ( Vec_IntSize(vRes) == 0 || Vec_IntSize(vRes) > 10 )
1091 Vec_IntFreeP(&vRes);
1097 Vec_Wec_t * vCofs = Vec_WecStart( 1 << Vec_IntSize(vRes) );
1098 int Value, i, m, nMints = 1 << Vec_IntSize(vRes);
1100 pNew->
pName = Abc_UtilStrsav(
p->pName );
1101 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
1105 Gia_ManConst0(
p)->Value = 0;
1106 assert( Vec_IntSize(vRes) < Gia_ManCiNum(
p) );
1108 pObj->
Value = Gia_ManAppendCi(pNew);
1109 for ( m = 0; m < nMints; m++ )
1111 Vec_Int_t * vLayer = Vec_WecEntry( vCofs, m );
1113 Gia_ManCi(
p, Value)->Value = (unsigned)((m >> i) & 1);
1117 Vec_IntPush( vLayer, Gia_ObjFanin0Copy(pObj) );
1118 assert( Vec_IntSize(vLayer) == Gia_ManCoNum(
p) );
1121 if ( ppNew != NULL )
1128 Vec_Int_t * vMap = Vec_IntAlloc( Vec_WecSize(vCofs) );
1129 Vec_Int_t * vUnique = Vec_IntAlloc( Vec_WecSize(vCofs) );
1133 if ( Vec_IntEqual(vVec, Vec_WecEntry(vCofs, Lev)) )
1135 Vec_IntPush( vMap, k );
1136 if ( k == Vec_IntSize(vUnique) )
1137 Vec_IntPush( vUnique, i );
1141 Vec_IntFree( vUnique );
1142 assert( Vec_IntSize(vMap) == Vec_WecSize(vCofs) );
1150 return Vec_IntEntry( vData, Shift );
1158 Vec_Int_t * vMemory = Vec_IntAlloc( 1 << 16 );
1159 Vec_Int_t * vLeaves = Vec_IntAlloc( 100 );
1160 Vec_Int_t * vUsed = Vec_IntStart( Vec_WecSize(vCofs) );
1162 Vec_Int_t * vData = Vec_IntAlloc( Vec_WecSize(vCofs) );
1163 int nWords = Abc_TtWordNum(Vec_IntSize(vIns));
1165 int nValues = Vec_IntFindMax(vMap)+1;
1166 int i, k, Value, nBits = Abc_Base2Log(nValues);
1167 assert( nBits < Vec_IntSize(vIns) );
1168 assert( Vec_IntSize(vMap) == Vec_WecSize(vCofs) );
1169 assert( Vec_IntSize(vMap) == (1 << Vec_IntSize(vIns)) );
1171 Vec_IntPush( vLeaves, Gia_ObjToLit(pNew, Gia_ManCi(pNew, Value)) );
1172 for ( i = 0; i < nBits; i++ )
1174 Abc_TtClear( pTruth,
nWords );
1176 if ( (Value >> i) & 1 )
1177 Abc_TtSetBit( pTruth, k );
1179 pTruth[0] = Abc_Tt6Stretch( pTruth[0], Vec_IntSize(vIns) );
1180 Vec_IntPush( vBits,
Kit_TruthToGia(pNew, (
unsigned*)pTruth, Vec_IntSize(vIns), vMemory, vLeaves, 1) );
1183 for ( i = 0; i < nValues; i++ )
1185 int Cof = Vec_IntFind(vMap, i);
1186 assert( Cof >= 0 && Cof < Vec_WecSize(vCofs) );
1187 Vec_IntWriteEntry( vUsed, Cof, 1 );
1189 for ( i = 0; i < nOuts; i++ )
1192 Vec_IntClear( vData );
1194 if ( Vec_IntEntry(vUsed, k) )
1195 Vec_IntPush( vData, Vec_IntEntry(vLevel, i) );
1196 while ( Vec_IntSize(vData) < (1 << nBits) )
1197 Vec_IntPush( vData, 0 );
1198 assert( Vec_IntSize(vData) == (1 << nBits) );
1199 assert( Vec_IntSize(vBits) == nBits );
1201 Gia_ManAppendCo( pNew, Value );
1204 Vec_IntFree( vUsed );
1205 Vec_IntFree( vBits );
1206 Vec_IntFree( vData );
1207 Vec_IntFree( vLeaves );
1208 Vec_IntFree( vMemory );
1216 if ( vMap && Abc_Base2Log(Vec_IntFindMax(vMap)+1) < Vec_IntSize(vIns) )
1225 Vec_WecFreeP( &vCfs );
1226 Vec_IntFreeP( &vMap );
1227 Vec_IntFreeP( &vIns );
int * Abc_MergeSortCost(int *pCosts, int nSize)
#define ABC_ALLOC(type, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int nTotal
DECLARATIONS ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Vec_Str_t_ Vec_Str_t
ABC_NAMESPACE_IMPL_START int Kit_TruthToGia(Gia_Man_t *pMan, unsigned *pTruth, int nVars, Vec_Int_t *vMemory, Vec_Int_t *vLeaves, int fHash)
DECLARATIONS ///.
Gia_Man_t * Gia_ManDupMuxes(Gia_Man_t *p, int Limit)
void Gia_MuxStructPrint_rec(Gia_Man_t *p, int iObj, int fFirst)
void Gia_ManFindDerive(Gia_Man_t *pNew, int nOuts, Vec_Int_t *vIns, Vec_Wec_t *vCofs, Vec_Int_t *vMap)
void Mux_ManFree(Mux_Man_t *p)
void Gia_MuxStructPrint(Gia_Man_t *p, int iObj)
void Gia_ManProfileCollect(Gia_Man_t *p, int i, Vec_Int_t *vCode, Vec_Int_t *vCodeOffsets, Vec_Int_t *vArray)
ABC_NAMESPACE_IMPL_START void Gia_ManCountMuxXor(Gia_Man_t *p, int *pnMuxes, int *pnXors)
DECLARATIONS ///.
void Gia_ManProfileStructuresInt(Gia_Man_t *p, int nLimit, int fVerbose)
Gia_Man_t * Gia_ManMuxRestructure(Gia_Man_t *p)
Vec_Int_t * Gia_ManFindEquivClasses(Vec_Wec_t *vCofs)
Gia_ObjType_t Gia_ManEncodeFanout(Gia_Man_t *p, Gia_Obj_t *pObj, int i)
Gia_Man_t * Gia_ManCreateXors(Gia_Man_t *p)
void Gia_ManMuxProfiling(Gia_Man_t *p)
Vec_Wec_t * Gia_ManFindCofs(Gia_Man_t *p, Vec_Int_t *vRes, Gia_Man_t **ppNew)
int Gia_ManMuxCompare(char **pp1, char **pp2)
int Gia_ManMuxProfile(Mux_Man_t *p, int fWidth)
int Gia_MuxDeref_rec(Gia_Man_t *p, int iObj)
#define GIA_FOREACH_ITEM(ITEM)
Gia_Man_t * Gia_ManDupNoMuxes(Gia_Man_t *p, int fSkipBufs)
void Gia_ManProfileStructures(Gia_Man_t *p, int nLimit, int fVerbose)
int Gia_MuxMffcSize(Gia_Man_t *p, int iObj)
void Gia_ManMarkTfi_rec(Gia_Man_t *p, Gia_Obj_t *pObj)
int Gia_ManMuxCountOne(char *p)
void Gia_ManPrintMuxStats(Gia_Man_t *p)
Vec_Int_t * Gia_ManFindSharedInputs(Gia_Man_t *p)
int Gia_ManEncodeFanin(Gia_Man_t *p, int iLit)
Vec_Int_t * Gia_ManProfileHash(Gia_Man_t *p, Vec_Int_t *vCode, Vec_Int_t *vCodeOffsets)
int Gia_MuxRef(Gia_Man_t *p, int iObj)
Gia_Man_t * Gia_ManDupMuxesTest(Gia_Man_t *p)
Gia_Man_t * Gia_ManCofStructure(Gia_Man_t *p)
void Gia_ManProfileStructuresTest(Gia_Man_t *p)
int Gia_MuxRef_rec(Gia_Man_t *p, int iObj)
void Gia_ManProfilePrintOne(Gia_Man_t *p, int i, Vec_Int_t *vArray)
int Gia_MuxDeref(Gia_Man_t *p, int iObj)
Mux_Man_t * Mux_ManAlloc(Gia_Man_t *pGia)
#define GENERATE_STRING(STRING)
struct Mux_Man_t_ Mux_Man_t
Gia_Man_t * Gia_ManDupMuxRestructure(Gia_Man_t *p)
int Gia_ManFindMuxTree_rec(Gia_Man_t *pNew, int *pCtrl, int nCtrl, Vec_Int_t *vData, int Shift)
int Gia_MuxStructDump(Gia_Man_t *p, int iObj, Vec_Str_t *vStr, int nDigitsNum, int nDigitsId)
#define GENERATE_ENUM(ENUM)
void Gia_MuxStructDump_rec(Gia_Man_t *p, int iObj, int fFirst, Vec_Str_t *vStr, int nDigitsId)
int Gia_ManEncodeObj(Gia_Man_t *p, int i)
#define Gia_ObjForEachFanoutStatic(p, pObj, pFanout, i)
void Gia_ManStop(Gia_Man_t *p)
void Gia_ManStaticFanoutStart(Gia_Man_t *p)
void Gia_ManHashStart(Gia_Man_t *p)
void Gia_ManStaticFanoutStop(Gia_Man_t *p)
Gia_Obj_t * Gia_ObjRecognizeMux(Gia_Obj_t *pNode, Gia_Obj_t **ppNodeT, Gia_Obj_t **ppNodeE)
#define Gia_ManForEachAnd(p, pObj, i)
int Gia_ManHashMuxReal(Gia_Man_t *p, int iLitC, int iLit1, int iLit0)
void Gia_ManStopP(Gia_Man_t **p)
void Gia_ManSetRegNum(Gia_Man_t *p, int nRegs)
void Gia_ManHashAlloc(Gia_Man_t *p)
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
struct Gia_Obj_t_ Gia_Obj_t
int Gia_ManHashXor(Gia_Man_t *p, int iLit0, int iLit1)
int Gia_ObjIsMuxType(Gia_Obj_t *pNode)
void Gia_ManFillValue(Gia_Man_t *p)
struct Gia_Man_t_ Gia_Man_t
#define Gia_ManForEachObj1(p, pObj, i)
int Gia_ManHashMux(Gia_Man_t *p, int iCtrl, int iData1, int iData0)
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
int Gia_ObjRecognizeExor(Gia_Obj_t *pObj, Gia_Obj_t **ppFan0, Gia_Obj_t **ppFan1)
void Gia_ManCreateRefs(Gia_Man_t *p)
int Gia_ManHashAnd(Gia_Man_t *p, int iLit0, int iLit1)
void Gia_ManIncrementTravId(Gia_Man_t *p)
int Gia_ManHashXorReal(Gia_Man_t *p, int iLit0, int iLit1)
#define Gia_ManForEachMux(p, pObj, i)
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachCi(p, pObj, i)
Vec_Int_t * Gia_ManFirstFanouts(Gia_Man_t *p)
void Gia_ManHashStop(Gia_Man_t *p)
void Gia_ManPrintStats(Gia_Man_t *p, Gps_Par_t *pPars)
int Gia_ManLevelNum(Gia_Man_t *p)
unsigned __int64 word
DECLARATIONS ///.
int Abc_NamMemUsed(Abc_Nam_t *p)
void Abc_NamStop(Abc_Nam_t *p)
int Abc_NamStrFindOrAdd(Abc_Nam_t *p, char *pStr, int *pfFound)
int Abc_NamObjNumMax(Abc_Nam_t *p)
Abc_Nam_t * Abc_NamStart(int nObjs, int nAveSize)
FUNCTION DEFINITIONS ///.
char * Abc_NamStr(Abc_Nam_t *p, int NameId)
typedefABC_NAMESPACE_HEADER_START struct Abc_Nam_t_ Abc_Nam_t
INCLUDES ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Bit_t_ Vec_Bit_t
INCLUDES ///.
struct Hsh_VecMan_t_ Hsh_VecMan_t
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_WecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
#define Vec_WecForEachLevelStart(vGlob, vVec, i, LevelStart)
#define Vec_WecForEachLevelStartStop(vGlob, vVec, i, LevelStart, LevelStop)
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.