bmcCexCare.c 18 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
/**CFile****************************************************************

  FileName    [bmcCexCare.c]

  SystemName  [ABC: Logic synthesis and verification system.]

  PackageName [SAT-based bounded model checking.]

  Synopsis    [Computing care set of the counter-example.]

  Author      [Alan Mishchenko]
  
  Affiliation [UC Berkeley]

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

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

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

#include "bmc.h"
#include "aig/gia/giaAig.h"

ABC_NAMESPACE_IMPL_START


////////////////////////////////////////////////////////////////////////
///                        DECLARATIONS                              ///
////////////////////////////////////////////////////////////////////////

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

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

37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
  Synopsis    [Takes CEX and its care-set. Returns care-set of all objects.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Abc_Cex_t * Bmc_CexCareExtendToObjects( Gia_Man_t * p, Abc_Cex_t * pCex, Abc_Cex_t * pCexCare )
{
    Abc_Cex_t * pNew;
    Gia_Obj_t * pObj;
    int i, k;
    assert( pCex->nPis == pCexCare->nPis );
    assert( pCex->nRegs == pCexCare->nRegs );
    assert( pCex->nBits == pCexCare->nBits );
    // start the counter-example
    pNew = Abc_CexAlloc( pCex->nRegs, Gia_ManObjNum(p), pCex->iFrame + 1 );
    pNew->iFrame = pCex->iFrame;
    pNew->iPo    = pCex->iPo;
    // initialize terminary simulation
    Gia_ObjTerSimSet0( Gia_ManConst0(p) );
    Gia_ManForEachRi( p, pObj, k )
        Gia_ObjTerSimSet0( pObj );
    for ( i = 0; i <= pCex->iFrame; i++ )
    {
        Gia_ManForEachPi( p, pObj, k )
        {
            if ( !Abc_InfoHasBit( pCexCare->pData, pCexCare->nRegs + i * pCexCare->nPis + k ) )
                Gia_ObjTerSimSetX( pObj );
            else if ( Abc_InfoHasBit( pCex->pData, pCex->nRegs + i * pCex->nPis + k ) )
                Gia_ObjTerSimSet1( pObj );
            else
                Gia_ObjTerSimSet0( pObj );
        }
        Gia_ManForEachRo( p, pObj, k )
            Gia_ObjTerSimRo( p, pObj );
        Gia_ManForEachAnd( p, pObj, k )
            Gia_ObjTerSimAnd( pObj );
        Gia_ManForEachCo( p, pObj, k )
            Gia_ObjTerSimCo( pObj );
        // add cares to the exdended counter-example
        Gia_ManForEachObj( p, pObj, k )
            if ( !Gia_ObjTerSimGetX(pObj) )
                Abc_InfoSetBit( pNew->pData, pNew->nRegs + pNew->nPis * i + k );
    }
    pObj = Gia_ManPo( p, pCex->iPo );
    assert( Gia_ObjTerSimGet1(pObj) );
    return pNew;
}

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

91
  Synopsis    [Forward propagation.]
92 93 94 95 96 97 98 99

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
100
void Bmc_CexCarePropagateFwdOne( Gia_Man_t * p, Abc_Cex_t * pCex, int f, Vec_Int_t * vPriosIn )
101 102 103 104
{
    Gia_Obj_t * pObj;
    int Prio, Prio0, Prio1;
    int i, Phase0, Phase1;
105 106 107
    assert( Vec_IntSize(vPriosIn) == pCex->nPis * (pCex->iFrame + 1) );
    Gia_ManForEachPi( p, pObj, i )
        pObj->Value = Vec_IntEntry( vPriosIn, f * pCex->nPis + i );
108 109 110 111 112 113 114
    Gia_ManForEachAnd( p, pObj, i )
    {
        Prio0  = Abc_Lit2Var(Gia_ObjFanin0(pObj)->Value);
        Prio1  = Abc_Lit2Var(Gia_ObjFanin1(pObj)->Value);
        Phase0 = Abc_LitIsCompl(Gia_ObjFanin0(pObj)->Value) ^ Gia_ObjFaninC0(pObj);
        Phase1 = Abc_LitIsCompl(Gia_ObjFanin1(pObj)->Value) ^ Gia_ObjFaninC1(pObj);
        if ( Phase0 && Phase1 )
115 116
            Prio = Abc_MinInt(Prio0, Prio1);
        else if ( Phase0 )
117
            Prio = Prio1;
118
        else if ( Phase1 )
119 120
            Prio = Prio0;
        else // if ( !Phase0 && !Phase1 )
121 122 123
            Prio = Abc_MaxInt(Prio0, Prio1);
        pObj->Value = Abc_Var2Lit( Prio, Phase0 && Phase1 );
        pObj->fPhase = 0;
124 125 126 127
    }
    Gia_ManForEachCo( p, pObj, i )
        pObj->Value = Abc_LitNotCond( Gia_ObjFanin0(pObj)->Value, Gia_ObjFaninC0(pObj) );
}
128
void Bmc_CexCarePropagateFwd( Gia_Man_t * p, Abc_Cex_t * pCex, Vec_Int_t * vPriosIn, Vec_Int_t * vPriosFf )
129
{
130 131 132 133 134 135
    Gia_Obj_t * pObjRo, * pObjRi;
    int i, f, ValueMax = Abc_Var2Lit( pCex->nPis * (pCex->iFrame + 1), 0 );
    Gia_ManConst0( p )->Value = ValueMax;
    Gia_ManForEachRi( p, pObjRi, i )
        pObjRi->Value = ValueMax;
    Vec_IntClear( vPriosFf );
136 137 138
    for ( f = 0; f <= pCex->iFrame; f++ )
    {
        Gia_ManForEachRiRo( p, pObjRi, pObjRo, i )
139 140
            Vec_IntPush( vPriosFf, (pObjRo->Value = pObjRi->Value) );
        Bmc_CexCarePropagateFwdOne( p, pCex, f, vPriosIn );
141 142 143 144 145
    }
}

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

146
  Synopsis    [Backward propagation.]
147 148 149 150 151 152 153 154

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
155
void Bmc_CexCarePropagateBwdOne( Gia_Man_t * p, Abc_Cex_t * pCex, int f, Abc_Cex_t * pCexMin )
156
{
157
    Gia_Obj_t * pObj, * pFan0, * pFan1;
158
    int i, Phase0, Phase1;
159
    Gia_ManForEachCi( p, pObj, i )
160 161 162 163 164 165 166 167
        pObj->fPhase = 0;
    Gia_ManForEachCo( p, pObj, i )
        if ( pObj->fPhase )
            Gia_ObjFanin0(pObj)->fPhase = 1;
    Gia_ManForEachAndReverse( p, pObj, i )
    {
        if ( !pObj->fPhase )
            continue;
168 169 170 171
        pFan0 = Gia_ObjFanin0(pObj);
        pFan1 = Gia_ObjFanin1(pObj);
        Phase0 = Abc_LitIsCompl(pFan0->Value) ^ Gia_ObjFaninC0(pObj);
        Phase1 = Abc_LitIsCompl(pFan1->Value) ^ Gia_ObjFaninC1(pObj);
172 173
        if ( Phase0 && Phase1 )
        {
174 175
            pFan0->fPhase = 1;
            pFan1->fPhase = 1;
176
        }
177 178 179 180
        else if ( Phase0 )
            pFan1->fPhase = 1;
        else if ( Phase1 )
            pFan0->fPhase = 1;
181 182
        else // if ( !Phase0 && !Phase1 )
        {
183
            if ( pFan0->fPhase || pFan1->fPhase )
184
                continue;
185 186 187 188 189 190 191 192
            if ( Gia_ObjIsPi(p, pFan0) )
                pFan0->fPhase = 1;
            else if ( Gia_ObjIsPi(p, pFan1) )
                pFan1->fPhase = 1;
//            else if ( Gia_ObjIsAnd(pFan0) && Txs_ObjIsJust(p, pFan0) )
//                pFan0->fPhase = 1;
//            else if ( Gia_ObjIsAnd(pFan1) && Txs_ObjIsJust(p, pFan1) )
//                pFan1->fPhase = 1;
193 194
            else
            {
195 196
                if ( Abc_Lit2Var(pFan0->Value) > Abc_Lit2Var(pFan1->Value) )
                    pFan0->fPhase = 1;
197
                else
198
                    pFan1->fPhase = 1;
199
            }
200 201 202 203 204 205
        }
    }
    Gia_ManForEachPi( p, pObj, i )
        if ( pObj->fPhase )
            Abc_InfoSetBit( pCexMin->pData, pCexMin->nRegs + pCexMin->nPis * f + i );
}
206
Abc_Cex_t * Bmc_CexCarePropagateBwd( Gia_Man_t * p, Abc_Cex_t * pCex, Vec_Int_t * vPriosIn, Vec_Int_t * vPriosFf )
207 208
{
    Abc_Cex_t * pCexMin;
209
    Gia_Obj_t * pObjRo, * pObjRi;
210 211 212 213
    int f, i;
    pCexMin = Abc_CexAlloc( pCex->nRegs, pCex->nPis, pCex->iFrame + 1 );
    pCexMin->iPo    = pCex->iPo;
    pCexMin->iFrame = pCex->iFrame;
214 215
    Gia_ManForEachCo( p, pObjRi, i )
        pObjRi->fPhase = 0;
216 217 218
    for ( f = pCex->iFrame; f >= 0; f-- )
    {
        Gia_ManPo(p, pCex->iPo)->fPhase = (int)(f == pCex->iFrame);
219 220 221 222
        Gia_ManForEachRo( p, pObjRo, i )
            pObjRo->Value = Vec_IntEntry( vPriosFf, f * pCex->nRegs + i );
        Bmc_CexCarePropagateFwdOne( p, pCex, f, vPriosIn );
        Bmc_CexCarePropagateBwdOne( p, pCex, f, pCexMin );
223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
        Gia_ManForEachRiRo( p, pObjRi, pObjRo, i )
            pObjRi->fPhase = pObjRo->fPhase;
    }
    return pCexMin;
}

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

  Synopsis    [Computes the care set of the counter-example.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
240 241 242 243 244 245 246 247 248 249 250 251 252 253
Abc_Cex_t * Bmc_CexCareTotal( Abc_Cex_t ** pCexes, int nCexes )
{
    int i, k, nWords = Abc_BitWordNum( pCexes[0]->nBits );
    Abc_Cex_t * pCexMin = Abc_CexAlloc( pCexes[0]->nRegs, pCexes[0]->nPis, pCexes[0]->iFrame + 1 );
    pCexMin->iPo    = pCexes[0]->iPo;
    pCexMin->iFrame = pCexes[0]->iFrame;
    for ( i = 0; i < nWords; i++ )
    {
        pCexMin->pData[i] = pCexes[0]->pData[i];
        for ( k = 1; k < nCexes; k++ )
            pCexMin->pData[i] &= pCexes[k]->pData[i];
    }
    return pCexMin;
}
254
Abc_Cex_t * Bmc_CexCareMinimizeAig( Gia_Man_t * p, int nRealPis, Abc_Cex_t * pCex, int nTryCexes, int fCheck, int fVerbose )
255
{
256
    //int nTryCexes = 4; // belongs to range [1;4]
257
    Abc_Cex_t * pCexBest, * pCexMin[4] = {NULL};
258 259
    int k, f, i, nOnesBest, nOnesCur, Counter = 0;
    Vec_Int_t * vPriosIn, * vPriosFf;
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
    if ( pCex->nPis != Gia_ManPiNum(p) )
    {
        printf( "Given CEX does to have same number of inputs as the AIG.\n" );
        return NULL;
    }
    if ( pCex->nRegs != Gia_ManRegNum(p) )
    {
        printf( "Given CEX does to have same number of flops as the AIG.\n" );
        return NULL;
    }
    if ( !(pCex->iPo >= 0 && pCex->iPo < Gia_ManPoNum(p)) )
    {
        printf( "Given CEX has PO whose index is out of range for the AIG.\n" );
        return NULL;
    }
    assert( pCex->nPis == Gia_ManPiNum(p) );
    assert( pCex->nRegs == Gia_ManRegNum(p) );
    assert( pCex->iPo >= 0 && pCex->iPo < Gia_ManPoNum(p) );
    if ( fVerbose )
    {
        printf( "Original :    " );
281
        Bmc_CexPrint( pCex, nRealPis, 0 );
282
    }
283 284
    vPriosIn = Vec_IntAlloc( pCex->nPis  * (pCex->iFrame + 1) );
    vPriosFf = Vec_IntAlloc( pCex->nRegs * (pCex->iFrame + 1) );
285 286
    for ( k = 0; k < nTryCexes; k++ )
    {
287 288 289 290 291 292
        Counter = 0;
        Vec_IntFill( vPriosIn, pCex->nPis * (pCex->iFrame + 1), 0 );
/*
        if ( k == 0 )
        {
            for ( f = 0; f <= pCex->iFrame; f++ )
293
                for ( i = nRealPis; i < Gia_ManPiNum(p); i++ )
294 295
                    Vec_IntWriteEntry( vPriosIn, f * pCex->nPis + i, Abc_Var2Lit(Counter++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i)) );
            for ( f = 0; f <= pCex->iFrame; f++ )
296
                for ( i = 0; i < nRealPis; i++ )
297 298 299 300 301
                    Vec_IntWriteEntry( vPriosIn, f * pCex->nPis + i, Abc_Var2Lit(Counter++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i)) );
        }
        else if ( k == 1 )
        {
            for ( f = pCex->iFrame; f >= 0; f-- )
302
                for ( i = nRealPis; i < Gia_ManPiNum(p); i++ )
303 304
                    Vec_IntWriteEntry( vPriosIn, f * pCex->nPis + i, Abc_Var2Lit(Counter++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i)) );
            for ( f = pCex->iFrame; f >= 0; f-- )
305
                for ( i = 0; i < nRealPis; i++ )
306 307 308 309 310
                    Vec_IntWriteEntry( vPriosIn, f * pCex->nPis + i, Abc_Var2Lit(Counter++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i)) );
        }
        else if ( k == 2 )
        {
            for ( f = 0; f <= pCex->iFrame; f++ )
311
                for ( i = Gia_ManPiNum(p) - 1; i >= nRealPis; i-- )
312 313
                    Vec_IntWriteEntry( vPriosIn, f * pCex->nPis + i, Abc_Var2Lit(Counter++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i)) );
            for ( f = 0; f <= pCex->iFrame; f++ )
314
                for ( i = nRealPis - 1; i >= 0; i-- )
315 316 317 318 319
                    Vec_IntWriteEntry( vPriosIn, f * pCex->nPis + i, Abc_Var2Lit(Counter++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i)) );
        }
        else if ( k == 3 )
        {
            for ( f = pCex->iFrame; f >= 0; f-- )
320
                for ( i = Gia_ManPiNum(p) - 1; i >= nRealPis; i-- )
321 322
                    Vec_IntWriteEntry( vPriosIn, f * pCex->nPis + i, Abc_Var2Lit(Counter++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i)) );
            for ( f = pCex->iFrame; f >= 0; f-- )
323
                for ( i = nRealPis - 1; i >= 0; i-- )
324 325 326 327 328 329 330
                    Vec_IntWriteEntry( vPriosIn, f * pCex->nPis + i, Abc_Var2Lit(Counter++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i)) );
        }
        else assert( 0 );
*/
        if ( k == 0 )
        {
            for ( f = pCex->iFrame; f >= 0; f-- )
331
                for ( i = Gia_ManPiNum(p) - 1; i >= nRealPis; i-- )
332 333
                    Vec_IntWriteEntry( vPriosIn, f * pCex->nPis + i, Abc_Var2Lit(Counter++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i)) );
            for ( f = pCex->iFrame; f >= 0; f-- )
