mirror of https://github.com/YosysHQ/abc.git
194 lines
5.6 KiB
C
194 lines
5.6 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [satChecker.c]
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
PackageName [SAT sat_solver.]
|
|
|
|
Synopsis [Resolution proof checker.]
|
|
|
|
Author [Alan Mishchenko]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - June 20, 2005.]
|
|
|
|
Revision [$Id: satChecker.c,v 1.4 2005/09/16 22:55:03 casem Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <assert.h>
|
|
#include <time.h>
|
|
#include "misc/vec/vec.h"
|
|
|
|
ABC_NAMESPACE_IMPL_START
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DEFINITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Sat_PrintClause( Vec_Vec_t * vClauses, int Clause )
|
|
{
|
|
Vec_Int_t * vClause;
|
|
int i, Entry;
|
|
printf( "Clause %d: {", Clause );
|
|
vClause = Vec_VecEntry( vClauses, Clause );
|
|
Vec_IntForEachEntry( vClause, Entry, i )
|
|
printf( " %d", Entry );
|
|
printf( " }\n" );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
int Sat_ProofResolve( Vec_Vec_t * vClauses, int Result, int Clause1, int Clause2 )
|
|
{
|
|
Vec_Int_t * vResult = Vec_VecEntry( vClauses, Result );
|
|
Vec_Int_t * vClause1 = Vec_VecEntry( vClauses, Clause1 );
|
|
Vec_Int_t * vClause2 = Vec_VecEntry( vClauses, Clause2 );
|
|
int Entry1, Entry2, ResVar;
|
|
int i, j, Counter = 0;
|
|
|
|
Vec_IntForEachEntry( vClause1, Entry1, i )
|
|
Vec_IntForEachEntry( vClause2, Entry2, j )
|
|
if ( Entry1 == -Entry2 )
|
|
{
|
|
ResVar = Entry1;
|
|
Counter++;
|
|
}
|
|
if ( Counter != 1 )
|
|
{
|
|
printf( "Error: Clause %d = Resolve(%d, %d): The number of pivot vars is %d.\n",
|
|
Result, Clause1, Clause2, Counter );
|
|
Sat_PrintClause( vClauses, Clause1 );
|
|
Sat_PrintClause( vClauses, Clause2 );
|
|
return 0;
|
|
}
|
|
// create new clause
|
|
assert( Vec_IntSize(vResult) == 0 );
|
|
Vec_IntForEachEntry( vClause1, Entry1, i )
|
|
if ( Entry1 != ResVar && Entry1 != -ResVar )
|
|
Vec_IntPushUnique( vResult, Entry1 );
|
|
assert( Vec_IntSize(vResult) + 1 == Vec_IntSize(vClause1) );
|
|
Vec_IntForEachEntry( vClause2, Entry2, i )
|
|
if ( Entry2 != ResVar && Entry2 != -ResVar )
|
|
Vec_IntPushUnique( vResult, Entry2 );
|
|
return 1;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Sat_ProofChecker( char * pFileName )
|
|
{
|
|
FILE * pFile;
|
|
Vec_Vec_t * vClauses;
|
|
int c, i, Num, RetValue, Counter, Counter2, Clause1, Clause2;
|
|
int RetValue;
|
|
// open the file
|
|
pFile = fopen( pFileName, "r" );
|
|
if ( pFile == NULL )
|
|
return;
|
|
// count the number of clauses
|
|
Counter = Counter2 = 0;
|
|
while ( (c = fgetc(pFile)) != EOF )
|
|
{
|
|
Counter += (c == '\n');
|
|
Counter2 += (c == '*');
|
|
}
|
|
vClauses = Vec_VecStart( Counter+1 );
|
|
printf( "The proof contains %d roots and %d resolution steps.\n", Counter-Counter2, Counter2 );
|
|
// read the clauses
|
|
rewind( pFile );
|
|
for ( i = 1 ; ; i++ )
|
|
{
|
|
RetValue = RetValue = fscanf( pFile, "%d", &Num );
|
|
if ( RetValue != 1 )
|
|
break;
|
|
assert( Num == i );
|
|
while ( (c = fgetc( pFile )) == ' ' );
|
|
if ( c == '*' )
|
|
{
|
|
RetValue = fscanf( pFile, "%d %d", &Clause1, &Clause2 );
|
|
assert( RetValue == 2 );
|
|
RetValue = fscanf( pFile, "%d", &Num );
|
|
assert( RetValue == 1 );
|
|
assert( Num == 0 );
|
|
if ( !Sat_ProofResolve( vClauses, i, Clause1, Clause2 ) )
|
|
{
|
|
printf( "Error detected in the resolution proof.\n" );
|
|
Vec_VecFree( vClauses );
|
|
fclose( pFile );
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ungetc( c, pFile );
|
|
while ( 1 )
|
|
{
|
|
RetValue = fscanf( pFile, "%d", &Num );
|
|
assert( RetValue == 1 );
|
|
if ( Num == 0 )
|
|
break;
|
|
Vec_VecPush( vClauses, i, (void *)Num );
|
|
}
|
|
RetValue = fscanf( pFile, "%d", &Num );
|
|
assert( RetValue == 1 );
|
|
assert( Num == 0 );
|
|
}
|
|
}
|
|
assert( i-1 == Counter );
|
|
if ( Vec_IntSize( Vec_VecEntry(vClauses, Counter) ) != 0 )
|
|
printf( "The last clause is not empty.\n" );
|
|
else
|
|
printf( "The empty clause is derived.\n" );
|
|
Vec_VecFree( vClauses );
|
|
fclose( pFile );
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
ABC_NAMESPACE_IMPL_END
|
|
|