ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
satChecker.c
Go to the documentation of this file.
1
20
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24#include <assert.h>
25
26#include "misc/vec/vec.h"
27
29
30
34
35
39
51void Sat_PrintClause( Vec_Vec_t * vClauses, int Clause )
52{
53 Vec_Int_t * vClause;
54 int i, Entry;
55 printf( "Clause %d: {", Clause );
56 vClause = Vec_VecEntry( vClauses, Clause );
57 Vec_IntForEachEntry( vClause, Entry, i )
58 printf( " %d", Entry );
59 printf( " }\n" );
60}
61
73int Sat_ProofResolve( Vec_Vec_t * vClauses, int Result, int Clause1, int Clause2 )
74{
75 Vec_Int_t * vResult = Vec_VecEntry( vClauses, Result );
76 Vec_Int_t * vClause1 = Vec_VecEntry( vClauses, Clause1 );
77 Vec_Int_t * vClause2 = Vec_VecEntry( vClauses, Clause2 );
78 int Entry1, Entry2, ResVar;
79 int i, j, Counter = 0;
80
81 Vec_IntForEachEntry( vClause1, Entry1, i )
82 Vec_IntForEachEntry( vClause2, Entry2, j )
83 if ( Entry1 == -Entry2 )
84 {
85 ResVar = Entry1;
86 Counter++;
87 }
88 if ( Counter != 1 )
89 {
90 printf( "Error: Clause %d = Resolve(%d, %d): The number of pivot vars is %d.\n",
91 Result, Clause1, Clause2, Counter );
92 Sat_PrintClause( vClauses, Clause1 );
93 Sat_PrintClause( vClauses, Clause2 );
94 return 0;
95 }
96 // create new clause
97 assert( Vec_IntSize(vResult) == 0 );
98 Vec_IntForEachEntry( vClause1, Entry1, i )
99 if ( Entry1 != ResVar && Entry1 != -ResVar )
100 Vec_IntPushUnique( vResult, Entry1 );
101 assert( Vec_IntSize(vResult) + 1 == Vec_IntSize(vClause1) );
102 Vec_IntForEachEntry( vClause2, Entry2, i )
103 if ( Entry2 != ResVar && Entry2 != -ResVar )
104 Vec_IntPushUnique( vResult, Entry2 );
105 return 1;
106}
107
119void Sat_ProofChecker( char * pFileName )
120{
121 FILE * pFile;
122 Vec_Vec_t * vClauses;
123 int c, i, Num, RetValue, Counter, Counter2, Clause1, Clause2;
124 int RetValue;
125 // open the file
126 pFile = fopen( pFileName, "r" );
127 if ( pFile == NULL )
128 return;
129 // count the number of clauses
130 Counter = Counter2 = 0;
131 while ( (c = fgetc(pFile)) != EOF )
132 {
133 Counter += (c == '\n');
134 Counter2 += (c == '*');
135 }
136 vClauses = Vec_VecStart( Counter+1 );
137 printf( "The proof contains %d roots and %d resolution steps.\n", Counter-Counter2, Counter2 );
138 // read the clauses
139 rewind( pFile );
140 for ( i = 1 ; ; i++ )
141 {
142 RetValue = RetValue = fscanf( pFile, "%d", &Num );
143 if ( RetValue != 1 )
144 break;
145 assert( Num == i );
146 while ( (c = fgetc( pFile )) == ' ' );
147 if ( c == '*' )
148 {
149 RetValue = fscanf( pFile, "%d %d", &Clause1, &Clause2 );
150 assert( RetValue == 2 );
151 RetValue = fscanf( pFile, "%d", &Num );
152 assert( RetValue == 1 );
153 assert( Num == 0 );
154 if ( !Sat_ProofResolve( vClauses, i, Clause1, Clause2 ) )
155 {
156 printf( "Error detected in the resolution proof.\n" );
157 Vec_VecFree( vClauses );
158 fclose( pFile );
159 return;
160 }
161 }
162 else
163 {
164 ungetc( c, pFile );
165 while ( 1 )
166 {
167 RetValue = fscanf( pFile, "%d", &Num );
168 assert( RetValue == 1 );
169 if ( Num == 0 )
170 break;
171 Vec_VecPush( vClauses, i, (void *)Num );
172 }
173 RetValue = fscanf( pFile, "%d", &Num );
174 assert( RetValue == 1 );
175 assert( Num == 0 );
176 }
177 }
178 assert( i-1 == Counter );
179 if ( Vec_IntSize( Vec_VecEntry(vClauses, Counter) ) != 0 )
180 printf( "The last clause is not empty.\n" );
181 else
182 printf( "The empty clause is derived.\n" );
183 Vec_VecFree( vClauses );
184 fclose( pFile );
185}
186
190
191
193
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
ABC_NAMESPACE_IMPL_START void Sat_PrintClause(Vec_Vec_t *vClauses, int Clause)
DECLARATIONS ///.
Definition satChecker.c:51
void Sat_ProofChecker(char *pFileName)
Definition satChecker.c:119
int Sat_ProofResolve(Vec_Vec_t *vClauses, int Result, int Clause1, int Clause2)
Definition satChecker.c:73
#define assert(ex)
Definition util_old.h:213
VOID_HACK rewind()
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.
Definition vecVec.h:42