334
                for ( i = nRealPis - 1; i >= 0; i-- )
335 336 337 338 339
                    Vec_IntWriteEntry( vPriosIn, f * pCex->nPis + i, Abc_Var2Lit(Counter++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i)) );
        }
        else if ( k == 1 )
        {
            for ( f = pCex->iFrame; f >= 0; f-- )
340
                for ( i = Gia_ManPiNum(p) - 1; i >= nRealPis; i-- )
341 342
                    Vec_IntWriteEntry( vPriosIn, f * pCex->nPis + i, Abc_Var2Lit(Counter++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i)) );
            for ( f = pCex->iFrame; f >= 0; f-- )
343
                for ( i = 0; i < nRealPis; i++ )
344 345 346 347 348
                    Vec_IntWriteEntry( vPriosIn, f * pCex->nPis + i, Abc_Var2Lit(Counter++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i)) );
        }
        else if ( k == 2 )
        {
            for ( f = pCex->iFrame; f >= 0; f-- )
349
                for ( i = nRealPis; i < Gia_ManPiNum(p); i++ )
350 351
                    Vec_IntWriteEntry( vPriosIn, f * pCex->nPis + i, Abc_Var2Lit(Counter++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i)) );
            for ( f = pCex->iFrame; f >= 0; f-- )
