cecCore.c 19.8 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
51
    p->fNonChrono     =       1;  // 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
141
    p->fUseCones      =       0;  // use cones
Alan Mishchenko committed
142 143
    p->fVeryVerbose   =       0;  // verbose stats
    p->fVerbose       =       0;  // verbose stats
144
    p->iOutFail       =      -1;  // the failed output
Alan Mishchenko committed
145
} 
Alan Mishchenko committed
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160

/**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
161 162
    p->nBTLimit       =    1000;  // conflict limit at a node
    p->TimeLimit      =       0;  // the runtime limit in seconds
Alan Mishchenko committed
163
//    p->fFirstStop     =       0;  // stop on the first sat output
Alan Mishchenko committed
164 165
    p->fUseSmartCnf   =       0;  // use smart CNF computation
    p->fRewriting     =       0;  // enables AIG rewriting
Alan Mishchenko committed
166 167
    p->fVeryVerbose   =       0;  // verbose stats
    p->fVerbose       =       0;  // verbose stats
168
    p->iOutFail       =      -1;  // the number of failed output
Alan Mishchenko committed
169
}  
Alan Mishchenko committed
170 171 172

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

Alan Mishchenko committed
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
  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
189 190
    p->nLevelMax      =      -1;  // (scorr only) the max number of levels
    p->nStepsMax      =      -1;  // (scorr only) the max number of induction steps
Alan Mishchenko committed
191
    p->fLatchCorr     =       0;  // consider only latch outputs
192
    p->fConstCorr     =       0;  // consider only constants
Alan Mishchenko committed
193 194
    p->fUseRings      =       1;  // combine classes into rings
    p->fUseCSat       =       1;  // use circuit-based solver
Alan Mishchenko committed
195
//    p->fFirstStop     =       0;  // stop on the first sat output
Alan Mishchenko committed
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
    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
218 219
    p->fUseRings      =       1;  // use rings
    p->fUseCSat       =       0;  // use circuit-based solver
Alan Mishchenko committed
220 221 222 223 224 225
    p->fVeryVerbose   =       0;  // verbose stats
    p->fVerbose       =       0;  // verbose stats
}  

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

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

  Description []
               
  SideEffects []

  SeeAlso     []

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

Alan Mishchenko committed
249 250 251 252
/**Function*************************************************************

  Synopsis    [Core procedure for simulation.]

Alan Mishchenko committed
253
  Description [Returns 1 if refinement has happened.]
Alan Mishchenko committed
254 255 256 257 258 259
               
  SideEffects []

  SeeAlso     []

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

Alan Mishchenko committed
329 330
/**Function*************************************************************

Alan Mishchenko committed
331
  Synopsis    [Core procedure for SAT sweeping.]
Alan Mishchenko committed
332 333 334 335 336 337 338 339

  Description []
               
  SideEffects []

  SeeAlso     []

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

    // duplicate AIG and transfer equivalence classes
Alan Mishchenko committed
353
    Gia_ManRandom( 1 );
Alan Mishchenko committed
354 355 356
    pIni = Gia_ManDup(pAig);
    pIni->pReprs = pAig->pReprs; pAig->pReprs = NULL;
    pIni->pNexts = pAig->pNexts; pAig->pNexts = NULL;
357 358 359 360 361 362
    if ( pPars->fUseOrigIds )
    {
        Gia_ManOrigIdsInit( pIni );
        Vec_IntFreeP( &pAig->vIdsEquiv );
        pAig->vIdsEquiv = Vec_IntAlloc( 1000 );
    }
Alan Mishchenko committed
363 364 365 366

    // prepare the managers
    // SAT sweeping
    p = Cec_ManFraStart( pIni, pPars );
Alan Mishchenko committed
367
    if ( pPars->fDualOut )
Alan Mishchenko committed
368 369 370 371
        pPars->fColorDiff = 1;
    // simulation
    Cec_ManSimSetDefaultParams( pParsSim );
    pParsSim->nWords      = pPars->nWords;
Alan Mishchenko committed
372
    pParsSim->nFrames     = pPars->nRounds;
Alan Mishchenko committed
373
    pParsSim->fCheckMiter = pPars->fCheckMiter;
374
    pParsSim->fDualOut    = pPars->fDualOut;
Alan Mishchenko committed
375 376 377
    pParsSim->fVerbose    = pPars->fVerbose;
    pSim = Cec_ManSimStart( p->pAig, pParsSim );
    // SAT solving
Alan Mishchenko committed
378 379 380
    Cec_ManSatSetDefaultParams( pParsSat );
    pParsSat->nBTLimit = pPars->nBTLimit;
    pParsSat->fVerbose = pPars->fVeryVerbose;
Alan Mishchenko committed
381
    // simulation patterns
Alan Mishchenko committed
382 383
    pPat = Cec_ManPatStart();
    pPat->fVerbose = pPars->fVeryVerbose;
Alan Mishchenko committed
384 385

    // start equivalence classes
386
clk = Abc_Clock();
Alan Mishchenko committed
387 388
    if ( p->pAig->pReprs == NULL )
    {
389
        if ( Cec_ManSimClassesPrepare(pSim, -1) || Cec_ManSimClassesRefine(pSim) )
Alan Mishchenko committed
390 391 392 393 394 395
        {
            Gia_ManStop( p->pAig );
            p->pAig = NULL;
            goto finalize;
        }
    }
396
p->timeSim += Abc_Clock() - clk;
Alan Mishchenko committed
397
    // perform solving
Alan Mishchenko committed
398
    for ( i = 1; i <= pPars->nItersMax; i++ )
Alan Mishchenko committed
399
    {
400
        clk2 = Abc_Clock();
Alan Mishchenko committed
401
        nMatches = 0;
Alan Mishchenko committed
402
        if ( pPars->fDualOut )
Alan Mishchenko committed
403
        {
Alan Mishchenko committed
404 405 406
            nMatches = Gia_ManEquivSetColors( p->pAig, pPars->fVeryVerbose );
//            p->pAig->pIso = Cec_ManDetectIsomorphism( p->pAig );
//            Gia_ManEquivTransform( p->pAig, 1 );
Alan Mishchenko committed
407
        }
Alan Mishchenko committed
408
        pSrm = Cec_ManFraSpecReduction( p ); 
Alan Mishchenko committed
409

410
//        Gia_AigerWrite( pSrm, "gia_srm.aig", 0, 0, 0 );
Alan Mishchenko committed
411

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

Alan Mishchenko committed
530
    pTemp = p->pAig; p->pAig = NULL;
Alan Mishchenko committed
531
    if ( pTemp == NULL && pSim->iOut >= 0 )
532
    {
533
        if ( !fSilent )
534 535 536
        Abc_Print( 1, "Disproved at least one output of the miter (zero-based number %d).\n", pSim->iOut );
        pPars->iOutFail = pSim->iOut;
    }
537
    else if ( pSim->pCexes && !fSilent )
538
        Abc_Print( 1, "Disproved %d outputs of the miter.\n", pSim->nOuts );
539
    if ( fTimeOut && !fSilent )
540
        Abc_Print( 1, "Timed out after %d seconds.\n", (int)((double)Abc_Clock() - clkTotal)/CLOCKS_PER_SEC );
Alan Mishchenko committed
541 542 543

    pAig->pCexComb = pSim->pCexComb; pSim->pCexComb = NULL;
    Cec_ManSimStop( pSim );
Alan Mishchenko committed
544
    Cec_ManPatStop( pPat );
Alan Mishchenko committed
545 546
    Cec_ManFraStop( p );
    return pTemp;
Alan Mishchenko committed
547 548
}

Alan Mishchenko committed
549

Alan Mishchenko committed
550 551 552 553 554
////////////////////////////////////////////////////////////////////////
///                       END OF FILE                                ///
////////////////////////////////////////////////////////////////////////


555 556
ABC_NAMESPACE_IMPL_END