21#ifndef ABC__map__mpm__mig__h
22#define ABC__map__mpm__mig__h
37#define MIG_NONE 0x7FFFFFFF
40#define MIG_MASK 0x0000FFF
100static inline int Mig_IdPage(
int v ) {
return v >>
MIG_BASE; }
101static inline int Mig_IdCell(
int v ) {
return v &
MIG_MASK; }
103static inline char * Mig_ManName(
Mig_Man_t *
p ) {
return p->pName; }
104static inline int Mig_ManCiNum(
Mig_Man_t *
p ) {
return Vec_IntSize(&
p->vCis); }
105static inline int Mig_ManCoNum(
Mig_Man_t *
p ) {
return Vec_IntSize(&
p->vCos); }
106static inline int Mig_ManPiNum(
Mig_Man_t *
p ) {
return Vec_IntSize(&
p->vCis) -
p->nRegs; }
107static inline int Mig_ManPoNum(
Mig_Man_t *
p ) {
return Vec_IntSize(&
p->vCos) -
p->nRegs; }
108static inline int Mig_ManRegNum(
Mig_Man_t *
p ) {
return p->nRegs; }
109static inline int Mig_ManObjNum(
Mig_Man_t *
p ) {
return p->nObjs; }
110static inline int Mig_ManNodeNum(
Mig_Man_t *
p ) {
return p->nObjs - Vec_IntSize(&
p->vCis) - Vec_IntSize(&
p->vCos) - 1; }
111static inline int Mig_ManCandNum(
Mig_Man_t *
p ) {
return Mig_ManCiNum(
p) + Mig_ManNodeNum(
p); }
112static inline int Mig_ManChoiceNum(
Mig_Man_t *
p ) {
return p->nChoices; }
113static inline void Mig_ManSetRegNum(
Mig_Man_t *
p,
int v ) {
p->nRegs = v; }
116static inline Mig_Obj_t * Mig_ManObj(
Mig_Man_t *
p,
int v ) {
assert(v >= 0 && v < p->nObjs);
return Mig_ManPage(
p, v) + Mig_IdCell(v); }
117static inline Mig_Obj_t * Mig_ManCi(
Mig_Man_t *
p,
int v ) {
return Mig_ManObj(
p, Vec_IntEntry(&
p->vCis,v) ); }
118static inline Mig_Obj_t * Mig_ManCo(
Mig_Man_t *
p,
int v ) {
return Mig_ManObj(
p, Vec_IntEntry(&
p->vCos,v) ); }
121static inline Mig_Obj_t * Mig_ManRo(
Mig_Man_t *
p,
int v ) {
assert( v < Mig_ManRegNum(
p) );
return Mig_ManCi(
p, Mig_ManPiNum(
p)+v ); }
122static inline Mig_Obj_t * Mig_ManRi(
Mig_Man_t *
p,
int v ) {
assert( v < Mig_ManRegNum(
p) );
return Mig_ManCo(
p, Mig_ManPoNum(
p)+v ); }
125static inline int Mig_FanCompl(
Mig_Obj_t *
p,
int i ) {
return p->pFans[i].fCompl; }
126static inline int Mig_FanId(
Mig_Obj_t *
p,
int i ) {
return p->pFans[i].Id; }
127static inline int Mig_FanIsNone(
Mig_Obj_t *
p,
int i ) {
return p->pFans[i].Id ==
MIG_NONE; }
128static inline int Mig_FanSetCompl(
Mig_Obj_t *
p,
int i,
int v ) {
assert( !(v >> 1) );
return p->pFans[i].fCompl = v; }
129static inline int Mig_FanSetId(
Mig_Obj_t *
p,
int i,
int v ) {
assert(v >= 0 && v <
MIG_NONE);
return p->pFans[i].Id = v; }
131static inline int Mig_ObjIsNone(
Mig_Obj_t *
p ) {
return Mig_FanIsNone(
p, 3 ); }
132static inline int Mig_ObjIsConst0(
Mig_Obj_t *
p ) {
return Mig_FanId(
p, 3 ) == 0; }
133static inline int Mig_ObjIsTerm(
Mig_Obj_t *
p ) {
return Mig_FanIsNone(
p, 1 ) && !Mig_FanIsNone(
p, 2 ); }
134static inline int Mig_ObjIsCi(
Mig_Obj_t *
p ) {
return Mig_ObjIsTerm(
p) && Mig_FanIsNone(
p, 0 ); }
135static inline int Mig_ObjIsCo(
Mig_Obj_t *
p ) {
return Mig_ObjIsTerm(
p) && !Mig_FanIsNone(
p, 0 ); }
136static inline int Mig_ObjIsBuf(
Mig_Obj_t *
p ) {
return Mig_FanIsNone(
p, 1 ) && Mig_FanIsNone(
p, 2 ) && !Mig_FanIsNone(
p, 0 ); }
137static inline int Mig_ObjIsNode(
Mig_Obj_t *
p ) {
return!Mig_FanIsNone(
p, 1 ); }
138static inline int Mig_ObjIsNode2(
Mig_Obj_t *
p ) {
return Mig_ObjIsNode(
p ) && Mig_FanIsNone(
p, 2 ); }
139static inline int Mig_ObjIsNode3(
Mig_Obj_t *
p ) {
return Mig_ObjIsNode(
p ) && !Mig_FanIsNone(
p, 2 ); }
140static inline int Mig_ObjIsAnd(
Mig_Obj_t *
p ) {
return Mig_ObjIsNode2(
p ) && Mig_FanId(
p, 0) < Mig_FanId(
p, 1); }
141static inline int Mig_ObjIsXor(
Mig_Obj_t *
p ) {
return Mig_ObjIsNode2(
p ) && Mig_FanId(
p, 0) > Mig_FanId(
p, 1); }
142static inline int Mig_ObjIsMux(
Mig_Obj_t *
p ) {
return Mig_ObjIsNode3(
p ); }
143static inline int Mig_ObjIsCand(
Mig_Obj_t *
p ) {
return Mig_ObjIsNode(
p) || Mig_ObjIsCi(
p); }
144static inline int Mig_ObjNodeType(
Mig_Obj_t *
p ) {
return Mig_ObjIsAnd(
p) ? 1 : (Mig_ObjIsXor(
p) ? 2 : 3); }
146static inline int Mig_ObjId(
Mig_Obj_t *
p ) {
return Mig_FanId(
p, 3 ); }
147static inline void Mig_ObjSetId(
Mig_Obj_t *
p,
int v ) { Mig_FanSetId(
p, 3, v ); }
148static inline int Mig_ObjCioId(
Mig_Obj_t *
p ) {
assert( Mig_ObjIsTerm(
p) );
return Mig_FanId(
p, 2 ); }
149static inline void Mig_ObjSetCioId(
Mig_Obj_t *
p,
int v ) {
assert( Mig_FanIsNone(
p, 1) ); Mig_FanSetId(
p, 2, v ); }
150static inline int Mig_ObjPhase(
Mig_Obj_t *
p ) {
return Mig_FanCompl(
p, 3 ); }
151static inline void Mig_ObjSetPhase(
Mig_Obj_t *
p,
int v ) { Mig_FanSetCompl(
p, 3, v ); }
155static inline Mig_Obj_t * Mig_ObjObj(
Mig_Obj_t *
p,
int i ) {
return Mig_ManObj( Mig_ObjMan(
p), i ); }
157static inline int Mig_ManIdToCioId(
Mig_Man_t *
p,
int Id ) {
return Mig_ObjCioId( Mig_ManObj(
p, Id) ); }
158static inline int Mig_ManCiIdToId(
Mig_Man_t *
p,
int CiId ) {
return Mig_ObjId( Mig_ManCi(
p, CiId) ); }
159static inline int Mig_ManCoIdToId(
Mig_Man_t *
p,
int CoId ) {
return Mig_ObjId( Mig_ManCo(
p, CoId) ); }
161static inline int Mig_ObjIsPi(
Mig_Obj_t *
p ) {
return Mig_ObjIsCi(
p) && Mig_ObjCioId(
p) < Mig_ManPiNum(Mig_ObjMan(
p)); }
162static inline int Mig_ObjIsPo(
Mig_Obj_t *
p ) {
return Mig_ObjIsCo(
p) && Mig_ObjCioId(
p) < Mig_ManPoNum(Mig_ObjMan(
p)); }
163static inline int Mig_ObjIsRo(
Mig_Obj_t *
p ) {
return Mig_ObjIsCi(
p) && Mig_ObjCioId(
p) >= Mig_ManPiNum(Mig_ObjMan(
p)); }
164static inline int Mig_ObjIsRi(
Mig_Obj_t *
p ) {
return Mig_ObjIsCo(
p) && Mig_ObjCioId(
p) >= Mig_ManPoNum(Mig_ObjMan(
p)); }
166static inline Mig_Obj_t * Mig_ObjRoToRi(
Mig_Obj_t *
p ) {
Mig_Man_t * pMan = Mig_ObjMan(
p);
assert( Mig_ObjIsRo(
p) );
return Mig_ManCo(pMan, Mig_ManCoNum(pMan) - Mig_ManCiNum(pMan) + Mig_ObjCioId(
p)); }
167static inline Mig_Obj_t * Mig_ObjRiToRo(
Mig_Obj_t *
p ) {
Mig_Man_t * pMan = Mig_ObjMan(
p);
assert( Mig_ObjIsRi(
p) );
return Mig_ManCi(pMan, Mig_ManCiNum(pMan) - Mig_ManCoNum(pMan) + Mig_ObjCioId(
p)); }
169static inline int Mig_ObjHasFanin(
Mig_Obj_t *
p,
int i ) {
return i < 3 && Mig_FanId(
p, i) !=
MIG_NONE; }
170static inline int Mig_ObjFaninId(
Mig_Obj_t *
p,
int i ) {
assert( i < 3 && Mig_FanId(
p, i) < Mig_ObjId(
p) );
return Mig_FanId(
p, i ); }
171static inline int Mig_ObjFaninId0(
Mig_Obj_t *
p ) {
return Mig_FanId(
p, 0 ); }
172static inline int Mig_ObjFaninId1(
Mig_Obj_t *
p ) {
return Mig_FanId(
p, 1 ); }
173static inline int Mig_ObjFaninId2(
Mig_Obj_t *
p ) {
return Mig_FanId(
p, 2 ); }
174static inline Mig_Obj_t * Mig_ObjFanin(
Mig_Obj_t *
p,
int i ) {
return Mig_ManObj( Mig_ObjMan(
p), Mig_ObjFaninId(
p, i) ); }
176static inline Mig_Obj_t * Mig_ObjFanin0(
Mig_Obj_t *
p ) {
return Mig_FanIsNone(
p, 0) ? NULL: Mig_ObjFanin(
p, 0); }
177static inline Mig_Obj_t * Mig_ObjFanin1(
Mig_Obj_t *
p ) {
return Mig_FanIsNone(
p, 1) ? NULL: Mig_ObjFanin(
p, 1); }
178static inline Mig_Obj_t * Mig_ObjFanin2(
Mig_Obj_t *
p ) {
return Mig_FanIsNone(
p, 2) ? NULL: Mig_ObjFanin(
p, 2); }
179static inline int Mig_ObjFaninC(
Mig_Obj_t *
p,
int i ) {
assert( i < 3 );
return Mig_FanCompl(
p, i); }
180static inline int Mig_ObjFaninC0(
Mig_Obj_t *
p ) {
return Mig_FanCompl(
p, 0); }
181static inline int Mig_ObjFaninC1(
Mig_Obj_t *
p ) {
return Mig_FanCompl(
p, 1); }
182static inline int Mig_ObjFaninC2(
Mig_Obj_t *
p ) {
return Mig_FanCompl(
p, 2); }
183static inline int Mig_ObjFaninLit(
Mig_Obj_t *
p,
int i ) {
return Abc_Var2Lit( Mig_FanId(
p, i), Mig_FanCompl(
p, i) ); }
184static inline void Mig_ObjFlipFaninC(
Mig_Obj_t *
p,
int i ) { Mig_FanSetCompl(
p, i, !Mig_FanCompl(
p, i) ); }
185static inline int Mig_ObjWhatFanin(
Mig_Obj_t *
p,
int i ) {
if (Mig_FanId(
p, 0) == i)
return 0;
if (Mig_FanId(
p, 1) == i)
return 1;
if (Mig_FanId(
p, 2) == i)
return 2;
return -1; }
186static inline void Mig_ObjSetFaninLit(
Mig_Obj_t *
p,
int i,
int l ) {
assert( l >= 0 && (l >> 1) < Mig_ObjId(
p) ); Mig_FanSetId(
p, i, Abc_Lit2Var(l)); Mig_FanSetCompl(
p, i, Abc_LitIsCompl(l)); }
188static inline int Mig_ObjSiblId(
Mig_Obj_t *
p ) {
return Vec_IntSize(&Mig_ObjMan(
p)->vSibls) == 0 ? 0: Vec_IntEntry(&Mig_ObjMan(
p)->vSibls, Mig_ObjId(
p)); }
189static inline void Mig_ObjSetSiblId(
Mig_Obj_t *
p,
int s ) {
assert( s > 0 && Mig_ObjId(
p) > s ); Vec_IntWriteEntry( &Mig_ObjMan(
p)->vSibls, Mig_ObjId(
p), s ); }
190static inline Mig_Obj_t * Mig_ObjSibl(
Mig_Obj_t *
p ) {
return Mig_ObjSiblId(
p) == 0 ? NULL: Mig_ObjObj(
p, Mig_ObjSiblId(
p)); }
191static inline int Mig_ObjRefNum(
Mig_Obj_t *
p ) {
return Vec_IntEntry(&Mig_ObjMan(
p)->vRefs, Mig_ObjId(
p)); }
193static inline void Mig_ManCleanCopy(
Mig_Man_t *
p ) {
if (
p->vCopies.pArray == NULL ) Vec_IntFill( &
p->vCopies, Mig_ManObjNum(
p), -1 ); }
194static inline int Mig_ObjCopy(
Mig_Obj_t *
p ) {
return Vec_IntSize(&Mig_ObjMan(
p)->vCopies) == 0 ? -1: Vec_IntEntry(&Mig_ObjMan(
p)->vCopies, Mig_ObjId(
p)); }
195static inline void Mig_ObjSetCopy(
Mig_Obj_t *
p,
int i ) {
assert( Vec_IntSize(&Mig_ObjMan(
p)->vCopies) != 0 ); Vec_IntWriteEntry(&Mig_ObjMan(
p)->vCopies, Mig_ObjId(
p), i); }
197static inline void Mig_ManIncrementTravId(
Mig_Man_t *
p ) {
if (
p->vTravIds.pArray == NULL ) Vec_IntFill( &
p->vTravIds, Mig_ManObjNum(
p)+500, 0 );
p->nTravIds++; }
198static inline void Mig_ObjIncrementTravId(
Mig_Obj_t *
p ) {
if ( Mig_ObjMan(
p)->vTravIds.pArray == NULL ) Vec_IntFill( &Mig_ObjMan(
p)->vTravIds, Mig_ManObjNum(Mig_ObjMan(
p))+500, 0 ); Mig_ObjMan(
p)->nTravIds++; }
199static inline void Mig_ObjSetTravIdCurrent(
Mig_Obj_t *
p ) { Vec_IntSetEntry(&Mig_ObjMan(
p)->vTravIds, Mig_ObjId(
p), Mig_ObjMan(
p)->nTravIds ); }
200static inline void Mig_ObjSetTravIdPrevious(
Mig_Obj_t *
p ) { Vec_IntSetEntry(&Mig_ObjMan(
p)->vTravIds, Mig_ObjId(
p), Mig_ObjMan(
p)->nTravIds-1 ); }
201static inline int Mig_ObjIsTravIdCurrent(
Mig_Obj_t *
p ) {
return (Vec_IntGetEntry(&Mig_ObjMan(
p)->vTravIds, Mig_ObjId(
p)) == Mig_ObjMan(
p)->nTravIds); }
202static inline int Mig_ObjIsTravIdPrevious(
Mig_Obj_t *
p ) {
return (Vec_IntGetEntry(&Mig_ObjMan(
p)->vTravIds, Mig_ObjId(
p)) == Mig_ObjMan(
p)->nTravIds-1); }
203static inline void Mig_ObjSetTravIdCurrentId(
Mig_Man_t *
p,
int Id ) { Vec_IntSetEntry(&
p->vTravIds, Id,
p->nTravIds ); }
204static inline int Mig_ObjIsTravIdCurrentId(
Mig_Man_t *
p,
int Id ) {
return (Vec_IntGetEntry(&
p->vTravIds, Id) ==
p->nTravIds); }
221 if (
p->nObjs >= (Vec_PtrSize(&
p->vPages) <<
MIG_BASE) )
226 *((
void **)pPage) =
p;
228 Vec_PtrPush( &
p->vPages, pPage + 1 );
233 pObj = Mig_ManObj(
p,
p->nObjs++ );
234 assert( Mig_ObjIsNone(pObj) );
235 Mig_ObjSetId( pObj,
p->nObjs-1 );
238static inline int Mig_ManAppendCi(
Mig_Man_t *
p )
241 Mig_ObjSetCioId( pObj, Vec_IntSize(&
p->vCis) );
242 Vec_IntPush( &
p->vCis, Mig_ObjId(pObj) );
243 return Mig_ObjId(pObj) << 1;
245static inline int Mig_ManAppendCo(
Mig_Man_t *
p,
int iLit0 )
248 assert( !Mig_ObjIsCo(Mig_ManObj(
p, Abc_Lit2Var(iLit0))) );
249 pObj = Mig_ManAppendObj(
p );
250 Mig_ObjSetFaninLit( pObj, 0, iLit0 );
251 Mig_ObjSetCioId( pObj, Vec_IntSize(&
p->vCos) );
252 Vec_IntPush( &
p->vCos, Mig_ObjId(pObj) );
253 return Mig_ObjId( pObj ) << 1;
255static inline int Mig_ManAppendBuf(
Mig_Man_t *
p,
int iLit0 )
258 pObj = Mig_ManAppendObj(
p );
259 Mig_ObjSetFaninLit( pObj, 0, iLit0 );
260 return Mig_ObjId( pObj ) << 1;
262static inline int Mig_ManAppendAnd(
Mig_Man_t *
p,
int iLit0,
int iLit1 )
266 Mig_ObjSetFaninLit( pObj, 0, iLit0 < iLit1 ? iLit0 : iLit1 );
267 Mig_ObjSetFaninLit( pObj, 1, iLit0 < iLit1 ? iLit1 : iLit0 );
268 return Mig_ObjId( pObj ) << 1;
270static inline int Mig_ManAppendXor(
Mig_Man_t *
p,
int iLit0,
int iLit1 )
274 assert( !Abc_LitIsCompl(iLit0) && !Abc_LitIsCompl(iLit1) );
275 Mig_ObjSetFaninLit( pObj, 0, iLit0 < iLit1 ? iLit1 : iLit0 );
276 Mig_ObjSetFaninLit( pObj, 1, iLit0 < iLit1 ? iLit0 : iLit1 );
277 return Mig_ObjId( pObj ) << 1;
279static inline int Mig_ManAppendMux(
Mig_Man_t *
p,
int iLit0,
int iLit1,
int iCtrl )
282 assert( iLit0 != iLit1 && iLit0 != iCtrl && iLit1 != iCtrl );
283 assert( !Abc_LitIsCompl(iLit0) || !Abc_LitIsCompl(iLit1) );
284 Mig_ObjSetFaninLit( pObj, 0, iLit0 < iLit1 ? iLit0 : iLit1 );
285 Mig_ObjSetFaninLit( pObj, 1, iLit0 < iLit1 ? iLit1 : iLit0 );
286 Mig_ObjSetFaninLit( pObj, 2, iLit0 < iLit1 ? iCtrl : Abc_LitNot(iCtrl) );
287 return Mig_ObjId( pObj ) << 1;
289static inline int Mig_ManAppendMaj(
Mig_Man_t *
p,
int iLit0,
int iLit1,
int iLit2 )
292 assert( iLit0 != iLit1 && iLit0 != iLit2 && iLit1 != iLit2 );
293 Mig_ObjSetFaninLit( pObj, 0, iLit0 < iLit1 ? iLit1 : iLit0 );
294 Mig_ObjSetFaninLit( pObj, 1, iLit0 < iLit1 ? iLit0 : iLit1 );
295 Mig_ObjSetFaninLit( pObj, 2, iLit2 );
296 return Mig_ObjId( pObj ) << 1;
304#define Mig_ManForEachObj( p, pObj ) \
305 for ( p->iPage = 0; p->iPage < Vec_PtrSize(&p->vPages) && \
306 ((p->pPage) = (Mig_Obj_t *)Vec_PtrEntry(&p->vPages, p->iPage)); p->iPage++ ) \
307 for ( pObj = p->pPage; !Mig_ObjIsNone(pObj); pObj++ )
308#define Mig_ManForEachObj1( p, pObj ) \
309 for ( p->iPage = 0; p->iPage < Vec_PtrSize(&p->vPages) && \
310 ((p->pPage) = (Mig_Obj_t *)Vec_PtrEntry(&p->vPages, p->iPage)); p->iPage++ ) \
311 for ( pObj = p->pPage + (p->iPage == 0); !Mig_ObjIsNone(pObj); pObj++ )
312#define Mig_ManForEachObjReverse( p, pObj ) \
313 for ( p->iPage = Vec_PtrSize(&p->vPages) - 1; p->iPage >= 0 && \
314 ((p->pPage) = (Mig_Obj_t *)Vec_PtrEntry(&p->vPages, p->iPage)); p->iPage-- ) \
315 for ( pObj = (p->iPage == Vec_PtrSize(&p->vPages) - 1) ? \
316 Mig_ManObj(p, Mig_ManObjNum(p)-1) : p->pPage + MIG_MASK; \
317 pObj - p->pPage >= 0; pObj-- )
319#define Mig_ManForEachObjVec( vVec, p, pObj, i ) \
320 for ( i = 0; (i < Vec_IntSize(vVec)) && ((pObj) = Mig_ManObj(p, Vec_IntEntry(vVec,i))); i++ )
322#define Mig_ManForEachNode( p, pObj ) \
323 Mig_ManForEachObj( p, pObj ) if ( !Mig_ObjIsNode(pObj) ) {} else
324#define Mig_ManForEachCand( p, pObj ) \
325 Mig_ManForEachObj( p, pObj ) if ( !Mig_ObjIsCand(pObj) ) {} else
327#define Mig_ManForEachCi( p, pObj, i ) \
328 for ( i = 0; (i < Vec_IntSize(&p->vCis)) && ((pObj) = Mig_ManCi(p, i)); i++ )
329#define Mig_ManForEachCo( p, pObj, i ) \
330 for ( i = 0; (i < Vec_IntSize(&p->vCos)) && ((pObj) = Mig_ManCo(p, i)); i++ )
333#define Mig_ObjForEachFaninId( p, iFanin, i ) \
334 for ( i = 0; Mig_ObjHasFanin(p, i) && ((iFanin) = Mig_ObjFaninId(p, i)); i++ )
335#define Mig_ObjForEachFanin( p, pFanin, i ) \
336 for ( i = 0; Mig_ObjHasFanin(p, i) && ((pFanin) = Mig_ObjFanin(p, i)); i++ )
#define ABC_FALLOC(type, num)
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Mig_Obj_t_ Mig_Obj_t
void Mig_ManSetRefs(Mig_Man_t *p)
int Mig_ManMuxNum(Mig_Man_t *p)
#define MIG_NONE
INCLUDES ///.
struct Mig_Man_t_ Mig_Man_t
void Mig_ManStop(Mig_Man_t *p)
int Mig_ManAndNum(Mig_Man_t *p)
struct Mig_Fan_t_ Mig_Fan_t
BASIC TYPES ///.
Mig_Man_t * Mig_ManStart()
FUNCTION DECLARATIONS ///.
int Mig_ManXorNum(Mig_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.