352
                for ( i = nRealPis - 1; i >= 0; i-- )
353 354 355 356 357
                    Vec_IntWriteEntry( vPriosIn, f * pCex->nPis + i, Abc_Var2Lit(Counter++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i)) );
        }
        else if ( k == 3 )
        {
            for ( f = pCex->iFrame; f >= 0; f-- )
358
                for ( i = nRealPis; i < Gia_ManPiNum(p); i++ )
359 360
                    Vec_IntWriteEntry( vPriosIn, f * pCex->nPis + i, Abc_Var2Lit(Counter++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i)) );
            for ( f = pCex->iFrame; f >= 0; f-- )
361
                for ( i = 0; i < nRealPis; i++ )
362 363 364 365 366 367 368
                    Vec_IntWriteEntry( vPriosIn, f * pCex->nPis + i, Abc_Var2Lit(Counter++, Abc_InfoHasBit(pCex->pData, pCex->nRegs + pCex->nPis * f + i)) );
        }
        else assert( 0 );

        assert( Counter == pCex->nPis * (pCex->iFrame + 1) );
        Bmc_CexCarePropagateFwd( p, pCex, vPriosIn, vPriosFf );
        assert( Vec_IntSize(vPriosFf) == pCex->nRegs * (pCex->iFrame + 1) );
