36static const char * s_Pref =
"ABC_";
127 if ( s_Types[i].Type == Type )
137 pNames[Type] = s_Types[Id].pName;
138 pSymbs[Type] = s_Types[Id].pSymb;
144 static char Buffer[100];
145 char * pTemp;
int i, Bits;
146 char * pName = Bac_ManPrimName(
p->pDesign, Type );
147 char * pSymb = Bac_ManPrimSymb(
p->pDesign, Type );
149 sprintf( Buffer,
"%s%s_", s_Pref, pName );
150 pTemp = Buffer +
strlen(Buffer);
153 sprintf( pTemp,
"%c%d", pSymb[i], Bits );
168 if ( !
strncmp(pName, s_Types[i].pName,
strlen(s_Types[i].pName)) )
169 return s_Types[i].Type;
175 static int pArray[10];
177 int Num = 0, Count = 0;
179 vBits->pArray = pArray;
184 for ( pTemp = pName; *pTemp && !Bac_CharIsDigit(*pTemp); pTemp++ );
185 assert( Bac_CharIsDigit(*pTemp) );
186 for ( ; *pTemp; pTemp++ )
188 if ( Bac_CharIsDigit(*pTemp) )
189 Num = 10 * Num + *pTemp -
'0';
191 Vec_IntPush( vBits, Num ), Count += Num, Num = 0;
194 Vec_IntPush( vBits, Num ); Count += Num;
195 assert( Vec_IntSize(vBits) <= 10 );
218 assert( Bac_ObjIsCi(
p, iOld) );
219 assert( Bac_ObjIsCi(
p, iNew) );
222 assert( Bac_ObjFanin(
p, iCo) == iOld );
223 Bac_ObjCleanFanin(
p, iCo );
224 Bac_ObjSetFanin(
p, iCo, iNew );
226 Bac_ObjSetFanout(
p, iNew, Bac_ObjFanout(
p, iOld) );
227 Bac_ObjSetFanout(
p, iOld, 0 );
244 assert( !Bac_NtkHasFanouts(
p) );
245 Bac_NtkStartFanouts(
p );
248 assert( !Bac_ObjNextFanout(
p, iCo) );
249 iCi = Bac_ObjFanin(
p, iCo);
250 if ( Bac_ObjFanout(
p, iCi) )
251 Bac_ObjSetNextFanout(
p, Bac_ObjFanout(
p, iCi), iCo );
252 Bac_ObjSetFanout(
p, iCi, iCo );
255 if ( !Bac_ObjNextFanout(
p, iCo) )
256 Bac_ObjSetFanout(
p, Bac_ObjFanin(
p, iCo), iCo );
278 char Buffer[16];
int i, NameId = 0;
279 for ( i = 0; !NameId || Vec_IntEntry(vMap, NameId); i++ )
282 sprintf( Buffer,
"%s%0*d", pPref, nDigits, iNum );
284 sprintf( Buffer,
"%s%0*d_%d", pPref, nDigits, iNum, i );
287 Vec_IntWriteEntry( vMap, NameId, 1 );
292 int i, iObj, iBox, Count = 0;
294 if ( !Bac_ObjNameInt(
p, iObj) )
298 if ( !Bac_ObjNameInt(
p, iObj) )
304 int k, iObj, iTerm, iName = -1, iBit = -1;
305 int nDigits, nPis = 0, nPos = 0, nNames = 1;
307 if ( !Bac_NtkHasNames(
p) )
308 Bac_NtkStartNames(
p);
312 if ( Bac_ObjNameInt(
p, iObj) )
313 Vec_IntWriteEntry( vMap, Bac_ObjNameId(
p, iObj), 1 );
315 if ( Bac_ObjNameInt(
p, iObj) )
316 Vec_IntWriteEntry( vMap, Bac_ObjNameId(
p, iObj), 1 );
320 if ( Bac_ObjNameInt(
p, iObj) )
326 if ( Bac_ObjBit(
p, iObj) )
334 int Range = Bac_ObjIsPi(
p, iObj) ? Bac_ObjPiRange(
p, iObj) : Bac_BoxBoRange(
p, iObj);
337 Bac_ObjSetName(
p, iObj, Abc_Var2Lit2(iName,
BAC_NAME_BIN) );
344 if ( Bac_NtkInfoNum(
p) )
346 for ( k = 0; k < Bac_NtkInfoNum(
p); k++ )
349 if ( Bac_NtkInfoType(
p, k) == 1 )
351 iObj = Bac_NtkPi(
p, nPis);
352 assert( !Bac_ObjBit(
p, iObj) );
354 Bac_NtkSetInfoName(
p, k, Abc_Var2Lit2(Bac_ObjNameId(
p, iObj), 1) );
355 nPis += Bac_NtkInfoRange(
p, k);
357 else if ( Bac_NtkInfoType(
p, k) == 2 )
359 iObj = Bac_NtkPo(
p, nPos);
360 assert( !Bac_ObjBit(
p, iObj) );
361 iObj = Bac_ObjFanin(
p, iObj);
363 Bac_NtkSetInfoName(
p, k, Abc_Var2Lit2(Bac_ObjNameId(
p, iObj), 2) );
364 nPos += Bac_NtkInfoRange(
p, k);
368 assert( nPis == Bac_NtkPiNum(
p) );
369 assert( nPos == Bac_NtkPoNum(
p) );
372 nDigits = Abc_Base10Log( Bac_NtkObjNum(
p) );
374 if ( !Bac_ObjNameInt(
p, iObj) )
377 Bac_ObjSetName(
p, iObj, Abc_Var2Lit2(iName,
BAC_NAME_BIN) );
382 Vec_IntWriteEntry( vMap, Bac_ObjNameId(
p, iObj), 0 );
385 Vec_IntWriteEntry( vMap, Bac_ObjNameId(
p, iObj), 0 );
388 Vec_IntWriteEntry( vMap, Bac_ObjNameId(
p, iTerm), 0 );
394 Vec_Int_t * vMap = Vec_IntStart( 2*Bac_ManObjNum(
p) );
398 assert( Vec_IntCountEntry(vMap, 0) == Vec_IntSize(vMap) );
420 Counter += Bac_ObjIsBoxUser(
p, i) ?
Bac_ManClpObjNum_rec( Bac_BoxNtk(
p, i) ) + 3*Bac_BoxBoNum(
p, i) : Bac_BoxSize(
p, i);
421 return (
p->Count = Counter);
445 if ( Bac_ObjIsBo(
p, iObj) == 1 )
450 assert( Bac_ObjIsPi(
p, iObj) || Bac_ObjIsBox(
p, iObj) );
451 if ( Bac_ObjCopy(
p, iObj) > 0 )
453 Bac_ObjSetCopy(
p, iObj, 1 );
456 Vec_IntPush( vBoxes, iObj );
461 Vec_Int_t * vBoxes = Vec_IntAlloc( Bac_NtkBoxNum(
p) );
462 Bac_NtkStartCopies(
p );
464 Bac_ObjSetCopy(
p, iObj, 1 );
484 assert( Bac_ObjIsBoxUser(
p, iObj) );
485 if ( Bac_ObjCopy(
p, iObj) == 1 )
487 if ( Bac_ObjCopy(
p, iObj) == 0 )
489 Bac_ObjSetCopy(
p, iObj, 0 );
491 if ( Bac_ObjIsBo(
p, iFanin) && Bac_ObjIsBoxUser(
p, Bac_ObjFanin(
p, iFanin)) )
494 Vec_IntPush( vBoxes, iObj );
495 Bac_ObjSetCopy(
p, iObj, 1 );
501 Bac_NtkStartCopies(
p );
502 Vec_IntClear( &
p->vArray );
506 printf(
"Cyclic dependency of user boxes is detected.\n" );
525 int i, iObj, iObjNew, iTerm;
526 Bac_NtkStartCopies(
p );
528 assert( Vec_IntSize(vSigs) == Bac_NtkPiNum(
p) );
530 Bac_ObjSetCopy(
p, iObj, Vec_IntEntry(vSigs, i) );
533 if ( Bac_ObjIsBoxPrim(
p, iObj ) )
534 Bac_BoxDup( pNew,
p, iObj );
539 iObjNew = Bac_ObjAlloc( pNew,
BAC_OBJ_BI, -1 );
541 iObjNew = Bac_ObjAlloc( pNew,
BAC_OBJ_BO, -1 );
542 Bac_ObjSetCopy(
p, iTerm, iObjNew );
547 if ( Bac_ObjIsBoxPrim(
p, iObj ) )
550 Bac_ObjSetFanin( pNew, Bac_ObjCopy(
p, iTerm), Bac_ObjCopy(
p, Bac_ObjFanin(
p, iTerm)) );
554 Vec_IntClear( vSigs );
556 Vec_IntPush( vSigs, Bac_ObjCopy(
p, Bac_ObjFanin(
p, iTerm)) );
558 assert( Vec_IntSize(vSigs) == Bac_BoxBoNum(
p, iObj) );
560 Bac_ObjSetFanin( pNew, Bac_ObjCopy(
p, iTerm)-2, Vec_IntEntry(vSigs, i) );
563 Vec_IntClear( vSigs );
565 Vec_IntPush( vSigs, Bac_ObjCopy(
p, Bac_ObjFanin(
p, iObj)) );
570 Vec_Int_t * vSigs = Vec_IntAlloc( 1000 );
573 Bac_Ntk_t * pRootNew = Bac_ManRoot( pNew );
574 Bac_NtkAlloc( pRootNew, Bac_NtkNameId(pRoot), Bac_NtkPiNum(pRoot), Bac_NtkPoNum(pRoot),
Bac_ManClpObjNum(
p) );
575 if ( Vec_IntSize(&pRoot->
vInfo) )
576 Vec_IntAppend( &pRootNew->
vInfo, &pRoot->
vInfo );
578 Vec_IntPush( vSigs, Bac_ObjAlloc(pRootNew,
BAC_OBJ_PI, -1) );
580 assert( Vec_IntSize(vSigs) == Bac_NtkPoNum(pRoot) );
582 Bac_ObjAlloc( pRootNew,
BAC_OBJ_PO, Vec_IntEntry(vSigs, i) );
583 assert( Bac_NtkObjNum(pRootNew) == Bac_NtkObjNumAlloc(pRootNew) );
584 Vec_IntFree( vSigs );
586 if ( Bac_NtkHasNames(pRoot) )
588 Bac_NtkStartNames( pRootNew );
590 Bac_ObjSetName( pRootNew, Bac_NtkPi(pRootNew, i), Bac_ObjName(pRoot, iObj) );
592 if ( !Bac_ObjIsPi(pRoot, iObj) )
593 Bac_ObjSetName( pRootNew, Bac_ObjCopy(pRoot, iObj), Bac_ObjName(pRoot, iObj) );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Bac_Man_t * Bac_ManCollapse(Bac_Man_t *p)
char * Bac_NtkGenerateName(Bac_Ntk_t *p, Bac_ObjType_t Type, Vec_Int_t *vBits)
int Bac_ManAssignInternTwo(Bac_Ntk_t *p, int iNum, int nDigits, char *pPref, Vec_Int_t *vMap)
void Bac_NtkUpdateFanout(Bac_Ntk_t *p, int iOld, int iNew)
FUNCTION DEFINITIONS ///.
int Bac_NtkDfsUserBoxes(Bac_Ntk_t *p)
void Bac_ManDeriveFanout(Bac_Man_t *p)
void Bac_NtkDeriveFanout(Bac_Ntk_t *p)
void Bac_ManAssignInternWordNames(Bac_Man_t *p)
int Bac_ManAssignCountNames(Bac_Ntk_t *p)
int Bac_ManClpObjNum_rec(Bac_Ntk_t *p)
Vec_Int_t * Bac_NameToRanges(char *pName)
void Bac_NtkDfs_rec(Bac_Ntk_t *p, int iObj, Vec_Int_t *vBoxes)
Bac_ObjType_t Bac_NameToType(char *pName)
typedefABC_NAMESPACE_IMPL_START struct Bac_Pair_t_ Bac_Pair_t
DECLARATIONS ///.
int Bac_ManClpObjNum(Bac_Man_t *p)
int Bac_NtkDfsUserBoxes_rec(Bac_Ntk_t *p, int iObj, Vec_Int_t *vBoxes)
Vec_Int_t * Bac_NtkDfs(Bac_Ntk_t *p)
void Bac_ManAssignInternWordNamesNtk(Bac_Ntk_t *p, Vec_Int_t *vMap)
void Bac_ManSetupTypes(char **pNames, char **pSymbs)
void Bac_NtkCollapse_rec(Bac_Ntk_t *pNew, Bac_Ntk_t *p, Vec_Int_t *vSigs)
struct Bac_Man_t_ Bac_Man_t
struct Bac_Ntk_t_ Bac_Ntk_t
#define Bac_BoxForEachBo(p, iBox, iTerm, i)
#define Bac_BoxForEachBoMain(p, iBox, iTerm, i)
#define Bac_NtkForEachCo(p, i)
#define Bac_NtkForEachPi(p, iObj, i)
#define Bac_NtkForEachCi(p, i)
#define Bac_BoxForEachFanin(p, iBox, iFanin, i)
#define Bac_NtkForEachBoxUser(p, i)
#define Bac_BoxForEachBi(p, iBox, iTerm, i)
#define Bac_NtkForEachPo(p, iObj, i)
#define Bac_ObjForEachFanout(p, iCi, iCo)
#define Bac_NtkForEachPoDriver(p, iObj, i)
#define Bac_ManForEachNtk(p, pNtk, i)
MACRO DEFINITIONS ///.
#define Bac_NtkForEachBox(p, i)
#define Bac_NtkForEachPiMain(p, iObj, i)
Bac_ObjType_t
INCLUDES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
int Abc_NamStrFindOrAdd(Abc_Nam_t *p, char *pStr, int *pfFound)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.