21#ifndef ABC__base__bac__bac_h
22#define ABC__base__bac__bac_h
196static inline char * Bac_ManName(
Bac_Man_t *
p ) {
return p->pName; }
197static inline char * Bac_ManSpec(
Bac_Man_t *
p ) {
return p->pSpec; }
198static inline int Bac_ManNtkNum(
Bac_Man_t *
p ) {
return p->nNtks; }
200static inline int Bac_ManNtkIsOk(
Bac_Man_t *
p,
int i ) {
return i > 0 && i <= Bac_ManNtkNum(
p); }
201static inline Bac_Ntk_t * Bac_ManNtk(
Bac_Man_t *
p,
int i ) {
return Bac_ManNtkIsOk(
p, i) ?
p->pNtks + i : NULL; }
203static inline Bac_Ntk_t * Bac_ManNtkFind(
Bac_Man_t *
p,
char * pName ) {
return Bac_ManNtk(
p, Bac_ManNtkFindId(
p, pName) ); }
210static inline int Bac_NtkId(
Bac_Ntk_t *
p ) {
int i =
p -
p->pDesign->pNtks;
assert(Bac_ManNtkIsOk(
p->pDesign, i));
return i; }
212static inline int Bac_NtkNameId(
Bac_Ntk_t *
p ) {
return p->NameId; }
213static inline char * Bac_NtkName(
Bac_Ntk_t *
p ) {
return Bac_ManStr(
p->pDesign, Bac_NtkNameId(
p)); }
214static inline int Bac_NtkCopy(
Bac_Ntk_t *
p ) {
return p->iCopy; }
216static inline void Bac_NtkSetCopy(
Bac_Ntk_t *
p,
int i ) {
assert(
p->iCopy == -1);
p->iCopy = i; }
218static inline int Bac_NtkObjNum(
Bac_Ntk_t *
p ) {
return Vec_StrSize(&
p->vType); }
219static inline int Bac_NtkObjNumAlloc(
Bac_Ntk_t *
p ) {
return Vec_StrCap(&
p->vType); }
220static inline int Bac_NtkPiNum(
Bac_Ntk_t *
p ) {
return Vec_IntSize(&
p->vInputs); }
221static inline int Bac_NtkPoNum(
Bac_Ntk_t *
p ) {
return Vec_IntSize(&
p->vOutputs); }
222static inline int Bac_NtkPioNum(
Bac_Ntk_t *
p ) {
return Bac_NtkPiNum(
p) + Bac_NtkPoNum(
p); }
223static inline int Bac_NtkPiNumAlloc(
Bac_Ntk_t *
p ) {
return Vec_IntCap(&
p->vInputs); }
224static inline int Bac_NtkPoNumAlloc(
Bac_Ntk_t *
p ) {
return Vec_IntCap(&
p->vOutputs); }
225static inline int Bac_NtkBiNum(
Bac_Ntk_t *
p ) {
return Vec_StrCountEntryLit(&
p->vType, (
char)
BAC_OBJ_BI); }
226static inline int Bac_NtkBoNum(
Bac_Ntk_t *
p ) {
return Vec_StrCountEntryLit(&
p->vType, (
char)
BAC_OBJ_BO); }
227static inline int Bac_NtkCiNum(
Bac_Ntk_t *
p ) {
return Bac_NtkPiNum(
p) + Bac_NtkBoNum(
p); }
228static inline int Bac_NtkCoNum(
Bac_Ntk_t *
p ) {
return Bac_NtkPoNum(
p) + Bac_NtkBiNum(
p); }
229static inline int Bac_NtkBoxNum(
Bac_Ntk_t *
p ) {
return Bac_NtkObjNum(
p) - Vec_StrCountSmallerLit(&
p->vType, (
char)
BAC_OBJ_BOX); }
230static inline int Bac_NtkPrimNum(
Bac_Ntk_t *
p ) {
return Vec_StrCountLargerLit(&
p->vType, (
char)
BAC_OBJ_BOX); }
231static inline int Bac_NtkUserNum(
Bac_Ntk_t *
p ) {
return Vec_StrCountEntryLit(&
p->vType, (
char)
BAC_OBJ_BOX); }
233static inline int Bac_NtkPi(
Bac_Ntk_t *
p,
int i ) {
return Vec_IntEntry(&
p->vInputs, i); }
234static inline int Bac_NtkPo(
Bac_Ntk_t *
p,
int i ) {
return Vec_IntEntry(&
p->vOutputs, i); }
235static inline char * Bac_NtkStr(
Bac_Ntk_t *
p,
int i ) {
return Bac_ManStr(
p->pDesign, i); }
236static inline Bac_Ntk_t * Bac_NtkHostNtk(
Bac_Ntk_t *
p ) {
return p->iBoxNtk > 0 ? Bac_ManNtk(
p->pDesign,
p->iBoxNtk) : NULL; }
237static inline int Bac_NtkHostObj(
Bac_Ntk_t *
p ) {
return p->iBoxObj; }
238static inline void Bac_NtkSetHost(
Bac_Ntk_t *
p,
int n,
int i ) {
assert(
p->iBoxNtk == -1);
p->iBoxNtk = n;
p->iBoxObj = i; }
240static inline int Bac_InfoRange(
int Beg,
int End ) {
return End > Beg ? End - Beg + 1 : Beg - End + 1; }
241static inline int Bac_NtkInfoNum(
Bac_Ntk_t *
p ) {
return Vec_IntSize(&
p->vInfo)/3; }
242static inline int Bac_NtkInfoNumAlloc(
Bac_Ntk_t *
p ) {
return Vec_IntCap(&
p->vInfo)/3; }
243static inline int Bac_NtkInfoType(
Bac_Ntk_t *
p,
int i ) {
return Abc_Lit2Att2(Vec_IntEntry(&
p->vInfo, 3*i)); }
244static inline int Bac_NtkInfoName(
Bac_Ntk_t *
p,
int i ) {
return Abc_Lit2Var2(Vec_IntEntry(&
p->vInfo, 3*i)); }
245static inline int Bac_NtkInfoBeg(
Bac_Ntk_t *
p,
int i ) {
return Vec_IntEntry(&
p->vInfo, 3*i+1); }
246static inline int Bac_NtkInfoEnd(
Bac_Ntk_t *
p,
int i ) {
return Vec_IntEntry(&
p->vInfo, 3*i+2); }
247static inline int Bac_NtkInfoRange(
Bac_Ntk_t *
p,
int i ) {
int* a = Vec_IntEntryP(&
p->vInfo, 3*i);
return a[1]>=0 ? Bac_InfoRange( a[1], a[2] ) : 1; }
248static inline int Bac_NtkInfoIndex(
Bac_Ntk_t *
p,
int i,
int j ) {
int* a = Vec_IntEntryP(&
p->vInfo, 3*i);
assert(a[1]>=0);
return a[1]<a[2] ? a[1]+j : a[1]-j;}
249static inline void Bac_NtkAddInfo(
Bac_Ntk_t *
p,
int i,
int b,
int e){ Vec_IntPush(&
p->vInfo, i); Vec_IntPushTwo(&
p->vInfo, b, e); }
250static inline void Bac_NtkSetInfoName(
Bac_Ntk_t *
p,
int i,
int n){ Vec_IntWriteEntry( &
p->vInfo, 3*i, n ); }
252static inline void Bac_NtkStartNames(
Bac_Ntk_t *
p ) {
assert(Bac_NtkObjNumAlloc(
p)); Vec_IntFill(&
p->vName, Bac_NtkObjNumAlloc(
p), 0); }
253static inline void Bac_NtkStartFanouts(
Bac_Ntk_t *
p ) {
assert(Bac_NtkObjNumAlloc(
p)); Vec_IntFill(&
p->vFanout, Bac_NtkObjNumAlloc(
p), 0); }
254static inline void Bac_NtkStartCopies(
Bac_Ntk_t *
p ) {
assert(Bac_NtkObjNumAlloc(
p)); Vec_IntFill(&
p->vCopy, Bac_NtkObjNumAlloc(
p), -1); }
255static inline void Bac_NtkFreeNames(
Bac_Ntk_t *
p ) { Vec_IntErase(&
p->vName); }
256static inline void Bac_NtkFreeFanouts(
Bac_Ntk_t *
p ) { Vec_IntErase(&
p->vFanout); }
257static inline void Bac_NtkFreeCopies(
Bac_Ntk_t *
p ) { Vec_IntErase(&
p->vCopy); }
258static inline int Bac_NtkHasNames(
Bac_Ntk_t *
p ) {
return p->vName.pArray != NULL; }
259static inline int Bac_NtkHasFanouts(
Bac_Ntk_t *
p ) {
return p->vFanout.pArray != NULL; }
260static inline int Bac_NtkHasCopies(
Bac_Ntk_t *
p ) {
return p->vCopy.pArray != NULL; }
264static inline int Bac_CharIsDigit(
char c ) {
return c >=
'0' && c <=
'9'; }
269static inline int Bac_ObjIsPio(
Bac_Ntk_t *
p,
int i ) {
return Bac_ObjIsPi(
p, i) || Bac_ObjIsPo(
p, i); }
272static inline int Bac_ObjIsBio(
Bac_Ntk_t *
p,
int i ) {
return Bac_ObjIsBi(
p, i) || Bac_ObjIsBo(
p, i); }
273static inline int Bac_ObjIsBox(
Bac_Ntk_t *
p,
int i ) {
return Bac_TypeIsBox(Bac_ObjType(
p, i)); }
275static inline int Bac_ObjIsBoxPrim(
Bac_Ntk_t *
p,
int i ) {
return Bac_ObjIsBox(
p, i) && !Bac_ObjIsBoxUser(
p, i); }
277static inline int Bac_ObjIsCi(
Bac_Ntk_t *
p,
int i ) {
return Bac_ObjIsPi(
p, i) || Bac_ObjIsBo(
p, i); }
278static inline int Bac_ObjIsCo(
Bac_Ntk_t *
p,
int i ) {
return Bac_ObjIsPo(
p, i) || Bac_ObjIsBi(
p, i); }
283static inline int Bac_ObjBit(
Bac_Ntk_t *
p,
int i ) {
assert(!Bac_ObjIsBox(
p, i));
return Abc_LitIsCompl((
int)Vec_StrEntry(&
p->vType, i)); }
284static inline void Bac_ObjSetBit(
Bac_Ntk_t *
p,
int i ) {
char *q = Vec_StrArray(&
p->vType);
assert(!Bac_ObjIsBox(
p, i)); q[i] = (char)Abc_LitNot((
int)q[i]); }
285static inline int Bac_ObjFanin(
Bac_Ntk_t *
p,
int i ) {
assert(Bac_ObjIsCo(
p, i));
return Vec_IntEntry(&
p->vFanin, i); }
286static inline int Bac_ObjIndex(
Bac_Ntk_t *
p,
int i ) {
assert(Bac_ObjIsCio(
p, i));
return Vec_IntEntry(&
p->vIndex, i); }
287static inline int Bac_ObjNameInt(
Bac_Ntk_t *
p,
int i ) {
assert(!Bac_ObjIsCo(
p, i));
return Vec_IntEntry(&
p->vName, i); }
288static inline int Bac_ObjName(
Bac_Ntk_t *
p,
int i ) {
return Bac_ObjIsCo(
p, i) ? Bac_ObjNameInt(
p, Bac_ObjFanin(
p,i)) : Bac_ObjNameInt(
p, i); }
290static inline int Bac_ObjNameId(
Bac_Ntk_t *
p,
int i ) {
return Abc_Lit2Var2( Bac_ObjName(
p, i) ); }
292static inline int Bac_ObjCopy(
Bac_Ntk_t *
p,
int i ) {
return Vec_IntEntry(&
p->vCopy, i); }
293static inline int Bac_ObjFanout(
Bac_Ntk_t *
p,
int i ) {
assert(Bac_ObjIsCi(
p, i));
return Vec_IntEntry(&
p->vFanout, i); }
294static inline int Bac_ObjNextFanout(
Bac_Ntk_t *
p,
int i ) {
assert(Bac_ObjIsCo(
p, i));
return Vec_IntEntry(&
p->vFanout, i); }
295static inline void Bac_ObjSetFanout(
Bac_Ntk_t *
p,
int i,
int x ) {
assert(Bac_ObjIsCi(
p, i)); Vec_IntSetEntry(&
p->vFanout, i, x); }
296static inline void Bac_ObjSetNextFanout(
Bac_Ntk_t *
p,
int i,
int x){
assert(Bac_ObjIsCo(
p, i)); Vec_IntSetEntry(&
p->vFanout, i, x); }
297static inline void Bac_ObjCleanFanin(
Bac_Ntk_t *
p,
int i ) {
assert(Bac_ObjFanin(
p, i) >= 0 && Bac_ObjIsCo(
p, i)); Vec_IntSetEntry( &
p->vFanin, i, -1); }
298static inline void Bac_ObjSetFanin(
Bac_Ntk_t *
p,
int i,
int x ) {
assert(Bac_ObjFanin(
p, i) == -1 && Bac_ObjIsCo(
p, i)); Vec_IntSetEntry( &
p->vFanin, i, x); }
299static inline void Bac_ObjSetIndex(
Bac_Ntk_t *
p,
int i,
int x ) {
assert(Bac_ObjIndex(
p, i) == -1); Vec_IntSetEntry( &
p->vIndex, i, x ); }
300static inline void Bac_ObjSetName(
Bac_Ntk_t *
p,
int i,
int x ) {
assert(Bac_ObjName(
p, i) == 0 && !Bac_ObjIsCo(
p, i)); Vec_IntSetEntry( &
p->vName, i, x ); }
301static inline void Bac_ObjSetCopy(
Bac_Ntk_t *
p,
int i,
int x ) {
assert(Bac_ObjCopy(
p, i) == -1); Vec_IntSetEntry( &
p->vCopy, i, x ); }
302static inline int Bac_ObjGetConst(
Bac_Ntk_t *
p,
int i ) {
assert(Bac_ObjIsCi(
p, i));
return Bac_ObjIsBo(
p, i) && Bac_ObjIsConst(
p, i-1) ? Bac_ObjType(
p, i-1) : 0; }
304static inline int Bac_BoxBiNum(
Bac_Ntk_t *
p,
int i ) {
int s = i-1;
assert(Bac_ObjIsBox(
p, i));
while (--i >= 0 && Bac_ObjIsBi(
p, i)) {}
return s - i; }
305static inline int Bac_BoxBoNum(
Bac_Ntk_t *
p,
int i ) {
int s = i+1;
assert(Bac_ObjIsBox(
p, i));
while (++i < Bac_NtkObjNum(
p) && Bac_ObjIsBo(
p, i)) {}
return i - s; }
306static inline int Bac_BoxSize(
Bac_Ntk_t *
p,
int i ) {
return 1 + Bac_BoxBiNum(
p, i) + Bac_BoxBoNum(
p, i); }
307static inline int Bac_BoxBi(
Bac_Ntk_t *
p,
int b,
int i ) {
assert(Bac_ObjIsBox(
p, b));
return b - 1 - i; }
308static inline int Bac_BoxBo(
Bac_Ntk_t *
p,
int b,
int i ) {
assert(Bac_ObjIsBox(
p, b));
return b + 1 + i; }
310static inline int Bac_BoxBoBox(
Bac_Ntk_t *
p,
int i ) {
assert(Bac_ObjIsBo(
p, i));
return i - 1 - Bac_ObjIndex(
p, i); }
311static inline int Bac_BoxFanin(
Bac_Ntk_t *
p,
int b,
int i ) {
return Bac_ObjFanin(
p, Bac_BoxBi(
p, b, i)); }
312static inline int Bac_BoxFaninBox(
Bac_Ntk_t *
p,
int b,
int i ) {
return Bac_BoxBoBox(
p, Bac_BoxFanin(
p, b, i)); }
313static inline int Bac_BoxBiRange(
Bac_Ntk_t *
p,
int i ) {
int s = i;
assert(Bac_ObjIsBi(
p, i) && !Bac_ObjBit(
p, i));
while (--i >= 0 && Bac_ObjIsBi(
p, i) && Bac_ObjBit(
p, i)) {}
return s - i; }
314static inline int Bac_BoxBoRange(
Bac_Ntk_t *
p,
int i ) {
int s = i;
assert(Bac_ObjIsBo(
p, i) && !Bac_ObjBit(
p, i));
while (++i < Bac_NtkObjNum(
p) && Bac_ObjIsBo(
p, i) && Bac_ObjBit(
p, i)) {}
return i - s; }
315static inline int Bac_ObjPiRange(
Bac_Ntk_t *
p,
int i ) {
int s = i;
assert(Bac_ObjIsPi(
p, i) && !Bac_ObjBit(
p, i));
while (++i < Bac_NtkObjNum(
p) && Bac_ObjIsPi(
p, i) && Bac_ObjBit(
p, i)) {}
return i - s; }
317static inline int Bac_BoxNtkId(
Bac_Ntk_t *
p,
int i ) {
assert(Bac_ObjIsBox(
p, i));
return Vec_IntEntry(&
p->vFanin, i); }
318static inline void Bac_BoxSetNtkId(
Bac_Ntk_t *
p,
int i,
int x ) {
assert(Bac_ObjIsBox(
p, i)&&Bac_ManNtkIsOk(
p->pDesign, x));Vec_IntSetEntry(&
p->vFanin, i, x);}
320static inline int Bac_BoxBoNtkId(
Bac_Ntk_t *
p,
int i ) {
assert(Bac_ObjIsBo(
p, i));
return Bac_BoxNtkId(
p, Bac_BoxBoBox(
p, i)); }
321static inline Bac_Ntk_t * Bac_BoxNtk(
Bac_Ntk_t *
p,
int i ) {
return Bac_ManNtk(
p->pDesign, Bac_BoxNtkId(
p, i) ); }
323static inline Bac_Ntk_t * Bac_BoxBoNtk(
Bac_Ntk_t *
p,
int i ) {
return Bac_ManNtk(
p->pDesign, Bac_BoxBoNtkId(
p, i) ); }
324static inline char * Bac_BoxNtkName(
Bac_Ntk_t *
p,
int i ) {
return Abc_NamStr(
p->pDesign->pMods, Bac_BoxNtkId(
p, i) ); }
334#define Bac_ManForEachNtk( p, pNtk, i ) \
335 for ( i = 1; (i <= Bac_ManNtkNum(p)) && (((pNtk) = Bac_ManNtk(p, i)), 1); i++ )
337#define Bac_NtkForEachPi( p, iObj, i ) \
338 for ( i = 0; (i < Bac_NtkPiNum(p)) && (((iObj) = Bac_NtkPi(p, i)), 1); i++ )
339#define Bac_NtkForEachPo( p, iObj, i ) \
340 for ( i = 0; (i < Bac_NtkPoNum(p)) && (((iObj) = Bac_NtkPo(p, i)), 1); i++ )
341#define Bac_NtkForEachPoDriver( p, iObj, i ) \
342 for ( i = 0; (i < Bac_NtkPoNum(p)) && (((iObj) = Bac_ObjFanin(p, Bac_NtkPo(p, i))), 1); i++ )
344#define Bac_NtkForEachPiMain( p, iObj, i ) \
345 for ( i = 0; (i < Bac_NtkPiNum(p)) && (((iObj) = Bac_NtkPi(p, i)), 1); i++ ) if ( Bac_ObjBit(p, iObj) ) {} else
346#define Bac_NtkForEachPoMain( p, iObj, i ) \
347 for ( i = 0; (i < Bac_NtkPoNum(p)) && (((iObj) = Bac_NtkPo(p, i)), 1); i++ ) if ( Bac_ObjBit(p, iObj) ) {} else
349#define Bac_NtkForEachObj( p, i ) if ( !Bac_ObjType(p, i) ) {} else \
350 for ( i = 0; (i < Bac_NtkObjNum(p)); i++ )
351#define Bac_NtkForEachObjType( p, Type, i ) \
352 for ( i = 0; (i < Bac_NtkObjNum(p)) && (((Type) = Bac_ObjType(p, i)), 1); i++ ) if ( !Type ) {} else
354#define Bac_NtkForEachBox( p, i ) \
355 for ( i = 0; (i < Bac_NtkObjNum(p)); i++ ) if ( !Bac_ObjIsBox(p, i) ) {} else
356#define Bac_NtkForEachBoxUser( p, i ) \
357 for ( i = 0; (i < Bac_NtkObjNum(p)); i++ ) if ( !Bac_ObjIsBoxUser(p, i) ) {} else
358#define Bac_NtkForEachBoxPrim( p, i ) \
359 for ( i = 0; (i < Bac_NtkObjNum(p)); i++ ) if ( !Bac_ObjIsBoxPrim(p, i) ) {} else
361#define Bac_NtkForEachCi( p, i ) \
362 for ( i = 0; (i < Bac_NtkObjNum(p)); i++ ) if ( !Bac_ObjIsCi(p, i) ) {} else
363#define Bac_NtkForEachCo( p, i ) \
364 for ( i = 0; (i < Bac_NtkObjNum(p)); i++ ) if ( !Bac_ObjIsCo(p, i) ) {} else
365#define Bac_NtkForEachCio( p, i ) \
366 for ( i = 0; (i < Bac_NtkObjNum(p)); i++ ) if ( !Bac_ObjIsCio(p, i) ){} else
368#define Bac_NtkForEachBi( p, i ) \
369 for ( i = 0; (i < Bac_NtkObjNum(p)); i++ ) if ( !Bac_ObjIsBi(p, i) ){} else
370#define Bac_NtkForEachBo( p, i ) \
371 for ( i = 0; (i < Bac_NtkObjNum(p)); i++ ) if ( !Bac_ObjIsBo(p, i) ){} else
372#define Bac_NtkForEachBio( p, i ) \
373 for ( i = 0; (i < Bac_NtkObjNum(p)); i++ ) if ( !Bac_ObjIsBio(p, i) ){} else
375#define Bac_BoxForEachBi( p, iBox, iTerm, i ) \
376 for ( iTerm = iBox - 1, i = 0; iTerm >= 0 && Bac_ObjIsBi(p, iTerm); iTerm--, i++ )
377#define Bac_BoxForEachBo( p, iBox, iTerm, i ) \
378 for ( iTerm = iBox + 1, i = 0; iTerm < Bac_NtkObjNum(p) && Bac_ObjIsBo(p, iTerm); iTerm++, i++ )
379#define Bac_BoxForEachBiReverse( p, iBox, iTerm, i ) \
380 for ( i = Bac_BoxBiNum(p, iBox), iTerm = iBox - i--; Bac_ObjIsBi(p, iTerm); iTerm++, i-- )
382#define Bac_BoxForEachBiMain( p, iBox, iTerm, i ) \
383 for ( iTerm = iBox - 1, i = 0; iTerm >= 0 && Bac_ObjIsBi(p, iTerm); iTerm--, i++ ) if ( Bac_ObjBit(p, iTerm) ) {} else
384#define Bac_BoxForEachBoMain( p, iBox, iTerm, i ) \
385 for ( iTerm = iBox + 1, i = 0; iTerm < Bac_NtkObjNum(p) && Bac_ObjIsBo(p, iTerm); iTerm++, i++ ) if ( Bac_ObjBit(p, iTerm) ) {} else
387#define Bac_BoxForEachFanin( p, iBox, iFanin, i ) \
388 for ( i = 0; iBox - 1 - i >= 0 && Bac_ObjIsBi(p, iBox - 1 - i) && (((iFanin) = Bac_BoxFanin(p, iBox, i)), 1); i++ )
389#define Bac_BoxForEachFaninBox( p, iBox, iFanin, i ) \
390 for ( i = 0; iBox - 1 - i >= 0 && Bac_ObjIsBi(p, iBox - 1 - i) && (((iFanin) = Bac_BoxFaninBox(p, iBox, i)), 1); i++ )
392#define Bac_ObjForEachFanout( p, iCi, iCo ) \
393 for ( iCo = Bac_ObjFanout(p, iCi); iCo; iCo = Bac_ObjNextFanout(p, iCo) )
394#define Bac_BoxForEachFanoutBox( p, iBox, iCo, iFanBox ) \
395 for ( assert(Bac_BoxBoNum(p, iBox) == 1), iCo = Bac_ObjFanout(p, Bac_BoxBo(p, iBox, 0)); iCo && ((iFanBox = Bac_BoxBiBox(p, iCo)), 1); iCo = Bac_ObjNextFanout(p, iCo) )
414 int iObj = Bac_NtkObjNum(
p);
415 assert( iObj == Vec_IntSize(&
p->vFanin) );
417 Vec_IntPush( &
p->vInputs, iObj );
419 Vec_IntPush( &
p->vOutputs, iObj );
420 Vec_StrPush( &
p->vType, (
char)Abc_Var2Lit(Type, 0) );
421 Vec_IntPush( &
p->vFanin, Fanin );
426 int iObj = Bac_ObjAlloc( pNew, Bac_ObjType(
p, i), Bac_ObjIsBox(
p, i) ? Bac_BoxNtkId(
p, i) : -1 );
427 if ( Bac_NtkHasNames(
p) && Bac_NtkHasNames(pNew) && !Bac_ObjIsCo(
p, i) )
428 Bac_ObjSetName( pNew, iObj, Bac_ObjName(
p, i) );
429 Bac_ObjSetCopy(
p, i, iObj );
435 for ( i = nIns - 1; i >= 0; i-- )
437 iObj = Bac_ObjAlloc(
p, Type, iNtk );
438 for ( i = 0; i < nOuts; i++ )
444 int i, iTerm, iBoxNew;
446 Bac_ObjDup( pNew,
p, iTerm );
447 iBoxNew = Bac_ObjDup( pNew,
p, iBox );
448 if ( Bac_NtkHasNames(
p) && Bac_NtkHasNames(pNew) && Bac_ObjName(
p, iBox) )
449 Bac_ObjSetName( pNew, iBoxNew, Bac_ObjName(
p, iBox) );
450 if ( Bac_BoxNtk(
p, iBox) )
451 Bac_BoxSetNtkId( pNew, iBoxNew, Bac_NtkCopy(Bac_BoxNtk(
p, iBox)) );
453 Bac_ObjDup( pNew,
p, iTerm );
456static inline void Bac_BoxDelete(
Bac_Ntk_t *
p,
int iBox )
458 int iStart = iBox - Bac_BoxBiNum(
p, iBox);
459 int i, iStop = iBox + Bac_BoxBoNum(
p, iBox);
460 for ( i = iStart; i <= iStop; i++ )
462 Vec_StrWriteEntry( &
p->vType, i, (
char)0 );
463 Vec_IntWriteEntry( &
p->vFanin, i, -1 );
464 if ( Bac_NtkHasNames(
p) )
465 Vec_IntWriteEntry( &
p->vName, i, 0 );
466 if ( Bac_NtkHasFanouts(
p) )
467 Vec_IntWriteEntry( &
p->vFanout, i, 0 );
470static inline void Bac_BoxReplace(
Bac_Ntk_t *
p,
int iBox,
int * pArray,
int nSize )
473 int i, Limit = Bac_BoxBoNum(
p, iBox);
475 for ( i = 0; i < Limit; i++ )
483 static int pArray[10];
int i, iTerm;
484 assert( !Bac_ObjIsBoxUser(
p, iBox) );
486 vBits->pArray = pArray;
491 Vec_IntPush( vBits, Bac_BoxBiRange(
p, iTerm) );
494 Vec_IntPush( vBits, Bac_BoxBoRange(
p, iTerm) );
495 assert( Vec_IntSize(vBits) < 10 );
511static inline void Vec_StrPrint(
Vec_Str_t *
p,
int fInt )
514 for ( i = 0; i <
p->nSize; i++ )
516 printf(
"%d ", (
int)
p->pArray[i] );
518 printf(
"%c ",
p->pArray[i] );
533static inline void Bac_NtkAlloc(
Bac_Ntk_t * pNew,
int NameId,
int nIns,
int nOuts,
int nObjs )
537 assert( Bac_NtkPiNum(pNew) == 0 );
538 assert( Bac_NtkPoNum(pNew) == 0 );
543 Vec_IntGrow( &pNew->
vInputs, nIns );
544 Vec_IntGrow( &pNew->
vOutputs, nOuts );
545 Vec_StrGrow( &pNew->
vType, nObjs );
546 Vec_IntGrow( &pNew->
vFanin, nObjs );
550 printf(
"Network with name %s already exists.\n", Bac_NtkStr(pNew, NameId) );
552 assert( NtkId == Bac_NtkId(pNew) );
558 Bac_NtkAlloc( pNew, Bac_NtkNameId(
p), Bac_NtkPiNum(
p), Bac_NtkPoNum(
p), Bac_NtkObjNum(
p) );
559 if ( Vec_IntSize(&
p->vInfo) )
560 Vec_IntAppend( &pNew->
vInfo, &
p->vInfo );
561 Bac_NtkStartCopies(
p );
562 if ( Bac_NtkHasNames(
p) )
563 Bac_NtkStartNames( pNew );
565 Bac_ObjDup( pNew,
p, iObj );
567 Bac_BoxDup( pNew,
p, iObj );
569 Bac_ObjDup( pNew,
p, iObj );
571 Bac_ObjSetFanin( pNew, Bac_ObjCopy(
p, iObj), Bac_ObjCopy(
p, Bac_ObjFanin(
p, iObj)) );
573 assert( Bac_NtkObjNum(pNew) == Bac_NtkObjNumAlloc(pNew) );
579 Bac_NtkAlloc( pNew, Bac_NtkNameId(
p), Bac_NtkPiNum(
p), Bac_NtkPoNum(
p), Bac_NtkObjNum(
p) + 3*Bac_NtkCoNum(
p) );
580 if ( Vec_IntSize(&
p->vInfo) )
581 Vec_IntAppend( &pNew->
vInfo, &
p->vInfo );
582 Bac_NtkStartCopies(
p );
584 Bac_ObjDup( pNew,
p, iObj );
586 Bac_ObjDup( pNew,
p, iObj );
588 Bac_BoxDup( pNew,
p, iObj );
591 if ( Bac_ObjCopy(
p, iObj) >= 0 && Bac_ObjCopy(
p, Bac_ObjFanin(
p, iObj)) >= 0 )
592 Bac_ObjSetFanin( pNew, Bac_ObjCopy(
p, iObj), Bac_ObjCopy(
p, Bac_ObjFanin(
p, iObj)) );
598 assert( !Bac_NtkHasNames(pNew) );
599 Bac_NtkStartNames( pNew );
601 Bac_ObjSetName( pNew, Bac_ObjCopy(
p, iObj), Bac_ObjName(
p, iObj) );
604 Bac_ObjSetName( pNew, Bac_ObjCopy(
p, iBox), Bac_ObjName(
p, iBox) );
606 Bac_ObjSetName( pNew, Bac_ObjCopy(
p, iObj), Bac_ObjName(
p, iObj) );
610 if ( !Bac_ObjName(pNew, Bac_ObjFanin(pNew, Bac_ObjCopy(
p, iObj))) )
611 Bac_ObjSetName( pNew, Bac_ObjFanin(pNew, Bac_ObjCopy(
p, iObj)), Bac_ObjName(
p, iObj) );
613 if ( !Bac_ObjName(pNew, Bac_ObjFanin(pNew, Bac_ObjCopy(
p, iObj))) )
614 Bac_ObjSetName( pNew, Bac_ObjFanin(pNew, Bac_ObjCopy(
p, iObj)), Bac_ObjName(
p, iObj) );
617static inline void Bac_NtkFree(
Bac_Ntk_t *
p )
619 Vec_IntErase( &
p->vInputs );
620 Vec_IntErase( &
p->vOutputs );
621 Vec_IntErase( &
p->vInfo );
622 Vec_StrErase( &
p->vType );
623 Vec_IntErase( &
p->vFanin );
624 Vec_IntErase( &
p->vIndex );
625 Vec_IntErase( &
p->vName );
626 Vec_IntErase( &
p->vFanout );
627 Vec_IntErase( &
p->vCopy );
628 Vec_IntErase( &
p->vArray );
629 Vec_IntErase( &
p->vArray2 );
631static inline int Bac_NtkMemory(
Bac_Ntk_t *
p )
634 nMem += (int)Vec_IntMemory(&
p->vInputs);
635 nMem += (int)Vec_IntMemory(&
p->vOutputs);
636 nMem += (int)Vec_IntMemory(&
p->vInfo);
637 nMem += (int)Vec_StrMemory(&
p->vType);
638 nMem += (int)Vec_IntMemory(&
p->vFanin);
639 nMem += (int)Vec_IntMemory(&
p->vIndex);
640 nMem += (int)Vec_IntMemory(&
p->vName);
641 nMem += (int)Vec_IntMemory(&
p->vFanout);
642 nMem += (int)Vec_IntMemory(&
p->vCopy);
645static inline void Bac_NtkPrintStats(
Bac_Ntk_t *
p )
647 printf(
"pi =%5d ", Bac_NtkPiNum(
p) );
648 printf(
"pi =%5d ", Bac_NtkPoNum(
p) );
649 printf(
"box =%6d ", Bac_NtkBoxNum(
p) );
650 printf(
"clp =%7d ",
p->Count );
651 printf(
"obj =%7d ", Bac_NtkObjNum(
p) );
652 printf(
"%s ", Bac_NtkName(
p) );
653 if ( Bac_NtkHostNtk(
p) )
654 printf(
"-> %s", Bac_NtkName(Bac_NtkHostNtk(
p)) );
657static inline void Bac_NtkDeriveIndex(
Bac_Ntk_t *
p )
660 Vec_IntFill( &
p->vIndex, Bac_NtkObjNum(
p), -1 );
662 Bac_ObjSetIndex(
p, iObj, i );
664 Bac_ObjSetIndex(
p, iObj, i );
668 Bac_ObjSetIndex(
p, iTerm, i );
670 Bac_ObjSetIndex(
p, iTerm, i );
673static inline void Bac_NtkPrint(
Bac_Ntk_t *
p )
675 int i, Type, Value, Beg, End;
676 printf(
"Interface (%d):\n", Bac_NtkInfoNum(
p) );
679 printf(
"%6d : ", i );
680 printf(
"Type =%3d ", Bac_NtkInfoType(
p, i/3) );
682 printf(
"[%d:%d] ", End, Beg );
685 printf(
"Name =%3d ", Bac_NtkInfoName(
p, i/3) );
686 if ( Bac_NtkInfoName(
p, i/3) )
687 printf(
"%s", Bac_NtkStr(
p, Bac_NtkInfoName(
p, i/3) ) );
690 printf(
"Objects (%d):\n", Bac_NtkObjNum(
p) );
693 printf(
"%6d : ", i );
694 printf(
"Type =%3d ", Type );
695 if ( Bac_ObjIsCo(
p, i) )
696 printf(
"Fanin =%6d ", Bac_ObjFanin(
p, i) );
697 else if ( Bac_NtkHasNames(
p) && Bac_ObjName(
p, i) )
699 printf(
"Name =%6d(%d) ", Bac_ObjNameId(
p, i), Bac_ObjNameType(
p, i) );
701 printf(
"%s", Bac_ObjNameStr(
p, i) );
719static inline Bac_Man_t * Bac_ManAlloc(
char * pFileName,
int nNtks )
725 pNew->
pSpec = Abc_UtilStrsav( pFileName );
740 pNew->
pName = Abc_UtilStrsav( Bac_ManName(
p) );
741 pNew->
pSpec = Abc_UtilStrsav( Bac_ManSpec(
p) );
754 Bac_Man_t * pNew = Bac_ManStart(
p, Bac_ManNtkNum(
p) );
756 Bac_NtkSetCopy( pNtk, i );
758 Bac_NtkDup( Bac_NtkCopyNtk(pNew, pNtk), pNtk );
760 if ( (pHost = Bac_NtkHostNtk(pNtk)) )
761 Bac_NtkSetHost( Bac_NtkCopyNtk(pNew, pNtk), Bac_NtkCopy(pHost), Bac_ObjCopy(pHost, Bac_NtkHostObj(pNtk)) );
767 Bac_Man_t * pNew = Bac_ManStart(
p, Bac_ManNtkNum(
p) );
769 Bac_NtkSetCopy( pNtk, i );
771 Bac_NtkDupUserBoxes( Bac_NtkCopyNtk(pNew, pNtk), pNtk );
773 if ( (pHost = Bac_NtkHostNtk(pNtk)) )
774 Bac_NtkSetHost( Bac_NtkCopyNtk(pNew, pNtk), Bac_NtkCopy(pHost), Bac_ObjCopy(pHost, Bac_NtkHostObj(pNtk)) );
781 Bac_NtkMoveNames( Bac_NtkCopyNtk(pNew, pNtk), pNtk );
785static inline void Bac_ManFree(
Bac_Man_t *
p )
790 Vec_IntErase( &
p->vBuf2LeafNtk );
791 Vec_IntErase( &
p->vBuf2LeafObj );
792 Vec_IntErase( &
p->vBuf2RootNtk );
793 Vec_IntErase( &
p->vBuf2RootObj );
801static inline int Bac_ManMemory(
Bac_Man_t *
p )
812 nMem += Bac_NtkMemory( pNtk );
815static inline int Bac_ManObjNum(
Bac_Man_t *
p )
819 Count += Bac_NtkObjNum(pNtk);
822static inline int Bac_ManNodeNum(
Bac_Man_t *
p )
826 Count += Bac_NtkBoxNum( pNtk );
829static inline int Bac_ManBoxNum_rec(
Bac_Ntk_t *
p )
831 int iObj, Counter = 0;
835 Counter += Bac_ObjIsBoxUser(
p, iObj) ? Bac_ManBoxNum_rec( Bac_BoxNtk(
p, iObj) ) : 1;
836 return (
p->Count = Counter);
838static inline int Bac_ManBoxNum(
Bac_Man_t *
p )
843 return Bac_ManBoxNum_rec( Bac_ManRoot(
p) );
845static inline void Bac_ManPrintStats(
Bac_Man_t *
p,
int nModules,
int fVerbose )
849 printf(
"%-12s : ", Bac_ManName(
p) );
850 printf(
"pi =%5d ", Bac_NtkPiNum(pRoot) );
851 printf(
"po =%5d ", Bac_NtkPoNum(pRoot) );
852 printf(
"pri =%4d ", Bac_ManPrimNum(
p) );
853 printf(
"mod =%6d ", Bac_ManNtkNum(
p) );
854 printf(
"box =%7d ", Bac_ManNodeNum(
p) );
855 printf(
"obj =%7d ", Bac_ManObjNum(
p) );
856 printf(
"mem =%6.3f MB", 1.0*Bac_ManMemory(
p)/(1<<20) );
861 if ( i == nModules+1 )
863 printf(
"Module %5d : ", i );
864 Bac_NtkPrintStats( pNtk );
901static inline char * Ptr_SopToTypeName(
char * pSop )
903 if ( !
strcmp(pSop,
" 0\n") )
return "BAC_BOX_C0";
904 if ( !
strcmp(pSop,
" 1\n") )
return "BAC_BOX_C1";
905 if ( !
strcmp(pSop,
"1 1\n") )
return "BAC_BOX_BUF";
906 if ( !
strcmp(pSop,
"0 1\n") )
return "BAC_BOX_INV";
907 if ( !
strcmp(pSop,
"11 1\n") )
return "BAC_BOX_AND";
908 if ( !
strcmp(pSop,
"00 1\n") )
return "BAC_BOX_NOR";
909 if ( !
strcmp(pSop,
"00 0\n") )
return "BAC_BOX_OR";
910 if ( !
strcmp(pSop,
"-1 1\n1- 1\n") )
return "BAC_BOX_OR";
911 if ( !
strcmp(pSop,
"1- 1\n-1 1\n") )
return "BAC_BOX_OR";
912 if ( !
strcmp(pSop,
"01 1\n10 1\n") )
return "BAC_BOX_XOR";
913 if ( !
strcmp(pSop,
"10 1\n01 1\n") )
return "BAC_BOX_XOR";
914 if ( !
strcmp(pSop,
"11 1\n00 1\n") )
return "BAC_BOX_XNOR";
915 if ( !
strcmp(pSop,
"00 1\n11 1\n") )
return "BAC_BOX_XNOR";
916 if ( !
strcmp(pSop,
"10 1\n") )
return "BAC_BOX_SHARP";
917 if ( !
strcmp(pSop,
"01 1\n") )
return "BAC_BOX_SHARPL";
958 if ( Type ==
BAC_BOX_MUX )
return "11- 1\n0-1 1\n";
959 if ( Type ==
BAC_BOX_MAJ )
return "11- 1\n1-1 1\n-11 1\n";
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
#define Bac_NtkForEachObjType(p, Type, i)
void Bac_PtrFree(Vec_Ptr_t *vDes)
struct Bac_Man_t_ Bac_Man_t
Gia_Man_t * Bac_ManExtract(Bac_Man_t *p, int fBuffers, int fVerbose)
Bac_Man_t * Bac_ManCollapse(Bac_Man_t *p)
struct Bac_Ntk_t_ Bac_Ntk_t
#define Bac_BoxForEachBo(p, iBox, iTerm, i)
char * Bac_NtkGenerateName(Bac_Ntk_t *p, Bac_ObjType_t Type, Vec_Int_t *vBits)
#define Bac_BoxForEachBoMain(p, iBox, iTerm, i)
void Bac_NtkUpdateFanout(Bac_Ntk_t *p, int iOld, int iNew)
FUNCTION DEFINITIONS ///.
void Bac_ManDeriveFanout(Bac_Man_t *p)
Bac_Man_t * Bac_ManInsertGia(Bac_Man_t *p, Gia_Man_t *pGia)
#define Bac_NtkForEachCo(p, i)
int Bac_NtkBuildLibrary(Bac_Man_t *p)
#define Bac_NtkForEachPi(p, iObj, i)
Vec_Ptr_t * Psr_ManReadSmt(char *pFileName)
void Abc_FrameImportPtr(Vec_Ptr_t *vPtr)
FUNCTION DEFINITIONS ///.
void Bac_ManWriteBac(char *pFileName, Bac_Man_t *p)
void Bac_ManWriteBlif(char *pFileName, Bac_Man_t *p)
#define Bac_NtkForEachBoxUser(p, i)
Vec_Ptr_t * Abc_FrameExportPtr()
void Bac_ManAssignInternWordNames(Bac_Man_t *p)
Vec_Ptr_t * Bac_PtrTransformTest(Vec_Ptr_t *vDes)
#define Bac_BoxForEachBi(p, iBox, iTerm, i)
Vec_Int_t * Bac_NameToRanges(char *pName)
Bac_Man_t * Bac_ManReadBac(char *pFileName)
int Bac_PtrMemory(Vec_Ptr_t *vDes)
Bac_ObjType_t Bac_NameToType(char *pName)
Vec_Ptr_t * Psr_ManReadVerilog(char *pFileName)
void Bac_PtrDumpVerilog(char *pFileName, Vec_Ptr_t *vDes)
Bac_Man_t * Bac_PtrTransformToCba(Vec_Ptr_t *vDes)
#define Bac_NtkForEachPo(p, iObj, i)
#define Bac_BoxForEachBiReverse(p, iBox, iTerm, i)
void Bac_PtrDumpBlif(char *pFileName, Vec_Ptr_t *vDes)
#define Bac_ManForEachNtk(p, pNtk, i)
MACRO DEFINITIONS ///.
void Psr_ManWriteBlif(char *pFileName, Vec_Ptr_t *p)
#define Bac_NtkForEachBox(p, i)
#define Bac_BoxForEachBiMain(p, iBox, iTerm, i)
Bac_Man_t * Psr_ManBuildCba(char *pFileName, Vec_Ptr_t *vDes)
void * Bac_ManInsertAbc(Bac_Man_t *p, void *pAbc)
void Bac_ManSetupTypes(char **pNames, char **pSymbs)
void Psr_ManWriteVerilog(char *pFileName, Vec_Ptr_t *p)
Bac_ObjType_t
INCLUDES ///.
Vec_Ptr_t * Psr_ManReadBlif(char *pFileName)
void Bac_ManWriteVerilog(char *pFileName, Bac_Man_t *p, int fUseAssign)
Vec_Ptr_t * Bac_PtrDeriveFromCba(Bac_Man_t *p)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Vec_Str_t_ Vec_Str_t
struct Gia_Man_t_ Gia_Man_t
char * pPrimNames[BAC_BOX_UNKNOWN]
char * pPrimSymbs[BAC_BOX_UNKNOWN]
int Abc_NamStrFind(Abc_Nam_t *p, char *pStr)
int Abc_NamMemUsed(Abc_Nam_t *p)
int Abc_NamStrFindOrAdd(Abc_Nam_t *p, char *pStr, int *pfFound)
int Abc_NamObjNumMax(Abc_Nam_t *p)
Abc_Nam_t * Abc_NamStart(int nObjs, int nAveSize)
FUNCTION DEFINITIONS ///.
void Abc_NamDeref(Abc_Nam_t *p)
Abc_Nam_t * Abc_NamRef(Abc_Nam_t *p)
char * Abc_NamStr(Abc_Nam_t *p, int NameId)
typedefABC_NAMESPACE_HEADER_START struct Abc_Nam_t_ Abc_Nam_t
INCLUDES ///.
#define Vec_IntForEachEntryTriple(vVec, Entry1, Entry2, Entry3, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.