397 if ( nCubes != nDifferentVars )
407 DammyBitData[i] = pCA->pCubeDataIn[i];
410 nDiffVarsIn = ( DiffVars[0] >= 0 )? nCubes: nCubes-1;
412 pDiffVars = ( DiffVars[0] >= 0 )? DiffVars: DiffVars+1;
414 for ( i = 0; i < nDiffVarsIn; i++ )
416 DiffVarWords[i] = ((2*pDiffVars[i]) >>
LOGBPI) ;
417 DiffVarBits[i] = ((2*pDiffVars[i]) &
BPIMASK);
419 DammyBitData[ DiffVarWords[i] ] &= ~( 3 << DiffVarBits[i] );
425 StartingLiterals = pCA->a;
426 for ( i = 0, BitShift = 0; i < nDiffVarsIn; i++, BitShift++ )
428 DiffVarValues[i][0] = ( pCA->pCubeDataIn[DiffVarWords[i]] >> DiffVarBits[i] ) & 3;
429 if ( DiffVarValues[i][0] !=
VAR_ABS )
431 MaskLiterals |= ( 1 << BitShift );
437 DiffVarValues[i][1] = ( pCB->pCubeDataIn[DiffVarWords[i]] >> DiffVarBits[i] ) & 3;
438 if ( DiffVarValues[i][1] !=
VAR_ABS )
439 MaskLiterals |= ( 1 << BitShift );
442 DiffVarValues[i][2] = DiffVarValues[i][0] ^ DiffVarValues[i][1];
443 if ( DiffVarValues[i][2] !=
VAR_ABS )
444 MaskLiterals |= ( 1 << BitShift );
449 for ( i = 0; i < nCubesInGroup; i++ )
450 CubeLiterals[i] =
BitCount[ MaskLiterals & s_CubeLitMasks[
Dist][i] ];
453 for ( i = 0; i < nGroups; i++ )
455 for ( GroupCosts[i] = 0, c = 0; c < nCubes; c++ )
456 GroupCosts[i] += CubeLiterals[ s_ELGroupRules[
Dist][i][c] ];
459 if ( fMinLitGroupsFirst[
Dist] )
462 for ( i = 0; i < nGroups; i++ )
463 if ( GroupCostBest > GroupCosts[i] )
465 GroupCostBest = GroupCosts[i];
466 GroupCostBestNum = i;
472 for ( i = 0; i < nGroups; i++ )
473 if ( GroupCostBest < GroupCosts[i] )
475 GroupCostBest = GroupCosts[i];
476 GroupCostBestNum = i;
482 for ( c = 0; c < nCubes; c++ )
484 CubeNum = s_ELGroupRules[
Dist][GroupCostBestNum][c];
485 LastGroup |= s_BitMasks[CubeNum];
492 ELCubes[CubeNum]->pCubeDataIn[i] = DammyBitData[i];
496 if ( DiffVars[0] >= 0 )
499 ELCubes[CubeNum]->pCubeDataOut[i] = pCA->pCubeDataOut[i];
504 Value = s_ELCubeRules[
Dist][CubeNum][nDiffVarsIn];
508 Temp = pCA->pCubeDataOut[i];
509 ELCubes[CubeNum]->pCubeDataOut[i] = Temp;
510 NewZ += BIT_COUNT(Temp);
512 else if ( Value ==
vs1 )
515 Temp = pCB->pCubeDataOut[i];
516 ELCubes[CubeNum]->pCubeDataOut[i] = Temp;
517 NewZ += BIT_COUNT(Temp);
519 else if ( Value ==
vsX )
522 Temp = pCA->pCubeDataOut[i] ^ pCB->pCubeDataOut[i];
523 ELCubes[CubeNum]->pCubeDataOut[i] = Temp;
524 NewZ += BIT_COUNT(Temp);
529 for ( i = 0; i < nDiffVarsIn; i++ )
531 Value = DiffVarValues[i][ s_ELCubeRules[
Dist][CubeNum][i] ];
532 ELCubes[CubeNum]->pCubeDataIn[ DiffVarWords[i] ] |= ( Value << DiffVarBits[i] );
536 ELCubes[CubeNum]->a = StartingLiterals + CubeLiterals[CubeNum];
537 ELCubes[CubeNum]->z = NewZ;
547 pGroup[c] = ELCubes[CubeNum];
551 VisitedGroups |= s_BitMasks[ GroupCostBestNum ];
553 GroupOrder[0] = GroupCostBestNum;
569 if ( nVisitedGroups == nGroups )
574 if ( fMinLitGroupsFirst[nDist] )
579 for ( i = 0; i < nGroups; i++ )
580 if ( !(VisitedGroups & s_BitMasks[i]) && GroupCostBest > GroupCosts[i] )
582 GroupCostBest = GroupCosts[i];
583 GroupCostBestNum = i;
591 for ( i = 0; i < nGroups; i++ )
592 if ( !(VisitedGroups & s_BitMasks[i]) && GroupCostBest < GroupCosts[i] )
594 GroupCostBest = GroupCosts[i];
595 GroupCostBestNum = i;
597 assert( GroupCostBest != -1 );
602 for ( c = 0; c < nCubes; c++ )
604 CubeNum = s_ELGroupRules[nDist][GroupCostBestNum][c];
605 LastGroup |= s_BitMasks[CubeNum];
607 if ( ELCubes[CubeNum] == NULL )
614 ELCubes[CubeNum]->pCubeDataIn[i] = DammyBitData[i];
618 if ( DiffVars[0] >= 0 )
621 ELCubes[CubeNum]->pCubeDataOut[i] = pCA->pCubeDataOut[i];
626 Value = s_ELCubeRules[nDist][CubeNum][nDiffVarsIn];
630 Temp = pCA->pCubeDataOut[i];
631 ELCubes[CubeNum]->pCubeDataOut[i] = Temp;
632 NewZ += BIT_COUNT(Temp);
634 else if ( Value ==
vs1 )
637 Temp = pCB->pCubeDataOut[i];
638 ELCubes[CubeNum]->pCubeDataOut[i] = Temp;
639 NewZ += BIT_COUNT(Temp);
641 else if ( Value ==
vsX )
644 Temp = pCA->pCubeDataOut[i] ^ pCB->pCubeDataOut[i];
645 ELCubes[CubeNum]->pCubeDataOut[i] = Temp;
646 NewZ += BIT_COUNT(Temp);
651 for ( i = 0; i < nDiffVarsIn; i++ )
653 Value = DiffVarValues[i][ s_ELCubeRules[nDist][CubeNum][i] ];
654 ELCubes[CubeNum]->pCubeDataIn[ DiffVarWords[i] ] |= ( Value << DiffVarBits[i] );
658 ELCubes[CubeNum]->a = StartingLiterals + CubeLiterals[CubeNum];
659 ELCubes[CubeNum]->z = NewZ;
671 pGroup[c] = ELCubes[CubeNum];
675 VisitedGroups |= s_BitMasks[ GroupCostBestNum ];
678 GroupOrder[ nVisitedGroups++ ] = GroupCostBestNum;
690 assert( g >= 0 && g < nGroups );
691 assert( VisitedGroups & s_BitMasks[g] );
693 GroupNum = GroupOrder[g];
696 for ( c = 0; c < nCubes; c++ )
698 CubeNum = s_ELGroupRules[nDist][GroupNum][c];
701 LastGroup |= s_BitMasks[CubeNum];
703 assert( ELCubes[CubeNum] != NULL );
705 pGroup[c] = ELCubes[CubeNum];