ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
aigInter.c File Reference
#include "aig.h"
#include "sat/cnf/cnf.h"
#include "sat/bsat/satStore.h"
Include dependency graph for aigInter.c:

Go to the source code of this file.

Functions

void Aig_ManInterFast (Aig_Man_t *pManOn, Aig_Man_t *pManOff, int fVerbose)
 FUNCTION DEFINITIONS ///.
 
Aig_Man_tAig_ManInter (Aig_Man_t *pManOn, Aig_Man_t *pManOff, int fRelation, int fVerbose)
 

Variables

ABC_NAMESPACE_IMPL_START abctime timeCnf
 DECLARATIONS ///.
 
abctime timeSat
 
abctime timeInt
 

Function Documentation

◆ Aig_ManInter()

Aig_Man_t * Aig_ManInter ( Aig_Man_t * pManOn,
Aig_Man_t * pManOff,
int fRelation,
int fVerbose )

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 149 of file aigInter.c.

150{
151 void * pSatCnf = NULL;
152 Inta_Man_t * pManInter;
153 Aig_Man_t * pRes;
154 sat_solver * pSat;
155 Cnf_Dat_t * pCnfOn, * pCnfOff;
156 Vec_Int_t * vVarsAB;
157 Aig_Obj_t * pObj, * pObj2;
158 int Lits[3], status, i;
159 abctime clk;
160 int iLast = -1; // Suppress "might be used uninitialized"
161
162 assert( Aig_ManCiNum(pManOn) == Aig_ManCiNum(pManOff) );
163
164clk = Abc_Clock();
165 // derive CNFs
166// pCnfOn = Cnf_Derive( pManOn, 0 );
167// pCnfOff = Cnf_Derive( pManOff, 0 );
168 pCnfOn = Cnf_DeriveSimple( pManOn, 0 );
169 pCnfOff = Cnf_DeriveSimple( pManOff, 0 );
170 Cnf_DataLift( pCnfOff, pCnfOn->nVars );
171timeCnf += Abc_Clock() - clk;
172
173clk = Abc_Clock();
174 // start the solver
175 pSat = sat_solver_new();
177 sat_solver_setnvars( pSat, pCnfOn->nVars + pCnfOff->nVars );
178
179 // add clauses of A
180 for ( i = 0; i < pCnfOn->nClauses; i++ )
181 {
182 if ( !sat_solver_addclause( pSat, pCnfOn->pClauses[i], pCnfOn->pClauses[i+1] ) )
183 {
184 Cnf_DataFree( pCnfOn );
185 Cnf_DataFree( pCnfOff );
186 sat_solver_delete( pSat );
187 return NULL;
188 }
189 }
191
192 // update the last clause
193 if ( fRelation )
194 {
195 extern int sat_solver_store_change_last( sat_solver * pSat );
196 iLast = sat_solver_store_change_last( pSat );
197 }
198
199 // add clauses of B
200 for ( i = 0; i < pCnfOff->nClauses; i++ )
201 {
202 if ( !sat_solver_addclause( pSat, pCnfOff->pClauses[i], pCnfOff->pClauses[i+1] ) )
203 {
204 Cnf_DataFree( pCnfOn );
205 Cnf_DataFree( pCnfOff );
206 sat_solver_delete( pSat );
207 return NULL;
208 }
209 }
210
211 // add PI clauses
212 // collect the common variables
213 vVarsAB = Vec_IntAlloc( Aig_ManCiNum(pManOn) );
214 if ( fRelation )
215 Vec_IntPush( vVarsAB, iLast );
216
217 Aig_ManForEachCi( pManOn, pObj, i )
218 {
219 Vec_IntPush( vVarsAB, pCnfOn->pVarNums[pObj->Id] );
220 pObj2 = Aig_ManCi( pManOff, i );
221
222 Lits[0] = toLitCond( pCnfOn->pVarNums[pObj->Id], 0 );
223 Lits[1] = toLitCond( pCnfOff->pVarNums[pObj2->Id], 1 );
224 if ( !sat_solver_addclause( pSat, Lits, Lits+2 ) )
225 assert( 0 );
226 Lits[0] = toLitCond( pCnfOn->pVarNums[pObj->Id], 1 );
227 Lits[1] = toLitCond( pCnfOff->pVarNums[pObj2->Id], 0 );
228 if ( !sat_solver_addclause( pSat, Lits, Lits+2 ) )
229 assert( 0 );
230 }
231 Cnf_DataFree( pCnfOn );
232 Cnf_DataFree( pCnfOff );
234
235/*
236 status = sat_solver_simplify(pSat);
237 if ( status == 0 )
238 {
239 Vec_IntFree( vVarsAB );
240 Cnf_DataFree( pCnfOn );
241 Cnf_DataFree( pCnfOff );
242 sat_solver_delete( pSat );
243 return NULL;
244 }
245*/
246
247 // solve the problem
248 status = sat_solver_solve( pSat, NULL, NULL, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
249timeSat += Abc_Clock() - clk;
250 if ( status == l_False )
251 {
252 pSatCnf = sat_solver_store_release( pSat );
253// printf( "unsat\n" );
254 }
255 else if ( status == l_True )
256 {
257// printf( "sat\n" );
258 }
259 else
260 {
261// printf( "undef\n" );
262 }
263 sat_solver_delete( pSat );
264 if ( pSatCnf == NULL )
265 {
266 printf( "The SAT problem is not unsat.\n" );
267 Vec_IntFree( vVarsAB );
268 return NULL;
269 }
270
271 // create the resulting manager
272clk = Abc_Clock();
273 pManInter = Inta_ManAlloc();
274 pRes = (Aig_Man_t *)Inta_ManInterpolate( pManInter, (Sto_Man_t *)pSatCnf, 0, vVarsAB, fVerbose );
275 Inta_ManFree( pManInter );
276timeInt += Abc_Clock() - clk;
277/*
278 // test UNSAT core computation
279 {
280 Intp_Man_t * pManProof;
281 Vec_Int_t * vCore;
282 pManProof = Intp_ManAlloc();
283 vCore = Intp_ManUnsatCore( pManProof, pSatCnf, 0 );
284 Intp_ManFree( pManProof );
285 Vec_IntFree( vCore );
286 }
287*/
288 Vec_IntFree( vVarsAB );
289 Sto_ManFree( (Sto_Man_t *)pSatCnf );
290
291// Ioa_WriteAiger( pRes, "inter2.aig", 0, 0 );
292 return pRes;
293}
ABC_INT64_T abctime
Definition abc_global.h:332
abctime timeInt
Definition abcDar.c:3943
ABC_NAMESPACE_IMPL_START abctime timeCnf
DECLARATIONS ///.
Definition abcDar.c:3941
abctime timeSat
Definition abcDar.c:3942
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
Definition aig.h:393
struct Aig_Obj_t_ Aig_Obj_t
Definition aig.h:51
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
Definition aig.h:50
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
#define l_True
Definition bmcBmcS.c:35
#define l_False
Definition bmcBmcS.c:36
#define sat_solver_addclause
Definition cecSatG2.c:37
#define sat_solver
Definition cecSatG2.c:34
#define sat_solver_solve
Definition cecSatG2.c:45
Cnf_Dat_t * Cnf_DeriveSimple(Aig_Man_t *p, int nOutputs)
Definition cnfWrite.c:587
struct Cnf_Dat_t_ Cnf_Dat_t
Definition cnf.h:52
void Cnf_DataFree(Cnf_Dat_t *p)
Definition cnfMan.c:207
void Cnf_DataLift(Cnf_Dat_t *p, int nVarsPlus)
Definition cnfMan.c:232
void * Inta_ManInterpolate(Inta_Man_t *p, Sto_Man_t *pCnf, abctime TimeToStop, void *vVarsAB, int fVerbose)
Definition satInterA.c:944
Inta_Man_t * Inta_ManAlloc()
FUNCTION DEFINITIONS ///.
Definition satInterA.c:106
void Inta_ManFree(Inta_Man_t *p)
Definition satInterA.c:250
sat_solver * sat_solver_new(void)
Definition satSolver.c:1137
int sat_solver_store_change_last(sat_solver *s)
Definition satSolver.c:2406
void sat_solver_store_mark_clauses_a(sat_solver *s)
Definition satSolver.c:2417
void sat_solver_setnvars(sat_solver *s, int n)
Definition satSolver.c:1272
void sat_solver_store_alloc(sat_solver *s)
Definition satSolver.c:2389
void sat_solver_store_mark_roots(sat_solver *s)
Definition satSolver.c:2412
void * sat_solver_store_release(sat_solver *s)
Definition satSolver.c:2422
void sat_solver_delete(sat_solver *s)
Definition satSolver.c:1341
void Sto_ManFree(Sto_Man_t *p)
Definition satStore.c:143
struct Sto_Man_t_ Sto_Man_t
Definition satStore.h:81
struct Inta_Man_t_ Inta_Man_t
Definition satStore.h:130
int Id
Definition aig.h:85
int nVars
Definition cnf.h:59
int * pVarNums
Definition cnf.h:63
int ** pClauses
Definition cnf.h:62
int nClauses
Definition cnf.h:61
#define assert(ex)
Definition util_old.h:213
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Aig_ManInterFast()

void Aig_ManInterFast ( Aig_Man_t * pManOn,
Aig_Man_t * pManOff,
int fVerbose )

FUNCTION DEFINITIONS ///.

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 51 of file aigInter.c.

52{
53 sat_solver * pSat;
54 Cnf_Dat_t * pCnfOn, * pCnfOff;
55 Aig_Obj_t * pObj, * pObj2;
56 int Lits[3], status, i;
57// abctime clk = Abc_Clock();
58
59 assert( Aig_ManCiNum(pManOn) == Aig_ManCiNum(pManOff) );
60 assert( Aig_ManCoNum(pManOn) == Aig_ManCoNum(pManOff) );
61
62 // derive CNFs
63 pManOn->nRegs = Aig_ManCoNum(pManOn);
64 pCnfOn = Cnf_Derive( pManOn, Aig_ManCoNum(pManOn) );
65 pManOn->nRegs = 0;
66
67 pManOff->nRegs = Aig_ManCoNum(pManOn);
68 pCnfOff = Cnf_Derive( pManOff, Aig_ManCoNum(pManOff) );
69 pManOff->nRegs = 0;
70
71// pCnfOn = Cnf_DeriveSimple( pManOn, Aig_ManCoNum(pManOn) );
72// pCnfOff = Cnf_DeriveSimple( pManOff, Aig_ManCoNum(pManOn) );
73 Cnf_DataLift( pCnfOff, pCnfOn->nVars );
74
75 // start the solver
76 pSat = sat_solver_new();
77 sat_solver_setnvars( pSat, pCnfOn->nVars + pCnfOff->nVars );
78
79 // add clauses of A
80 for ( i = 0; i < pCnfOn->nClauses; i++ )
81 {
82 if ( !sat_solver_addclause( pSat, pCnfOn->pClauses[i], pCnfOn->pClauses[i+1] ) )
83 {
84 Cnf_DataFree( pCnfOn );
85 Cnf_DataFree( pCnfOff );
86 sat_solver_delete( pSat );
87 return;
88 }
89 }
90
91 // add clauses of B
92 for ( i = 0; i < pCnfOff->nClauses; i++ )
93 {
94 if ( !sat_solver_addclause( pSat, pCnfOff->pClauses[i], pCnfOff->pClauses[i+1] ) )
95 {
96 Cnf_DataFree( pCnfOn );
97 Cnf_DataFree( pCnfOff );
98 sat_solver_delete( pSat );
99 return;
100 }
101 }
102
103 // add PI clauses
104 // collect the common variables
105 Aig_ManForEachCi( pManOn, pObj, i )
106 {
107 pObj2 = Aig_ManCi( pManOff, i );
108
109 Lits[0] = toLitCond( pCnfOn->pVarNums[pObj->Id], 0 );
110 Lits[1] = toLitCond( pCnfOff->pVarNums[pObj2->Id], 1 );
111 if ( !sat_solver_addclause( pSat, Lits, Lits+2 ) )
112 assert( 0 );
113 Lits[0] = toLitCond( pCnfOn->pVarNums[pObj->Id], 1 );
114 Lits[1] = toLitCond( pCnfOff->pVarNums[pObj2->Id], 0 );
115 if ( !sat_solver_addclause( pSat, Lits, Lits+2 ) )
116 assert( 0 );
117 }
118 status = sat_solver_simplify( pSat );
119 assert( status != 0 );
120
121 // solve incremental SAT problems
122 Aig_ManForEachCo( pManOn, pObj, i )
123 {
124 pObj2 = Aig_ManCo( pManOff, i );
125
126 Lits[0] = toLitCond( pCnfOn->pVarNums[pObj->Id], 0 );
127 Lits[1] = toLitCond( pCnfOff->pVarNums[pObj2->Id], 0 );
128 status = sat_solver_solve( pSat, Lits, Lits+2, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
129 if ( status != l_False )
130 printf( "The incremental SAT problem is not UNSAT.\n" );
131 }
132 Cnf_DataFree( pCnfOn );
133 Cnf_DataFree( pCnfOff );
134 sat_solver_delete( pSat );
135// ABC_PRT( "Fast interpolation time", Abc_Clock() - clk );
136}
#define Aig_ManForEachCo(p, pObj, i)
Definition aig.h:398
Cnf_Dat_t * Cnf_Derive(Aig_Man_t *pAig, int nOutputs)
Definition cnfCore.c:165
int sat_solver_simplify(sat_solver *s)
Definition satSolver.c:1515
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ timeCnf

DECLARATIONS ///.

CFile****************************************************************

FileName [aigInter.c]

SystemName [ABC: Logic synthesis and verification system.]

PackageName [AIG package.]

Synopsis [Interpolate two AIGs.]

Author [Alan Mishchenko]

Affiliation [UC Berkeley]

Date [Ver. 1.0. Started - April 28, 2007.]

Revision [

Id
aigInter.c,v 1.00 2007/04/28 00:00:00 alanmi Exp

]

Definition at line 3941 of file abcDar.c.

◆ timeInt

abctime timeInt
extern

Definition at line 3943 of file abcDar.c.

◆ timeSat

abctime timeSat
extern

Definition at line 3942 of file abcDar.c.