46static inline void Vec_WrdSelectSortCost2(
word * pArray,
int nSize,
word * pCosts )
49 for ( i = 0; i < nSize-1; i++ )
52 for ( j = i+1; j < nSize; j++ )
53 if ( pCosts[j] < pCosts[best_i] )
59static inline word Cba_NtkPrintDistribMakeSign(
int s,
int s0,
int s1 )
63static inline void Cba_NtkPrintDistribFromSign(
word sss,
int * s,
int * s0,
int * s1 )
65 *s1 = (int)(sss >> 42); *s0 = (int)(sss >> 21) & 0x1FFFFF; *s = (int)sss & 0x1FFFFF;
67static inline void Cba_NtkPrintDistribAddOne(
Vec_Ptr_t * vTypes,
Vec_Ptr_t * vOccurs,
int Type,
word Sign )
75 Vec_WrdAddToEntry( vOccur, i, 1 );
78 Vec_WrdPush( vType, Sign );
79 Vec_WrdPush( vOccur, 1 );
85 Vec_WrdSelectSortCost2( Vec_WrdArray(vType), Vec_WrdSize(vType), Vec_WrdArray(vOccur) );
86 Vec_WrdReverseOrder( vType );
87 Vec_WrdReverseOrder( vOccur );
93 int iRnObj = -1, nCountRange = 0;
94 int i, k, s, s0, s1;
word Sign;
102 Vec_PtrWriteEntry( vTypes, i, Vec_WrdAlloc(16) );
104 Vec_PtrWriteEntry( vOccurs, i, Vec_WrdAlloc(16) );
109 Type = Cba_ObjType(
p, i );
110 if ( Cba_ObjSign(
p, i) > 0x1FFFFF )
111 printf(
"Object %6d has range %d, which is reduced to %d in the statistics.\n",
112 i, Cba_ObjRangeSize(
p, i), Cba_ObjRangeSize(
p, i) & 0xFFFFF );
113 if ( Cba_ObjLeft(
p, i) && Cba_ObjRight(
p, i) )
121 Sign = Cba_NtkPrintDistribMakeSign( Cba_ObjSign(
p, i), 0, 0 );
123 else if ( Cba_TypeIsUnary(Type) )
124 Sign = Cba_NtkPrintDistribMakeSign( Cba_ObjSign(
p, i), Cba_ObjSign(
p, Cba_ObjFinFon(
p, i, 0)), 0 );
126 else if ( Cba_ObjFinNum(
p, i) == 1 )
127 Sign = Cba_NtkPrintDistribMakeSign( Cba_ObjSign(
p, i), Cba_ObjSign(
p, Cba_ObjFinFon(
p, i, 0)), 0 );
130 assert( Cba_ObjFinNum(
p, i) >= 2 );
131 Sign = Cba_NtkPrintDistribMakeSign( Cba_ObjSign(
p, i), Cba_ObjSign(
p, Cba_ObjFinFon(
p, i, 0)), Cba_ObjSign(
p, Cba_ObjFinFon(
p, i, 1)) );
134 Cba_NtkPrintDistribAddOne( vTypes, vOccurs, Type, Sign );
137 Vec_IntAddToEntry( vAnds,
CBA_BOX_MUX, 3 * Cba_ObjRangeSize(
p, i) * (Cba_ObjFinNum(
p, i) - 2) );
139 Vec_IntAddToEntry( vAnds,
CBA_BOX_SHIR, Abc_MinInt(Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)), Abc_Base2Log(Cba_ObjRangeSize(
p, i))) * 3 );
141 Vec_IntAddToEntry( vAnds,
CBA_BOX_SHIRA, Cba_ObjRangeSize(
p, i) * Abc_MinInt(Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)), Abc_Base2Log(Cba_ObjRangeSize(
p, i))) * 3 );
143 Vec_IntAddToEntry( vAnds,
CBA_BOX_SHIL, Cba_ObjRangeSize(
p, i) * Abc_MinInt(Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)), Abc_Base2Log(Cba_ObjRangeSize(
p, i))) * 3 );
145 Vec_IntAddToEntry( vAnds,
CBA_BOX_SHILA, Cba_ObjRangeSize(
p, i) * Abc_MinInt(Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)), Abc_Base2Log(Cba_ObjRangeSize(
p, i))) * 3 );
147 Vec_IntAddToEntry( vAnds,
CBA_BOX_ROTR, Cba_ObjRangeSize(
p, i) * Abc_MinInt(Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)), Abc_Base2Log(Cba_ObjRangeSize(
p, i))) * 3 );
149 Vec_IntAddToEntry( vAnds,
CBA_BOX_ROTL, Cba_ObjRangeSize(
p, i) * Abc_MinInt(Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)), Abc_Base2Log(Cba_ObjRangeSize(
p, i))) * 3 );
153 Vec_IntAddToEntry( vAnds,
CBA_BOX_AND, Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) );
155 Vec_IntAddToEntry( vAnds,
CBA_BOX_OR, Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) );
157 Vec_IntAddToEntry( vAnds,
CBA_BOX_XOR, 3 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) );
163 Vec_IntAddToEntry( vAnds,
CBA_BOX_LNOT, Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) - 1 );
165 Vec_IntAddToEntry( vAnds,
CBA_BOX_LAND, Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) + Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 1)) - 1 );
167 Vec_IntAddToEntry( vAnds,
CBA_BOX_LOR, Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) + Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 1)) - 1 );
169 Vec_IntAddToEntry( vAnds,
CBA_BOX_LXOR, Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) + Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 1)) + 1 );
171 Vec_IntAddToEntry( vAnds,
CBA_BOX_EQU, 4 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) - 1 );
173 Vec_IntAddToEntry( vAnds,
CBA_BOX_NEQU, 4 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) - 1 );
175 Vec_IntAddToEntry( vAnds,
CBA_BOX_LTHAN, 6 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) - 6 );
177 Vec_IntAddToEntry( vAnds,
CBA_BOX_MTHAN, 6 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) - 6 );
179 Vec_IntAddToEntry( vAnds,
CBA_BOX_LETHAN, 6 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) - 6 );
181 Vec_IntAddToEntry( vAnds,
CBA_BOX_METHAN, 6 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) - 6 );
183 Vec_IntAddToEntry( vAnds,
CBA_BOX_RAND, Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) - 1 );
185 Vec_IntAddToEntry( vAnds,
CBA_BOX_ROR, Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) - 1 );
187 Vec_IntAddToEntry( vAnds,
CBA_BOX_RXOR, 3 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) - 3 );
189 Vec_IntAddToEntry( vAnds,
CBA_BOX_ADD, 9 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) );
191 Vec_IntAddToEntry( vAnds,
CBA_BOX_SUB, 9 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) );
193 Vec_IntAddToEntry( vAnds,
CBA_BOX_MUL, 9 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 1)) );
195 Vec_IntAddToEntry( vAnds,
CBA_BOX_DIV, 13 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) - 19 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) + 10 );
197 Vec_IntAddToEntry( vAnds,
CBA_BOX_MOD, 13 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) - 7 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) - 2 );
199 Vec_IntAddToEntry( vAnds,
CBA_BOX_POW, 10 * (
int)pow((
double)Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)),(
double)Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0))) );
201 Vec_IntAddToEntry( vAnds,
CBA_BOX_MIN, 4 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) );
203 Vec_IntAddToEntry( vAnds,
CBA_BOX_SQRT, 11 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) / 8 + 5 * Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)) / 2 - 5 );
207 printf(
"Warning: %d objects of the design have non-zero-based ranges.\n", nCountRange );
208 printf(
"In particular, object %6d with name \"%s\" has range %d=[%d:%d]\n",
209 iRnObj, Cba_FonNameStr(
p, Cba_ObjFon0(
p, iRnObj)),
210 Cba_ObjRangeSize(
p, iRnObj), Cba_ObjLeft(
p, iRnObj), Cba_ObjRight(
p, iRnObj) );
213 printf(
"ID : name occurrence and2 (occurrence)<output_range>=<input_range>.<input_range> ...\n" );
218 if (
p->pDesign->nObjs[i] == 0 )
220 printf(
"%2d : %-8s %6d%8d ", i, pTypeNames[i],
p->pDesign->nObjs[i], Vec_IntEntry(vAnds, i) );
225 Cba_NtkPrintDistribFromSign( Sign, &s, &s0, &s1 );
226 if ( ((k % 6) == 5 && s1) || ((k % 8) == 7 && !s1) )
228 printf(
"(%d)", (
int)Vec_WrdEntry( vOccur, k ) );
229 printf(
"%s%d", Abc_LitIsCompl(s)?
"-":
"", Abc_Lit2Var(s) );
231 printf(
"=%s%d", Abc_LitIsCompl(s0)?
"-":
"", Abc_Lit2Var(s0) );
233 printf(
".%s%d", Abc_LitIsCompl(s1)?
"-":
"", Abc_Lit2Var(s1) );
240 Vec_IntFree( vAnds );
244 int i, iFon0, iFon1, Counter = 0;
247 printf(
"Operation %s\n", pTypeNames[Type] );
250 if ( (
int)Type != Type )
252 iFon0 = Cba_ObjFinFon(
p, i, 0);
253 iFon1 = Cba_ObjFinFon(
p, i, 1);
255 printf(
"%8d :", Counter++ );
256 printf(
"%8d : ", i );
257 printf(
"%3d%s = ", Cba_ObjRangeSize(
p, i), Cba_ObjSigned(
p, i) ?
"s" :
" " );
258 printf(
"%3d%s %s ", Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 0)), Cba_ObjSigned(
p, iFon0) ?
"s" :
" ", pTypeNames[Type] );
259 printf(
"%3d%s ", Cba_ObjRangeSize(
p, Cba_ObjFinFon(
p, i, 1)), Cba_ObjSigned(
p, iFon1) ?
"s" :
" " );
261 printf(
"%-12s = ", Cba_ObjNameStr(
p, i) );
262 printf(
"%-12s %s ", Cba_FonIsConst(iFon0) ? Cba_NtkConst(
p, Cba_FonConst(iFon0)) : Cba_FonNameStr(
p, iFon0), pTypeNames[Type] );
263 printf(
"%-12s ", Cba_FonIsConst(iFon1) ? Cba_NtkConst(
p, Cba_FonConst(iFon1)) : Cba_FonNameStr(
p, iFon1) );
272 printf(
"%-20s : ", Cba_NtkName(
p) );
273 printf(
"PI = %4d ", Cba_NtkPiNum(
p) );
274 printf(
"PO = %4d ", Cba_NtkPoNum(
p) );
275 printf(
"FF = %4d ", Cba_NtkBoxSeqNum(
p) );
276 printf(
"Obj = %6d ", Cba_NtkObjNum(
p) );
277 printf(
"Mem = %.3f MB", 1.0*Cba_NtkMemory(
p)/(1<<20) );
286 printf(
"Node type statistics:\n" );
289 if ( !
p->pDesign->nObjs[i] )
291 if (
p->pDesign->nAnds[0] &&
p->pDesign->nAnds[i] )
292 printf(
"%2d : %-8s %6d %7.2f %%\n", i, pTypeNames[i],
p->pDesign->nObjs[i], 100.0*
p->pDesign->nAnds[i]/
p->pDesign->nAnds[0] );
294 printf(
"%2d : %-8s %6d\n", i, pTypeNames[i],
p->pDesign->nObjs[i] );
314 if ( Cba_ObjIsBoxUser(
p, i) )
315 pUserCounts[Cba_ObjNtkId(
p, i)]++;
317 pCounts[Cba_ObjType(
p, i)]++;
323 printf(
"Primitives (%d):\n", Cba_NtkBoxPrimNum(
p) );
326 printf(
"%-20s = %5d\n", Cba_NtkTypeName(
p, i), pCounts[i] );
327 printf(
"User hierarchy (%d):\n", Cba_NtkBoxUserNum(
p) );
329 if ( pUserCounts[i] )
330 printf(
"%-20s = %5d\n", Cba_NtkName(pNtk), pUserCounts[i] );
335 int * pUserCounts =
ABC_CALLOC(
int, Cba_ManNtkNum(
p->pDesign) + 1 );
345 printf(
"Primitives:\n" );
348 printf(
"%-20s = %5d\n", Cba_NtkTypeName(pNtk, i), pCounts[i] );
349 printf(
"User hierarchy:\n" );
351 if ( pUserCounts[i] )
352 printf(
"%-20s = %5d\n", Cba_NtkName(pNtk), pUserCounts[i] );
358 int * pUserCounts =
ABC_CALLOC(
int, Cba_ManNtkNum(
p) + 1 );
378static inline int Cba_CharIsDigit(
char c ) {
return c >=
'0' && c <=
'9'; }
382 if ( Cba_CharIsDigit(p1[i]) || Cba_CharIsDigit(p2[i]) )
385 if ( (i > 0 && Cba_CharIsDigit(p1[i-1])) || (Cba_CharIsDigit(p1[i]) && Cba_CharIsDigit(p2[i])) )
389 for ( --i; i >= 0; i-- )
390 if ( !Cba_CharIsDigit(p1[i]) )
394 assert( Cba_CharIsDigit(p1[i]) );
395 assert( Cba_CharIsDigit(p2[i]) );
397 assert( i == 0 || !Cba_CharIsDigit(p1[i-1]) );
398 assert( i == 0 || !Cba_CharIsDigit(p2[i-1]) );
400 Num1 = atoi( p1 + i );
401 Num2 = atoi( p2 + i );
421 char * p2 = *pp2;
int i;
422 for ( i = 0; p1[i] && p2[i]; i++ )
423 if ( p1[i] != p2[i] )
425 assert( !p1[i] || !p2[i] );
430 char Buffer[1000], * pName;
433 if ( Vec_IntSize(vObjs) < 2 )
435 vNames = Vec_PtrAlloc( Vec_IntSize(vObjs) );
438 char * pTypeName = Cba_NtkTypeName(
p, Cba_ObjType(
p, iObj) );
439 char * pInstName = vNameIds ? Cba_NtkStr(
p, Vec_IntEntry(vNameIds, i)) : Cba_ObjNameStr(
p, iObj);
440 sprintf( Buffer,
"%s_%s_%d", pTypeName, pInstName, iObj );
441 Vec_PtrPush( vNames, Abc_UtilStrsav(Buffer) );
448 Vec_PtrSort( vNames, (
int (*)(
const void *,
const void *))
Cba_StrCmp );
454 Vec_IntClear( vObjs );
456 Vec_IntPush( vObjs, atoi(
strrchr(pName,
'_')+1) );
457 Vec_PtrFreeFree( vNames );
474 int i, iObj, Count = Cba_NtkPiNum(
p);
476 Count += Cba_ObjFonNum(
p, iObj);
481 int i, iObj, Count = Cba_NtkPoNum(
p);
483 Count += Cba_ObjFinNum(
p, iObj);
500 int i, k, iObj, iFin, iFanin, fTopo = 1;
501 Vec_Bit_t * vVisited = Vec_BitStart( Cba_NtkObjNum(
p) + 1 );
504 Vec_BitWriteEntry( vVisited, iObj, 1 );
506 Vec_BitWriteEntry( vVisited, iObj, 1 );
509 if ( !Cba_ObjIsSeq(
p, iObj) )
512 if ( !Vec_BitEntry(vVisited, iFanin) )
516 Vec_BitWriteEntry( vVisited, iObj, 1 );
523 if ( !Vec_BitEntry(vVisited, iFanin) )
532 if ( !Vec_BitEntry(vVisited, iFanin) )
537 Vec_BitFree( vVisited );
563 if ( Cba_ObjIsPi(
p, iObj) )
565 if ( Cba_ObjCopy(
p, iObj) == 1 )
567 if ( Cba_ObjCopy(
p, iObj) == 0 )
569 Cba_ObjSetCopy(
p, iObj, 0 );
571 if ( !Cba_ObjIsSeq(
p, iFanin) )
575 Vec_IntSetEntry( &
p->vObjCopy, iObj, 1 );
581 Cba_NtkCleanObjCopies(
p );
583 if ( !Cba_ObjIsSeq(
p, iObj) )
586 printf(
"Cyclic dependency of user boxes is detected.\n" );
605 Vec_Int_t * vMap = Vec_IntStartFull( nObjs + 1 );
608 Vec_IntWriteEntry( vMap, iObj, i );
633 if ( !Cba_ObjCopy(
p, iObj) )
635 Cba_ObjSetCopy(
p, iObj, 0 );
638 Vec_IntPush( vObjs, iObj );
642 int i, k, iObj, iFin, iFanin;
643 Vec_Int_t * vObjs = Vec_IntAlloc( Cba_NtkObjNum(
p) );
646 Vec_IntPush( vObjs, iObj );
648 Vec_IntPush( vObjs, iObj );
650 Cba_NtkCleanObjCopies(
p );
652 Cba_ObjSetCopy(
p, iObj, 0 );
662 Vec_IntPush( vObjs, iObj );
663 assert( Vec_IntSize(vObjs) <= Cba_NtkObjNum(
p) );
667 printf(
"Warning: DSF ordering for module \"%s\" collected %d out of %d objects.\n", Cba_NtkName(
p), Vec_IntSize(vObjs), Cba_NtkObjNum(
p) );
668 printf(
" For example, object %d with name \"%s\" is not reachable from outputs.\n",
669 iObj, iObj > 0 ? Cba_FonNameStr(
p, Cba_ObjFon0(
p, iObj) ) :
"<unknown>" );
688 int iObj, Id = Cba_NtkId(
p);
689 if ( pCountN[Id] >= 0 )
691 pCountN[Id] = pCountI[Id] = pCountO[Id] = 0;
693 if ( Cba_ObjIsBoxPrim(
p, iObj) )
696 pCountI[Id] += Cba_ObjFinNum(
p, iObj);
697 pCountO[Id] += Cba_ObjFonNum(
p, iObj);
699 else if ( Cba_ObjIsBoxUser(
p, iObj) )
701 int NtkId = Cba_ObjNtkId(
p, iObj);
703 pCountN[Id] += pCountN[NtkId] + Cba_ObjFonNum(
p, iObj);
704 pCountI[Id] += pCountI[NtkId] + Cba_ObjFonNum(
p, iObj);
705 pCountO[Id] += pCountO[NtkId] + Cba_ObjFonNum(
p, iObj);
710 int * pCountN =
ABC_FALLOC(
int, Cba_ManNtkNum(
p) + 1 );
711 int * pCountI =
ABC_FALLOC(
int, Cba_ManNtkNum(
p) + 1 );
712 int * pCountO =
ABC_FALLOC(
int, Cba_ManNtkNum(
p) + 1 );
715 *nObjs = Cba_NtkPioNum(pRoot) + pCountN[Cba_NtkId(pRoot)];
716 *nFins = Cba_NtkPoNum(pRoot) + pCountI[Cba_NtkId(pRoot)];
717 *nFons = Cba_NtkPiNum(pRoot) + pCountO[Cba_NtkId(pRoot)];
736 int i, iObj, iObjNew, iFin, iFon;
737 Cba_NtkCleanObjCopies(
p );
738 Cba_NtkCleanFonCopies(
p );
740 assert( Vec_IntSize(vSigs) == Cba_NtkPiNum(
p) );
742 Cba_FonSetCopy(
p, iFon, Vec_IntEntry(vSigs, i) );
745 if ( Cba_ObjIsBoxPrim(
p, iObj ) )
747 iObjNew = Cba_ObjDup( pNew,
p, iObj );
749 Cba_FonSetCopy(
p, iFon, Cba_ObjFon(pNew, iObjNew, i) );
750 if ( Cba_ObjAttr(
p, iObj) )
751 Cba_ObjSetAttrs( pNew, iObjNew, Cba_ObjAttrArray(
p, iObj), Cba_ObjAttrSize(
p, iObj) );
753 else if ( Cba_ObjIsBoxUser(
p, iObj ) )
758 Cba_FonSetCopy(
p, iFon, Cba_ObjFon0(pNew, iObjNew) );
763 if ( Cba_ObjIsBoxPrim(
p, iObj ) )
765 iObjNew = Cba_ObjCopy(
p, iObj );
767 Cba_ObjSetFinFon( pNew, iObjNew, i, Cba_FonCopy(
p, iFon) );
769 else if ( Cba_ObjIsBoxUser(
p, iObj ) )
771 Vec_IntClear( vSigs );
773 Vec_IntPush( vSigs, Cba_FonCopy(
p, iFon) );
774 assert( Vec_IntSize(vSigs) == Cba_ObjFinNum(
p, iObj) );
776 assert( Vec_IntSize(vSigs) == Cba_ObjFonNum(
p, iObj) );
779 iObjNew = Cba_FonObj( pNew, Cba_FonCopy(
p, iFon) );
780 Cba_ObjSetFinFon( pNew, iObjNew, 0, Vec_IntEntry(vSigs, i) );
784 Vec_IntClear( vSigs );
786 Vec_IntPush( vSigs, Cba_FonCopy(
p, iFon) );
791 Cba_Ntk_t * pRoot = Cba_ManRoot(
p ), * pRootNew;
792 Vec_Int_t * vSigs = Vec_IntAlloc( 1000 );
793 int i, iObj, iObjNew, iFon, nObjs = 0, nFins = 0, nFons = 0;
794 Cba_ManDupTypeNames( pNew,
p );
796 pRootNew = Cba_NtkAlloc( pNew, Cba_NtkNameId(pRoot), Cba_NtkPiNum(pRoot), Cba_NtkPoNum(pRoot), nObjs, nFins, nFons );
797 Cba_NtkAdd( pNew, pRootNew );
798 if ( Cba_NtkHasObjNames(pRoot) )
799 Cba_NtkCleanObjNames( pRootNew );
800 if ( Cba_NtkHasFonNames(pRoot) )
801 Cba_NtkCleanFonNames( pRootNew );
802 if ( Cba_NtkHasObjAttrs(pRoot) )
803 Cba_NtkCleanObjAttrs( pRootNew );
804 if ( Cba_ObjAttr(pRoot, 0) )
805 Cba_ObjSetAttrs( pRootNew, 0, Cba_ObjAttrArray(pRoot, 0), Cba_ObjAttrSize(pRoot, 0) );
806 Cba_NtkCleanObjCopies( pRoot );
809 iObjNew = Cba_ObjDup( pRootNew, pRoot, iObj );
810 Vec_IntPush( vSigs, Cba_ObjFon0(pRootNew, iObjNew) );
811 if ( Cba_NtkHasObjNames(pRoot) )
812 Cba_ObjSetName( pRootNew, iObjNew, Cba_ObjName(pRoot, iObj) );
813 if ( Cba_NtkHasFonNames(pRoot) )
814 Cba_FonSetName( pRootNew, Cba_ObjFon0(pRootNew, iObjNew), Cba_FonName(pRoot, iFon) );
815 if ( Cba_ObjAttr(pRoot, iObj) )
816 Cba_ObjSetAttrs( pRootNew, iObjNew, Cba_ObjAttrArray(pRoot, iObj), Cba_ObjAttrSize(pRoot, iObj) );
818 assert( Vec_IntSize(vSigs) == Cba_NtkPiNum(pRoot) );
820 assert( Vec_IntSize(vSigs) == Cba_NtkPoNum(pRoot) );
823 iObjNew = Cba_ObjDup( pRootNew, pRoot, iObj );
824 Cba_ObjSetFinFon( pRootNew, iObjNew, 0, Vec_IntEntry(vSigs, i) );
825 if ( Cba_NtkHasObjNames(pRoot) )
826 Cba_ObjSetName( pRootNew, iObjNew, Cba_ObjName(pRoot, iObj) );
827 if ( Cba_NtkHasFonNames(pRoot) )
828 Cba_FonSetName( pRootNew, Vec_IntEntry(vSigs, i), Cba_FonName(pRoot, iFon) );
829 if ( Cba_ObjAttr(pRoot, iObj) )
830 Cba_ObjSetAttrs( pRootNew, iObjNew, Cba_ObjAttrArray(pRoot, iObj), Cba_ObjAttrSize(pRoot, iObj) );
832 Vec_IntFree( vSigs );
833 assert( Cba_NtkObjNum(pRootNew) == Cba_NtkObjNumAlloc(pRootNew) );
834 assert( Cba_NtkFinNum(pRootNew) == Cba_NtkFinNumAlloc(pRootNew) );
835 assert( Cba_NtkFonNum(pRootNew) == Cba_NtkFonNumAlloc(pRootNew) );
837 Cba_NtkMissingFonNames( pRootNew,
"m" );
858 Vec_Bit_t * vVisFons = Vec_BitStart( Cba_NtkFonNum(
p) + 1 );
859 int i, k, iObj, iFin, iFon, Entry;
864 Vec_BitWriteEntry( vVisFons, iFon, 1 );
868 Vec_BitWriteEntry( vVisFons, iFon, 0 );
872 Vec_IntPush( vFons, iFon );
873 Vec_BitFree( vVisFons );
879 Vec_Bit_t * vMapObjs = Vec_BitStart( Cba_NtkObjNum(
p) + 1 );
880 Vec_Bit_t * vVisFons = Vec_BitStart( Cba_NtkFonNum(
p) + 1 );
881 int i, k, iObj, iFin, iFon;
884 Vec_BitWriteEntry( vMapObjs, iObj, 1 );
887 if ( !Vec_BitEntry(vMapObjs, iObj) )
890 Vec_BitWriteEntry( vVisFons, iFon, 1 );
894 if ( Vec_BitEntry(vVisFons, iFon) )
895 Vec_IntPush( vFons, iFon );
896 Vec_BitFree( vMapObjs );
897 Vec_BitFree( vVisFons );
902 int i, iObj, nFins = 0, nFons = 0;
905 nFins += Cba_ObjFinNum(
p, iObj);
906 nFons += Cba_ObjFonNum(
p, iObj);
913 int i, k, iObj, iObjNew, iFin, iFon;
914 Cba_NtkCleanObjCopies(
p );
915 Cba_NtkCleanFonCopies(
p );
919 iObjNew = Cba_ObjAlloc( pNew,
CBA_OBJ_PI, 0, 1 );
920 Cba_FonSetCopy(
p, iFon, Cba_ObjFon0(pNew, iObjNew) );
921 if ( Cba_NtkHasObjNames(
p) )
922 Cba_ObjSetName( pNew, iObjNew, Cba_ObjName(
p, Cba_FonObj(
p, iFon)) );
923 if ( Cba_NtkHasFonNames(
p) )
924 Cba_FonSetName( pNew, Cba_ObjFon0(pNew, iObjNew), Cba_FonName(
p, iFon) );
930 iObjNew = Cba_ObjDup( pNew,
p, iObj );
931 if ( Cba_NtkHasObjNames(
p) )
932 Cba_ObjSetName( pNew, iObjNew, Cba_ObjName(
p, iObj) );
935 Cba_FonSetCopy(
p, iFon, Cba_ObjFon(pNew, iObjNew, k) );
936 if ( Cba_NtkHasFonNames(
p) )
937 Cba_FonSetName( pNew, Cba_ObjFon(pNew, iObjNew, k), Cba_FonName(
p, iFon) );
943 iObjNew = Cba_ObjCopy(
p, iObj );
945 Cba_ObjSetFinFon( pNew, iObjNew, k, Cba_FonCopy(
p, iFon) );
950 iObjNew = Cba_ObjAlloc( pNew,
CBA_OBJ_PO, 1, 0 );
951 if ( Cba_NtkHasObjNames(
p) )
952 Cba_ObjSetName( pNew, iObjNew, Cba_FonName(
p, iFon) );
953 Cba_ObjSetFinFon( pNew, iObjNew, 0, Cba_FonCopy(
p, iFon) );
955 assert( Cba_NtkObjNum(pNew) == Cba_NtkObjNumAlloc(pNew) );
956 assert( Cba_NtkFinNum(pNew) == Cba_NtkFinNumAlloc(pNew) );
957 assert( Cba_NtkFonNum(pNew) == Cba_NtkFonNumAlloc(pNew) );
962 Cba_Ntk_t * pRoot = Cba_ManRoot(
p ), * pRootNew;
965 int nObjs, nFins, nFons;
966 Cba_ManDupTypeNames( pNew,
p );
969 nObjs = Vec_IntSize(vObjs) + Vec_IntSize(vFonIns) + Vec_IntSize(vFonOuts);
970 nFins += Vec_IntSize(vFonOuts);
971 nFons += Vec_IntSize(vFonIns);
973 pRootNew = Cba_NtkAlloc( pNew, Cba_NtkNameId(pRoot), Vec_IntSize(vFonIns), Vec_IntSize(vFonOuts), nObjs, nFins, nFons );
974 Cba_NtkAdd( pNew, pRootNew );
975 if ( Cba_NtkHasObjNames(pRoot) )
976 Cba_NtkCleanObjNames( pRootNew );
977 if ( Cba_NtkHasFonNames(pRoot) )
978 Cba_NtkCleanFonNames( pRootNew );
981 Cba_NtkMissingFonNames( pRootNew,
"b" );
984 Vec_IntFree( vFonIns );
985 Vec_IntFree( vFonOuts );
1001static inline int Cba_NtkInsertGiaLit(
Cba_Ntk_t *
p,
int iLit,
Vec_Int_t * vLit2Fon,
int fUseXor )
1004 if ( iLit == 0 || iLit == 1 )
1005 return Cba_FonFromConst(iLit);
1006 if ( Vec_IntEntry(vLit2Fon, iLit) >= 0 )
1007 return Vec_IntEntry(vLit2Fon, iLit);
1008 assert( Abc_LitIsCompl(iLit) );
1009 assert( Vec_IntEntry(vLit2Fon, Abc_LitNot(iLit)) >= 0 );
1014 Cba_ObjSetFinFon(
p, iObjNew, 0, Vec_IntEntry(vLit2Fon, Abc_LitNot(iLit)) );
1015 Cba_ObjSetFinFon(
p, iObjNew, 1, Cba_FonFromConst(1) );
1020 Cba_ObjSetFinFon(
p, iObjNew, 0, Vec_IntEntry(vLit2Fon, Abc_LitNot(iLit)) );
1023 Vec_IntWriteEntry( vLit2Fon, iLit, Cba_ObjFon0(
p, iObjNew) );
1024 return Cba_ObjFon0(
p, iObjNew);
1028 Gia_Obj_t * pObj = Gia_ManObj( pGia, iObj );
1029 int iLit0 = Gia_ObjFaninLit0( pObj, iObj );
1030 int iLit1 = Gia_ObjFaninLit1( pObj, iObj );
1031 int iFon0 = Cba_NtkInsertGiaLit(
p, iLit0, vLit2Fon, fUseXor );
1032 int iFon1 = Cba_NtkInsertGiaLit(
p, iLit1, vLit2Fon, fUseXor );
1034 if ( Gia_ObjIsMux(pGia, pObj) )
1036 int iLit2 = Gia_ObjFaninLit2( pGia, iObj );
1037 int iFon2 = Cba_NtkInsertGiaLit(
p, iLit2, vLit2Fon, fUseXor );
1039 Cba_ObjSetFinFon(
p, iObjNew, 0, iFon2 );
1040 Cba_ObjSetFinFon(
p, iObjNew, 1, iFon1 );
1041 Cba_ObjSetFinFon(
p, iObjNew, 2, iFon0 );
1045 assert( Gia_ObjIsAnd(pObj) );
1047 Cba_ObjSetFinFon(
p, iObjNew, 0, iFon0 );
1048 Cba_ObjSetFinFon(
p, iObjNew, 1, iFon1 );
1050 Vec_IntWriteEntry( vLit2Fon, Abc_Var2Lit(iObj, 0), Cba_ObjFon0(
p, iObjNew) );
1057 Vec_Int_t * vLit2Fon = Vec_IntStartFull( 2*Gia_ManObjNum(pGia) );
1058 int i, iObj, iObjNew, NameId, iLit0, iFon0;
1061 Cba_NtkAdd(
p, pNtk );
1062 Cba_NtkCleanObjNames( pNtk );
1066 iObjNew = Cba_ObjAlloc( pNtk,
CBA_OBJ_PI, 0, 1 );
1067 Cba_ObjSetName( pNtk, iObjNew, NameId );
1068 Vec_IntWriteEntry( vLit2Fon, Abc_Var2Lit(iObj, 0), Cba_ObjFon0(pNtk, iObjNew) );
1071 Cba_NtkInsertGiaObj( pNtk, pGia, iObj, vLit2Fon, fUseXor );
1075 pObj = Gia_ManObj( pGia, iObj );
1076 iLit0 = Gia_ObjFaninLit0( pObj, iObj );
1077 iFon0 = Cba_NtkInsertGiaLit( pNtk, iLit0, vLit2Fon, fUseXor );
1081 pObj = Gia_ManObj( pGia, iObj );
1082 iLit0 = Gia_ObjFaninLit0( pObj, iObj );
1083 iFon0 = Cba_NtkInsertGiaLit( pNtk, iLit0, vLit2Fon, fUseXor );
1084 iObjNew = Cba_ObjAlloc( pNtk,
CBA_BOX_BUF, 1, 1 );
1085 Cba_ObjSetFinFon( pNtk, iObjNew, 0, iFon0 );
1086 iFon0 = Cba_ObjFon0(pNtk, iObjNew);
1088 iObjNew = Cba_ObjAlloc( pNtk,
CBA_OBJ_PO, 1, 0 );
1089 Cba_ObjSetName( pNtk, iObjNew, NameId );
1090 Cba_ObjSetFinFon( pNtk, iObjNew, 0, iFon0 );
1092 Cba_NtkCleanFonNames( pNtk );
1093 Cba_NtkCreateFonNames( pNtk,
"a" );
1094 Vec_IntFree( vLit2Fon );
1114 int k, iObj, iObjNew, iFin, iFon;
1115 assert( Cba_NtkPiNum(pSyn) == Vec_IntSize(vFonIns) );
1116 assert( Cba_NtkPoNum(pSyn) == Vec_IntSize(vFonOuts) );
1118 Cba_NtkCleanFonCopies( pSyn );
1120 Cba_FonSetCopy( pSyn, iFon, Vec_IntEntry(vFonIns, k) );
1121 Vec_IntFree( vFonIns );
1123 Cba_NtkCleanObjCopies( pSyn );
1126 iObjNew = Cba_ObjDup(
p, pSyn, iObj );
1128 Cba_FonSetCopy( pSyn, iFon, Cba_ObjFon(
p, iObjNew, k) );
1133 iObjNew = Cba_ObjCopy( pSyn, iObj );
1135 Cba_ObjSetFinFon(
p, iObjNew, k, Cba_FonCopy(pSyn, iFon) );
1138 Cba_NtkCleanFonCopies(
p );
1139 if ( Cba_NtkHasFonNames(
p) )
1140 Vec_IntFillExtra( &
p->vFonName, Cba_NtkFonNum(
p) + 1, 0 );
1143 assert( Cba_FonIsReal(Cba_FonCopy(pSyn, iFon)) );
1144 Cba_FonSetCopy(
p, Vec_IntEntry(vFonOuts, k), Cba_FonCopy(pSyn, iFon) );
1146 if ( Cba_NtkHasFonNames(
p) )
1148 Cba_FonSetName(
p, Cba_FonCopy(pSyn, iFon), Cba_FonName(
p, Vec_IntEntry(vFonOuts, k)) );
1149 Cba_FonCleanName(
p, Vec_IntEntry(vFonOuts, k) );
1152 Vec_IntFree( vFonOuts );
1158 if ( Cba_FonIsReal(iFon) && Cba_FonCopy(
p, iFon) )
1159 Cba_PatchFinFon(
p, iFin, Cba_FonCopy(
p, iFon) );
1160 Cba_NtkMissingFonNames(
p,
"j" );
#define ABC_SWAP(Type, a, b)
#define ABC_FALLOC(type, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_DLL char * Abc_FrameReadFlag(char *pFlag)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void Cba_ManPrintDistrib(Cba_Man_t *p)
Cba_Man_t * Cba_ManExtractGroup(Cba_Man_t *p, Vec_Int_t *vObjs)
void Cba_NtkPrintNodes(Cba_Ntk_t *p, int Type)
int Cba_StrCmp(char **pp1, char **pp2)
Cba_Man_t * Cba_ManInsertGroup(Cba_Man_t *p, Vec_Int_t *vObjs, Cba_Ntk_t *pSyn)
int Cba_NtkIsTopoOrder(Cba_Ntk_t *p)
void Cba_ManExtractGroupInt(Cba_Ntk_t *pNew, Cba_Ntk_t *p, Vec_Int_t *vObjs, Vec_Int_t *vFonIns, Vec_Int_t *vFonOuts)
int Cba_ManIsTopoOrder(Cba_Man_t *p)
void Cba_NtkCollapse_rec(Cba_Ntk_t *pNew, Cba_Ntk_t *p, Vec_Int_t *vSigs)
void Cba_NtkPrintDistribOld(Cba_Ntk_t *p)
void Cba_NtkPrintDistribSortOne(Vec_Ptr_t *vTypes, Vec_Ptr_t *vOccurs, int Type)
int Cba_NtkCheckComboLoop(Cba_Ntk_t *p)
void Cba_NtkInsertGroup(Cba_Ntk_t *p, Vec_Int_t *vObjs, Cba_Ntk_t *pSyn)
int Cba_NtkCiFonNum(Cba_Ntk_t *p)
Cba_Man_t * Cba_ManCollapse(Cba_Man_t *p)
void Cba_NtkPrintStatsFull(Cba_Ntk_t *p, int fDistrib, int fVerbose)
void Cba_ManGetClpStats(Cba_Man_t *p, int *nObjs, int *nFins, int *nFons)
void Cba_NtkPrintDistrib(Cba_Ntk_t *p, int fVerbose)
void Cba_NtkCollectDistrib(Cba_Ntk_t *p, int *pCounts, int *pUserCounts)
void Cba_NtkObjOrder(Cba_Ntk_t *p, Vec_Int_t *vObjs, Vec_Int_t *vNameIds)
void Cba_ManGetClpStats_rec(Cba_Ntk_t *p, int *pCountN, int *pCountI, int *pCountO)
int Cba_NtkFindMissing(Vec_Int_t *vObjs, int nObjs)
void Cba_ManPrintDistribStat(Cba_Man_t *p, int *pCounts, int *pUserCounts)
Vec_Int_t * Cba_NtkCollectInFons(Cba_Ntk_t *p, Vec_Int_t *vObjs)
Vec_Int_t * Cba_NtkCollectDfs(Cba_Ntk_t *p)
void Cba_NtkCollectGroupStats(Cba_Ntk_t *p, Vec_Int_t *vObjs, int *pnFins, int *pnFons)
Cba_Man_t * Cba_ManDeriveFromGia(Cba_Man_t *pOld, Gia_Man_t *pGia, int fUseXor)
int Cba_StrCmpInt(char *p1, char *p2, int i)
void Cba_NtkCollectDfs_rec(Cba_Ntk_t *p, int iObj, Vec_Int_t *vObjs)
int Cba_NtkCheckComboLoop_rec(Cba_Ntk_t *p, int iObj)
int Cba_NtkCoFinNum(Cba_Ntk_t *p)
Vec_Int_t * Cba_NtkCollectOutFons(Cba_Ntk_t *p, Vec_Int_t *vObjs)
void Cba_NtkPrintDistribStat(Cba_Ntk_t *p, int *pCounts, int *pUserCounts)
Cba_ObjType_t
INCLUDES ///.
#define Cba_NtkForEachObj(p, i)
#define Cba_NtkForEachBox(p, i)
#define Cba_ObjForEachFinFon(p, iObj, iFin, iFon, k)
#define Cba_NtkForEachPo(p, iObj, i)
#define Cba_ObjForEachFon(p, iObj, iFon, k)
typedefABC_NAMESPACE_HEADER_START struct Cba_Ntk_t_ Cba_Ntk_t
INCLUDES ///.
#define Cba_NtkForEachPiFon(p, iObj, iFon, i)
#define Cba_NtkForEachPoDriverFon(p, iObj, iFon, i)
#define Cba_NtkForEachFinFon(p, iFon, iFin)
#define Cba_NtkForEachBoxSeq(p, iObj, i)
struct Cba_Man_t_ Cba_Man_t
Vec_Int_t * Cba_NtkCollectDfs(Cba_Ntk_t *p)
#define Cba_ManForEachNtk(p, pNtk, i)
ITERATORS ///.
#define Cba_NtkForEachPi(p, iObj, i)
#define Cba_ObjForEachFinFaninReal(p, iObj, iFin, iFanin, k)
void Cba_ManCreatePrimMap(char **pMap)
DECLARATIONS ///.
#define Gia_ManForEachCoId(p, Id, i)
struct Gia_Obj_t_ Gia_Obj_t
struct Gia_Man_t_ Gia_Man_t
#define Gia_ManForEachAndId(p, i)
#define Gia_ManForEachCiId(p, Id, i)
unsigned __int64 word
DECLARATIONS ///.
int Abc_NamStrFindOrAdd(Abc_Nam_t *p, char *pStr, int *pfFound)
Abc_Nam_t * Abc_NamStart(int nObjs, int nAveSize)
FUNCTION DEFINITIONS ///.
Abc_Nam_t * Abc_NamRef(Abc_Nam_t *p)
#define Vec_BitForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Bit_t_ Vec_Bit_t
INCLUDES ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.
#define Vec_WrdForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.