summaryrefslogtreecommitdiffstats
path: root/src/aig/cec/cecAig.c
blob: 2a6f5683b869f9cd7fa017290f547fb7b27c7080 (plain)
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
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/**CFile****************************************************************

  FileName    [cecAig.c]

  SystemName  [ABC: Logic synthesis and verification system.]

  PackageName [Combinatinoal equivalence checking.]

  Synopsis    [AIG manipulation.]

  Author      [Alan Mishchenko]
  
  Affiliation [UC Berkeley]

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

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

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

#include "cecInt.h"

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

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

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

  Synopsis    [Derives combinational miter of the two AIGs.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Aig_Obj_t * Cec_DeriveMiter_rec( Aig_Man_t * pNew, Aig_Obj_t * pObj )
{
    if ( pObj->pData )
        return pObj->pData;
    Cec_DeriveMiter_rec( pNew, Aig_ObjFanin0(pObj) );
    if ( Aig_ObjIsBuf(pObj) )
        return pObj->pData = Aig_ObjChild0Copy(pObj);
    Cec_DeriveMiter_rec( pNew, Aig_ObjFanin1(pObj) );
    pObj->pData = Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
    Aig_Regular(pObj->pData)->pHaig = pObj->pHaig;
    return pObj->pData;
}

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

  Synopsis    [Derives combinational miter of the two AIGs.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Aig_Man_t * Cec_DeriveMiter( Aig_Man_t * p0, Aig_Man_t * p1 )
{
    Bar_Progress_t * pProgress = NULL;
    Aig_Man_t * pNew;
    Aig_Obj_t * pObj0, * pObj1, * pObjNew;
    int i;
    assert( Aig_ManPiNum(p0) == Aig_ManPiNum(p1) );
    assert( Aig_ManPoNum(p0) == Aig_ManPoNum(p1) );
    // create the new manager
    pNew = Aig_ManStart( Aig_ManNodeNum(p0) + Aig_ManNodeNum(p1) );
    pNew->pName = Aig_UtilStrsav( p0->pName );
    // create the PIs
    Aig_ManCleanData( p0 );
    Aig_ManCleanData( p1 );
    Aig_ManConst1(p0)->pData = Aig_ManConst1(pNew);
    Aig_ManConst1(p1)->pData = Aig_ManConst1(pNew);
    Aig_ManForEachPi( p0, pObj0, i )
    {
        pObjNew = Aig_ObjCreatePi( pNew );
        pObj0->pData = pObjNew;
        Aig_ManPi(p1, i)->pData = pObjNew;
    }
    // add logic for the POs
    pProgress = Bar_ProgressStart( stdout, Aig_ManPoNum(p0) );
    Aig_ManForEachPo( p0, pObj0, i )
    {
        Bar_ProgressUpdate( pProgress, i, "Miter..." );
        pObj1 = Aig_ManPo( p1, i );
        Cec_DeriveMiter_rec( pNew, Aig_ObjFanin0(pObj0) );        
        Cec_DeriveMiter_rec( pNew, Aig_ObjFanin0(pObj1) );  
        pObjNew = Aig_Exor( pNew, Aig_ObjChild0Copy(pObj0), Aig_ObjChild0Copy(pObj1) );
        Aig_ObjCreatePo( pNew, pObjNew );
    }
    Bar_ProgressStop( pProgress );
    Aig_ManCleanup( pNew );
    Aig_ManSetRegNum( pNew, 0 );
    // check the resulting network
//    if ( !Aig_ManCheck(pNew) )
//        printf( "Cec_DeriveMiter(): The check has failed.\n" );
    return pNew;
}

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

  Synopsis    [Duplicates AIG in the DFS order.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Aig_Man_t * Cec_Duplicate( Aig_Man_t * p )
{
    Aig_Man_t * pNew;
    Aig_Obj_t * pObj;
    int i;
    // create the new manager
    pNew = Aig_ManStart( Aig_ManNodeNum(p) );
    pNew->pName = Aig_UtilStrsav( p->pName );
    // create the PIs
    Aig_ManCleanData( p );
    Aig_ManConst1(p)->pData = Aig_ManConst1(pNew);
    Aig_ManForEachPi( p, pObj, i )
        pObj->pData = Aig_ObjCreatePi( pNew );
    // add logic for the POs
    Aig_ManForEachPo( p, pObj, i )
    {
        Cec_DeriveMiter_rec( pNew, Aig_ObjFanin0(pObj) );        
        Aig_ObjCreatePo( pNew, Aig_ObjChild0Copy(pObj) );
    }
    Aig_ManCleanup( pNew );
    Aig_ManSetRegNum( pNew, 0 );
    assert( Aig_ManBufNum(p) != 0 || Aig_ManNodeNum(p) == Aig_ManNodeNum(pNew) );
    // check the resulting network
//    if ( !Aig_ManCheck(pNew) )
//        printf( "Cec_DeriveMiter(): The check has failed.\n" );
    return pNew;
}

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