1 /**CFile****************************************************************
2 
3   FileName    [nwkObj.c]
4 
5   SystemName  [ABC: Logic synthesis and verification system.]
6 
7   PackageName [Logic network representation.]
8 
9   Synopsis    [Manipulation of objects.]
10 
11   Author      [Alan Mishchenko]
12 
13   Affiliation [UC Berkeley]
14 
15   Date        [Ver. 1.0. Started - June 20, 2005.]
16 
17   Revision    [$Id: nwkObj.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
18 
19 ***********************************************************************/
20 
21 #include "nwk.h"
22 
23 ABC_NAMESPACE_IMPL_START
24 
25 
26 ////////////////////////////////////////////////////////////////////////
27 ///                        DECLARATIONS                              ///
28 ////////////////////////////////////////////////////////////////////////
29 
30 ////////////////////////////////////////////////////////////////////////
31 ///                     FUNCTION DEFINITIONS                         ///
32 ////////////////////////////////////////////////////////////////////////
33 
34 /**Function*************************************************************
35 
36   Synopsis    [Creates an object.]
37 
38   Description []
39 
40   SideEffects []
41 
42   SeeAlso     []
43 
44 ***********************************************************************/
Nwk_ManCreateObj(Nwk_Man_t * p,int nFanins,int nFanouts)45 Nwk_Obj_t * Nwk_ManCreateObj( Nwk_Man_t * p, int nFanins, int nFanouts )
46 {
47     Nwk_Obj_t * pObj;
48     pObj = (Nwk_Obj_t *)Aig_MmFlexEntryFetch( p->pMemObjs, sizeof(Nwk_Obj_t) + (nFanins + nFanouts + p->nFanioPlus) * sizeof(Nwk_Obj_t *) );
49     memset( pObj, 0, sizeof(Nwk_Obj_t) );
50     pObj->pFanio = (Nwk_Obj_t **)((char *)pObj + sizeof(Nwk_Obj_t));
51     pObj->Id = Vec_PtrSize( p->vObjs );
52     Vec_PtrPush( p->vObjs, pObj );
53     pObj->pMan        = p;
54     pObj->nFanioAlloc = nFanins + nFanouts + p->nFanioPlus;
55     return pObj;
56 }
57 
58 
59 /**Function*************************************************************
60 
61   Synopsis    [Creates a primary input.]
62 
63   Description []
64 
65   SideEffects []
66 
67   SeeAlso     []
68 
69 ***********************************************************************/
Nwk_ManCreateCi(Nwk_Man_t * p,int nFanouts)70 Nwk_Obj_t * Nwk_ManCreateCi( Nwk_Man_t * p, int nFanouts )
71 {
72     Nwk_Obj_t * pObj;
73     pObj = Nwk_ManCreateObj( p, 1, nFanouts );
74     pObj->PioId = Vec_PtrSize( p->vCis );
75     Vec_PtrPush( p->vCis, pObj );
76     pObj->Type = NWK_OBJ_CI;
77     p->nObjs[NWK_OBJ_CI]++;
78     return pObj;
79 }
80 
81 /**Function*************************************************************
82 
83   Synopsis    [Creates a primary output.]
84 
85   Description []
86 
87   SideEffects []
88 
89   SeeAlso     []
90 
91 ***********************************************************************/
Nwk_ManCreateCo(Nwk_Man_t * p)92 Nwk_Obj_t * Nwk_ManCreateCo( Nwk_Man_t * p )
93 {
94     Nwk_Obj_t * pObj;
95     pObj = Nwk_ManCreateObj( p, 1, 1 );
96     pObj->PioId = Vec_PtrSize( p->vCos );
97     Vec_PtrPush( p->vCos, pObj );
98     pObj->Type = NWK_OBJ_CO;
99     p->nObjs[NWK_OBJ_CO]++;
100     return pObj;
101 }
102 
103 /**Function*************************************************************
104 
105   Synopsis    [Creates a latch.]
106 
107   Description []
108 
109   SideEffects []
110 
111   SeeAlso     []
112 
113 ***********************************************************************/
Nwk_ManCreateLatch(Nwk_Man_t * p)114 Nwk_Obj_t * Nwk_ManCreateLatch( Nwk_Man_t * p )
115 {
116     Nwk_Obj_t * pObj;
117     pObj = Nwk_ManCreateObj( p, 1, 1 );
118     pObj->Type = NWK_OBJ_LATCH;
119     p->nObjs[NWK_OBJ_LATCH]++;
120     return pObj;
121 }
122 
123 /**Function*************************************************************
124 
125   Synopsis    [Creates a node.]
126 
127   Description []
128 
129   SideEffects []
130 
131   SeeAlso     []
132 
133 ***********************************************************************/
Nwk_ManCreateNode(Nwk_Man_t * p,int nFanins,int nFanouts)134 Nwk_Obj_t * Nwk_ManCreateNode( Nwk_Man_t * p, int nFanins, int nFanouts )
135 {
136     Nwk_Obj_t * pObj;
137     pObj = Nwk_ManCreateObj( p, nFanins, nFanouts );
138     pObj->Type = NWK_OBJ_NODE;
139     p->nObjs[NWK_OBJ_NODE]++;
140     return pObj;
141 }
142 
143 
144 /**Function*************************************************************
145 
146   Synopsis    [Deletes the node.]
147 
148   Description []
149 
150   SideEffects []
151 
152   SeeAlso     []
153 
154 ***********************************************************************/
Nwk_ManDeleteNode(Nwk_Obj_t * pObj)155 void Nwk_ManDeleteNode( Nwk_Obj_t * pObj )
156 {
157     Vec_Ptr_t * vNodes = pObj->pMan->vTemp;
158     Nwk_Obj_t * pTemp;
159     int i;
160     assert( Nwk_ObjFanoutNum(pObj) == 0 );
161     // delete fanins
162     Nwk_ObjCollectFanins( pObj, vNodes );
163     Vec_PtrForEachEntry( Nwk_Obj_t *, vNodes, pTemp, i )
164         Nwk_ObjDeleteFanin( pObj, pTemp );
165     // remove from the list of objects
166     Vec_PtrWriteEntry( pObj->pMan->vObjs, pObj->Id, NULL );
167     pObj->pMan->nObjs[pObj->Type]--;
168     memset( pObj, 0, sizeof(Nwk_Obj_t) );
169     pObj->Id = -1;
170 }
171 
172 /**Function*************************************************************
173 
174   Synopsis    [Deletes the node and MFFC of the node.]
175 
176   Description []
177 
178   SideEffects []
179 
180   SeeAlso     []
181 
182 ***********************************************************************/
Nwk_ManDeleteNode_rec(Nwk_Obj_t * pObj)183 void Nwk_ManDeleteNode_rec( Nwk_Obj_t * pObj )
184 {
185     Vec_Ptr_t * vNodes;
186     int i;
187     assert( !Nwk_ObjIsCi(pObj) );
188     assert( Nwk_ObjFanoutNum(pObj) == 0 );
189     vNodes = Vec_PtrAlloc( 100 );
190     Nwk_ObjCollectFanins( pObj, vNodes );
191     Nwk_ManDeleteNode( pObj );
192     Vec_PtrForEachEntry( Nwk_Obj_t *, vNodes, pObj, i )
193         if ( Nwk_ObjIsNode(pObj) && Nwk_ObjFanoutNum(pObj) == 0 )
194             Nwk_ManDeleteNode_rec( pObj );
195     Vec_PtrFree( vNodes );
196 }
197 
198 ////////////////////////////////////////////////////////////////////////
199 ///                       END OF FILE                                ///
200 ////////////////////////////////////////////////////////////////////////
201 
202 
203 ABC_NAMESPACE_IMPL_END
204 
205