ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
ivyFanout.c
Go to the documentation of this file.
1
20
21#include "ivy.h"
22
24
25
29
30// getting hold of the next fanout of the node
31static inline Ivy_Obj_t * Ivy_ObjNextFanout( Ivy_Obj_t * pObj, Ivy_Obj_t * pFanout )
32{
33 assert( !Ivy_IsComplement(pObj) );
34 assert( !Ivy_IsComplement(pFanout) );
35 if ( pFanout == NULL )
36 return NULL;
37 if ( Ivy_ObjFanin0(pFanout) == pObj )
38 return pFanout->pNextFan0;
39 assert( Ivy_ObjFanin1(pFanout) == pObj );
40 return pFanout->pNextFan1;
41}
42
43// getting hold of the previous fanout of the node
44static inline Ivy_Obj_t * Ivy_ObjPrevFanout( Ivy_Obj_t * pObj, Ivy_Obj_t * pFanout )
45{
46 assert( !Ivy_IsComplement(pObj) );
47 assert( !Ivy_IsComplement(pFanout) );
48 if ( pFanout == NULL )
49 return NULL;
50 if ( Ivy_ObjFanin0(pFanout) == pObj )
51 return pFanout->pPrevFan0;
52 assert( Ivy_ObjFanin1(pFanout) == pObj );
53 return pFanout->pPrevFan1;
54}
55
56// getting hold of the place where the next fanout will be attached
57static inline Ivy_Obj_t ** Ivy_ObjNextFanoutPlace( Ivy_Obj_t * pObj, Ivy_Obj_t * pFanout )
58{
59 assert( !Ivy_IsComplement(pObj) );
60 assert( !Ivy_IsComplement(pFanout) );
61 if ( Ivy_ObjFanin0(pFanout) == pObj )
62 return &pFanout->pNextFan0;
63 assert( Ivy_ObjFanin1(pFanout) == pObj );
64 return &pFanout->pNextFan1;
65}
66
67// getting hold of the place where the next fanout will be attached
68static inline Ivy_Obj_t ** Ivy_ObjPrevFanoutPlace( Ivy_Obj_t * pObj, Ivy_Obj_t * pFanout )
69{
70 assert( !Ivy_IsComplement(pObj) );
71 assert( !Ivy_IsComplement(pFanout) );
72 if ( Ivy_ObjFanin0(pFanout) == pObj )
73 return &pFanout->pPrevFan0;
74 assert( Ivy_ObjFanin1(pFanout) == pObj );
75 return &pFanout->pPrevFan1;
76}
77
78// getting hold of the place where the next fanout will be attached
79static inline Ivy_Obj_t ** Ivy_ObjPrevNextFanoutPlace( Ivy_Obj_t * pObj, Ivy_Obj_t * pFanout )
80{
81 Ivy_Obj_t * pTemp;
82 assert( !Ivy_IsComplement(pObj) );
83 assert( !Ivy_IsComplement(pFanout) );
84 pTemp = Ivy_ObjPrevFanout(pObj, pFanout);
85 if ( pTemp == NULL )
86 return &pObj->pFanout;
87 if ( Ivy_ObjFanin0(pTemp) == pObj )
88 return &pTemp->pNextFan0;
89 assert( Ivy_ObjFanin1(pTemp) == pObj );
90 return &pTemp->pNextFan1;
91}
92
93// getting hold of the place where the next fanout will be attached
94static inline Ivy_Obj_t ** Ivy_ObjNextPrevFanoutPlace( Ivy_Obj_t * pObj, Ivy_Obj_t * pFanout )
95{
96 Ivy_Obj_t * pTemp;
97 assert( !Ivy_IsComplement(pObj) );
98 assert( !Ivy_IsComplement(pFanout) );
99 pTemp = Ivy_ObjNextFanout(pObj, pFanout);
100 if ( pTemp == NULL )
101 return NULL;
102 if ( Ivy_ObjFanin0(pTemp) == pObj )
103 return &pTemp->pPrevFan0;
104 assert( Ivy_ObjFanin1(pTemp) == pObj );
105 return &pTemp->pPrevFan1;
106}
107
108// iterator through the fanouts of the node
109#define Ivy_ObjForEachFanoutInt( pObj, pFanout ) \
110 for ( pFanout = (pObj)->pFanout; pFanout; \
111 pFanout = Ivy_ObjNextFanout(pObj, pFanout) )
112
113// safe iterator through the fanouts of the node
114#define Ivy_ObjForEachFanoutIntSafe( pObj, pFanout, pFanout2 ) \
115 for ( pFanout = (pObj)->pFanout, \
116 pFanout2 = Ivy_ObjNextFanout(pObj, pFanout); \
117 pFanout; \
118 pFanout = pFanout2, \
119 pFanout2 = Ivy_ObjNextFanout(pObj, pFanout) )
120
124
137{
138 Ivy_Obj_t * pObj;
139 int i;
140 assert( !p->fFanout );
141 p->fFanout = 1;
142 Ivy_ManForEachObj( p, pObj, i )
143 {
144 if ( Ivy_ObjFanin0(pObj) )
145 Ivy_ObjAddFanout( p, Ivy_ObjFanin0(pObj), pObj );
146 if ( Ivy_ObjFanin1(pObj) )
147 Ivy_ObjAddFanout( p, Ivy_ObjFanin1(pObj), pObj );
148 }
149}
150
163{
164 Ivy_Obj_t * pObj;
165 int i;
166 assert( p->fFanout );
167 p->fFanout = 0;
168 Ivy_ManForEachObj( p, pObj, i )
169 pObj->pFanout = pObj->pNextFan0 = pObj->pNextFan1 = pObj->pPrevFan0 = pObj->pPrevFan1 = NULL;
170}
171
183void Ivy_ObjAddFanout( Ivy_Man_t * p, Ivy_Obj_t * pFanin, Ivy_Obj_t * pFanout )
184{
185 assert( p->fFanout );
186 if ( pFanin->pFanout )
187 {
188 *Ivy_ObjNextFanoutPlace(pFanin, pFanout) = pFanin->pFanout;
189 *Ivy_ObjPrevFanoutPlace(pFanin, pFanin->pFanout) = pFanout;
190 }
191 pFanin->pFanout = pFanout;
192}
193
205void Ivy_ObjDeleteFanout( Ivy_Man_t * p, Ivy_Obj_t * pFanin, Ivy_Obj_t * pFanout )
206{
207 Ivy_Obj_t ** ppPlace1, ** ppPlace2, ** ppPlaceN;
208 assert( pFanin->pFanout != NULL );
209
210 ppPlace1 = Ivy_ObjNextFanoutPlace(pFanin, pFanout);
211 ppPlaceN = Ivy_ObjPrevNextFanoutPlace(pFanin, pFanout);
212 assert( *ppPlaceN == pFanout );
213 if ( ppPlaceN )
214 *ppPlaceN = *ppPlace1;
215
216 ppPlace2 = Ivy_ObjPrevFanoutPlace(pFanin, pFanout);
217 ppPlaceN = Ivy_ObjNextPrevFanoutPlace(pFanin, pFanout);
218 assert( ppPlaceN == NULL || *ppPlaceN == pFanout );
219 if ( ppPlaceN )
220 *ppPlaceN = *ppPlace2;
221
222 *ppPlace1 = NULL;
223 *ppPlace2 = NULL;
224}
225
237void Ivy_ObjPatchFanout( Ivy_Man_t * p, Ivy_Obj_t * pFanin, Ivy_Obj_t * pFanoutOld, Ivy_Obj_t * pFanoutNew )
238{
239 Ivy_Obj_t ** ppPlace;
240 ppPlace = Ivy_ObjPrevNextFanoutPlace(pFanin, pFanoutOld);
241 assert( *ppPlace == pFanoutOld );
242 if ( ppPlace )
243 *ppPlace = pFanoutNew;
244 ppPlace = Ivy_ObjNextPrevFanoutPlace(pFanin, pFanoutOld);
245 assert( ppPlace == NULL || *ppPlace == pFanoutOld );
246 if ( ppPlace )
247 *ppPlace = pFanoutNew;
248 // assuming that pFanoutNew already points to the next fanout
249}
250
263{
264 Ivy_Obj_t * pFanout;
265 assert( p->fFanout );
266 assert( !Ivy_IsComplement(pObj) );
267 Vec_PtrClear( vArray );
268 Ivy_ObjForEachFanoutInt( pObj, pFanout )
269 Vec_PtrPush( vArray, pFanout );
270}
271
284{
285 return pObj->pFanout;
286}
287
300{
301 Ivy_Obj_t * pFanout;
302 int Counter = 0;
303 Ivy_ObjForEachFanoutInt( pObj, pFanout )
304 Counter++;
305 return Counter;
306}
307
311
312
314
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Cube * p
Definition exorList.c:222
void Ivy_ObjAddFanout(Ivy_Man_t *p, Ivy_Obj_t *pFanin, Ivy_Obj_t *pFanout)
Definition ivyFanout.c:183
void Ivy_ObjPatchFanout(Ivy_Man_t *p, Ivy_Obj_t *pFanin, Ivy_Obj_t *pFanoutOld, Ivy_Obj_t *pFanoutNew)
Definition ivyFanout.c:237
#define Ivy_ObjForEachFanoutInt(pObj, pFanout)
Definition ivyFanout.c:109
void Ivy_ObjDeleteFanout(Ivy_Man_t *p, Ivy_Obj_t *pFanin, Ivy_Obj_t *pFanout)
Definition ivyFanout.c:205
int Ivy_ObjFanoutNum(Ivy_Man_t *p, Ivy_Obj_t *pObj)
Definition ivyFanout.c:299
void Ivy_ObjCollectFanouts(Ivy_Man_t *p, Ivy_Obj_t *pObj, Vec_Ptr_t *vArray)
Definition ivyFanout.c:262
void Ivy_ManStopFanout(Ivy_Man_t *p)
Definition ivyFanout.c:162
Ivy_Obj_t * Ivy_ObjReadFirstFanout(Ivy_Man_t *p, Ivy_Obj_t *pObj)
Definition ivyFanout.c:283
void Ivy_ManStartFanout(Ivy_Man_t *p)
FUNCTION DEFINITIONS ///.
Definition ivyFanout.c:136
typedefABC_NAMESPACE_HEADER_START struct Ivy_Man_t_ Ivy_Man_t
INCLUDES ///.
Definition ivy.h:46
#define Ivy_ManForEachObj(p, pObj, i)
Definition ivy.h:393
struct Ivy_Obj_t_ Ivy_Obj_t
Definition ivy.h:47
Ivy_Obj_t * pPrevFan0
Definition ivy.h:91
Ivy_Obj_t * pFanout
Definition ivy.h:88
Ivy_Obj_t * pPrevFan1
Definition ivy.h:92
Ivy_Obj_t * pNextFan1
Definition ivy.h:90
Ivy_Obj_t * pNextFan0
Definition ivy.h:89
#define assert(ex)
Definition util_old.h:213
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
Definition vecPtr.h:42