00001
00021 #include "abc.h"
00022 #include "kit.h"
00023
00027
00031
00043 void Abc_NtkPrintMeasures( unsigned * pTruth, int nVars )
00044 {
00045 unsigned uCofs[10][32];
00046 int i, k, nOnes;
00047
00048
00049 nOnes = Kit_TruthCountOnes( uCofs[0], nVars );
00050 printf( "Total = %d.\n", nOnes * ((1 << nVars) - nOnes) );
00051
00052
00053 for ( i = 0; i < nVars; i++ )
00054 {
00055 Kit_TruthUniqueNew( uCofs[0], pTruth, nVars, i );
00056 nOnes = Kit_TruthCountOnes( uCofs[0], nVars );
00057 printf( "%7d ", nOnes );
00058 }
00059 printf( "\n" );
00060
00061
00062 for ( i = 0; i < nVars; i++ )
00063 for ( k = 0; k < nVars; k++ )
00064 {
00065 if ( i == k )
00066 {
00067 printf( " " );
00068 continue;
00069 }
00070 Kit_TruthCofactor0New( uCofs[0], pTruth, nVars, i );
00071 Kit_TruthCofactor1New( uCofs[1], pTruth, nVars, i );
00072
00073 Kit_TruthCofactor0New( uCofs[2], uCofs[0], nVars, k );
00074 Kit_TruthCofactor1New( uCofs[3], uCofs[0], nVars, k );
00075 Kit_TruthCofactor0New( uCofs[4], uCofs[1], nVars, k );
00076 Kit_TruthCofactor1New( uCofs[5], uCofs[1], nVars, k );
00077
00078 Kit_TruthAndPhase( uCofs[6], uCofs[2], uCofs[5], nVars, 0, 1 );
00079 Kit_TruthAndPhase( uCofs[7], uCofs[2], uCofs[5], nVars, 1, 0 );
00080 Kit_TruthAndPhase( uCofs[8], uCofs[3], uCofs[4], nVars, 0, 1 );
00081 Kit_TruthAndPhase( uCofs[9], uCofs[3], uCofs[4], nVars, 1, 0 );
00082
00083 nOnes = Kit_TruthCountOnes( uCofs[6], nVars ) +
00084 Kit_TruthCountOnes( uCofs[7], nVars ) +
00085 Kit_TruthCountOnes( uCofs[8], nVars ) +
00086 Kit_TruthCountOnes( uCofs[9], nVars );
00087
00088 printf( "%7d ", nOnes );
00089 if ( k == nVars - 1 )
00090 printf( "\n" );
00091 }
00092 printf( "\n" );
00093 }
00094
00095
00107 void Abc_Ntk4VarObjPrint_rec( Abc_Obj_t * pObj )
00108 {
00109 if ( pObj == Abc_AigConst1(pObj->pNtk) )
00110 {
00111 printf( "1" );
00112 return;
00113 }
00114 if ( Abc_ObjIsPi(pObj) )
00115 {
00116 printf( "%c", pObj->Id - 1 + 'a' );
00117 return;
00118 }
00119
00120 printf( "(" );
00121 Abc_Ntk4VarObjPrint_rec( Abc_ObjFanin0(pObj) );
00122 if ( Abc_ObjFaninC0(pObj) )
00123 printf( "\'" );
00124 Abc_Ntk4VarObjPrint_rec( Abc_ObjFanin1(pObj) );
00125 if ( Abc_ObjFaninC1(pObj) )
00126 printf( "\'" );
00127 printf( ")" );
00128 }
00129
00141 unsigned Abc_Ntk4VarObj( Vec_Ptr_t * vNodes )
00142 {
00143 Abc_Obj_t * pObj;
00144 unsigned uTruth0, uTruth1;
00145 int i;
00146 Vec_PtrForEachEntry( vNodes, pObj, i )
00147 {
00148 uTruth0 = (unsigned)(Abc_ObjFanin0(pObj)->pCopy);
00149 uTruth1 = (unsigned)(Abc_ObjFanin1(pObj)->pCopy);
00150 if ( Abc_ObjFaninC0(pObj) )
00151 uTruth0 = ~uTruth0;
00152 if ( Abc_ObjFaninC1(pObj) )
00153 uTruth1 = ~uTruth1;
00154 pObj->pCopy = (void *)(uTruth0 & uTruth1);
00155 }
00156 return uTruth0 & uTruth1;
00157 }
00158
00170 void Abc_Ntk4VarTable( Abc_Ntk_t * pNtk )
00171 {
00172 static unsigned u4VarTruths[4] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00 };
00173 static unsigned u4VarTts[222] = {
00174 0x0000, 0x0001, 0x0003, 0x0006, 0x0007, 0x000f, 0x0016, 0x0017, 0x0018, 0x0019,
00175 0x001b, 0x001e, 0x001f, 0x003c, 0x003d, 0x003f, 0x0069, 0x006b, 0x006f, 0x007e,
00176 0x007f, 0x00ff, 0x0116, 0x0117, 0x0118, 0x0119, 0x011a, 0x011b, 0x011e, 0x011f,
00177 0x012c, 0x012d, 0x012f, 0x013c, 0x013d, 0x013e, 0x013f, 0x0168, 0x0169, 0x016a,
00178 0x016b, 0x016e, 0x016f, 0x017e, 0x017f, 0x0180, 0x0181, 0x0182, 0x0183, 0x0186,
00179 0x0187, 0x0189, 0x018b, 0x018f, 0x0196, 0x0197, 0x0198, 0x0199, 0x019a, 0x019b,
00180 0x019e, 0x019f, 0x01a8, 0x01a9, 0x01aa, 0x01ab, 0x01ac, 0x01ad, 0x01ae, 0x01af,
00181 0x01bc, 0x01bd, 0x01be, 0x01bf, 0x01e8, 0x01e9, 0x01ea, 0x01eb, 0x01ee, 0x01ef,
00182 0x01fe, 0x033c, 0x033d, 0x033f, 0x0356, 0x0357, 0x0358, 0x0359, 0x035a, 0x035b,
00183 0x035e, 0x035f, 0x0368, 0x0369, 0x036a, 0x036b, 0x036c, 0x036d, 0x036e, 0x036f,
00184 0x037c, 0x037d, 0x037e, 0x03c0, 0x03c1, 0x03c3, 0x03c5, 0x03c6, 0x03c7, 0x03cf,
00185 0x03d4, 0x03d5, 0x03d6, 0x03d7, 0x03d8, 0x03d9, 0x03db, 0x03dc, 0x03dd, 0x03de,
00186 0x03fc, 0x0660, 0x0661, 0x0662, 0x0663, 0x0666, 0x0667, 0x0669, 0x066b, 0x066f,
00187 0x0672, 0x0673, 0x0676, 0x0678, 0x0679, 0x067a, 0x067b, 0x067e, 0x0690, 0x0691,
00188 0x0693, 0x0696, 0x0697, 0x069f, 0x06b0, 0x06b1, 0x06b2, 0x06b3, 0x06b4, 0x06b5,
00189 0x06b6, 0x06b7, 0x06b9, 0x06bd, 0x06f0, 0x06f1, 0x06f2, 0x06f6, 0x06f9, 0x0776,
00190 0x0778, 0x0779, 0x077a, 0x077e, 0x07b0, 0x07b1, 0x07b4, 0x07b5, 0x07b6, 0x07bc,
00191 0x07e0, 0x07e1, 0x07e2, 0x07e3, 0x07e6, 0x07e9, 0x07f0, 0x07f1, 0x07f2, 0x07f8,
00192 0x0ff0, 0x1668, 0x1669, 0x166a, 0x166b, 0x166e, 0x167e, 0x1681, 0x1683, 0x1686,
00193 0x1687, 0x1689, 0x168b, 0x168e, 0x1696, 0x1697, 0x1698, 0x1699, 0x169a, 0x169b,
00194 0x169e, 0x16a9, 0x16ac, 0x16ad, 0x16bc, 0x16e9, 0x177e, 0x178e, 0x1796, 0x1798,
00195 0x179a, 0x17ac, 0x17e8, 0x18e7, 0x19e1, 0x19e3, 0x19e6, 0x1bd8, 0x1be4, 0x1ee1,
00196 0x3cc3, 0x6996
00197 };
00198 int Counters[222] = {0};
00199 Vec_Ptr_t * vNodes;
00200 Abc_Obj_t * pObj;
00201 unsigned uTruth;
00202 int i, k, Count = 0;
00203
00204 unsigned short * puCanons = NULL;
00205 unsigned char * puMap = NULL;
00206 Extra_Truth4VarNPN( &puCanons, NULL, NULL, &puMap );
00207
00208
00209 assert( Abc_NtkPiNum(pNtk) == 4 );
00210 Abc_AigConst1(pNtk)->pCopy = (void *)0xFFFFFFFF;
00211 Abc_NtkForEachPi( pNtk, pObj, i )
00212 pObj->pCopy = (void *)u4VarTruths[i];
00213
00214
00215 Abc_NtkForEachPo( pNtk, pObj, i )
00216 {
00217 vNodes = Abc_NtkDfsNodes( pNtk, &pObj, 1 );
00218 if ( Vec_PtrSize(vNodes) == 0 )
00219 uTruth = (unsigned)Abc_ObjFanin0(pObj)->pCopy;
00220 else
00221 uTruth = Abc_Ntk4VarObj( vNodes );
00222
00223 if ( (uTruth & 0xFFFF) < (~uTruth & 0xFFFF) )
00224 uTruth = uTruth & 0xFFFF;
00225 else
00226 uTruth = ~uTruth & 0xFFFF;
00227
00228 for ( k = 0; k < 222; k++ )
00229 if ( u4VarTts[k] == uTruth )
00230 break;
00231 if ( k == 222 )
00232 continue;
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242 Counters[k]++;
00243
00244
00245 Vec_PtrFree( vNodes );
00246 }
00247 free( puCanons );
00248 free( puMap );
00249
00250 Count = 0;
00251 for ( k = 0; k < 222; k++ )
00252 {
00253 printf( "%d/%x/%d ", k, u4VarTts[k], Counters[k] );
00254 Count += Counters[k];
00255 }
00256 printf( " Total = %d\n", Count );
00257 }
00258
00259
00260
00261
00273 int Abc_NtkPrintOneDecompCheckCofList( unsigned * uCofs, int nCofs )
00274 {
00275 int i, Ind = -1;
00276 assert( nCofs > 2 );
00277 for ( i = 1; i < nCofs; i++ )
00278 {
00279 if ( uCofs[i] == uCofs[0] )
00280 continue;
00281 if ( Ind == -1 )
00282 {
00283 Ind = i;
00284 continue;
00285 }
00286 if ( uCofs[i] == uCofs[Ind] )
00287 continue;
00288 return 0;
00289 }
00290 return 1;
00291 }
00292
00304 int Abc_NtkPrintOneDecompCheck( unsigned * uCofs, int nCofs, unsigned uMask )
00305 {
00306 unsigned pCofs[32][32];
00307 int nCofNums[32] = {0};
00308 int uMasks[32];
00309 int nGroups = 0;
00310 int i, k;
00311 for ( i = 0; i < nCofs; i++ )
00312 {
00313
00314 for ( k = 0; k < nGroups; k++ )
00315 if ( (int)(i & uMask) == uMasks[k] )
00316 break;
00317 if ( k == nGroups )
00318 {
00319 uMasks[k] = (i & uMask);
00320 nGroups++;
00321 }
00322
00323 pCofs[k][ nCofNums[k]++ ] = uCofs[i];
00324 assert( nCofNums[k] <= 32 );
00325 assert( nGroups <= 32 );
00326 }
00327
00328 for ( i = 0; i < nGroups; i++ )
00329 if ( !Abc_NtkPrintOneDecompCheckCofList(pCofs[i], nCofNums[i]) )
00330 return 0;
00331 return 1;
00332 }
00333
00345 void Abc_NtkPrintOneDecomp_rec( unsigned * uCofs, int nCofs, int nVars, unsigned uMask, int * pBestSize, unsigned * puBestMask )
00346 {
00347 unsigned uMaskNew;
00348 int v, last, Counter = 0;
00349
00350 for ( v = 0; v < nVars; v++ )
00351 if ( uMask & (1<<v) )
00352 {
00353 last = v;
00354 Counter++;
00355 }
00356 if ( Counter > 3 )
00357 return;
00358
00359 for ( v = last + 1; v < nVars; v++ )
00360 {
00361 uMaskNew = uMask | (1 << v);
00362 if ( !Abc_NtkPrintOneDecompCheck( uCofs, nCofs, uMaskNew ) )
00363 continue;
00364 if ( *pBestSize < Counter + 1 )
00365 {
00366 *pBestSize = Counter + 1;
00367 *puBestMask = uMaskNew;
00368 }
00369
00370 Abc_NtkPrintOneDecomp_rec( uCofs, nCofs, nVars, uMaskNew, pBestSize, puBestMask );
00371 }
00372 }
00373
00385 void Abc_NtkPrintOneDecomp( unsigned * pTruth, int nVars )
00386 {
00387 int BoundSet = 6;
00388 unsigned uCofs[64], uMask, uBestMask = 0;
00389 int i, nCofs, nMints, nMintShift, BestSize = 1;
00390
00391 assert( nVars > BoundSet );
00392 assert( nVars <= BoundSet + 5 );
00393
00394
00395 nCofs = (1 << BoundSet);
00396 nMints = (1 << (nVars-BoundSet));
00397 nMintShift = 0;
00398 uMask = Kit_CubeMask( nMints );
00399 for ( i = 0; i < nCofs; i++ )
00400 {
00401 uCofs[i] = (pTruth[nMintShift/32] >> (nMintShift % 32)) & uMask;
00402 nMintShift += nMints;
00403 }
00404
00405
00406 for ( i = 0; i < BoundSet; i++ )
00407 Abc_NtkPrintOneDecomp_rec( uCofs, nCofs, nVars, (1 << i), &BestSize, &uBestMask );
00408
00409 printf( "Best size = %d ", BestSize );
00410 printf( "Best mask = " );
00411 Extra_PrintBinary( stdout, &uBestMask, nVars );
00412 printf( "\n" );
00413 }
00414
00415
00427 void Abc_NtkPrintOneDec( unsigned * pTruth, int nVars )
00428 {
00429 unsigned uCof[(1<<11)], * pOut = uCof, * pIn = pTruth, * pTemp;
00430 int nDiffs[16];
00431 int Order[16];
00432 int i, fChange, Temp, Counter;
00433
00434
00435 for ( i = 0; i < nVars; i++ )
00436 {
00437 Kit_TruthUniqueNew( uCof, pTruth, nVars, i );
00438 nDiffs[i] = Kit_TruthCountOnes( uCof, nVars );
00439 Order[i] = i;
00440 }
00441
00442
00443 Counter = 0;
00444 do {
00445 fChange = 0;
00446 for ( i = 0; i < nVars-1; i++ )
00447 {
00448 if ( nDiffs[i] <= nDiffs[i+1] )
00449 continue;
00450 fChange = 1;
00451 Counter++;
00452
00453 Temp = nDiffs[i];
00454 nDiffs[i] = nDiffs[i+1];
00455 nDiffs[i+1] = Temp;
00456
00457 Temp = Order[i];
00458 Order[i] = Order[i+1];
00459 Order[i+1] = Temp;
00460
00461 Extra_TruthSwapAdjacentVars( pOut, pIn, nVars, i );
00462 pTemp = pIn; pIn = pOut; pOut = pTemp;
00463 }
00464 } while ( fChange );
00465
00466
00467 if ( Counter & 1 )
00468 Extra_TruthCopy( pOut, pIn, nVars );
00469
00470
00471 Abc_NtkPrintOneDecomp( pTruth, nVars );
00472 }
00473
00477
00478