369 370 371
        if ( !Abc_LitIsCompl(Gia_ManPo(p, pCex->iPo)->Value) )
        {
            printf( "Counter-example is invalid.\n" );
372 373
            Vec_IntFree( vPriosIn );
            Vec_IntFree( vPriosFf );
374 375
            return NULL;
        }
376
        pCexMin[k] = Bmc_CexCarePropagateBwd( p, pCex, vPriosIn, vPriosFf );
377 378
        if ( fVerbose )
        {
379
            if ( k == 0 )
380
                printf( "PI-  PPI-:    " );
381
            else if ( k == 1 )
382
                printf( "PI+  PPI-:    " );
383
            else if ( k == 2 )
384
                printf( "PI-  PPI+:    " );
385
            else if ( k == 3 )
386
                printf( "PI+  PPI+:    " );
387
            else assert( 0 );
388
            Bmc_CexPrint( pCexMin[k], nRealPis, 0 );
389 390
        }
    }
391 392
    Vec_IntFree( vPriosIn );
    Vec_IntFree( vPriosFf );
393 394 395 396 397
    // select the best one
    pCexBest  = pCexMin[0];
    nOnesBest = Abc_CexCountOnes(pCexMin[0]);
    for ( k = 1; k < nTryCexes; k++ )
    {
398 399
        if ( pCexMin[k] == NULL )
            continue;
400 401 402 403 404 405 406 407 408
        nOnesCur = Abc_CexCountOnes(pCexMin[k]);
        if ( nOnesBest > nOnesCur )
        {
            nOnesBest = nOnesCur;
            pCexBest  = pCexMin[k];
        }
    }
    if ( fVerbose )
    {
409
        //Abc_Cex_t * pTotal = Bmc_CexCareTotal( pCexMin, nTryCexes );
410
        printf( "Final    :    " );
411
        Bmc_CexPrint( pCexBest, nRealPis, 0 );
412
        //printf( "Total    :    " );
413
        //Bmc_CexPrint( pTotal, nRealPis, 0 );
414
        //Abc_CexFreeP( &pTotal );
415
    }
