592 int i, v,
Var, PrevId;
597 if (
p->fProofVerif )
601 p->nResLits = pConflict->
nLits;
605 for ( v = 0; v < (int)pConflict->
nLits; v++ )
606 p->pSeens[lit_var(pConflict->
pLits[v])] = 1;
612 if (
p->pCnf->nClausesA )
613 Int_ManTruthCopy( Int_ManTruthRead(
p, pFinal), Int_ManTruthRead(
p, pConflict),
p->nWords );
616 PrevId = Int_ManProofGet(
p, pConflict);
617 for ( i =
p->nTrailSize - 1; i >= 0; i-- )
620 Var = lit_var(
p->pTrail[i]);
621 if ( !
p->pSeens[
Var] )
626 pReason =
p->pReasons[
Var];
627 if ( pReason == NULL )
632 for ( v = 1; v < (int)pReason->
nLits; v++ )
633 p->pSeens[lit_var(pReason->
pLits[v])] = 1;
637 assert( Int_ManProofGet(
p, pReason) > 0 );
639 if (
p->fProofWrite )
640 fprintf(
p->pFile,
"%d * %d %d 0\n",
p->Counter, PrevId, Int_ManProofGet(
p, pReason) );
643 if (
p->pCnf->nClausesA )
645 if (
p->pVarTypes[
Var] == 1 )
646 Int_ManTruthOr( Int_ManTruthRead(
p, pFinal), Int_ManTruthRead(
p, pReason),
p->nWords );
648 Int_ManTruthAnd( Int_ManTruthRead(
p, pFinal), Int_ManTruthRead(
p, pReason),
p->nWords );
652 if (
p->fProofVerif )
658 for ( v1 = 0; v1 <
p->nResLits; v1++ )
659 if ( lit_var(
p->pResLits[v1]) ==
Var )
661 if ( v1 ==
p->nResLits )
662 printf(
"Recording clause %d: Cannot find variable %d in the temporary resolvent.\n", pFinal->
Id,
Var );
663 if (
p->pResLits[v1] != lit_neg(pReason->
pLits[0]) )
664 printf(
"Recording clause %d: The resolved variable %d is in the wrong polarity.\n", pFinal->
Id,
Var );
668 for ( ; v1 <
p->nResLits; v1++ )
669 p->pResLits[v1] =
p->pResLits[v1+1];
671 for ( v2 = 1; v2 < (int)pReason->
nLits; v2++ )
673 for ( v1 = 0; v1 <
p->nResLits; v1++ )
674 if ( lit_var(
p->pResLits[v1]) == lit_var(pReason->
pLits[v2]) )
677 if ( v1 ==
p->nResLits )
679 if (
p->nResLits ==
p->nResLitsAlloc )
680 printf(
"Recording clause %d: Ran out of space for intermediate resolvent.\n", pFinal->
Id );
681 p->pResLits[
p->nResLits++ ] = pReason->
pLits[v2];
685 if (
p->pResLits[v1] == pReason->
pLits[v2] )
688 printf(
"Recording clause %d: Trying to resolve the clause with more than one opposite literal.\n", pFinal->
Id );
703 if (
p->fProofVerif )
708 for ( v1 = 0; v1 <
p->nResLits; v1++ )
710 for ( v2 = 0; v2 < (int)pFinal->
nLits; v2++ )
711 if ( pFinal->
pLits[v2] ==
p->pResLits[v1] )
713 if ( v2 < (
int)pFinal->
nLits )
717 if ( v1 < p->nResLits )
719 printf(
"Recording clause %d: The final resolvent is wrong.\n", pFinal->
Id );
728 if (
p->nResLits != (
int)pFinal->
nLits )
730 for ( v1 = 0; v1 < (int)pFinal->
nLits; v1++ )
732 for ( v2 = 0; v2 <
p->nResLits; v2++ )
733 if ( pFinal->
pLits[v1] ==
p->pResLits[v2] )
735 if ( v2 < p->nResLits )
739 for ( v2 = v1; v2 < (int)pFinal->
nLits; v2++ )
746p->timeTrace += Abc_Clock() - clk;
749 if (
p->pCnf->nClausesA )
753 Int_ManProofSet(
p, pFinal,
p->Counter );
755 assert(
p->pProofNums[pFinal->
Id-1] !=
p->Counter );
951 unsigned uTruths[8][8] = {
952 { 0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA },
953 { 0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC },
954 { 0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0 },
955 { 0xFF00FF00,0xFF00FF00,0xFF00FF00,0xFF00FF00,0xFF00FF00,0xFF00FF00,0xFF00FF00,0xFF00FF00 },
956 { 0xFFFF0000,0xFFFF0000,0xFFFF0000,0xFFFF0000,0xFFFF0000,0xFFFF0000,0xFFFF0000,0xFFFF0000 },
957 { 0x00000000,0xFFFFFFFF,0x00000000,0xFFFFFFFF,0x00000000,0xFFFFFFFF,0x00000000,0xFFFFFFFF },
958 { 0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFF },
959 { 0x00000000,0x00000000,0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF }
970 Int_ManTruthFill( Int_ManTruthRead(
p, pClause),
p->nWords );
975 Int_ManTruthClear( Int_ManTruthRead(
p, pClause),
p->nWords );
976 for ( v = 0; v < (int)pClause->
nLits; v++ )
979 if (
p->pVarTypes[
Var] < 0 )
981 VarAB = -
p->pVarTypes[
Var]-1;
982 assert( VarAB >= 0 && VarAB < p->nVarsAB );
983 if ( lit_sign(pClause->
pLits[v]) )
984 Int_ManTruthOrNot( Int_ManTruthRead(
p, pClause), uTruths[VarAB],
p->nWords );
986 Int_ManTruthOr( Int_ManTruthRead(
p, pClause), uTruths[VarAB],
p->nWords );