cecCore.c 19.4 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;
260
    int RetValue = 0;
261
    abctime clkTotal = Abc_Clock();
Alan Mishchenko committed
262
    pSim = Cec_ManSimStart( pAig, pPars );
263
    if ( (pAig->pReprs == NULL && (RetValue = Cec_ManSimClassesPrepare( pSim, -1 ))) ||
Alan Mishchenko committed
264
         (RetValue == 0 &&        (RetValue = Cec_ManSimClassesRefine( pSim ))) )
265
        Abc_Print( 1, "The number of failed outputs of the miter = %6d. (Words = %4d. Frames = %4d.)\n", 
Alan Mishchenko committed
266
            pSim->nOuts, pPars->nWords, pPars->nFrames );
Alan Mishchenko committed
267
    if ( pPars->fVerbose )
268
        Abc_PrintTime( 1, "Time", Abc_Clock() - clkTotal );
Alan Mishchenko committed
269
    Cec_ManSimStop( pSim );
Alan Mishchenko committed
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
    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 )
289
        Abc_Print( 1, "Performing rounds of random simulation of %d frames with %d words.\n", 
Alan Mishchenko committed
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314
            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 )
315
        Abc_Print( 1, "Random simulation is stopped after %d rounds.\n", r );
Alan Mishchenko committed
316
    else
317
        Abc_Print( 1, "Random simulation saturated after %d rounds.\n", r );
Alan Mishchenko committed
318 319 320 321
    if ( pPars->fCheckMiter )
    {
        int nNonConsts = Cec_ManCountNonConstOutputs( pAig );
        if ( nNonConsts )
322
            Abc_Print( 1, "The number of POs that are not const-0 candidates = %d.\n", nNonConsts );
Alan Mishchenko committed
323
    }
Alan Mishchenko committed
324
}
Alan Mishchenko committed
325