416
    for ( k = 0; k < nTryCexes; k++ )
417
        if ( pCexMin[k] && pCexBest != pCexMin[k] )
418 419
            Abc_CexFreeP( &pCexMin[k] );
    // verify and return
420 421 422 423 424 425
    if ( !Bmc_CexVerify( p, pCex, pCexBest ) )
        printf( "Counter-example verification has failed.\n" );
    else if ( fCheck ) 
        printf( "Counter-example verification succeeded.\n" );
    return pCexBest;
}
426
Abc_Cex_t * Bmc_CexCareMinimize( Aig_Man_t * p, int nRealPis, Abc_Cex_t * pCex, int nTryCexes, int fCheck, int fVerbose )
427 428
{
    Gia_Man_t * pGia = Gia_ManFromAigSimple( p );
429
    Abc_Cex_t * pCexMin = Bmc_CexCareMinimizeAig( pGia, nRealPis, pCex, nTryCexes, fCheck, fVerbose );
430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460
    Gia_ManStop( pGia );
    return pCexMin;
}

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

  Synopsis    [Verifies the care set of the counter-example.]

  Description []

  SideEffects []

  SeeAlso     []

***********************************************************************/
void Bmc_CexCareVerify( Aig_Man_t * p, Abc_Cex_t * pCex, Abc_Cex_t * pCexMin, int fVerbose )
{
    Gia_Man_t * pGia = Gia_ManFromAigSimple( p );
    if ( fVerbose )
    {
        printf( "Original :    " );
        Bmc_CexPrint( pCex, Gia_ManPiNum(pGia), 0 );
        printf( "Minimized:    " );
        Bmc_CexPrint( pCexMin, Gia_ManPiNum(pGia), 0 );
    }
    if ( !Bmc_CexVerify( pGia, pCex, pCexMin ) )
        printf( "Counter-example verification has failed.\n" );
    else 
        printf( "Counter-example verification succeeded.\n" );
    Gia_ManStop( pGia );
}
461 462 463
/*
    {
        Aig_Man_t * pAig = Abc_NtkToDar( pNtk, 0, 1 );
464
        Abc_Cex_t * pCex = Bmc_CexCareMinimize( pAig, 3*Saig_ManPiNum(pAig)/4, 4, pAbc->pCex, 1, 1 );
465 466 467 468
        Aig_ManStop( pAig );
        Abc_CexFree( pCex );
    }
*/
469 470 471 472 473 474 475 476

////////////////////////////////////////////////////////////////////////
///                       END OF FILE                                ///
////////////////////////////////////////////////////////////////////////


ABC_NAMESPACE_IMPL_END