ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
abcProve.c
Go to the documentation of this file.
1
20
21#include <math.h>
22
23#include "base/abc/abc.h"
24#include "proof/fraig/fraig.h"
25
26#ifdef ABC_USE_CUDD
27#include "bdd/extrab/extraBdd.h"
28#endif
29
31
32
36
37extern int Abc_NtkRefactor( Abc_Ntk_t * pNtk, int nNodeSizeMax, int nMinSaved, int nConeSizeMax, int fUpdateLevel, int fUseZeros, int fUseDcs, int fVerbose );
38extern Abc_Ntk_t * Abc_NtkFromFraig( Fraig_Man_t * pMan, Abc_Ntk_t * pNtk );
39
40static Abc_Ntk_t * Abc_NtkMiterFraig( Abc_Ntk_t * pNtk, int nBTLimit, ABC_INT64_T nInspLimit, int * pRetValue, int * pNumFails, ABC_INT64_T * pNumConfs, ABC_INT64_T * pNumInspects );
41static void Abc_NtkMiterPrint( Abc_Ntk_t * pNtk, char * pString, abctime clk, int fVerbose );
42
43
47
62int Abc_NtkMiterProve( Abc_Ntk_t ** ppNtk, void * pPars )
63{
64 Prove_Params_t * pParams = (Prove_Params_t *)pPars;
65 Abc_Ntk_t * pNtk, * pNtkTemp;
66 int RetValue = -1, nIter, nSatFails, Counter;
67 abctime clk; //, timeStart = Abc_Clock();
68 ABC_INT64_T nSatConfs, nSatInspects, nInspectLimit;
69
70 // get the starting network
71 pNtk = *ppNtk;
72 assert( Abc_NtkIsStrash(pNtk) );
73 assert( Abc_NtkPoNum(pNtk) == 1 );
74
75 if ( pParams->fVerbose )
76 {
77 printf( "RESOURCE LIMITS: Iterations = %d. Rewriting = %s. Fraiging = %s.\n",
78 pParams->nItersMax, pParams->fUseRewriting? "yes":"no", pParams->fUseFraiging? "yes":"no" );
79 printf( "Miter = %d (%3.1f). Rwr = %d (%3.1f). Fraig = %d (%3.1f). Last = %d.\n",
80 pParams->nMiteringLimitStart, pParams->nMiteringLimitMulti,
82 pParams->nFraigingLimitStart, pParams->nFraigingLimitMulti, pParams->nMiteringLimitLast );
83 }
84
85 // if SAT only, solve without iteration
86 if ( !pParams->fUseRewriting && !pParams->fUseFraiging )
87 {
88 clk = Abc_Clock();
89 RetValue = Abc_NtkMiterSat( pNtk, (ABC_INT64_T)pParams->nMiteringLimitLast, (ABC_INT64_T)0, 0, NULL, NULL );
90 Abc_NtkMiterPrint( pNtk, "SAT solving", clk, pParams->fVerbose );
91 *ppNtk = pNtk;
92 return RetValue;
93 }
94
95 // check the current resource limits
96 for ( nIter = 0; nIter < pParams->nItersMax; nIter++ )
97 {
98 if ( pParams->fVerbose )
99 {
100 printf( "ITERATION %2d : Confs = %6d. FraigBTL = %3d. \n", nIter+1,
101 (int)(pParams->nMiteringLimitStart * pow(pParams->nMiteringLimitMulti,nIter)),
102 (int)(pParams->nFraigingLimitStart * pow(pParams->nFraigingLimitMulti,nIter)) );
103 fflush( stdout );
104 }
105
106 // try brute-force SAT
107 clk = Abc_Clock();
108 nInspectLimit = pParams->nTotalInspectLimit? pParams->nTotalInspectLimit - pParams->nTotalInspectsMade : 0;
109 RetValue = Abc_NtkMiterSat( pNtk, (ABC_INT64_T)(pParams->nMiteringLimitStart * pow(pParams->nMiteringLimitMulti,nIter)), (ABC_INT64_T)nInspectLimit, 0, &nSatConfs, &nSatInspects );
110 Abc_NtkMiterPrint( pNtk, "SAT solving", clk, pParams->fVerbose );
111 if ( RetValue >= 0 )
112 break;
113
114 // add to the number of backtracks and inspects
115 pParams->nTotalBacktracksMade += nSatConfs;
116 pParams->nTotalInspectsMade += nSatInspects;
117 // check if global resource limit is reached
118 if ( (pParams->nTotalBacktrackLimit && pParams->nTotalBacktracksMade >= pParams->nTotalBacktrackLimit) ||
119 (pParams->nTotalInspectLimit && pParams->nTotalInspectsMade >= pParams->nTotalInspectLimit) )
120 {
121 printf( "Reached global limit on conflicts/inspects. Quitting.\n" );
122 *ppNtk = pNtk;
123 return -1;
124 }
125
126 // try rewriting
127 if ( pParams->fUseRewriting )
128 {
129 clk = Abc_Clock();
130 Counter = (int)(pParams->nRewritingLimitStart * pow(pParams->nRewritingLimitMulti,nIter));
131// Counter = 1;
132 while ( 1 )
133 {
134/*
135 extern Abc_Ntk_t * Abc_NtkIvyResyn( Abc_Ntk_t * pNtk, int fUpdateLevel, int fVerbose );
136 pNtk = Abc_NtkIvyResyn( pNtkTemp = pNtk, 0, 0 ); Abc_NtkDelete( pNtkTemp );
137 if ( (RetValue = Abc_NtkMiterIsConstant(pNtk)) >= 0 )
138 break;
139 if ( --Counter == 0 )
140 break;
141*/
142/*
143 Abc_NtkRewrite( pNtk, 0, 0, 0, 0, 0 );
144 if ( (RetValue = Abc_NtkMiterIsConstant(pNtk)) >= 0 )
145 break;
146 if ( --Counter == 0 )
147 break;
148*/
149 Abc_NtkRewrite( pNtk, 0, 0, 0, 0, 0 );
150 if ( (RetValue = Abc_NtkMiterIsConstant(pNtk)) >= 0 )
151 break;
152 if ( --Counter == 0 )
153 break;
154 Abc_NtkRefactor( pNtk, 10, 1, 16, 0, 0, 0, 0 );
155 if ( (RetValue = Abc_NtkMiterIsConstant(pNtk)) >= 0 )
156 break;
157 if ( --Counter == 0 )
158 break;
159 pNtk = Abc_NtkBalance( pNtkTemp = pNtk, 0, 0, 0 ); Abc_NtkDelete( pNtkTemp );
160 if ( (RetValue = Abc_NtkMiterIsConstant(pNtk)) >= 0 )
161 break;
162 if ( --Counter == 0 )
163 break;
164 }
165 Abc_NtkMiterPrint( pNtk, "Rewriting ", clk, pParams->fVerbose );
166 }
167
168 if ( pParams->fUseFraiging )
169 {
170 // try FRAIGing
171 clk = Abc_Clock();
172 nInspectLimit = pParams->nTotalInspectLimit? pParams->nTotalInspectLimit - pParams->nTotalInspectsMade : 0;
173 pNtk = Abc_NtkMiterFraig( pNtkTemp = pNtk, (int)(pParams->nFraigingLimitStart * pow(pParams->nFraigingLimitMulti,nIter)), nInspectLimit, &RetValue, &nSatFails, &nSatConfs, &nSatInspects ); Abc_NtkDelete( pNtkTemp );
174 Abc_NtkMiterPrint( pNtk, "FRAIGing ", clk, pParams->fVerbose );
175// printf( "NumFails = %d\n", nSatFails );
176 if ( RetValue >= 0 )
177 break;
178
179 // add to the number of backtracks and inspects
180 pParams->nTotalBacktracksMade += nSatConfs;
181 pParams->nTotalInspectsMade += nSatInspects;
182 // check if global resource limit is reached
183 if ( (pParams->nTotalBacktrackLimit && pParams->nTotalBacktracksMade >= pParams->nTotalBacktrackLimit) ||
184 (pParams->nTotalInspectLimit && pParams->nTotalInspectsMade >= pParams->nTotalInspectLimit) )
185 {
186 printf( "Reached global limit on conflicts/inspects. Quitting.\n" );
187 *ppNtk = pNtk;
188 return -1;
189 }
190 }
191
192 }
193
194 // try to prove it using brute force SAT
195#ifdef ABC_USE_CUDD
196 if ( RetValue < 0 && pParams->fUseBdds )
197 {
198 if ( pParams->fVerbose )
199 {
200 printf( "Attempting BDDs with node limit %d ...\n", pParams->nBddSizeLimit );
201 fflush( stdout );
202 }
203 clk = Abc_Clock();
204 pNtk = Abc_NtkCollapse( pNtkTemp = pNtk, pParams->nBddSizeLimit, 0, pParams->fBddReorder, 0, 0, 0 );
205 if ( pNtk )
206 {
207 Abc_NtkDelete( pNtkTemp );
208 RetValue = ( (Abc_NtkNodeNum(pNtk) == 1) && (Abc_ObjFanin0(Abc_NtkPo(pNtk,0))->pData == Cudd_ReadLogicZero((DdManager *)pNtk->pManFunc)) );
209 }
210 else
211 pNtk = pNtkTemp;
212 Abc_NtkMiterPrint( pNtk, "BDD building", clk, pParams->fVerbose );
213 }
214#endif
215
216 if ( RetValue < 0 )
217 {
218 if ( pParams->fVerbose )
219 {
220 printf( "Attempting SAT with conflict limit %d ...\n", pParams->nMiteringLimitLast );
221 fflush( stdout );
222 }
223 clk = Abc_Clock();
224 nInspectLimit = pParams->nTotalInspectLimit? pParams->nTotalInspectLimit - pParams->nTotalInspectsMade : 0;
225 RetValue = Abc_NtkMiterSat( pNtk, (ABC_INT64_T)pParams->nMiteringLimitLast, (ABC_INT64_T)nInspectLimit, 0, NULL, NULL );
226 Abc_NtkMiterPrint( pNtk, "SAT solving", clk, pParams->fVerbose );
227 }
228
229 // assign the model if it was proved by rewriting (const 1 miter)
230 if ( RetValue == 0 && pNtk->pModel == NULL )
231 {
232 pNtk->pModel = ABC_ALLOC( int, Abc_NtkCiNum(pNtk) );
233 memset( pNtk->pModel, 0, sizeof(int) * Abc_NtkCiNum(pNtk) );
234 }
235 *ppNtk = pNtk;
236 return RetValue;
237}
238
250Abc_Ntk_t * Abc_NtkMiterFraig( Abc_Ntk_t * pNtk, int nBTLimit, ABC_INT64_T nInspLimit, int * pRetValue, int * pNumFails, ABC_INT64_T * pNumConfs, ABC_INT64_T * pNumInspects )
251{
252 Abc_Ntk_t * pNtkNew;
253 Fraig_Params_t Params, * pParams = &Params;
254 Fraig_Man_t * pMan;
255 int nWords1, nWords2, nWordsMin, RetValue;
256 int * pModel;
257
258 // to determine the number of simulation patterns
259 // use the following strategy
260 // at least 64 words (32 words random and 32 words dynamic)
261 // no more than 256M for one circuit (128M + 128M)
262 nWords1 = 32;
263 nWords2 = (1<<27) / (Abc_NtkNodeNum(pNtk) + Abc_NtkCiNum(pNtk));
264 nWordsMin = Abc_MinInt( nWords1, nWords2 );
265
266 // set the FRAIGing parameters
267 Fraig_ParamsSetDefault( pParams );
268 pParams->nPatsRand = nWordsMin * 32; // the number of words of random simulation info
269 pParams->nPatsDyna = nWordsMin * 32; // the number of words of dynamic simulation info
270 pParams->nBTLimit = nBTLimit; // the max number of backtracks
271 pParams->nSeconds = -1; // the runtime limit
272 pParams->fTryProve = 0; // do not try to prove the final miter
273 pParams->fDoSparse = 1; // try proving sparse functions
274 pParams->fVerbose = 0;
275 pParams->nInspLimit = nInspLimit;
276
277 // transform the target into a fraig
278 pMan = (Fraig_Man_t *)Abc_NtkToFraig( pNtk, pParams, 0, 0 );
279 Fraig_ManProveMiter( pMan );
280 RetValue = Fraig_ManCheckMiter( pMan );
281
282 // create the network
283 pNtkNew = Abc_NtkFromFraig( pMan, pNtk );
284
285 // save model
286 if ( RetValue == 0 )
287 {
288 pModel = Fraig_ManReadModel( pMan );
289 ABC_FREE( pNtkNew->pModel );
290 pNtkNew->pModel = ABC_ALLOC( int, Abc_NtkCiNum(pNtkNew) );
291 memcpy( pNtkNew->pModel, pModel, sizeof(int) * Abc_NtkCiNum(pNtkNew) );
292 }
293
294 // save the return values
295 *pRetValue = RetValue;
296 *pNumFails = Fraig_ManReadSatFails( pMan );
297 *pNumConfs = Fraig_ManReadConflicts( pMan );
298 *pNumInspects = Fraig_ManReadInspects( pMan );
299
300 // delete the fraig manager
301 Fraig_ManFree( pMan );
302 return pNtkNew;
303}
304
316void Abc_NtkMiterPrint( Abc_Ntk_t * pNtk, char * pString, abctime clk, int fVerbose )
317{
318 if ( !fVerbose )
319 return;
320 printf( "Nodes = %7d. Levels = %4d. ", Abc_NtkNodeNum(pNtk),
321 Abc_NtkIsStrash(pNtk)? Abc_AigLevel(pNtk) : Abc_NtkLevel(pNtk) );
322 ABC_PRT( pString, Abc_Clock() - clk );
323}
324
325
338{
339 Abc_Ntk_t * pNtkTemp;
340 Abc_NtkRewrite( pNtk, 0, 0, 0, 0, 0 );
341 pNtk = Abc_NtkBalance( pNtkTemp = pNtk, 0, 0, 0 ); Abc_NtkDelete( pNtkTemp );
342 Abc_NtkRewrite( pNtk, 0, 0, 0, 0, 0 );
343 Abc_NtkRefactor( pNtk, 10, 1, 16, 0, 0, 0, 0 );
344 return pNtk;
345}
346
347
351
352
354
Abc_Ntk_t * Abc_NtkMiterRwsat(Abc_Ntk_t *pNtk)
Definition abcProve.c:337
Abc_Ntk_t * Abc_NtkFromFraig(Fraig_Man_t *pMan, Abc_Ntk_t *pNtk)
DECLARATIONS ///.
Definition abcFraig.c:279
ABC_NAMESPACE_IMPL_START int Abc_NtkRefactor(Abc_Ntk_t *pNtk, int nNodeSizeMax, int nMinSaved, int nConeSizeMax, int fUpdateLevel, int fUseZeros, int fUseDcs, int fVerbose)
DECLARATIONS ///.
int Abc_NtkMiterProve(Abc_Ntk_t **ppNtk, void *pPars)
FUNCTION DEFINITIONS ///.
Definition abcProve.c:62
ABC_DLL Abc_Ntk_t * Abc_NtkCollapse(Abc_Ntk_t *pNtk, int fBddSizeMax, int fDualRail, int fReorder, int fReverse, int fDumpOrder, int fVerbose)
DECLARATIONS ///.
struct Abc_Ntk_t_ Abc_Ntk_t
Definition abc.h:115
ABC_DLL int Abc_NtkMiterSat(Abc_Ntk_t *pNtk, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, int fVerbose, ABC_INT64_T *pNumConfs, ABC_INT64_T *pNumInspects)
FUNCTION DEFINITIONS ///.
Definition abcSat.c:58
ABC_DLL int Abc_NtkRewrite(Abc_Ntk_t *pNtk, int fUpdateLevel, int fUseZeros, int fVerbose, int fVeryVerbose, int fPlaceEnable)
FUNCTION DEFINITIONS ///.
Definition abcRewrite.c:61
ABC_DLL int Abc_NtkLevel(Abc_Ntk_t *pNtk)
Definition abcDfs.c:1449
ABC_DLL int Abc_AigLevel(Abc_Ntk_t *pNtk)
Definition abcAig.c:292
ABC_DLL void Abc_NtkDelete(Abc_Ntk_t *pNtk)
Definition abcNtk.c:1421
ABC_DLL Abc_Ntk_t * Abc_NtkBalance(Abc_Ntk_t *pNtk, int fDuplicate, int fSelective, int fUpdateLevel)
FUNCTION DEFINITIONS ///.
Definition abcBalance.c:53
ABC_DLL void * Abc_NtkToFraig(Abc_Ntk_t *pNtk, void *pParams, int fAllNodes, int fExdc)
Definition abcFraig.c:103
ABC_DLL int Abc_NtkMiterIsConstant(Abc_Ntk_t *pMiter)
Definition abcMiter.c:682
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_PRT(a, t)
Definition abc_global.h:255
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int Fraig_ManReadInspects(Fraig_Man_t *p)
Definition fraigApi.c:75
void Fraig_ManProveMiter(Fraig_Man_t *p)
Definition fraigSat.c:85
int Fraig_ManReadSatFails(Fraig_Man_t *p)
Definition fraigApi.c:71
void Fraig_ManFree(Fraig_Man_t *pMan)
Definition fraigMan.c:262
int Fraig_ManCheckMiter(Fraig_Man_t *p)
Definition fraigSat.c:130
void Fraig_ParamsSetDefault(Fraig_Params_t *pParams)
Definition fraigMan.c:122
int Fraig_ManReadConflicts(Fraig_Man_t *p)
Definition fraigApi.c:73
int * Fraig_ManReadModel(Fraig_Man_t *p)
Definition fraigApi.c:63
typedefABC_NAMESPACE_HEADER_START struct Fraig_ManStruct_t_ Fraig_Man_t
INCLUDES ///.
Definition fraig.h:40
struct Fraig_ParamsStruct_t_ Fraig_Params_t
Definition fraig.h:44
struct Prove_ParamsStruct_t_ Prove_Params_t
Definition ivyFraig.c:108
void * pManFunc
Definition abc.h:191
int * pModel
Definition abc.h:198
ABC_INT64_T nInspLimit
Definition fraig.h:64
ABC_INT64_T nTotalBacktracksMade
Definition ivyFraig.c:136
ABC_INT64_T nTotalInspectsMade
Definition ivyFraig.c:137
ABC_INT64_T nTotalBacktrackLimit
Definition ivyFraig.c:133
ABC_INT64_T nTotalInspectLimit
Definition ivyFraig.c:134
#define assert(ex)
Definition util_old.h:213
char * memcpy()
char * memset()