Alan Mishchenko committed
326 327
/**Function*************************************************************

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

  Description []
               
  SideEffects []

  SeeAlso     []

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

    // duplicate AIG and transfer equivalence classes
Alan Mishchenko committed
350
    Gia_ManRandom( 1 );
Alan Mishchenko committed
351 352 353 354 355 356 357
    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
358
    if ( pPars->fDualOut )
Alan Mishchenko committed
359 360 361 362
        pPars->fColorDiff = 1;
    // simulation
    Cec_ManSimSetDefaultParams( pParsSim );
    pParsSim->nWords      = pPars->nWords;
Alan Mishchenko committed
363
    pParsSim->nFrames     = pPars->nRounds;
Alan Mishchenko committed
364
    pParsSim->fCheckMiter = pPars->fCheckMiter;
365
    pParsSim->fDualOut    = pPars->fDualOut;
Alan Mishchenko committed
366 367 368
    pParsSim->fVerbose    = pPars->fVerbose;
    pSim = Cec_ManSimStart( p->pAig, pParsSim );
    // SAT solving
Alan Mishchenko committed
369 370 371
    Cec_ManSatSetDefaultParams( pParsSat );
    pParsSat->nBTLimit = pPars->nBTLimit;
    pParsSat->fVerbose = pPars->fVeryVerbose;
Alan Mishchenko committed
372
    // simulation patterns
Alan Mishchenko committed
373 374
    pPat = Cec_ManPatStart();
    pPat->fVerbose = pPars->fVeryVerbose;
Alan Mishchenko committed
375 376

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

401
//        Gia_AigerWrite( pSrm, "gia_srm.aig", 0, 0 );
Alan Mishchenko committed
402

Alan Mishchenko committed
403
        if ( pPars->fVeryVerbose )
404
            Gia_ManPrintStats( pSrm, NULL );
Alan Mishchenko committed
405
        if ( Gia_ManCoNum(pSrm) == 0 )
Alan Mishchenko committed
406
        {
Alan Mishchenko committed
407 408
            Gia_ManStop( pSrm );
            if ( p->pPars->fVerbose )
409
                Abc_Print( 1, "Considered all available candidate equivalences.\n" );
Alan Mishchenko committed
410
            if ( pPars->fDualOut && Gia_ManAndNum(p->pAig) > 0 )
Alan Mishchenko committed
411 412 413 414
            {
                if ( pPars->fColorDiff )
                {
                    if ( p->pPars->fVerbose )
415
                        Abc_Print( 1, "Switching into reduced mode.\n" );
Alan Mishchenko committed
416 417 418 419 420
                    pPars->fColorDiff = 0;
                }
                else
                {
                    if ( p->pPars->fVerbose )
421
                        Abc_Print( 1, "Switching into normal mode.\n" );
Alan Mishchenko committed
422
                    pPars->fDualOut = 0;
Alan Mishchenko committed
423 424 425
                }
                continue;
            }
Alan Mishchenko committed
426
            break;
Alan Mishchenko committed
427
        }
428
clk = Abc_Clock();
429 430 431 432
        if ( pPars->fRunCSat )
            Cec_ManSatSolveCSat( pPat, pSrm, pParsSat ); 
        else
            Cec_ManSatSolve( pPat, pSrm, pParsSat ); 
433
p->timeSat += Abc_Clock() - clk;
Alan Mishchenko committed
434 435 436 437 438 439 440 441 442 443
        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
444
        pSim->pAig = p->pAig = Gia_ManEquivReduceAndRemap( pTemp = p->pAig, 0, pParsSim->fDualOut );
Alan Mishchenko committed
445
        if ( p->pAig == NULL )
Alan Mishchenko committed
446 447
        {
            p->pAig = pTemp;
Alan Mishchenko committed
448
            break;
Alan Mishchenko committed
449 450
        }
        Gia_ManStop( pTemp );
Alan Mishchenko committed
451
        if ( p->pPars->fVerbose )
Alan Mishchenko committed
452
        {
453
            Abc_Print( 1, "%3d : P =%7d. D =%7d. F =%6d. M = %7d. And =%8d. ", 
Alan Mishchenko committed
454
                i, p->nAllProved, p->nAllDisproved, p->nAllFailed, nMatches, Gia_ManAndNum(p->pAig) );
455
            Abc_PrintTime( 1, "Time", Abc_Clock() - clk2 );
Alan Mishchenko committed
456
        }
Alan Mishchenko committed
457
        if ( Gia_ManAndNum(p->pAig) == 0 )
Alan Mishchenko committed
458
        {
Alan Mishchenko committed
459
            if ( p->pPars->fVerbose )
460
                Abc_Print( 1, "Network after reduction is empty.\n" );
Alan Mishchenko committed
461
            break;
Alan Mishchenko committed
462
        }
Alan Mishchenko committed
463
        // check resource limits
464
        if ( p->pPars->TimeLimit && (Abc_Clock() - clkTotal)/CLOCKS_PER_SEC >= p->pPars->TimeLimit )
Alan Mishchenko committed
465
        {
Alan Mishchenko committed
466
            fTimeOut = 1;
Alan Mishchenko committed
467
            break;
Alan Mishchenko committed
468
        }
Alan Mishchenko committed
469 470 471
//        if ( p->nAllFailed && !p->nAllProved && !p->nAllDisproved )
        if ( p->nAllFailed > p->nAllProved + p->nAllDisproved )
        {
Alan Mishchenko committed
472
            if ( pParsSat->nBTLimit >= 10001 )
Alan Mishchenko committed
473
                break;
474 475 476 477 478 479
            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
480 481 482 483
            pParsSat->nBTLimit *= 10;
            if ( p->pPars->fVerbose )
            {
                if ( p->pPars->fVerbose )
484
                    Abc_Print( 1, "Increasing conflict limit to %d.\n", pParsSat->nBTLimit );
Alan Mishchenko committed
485 486
                if ( fOutputResult )
                {
487
                    Gia_AigerWrite( p->pAig, "gia_cec_temp.aig", 0, 0 );
488
                    Abc_Print( 1,"The result is written into file \"%s\".\n", "gia_cec_temp.aig" );
Alan Mishchenko committed
489 490 491
                }
            }
        }
Alan Mishchenko committed
492
        if ( pPars->fDualOut && pPars->fColorDiff && (Gia_ManAndNum(p->pAig) < 100000 || p->nAllProved + p->nAllDisproved < 10) )
Alan Mishchenko committed
493 494
        {
            if ( p->pPars->fVerbose )
495
                Abc_Print( 1, "Switching into reduced mode.\n" );
Alan Mishchenko committed
496 497
            pPars->fColorDiff = 0;
        }
Alan Mishchenko committed
498 499
//        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
500 501
        {
            if ( p->pPars->fVerbose )
502
                Abc_Print( 1, "Switching into normal mode.\n" );
Alan Mishchenko committed
503
            pPars->fColorDiff = 0;
Alan Mishchenko committed
504
            pPars->fDualOut = 0;
Alan Mishchenko committed
505
        }
Alan Mishchenko committed
506
    }
Alan Mishchenko committed
507
finalize:
508
    if ( p->pPars->fVerbose && p->pAig )
Alan Mishchenko committed
509
    {
510
        Abc_Print( 1, "NBeg = %d. NEnd = %d. (Gain = %6.2f %%).  RBeg = %d. REnd = %d. (Gain = %6.2f %%).\n", 
Alan Mishchenko committed
511 512 513 514
            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) );
515 516 517 518
        Abc_PrintTimeP( 1, "Sim ", p->timeSim, Abc_Clock() - (int)clkTotal );
        Abc_PrintTimeP( 1, "Sat ", p->timeSat-pPat->timeTotalSave, Abc_Clock() - (int)clkTotal );
        Abc_PrintTimeP( 1, "Pat ", p->timePat+pPat->timeTotalSave, Abc_Clock() - (int)clkTotal );
        Abc_PrintTime( 1, "Time", (int)(Abc_Clock() - clkTotal) );
Alan Mishchenko committed
519
    }
Alan Mishchenko committed
520

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

    pAig->pCexComb = pSim->pCexComb; pSim->pCexComb = NULL;
    Cec_ManSimStop( pSim );
Alan Mishchenko committed
535
    Cec_ManPatStop( pPat );
Alan Mishchenko committed
536 537
    Cec_ManFraStop( p );
    return pTemp;
Alan Mishchenko committed
538 539
}

Alan Mishchenko committed
540

Alan Mishchenko committed
541 542 543 544 545
////////////////////////////////////////////////////////////////////////
///                       END OF FILE                                ///
////////////////////////////////////////////////////////////////////////


546 547
ABC_NAMESPACE_IMPL_END