cecCore.c 19.2 KB
Newer Older
Alan Mishchenko committed
1 2 3 4 5 6
/**CFile****************************************************************

  FileName    [cecCore.c]

  SystemName  [ABC: Logic synthesis and verification system.]

Alan Mishchenko committed
7
  PackageName [Combinational equivalence checking.]
Alan Mishchenko committed
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

  Synopsis    [Core procedures.]

  Author      [Alan Mishchenko]
  
  Affiliation [UC Berkeley]

  Date        [Ver. 1.0. Started - June 20, 2005.]

  Revision    [$Id: cecCore.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]

***********************************************************************/

#include "cecInt.h"

23 24 25
ABC_NAMESPACE_IMPL_START


Alan Mishchenko committed
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
////////////////////////////////////////////////////////////////////////
///                        DECLARATIONS                              ///
////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////
///                     FUNCTION DEFINITIONS                         ///
////////////////////////////////////////////////////////////////////////

/**Function*************************************************************

  Synopsis    [This procedure sets default parameters.]

  Description []
               
  SideEffects []

  SeeAlso     []
Alan Mishchenko committed
43
 
Alan Mishchenko committed
44 45 46 47
***********************************************************************/
void Cec_ManSatSetDefaultParams( Cec_ParSat_t * p )
{
    memset( p, 0, sizeof(Cec_ParSat_t) );
Alan Mishchenko committed
48
    p->nBTLimit       =     100;  // conflict limit at a node
Alan Mishchenko committed
49
    p->nSatVarMax     =    2000;  // the max number of SAT variables
Alan Mishchenko committed
50
    p->nCallsRecycle  =     200;  // calls to perform before recycling SAT solver
Alan Mishchenko committed
51
    p->fNonChrono     =       0;  // use non-chronological backtracling (for circuit SAT only)
Alan Mishchenko committed
52
    p->fPolarFlip     =       1;  // flops polarity of variables
Alan Mishchenko committed
53
    p->fCheckMiter    =       0;  // the circuit is the miter
Alan Mishchenko committed
54
//    p->fFirstStop     =       0;  // stop on the first sat output
Alan Mishchenko committed
55
    p->fLearnCls      =       0;  // perform clause learning
Alan Mishchenko committed
56
    p->fVerbose       =       0;  // verbose stats
Alan Mishchenko committed
57
}  
Alan Mishchenko committed
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72

