ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
fraSec.c
Go to the documentation of this file.
1
20
21#include "fra.h"
22#include "aig/ioa/ioa.h"
23#include "aig/gia/giaAig.h"
24#include "proof/int/int.h"
25#include "proof/ssw/ssw.h"
26#include "aig/saig/saig.h"
27#include "bdd/bbr/bbr.h"
28#include "proof/pdr/pdr.h"
29
31
32
36
40
53{
54 memset( p, 0, sizeof(Fra_Sec_t) );
55 p->fTryComb = 1; // try CEC call as a preprocessing step
56 p->fTryBmc = 1; // try BMC call as a preprocessing step
57 p->nFramesMax = 4; // the max number of frames used for induction
58 p->nBTLimit = 1000; // conflict limit at a node during induction
59 p->nBTLimitGlobal = 5000000; // global conflict limit during induction
60 p->nBTLimitInter = 10000; // conflict limit during interpolation
61 p->nBddVarsMax = 150; // the limit on the number of registers in BDD reachability
62 p->nBddMax = 50000; // the limit on the number of BDD nodes
63 p->nBddIterMax = 1000000; // the limit on the number of BDD iterations
64 p->fPhaseAbstract = 0; // enables phase abstraction
65 p->fRetimeFirst = 1; // enables most-forward retiming at the beginning
66 p->fRetimeRegs = 1; // enables min-register retiming at the beginning
67 p->fFraiging = 1; // enables fraiging at the beginning
68 p->fInduction = 1; // enables the use of induction (signal correspondence)
69 p->fInterpolation = 1; // enables interpolation
70 p->fInterSeparate = 0; // enables interpolation for each outputs separately
71 p->fReachability = 1; // enables BDD based reachability
72 p->fReorderImage = 1; // enables variable reordering during image computation
73 p->fStopOnFirstFail = 1; // enables stopping after first output of a miter has failed to prove
74 p->fUseNewProver = 0; // enables new prover
75 p->fUsePdr = 1; // enables PDR
76 p->nPdrTimeout = 60; // enabled PDR timeout
77 p->fSilent = 0; // disables all output
78 p->fVerbose = 0; // enables verbose reporting of statistics
79 p->fVeryVerbose = 0; // enables very verbose reporting
80 p->TimeLimit = 0; // enables the timeout
81 // internal parameters
82 p->fReportSolution = 0; // enables specialized format for reporting solution
83}
84
96Aig_Man_t * Fra_FraigEquivence2( Aig_Man_t * pAig, int nConfs, int fVerbose )
97{
98 extern Gia_Man_t * Cec4_ManSimulateTest3( Gia_Man_t * p, int nBTLimit, int fVerbose );
99 Gia_Man_t * pGia = Gia_ManFromAig( pAig );
100 Gia_Man_t * pGiaNew = Cec4_ManSimulateTest3( pGia, nConfs, 0 );
101 Aig_Man_t * pAigNew = Gia_ManToAig( pGiaNew, 0 );
102 Gia_ManStop( pGiaNew );
103 Gia_ManStop( pGia );
104 return pAigNew;
105}
106
118int Fra_FraigSec( Aig_Man_t * p, Fra_Sec_t * pParSec, Aig_Man_t ** ppResult )
119{
120 Ssw_Pars_t Pars2, * pPars2 = &Pars2;
121 Fra_Ssw_t Pars, * pPars = &Pars;
122 Fra_Sml_t * pSml;
123 Aig_Man_t * pNew, * pTemp;
124 int nFrames, RetValue, nIter;
125 abctime clk, clkTotal = Abc_Clock();
126 int TimeOut = 0;
127 int fLatchCorr = 0;
128 float TimeLeft = 0.0;
129 pParSec->nSMnumber = -1;
130
131 // try the miter before solving
132 pNew = Aig_ManDupSimple( p );
133 RetValue = Fra_FraigMiterStatus( pNew );
134 if ( RetValue >= 0 )
135 goto finish;
136
137 // prepare parameters
138 memset( pPars, 0, sizeof(Fra_Ssw_t) );
139 pPars->fLatchCorr = fLatchCorr;
140 pPars->fVerbose = pParSec->fVeryVerbose;
141 if ( pParSec->fVerbose )
142 {
143 printf( "Original miter: Latches = %5d. Nodes = %6d.\n",
144 Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) );
145 }
146//Aig_ManDumpBlif( pNew, "after.blif", NULL, NULL );
147
148 // perform sequential cleanup
149clk = Abc_Clock();
150 if ( pNew->nRegs )
151 pNew = Aig_ManReduceLaches( pNew, 0 );
152 if ( pNew->nRegs )
153 pNew = Aig_ManConstReduce( pNew, 0, -1, -1, 0, 0 );
154 if ( pParSec->fVerbose )
155 {
156 printf( "Sequential cleanup: Latches = %5d. Nodes = %6d. ",
157 Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) );
158ABC_PRT( "Time", Abc_Clock() - clk );
159 }
160 RetValue = Fra_FraigMiterStatus( pNew );
161 if ( RetValue >= 0 )
162 goto finish;
163
164 // perform phase abstraction
165clk = Abc_Clock();
166 if ( pParSec->fPhaseAbstract )
167 {
168 extern Aig_Man_t * Saig_ManPhaseAbstractAuto( Aig_Man_t * p, int fVerbose );
169 pNew->nTruePis = Aig_ManCiNum(pNew) - Aig_ManRegNum(pNew);
170 pNew->nTruePos = Aig_ManCoNum(pNew) - Aig_ManRegNum(pNew);
171 pNew = Saig_ManPhaseAbstractAuto( pTemp = pNew, 0 );
172 Aig_ManStop( pTemp );
173 if ( pParSec->fVerbose )
174 {
175 printf( "Phase abstraction: Latches = %5d. Nodes = %6d. ",
176 Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) );
177ABC_PRT( "Time", Abc_Clock() - clk );
178 }
179 }
180
181 // perform forward retiming
182 if ( pParSec->fRetimeFirst && pNew->nRegs )
183 {
184clk = Abc_Clock();
185// pNew = Rtm_ManRetime( pTemp = pNew, 1, 1000, 0 );
186 pNew = Saig_ManRetimeForward( pTemp = pNew, 100, 0 );
187 Aig_ManStop( pTemp );
188 if ( pParSec->fVerbose )
189 {
190 printf( "Forward retiming: Latches = %5d. Nodes = %6d. ",
191 Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) );
192ABC_PRT( "Time", Abc_Clock() - clk );
193 }
194 }
195
196 // run latch correspondence
197clk = Abc_Clock();
198 if ( pNew->nRegs )
199 {
200 pNew = Aig_ManDupOrdered( pTemp = pNew );
201// pNew = Aig_ManDupDfs( pTemp = pNew );
202 Aig_ManStop( pTemp );
203/*
204 if ( RetValue == -1 && pParSec->TimeLimit )
205 {
206 TimeLeft = (float)pParSec->TimeLimit - ((float)(Abc_Clock()-clkTotal)/(float)(CLOCKS_PER_SEC));
207 TimeLeft = Abc_MaxInt( TimeLeft, 0.0 );
208 if ( TimeLeft == 0.0 )
209 {
210 if ( !pParSec->fSilent )
211 printf( "Runtime limit exceeded.\n" );
212 RetValue = -1;
213 TimeOut = 1;
214 goto finish;
215 }
216 }
217*/
218
219// pNew = Fra_FraigLatchCorrespondence( pTemp = pNew, 0, 1000, 1, pParSec->fVeryVerbose, &nIter, TimeLeft );
220//Aig_ManDumpBlif( pNew, "ex.blif", NULL, NULL );
222 pNew = Ssw_LatchCorrespondence( pTemp = pNew, pPars2 );
223 nIter = pPars2->nIters;
224
225 // prepare parameters for scorr
226 Ssw_ManSetDefaultParams( pPars2 );
227
228 if ( pTemp->pSeqModel )
229 {
230 if ( !Saig_ManVerifyCex( pTemp, pTemp->pSeqModel ) )
231 printf( "Fra_FraigSec(): Counter-example verification has FAILED.\n" );
232 if ( Saig_ManPiNum(p) != Saig_ManPiNum(pTemp) )
233 printf( "The counter-example is invalid because of phase abstraction.\n" );
234 else
235 {
236 ABC_FREE( p->pSeqModel );
237 p->pSeqModel = Abc_CexDup( pTemp->pSeqModel, Aig_ManRegNum(p) );
238 ABC_FREE( pTemp->pSeqModel );
239 }
240 }
241 if ( pNew == NULL )
242 {
243 if ( p->pSeqModel )
244 {
245 RetValue = 0;
246 if ( !pParSec->fSilent )
247 {
248 printf( "Networks are NOT EQUIVALENT after simulation. " );
249ABC_PRT( "Time", Abc_Clock() - clkTotal );
250 }
251 if ( pParSec->fReportSolution && !pParSec->fRecursive )
252 {
253 printf( "SOLUTION: FAIL " );
254ABC_PRT( "Time", Abc_Clock() - clkTotal );
255 }
256 Aig_ManStop( pTemp );
257 return RetValue;
258 }
259 pNew = pTemp;
260 RetValue = -1;
261 TimeOut = 1;
262 goto finish;
263 }
264 Aig_ManStop( pTemp );
265
266 if ( pParSec->fVerbose )
267 {
268 printf( "Latch-corr (I=%3d): Latches = %5d. Nodes = %6d. ",
269 nIter, Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) );
270ABC_PRT( "Time", Abc_Clock() - clk );
271 }
272 }
273/*
274 if ( RetValue == -1 && pParSec->TimeLimit )
275 {
276 TimeLeft = (float)pParSec->TimeLimit - ((float)(Abc_Clock()-clkTotal)/(float)(CLOCKS_PER_SEC));
277 TimeLeft = Abc_MaxInt( TimeLeft, 0.0 );
278 if ( TimeLeft == 0.0 )
279 {
280 if ( !pParSec->fSilent )
281 printf( "Runtime limit exceeded.\n" );
282 RetValue = -1;
283 TimeOut = 1;
284 goto finish;
285 }
286 }
287*/
288 // perform fraiging
289 if ( pParSec->fFraiging )
290 {
291clk = Abc_Clock();
292 pNew = Fra_FraigEquivence( pTemp = pNew, 100, 0 );
293 //pNew = Fra_FraigEquivence2( pTemp = pNew, 100, 0 );
294 Aig_ManStop( pTemp );
295 if ( pParSec->fVerbose )
296 {
297 printf( "Fraiging: Latches = %5d. Nodes = %6d. ",
298 Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) );
299ABC_PRT( "Time", Abc_Clock() - clk );
300 }
301 }
302
303 if ( pNew->nRegs == 0 )
304 RetValue = Fra_FraigCec( &pNew, 100000, 0 );
305
306 RetValue = Fra_FraigMiterStatus( pNew );
307 if ( RetValue >= 0 )
308 goto finish;
309/*
310 if ( RetValue == -1 && pParSec->TimeLimit )
311 {
312 TimeLeft = (float)pParSec->TimeLimit - ((float)(Abc_Clock()-clkTotal)/(float)(CLOCKS_PER_SEC));
313 TimeLeft = Abc_MaxInt( TimeLeft, 0.0 );
314 if ( TimeLeft == 0.0 )
315 {
316 if ( !pParSec->fSilent )
317 printf( "Runtime limit exceeded.\n" );
318 RetValue = -1;
319 TimeOut = 1;
320 goto finish;
321 }
322 }
323*/
324 // perform min-area retiming
325 if ( pParSec->fRetimeRegs && pNew->nRegs )
326 {
327// extern Aig_Man_t * Saig_ManRetimeMinArea( Aig_Man_t * p, int nMaxIters, int fForwardOnly, int fBackwardOnly, int fInitial, int fVerbose );
328clk = Abc_Clock();
329 pNew->nTruePis = Aig_ManCiNum(pNew) - Aig_ManRegNum(pNew);
330 pNew->nTruePos = Aig_ManCoNum(pNew) - Aig_ManRegNum(pNew);
331// pNew = Rtm_ManRetime( pTemp = pNew, 1, 1000, 0 );
332 pNew = Saig_ManRetimeMinArea( pTemp = pNew, 1000, 0, 0, 1, 0 );
333 Aig_ManStop( pTemp );
334 pNew = Aig_ManDupOrdered( pTemp = pNew );
335 Aig_ManStop( pTemp );
336 if ( pParSec->fVerbose )
337 {
338 printf( "Min-reg retiming: Latches = %5d. Nodes = %6d. ",
339 Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) );
340ABC_PRT( "Time", Abc_Clock() - clk );
341 }
342 }
343
344 // perform seq sweeping while increasing the number of frames
345 RetValue = Fra_FraigMiterStatus( pNew );
346 if ( RetValue == -1 && pParSec->fInduction )
347 for ( nFrames = 1; nFrames <= pParSec->nFramesMax; nFrames *= 2 )
348 {
349/*
350 if ( RetValue == -1 && pParSec->TimeLimit )
351 {
352 TimeLeft = (float)pParSec->TimeLimit - ((float)(Abc_Clock()-clkTotal)/(float)(CLOCKS_PER_SEC));
353 TimeLeft = Abc_MaxInt( TimeLeft, 0.0 );
354 if ( TimeLeft == 0.0 )
355 {
356 if ( !pParSec->fSilent )
357 printf( "Runtime limit exceeded.\n" );
358 RetValue = -1;
359 TimeOut = 1;
360 goto finish;
361 }
362 }
363*/
364
365clk = Abc_Clock();
366 pPars->nFramesK = nFrames;
367 pPars->TimeLimit = TimeLeft;
368 pPars->fSilent = pParSec->fSilent;
369// pNew = Fra_FraigInduction( pTemp = pNew, pPars );
370
371 pPars2->nFramesK = nFrames;
372 pPars2->nBTLimit = pParSec->nBTLimit;
373 pPars2->nBTLimitGlobal = pParSec->nBTLimitGlobal;
374// pPars2->nBTLimit = 1000 * nFrames;
375
376 if ( RetValue == -1 && pPars2->nConflicts > pPars2->nBTLimitGlobal )
377 {
378 if ( !pParSec->fSilent )
379 printf( "Global conflict limit (%d) exceeded.\n", pPars2->nBTLimitGlobal );
380 RetValue = -1;
381 TimeOut = 1;
382 goto finish;
383 }
384
385 Aig_ManSetRegNum( pNew, pNew->nRegs );
386// pNew = Ssw_SignalCorrespondence( pTemp = pNew, pPars2 );
387 if ( Aig_ManRegNum(pNew) > 0 )
388 pNew = Ssw_SignalCorrespondence( pTemp = pNew, pPars2 );
389 else
390 pNew = Aig_ManDupSimpleDfs( pTemp = pNew );
391
392 if ( pNew == NULL )
393 {
394 pNew = pTemp;
395 RetValue = -1;
396 TimeOut = 1;
397 goto finish;
398 }
399
400// printf( "Total conflicts = %d.\n", pPars2->nConflicts );
401
402 Aig_ManStop( pTemp );
403 RetValue = Fra_FraigMiterStatus( pNew );
404 if ( pParSec->fVerbose )
405 {
406 printf( "K-step (K=%2d,I=%3d): Latches = %5d. Nodes = %6d. ",
407 nFrames, pPars2->nIters, Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) );
408ABC_PRT( "Time", Abc_Clock() - clk );
409 }
410 if ( RetValue != -1 )
411 break;
412
413 // perform retiming
414// if ( pParSec->fRetimeFirst && pNew->nRegs )
415 if ( pNew->nRegs )
416 {
417// extern Aig_Man_t * Saig_ManRetimeMinArea( Aig_Man_t * p, int nMaxIters, int fForwardOnly, int fBackwardOnly, int fInitial, int fVerbose );
418clk = Abc_Clock();
419 pNew->nTruePis = Aig_ManCiNum(pNew) - Aig_ManRegNum(pNew);
420 pNew->nTruePos = Aig_ManCoNum(pNew) - Aig_ManRegNum(pNew);
421// pNew = Rtm_ManRetime( pTemp = pNew, 1, 1000, 0 );
422 pNew = Saig_ManRetimeMinArea( pTemp = pNew, 1000, 0, 0, 1, 0 );
423 Aig_ManStop( pTemp );
424 pNew = Aig_ManDupOrdered( pTemp = pNew );
425 Aig_ManStop( pTemp );
426 if ( pParSec->fVerbose )
427 {
428 printf( "Min-reg retiming: Latches = %5d. Nodes = %6d. ",
429 Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) );
430ABC_PRT( "Time", Abc_Clock() - clk );
431 }
432 }
433
434 if ( pNew->nRegs )
435 pNew = Aig_ManConstReduce( pNew, 0, -1, -1, 0, 0 );
436
437 // perform rewriting
438clk = Abc_Clock();
439 pNew = Aig_ManDupOrdered( pTemp = pNew );
440 Aig_ManStop( pTemp );
441// pNew = Dar_ManRewriteDefault( pTemp = pNew );
442 pNew = Dar_ManCompress2( pTemp = pNew, 1, 0, 1, 0, 0 );
443 Aig_ManStop( pTemp );
444 if ( pParSec->fVerbose )
445 {
446 printf( "Rewriting: Latches = %5d. Nodes = %6d. ",
447 Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) );
448ABC_PRT( "Time", Abc_Clock() - clk );
449 }
450
451 // perform sequential simulation
452 if ( pNew->nRegs )
453 {
454clk = Abc_Clock();
455 pSml = Fra_SmlSimulateSeq( pNew, 0, 128 * nFrames, 1 + 16/(1+Aig_ManNodeNum(pNew)/1000), 1 );
456 if ( pParSec->fVerbose )
457 {
458 printf( "Seq simulation : Latches = %5d. Nodes = %6d. ",
459 Aig_ManRegNum(pNew), Aig_ManNodeNum(pNew) );
460ABC_PRT( "Time", Abc_Clock() - clk );
461 }
462 if ( pSml->fNonConstOut )
463 {
464 pNew->pSeqModel = Fra_SmlGetCounterExample( pSml );
465 // transfer to the original manager
466 if ( Saig_ManPiNum(p) != Saig_ManPiNum(pNew) )
467 printf( "The counter-example is invalid because of phase abstraction.\n" );
468 else
469 {
470 ABC_FREE( p->pSeqModel );
471 p->pSeqModel = Abc_CexDup( pNew->pSeqModel, Aig_ManRegNum(p) );
472 ABC_FREE( pNew->pSeqModel );
473 }
474
475 Fra_SmlStop( pSml );
476 Aig_ManStop( pNew );
477 RetValue = 0;
478 if ( !pParSec->fSilent )
479 {
480 printf( "Networks are NOT EQUIVALENT after simulation. " );
481ABC_PRT( "Time", Abc_Clock() - clkTotal );
482 }
483 if ( pParSec->fReportSolution && !pParSec->fRecursive )
484 {
485 printf( "SOLUTION: FAIL " );
486ABC_PRT( "Time", Abc_Clock() - clkTotal );
487 }
488 return RetValue;
489 }
490 Fra_SmlStop( pSml );
491 }
492 }
493
494 // get the miter status
495 RetValue = Fra_FraigMiterStatus( pNew );
496
497 // try interplation
498clk = Abc_Clock();
499 Aig_ManSetRegNum( pNew, Aig_ManRegNum(pNew) );
500 if ( pParSec->fInterpolation && RetValue == -1 && Aig_ManRegNum(pNew) > 0 )
501 {
502 Inter_ManParams_t Pars, * pPars = &Pars;
503 int Depth;
504 ABC_FREE( pNew->pSeqModel );
506// pPars->nBTLimit = 100;
507 pPars->nBTLimit = pParSec->nBTLimitInter;
508 pPars->fVerbose = pParSec->fVeryVerbose;
509 if ( Saig_ManPoNum(pNew) == 1 )
510 {
511 RetValue = Inter_ManPerformInterpolation( pNew, pPars, &Depth );
512 }
513 else if ( pParSec->fInterSeparate )
514 {
515 Abc_Cex_t * pCex = NULL;
516 Aig_Man_t * pTemp, * pAux;
517 Aig_Obj_t * pObjPo;
518 int i, Counter = 0;
519 Saig_ManForEachPo( pNew, pObjPo, i )
520 {
521 if ( Aig_ObjFanin0(pObjPo) == Aig_ManConst1(pNew) )
522 continue;
523 if ( pPars->fVerbose )
524 printf( "Solving output %2d (out of %2d):\n", i, Saig_ManPoNum(pNew) );
525 pTemp = Aig_ManDupOneOutput( pNew, i, 1 );
526 pTemp = Aig_ManScl( pAux = pTemp, 1, 1, 0, -1, -1, 0, 0 );
527 Aig_ManStop( pAux );
528 if ( Saig_ManRegNum(pTemp) > 0 )
529 {
530 RetValue = Inter_ManPerformInterpolation( pTemp, pPars, &Depth );
531 if ( pTemp->pSeqModel )
532 {
533 pCex = p->pSeqModel = Abc_CexDup( pTemp->pSeqModel, Aig_ManRegNum(p) );
534 pCex->iPo = i;
535 Aig_ManStop( pTemp );
536 break;
537 }
538 // if solved, remove the output
539 if ( RetValue == 1 )
540 {
541 Aig_ObjPatchFanin0( pNew, pObjPo, Aig_ManConst0(pNew) );
542 // printf( "Output %3d : Solved ", i );
543 }
544 else
545 {
546 Counter++;
547 // printf( "Output %3d : Undec ", i );
548 }
549 }
550 else
551 Counter++;
552// Aig_ManPrintStats( pTemp );
553 Aig_ManStop( pTemp );
554 printf( "Solving output %3d (out of %3d) using interpolation.\r", i, Saig_ManPoNum(pNew) );
555 }
556 Aig_ManCleanup( pNew );
557 if ( pCex == NULL )
558 {
559 printf( "Interpolation left %d (out of %d) outputs unsolved \n", Counter, Saig_ManPoNum(pNew) );
560 if ( Counter )
561 RetValue = -1;
562 }
563 pNew = Aig_ManDupUnsolvedOutputs( pTemp = pNew, 1 );
564 Aig_ManStop( pTemp );
565 pNew = Aig_ManScl( pTemp = pNew, 1, 1, 0, -1, -1, 0, 0 );
566 Aig_ManStop( pTemp );
567 }
568 else
569 {
570 Aig_Man_t * pNewOrpos = Saig_ManDupOrpos( pNew );
571 RetValue = Inter_ManPerformInterpolation( pNewOrpos, pPars, &Depth );
572 if ( pNewOrpos->pSeqModel )
573 {
574 Abc_Cex_t * pCex;
575 pCex = pNew->pSeqModel = pNewOrpos->pSeqModel; pNewOrpos->pSeqModel = NULL;
576 pCex->iPo = Saig_ManFindFailedPoCex( pNew, pNew->pSeqModel );
577 }
578 Aig_ManStop( pNewOrpos );
579 }
580
581 if ( pParSec->fVerbose )
582 {
583 if ( RetValue == 1 )
584 printf( "Property proved using interpolation. " );
585 else if ( RetValue == 0 )
586 printf( "Property DISPROVED in frame %d using interpolation. ", Depth );
587 else if ( RetValue == -1 )
588 printf( "Property UNDECIDED after interpolation. " );
589 else
590 assert( 0 );
591ABC_PRT( "Time", Abc_Clock() - clk );
592 }
593 }
594
595 // try reachability analysis
596 if ( pParSec->fReachability && RetValue == -1 && Aig_ManRegNum(pNew) > 0 && Aig_ManRegNum(pNew) < pParSec->nBddVarsMax )
597 {
598 Saig_ParBbr_t Pars, * pPars = &Pars;
600 pPars->TimeLimit = 0;
601 pPars->nBddMax = pParSec->nBddMax;
602 pPars->nIterMax = pParSec->nBddIterMax;
603 pPars->fPartition = 1;
604 pPars->fReorder = 1;
605 pPars->fReorderImage = 1;
606 pPars->fVerbose = 0;
607 pPars->fSilent = pParSec->fSilent;
608 pNew->nTruePis = Aig_ManCiNum(pNew) - Aig_ManRegNum(pNew);
609 pNew->nTruePos = Aig_ManCoNum(pNew) - Aig_ManRegNum(pNew);
610 RetValue = Aig_ManVerifyUsingBdds( pNew, pPars );
611 }
612
613 // try PDR
614 if ( pParSec->fUsePdr && RetValue == -1 && Aig_ManRegNum(pNew) > 0 )
615 {
616 Pdr_Par_t Pars, * pPars = &Pars;
618 pPars->nTimeOut = pParSec->nPdrTimeout;
619 pPars->fVerbose = pParSec->fVerbose;
620 if ( pParSec->fVerbose )
621 printf( "Running property directed reachability...\n" );
622 RetValue = Pdr_ManSolve( pNew, pPars );
623 if ( pNew->pSeqModel )
624 pNew->pSeqModel->iPo = Saig_ManFindFailedPoCex( pNew, pNew->pSeqModel );
625 }
626
627finish:
628 // report the miter
629 if ( RetValue == 1 )
630 {
631 if ( !pParSec->fSilent )
632 {
633 printf( "Networks are equivalent. " );
634ABC_PRT( "Time", Abc_Clock() - clkTotal );
635 }
636 if ( pParSec->fReportSolution && !pParSec->fRecursive )
637 {
638 printf( "SOLUTION: PASS " );
639ABC_PRT( "Time", Abc_Clock() - clkTotal );
640 }
641 }
642 else if ( RetValue == 0 )
643 {
644 if ( pNew->pSeqModel == NULL )
645 {
646 int i;
647 // if the CEX is not derives, it is because tricial CEX should be assumed
648 pNew->pSeqModel = Abc_CexAlloc( Aig_ManRegNum(pNew), pNew->nTruePis, 1 );
649 // if the CEX does not work, we need to change PIs to 1 because
650 // the only way it can happen is when a PO is equal to a PI...
651 if ( Saig_ManFindFailedPoCex( pNew, pNew->pSeqModel ) == -1 )
652 for ( i = 0; i < pNew->nTruePis; i++ )
653 Abc_InfoSetBit( pNew->pSeqModel->pData, i );
654 }
655 if ( !pParSec->fSilent )
656 {
657 printf( "Networks are NOT EQUIVALENT. " );
658ABC_PRT( "Time", Abc_Clock() - clkTotal );
659 }
660 if ( pParSec->fReportSolution && !pParSec->fRecursive )
661 {
662 printf( "SOLUTION: FAIL " );
663ABC_PRT( "Time", Abc_Clock() - clkTotal );
664 }
665 }
666 else
667 {
669 // save intermediate result
670 extern void Abc_FrameSetSave1( void * pAig );
673 if ( !pParSec->fSilent )
674 {
675 printf( "Networks are UNDECIDED. " );
676ABC_PRT( "Time", Abc_Clock() - clkTotal );
677 }
678 if ( pParSec->fReportSolution && !pParSec->fRecursive )
679 {
680 printf( "SOLUTION: UNDECIDED " );
681ABC_PRT( "Time", Abc_Clock() - clkTotal );
682 }
683 if ( !TimeOut && !pParSec->fSilent )
684 {
685 static int Counter = 1;
686 char pFileName[1000];
687 pParSec->nSMnumber = Counter;
688 sprintf( pFileName, "sm%02d.aig", Counter++ );
689 Ioa_WriteAiger( pNew, pFileName, 0, 0 );
690 printf( "The unsolved reduced miter is written into file \"%s\".\n", pFileName );
691 }
692 }
693 if ( pNew->pSeqModel )
694 {
695 if ( Saig_ManPiNum(p) != Saig_ManPiNum(pNew) )
696 printf( "The counter-example is invalid because of phase abstraction.\n" );
697 else
698 {
699 ABC_FREE( p->pSeqModel );
700 p->pSeqModel = Abc_CexDup( pNew->pSeqModel, Aig_ManRegNum(p) );
701 ABC_FREE( pNew->pSeqModel );
702 }
703 }
704 if ( ppResult != NULL )
705 *ppResult = Aig_ManDupSimpleDfs( pNew );
706 if ( pNew )
707 Aig_ManStop( pNew );
708 return RetValue;
709}
710
714
715
717
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_PRT(a, t)
Definition abc_global.h:255
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Aig_Man_t * Aig_ManDupOrdered(Aig_Man_t *p)
Definition aigDup.c:277
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
Definition aigMan.c:438
Aig_Man_t * Aig_ManDupSimple(Aig_Man_t *p)
DECLARATIONS ///.
Definition aigDup.c:46
Aig_Man_t * Aig_ManDupSimpleDfs(Aig_Man_t *p)
Definition aigDup.c:184
void Aig_ManStop(Aig_Man_t *p)
Definition aigMan.c:187
Aig_Man_t * Aig_ManReduceLaches(Aig_Man_t *p, int fVerbose)
Definition aigScl.c:455
Aig_Man_t * Aig_ManConstReduce(Aig_Man_t *p, int fUseMvSweep, int nFramesSymb, int nFramesSatur, int fVerbose, int fVeryVerbose)
Definition aigTsim.c:498
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
int Aig_ManCleanup(Aig_Man_t *p)
Definition aigMan.c:265
void Aig_ObjPatchFanin0(Aig_Man_t *p, Aig_Obj_t *pObj, Aig_Obj_t *pFaninNew)
Definition aigObj.c:282
Aig_Man_t * Aig_ManDupUnsolvedOutputs(Aig_Man_t *p, int fAddRegs)
Definition aigDup.c:1199
Aig_Man_t * Aig_ManDupOneOutput(Aig_Man_t *p, int iPoNum, int fAddRegs)
Definition aigDup.c:1152
Aig_Man_t * Aig_ManScl(Aig_Man_t *pAig, int fLatchConst, int fLatchEqual, int fUseMvSweep, int nFramesSymb, int nFramesSatur, int fVerbose, int fVeryVerbose)
Definition aigScl.c:650
Aig_Man_t * Dar_ManCompress2(Aig_Man_t *pAig, int fBalance, int fUpdateLevel, int fFanout, int fPower, int fVerbose)
Definition darScript.c:235
Cube * p
Definition exorList.c:222
Aig_Man_t * Fra_FraigEquivence2(Aig_Man_t *pAig, int nConfs, int fVerbose)
Definition fraSec.c:96
ABC_NAMESPACE_IMPL_START void Fra_SecSetDefaultParams(Fra_Sec_t *p)
DECLARATIONS ///.
Definition fraSec.c:52
int Fra_FraigSec(Aig_Man_t *p, Fra_Sec_t *pParSec, Aig_Man_t **ppResult)
Definition fraSec.c:118
Aig_Man_t * Fra_FraigEquivence(Aig_Man_t *pManAig, int nConfMax, int fProve)
Definition fraCore.c:468
void Fra_SmlStop(Fra_Sml_t *p)
Definition fraSim.c:839
int Fra_FraigCec(Aig_Man_t **ppAig, int nConfLimit, int fVerbose)
Definition fraCec.c:320
struct Fra_Sec_t_ Fra_Sec_t
Definition fra.h:55
struct Fra_Sml_t_ Fra_Sml_t
Definition fra.h:58
int Fra_FraigMiterStatus(Aig_Man_t *p)
DECLARATIONS ///.
Definition fraCore.c:62
struct Fra_Ssw_t_ Fra_Ssw_t
Definition fra.h:54
Fra_Sml_t * Fra_SmlSimulateSeq(Aig_Man_t *pAig, int nPref, int nFrames, int nWords, int fCheckMiter)
Definition fraSim.c:1027
Abc_Cex_t * Fra_SmlGetCounterExample(Fra_Sml_t *p)
Definition fraSim.c:1049
Gia_Man_t * Gia_ManFromAig(Aig_Man_t *p)
INCLUDES ///.
Definition giaAig.c:76
Aig_Man_t * Gia_ManToAig(Gia_Man_t *p, int fChoices)
Definition giaAig.c:318
void Gia_ManStop(Gia_Man_t *p)
Definition giaMan.c:82
struct Gia_Man_t_ Gia_Man_t
Definition gia.h:96
typedefABC_NAMESPACE_HEADER_START struct Inter_ManParams_t_ Inter_ManParams_t
INCLUDES ///.
Definition int.h:48
void Inter_ManSetDefaultParams(Inter_ManParams_t *p)
MACRO DEFINITIONS ///.
Definition intCore.c:46
int Inter_ManPerformInterpolation(Aig_Man_t *pAig, Inter_ManParams_t *pPars, int *piFrame)
Definition intCore.c:79
void Ioa_WriteAiger(Aig_Man_t *pMan, char *pFileName, int fWriteSymbols, int fCompact)
void Abc_FrameSetSave1(void *pAig)
Definition mainFrame.c:682
void Pdr_ManSetDefaultParams(Pdr_Par_t *pPars)
MACRO DEFINITIONS ///.
Definition pdrCore.c:50
typedefABC_NAMESPACE_HEADER_START struct Pdr_Par_t_ Pdr_Par_t
INCLUDES ///.
Definition pdr.h:40
int Pdr_ManSolve(Aig_Man_t *p, Pdr_Par_t *pPars)
Definition pdrCore.c:1765
void Bbr_ManSetDefaultParams(Saig_ParBbr_t *p)
Definition saigDup.c:593
int Aig_ManVerifyUsingBdds(Aig_Man_t *pInit, Saig_ParBbr_t *pPars)
Definition saigDup.c:592
Aig_Man_t * Saig_ManPhaseAbstractAuto(Aig_Man_t *p, int fVerbose)
Definition saigPhase.c:965
struct Saig_ParBbr_t_ Saig_ParBbr_t
Definition saig.h:53
Aig_Man_t * Saig_ManRetimeMinArea(Aig_Man_t *p, int nMaxIters, int fForwardOnly, int fBackwardOnly, int fInitial, int fVerbose)
Definition saigRetMin.c:623
#define Saig_ManForEachPo(p, pObj, i)
Definition saig.h:93
int Saig_ManFindFailedPoCex(Aig_Man_t *pAig, Abc_Cex_t *p)
Definition saigDup.c:436
Aig_Man_t * Saig_ManRetimeForward(Aig_Man_t *p, int nMaxIters, int fVerbose)
Definition saigRetFwd.c:213
Aig_Man_t * Saig_ManDupOrpos(Aig_Man_t *p)
DECLARATIONS ///.
Definition saigDup.c:45
int Saig_ManVerifyCex(Aig_Man_t *pAig, Abc_Cex_t *p)
Definition saigDup.c:281
void Ssw_ManSetDefaultParams(Ssw_Pars_t *p)
DECLARATIONS ///.
Definition sswCore.c:45
void Ssw_ManSetDefaultParamsLcorr(Ssw_Pars_t *p)
Definition sswCore.c:93
typedefABC_NAMESPACE_HEADER_START struct Ssw_Pars_t_ Ssw_Pars_t
INCLUDES ///.
Definition ssw.h:40
Aig_Man_t * Ssw_LatchCorrespondence(Aig_Man_t *pAig, Ssw_Pars_t *pPars)
Definition sswCore.c:545
Aig_Man_t * Ssw_SignalCorrespondence(Aig_Man_t *pAig, Ssw_Pars_t *pPars)
Definition sswCore.c:436
int nPdrTimeout
Definition fra.h:125
int fFraiging
Definition fra.h:129
int nBTLimit
Definition fra.h:119
int fVerbose
Definition fra.h:139
int nBddIterMax
Definition fra.h:124
int nBTLimitInter
Definition fra.h:121
int fRetimeRegs
Definition fra.h:128
int nBddMax
Definition fra.h:123
int fVeryVerbose
Definition fra.h:140
int fReportSolution
Definition fra.h:146
int fRetimeFirst
Definition fra.h:127
int fInduction
Definition fra.h:130
int fPhaseAbstract
Definition fra.h:126
int fInterpolation
Definition fra.h:131
int nSMnumber
Definition fra.h:143
int fInterSeparate
Definition fra.h:132
int nFramesMax
Definition fra.h:118
int fRecursive
Definition fra.h:145
int nBddVarsMax
Definition fra.h:122
int fReachability
Definition fra.h:133
int nBTLimitGlobal
Definition fra.h:120
int fUsePdr
Definition fra.h:137
int fSilent
Definition fra.h:138
int fNonConstOut
Definition fra.h:179
int fSilent
Definition fra.h:108
int fLatchCorr
Definition fra.h:104
float TimeLimit
Definition fra.h:110
int fVerbose
Definition fra.h:107
int nFramesK
Definition fra.h:97
int nBddMax
Definition saig.h:57
int fReorder
Definition saig.h:60
int fPartition
Definition saig.h:59
int fSilent
Definition saig.h:63
int fReorderImage
Definition saig.h:61
int TimeLimit
Definition saig.h:56
int fVerbose
Definition saig.h:62
int nIterMax
Definition saig.h:58
Abc_Cex_t * Abc_CexDup(Abc_Cex_t *p, int nRegsNew)
Definition utilCex.c:145
ABC_NAMESPACE_IMPL_START Abc_Cex_t * Abc_CexAlloc(int nRegs, int nRealPis, int nFrames)
DECLARATIONS ///.
Definition utilCex.c:51
typedefABC_NAMESPACE_HEADER_START struct Abc_Cex_t_ Abc_Cex_t
INCLUDES ///.
Definition utilCex.h:39
#define assert(ex)
Definition util_old.h:213
char * memset()
char * sprintf()
Gia_Man_t * Cec4_ManSimulateTest3(Gia_Man_t *p, int nBTLimit, int fVerbose)
Definition cecSatG2.c:2077