giaAig.c 21.9 KB
Newer Older
Alan Mishchenko committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/**CFile****************************************************************

  FileName    [giaAig.c]

  SystemName  [ABC: Logic synthesis and verification system.]

  PackageName [Scalable AIG package.]

  Synopsis    [Transformation between AIG manager.]

  Author      [Alan Mishchenko]
  
  Affiliation [UC Berkeley]

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

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

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

Alan Mishchenko committed
21
#include "giaAig.h"
22 23 24
#include "proof/fra/fra.h"
#include "proof/dch/dch.h"
#include "opt/dar/dar.h"
25
#include "opt/dau/dau.h"
26 27 28

ABC_NAMESPACE_IMPL_START

Alan Mishchenko committed
29 30 31 32 33

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

34 35
static inline int Gia_ObjChild0Copy( Aig_Obj_t * pObj )  { return Abc_LitNotCond( Aig_ObjFanin0(pObj)->iData, Aig_ObjFaninC0(pObj) ); }
static inline int Gia_ObjChild1Copy( Aig_Obj_t * pObj )  { return Abc_LitNotCond( Aig_ObjFanin1(pObj)->iData, Aig_ObjFaninC1(pObj) ); }
Alan Mishchenko committed
36 37 38 39 40 41 42 43 44 45

static inline Aig_Obj_t * Gia_ObjChild0Copy2( Aig_Obj_t ** ppNodes, Gia_Obj_t * pObj, int Id )  { return Aig_NotCond( ppNodes[Gia_ObjFaninId0(pObj, Id)], Gia_ObjFaninC0(pObj) ); }
static inline Aig_Obj_t * Gia_ObjChild1Copy2( Aig_Obj_t ** ppNodes, Gia_Obj_t * pObj, int Id )  { return Aig_NotCond( ppNodes[Gia_ObjFaninId1(pObj, Id)], Gia_ObjFaninC1(pObj) ); }

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

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

46
  Synopsis    [Duplicates AIG in the DFS order.]
Alan Mishchenko committed
47 48 49 50 51 52 53 54

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Alan Mishchenko committed
55
void Gia_ManFromAig_rec( Gia_Man_t * pNew, Aig_Man_t * p, Aig_Obj_t * pObj )
Alan Mishchenko committed
56
{
Alan Mishchenko committed
57 58
    Aig_Obj_t * pNext;
    if ( pObj->iData )
Alan Mishchenko committed
59 60
        return;
    assert( Aig_ObjIsNode(pObj) );
Alan Mishchenko committed
61 62
    Gia_ManFromAig_rec( pNew, p, Aig_ObjFanin0(pObj) );
    Gia_ManFromAig_rec( pNew, p, Aig_ObjFanin1(pObj) );
Alan Mishchenko committed
63
    pObj->iData = Gia_ManAppendAnd( pNew, Gia_ObjChild0Copy(pObj), Gia_ObjChild1Copy(pObj) );
Alan Mishchenko committed
64 65 66 67
    if ( p->pEquivs && (pNext = Aig_ObjEquiv(p, pObj)) )
    {
        int iObjNew, iNextNew;
        Gia_ManFromAig_rec( pNew, p, pNext );
68 69
        iObjNew  = Abc_Lit2Var(pObj->iData);
        iNextNew = Abc_Lit2Var(pNext->iData);
Alan Mishchenko committed
70 71 72
        if ( pNew->pNexts )
            pNew->pNexts[iObjNew] = iNextNew;        
    }
Alan Mishchenko committed
73
}
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
Gia_Man_t * Gia_ManFromAig( Aig_Man_t * p )
{
    Gia_Man_t * pNew;
    Aig_Obj_t * pObj;
    int i;
    // create the new manager
    pNew = Gia_ManStart( Aig_ManObjNum(p) );
    pNew->pName = Abc_UtilStrsav( p->pName );
    pNew->pSpec = Abc_UtilStrsav( p->pSpec );
    pNew->nConstrs = p->nConstrs;
    // create room to store equivalences
    if ( p->pEquivs )
        pNew->pNexts = ABC_CALLOC( int, Aig_ManObjNum(p) );
    // create the PIs
    Aig_ManCleanData( p );
    Aig_ManConst1(p)->iData = 1;
    Aig_ManForEachCi( p, pObj, i )
        pObj->iData = Gia_ManAppendCi( pNew );
    // add logic for the POs
    Aig_ManForEachCo( p, pObj, i )
        Gia_ManFromAig_rec( pNew, p, Aig_ObjFanin0(pObj) );        
    Aig_ManForEachCo( p, pObj, i )
        Gia_ManAppendCo( pNew, Gia_ObjChild0Copy(pObj) );
    Gia_ManSetRegNum( pNew, Aig_ManRegNum(p) );
    if ( pNew->pNexts )
        Gia_ManDeriveReprs( pNew );
    return pNew;
}
Alan Mishchenko committed
102 103 104 105 106 107 108 109 110 111 112 113

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

  Synopsis    [Duplicates AIG in the DFS order.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
void Gia_ManFromAigChoices_rec( Gia_Man_t * pNew, Aig_Man_t * p, Aig_Obj_t * pObj )
{
    if ( pObj == NULL || pObj->iData )
        return;
    assert( Aig_ObjIsNode(pObj) );
    Gia_ManFromAigChoices_rec( pNew, p, Aig_ObjFanin0(pObj) );
    Gia_ManFromAigChoices_rec( pNew, p, Aig_ObjFanin1(pObj) );
    Gia_ManFromAigChoices_rec( pNew, p, Aig_ObjEquiv(p, pObj) );
    pObj->iData = Gia_ManAppendAnd( pNew, Gia_ObjChild0Copy(pObj), Gia_ObjChild1Copy(pObj) );
    if ( Aig_ObjEquiv(p, pObj) )
    {
        int iObjNew, iNextNew;
        iObjNew  = Abc_Lit2Var(pObj->iData);
        iNextNew = Abc_Lit2Var(Aig_ObjEquiv(p, pObj)->iData);
        assert( iObjNew > iNextNew );
        assert( Gia_ObjIsAnd(Gia_ManObj(pNew, iNextNew)) );
        pNew->pSibls[iObjNew] = iNextNew;        
    }
}
Gia_Man_t * Gia_ManFromAigChoices( Aig_Man_t * p )
Alan Mishchenko committed
134 135 136 137
{
    Gia_Man_t * pNew;
    Aig_Obj_t * pObj;
    int i;
138
    assert( p->pEquivs != NULL );
Alan Mishchenko committed
139 140
    // create the new manager
    pNew = Gia_ManStart( Aig_ManObjNum(p) );
141
    pNew->pName = Abc_UtilStrsav( p->pName );
142
    pNew->pSpec = Abc_UtilStrsav( p->pSpec );
143
    pNew->nConstrs = p->nConstrs;
Alan Mishchenko committed
144
    // create room to store equivalences
145
    pNew->pSibls = ABC_CALLOC( int, Aig_ManObjNum(p) );
Alan Mishchenko committed
146 147 148
    // create the PIs
    Aig_ManCleanData( p );
    Aig_ManConst1(p)->iData = 1;
149
    Aig_ManForEachCi( p, pObj, i )
Alan Mishchenko committed
150
        pObj->iData = Gia_ManAppendCi( pNew );
Alan Mishchenko committed
151
    // add logic for the POs
152
    Aig_ManForEachCo( p, pObj, i )
153
        Gia_ManFromAigChoices_rec( pNew, p, Aig_ObjFanin0(pObj) );        
154
    Aig_ManForEachCo( p, pObj, i )
Alan Mishchenko committed
155 156
        Gia_ManAppendCo( pNew, Gia_ObjChild0Copy(pObj) );
    Gia_ManSetRegNum( pNew, Aig_ManRegNum(p) );
157
    //assert( Gia_ManObjNum(pNew) == Aig_ManObjNum(p) );
Alan Mishchenko committed
158 159 160 161 162
    return pNew;
}

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

Alan Mishchenko committed
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
  Synopsis    [Duplicates AIG in the DFS order.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Gia_Man_t * Gia_ManFromAigSimple( Aig_Man_t * p )
{
    Gia_Man_t * pNew;
    Aig_Obj_t * pObj;
    int i;
    // create the new manager
    pNew = Gia_ManStart( Aig_ManObjNum(p) );
179
    pNew->pName = Abc_UtilStrsav( p->pName );
180
    pNew->pSpec = Abc_UtilStrsav( p->pSpec );
181
    pNew->nConstrs = p->nConstrs;
Alan Mishchenko committed
182 183 184 185 186 187
    // create the PIs
    Aig_ManCleanData( p );
    Aig_ManForEachObj( p, pObj, i )
    {
        if ( Aig_ObjIsAnd(pObj) )
            pObj->iData = Gia_ManAppendAnd( pNew, Gia_ObjChild0Copy(pObj), Gia_ObjChild1Copy(pObj) );
188
        else if ( Aig_ObjIsCi(pObj) )
Alan Mishchenko committed
189
            pObj->iData = Gia_ManAppendCi( pNew );
190
        else if ( Aig_ObjIsCo(pObj) )
Alan Mishchenko committed
191 192 193 194 195 196 197 198 199 200 201 202
            pObj->iData = Gia_ManAppendCo( pNew, Gia_ObjChild0Copy(pObj) );
        else if ( Aig_ObjIsConst1(pObj) )
            pObj->iData = 1;
        else
            assert( 0 );
    }
    Gia_ManSetRegNum( pNew, Aig_ManRegNum(p) );
    return pNew;
}

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

Alan Mishchenko committed
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
  Synopsis    [Handles choices as additional combinational outputs.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Gia_Man_t * Gia_ManFromAigSwitch( Aig_Man_t * p )
{
    Gia_Man_t * pNew;
    Aig_Obj_t * pObj;
    int i;
    // create the new manager
    pNew = Gia_ManStart( Aig_ManObjNum(p) );
219
    pNew->pName = Abc_UtilStrsav( p->pName );
220
    pNew->pSpec = Abc_UtilStrsav( p->pSpec );
221
    pNew->nConstrs = p->nConstrs;
Alan Mishchenko committed
222 223 224
    // create the PIs
    Aig_ManCleanData( p );
    Aig_ManConst1(p)->iData = 1;
225
    Aig_ManForEachCi( p, pObj, i )
Alan Mishchenko committed
226 227 228 229 230
        pObj->iData = Gia_ManAppendCi( pNew );
    // add POs corresponding to the nodes with choices
    Aig_ManForEachNode( p, pObj, i )
        if ( Aig_ObjRefs(pObj) == 0 )
        {
Alan Mishchenko committed
231
            Gia_ManFromAig_rec( pNew, p, pObj );        
Alan Mishchenko committed
232 233 234
            Gia_ManAppendCo( pNew, pObj->iData );
        }
    // add logic for the POs
235
    Aig_ManForEachCo( p, pObj, i )
Alan Mishchenko committed
236
        Gia_ManFromAig_rec( pNew, p, Aig_ObjFanin0(pObj) );        
237
    Aig_ManForEachCo( p, pObj, i )
238
        pObj->iData = Gia_ManAppendCo( pNew, Gia_ObjChild0Copy(pObj) );
Alan Mishchenko committed
239 240 241 242 243 244
    Gia_ManSetRegNum( pNew, Aig_ManRegNum(p) );
    return pNew;
}

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

245
  Synopsis    [Duplicates AIG in the DFS order.]
Alan Mishchenko committed
246 247 248 249 250 251 252 253 254 255

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Gia_ManToAig_rec( Aig_Man_t * pNew, Aig_Obj_t ** ppNodes, Gia_Man_t * p, Gia_Obj_t * pObj )
{
Alan Mishchenko committed
256
    Gia_Obj_t * pNext;
Alan Mishchenko committed
257 258 259
    if ( ppNodes[Gia_ObjId(p, pObj)] )
        return;
    if ( Gia_ObjIsCi(pObj) )
260
        ppNodes[Gia_ObjId(p, pObj)] = Aig_ObjCreateCi( pNew );
Alan Mishchenko committed
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275
    else
    {
        assert( Gia_ObjIsAnd(pObj) );
        Gia_ManToAig_rec( pNew, ppNodes, p, Gia_ObjFanin0(pObj) );
        Gia_ManToAig_rec( pNew, ppNodes, p, Gia_ObjFanin1(pObj) );
        ppNodes[Gia_ObjId(p, pObj)] = Aig_And( pNew, Gia_ObjChild0Copy2(ppNodes, pObj, Gia_ObjId(p, pObj)), Gia_ObjChild1Copy2(ppNodes, pObj, Gia_ObjId(p, pObj)) );
    }
    if ( pNew->pEquivs && (pNext = Gia_ObjNextObj(p, Gia_ObjId(p, pObj))) )
    {
        Aig_Obj_t * pObjNew, * pNextNew;
        Gia_ManToAig_rec( pNew, ppNodes, p, pNext );
        pObjNew  = ppNodes[Gia_ObjId(p, pObj)];
        pNextNew = ppNodes[Gia_ObjId(p, pNext)];
        if ( pNew->pEquivs )
            pNew->pEquivs[Aig_Regular(pObjNew)->Id] = Aig_Regular(pNextNew);        
Alan Mishchenko committed
276 277
    }
}
Alan Mishchenko committed
278
Aig_Man_t * Gia_ManToAig( Gia_Man_t * p, int fChoices )
Alan Mishchenko committed
279 280 281 282 283
{
    Aig_Man_t * pNew;
    Aig_Obj_t ** ppNodes;
    Gia_Obj_t * pObj;
    int i;
Alan Mishchenko committed
284
    assert( !fChoices || (p->pNexts && p->pReprs) );
Alan Mishchenko committed
285 286
    // create the new manager
    pNew = Aig_ManStart( Gia_ManAndNum(p) );
287
    pNew->pName = Abc_UtilStrsav( p->pName );
288
    pNew->pSpec = Abc_UtilStrsav( p->pSpec );
289
    pNew->nConstrs = p->nConstrs;
290
//    pNew->pSpec = Abc_UtilStrsav( p->pName );
Alan Mishchenko committed
291 292 293
    // duplicate representation of choice nodes
    if ( fChoices )
        pNew->pEquivs = ABC_CALLOC( Aig_Obj_t *, Gia_ManObjNum(p) );
Alan Mishchenko committed
294
    // create the PIs
Alan Mishchenko committed
295
    ppNodes = ABC_CALLOC( Aig_Obj_t *, Gia_ManObjNum(p) );
Alan Mishchenko committed
296 297
    ppNodes[0] = Aig_ManConst0(pNew);
    Gia_ManForEachCi( p, pObj, i )
298
        ppNodes[Gia_ObjId(p, pObj)] = Aig_ObjCreateCi( pNew );
299 300 301 302
    // transfer level
    if ( p->vLevels )
    Gia_ManForEachCi( p, pObj, i )
        Aig_ObjSetLevel( ppNodes[Gia_ObjId(p, pObj)], Gia_ObjLevel(p, pObj) );
Alan Mishchenko committed
303 304 305 306
    // add logic for the POs
    Gia_ManForEachCo( p, pObj, i )
    {
        Gia_ManToAig_rec( pNew, ppNodes, p, Gia_ObjFanin0(pObj) );        
307
        ppNodes[Gia_ObjId(p, pObj)] = Aig_ObjCreateCo( pNew, Gia_ObjChild0Copy2(ppNodes, pObj, Gia_ObjId(p, pObj)) );
Alan Mishchenko committed
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334
    }
    Aig_ManSetRegNum( pNew, Gia_ManRegNum(p) );
    ABC_FREE( ppNodes );
    return pNew;
}

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

  Synopsis    [Duplicates AIG in the DFS order.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Aig_Man_t * Gia_ManToAigSkip( Gia_Man_t * p, int nOutDelta )
{
    Aig_Man_t * pNew;
    Aig_Obj_t ** ppNodes;
    Gia_Obj_t * pObj;
    int i;
    assert( p->pNexts == NULL && p->pReprs == NULL );
    assert( nOutDelta > 0 && Gia_ManCoNum(p) % nOutDelta == 0 );
    // create the new manager
    pNew = Aig_ManStart( Gia_ManAndNum(p) );
335
    pNew->pName = Abc_UtilStrsav( p->pName );
336
    pNew->pSpec = Abc_UtilStrsav( p->pSpec );
337
    pNew->nConstrs = p->nConstrs;
338
//    pNew->pSpec = Abc_UtilStrsav( p->pName );
Alan Mishchenko committed
339 340 341 342
    // create the PIs
    ppNodes = ABC_CALLOC( Aig_Obj_t *, Gia_ManObjNum(p) );
    ppNodes[0] = Aig_ManConst0(pNew);
    Gia_ManForEachCi( p, pObj, i )
343
        ppNodes[Gia_ObjId(p, pObj)] = Aig_ObjCreateCi( pNew );
Alan Mishchenko committed
344 345 346 347 348 349
    // add logic for the POs
    Gia_ManForEachCo( p, pObj, i )
    {
        Gia_ManToAig_rec( pNew, ppNodes, p, Gia_ObjFanin0(pObj) );        
        if ( i % nOutDelta != 0 )
            continue;
350
        ppNodes[Gia_ObjId(p, pObj)] = Aig_ObjCreateCo( pNew, Gia_ObjChild0Copy2(ppNodes, pObj, Gia_ObjId(p, pObj)) );
Alan Mishchenko committed
351 352 353 354 355 356
    }
    Aig_ManSetRegNum( pNew, Gia_ManRegNum(p) );
    ABC_FREE( ppNodes );
    return pNew;
}

Alan Mishchenko committed
357 358 359 360 361 362 363 364 365 366 367
/**Function*************************************************************

  Synopsis    [Duplicates AIG in the DFS order.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
368 369 370 371 372 373
Aig_Man_t * Gia_ManToAigSimple( Gia_Man_t * p )
{
    Aig_Man_t * pNew;
    Aig_Obj_t ** ppNodes;
    Gia_Obj_t * pObj;
    int i;
374
    ppNodes = ABC_FALLOC( Aig_Obj_t *, Gia_ManObjNum(p) );
375 376
    // create the new manager
    pNew = Aig_ManStart( Gia_ManObjNum(p) );
377
    pNew->pName = Abc_UtilStrsav( p->pName );
378
    pNew->pSpec = Abc_UtilStrsav( p->pSpec );
379 380 381 382 383 384 385
    pNew->nConstrs = p->nConstrs;
    // create the PIs
    Gia_ManForEachObj( p, pObj, i )
    {
        if ( Gia_ObjIsAnd(pObj) )
            ppNodes[i] = Aig_And( pNew, Gia_ObjChild0Copy2(ppNodes, pObj, Gia_ObjId(p, pObj)), Gia_ObjChild1Copy2(ppNodes, pObj, Gia_ObjId(p, pObj)) );
        else if ( Gia_ObjIsCi(pObj) )
386
            ppNodes[i] = Aig_ObjCreateCi( pNew );
387
        else if ( Gia_ObjIsCo(pObj) )
388
            ppNodes[i] = Aig_ObjCreateCo( pNew, Gia_ObjChild0Copy2(ppNodes, pObj, Gia_ObjId(p, pObj)) );
389 390 391 392
        else if ( Gia_ObjIsConst0(pObj) )
            ppNodes[i] = Aig_ManConst0(pNew);
        else
            assert( 0 );
393
        pObj->Value = Abc_Var2Lit( Aig_ObjId(Aig_Regular(ppNodes[i])), Aig_IsComplement(ppNodes[i]) );
Alan Mishchenko committed
394
        assert( i == 0 || Aig_ObjId(ppNodes[i]) == i );
395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411
    }
    Aig_ManSetRegNum( pNew, Gia_ManRegNum(p) );
    ABC_FREE( ppNodes );
    return pNew;
}

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

  Synopsis    [Duplicates AIG in the DFS order.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Alan Mishchenko committed
412 413 414 415 416 417 418
Aig_Man_t * Gia_ManCofactorAig( Aig_Man_t * p, int nFrames, int nCofFanLit )
{
    Aig_Man_t * pMan;
    Gia_Man_t * pGia, * pTemp;
    pGia = Gia_ManFromAig( p );
    pGia = Gia_ManUnrollAndCofactor( pTemp = pGia, nFrames, nCofFanLit, 1 );
    Gia_ManStop( pTemp );
Alan Mishchenko committed
419
    pMan = Gia_ManToAig( pGia, 0 );
Alan Mishchenko committed
420 421 422 423
    Gia_ManStop( pGia );
    return pMan;
}

Alan Mishchenko committed
424 425 426 427 428

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

  Synopsis    [Transfers representatives from pGia to pAig.]

429
  Description [Assumes that pGia was created from pAig.]
Alan Mishchenko committed
430 431 432 433 434 435
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
436
void Gia_ManReprToAigRepr( Aig_Man_t * pAig, Gia_Man_t * pGia )
Alan Mishchenko committed
437 438 439 440
{
    Aig_Obj_t * pObj;
    Gia_Obj_t * pGiaObj, * pGiaRepr;
    int i;
441
    assert( pAig->pReprs == NULL );
Alan Mishchenko committed
442 443
    assert( pGia->pReprs != NULL );
    // move pointers from AIG to GIA
444
    Aig_ManForEachObj( pAig, pObj, i )
Alan Mishchenko committed
445
    {
446 447
        assert( i == 0 || !Abc_LitIsCompl(pObj->iData) );
        pGiaObj = Gia_ManObj( pGia, Abc_Lit2Var(pObj->iData) );
Alan Mishchenko committed
448 449 450
        pGiaObj->Value = i;
    }
    // set the pointers to the nodes in AIG
451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467
    Aig_ManReprStart( pAig, Aig_ManObjNumMax(pAig) );
    Gia_ManForEachObj( pGia, pGiaObj, i )
    {
        pGiaRepr = Gia_ObjReprObj( pGia, i );
        if ( pGiaRepr == NULL )
            continue;
        Aig_ObjCreateRepr( pAig, Aig_ManObj(pAig, pGiaRepr->Value), Aig_ManObj(pAig, pGiaObj->Value) );
    }
}
void Gia_ManReprToAigRepr2( Aig_Man_t * pAig, Gia_Man_t * pGia )
{
    Gia_Obj_t * pGiaObj, * pGiaRepr;
    int i;
    assert( pAig->pReprs == NULL );
    assert( pGia->pReprs != NULL );
    // set the pointers to the nodes in AIG
    Aig_ManReprStart( pAig, Aig_ManObjNumMax(pAig) );
Alan Mishchenko committed
468 469 470 471 472
    Gia_ManForEachObj( pGia, pGiaObj, i )
    {
        pGiaRepr = Gia_ObjReprObj( pGia, i );
        if ( pGiaRepr == NULL )
            continue;
473
        Aig_ObjCreateRepr( pAig, Aig_ManObj(pAig, Abc_Lit2Var(pGiaRepr->Value)), Aig_ManObj(pAig, Abc_Lit2Var(pGiaObj->Value)) );
Alan Mishchenko committed
474 475 476
    }
}

Alan Mishchenko committed
477 478
/**Function*************************************************************

479
  Synopsis    [Transfers representatives from pAig to pGia.]
Alan Mishchenko committed
480 481 482 483 484 485 486 487

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
488
void Gia_ManReprFromAigRepr( Aig_Man_t * pAig, Gia_Man_t * pGia )
Alan Mishchenko committed
489
{
490 491 492 493 494
    Gia_Obj_t * pObjGia; 
    Aig_Obj_t * pObjAig, * pReprAig;
    int i;
    assert( pAig->pReprs != NULL );
    assert( pGia->pReprs == NULL );
495
    assert( Gia_ManObjNum(pGia) - Gia_ManCoNum(pGia) == Aig_ManObjNum(pAig) - Aig_ManCoNum(pAig) );
496 497 498
    pGia->pReprs = ABC_CALLOC( Gia_Rpr_t, Gia_ManObjNum(pGia) );
    for ( i = 0; i < Gia_ManObjNum(pGia); i++ )
        Gia_ObjSetRepr( pGia, i, GIA_VOID );
499
    // move pointers from GIA to AIG
500 501 502 503
    Gia_ManForEachObj( pGia, pObjGia, i )
    {
        if ( Gia_ObjIsCo(pObjGia) )
            continue;
504 505
        assert( i == 0 || !Abc_LitIsCompl(Gia_ObjValue(pObjGia)) );
        pObjAig  = Aig_ManObj( pAig, Abc_Lit2Var(Gia_ObjValue(pObjGia)) );
506 507 508 509
        pObjAig->iData = i;
    }
    Aig_ManForEachObj( pAig, pObjAig, i )
    {
510
        if ( Aig_ObjIsCo(pObjAig) )
511 512 513 514 515 516 517 518
            continue;
        if ( pAig->pReprs[i] == NULL )
            continue;
        pReprAig = pAig->pReprs[i];
        Gia_ObjSetRepr( pGia, pObjAig->iData, pReprAig->iData );
    }
    pGia->pNexts = Gia_ManDeriveNexts( pGia );
}
519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539
void Gia_ManReprFromAigRepr2( Aig_Man_t * pAig, Gia_Man_t * pGia )
{
    Aig_Obj_t * pObjAig, * pReprAig;
    int i;
    assert( pAig->pReprs != NULL );
    assert( pGia->pReprs == NULL );
    assert( Gia_ManObjNum(pGia) - Gia_ManCoNum(pGia) == Aig_ManObjNum(pAig) - Aig_ManCoNum(pAig) );
    pGia->pReprs = ABC_CALLOC( Gia_Rpr_t, Gia_ManObjNum(pGia) );
    for ( i = 0; i < Gia_ManObjNum(pGia); i++ )
        Gia_ObjSetRepr( pGia, i, GIA_VOID );
    Aig_ManForEachObj( pAig, pObjAig, i )
    {
        if ( Aig_ObjIsCo(pObjAig) )
            continue;
        if ( pAig->pReprs[i] == NULL )
            continue;
        pReprAig = pAig->pReprs[i];
        Gia_ObjSetRepr( pGia, Abc_Lit2Var(pObjAig->iData), Abc_Lit2Var(pReprAig->iData) );
    }
    pGia->pNexts = Gia_ManDeriveNexts( pGia );
}
540 541 542 543 544 545 546 547 548 549 550 551 552 553

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

  Synopsis    [Applies DC2 to the GIA manager.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Gia_Man_t * Gia_ManCompress2( Gia_Man_t * p, int fUpdateLevel, int fVerbose )
{
Alan Mishchenko committed
554 555
    Gia_Man_t * pGia;
    Aig_Man_t * pNew, * pTemp;
556 557
    if ( p->pManTime && p->vLevels == NULL )
        Gia_ManLevelWithBoxes( p );
Alan Mishchenko committed
558
    pNew = Gia_ManToAig( p, 0 );
559
    pNew = Dar_ManCompress2( pTemp = pNew, 1, fUpdateLevel, 1, 0, fVerbose );
Alan Mishchenko committed
560 561 562
    Aig_ManStop( pTemp );
    pGia = Gia_ManFromAig( pNew );
    Aig_ManStop( pNew );
563
    Gia_ManTransferTiming( pGia, p );
Alan Mishchenko committed
564 565 566
    return pGia;
}

567 568 569 570 571 572 573 574 575 576 577 578 579
/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Gia_Man_t * Gia_ManPerformDch( Gia_Man_t * p, void * pPars )
{
580
    int fUseMapping = 0;
581
    Gia_Man_t * pGia, * pGia1;
582
    Aig_Man_t * pNew;
583 584
    if ( p->pManTime && p->vLevels == NULL )
        Gia_ManLevelWithBoxes( p );
585
    if ( fUseMapping && Gia_ManHasMapping(p) )
586 587 588 589 590
        pGia1 = (Gia_Man_t *)Dsm_ManDeriveGia( p, 0 );
    else
        pGia1 = Gia_ManDup( p );
    pNew = Gia_ManToAig( pGia1, 0 );
    Gia_ManStop( pGia1 );
591
    pNew = Dar_ManChoiceNew( pNew, (Dch_Pars_t *)pPars );
592 593
//    pGia = Gia_ManFromAig( pNew );
    pGia = Gia_ManFromAigChoices( pNew );
594
    Aig_ManStop( pNew );
595
    Gia_ManTransferTiming( pGia, p );
596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613
    return pGia;
}

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

  Synopsis    [Computes equivalences after structural sequential cleanup.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Gia_ManSeqCleanupClasses( Gia_Man_t * p, int fConst, int fEquiv, int fVerbose )
{
    Aig_Man_t * pNew, * pTemp;
    pNew  = Gia_ManToAigSimple( p );
614
    pTemp = Aig_ManScl( pNew, fConst, fEquiv, 0, -1, -1, fVerbose, 0 );
615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632
    Gia_ManReprFromAigRepr( pNew, p );
    Aig_ManStop( pTemp );
    Aig_ManStop( pNew );
}

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

  Synopsis    [Solves SAT problem.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
int Gia_ManSolveSat( Gia_Man_t * p )
{
633
//    extern int Fra_FraigSat( Aig_Man_t * pMan, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, int fFlipBits, int fAndOuts, int fNewSolver, int fVerbose );
634
    Aig_Man_t * pNew;
635
    int RetValue;//, clk = Abc_Clock();
636
    pNew = Gia_ManToAig( p, 0 );
637
    RetValue = Fra_FraigSat( pNew, 10000000, 0, 0, 0, 0, 1, 1, 0, 0 );
638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662
    if ( RetValue == 0 )
    {
        Gia_Obj_t * pObj;
        int i, * pInit = (int *)pNew->pData;
        Gia_ManConst0(p)->fMark0 = 0;
        Gia_ManForEachPi( p, pObj, i )
            pObj->fMark0 = pInit[i];
        Gia_ManForEachAnd( p, pObj, i )
            pObj->fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) & 
                           (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj));
        Gia_ManForEachPo( p, pObj, i )
            pObj->fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj));
        Gia_ManForEachPo( p, pObj, i )
            if ( pObj->fMark0 != 1 )
                break;
        if ( i != Gia_ManPoNum(p) )
            Abc_Print( 1, "Counter-example verification has failed.  " );
//        else
//            Abc_Print( 1, "Counter-example verification succeeded.  " );
    }
/*
    else if ( RetValue == 1 )
        Abc_Print( 1, "The SAT problem is unsatisfiable.  " );
    else if ( RetValue == -1 )
        Abc_Print( 1, "The SAT problem is undecided.  " );
663
    Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
664 665 666 667 668 669
*/
    Aig_ManStop( pNew );
    return RetValue;
}


Alan Mishchenko committed
670 671 672 673 674
////////////////////////////////////////////////////////////////////////
///                       END OF FILE                                ///
////////////////////////////////////////////////////////////////////////


675 676
ABC_NAMESPACE_IMPL_END