/**Function************  *************************************************

  Synopsis    [This procedure sets default parameters.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Cec_ManSimSetDefaultParams( Cec_ParSim_t * p )
{
    memset( p, 0, sizeof(Cec_ParSim_t) );
Alan Mishchenko committed
73 74 75 76
    p->nWords         =      31;  // the number of simulation words
    p->nFrames        =     100;  // the number of simulation frames
    p->nRounds        =      20;  // the max number of simulation rounds
    p->nNonRefines    =       3;  // the max number of rounds without refinement
Alan Mishchenko committed
77 78
    p->TimeLimit      =       0;  // the runtime limit in seconds
    p->fCheckMiter    =       0;  // the circuit is the miter
Alan Mishchenko committed
79
//    p->fFirstStop     =       0;  // stop on the first sat output
Alan Mishchenko committed
80
    p->fDualOut       =       0;  // miter with separate outputs
81
    p->fConstCorr     =       0;  // consider only constants
Alan Mishchenko committed
82 83 84 85
    p->fSeqSimulate   =       0;  // performs sequential simulation
    p->fVeryVerbose   =       0;  // verbose stats
    p->fVerbose       =       0;  // verbose stats
} 
Alan Mishchenko committed
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

/**Function************  *************************************************

  Synopsis    [This procedure sets default parameters.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Cec_ManSmfSetDefaultParams( Cec_ParSmf_t * p )
{
    memset( p, 0, sizeof(Cec_ParSmf_t) );
Alan Mishchenko committed
101
    p->nWords         =      31;  // the number of simulation words
Alan Mishchenko committed
102 103 104 105
    p->nRounds        =     200;  // the number of simulation rounds
    p->nFrames        =     200;  // the max number of time frames
    p->nNonRefines    =       3;  // the max number of rounds without refinement
    p->nMinOutputs    =       0;  // the min outputs to accumulate
Alan Mishchenko committed
106
    p->nBTLimit       =     100;  // conflict limit at a node
Alan Mishchenko committed
107 108 109
    p->TimeLimit      =       0;  // the runtime limit in seconds
    p->fDualOut       =       0;  // miter with separate outputs
    p->fCheckMiter    =       0;  // the circuit is the miter
Alan Mishchenko committed
110
//    p->fFirstStop     =       0;  // stop on the first sat output
Alan Mishchenko committed
111 112 113
    p->fVerbose       =       0;  // verbose stats
} 

Alan Mishchenko committed
114
/**Function************  *************************************************
Alan Mishchenko committed
115 116 117 118 119 120 121 122 123 124

  Synopsis    [This procedure sets default parameters.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Alan Mishchenko committed
125
void Cec_ManFraSetDefaultParams( Cec_ParFra_t * p )
Alan Mishchenko committed
126
{
Alan Mishchenko committed
127 128 129 130
    memset( p, 0, sizeof(Cec_ParFra_t) );
    p->nWords         =      15;  // the number of simulation words
    p->nRounds        =      15;  // the number of simulation rounds
    p->TimeLimit      =       0;  // the runtime limit in seconds
Alan Mishchenko committed
131 132
    p->nItersMax      =      10;  // the maximum number of iterations of SAT sweeping
    p->nBTLimit       =     100;  // conflict limit at a node
Alan Mishchenko committed
133 134 135
    p->nLevelMax      =       0;  // restriction on the level of nodes to be swept
    p->nDepthMax      =       1;  // the depth in terms of steps of speculative reduction
    p->fRewriting     =       0;  // enables AIG rewriting
Alan Mishchenko committed
136
    p->fCheckMiter    =       0;  // the circuit is the miter
Alan Mishchenko committed
137
//    p->fFirstStop     =       0;  // stop on the first sat output
Alan Mishchenko committed
138
    p->fDualOut       =       0;  // miter with separate outputs
Alan Mishchenko committed
139
    p->fColorDiff     =       0;  // miter with separate outputs
140
    p->fSatSweeping   =       0;  // enable SAT sweeping
Alan Mishchenko committed
141 142
    p->fVeryVerbose   =       0;  // verbose stats
    p->fVerbose       =       0;  // verbose stats
143
    p->iOutFail       =      -1;  // the failed output
Alan Mishchenko committed
144
} 
Alan Mishchenko committed
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159

/**Function*************************************************************

  Synopsis    [This procedure sets default parameters.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Cec_ManCecSetDefaultParams( Cec_ParCec_t * p )
{
    memset( p, 0, sizeof(Cec_ParCec_t) );
Alan Mishchenko committed
160 161
    p->nBTLimit       =    1000;  // conflict limit at a node
    p->TimeLimit      =       0;  // the runtime limit in seconds
Alan Mishchenko committed
162
//    p->fFirstStop     =       0;  // stop on the first sat output
Alan Mishchenko committed
163 164
    p->fUseSmartCnf   =       0;  // use smart CNF computation
    p->fRewriting     =       0;  // enables AIG rewriting
Alan Mishchenko committed
165 166
    p->fVeryVerbose   =       0;  // verbose stats
    p->fVerbose       =       0;  // verbose stats
167
    p->iOutFail       =      -1;  // the number of failed output
Alan Mishchenko committed
168
}  
Alan Mishchenko committed
169 170 171

/**Function*************************************************************

Alan Mishchenko committed
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
  Synopsis    [This procedure sets default parameters.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Cec_ManCorSetDefaultParams( Cec_ParCor_t * p )
{
    memset( p, 0, sizeof(Cec_ParCor_t) );
    p->nWords         =      15;  // the number of simulation words
    p->nRounds        =      15;  // the number of simulation rounds
    p->nFrames        =       1;  // the number of time frames
    p->nBTLimit       =     100;  // conflict limit at a node
188 189
    p->nLevelMax      =      -1;  // (scorr only) the max number of levels
    p->nStepsMax      =      -1;  // (scorr only) the max number of induction steps
Alan Mishchenko committed
190
    p->fLatchCorr     =       0;  // consider only latch outputs
191
    p->fConstCorr     =       0;  // consider only constants
Alan Mishchenko committed
192 193
    p->fUseRings      =       1;  // combine classes into rings
    p->fUseCSat       =       1;  // use circuit-based solver
Alan Mishchenko committed
194
//    p->fFirstStop     =       0;  // stop on the first sat output
Alan Mishchenko committed
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
    p->fUseSmartCnf   =       0;  // use smart CNF computation
    p->fVeryVerbose   =       0;  // verbose stats
    p->fVerbose       =       0;  // verbose stats
}  

/**Function*************************************************************

  Synopsis    [This procedure sets default parameters.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Cec_ManChcSetDefaultParams( Cec_ParChc_t * p )
{
    memset( p, 0, sizeof(Cec_ParChc_t) );
    p->nWords         =      15;  // the number of simulation words
    p->nRounds        =      15;  // the number of simulation rounds
    p->nBTLimit       =    1000;  // conflict limit at a node
Alan Mishchenko committed
217 218
    p->fUseRings      =       1;  // use rings
    p->fUseCSat       =       0;  // use circuit-based solver
Alan Mishchenko committed
219 220 221 222 223 224
    p->fVeryVerbose   =       0;  // verbose stats
    p->fVerbose       =       0;  // verbose stats
}  

/**Function*************************************************************

Alan Mishchenko committed
225
  Synopsis    [Core procedure for SAT sweeping.]
Alan Mishchenko committed
226 227 228 229 230 231 232 233

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Alan Mishchenko committed
234
Gia_Man_t * Cec_ManSatSolving( Gia_Man_t * pAig, Cec_ParSat_t * pPars )
Alan Mishchenko committed
235
{
Alan Mishchenko committed
236 237 238 239
    Gia_Man_t * pNew;
    Cec_ManPat_t * pPat;
    pPat = Cec_ManPatStart();
    Cec_ManSatSolve( pPat, pAig, pPars );
Alan Mishchenko committed
240 241
//    pNew = Gia_ManDupDfsSkip( pAig );
    pNew = Gia_ManDup( pAig );
Alan Mishchenko committed
242 243
    Cec_ManPatStop( pPat );
    return pNew;
Alan Mishchenko committed
244 245
}

Alan Mishchenko committed
246 247 248 249
/**Function*************************************************************

  Synopsis    [Core procedure for simulation.]

Alan Mishchenko committed
250
  Description [Returns 1 if refinement has happened.]
Alan Mishchenko committed
251 252 253 254 255 256
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Alan Mishchenko committed
257
int Cec_ManSimulationOne( Gia_Man_t * pAig, Cec_ParSim_t * pPars )
Alan Mishchenko committed
258 259
{
    Cec_ManSim_t * pSim;
Alan Mishchenko committed
260
    int RetValue = 0, clkTotal = clock();
Alan Mishchenko committed
261
    pSim = Cec_ManSimStart( pAig, pPars );
262
    if ( (pAig->pReprs == NULL && (RetValue = Cec_ManSimClassesPrepare( pSim, -1 ))) ||
Alan Mishchenko committed
263
         (RetValue == 0 &&        (RetValue = Cec_ManSimClassesRefine( pSim ))) )
264
        Abc_Print( 1, "The number of failed outputs of the miter = %6d. (Words = %4d. Frames = %4d.)\n", 
Alan Mishchenko committed
265
            pSim->nOuts, pPars->nWords, pPars->nFrames );
Alan Mishchenko committed
266
    if ( pPars->fVerbose )
267
        Abc_PrintTime( 1, "Time", clock() - clkTotal );
Alan Mishchenko committed
268
    Cec_ManSimStop( pSim );
Alan Mishchenko committed
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
    return RetValue;
}

/**Function*************************************************************

  Synopsis    [Core procedure for simulation.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Cec_ManSimulation( Gia_Man_t * pAig, Cec_ParSim_t * pPars )
{
    int r, nLitsOld, nLitsNew, nCountNoRef = 0, fStop = 0;
    Gia_ManRandom( 1 );
    if ( pPars->fSeqSimulate )
288
        Abc_Print( 1, "Performing rounds of random simulation of %d frames with %d words.\n", 
Alan Mishchenko committed
289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313
            pPars->nRounds, pPars->nFrames, pPars->nWords );
    nLitsOld = Gia_ManEquivCountLits( pAig );
    for ( r = 0; r < pPars->nRounds; r++ )
    {
        if ( Cec_ManSimulationOne( pAig, pPars ) )
        {
            fStop = 1;
            break;
        }
        // decide when to stop
        nLitsNew = Gia_ManEquivCountLits( pAig );
        if ( nLitsOld == 0 || nLitsOld > nLitsNew )
        {
            nLitsOld = nLitsNew;
            nCountNoRef = 0;
        }
        else if ( ++nCountNoRef == pPars->nNonRefines )
        {
            r++;
            break;
        }
        assert( nLitsOld == nLitsNew );
    }
//    if ( pPars->fVerbose )
    if ( r == pPars->nRounds || fStop )
314
        Abc_Print( 1, "Random simulation is stopped after %d rounds.\n", r );
Alan Mishchenko committed
315
    else
316
        Abc_Print( 1, "Random simulation saturated after %d rounds.\n", r );
Alan Mishchenko committed
317 318 319 320
    if ( pPars->fCheckMiter )
    {
        int nNonConsts = Cec_ManCountNonConstOutputs( pAig );
        if ( nNonConsts )
321
            Abc_Print( 1, "The number of POs that are not const-0 candidates = %d.\n", nNonConsts );
Alan Mishchenko committed
322
    }
Alan Mishchenko committed
323
}
Alan Mishchenko committed
324

Alan Mishchenko committed
325 326
/**Function*************************************************************

Alan Mishchenko committed
327
  Synopsis    [Core procedure for SAT sweeping.]
Alan Mishchenko committed
328 329 330 331 332 333 334 335

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Alan Mishchenko committed
336
Gia_Man_t * Cec_ManSatSweeping( Gia_Man_t * pAig, Cec_ParFra_t * pPars )
Alan Mishchenko committed
337
{
Alan Mishchenko committed
338
    int fOutputResult = 0;
Alan Mishchenko committed
339
    Cec_ParSat_t ParsSat, * pParsSat = &ParsSat;
Alan Mishchenko committed
340 341 342 343
    Cec_ParSim_t ParsSim, * pParsSim = &ParsSim;
    Gia_Man_t * pIni, * pSrm, * pTemp;
    Cec_ManFra_t * p;
    Cec_ManSim_t * pSim;
Alan Mishchenko committed
344
    Cec_ManPat_t * pPat;
Alan Mishchenko committed
345 346 347 348
    int i, fTimeOut = 0, nMatches = 0, clk, clk2;
    double clkTotal = clock();

    // duplicate AIG and transfer equivalence classes
Alan Mishchenko committed
349
    Gia_ManRandom( 1 );
Alan Mishchenko committed
350 351 352 353 354 355 356
    pIni = Gia_ManDup(pAig);
    pIni->pReprs = pAig->pReprs; pAig->pReprs = NULL;
    pIni->pNexts = pAig->pNexts; pAig->pNexts = NULL;

    // prepare the managers
    // SAT sweeping
    p = Cec_ManFraStart( pIni, pPars );
Alan Mishchenko committed
357
    if ( pPars->fDualOut )
Alan Mishchenko committed
358 359 360 361
        pPars->fColorDiff = 1;
    // simulation
    Cec_ManSimSetDefaultParams( pParsSim );
    pParsSim->nWords      = pPars->nWords;
Alan Mishchenko committed
362
    pParsSim->nFrames     = pPars->nRounds;
Alan Mishchenko committed
363
    pParsSim->fCheckMiter = pPars->fCheckMiter;
364
    pParsSim->fDualOut    = pPars->fDualOut;
Alan Mishchenko committed
365 366 367
    pParsSim->fVerbose    = pPars->fVerbose;
    pSim = Cec_ManSimStart( p->pAig, pParsSim );
    // SAT solving
Alan Mishchenko committed
368 369 370
    Cec_ManSatSetDefaultParams( pParsSat );
    pParsSat->nBTLimit = pPars->nBTLimit;
    pParsSat->fVerbose = pPars->fVeryVerbose;
Alan Mishchenko committed
371
    // simulation patterns
Alan Mishchenko committed
372 373
    pPat = Cec_ManPatStart();
    pPat->fVerbose = pPars->fVeryVerbose;
Alan Mishchenko committed
374 375 376 377 378

    // start equivalence classes
clk = clock();
    if ( p->pAig->pReprs == NULL )
    {
379
        if ( Cec_ManSimClassesPrepare(pSim, -1) || Cec_ManSimClassesRefine(pSim) )
Alan Mishchenko committed
380 381 382 383 384 385 386 387
        {
            Gia_ManStop( p->pAig );
            p->pAig = NULL;
            goto finalize;
        }
    }
p->timeSim += clock() - clk;
    // perform solving
Alan Mishchenko committed
388
    for ( i = 1; i <= pPars->nItersMax; i++ )
Alan Mishchenko committed
389
    {
Alan Mishchenko committed
390
        clk2 = clock();
Alan Mishchenko committed
391
        nMatches = 0;
Alan Mishchenko committed
392
        if ( pPars->fDualOut )
Alan Mishchenko committed
393
        {
Alan Mishchenko committed
394 395 396
            nMatches = Gia_ManEquivSetColors( p->pAig, pPars->fVeryVerbose );
//            p->pAig->pIso = Cec_ManDetectIsomorphism( p->pAig );
//            Gia_ManEquivTransform( p->pAig, 1 );
Alan Mishchenko committed
397
        }
Alan Mishchenko committed
398
        pSrm = Cec_ManFraSpecReduction( p ); 
Alan Mishchenko committed
399 400 401

//        Gia_WriteAiger( pSrm, "gia_srm.aig", 0, 0 );

Alan Mishchenko committed
402
        if ( pPars->fVeryVerbose )
Alan Mishchenko committed
403
            Gia_ManPrintStats( pSrm, 0 );
Alan Mishchenko committed
404
        if ( Gia_ManCoNum(pSrm) == 0 )
Alan Mishchenko committed
405
        {
Alan Mishchenko committed
406 407
            Gia_ManStop( pSrm );
            if ( p->pPars->fVerbose )
408
                Abc_Print( 1, "Considered all available candidate equivalences.\n" );
Alan Mishchenko committed
409
            if ( pPars->fDualOut && Gia_ManAndNum(p->pAig) > 0 )
Alan Mishchenko committed
410 411 412 413
            {
                if ( pPars->fColorDiff )
                {
                    if ( p->pPars->fVerbose )
414
                        Abc_Print( 1, "Switching into reduced mode.\n" );
Alan Mishchenko committed
415 416 417 418 419
                    pPars->fColorDiff = 0;
                }
                else
                {
                    if ( p->pPars->fVerbose )
420
                        Abc_Print( 1, "Switching into normal mode.\n" );
Alan Mishchenko committed
421
                    pPars->fDualOut = 0;
Alan Mishchenko committed
422 423 424
                }
                continue;
            }
Alan Mishchenko committed
425
            break;
Alan Mishchenko committed
426
        }
Alan Mishchenko committed
427
clk = clock();
Alan Mishchenko committed
428
        Cec_ManSatSolve( pPat, pSrm, pParsSat ); 
Alan Mishchenko committed
429
p->timeSat += clock() - clk;
Alan Mishchenko committed
430 431 432 433 434 435 436 437 438 439
        if ( Cec_ManFraClassesUpdate( p, pSim, pPat, pSrm ) )
        {
            Gia_ManStop( pSrm );
            Gia_ManStop( p->pAig );
            p->pAig = NULL;
            goto finalize;
        }
        Gia_ManStop( pSrm );

        // update the manager
Alan Mishchenko committed
440
        pSim->pAig = p->pAig = Gia_ManEquivReduceAndRemap( pTemp = p->pAig, 0, pParsSim->fDualOut );
Alan Mishchenko committed
441
        if ( p->pAig == NULL )
Alan Mishchenko committed
442 443
        {
            p->pAig = pTemp;
Alan Mishchenko committed
444
            break;
Alan Mishchenko committed
445 446
        }
        Gia_ManStop( pTemp );
Alan Mishchenko committed
447
        if ( p->pPars->fVerbose )
Alan Mishchenko committed
448
        {
449
            Abc_Print( 1, "%3d : P =%7d. D =%7d. F =%6d. M = %7d. And =%8d. ", 
Alan Mishchenko committed
450
                i, p->nAllProved, p->nAllDisproved, p->nAllFailed, nMatches, Gia_ManAndNum(p->pAig) );
451
            Abc_PrintTime( 1, "Time", clock() - clk2 );
Alan Mishchenko committed
452
        }
Alan Mishchenko committed
453
        if ( Gia_ManAndNum(p->pAig) == 0 )
Alan Mishchenko committed
454
        {
Alan Mishchenko committed
455
            if ( p->pPars->fVerbose )
456
                Abc_Print( 1, "Network after reduction is empty.\n" );
Alan Mishchenko committed
457
            break;
Alan Mishchenko committed
458
        }
Alan Mishchenko committed
459 460
        // check resource limits
        if ( p->pPars->TimeLimit && ((double)clock() - clkTotal)/CLOCKS_PER_SEC >= p->pPars->TimeLimit )
Alan Mishchenko committed
461
        {
Alan Mishchenko committed
462
            fTimeOut = 1;
Alan Mishchenko committed
463
            break;
Alan Mishchenko committed
464
        }
Alan Mishchenko committed
465 466 467
//        if ( p->nAllFailed && !p->nAllProved && !p->nAllDisproved )
        if ( p->nAllFailed > p->nAllProved + p->nAllDisproved )
        {
Alan Mishchenko committed
468
            if ( pParsSat->nBTLimit >= 10001 )
Alan Mishchenko committed
469
                break;
470 471 472 473 474 475
            if ( pPars->fSatSweeping )
            {
                if ( p->pPars->fVerbose )
                    Abc_Print( 1, "Exceeded the limit on the number of conflicts (%d).\n", pParsSat->nBTLimit );
                break;
            }
Alan Mishchenko committed
476 477 478 479
            pParsSat->nBTLimit *= 10;
            if ( p->pPars->fVerbose )
            {
                if ( p->pPars->fVerbose )
480
                    Abc_Print( 1, "Increasing conflict limit to %d.\n", pParsSat->nBTLimit );
Alan Mishchenko committed
481 482 483
                if ( fOutputResult )
                {
                    Gia_WriteAiger( p->pAig, "gia_cec_temp.aig", 0, 0 );
484
                    Abc_Print( 1,"The result is written into file \"%s\".\n", "gia_cec_temp.aig" );
Alan Mishchenko committed
485 486 487
                }
            }
        }
Alan Mishchenko committed
488
        if ( pPars->fDualOut && pPars->fColorDiff && (Gia_ManAndNum(p->pAig) < 100000 || p->nAllProved + p->nAllDisproved < 10) )
Alan Mishchenko committed
489 490
        {
            if ( p->pPars->fVerbose )
491
                Abc_Print( 1, "Switching into reduced mode.\n" );
Alan Mishchenko committed
492 493
            pPars->fColorDiff = 0;
        }
Alan Mishchenko committed
494 495
//        if ( pPars->fDualOut && Gia_ManAndNum(p->pAig) < 20000 )
        else if ( pPars->fDualOut && (Gia_ManAndNum(p->pAig) < 20000 || p->nAllProved + p->nAllDisproved < 10) )
Alan Mishchenko committed
496 497
        {
            if ( p->pPars->fVerbose )
498
                Abc_Print( 1, "Switching into normal mode.\n" );
Alan Mishchenko committed
499
            pPars->fColorDiff = 0;
Alan Mishchenko committed
500
            pPars->fDualOut = 0;
Alan Mishchenko committed
501
        }
Alan Mishchenko committed
502
    }
Alan Mishchenko committed
503
finalize:
504
    if ( p->pPars->fVerbose && p->pAig )
Alan Mishchenko committed
505
    {
506
        Abc_Print( 1, "NBeg = %d. NEnd = %d. (Gain = %6.2f %%).  RBeg = %d. REnd = %d. (Gain = %6.2f %%).\n", 
Alan Mishchenko committed
507 508 509 510
            Gia_ManAndNum(pAig), Gia_ManAndNum(p->pAig), 
            100.0*(Gia_ManAndNum(pAig)-Gia_ManAndNum(p->pAig))/(Gia_ManAndNum(pAig)?Gia_ManAndNum(pAig):1), 
            Gia_ManRegNum(pAig), Gia_ManRegNum(p->pAig), 
            100.0*(Gia_ManRegNum(pAig)-Gia_ManRegNum(p->pAig))/(Gia_ManRegNum(pAig)?Gia_ManRegNum(pAig):1) );
511 512 513 514
        Abc_PrintTimeP( 1, "Sim ", p->timeSim, clock() - (int)clkTotal );
        Abc_PrintTimeP( 1, "Sat ", p->timeSat-pPat->timeTotalSave, clock() - (int)clkTotal );
        Abc_PrintTimeP( 1, "Pat ", p->timePat+pPat->timeTotalSave, clock() - (int)clkTotal );
        Abc_PrintTime( 1, "Time", (int)(clock() - clkTotal) );
Alan Mishchenko committed
515
    }
Alan Mishchenko committed
516

Alan Mishchenko committed
517
    pTemp = p->pAig; p->pAig = NULL;
Alan Mishchenko committed
518
    if ( pTemp == NULL && pSim->iOut >= 0 )
519 520 521 522
    {
        Abc_Print( 1, "Disproved at least one output of the miter (zero-based number %d).\n", pSim->iOut );
        pPars->iOutFail = pSim->iOut;
    }
Alan Mishchenko committed
523
    else if ( pSim->pCexes )
524
        Abc_Print( 1, "Disproved %d outputs of the miter.\n", pSim->nOuts );
Alan Mishchenko committed
525
    if ( fTimeOut )
526
        Abc_Print( 1, "Timed out after %d seconds.\n", (int)((double)clock() - clkTotal)/CLOCKS_PER_SEC );
Alan Mishchenko committed
527 528 529

    pAig->pCexComb = pSim->pCexComb; pSim->pCexComb = NULL;
    Cec_ManSimStop( pSim );
Alan Mishchenko committed
530
    Cec_ManPatStop( pPat );
Alan Mishchenko committed
531 532
    Cec_ManFraStop( p );
    return pTemp;
Alan Mishchenko committed
533 534
}

Alan Mishchenko committed
535

Alan Mishchenko committed
536 537 538 539 540
////////////////////////////////////////////////////////////////////////
///                       END OF FILE                                ///
////////////////////////////////////////////////////////////////////////


541 542
ABC_NAMESPACE_IMPL_END