00001
00021 #include "kit.h"
00022
00026
00030
00043 void Kit_TruthSwapAdjacentVars( unsigned * pOut, unsigned * pIn, int nVars, int iVar )
00044 {
00045 static unsigned PMasks[4][3] = {
00046 { 0x99999999, 0x22222222, 0x44444444 },
00047 { 0xC3C3C3C3, 0x0C0C0C0C, 0x30303030 },
00048 { 0xF00FF00F, 0x00F000F0, 0x0F000F00 },
00049 { 0xFF0000FF, 0x0000FF00, 0x00FF0000 }
00050 };
00051 int nWords = Kit_TruthWordNum( nVars );
00052 int i, k, Step, Shift;
00053
00054 assert( iVar < nVars - 1 );
00055 if ( iVar < 4 )
00056 {
00057 Shift = (1 << iVar);
00058 for ( i = 0; i < nWords; i++ )
00059 pOut[i] = (pIn[i] & PMasks[iVar][0]) | ((pIn[i] & PMasks[iVar][1]) << Shift) | ((pIn[i] & PMasks[iVar][2]) >> Shift);
00060 }
00061 else if ( iVar > 4 )
00062 {
00063 Step = (1 << (iVar - 5));
00064 for ( k = 0; k < nWords; k += 4*Step )
00065 {
00066 for ( i = 0; i < Step; i++ )
00067 pOut[i] = pIn[i];
00068 for ( i = 0; i < Step; i++ )
00069 pOut[Step+i] = pIn[2*Step+i];
00070 for ( i = 0; i < Step; i++ )
00071 pOut[2*Step+i] = pIn[Step+i];
00072 for ( i = 0; i < Step; i++ )
00073 pOut[3*Step+i] = pIn[3*Step+i];
00074 pIn += 4*Step;
00075 pOut += 4*Step;
00076 }
00077 }
00078 else
00079 {
00080 for ( i = 0; i < nWords; i += 2 )
00081 {
00082 pOut[i] = (pIn[i] & 0x0000FFFF) | ((pIn[i+1] & 0x0000FFFF) << 16);
00083 pOut[i+1] = (pIn[i+1] & 0xFFFF0000) | ((pIn[i] & 0xFFFF0000) >> 16);
00084 }
00085 }
00086 }
00087
00100 void Kit_TruthSwapAdjacentVars2( unsigned * pIn, unsigned * pOut, int nVars, int Start )
00101 {
00102 int nWords = (nVars <= 5)? 1 : (1 << (nVars-5));
00103 int i, k, Step;
00104
00105 assert( Start < nVars - 1 );
00106 switch ( Start )
00107 {
00108 case 0:
00109 for ( i = 0; i < nWords; i++ )
00110 pOut[i] = (pIn[i] & 0x99999999) | ((pIn[i] & 0x22222222) << 1) | ((pIn[i] & 0x44444444) >> 1);
00111 return;
00112 case 1:
00113 for ( i = 0; i < nWords; i++ )
00114 pOut[i] = (pIn[i] & 0xC3C3C3C3) | ((pIn[i] & 0x0C0C0C0C) << 2) | ((pIn[i] & 0x30303030) >> 2);
00115 return;
00116 case 2:
00117 for ( i = 0; i < nWords; i++ )
00118 pOut[i] = (pIn[i] & 0xF00FF00F) | ((pIn[i] & 0x00F000F0) << 4) | ((pIn[i] & 0x0F000F00) >> 4);
00119 return;
00120 case 3:
00121 for ( i = 0; i < nWords; i++ )
00122 pOut[i] = (pIn[i] & 0xFF0000FF) | ((pIn[i] & 0x0000FF00) << 8) | ((pIn[i] & 0x00FF0000) >> 8);
00123 return;
00124 case 4:
00125 for ( i = 0; i < nWords; i += 2 )
00126 {
00127 pOut[i] = (pIn[i] & 0x0000FFFF) | ((pIn[i+1] & 0x0000FFFF) << 16);
00128 pOut[i+1] = (pIn[i+1] & 0xFFFF0000) | ((pIn[i] & 0xFFFF0000) >> 16);
00129 }
00130 return;
00131 default:
00132 Step = (1 << (Start - 5));
00133 for ( k = 0; k < nWords; k += 4*Step )
00134 {
00135 for ( i = 0; i < Step; i++ )
00136 pOut[i] = pIn[i];
00137 for ( i = 0; i < Step; i++ )
00138 pOut[Step+i] = pIn[2*Step+i];
00139 for ( i = 0; i < Step; i++ )
00140 pOut[2*Step+i] = pIn[Step+i];
00141 for ( i = 0; i < Step; i++ )
00142 pOut[3*Step+i] = pIn[3*Step+i];
00143 pIn += 4*Step;
00144 pOut += 4*Step;
00145 }
00146 return;
00147 }
00148 }
00149
00163 void Kit_TruthStretch( unsigned * pOut, unsigned * pIn, int nVars, int nVarsAll, unsigned Phase, int fReturnIn )
00164 {
00165 unsigned * pTemp;
00166 int i, k, Var = nVars - 1, Counter = 0;
00167 for ( i = nVarsAll - 1; i >= 0; i-- )
00168 if ( Phase & (1 << i) )
00169 {
00170 for ( k = Var; k < i; k++ )
00171 {
00172 Kit_TruthSwapAdjacentVars( pOut, pIn, nVarsAll, k );
00173 pTemp = pIn; pIn = pOut; pOut = pTemp;
00174 Counter++;
00175 }
00176 Var--;
00177 }
00178 assert( Var == -1 );
00179
00180 if ( fReturnIn ^ !(Counter & 1) )
00181 Kit_TruthCopy( pOut, pIn, nVarsAll );
00182 }
00183
00197 void Kit_TruthShrink( unsigned * pOut, unsigned * pIn, int nVars, int nVarsAll, unsigned Phase, int fReturnIn )
00198 {
00199 unsigned * pTemp;
00200 int i, k, Var = 0, Counter = 0;
00201 for ( i = 0; i < nVarsAll; i++ )
00202 if ( Phase & (1 << i) )
00203 {
00204 for ( k = i-1; k >= Var; k-- )
00205 {
00206 Kit_TruthSwapAdjacentVars( pOut, pIn, nVarsAll, k );
00207 pTemp = pIn; pIn = pOut; pOut = pTemp;
00208 Counter++;
00209 }
00210 Var++;
00211 }
00212 assert( Var == nVars );
00213
00214 if ( fReturnIn ^ !(Counter & 1) )
00215 Kit_TruthCopy( pOut, pIn, nVarsAll );
00216 }
00217
00218
00230 int Kit_TruthVarInSupport( unsigned * pTruth, int nVars, int iVar )
00231 {
00232 int nWords = Kit_TruthWordNum( nVars );
00233 int i, k, Step;
00234
00235 assert( iVar < nVars );
00236 switch ( iVar )
00237 {
00238 case 0:
00239 for ( i = 0; i < nWords; i++ )
00240 if ( (pTruth[i] & 0x55555555) != ((pTruth[i] & 0xAAAAAAAA) >> 1) )
00241 return 1;
00242 return 0;
00243 case 1:
00244 for ( i = 0; i < nWords; i++ )
00245 if ( (pTruth[i] & 0x33333333) != ((pTruth[i] & 0xCCCCCCCC) >> 2) )
00246 return 1;
00247 return 0;
00248 case 2:
00249 for ( i = 0; i < nWords; i++ )
00250 if ( (pTruth[i] & 0x0F0F0F0F) != ((pTruth[i] & 0xF0F0F0F0) >> 4) )
00251 return 1;
00252 return 0;
00253 case 3:
00254 for ( i = 0; i < nWords; i++ )
00255 if ( (pTruth[i] & 0x00FF00FF) != ((pTruth[i] & 0xFF00FF00) >> 8) )
00256 return 1;
00257 return 0;
00258 case 4:
00259 for ( i = 0; i < nWords; i++ )
00260 if ( (pTruth[i] & 0x0000FFFF) != ((pTruth[i] & 0xFFFF0000) >> 16) )
00261 return 1;
00262 return 0;
00263 default:
00264 Step = (1 << (iVar - 5));
00265 for ( k = 0; k < nWords; k += 2*Step )
00266 {
00267 for ( i = 0; i < Step; i++ )
00268 if ( pTruth[i] != pTruth[Step+i] )
00269 return 1;
00270 pTruth += 2*Step;
00271 }
00272 return 0;
00273 }
00274 }
00275
00287 int Kit_TruthSupportSize( unsigned * pTruth, int nVars )
00288 {
00289 int i, Counter = 0;
00290 for ( i = 0; i < nVars; i++ )
00291 Counter += Kit_TruthVarInSupport( pTruth, nVars, i );
00292 return Counter;
00293 }
00294
00306 unsigned Kit_TruthSupport( unsigned * pTruth, int nVars )
00307 {
00308 int i, Support = 0;
00309 for ( i = 0; i < nVars; i++ )
00310 if ( Kit_TruthVarInSupport( pTruth, nVars, i ) )
00311 Support |= (1 << i);
00312 return Support;
00313 }
00314
00315
00316
00328 void Kit_TruthCofactor0( unsigned * pTruth, int nVars, int iVar )
00329 {
00330 int nWords = Kit_TruthWordNum( nVars );
00331 int i, k, Step;
00332
00333 assert( iVar < nVars );
00334 switch ( iVar )
00335 {
00336 case 0:
00337 for ( i = 0; i < nWords; i++ )
00338 pTruth[i] = (pTruth[i] & 0x55555555) | ((pTruth[i] & 0x55555555) << 1);
00339 return;
00340 case 1:
00341 for ( i = 0; i < nWords; i++ )
00342 pTruth[i] = (pTruth[i] & 0x33333333) | ((pTruth[i] & 0x33333333) << 2);
00343 return;
00344 case 2:
00345 for ( i = 0; i < nWords; i++ )
00346 pTruth[i] = (pTruth[i] & 0x0F0F0F0F) | ((pTruth[i] & 0x0F0F0F0F) << 4);
00347 return;
00348 case 3:
00349 for ( i = 0; i < nWords; i++ )
00350 pTruth[i] = (pTruth[i] & 0x00FF00FF) | ((pTruth[i] & 0x00FF00FF) << 8);
00351 return;
00352 case 4:
00353 for ( i = 0; i < nWords; i++ )
00354 pTruth[i] = (pTruth[i] & 0x0000FFFF) | ((pTruth[i] & 0x0000FFFF) << 16);
00355 return;
00356 default:
00357 Step = (1 << (iVar - 5));
00358 for ( k = 0; k < nWords; k += 2*Step )
00359 {
00360 for ( i = 0; i < Step; i++ )
00361 pTruth[Step+i] = pTruth[i];
00362 pTruth += 2*Step;
00363 }
00364 return;
00365 }
00366 }
00367
00379 void Kit_TruthCofactor1( unsigned * pTruth, int nVars, int iVar )
00380 {
00381 int nWords = Kit_TruthWordNum( nVars );
00382 int i, k, Step;
00383
00384 assert( iVar < nVars );
00385 switch ( iVar )
00386 {
00387 case 0:
00388 for ( i = 0; i < nWords; i++ )
00389 pTruth[i] = (pTruth[i] & 0xAAAAAAAA) | ((pTruth[i] & 0xAAAAAAAA) >> 1);
00390 return;
00391 case 1:
00392 for ( i = 0; i < nWords; i++ )
00393 pTruth[i] = (pTruth[i] & 0xCCCCCCCC) | ((pTruth[i] & 0xCCCCCCCC) >> 2);
00394 return;
00395 case 2:
00396 for ( i = 0; i < nWords; i++ )
00397 pTruth[i] = (pTruth[i] & 0xF0F0F0F0) | ((pTruth[i] & 0xF0F0F0F0) >> 4);
00398 return;
00399 case 3:
00400 for ( i = 0; i < nWords; i++ )
00401 pTruth[i] = (pTruth[i] & 0xFF00FF00) | ((pTruth[i] & 0xFF00FF00) >> 8);
00402 return;
00403 case 4:
00404 for ( i = 0; i < nWords; i++ )
00405 pTruth[i] = (pTruth[i] & 0xFFFF0000) | ((pTruth[i] & 0xFFFF0000) >> 16);
00406 return;
00407 default:
00408 Step = (1 << (iVar - 5));
00409 for ( k = 0; k < nWords; k += 2*Step )
00410 {
00411 for ( i = 0; i < Step; i++ )
00412 pTruth[i] = pTruth[Step+i];
00413 pTruth += 2*Step;
00414 }
00415 return;
00416 }
00417 }
00418
00430 void Kit_TruthCofactor0New( unsigned * pOut, unsigned * pIn, int nVars, int iVar )
00431 {
00432 int nWords = Kit_TruthWordNum( nVars );
00433 int i, k, Step;
00434
00435 assert( iVar < nVars );
00436 switch ( iVar )
00437 {
00438 case 0:
00439 for ( i = 0; i < nWords; i++ )
00440 pOut[i] = (pIn[i] & 0x55555555) | ((pIn[i] & 0x55555555) << 1);
00441 return;
00442 case 1:
00443 for ( i = 0; i < nWords; i++ )
00444 pOut[i] = (pIn[i] & 0x33333333) | ((pIn[i] & 0x33333333) << 2);
00445 return;
00446 case 2:
00447 for ( i = 0; i < nWords; i++ )
00448 pOut[i] = (pIn[i] & 0x0F0F0F0F) | ((pIn[i] & 0x0F0F0F0F) << 4);
00449 return;
00450 case 3:
00451 for ( i = 0; i < nWords; i++ )
00452 pOut[i] = (pIn[i] & 0x00FF00FF) | ((pIn[i] & 0x00FF00FF) << 8);
00453 return;
00454 case 4:
00455 for ( i = 0; i < nWords; i++ )
00456 pOut[i] = (pIn[i] & 0x0000FFFF) | ((pIn[i] & 0x0000FFFF) << 16);
00457 return;
00458 default:
00459 Step = (1 << (iVar - 5));
00460 for ( k = 0; k < nWords; k += 2*Step )
00461 {
00462 for ( i = 0; i < Step; i++ )
00463 pOut[i] = pOut[Step+i] = pIn[i];
00464 pIn += 2*Step;
00465 pOut += 2*Step;
00466 }
00467 return;
00468 }
00469 }
00470
00482 void Kit_TruthCofactor1New( unsigned * pOut, unsigned * pIn, int nVars, int iVar )
00483 {
00484 int nWords = Kit_TruthWordNum( nVars );
00485 int i, k, Step;
00486
00487 assert( iVar < nVars );
00488 switch ( iVar )
00489 {
00490 case 0:
00491 for ( i = 0; i < nWords; i++ )
00492 pOut[i] = (pIn[i] & 0xAAAAAAAA) | ((pIn[i] & 0xAAAAAAAA) >> 1);
00493 return;
00494 case 1:
00495 for ( i = 0; i < nWords; i++ )
00496 pOut[i] = (pIn[i] & 0xCCCCCCCC) | ((pIn[i] & 0xCCCCCCCC) >> 2);
00497 return;
00498 case 2:
00499 for ( i = 0; i < nWords; i++ )
00500 pOut[i] = (pIn[i] & 0xF0F0F0F0) | ((pIn[i] & 0xF0F0F0F0) >> 4);
00501 return;
00502 case 3:
00503 for ( i = 0; i < nWords; i++ )
00504 pOut[i] = (pIn[i] & 0xFF00FF00) | ((pIn[i] & 0xFF00FF00) >> 8);
00505 return;
00506 case 4:
00507 for ( i = 0; i < nWords; i++ )
00508 pOut[i] = (pIn[i] & 0xFFFF0000) | ((pIn[i] & 0xFFFF0000) >> 16);
00509 return;
00510 default:
00511 Step = (1 << (iVar - 5));
00512 for ( k = 0; k < nWords; k += 2*Step )
00513 {
00514 for ( i = 0; i < Step; i++ )
00515 pOut[i] = pOut[Step+i] = pIn[Step+i];
00516 pIn += 2*Step;
00517 pOut += 2*Step;
00518 }
00519 return;
00520 }
00521 }
00522
00523
00535 void Kit_TruthExist( unsigned * pTruth, int nVars, int iVar )
00536 {
00537 int nWords = Kit_TruthWordNum( nVars );
00538 int i, k, Step;
00539
00540 assert( iVar < nVars );
00541 switch ( iVar )
00542 {
00543 case 0:
00544 for ( i = 0; i < nWords; i++ )
00545 pTruth[i] |= ((pTruth[i] & 0xAAAAAAAA) >> 1) | ((pTruth[i] & 0x55555555) << 1);
00546 return;
00547 case 1:
00548 for ( i = 0; i < nWords; i++ )
00549 pTruth[i] |= ((pTruth[i] & 0xCCCCCCCC) >> 2) | ((pTruth[i] & 0x33333333) << 2);
00550 return;
00551 case 2:
00552 for ( i = 0; i < nWords; i++ )
00553 pTruth[i] |= ((pTruth[i] & 0xF0F0F0F0) >> 4) | ((pTruth[i] & 0x0F0F0F0F) << 4);
00554 return;
00555 case 3:
00556 for ( i = 0; i < nWords; i++ )
00557 pTruth[i] |= ((pTruth[i] & 0xFF00FF00) >> 8) | ((pTruth[i] & 0x00FF00FF) << 8);
00558 return;
00559 case 4:
00560 for ( i = 0; i < nWords; i++ )
00561 pTruth[i] |= ((pTruth[i] & 0xFFFF0000) >> 16) | ((pTruth[i] & 0x0000FFFF) << 16);
00562 return;
00563 default:
00564 Step = (1 << (iVar - 5));
00565 for ( k = 0; k < nWords; k += 2*Step )
00566 {
00567 for ( i = 0; i < Step; i++ )
00568 {
00569 pTruth[i] |= pTruth[Step+i];
00570 pTruth[Step+i] = pTruth[i];
00571 }
00572 pTruth += 2*Step;
00573 }
00574 return;
00575 }
00576 }
00577
00589 void Kit_TruthExistNew( unsigned * pRes, unsigned * pTruth, int nVars, int iVar )
00590 {
00591 int nWords = Kit_TruthWordNum( nVars );
00592 int i, k, Step;
00593
00594 assert( iVar < nVars );
00595 switch ( iVar )
00596 {
00597 case 0:
00598 for ( i = 0; i < nWords; i++ )
00599 pRes[i] = pTruth[i] | ((pTruth[i] & 0xAAAAAAAA) >> 1) | ((pTruth[i] & 0x55555555) << 1);
00600 return;
00601 case 1:
00602 for ( i = 0; i < nWords; i++ )
00603 pRes[i] = pTruth[i] | ((pTruth[i] & 0xCCCCCCCC) >> 2) | ((pTruth[i] & 0x33333333) << 2);
00604 return;
00605 case 2:
00606 for ( i = 0; i < nWords; i++ )
00607 pRes[i] = pTruth[i] | ((pTruth[i] & 0xF0F0F0F0) >> 4) | ((pTruth[i] & 0x0F0F0F0F) << 4);
00608 return;
00609 case 3:
00610 for ( i = 0; i < nWords; i++ )
00611 pRes[i] = pTruth[i] | ((pTruth[i] & 0xFF00FF00) >> 8) | ((pTruth[i] & 0x00FF00FF) << 8);
00612 return;
00613 case 4:
00614 for ( i = 0; i < nWords; i++ )
00615 pRes[i] = pTruth[i] | ((pTruth[i] & 0xFFFF0000) >> 16) | ((pTruth[i] & 0x0000FFFF) << 16);
00616 return;
00617 default:
00618 Step = (1 << (iVar - 5));
00619 for ( k = 0; k < nWords; k += 2*Step )
00620 {
00621 for ( i = 0; i < Step; i++ )
00622 {
00623 pRes[i] = pTruth[i] | pTruth[Step+i];
00624 pRes[Step+i] = pRes[i];
00625 }
00626 pRes += 2*Step;
00627 pTruth += 2*Step;
00628 }
00629 return;
00630 }
00631 }
00632
00644 void Kit_TruthExistSet( unsigned * pRes, unsigned * pTruth, int nVars, unsigned uMask )
00645 {
00646 int v;
00647 Kit_TruthCopy( pRes, pTruth, nVars );
00648 for ( v = 0; v < nVars; v++ )
00649 if ( uMask & (1 << v) )
00650 Kit_TruthExist( pRes, nVars, v );
00651 }
00652
00664 void Kit_TruthForall( unsigned * pTruth, int nVars, int iVar )
00665 {
00666 int nWords = Kit_TruthWordNum( nVars );
00667 int i, k, Step;
00668
00669 assert( iVar < nVars );
00670 switch ( iVar )
00671 {
00672 case 0:
00673 for ( i = 0; i < nWords; i++ )
00674 pTruth[i] &= ((pTruth[i] & 0xAAAAAAAA) >> 1) | ((pTruth[i] & 0x55555555) << 1);
00675 return;
00676 case 1:
00677 for ( i = 0; i < nWords; i++ )
00678 pTruth[i] &= ((pTruth[i] & 0xCCCCCCCC) >> 2) | ((pTruth[i] & 0x33333333) << 2);
00679 return;
00680 case 2:
00681 for ( i = 0; i < nWords; i++ )
00682 pTruth[i] &= ((pTruth[i] & 0xF0F0F0F0) >> 4) | ((pTruth[i] & 0x0F0F0F0F) << 4);
00683 return;
00684 case 3:
00685 for ( i = 0; i < nWords; i++ )
00686 pTruth[i] &= ((pTruth[i] & 0xFF00FF00) >> 8) | ((pTruth[i] & 0x00FF00FF) << 8);
00687 return;
00688 case 4:
00689 for ( i = 0; i < nWords; i++ )
00690 pTruth[i] &= ((pTruth[i] & 0xFFFF0000) >> 16) | ((pTruth[i] & 0x0000FFFF) << 16);
00691 return;
00692 default:
00693 Step = (1 << (iVar - 5));
00694 for ( k = 0; k < nWords; k += 2*Step )
00695 {
00696 for ( i = 0; i < Step; i++ )
00697 {
00698 pTruth[i] &= pTruth[Step+i];
00699 pTruth[Step+i] = pTruth[i];
00700 }
00701 pTruth += 2*Step;
00702 }
00703 return;
00704 }
00705 }
00706
00718 void Kit_TruthForallNew( unsigned * pRes, unsigned * pTruth, int nVars, int iVar )
00719 {
00720 int nWords = Kit_TruthWordNum( nVars );
00721 int i, k, Step;
00722
00723 assert( iVar < nVars );
00724 switch ( iVar )
00725 {
00726 case 0:
00727 for ( i = 0; i < nWords; i++ )
00728 pRes[i] = pTruth[i] & (((pTruth[i] & 0xAAAAAAAA) >> 1) | ((pTruth[i] & 0x55555555) << 1));
00729 return;
00730 case 1:
00731 for ( i = 0; i < nWords; i++ )
00732 pRes[i] = pTruth[i] & (((pTruth[i] & 0xCCCCCCCC) >> 2) | ((pTruth[i] & 0x33333333) << 2));
00733 return;
00734 case 2:
00735 for ( i = 0; i < nWords; i++ )
00736 pRes[i] = pTruth[i] & (((pTruth[i] & 0xF0F0F0F0) >> 4) | ((pTruth[i] & 0x0F0F0F0F) << 4));
00737 return;
00738 case 3:
00739 for ( i = 0; i < nWords; i++ )
00740 pRes[i] = pTruth[i] & (((pTruth[i] & 0xFF00FF00) >> 8) | ((pTruth[i] & 0x00FF00FF) << 8));
00741 return;
00742 case 4:
00743 for ( i = 0; i < nWords; i++ )
00744 pRes[i] = pTruth[i] & (((pTruth[i] & 0xFFFF0000) >> 16) | ((pTruth[i] & 0x0000FFFF) << 16));
00745 return;
00746 default:
00747 Step = (1 << (iVar - 5));
00748 for ( k = 0; k < nWords; k += 2*Step )
00749 {
00750 for ( i = 0; i < Step; i++ )
00751 {
00752 pRes[i] = pTruth[i] & pTruth[Step+i];
00753 pRes[Step+i] = pRes[i];
00754 }
00755 pRes += 2*Step;
00756 pTruth += 2*Step;
00757 }
00758 return;
00759 }
00760 }
00761
00773 void Kit_TruthUniqueNew( unsigned * pRes, unsigned * pTruth, int nVars, int iVar )
00774 {
00775 int nWords = Kit_TruthWordNum( nVars );
00776 int i, k, Step;
00777
00778 assert( iVar < nVars );
00779 switch ( iVar )
00780 {
00781 case 0:
00782 for ( i = 0; i < nWords; i++ )
00783 pRes[i] = pTruth[i] ^ (((pTruth[i] & 0xAAAAAAAA) >> 1) | ((pTruth[i] & 0x55555555) << 1));
00784 return;
00785 case 1:
00786 for ( i = 0; i < nWords; i++ )
00787 pRes[i] = pTruth[i] ^ (((pTruth[i] & 0xCCCCCCCC) >> 2) | ((pTruth[i] & 0x33333333) << 2));
00788 return;
00789 case 2:
00790 for ( i = 0; i < nWords; i++ )
00791 pRes[i] = pTruth[i] ^ (((pTruth[i] & 0xF0F0F0F0) >> 4) | ((pTruth[i] & 0x0F0F0F0F) << 4));
00792 return;
00793 case 3:
00794 for ( i = 0; i < nWords; i++ )
00795 pRes[i] = pTruth[i] ^ (((pTruth[i] & 0xFF00FF00) >> 8) | ((pTruth[i] & 0x00FF00FF) << 8));
00796 return;
00797 case 4:
00798 for ( i = 0; i < nWords; i++ )
00799 pRes[i] = pTruth[i] ^ (((pTruth[i] & 0xFFFF0000) >> 16) | ((pTruth[i] & 0x0000FFFF) << 16));
00800 return;
00801 default:
00802 Step = (1 << (iVar - 5));
00803 for ( k = 0; k < nWords; k += 2*Step )
00804 {
00805 for ( i = 0; i < Step; i++ )
00806 {
00807 pRes[i] = pTruth[i] ^ pTruth[Step+i];
00808 pRes[Step+i] = pRes[i];
00809 }
00810 pRes += 2*Step;
00811 pTruth += 2*Step;
00812 }
00813 return;
00814 }
00815 }
00816
00828 void Kit_TruthForallSet( unsigned * pRes, unsigned * pTruth, int nVars, unsigned uMask )
00829 {
00830 int v;
00831 Kit_TruthCopy( pRes, pTruth, nVars );
00832 for ( v = 0; v < nVars; v++ )
00833 if ( uMask & (1 << v) )
00834 Kit_TruthForall( pRes, nVars, v );
00835 }
00836
00837
00849 void Kit_TruthMuxVar( unsigned * pOut, unsigned * pCof0, unsigned * pCof1, int nVars, int iVar )
00850 {
00851 int nWords = Kit_TruthWordNum( nVars );
00852 int i, k, Step;
00853
00854 assert( iVar < nVars );
00855 switch ( iVar )
00856 {
00857 case 0:
00858 for ( i = 0; i < nWords; i++ )
00859 pOut[i] = (pCof0[i] & 0x55555555) | (pCof1[i] & 0xAAAAAAAA);
00860 return;
00861 case 1:
00862 for ( i = 0; i < nWords; i++ )
00863 pOut[i] = (pCof0[i] & 0x33333333) | (pCof1[i] & 0xCCCCCCCC);
00864 return;
00865 case 2:
00866 for ( i = 0; i < nWords; i++ )
00867 pOut[i] = (pCof0[i] & 0x0F0F0F0F) | (pCof1[i] & 0xF0F0F0F0);
00868 return;
00869 case 3:
00870 for ( i = 0; i < nWords; i++ )
00871 pOut[i] = (pCof0[i] & 0x00FF00FF) | (pCof1[i] & 0xFF00FF00);
00872 return;
00873 case 4:
00874 for ( i = 0; i < nWords; i++ )
00875 pOut[i] = (pCof0[i] & 0x0000FFFF) | (pCof1[i] & 0xFFFF0000);
00876 return;
00877 default:
00878 Step = (1 << (iVar - 5));
00879 for ( k = 0; k < nWords; k += 2*Step )
00880 {
00881 for ( i = 0; i < Step; i++ )
00882 {
00883 pOut[i] = pCof0[i];
00884 pOut[Step+i] = pCof1[Step+i];
00885 }
00886 pOut += 2*Step;
00887 pCof0 += 2*Step;
00888 pCof1 += 2*Step;
00889 }
00890 return;
00891 }
00892 }
00893
00905 void Kit_TruthMuxVarPhase( unsigned * pOut, unsigned * pCof0, unsigned * pCof1, int nVars, int iVar, int fCompl0 )
00906 {
00907 int nWords = Kit_TruthWordNum( nVars );
00908 int i, k, Step;
00909
00910 if ( fCompl0 == 0 )
00911 {
00912 Kit_TruthMuxVar( pOut, pCof0, pCof1, nVars, iVar );
00913 return;
00914 }
00915
00916 assert( iVar < nVars );
00917 switch ( iVar )
00918 {
00919 case 0:
00920 for ( i = 0; i < nWords; i++ )
00921 pOut[i] = (~pCof0[i] & 0x55555555) | (pCof1[i] & 0xAAAAAAAA);
00922 return;
00923 case 1:
00924 for ( i = 0; i < nWords; i++ )
00925 pOut[i] = (~pCof0[i] & 0x33333333) | (pCof1[i] & 0xCCCCCCCC);
00926 return;
00927 case 2:
00928 for ( i = 0; i < nWords; i++ )
00929 pOut[i] = (~pCof0[i] & 0x0F0F0F0F) | (pCof1[i] & 0xF0F0F0F0);
00930 return;
00931 case 3:
00932 for ( i = 0; i < nWords; i++ )
00933 pOut[i] = (~pCof0[i] & 0x00FF00FF) | (pCof1[i] & 0xFF00FF00);
00934 return;
00935 case 4:
00936 for ( i = 0; i < nWords; i++ )
00937 pOut[i] = (~pCof0[i] & 0x0000FFFF) | (pCof1[i] & 0xFFFF0000);
00938 return;
00939 default:
00940 Step = (1 << (iVar - 5));
00941 for ( k = 0; k < nWords; k += 2*Step )
00942 {
00943 for ( i = 0; i < Step; i++ )
00944 {
00945 pOut[i] = ~pCof0[i];
00946 pOut[Step+i] = pCof1[Step+i];
00947 }
00948 pOut += 2*Step;
00949 pCof0 += 2*Step;
00950 pCof1 += 2*Step;
00951 }
00952 return;
00953 }
00954 }
00955
00967 int Kit_TruthVarsSymm( unsigned * pTruth, int nVars, int iVar0, int iVar1 )
00968 {
00969 static unsigned uTemp0[16], uTemp1[16];
00970 assert( nVars <= 9 );
00971
00972 Kit_TruthCopy( uTemp0, pTruth, nVars );
00973 Kit_TruthCofactor0( uTemp0, nVars, iVar0 );
00974 Kit_TruthCofactor1( uTemp0, nVars, iVar1 );
00975
00976 Kit_TruthCopy( uTemp1, pTruth, nVars );
00977 Kit_TruthCofactor1( uTemp1, nVars, iVar0 );
00978 Kit_TruthCofactor0( uTemp1, nVars, iVar1 );
00979
00980 return Kit_TruthIsEqual( uTemp0, uTemp1, nVars );
00981 }
00982
00994 int Kit_TruthVarsAntiSymm( unsigned * pTruth, int nVars, int iVar0, int iVar1 )
00995 {
00996 static unsigned uTemp0[16], uTemp1[16];
00997 assert( nVars <= 9 );
00998
00999 Kit_TruthCopy( uTemp0, pTruth, nVars );
01000 Kit_TruthCofactor0( uTemp0, nVars, iVar0 );
01001 Kit_TruthCofactor0( uTemp0, nVars, iVar1 );
01002
01003 Kit_TruthCopy( uTemp1, pTruth, nVars );
01004 Kit_TruthCofactor1( uTemp1, nVars, iVar0 );
01005 Kit_TruthCofactor1( uTemp1, nVars, iVar1 );
01006
01007 return Kit_TruthIsEqual( uTemp0, uTemp1, nVars );
01008 }
01009
01021 void Kit_TruthChangePhase( unsigned * pTruth, int nVars, int iVar )
01022 {
01023 int nWords = Kit_TruthWordNum( nVars );
01024 int i, k, Step;
01025 unsigned Temp;
01026
01027 assert( iVar < nVars );
01028 switch ( iVar )
01029 {
01030 case 0:
01031 for ( i = 0; i < nWords; i++ )
01032 pTruth[i] = ((pTruth[i] & 0x55555555) << 1) | ((pTruth[i] & 0xAAAAAAAA) >> 1);
01033 return;
01034 case 1:
01035 for ( i = 0; i < nWords; i++ )
01036 pTruth[i] = ((pTruth[i] & 0x33333333) << 2) | ((pTruth[i] & 0xCCCCCCCC) >> 2);
01037 return;
01038 case 2:
01039 for ( i = 0; i < nWords; i++ )
01040 pTruth[i] = ((pTruth[i] & 0x0F0F0F0F) << 4) | ((pTruth[i] & 0xF0F0F0F0) >> 4);
01041 return;
01042 case 3:
01043 for ( i = 0; i < nWords; i++ )
01044 pTruth[i] = ((pTruth[i] & 0x00FF00FF) << 8) | ((pTruth[i] & 0xFF00FF00) >> 8);
01045 return;
01046 case 4:
01047 for ( i = 0; i < nWords; i++ )
01048 pTruth[i] = ((pTruth[i] & 0x0000FFFF) << 16) | ((pTruth[i] & 0xFFFF0000) >> 16);
01049 return;
01050 default:
01051 Step = (1 << (iVar - 5));
01052 for ( k = 0; k < nWords; k += 2*Step )
01053 {
01054 for ( i = 0; i < Step; i++ )
01055 {
01056 Temp = pTruth[i];
01057 pTruth[i] = pTruth[Step+i];
01058 pTruth[Step+i] = Temp;
01059 }
01060 pTruth += 2*Step;
01061 }
01062 return;
01063 }
01064 }
01065
01077 int Kit_TruthMinCofSuppOverlap( unsigned * pTruth, int nVars, int * pVarMin )
01078 {
01079 static unsigned uCofactor[16];
01080 int i, ValueCur, ValueMin, VarMin;
01081 unsigned uSupp0, uSupp1;
01082 int nVars0, nVars1;
01083 assert( nVars <= 9 );
01084 ValueMin = 32;
01085 VarMin = -1;
01086 for ( i = 0; i < nVars; i++ )
01087 {
01088
01089 Kit_TruthCopy( uCofactor, pTruth, nVars );
01090 Kit_TruthCofactor0( uCofactor, nVars, i );
01091 uSupp0 = Kit_TruthSupport( uCofactor, nVars );
01092 nVars0 = Kit_WordCountOnes( uSupp0 );
01093
01094
01095 Kit_TruthCopy( uCofactor, pTruth, nVars );
01096 Kit_TruthCofactor1( uCofactor, nVars, i );
01097 uSupp1 = Kit_TruthSupport( uCofactor, nVars );
01098 nVars1 = Kit_WordCountOnes( uSupp1 );
01099
01100
01101 ValueCur = Kit_WordCountOnes( uSupp0 & uSupp1 );
01102 if ( ValueMin > ValueCur && nVars0 <= 5 && nVars1 <= 5 )
01103 {
01104 ValueMin = ValueCur;
01105 VarMin = i;
01106 }
01107 if ( ValueMin == 0 )
01108 break;
01109 }
01110 if ( pVarMin )
01111 *pVarMin = VarMin;
01112 return ValueMin;
01113 }
01114
01115
01127 int Kit_TruthBestCofVar( unsigned * pTruth, int nVars, unsigned * pCof0, unsigned * pCof1 )
01128 {
01129 int i, iBestVar, nSuppSizeCur0, nSuppSizeCur1, nSuppSizeCur, nSuppSizeMin;
01130 if ( Kit_TruthIsConst0(pTruth, nVars) || Kit_TruthIsConst1(pTruth, nVars) )
01131 return -1;
01132
01133 iBestVar = -1;
01134 nSuppSizeMin = KIT_INFINITY;
01135 for ( i = 0; i < nVars; i++ )
01136 {
01137
01138 Kit_TruthCofactor0New( pCof0, pTruth, nVars, i );
01139 Kit_TruthCofactor1New( pCof1, pTruth, nVars, i );
01140 nSuppSizeCur0 = Kit_TruthSupportSize( pCof0, nVars );
01141 nSuppSizeCur1 = Kit_TruthSupportSize( pCof1, nVars );
01142 nSuppSizeCur = nSuppSizeCur0 + nSuppSizeCur1;
01143
01144 if ( nSuppSizeMin > nSuppSizeCur )
01145 {
01146 nSuppSizeMin = nSuppSizeCur;
01147 iBestVar = i;
01148 }
01149 }
01150 assert( iBestVar != -1 );
01151
01152 Kit_TruthCofactor0New( pCof0, pTruth, nVars, iBestVar );
01153 Kit_TruthCofactor1New( pCof1, pTruth, nVars, iBestVar );
01154 return iBestVar;
01155 }
01156
01157
01172 void Kit_TruthCountOnesInCofs( unsigned * pTruth, int nVars, short * pStore )
01173 {
01174 int nWords = Kit_TruthWordNum( nVars );
01175 int i, k, Counter;
01176 memset( pStore, 0, sizeof(short) * 2 * nVars );
01177 if ( nVars <= 5 )
01178 {
01179 if ( nVars > 0 )
01180 {
01181 pStore[2*0+0] = Kit_WordCountOnes( pTruth[0] & 0x55555555 );
01182 pStore[2*0+1] = Kit_WordCountOnes( pTruth[0] & 0xAAAAAAAA );
01183 }
01184 if ( nVars > 1 )
01185 {
01186 pStore[2*1+0] = Kit_WordCountOnes( pTruth[0] & 0x33333333 );
01187 pStore[2*1+1] = Kit_WordCountOnes( pTruth[0] & 0xCCCCCCCC );
01188 }
01189 if ( nVars > 2 )
01190 {
01191 pStore[2*2+0] = Kit_WordCountOnes( pTruth[0] & 0x0F0F0F0F );
01192 pStore[2*2+1] = Kit_WordCountOnes( pTruth[0] & 0xF0F0F0F0 );
01193 }
01194 if ( nVars > 3 )
01195 {
01196 pStore[2*3+0] = Kit_WordCountOnes( pTruth[0] & 0x00FF00FF );
01197 pStore[2*3+1] = Kit_WordCountOnes( pTruth[0] & 0xFF00FF00 );
01198 }
01199 if ( nVars > 4 )
01200 {
01201 pStore[2*4+0] = Kit_WordCountOnes( pTruth[0] & 0x0000FFFF );
01202 pStore[2*4+1] = Kit_WordCountOnes( pTruth[0] & 0xFFFF0000 );
01203 }
01204 return;
01205 }
01206
01207
01208 for ( k = 0; k < nWords; k++ )
01209 {
01210 Counter = Kit_WordCountOnes( pTruth[k] );
01211 for ( i = 5; i < nVars; i++ )
01212 if ( k & (1 << (i-5)) )
01213 pStore[2*i+1] += Counter;
01214 else
01215 pStore[2*i+0] += Counter;
01216 }
01217
01218 for ( k = 0; k < nWords/2; k++ )
01219 {
01220 pStore[2*0+0] += Kit_WordCountOnes( (pTruth[0] & 0x55555555) | ((pTruth[1] & 0x55555555) << 1) );
01221 pStore[2*0+1] += Kit_WordCountOnes( (pTruth[0] & 0xAAAAAAAA) | ((pTruth[1] & 0xAAAAAAAA) >> 1) );
01222 pStore[2*1+0] += Kit_WordCountOnes( (pTruth[0] & 0x33333333) | ((pTruth[1] & 0x33333333) << 2) );
01223 pStore[2*1+1] += Kit_WordCountOnes( (pTruth[0] & 0xCCCCCCCC) | ((pTruth[1] & 0xCCCCCCCC) >> 2) );
01224 pStore[2*2+0] += Kit_WordCountOnes( (pTruth[0] & 0x0F0F0F0F) | ((pTruth[1] & 0x0F0F0F0F) << 4) );
01225 pStore[2*2+1] += Kit_WordCountOnes( (pTruth[0] & 0xF0F0F0F0) | ((pTruth[1] & 0xF0F0F0F0) >> 4) );
01226 pStore[2*3+0] += Kit_WordCountOnes( (pTruth[0] & 0x00FF00FF) | ((pTruth[1] & 0x00FF00FF) << 8) );
01227 pStore[2*3+1] += Kit_WordCountOnes( (pTruth[0] & 0xFF00FF00) | ((pTruth[1] & 0xFF00FF00) >> 8) );
01228 pStore[2*4+0] += Kit_WordCountOnes( (pTruth[0] & 0x0000FFFF) | ((pTruth[1] & 0x0000FFFF) << 16) );
01229 pStore[2*4+1] += Kit_WordCountOnes( (pTruth[0] & 0xFFFF0000) | ((pTruth[1] & 0xFFFF0000) >> 16) );
01230 pTruth += 2;
01231 }
01232 }
01233
01245 void Kit_TruthCountOnesInCofsSlow( unsigned * pTruth, int nVars, short * pStore, unsigned * pAux )
01246 {
01247 int i;
01248 for ( i = 0; i < nVars; i++ )
01249 {
01250 Kit_TruthCofactor0New( pAux, pTruth, nVars, i );
01251 pStore[2*i+0] = Kit_TruthCountOnes( pAux, nVars ) / 2;
01252 Kit_TruthCofactor1New( pAux, pTruth, nVars, i );
01253 pStore[2*i+1] = Kit_TruthCountOnes( pAux, nVars ) / 2;
01254 }
01255 }
01256
01268 unsigned Kit_TruthHash( unsigned * pIn, int nWords )
01269 {
01270
01271
01272 static int HashPrimes[1024] = { 2, 3, 5,
01273 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97,
01274 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191,
01275 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283,
01276 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401,
01277 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509,
01278 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631,
01279 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751,
01280 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877,
01281 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997,
01282 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091,
01283 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193,
01284 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291,
01285 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423,
01286 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493,
01287 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601,
01288 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699,
01289 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811,
01290 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931,
01291 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029,
01292 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137,
01293 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267,
01294 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357,
01295 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459,
01296 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593,
01297 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693,
01298 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791,
01299 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903,
01300 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023,
01301 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167,
01302 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271,
01303 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373,
01304 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511,
01305 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607,
01306 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709,
01307 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833,
01308 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931,
01309 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057,
01310 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177,
01311 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283,
01312 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423,
01313 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547,
01314 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657,
01315 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789,
01316 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931,
01317 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011,
01318 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147,
01319 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279,
01320 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413,
01321 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507,
01322 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647,
01323 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743,
01324 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857,
01325 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007,
01326 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121,
01327 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247,
01328 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343,
01329 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473,
01330 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607,
01331 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733,
01332 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857,
01333 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971,
01334 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103,
01335 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229,
01336 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369,
01337 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517,
01338 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603,
01339 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723,
01340 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873,
01341 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009,
01342 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123,
01343 8147, 8161 };
01344 int i;
01345 unsigned uHashKey;
01346 assert( nWords <= 1024 );
01347 uHashKey = 0;
01348 for ( i = 0; i < nWords; i++ )
01349 uHashKey ^= HashPrimes[i] * pIn[i];
01350 return uHashKey;
01351 }
01352
01353
01365 unsigned Kit_TruthSemiCanonicize( unsigned * pInOut, unsigned * pAux, int nVars, char * pCanonPerm, short * pStore )
01366 {
01367
01368 unsigned * pIn = pInOut, * pOut = pAux, * pTemp;
01369
01370 int i, Temp, fChange, Counter;
01371 unsigned uCanonPhase;
01372
01373
01374 uCanonPhase = 0;
01375
01376
01377
01378
01379
01380
01381
01382
01383
01384 Kit_TruthCountOnesInCofs( pIn, nVars, pStore );
01385
01386
01387
01388
01389
01390
01391
01392 for ( i = 0; i < nVars; i++ )
01393 {
01394 if ( pStore[2*i+0] >= pStore[2*i+1] )
01395 continue;
01396 uCanonPhase |= (1 << i);
01397 Temp = pStore[2*i+0];
01398 pStore[2*i+0] = pStore[2*i+1];
01399 pStore[2*i+1] = Temp;
01400 Kit_TruthChangePhase( pIn, nVars, i );
01401 }
01402
01403
01404
01405
01406
01407 Counter = 0;
01408 do {
01409 fChange = 0;
01410 for ( i = 0; i < nVars-1; i++ )
01411 {
01412 if ( pStore[2*i] >= pStore[2*(i+1)] )
01413 continue;
01414 Counter++;
01415 fChange = 1;
01416
01417 Temp = pCanonPerm[i];
01418 pCanonPerm[i] = pCanonPerm[i+1];
01419 pCanonPerm[i+1] = Temp;
01420
01421 Temp = pStore[2*i];
01422 pStore[2*i] = pStore[2*(i+1)];
01423 pStore[2*(i+1)] = Temp;
01424
01425 Temp = pStore[2*i+1];
01426 pStore[2*i+1] = pStore[2*(i+1)+1];
01427 pStore[2*(i+1)+1] = Temp;
01428
01429
01430 if ( ((uCanonPhase & (1 << i)) > 0) != ((uCanonPhase & (1 << (i+1))) > 0) )
01431 {
01432 uCanonPhase ^= (1 << i);
01433 uCanonPhase ^= (1 << (i+1));
01434 }
01435
01436 Kit_TruthSwapAdjacentVars( pOut, pIn, nVars, i );
01437 pTemp = pIn; pIn = pOut; pOut = pTemp;
01438 }
01439 } while ( fChange );
01440
01441
01442
01443
01444
01445
01446
01447
01448
01449
01450
01451
01452
01453
01454
01455
01456
01457
01458
01459
01460
01461
01462
01463
01464
01465
01466
01467
01468
01469
01470
01471
01472
01473
01474
01475
01476
01477
01478
01479
01480
01481
01482
01483
01484
01485
01486
01487
01488
01489
01490
01491
01492
01493
01494
01495
01496
01497
01498
01499
01500
01501
01502
01503
01504
01505
01506
01507
01508
01509
01510
01511
01512
01513
01514
01515
01516
01517
01518
01519
01520
01521
01522 if ( Counter & 1 )
01523 Kit_TruthCopy( pOut, pIn, nVars );
01524 return uCanonPhase;
01525 }
01526
01527
01542 int Kit_TruthCountMinterms( unsigned * pTruth, int nVars, int * pRes, int * pBytes )
01543 {
01544
01545 static unsigned Table[256] = {
01546 0x00000000, 0x01010101, 0x01010001, 0x02020102, 0x01000101, 0x02010202, 0x02010102, 0x03020203,
01547 0x01000001, 0x02010102, 0x02010002, 0x03020103, 0x02000102, 0x03010203, 0x03010103, 0x04020204,
01548 0x00010101, 0x01020202, 0x01020102, 0x02030203, 0x01010202, 0x02020303, 0x02020203, 0x03030304,
01549 0x01010102, 0x02020203, 0x02020103, 0x03030204, 0x02010203, 0x03020304, 0x03020204, 0x04030305,
01550 0x00010001, 0x01020102, 0x01020002, 0x02030103, 0x01010102, 0x02020203, 0x02020103, 0x03030204,
01551 0x01010002, 0x02020103, 0x02020003, 0x03030104, 0x02010103, 0x03020204, 0x03020104, 0x04030205,
01552 0x00020102, 0x01030203, 0x01030103, 0x02040204, 0x01020203, 0x02030304, 0x02030204, 0x03040305,
01553 0x01020103, 0x02030204, 0x02030104, 0x03040205, 0x02020204, 0x03030305, 0x03030205, 0x04040306,
01554 0x00000101, 0x01010202, 0x01010102, 0x02020203, 0x01000202, 0x02010303, 0x02010203, 0x03020304,
01555 0x01000102, 0x02010203, 0x02010103, 0x03020204, 0x02000203, 0x03010304, 0x03010204, 0x04020305,
01556 0x00010202, 0x01020303, 0x01020203, 0x02030304, 0x01010303, 0x02020404, 0x02020304, 0x03030405,
01557 0x01010203, 0x02020304, 0x02020204, 0x03030305, 0x02010304, 0x03020405, 0x03020305, 0x04030406,
01558 0x00010102, 0x01020203, 0x01020103, 0x02030204, 0x01010203, 0x02020304, 0x02020204, 0x03030305,
01559 0x01010103, 0x02020204, 0x02020104, 0x03030205, 0x02010204, 0x03020305, 0x03020205, 0x04030306,
01560 0x00020203, 0x01030304, 0x01030204, 0x02040305, 0x01020304, 0x02030405, 0x02030305, 0x03040406,
01561 0x01020204, 0x02030305, 0x02030205, 0x03040306, 0x02020305, 0x03030406, 0x03030306, 0x04040407,
01562 0x00000001, 0x01010102, 0x01010002, 0x02020103, 0x01000102, 0x02010203, 0x02010103, 0x03020204,
01563 0x01000002, 0x02010103, 0x02010003, 0x03020104, 0x02000103, 0x03010204, 0x03010104, 0x04020205,
01564 0x00010102, 0x01020203, 0x01020103, 0x02030204, 0x01010203, 0x02020304, 0x02020204, 0x03030305,
01565 0x01010103, 0x02020204, 0x02020104, 0x03030205, 0x02010204, 0x03020305, 0x03020205, 0x04030306,
01566 0x00010002, 0x01020103, 0x01020003, 0x02030104, 0x01010103, 0x02020204, 0x02020104, 0x03030205,
01567 0x01010003, 0x02020104, 0x02020004, 0x03030105, 0x02010104, 0x03020205, 0x03020105, 0x04030206,
01568 0x00020103, 0x01030204, 0x01030104, 0x02040205, 0x01020204, 0x02030305, 0x02030205, 0x03040306,
01569 0x01020104, 0x02030205, 0x02030105, 0x03040206, 0x02020205, 0x03030306, 0x03030206, 0x04040307,
01570 0x00000102, 0x01010203, 0x01010103, 0x02020204, 0x01000203, 0x02010304, 0x02010204, 0x03020305,
01571 0x01000103, 0x02010204, 0x02010104, 0x03020205, 0x02000204, 0x03010305, 0x03010205, 0x04020306,
01572 0x00010203, 0x01020304, 0x01020204, 0x02030305, 0x01010304, 0x02020405, 0x02020305, 0x03030406,
01573 0x01010204, 0x02020305, 0x02020205, 0x03030306, 0x02010305, 0x03020406, 0x03020306, 0x04030407,
01574 0x00010103, 0x01020204, 0x01020104, 0x02030205, 0x01010204, 0x02020305, 0x02020205, 0x03030306,
01575 0x01010104, 0x02020205, 0x02020105, 0x03030206, 0x02010205, 0x03020306, 0x03020206, 0x04030307,
01576 0x00020204, 0x01030305, 0x01030205, 0x02040306, 0x01020305, 0x02030406, 0x02030306, 0x03040407,
01577 0x01020205, 0x02030306, 0x02030206, 0x03040307, 0x02020306, 0x03030407, 0x03030307, 0x04040408
01578 };
01579 unsigned uSum;
01580 unsigned char * pTruthC, * pLimit;
01581 int i, iVar, Step, nWords, nBytes, nTotal;
01582
01583 assert( nVars <= 20 );
01584
01585
01586 memset( pRes, 0, sizeof(int) * nVars );
01587
01588
01589 nTotal = uSum = 0;
01590 nWords = Kit_TruthWordNum( nVars );
01591 nBytes = nWords * 4;
01592 pTruthC = (unsigned char *)pTruth;
01593 pLimit = pTruthC + nBytes;
01594 for ( ; pTruthC < pLimit; pTruthC++ )
01595 {
01596 uSum += Table[*pTruthC];
01597 *pBytes++ = (Table[*pTruthC] & 0xff);
01598 if ( (uSum & 0xff) > 246 )
01599 {
01600 nTotal += (uSum & 0xff);
01601 pRes[0] += ((uSum >> 8) & 0xff);
01602 pRes[2] += ((uSum >> 16) & 0xff);
01603 pRes[3] += ((uSum >> 24) & 0xff);
01604 uSum = 0;
01605 }
01606 }
01607 if ( uSum )
01608 {
01609 nTotal += (uSum & 0xff);
01610 pRes[0] += ((uSum >> 8) & 0xff);
01611 pRes[1] += ((uSum >> 16) & 0xff);
01612 pRes[2] += ((uSum >> 24) & 0xff);
01613 }
01614
01615
01616 for ( iVar = 3, Step = 1; Step < nBytes; Step *= 2, iVar++ )
01617 for ( i = 0; i < nBytes; i += Step + Step )
01618 {
01619 pRes[iVar] += pBytes[i];
01620 pBytes[i] += pBytes[i+Step];
01621 }
01622 assert( pBytes[0] == nTotal );
01623 assert( iVar == nVars );
01624 return nTotal;
01625 }
01626
01638 void Kit_PrintHexadecimal( FILE * pFile, unsigned Sign[], int nVars )
01639 {
01640 int nDigits, Digit, k;
01641
01642 nDigits = (1 << nVars) / 4;
01643 for ( k = nDigits - 1; k >= 0; k-- )
01644 {
01645 Digit = ((Sign[k/8] >> ((k%8) * 4)) & 15);
01646 if ( Digit < 10 )
01647 fprintf( pFile, "%d", Digit );
01648 else
01649 fprintf( pFile, "%c", 'a' + Digit-10 );
01650 }
01651
01652 }
01653
01665 void Kit_TruthCountMintermsPrecomp()
01666 {
01667 int bit_count[256] = {
01668 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
01669 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
01670 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
01671 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
01672 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
01673 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
01674 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
01675 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8
01676 };
01677 unsigned i, uWord;
01678 for ( i = 0; i < 256; i++ )
01679 {
01680 if ( i % 8 == 0 )
01681 printf( "\n" );
01682 uWord = bit_count[i];
01683 uWord |= (bit_count[i & 0x55] << 8);
01684 uWord |= (bit_count[i & 0x33] << 16);
01685 uWord |= (bit_count[i & 0x0f] << 24);
01686 printf( "0x" );
01687 Kit_PrintHexadecimal( stdout, &uWord, 5 );
01688 printf( ", " );
01689 }
01690 }
01691
01703 char * Kit_TruthDumpToFile( unsigned * pTruth, int nVars, int nFile )
01704 {
01705 static char pFileName[100];
01706 FILE * pFile;
01707 sprintf( pFileName, "tt\\s%04d", nFile );
01708 pFile = fopen( pFileName, "w" );
01709 fprintf( pFile, "rt " );
01710 Kit_PrintHexadecimal( pFile, pTruth, nVars );
01711 fprintf( pFile, "; bdd; sop; ps\n" );
01712 fclose( pFile );
01713 return pFileName;
01714 }
01715
01716
01720
01721