ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
acbUtil.c
Go to the documentation of this file.
1
20
21#include "acb.h"
22#include "base/abc/abc.h"
23#include "base/io/ioAbc.h"
24#include "base/main/main.h"
25
27
31
32
36
48void Acb_ObjCollectTfi_rec( Acb_Ntk_t * p, int iObj, int fTerm )
49{
50 int * pFanin, iFanin, i;
51 if ( Acb_ObjSetTravIdCur(p, iObj) )
52 return;
53 if ( !fTerm && Acb_ObjIsCi(p, iObj) )
54 return;
55 Acb_ObjForEachFaninFast( p, iObj, pFanin, iFanin, i )
56 Acb_ObjCollectTfi_rec( p, iFanin, fTerm );
57 Vec_IntPush( &p->vArray0, iObj );
58}
59Vec_Int_t * Acb_ObjCollectTfi( Acb_Ntk_t * p, int iObj, int fTerm )
60{
61 int i, Node;
62 Vec_IntClear( &p->vArray0 );
63 Acb_NtkIncTravId( p );
64 if ( iObj > 0 )
65 {
66 Vec_IntForEachEntry( &p->vSuppOld, Node, i )
67 Acb_ObjCollectTfi_rec( p, Node, fTerm );
68 Acb_ObjCollectTfi_rec( p, iObj, fTerm );
69 }
70 else
71 Acb_NtkForEachCo( p, iObj, i )
72 Acb_ObjCollectTfi_rec( p, iObj, fTerm );
73 return &p->vArray0;
74}
76{
77 int i, iObj;
78 Vec_IntClear( &p->vArray0 );
79 Acb_NtkIncTravId( p );
80 Vec_IntForEachEntry( vObjs, iObj, i )
81 Acb_ObjCollectTfi_rec( p, iObj, 0 );
82 return &p->vArray0;
83}
84
85void Acb_ObjCollectTfo_rec( Acb_Ntk_t * p, int iObj, int fTerm )
86{
87 int iFanout, i;
88 if ( Acb_ObjSetTravIdCur(p, iObj) )
89 return;
90 if ( !fTerm && Acb_ObjIsCo(p, iObj) )
91 return;
92 Acb_ObjForEachFanout( p, iObj, iFanout, i )
93 Acb_ObjCollectTfo_rec( p, iFanout, fTerm );
94 Vec_IntPush( &p->vArray1, iObj );
95}
96Vec_Int_t * Acb_ObjCollectTfo( Acb_Ntk_t * p, int iObj, int fTerm )
97{
98 int i;
99 Vec_IntClear( &p->vArray1 );
100 Acb_NtkIncTravId( p );
101 if ( iObj > 0 )
102 Acb_ObjCollectTfo_rec( p, iObj, fTerm );
103 else
104 Acb_NtkForEachCi( p, iObj, i )
105 Acb_ObjCollectTfo_rec( p, iObj, fTerm );
106 return &p->vArray1;
107}
109{
110 int i, iObj;
111 if ( !Acb_NtkHasObjFanout(p) )
112 Acb_NtkCreateFanout( p );
113 Vec_IntClear( &p->vArray1 );
114 Acb_NtkIncTravId( p );
115 Vec_IntForEachEntry( vObjs, iObj, i )
116 Acb_ObjCollectTfo_rec( p, iObj, 0 );
117 return &p->vArray1;
118}
119
132{
133 if ( Acb_ObjIsCi(p, iObj) )
134 return 1;
135 if ( Acb_ObjFaninNum(p, iObj) != 1 )
136 return 0;
137 return Acb_NtkIsPiBuffers( p, Acb_ObjFanin(p, iObj, 0) );
138}
140{
141 int i, iObj, Count = 0;
142 Vec_IntForEachEntry( vObjs, iObj, i )
143 Count += Acb_NtkIsPiBuffers( p, iObj );
144 return Count;
145}
147{
148 int i, iObj, Count = 0;
149 Acb_NtkIncTravId( p );
150 Acb_NtkForEachCo( p, iObj, i )
151 {
152 int Fanin0 = Acb_ObjFanin0(p, iObj);
153 Acb_ObjSetTravIdCur( p, iObj );
154 Acb_ObjSetTravIdCur( p, Fanin0 );
155 if ( Acb_ObjFaninNum(p, Fanin0) == 1 )
156 Acb_ObjSetTravIdCur( p, Acb_ObjFanin0(p, Fanin0) );
157 }
158 Vec_IntForEachEntry( vObjs, iObj, i )
159 Count += Acb_ObjIsTravIdCur(p, iObj);
160 return Count;
161}
162
174int Acb_NtkNodeDeref_rec( Vec_Int_t * vRefs, Acb_Ntk_t * p, int iObj )
175{
176 int i, Fanin, * pFanins, Counter = 1;
177 if ( Acb_ObjIsCi(p, iObj) )
178 return 0;
179 Acb_ObjForEachFaninFast( p, iObj, pFanins, Fanin, i )
180 {
181 assert( Vec_IntEntry(vRefs, Fanin) > 0 );
182 Vec_IntAddToEntry( vRefs, Fanin, -1 );
183 if ( Vec_IntEntry(vRefs, Fanin) == 0 )
184 Counter += Acb_NtkNodeDeref_rec( vRefs, p, Fanin );
185 }
186 return Counter;
187}
188int Acb_NtkNodeRef_rec( Vec_Int_t * vRefs, Acb_Ntk_t * p, int iObj )
189{
190 int i, Fanin, * pFanins, Counter = 1;
191 if ( Acb_ObjIsCi(p, iObj) )
192 return 0;
193 Acb_ObjForEachFaninFast( p, iObj, pFanins, Fanin, i )
194 {
195 if ( Vec_IntEntry(vRefs, Fanin) == 0 )
196 Counter += Acb_NtkNodeRef_rec( vRefs, p, Fanin );
197 Vec_IntAddToEntry( vRefs, Fanin, 1 );
198 }
199 return Counter;
200}
201
213void Acb_NtkCollectDeref_rec( Vec_Int_t * vRefs, Acb_Ntk_t * p, int iObj, Vec_Int_t * vRes )
214{
215 int i, Fanin, * pFanins;
216 if ( Acb_ObjIsCi(p, iObj) )
217 return;
218 Vec_IntPush( vRes, iObj );
219 Acb_ObjForEachFaninFast( p, iObj, pFanins, Fanin, i )
220 {
221 assert( Vec_IntEntry(vRefs, Fanin) > 0 );
222 Vec_IntAddToEntry( vRefs, Fanin, -1 );
223 if ( Vec_IntEntry(vRefs, Fanin) == 0 )
224 Acb_NtkCollectDeref_rec( vRefs, p, Fanin, vRes );
225 }
226}
227Vec_Int_t * Acb_NtkCollectMffc( Acb_Ntk_t * p, Vec_Int_t * vObjsRefed, Vec_Int_t * vObjsDerefed )
228{
229 Vec_Int_t * vRes = Vec_IntAlloc( 100 );
230 Vec_Int_t * vRefs = Vec_IntStart( Acb_NtkObjNumMax(p) );
231 int i, iObj, Fanin, * pFanins;
232 Acb_NtkForEachObj( p, iObj )
233 Acb_ObjForEachFaninFast( p, iObj, pFanins, Fanin, i )
234 Vec_IntAddToEntry( vRefs, Fanin, 1 );
235 Acb_NtkForEachCo( p, iObj, i )
236 Vec_IntAddToEntry( vRefs, iObj, 1 );
237 if ( vObjsRefed )
238 Vec_IntForEachEntry( vObjsRefed, iObj, i )
239 Vec_IntAddToEntry( vRefs, iObj, 1 );
240 Vec_IntForEachEntry( vObjsDerefed, iObj, i )
241 {
242 if ( Acb_ObjIsCo(p, iObj) )
243 iObj = Acb_ObjFanin0(p, iObj);
244 if ( Vec_IntEntry(vRefs, iObj) != 0 )
245 Acb_NtkCollectDeref_rec( vRefs, p, iObj, vRes );
246 }
247 Vec_IntFree( vRefs );
248 Vec_IntUniqify( vRes );
249 return vRes;
250}
251
252Vec_Int_t * Acb_NamesToIds( Acb_Ntk_t * pNtk, Vec_Int_t * vNamesInv, Vec_Ptr_t * vNames )
253{
254 Vec_Int_t * vRes = Vec_IntAlloc( Vec_PtrSize(vNames) );
255 char * pName; int i;
256 Vec_PtrForEachEntry( char *, vNames, pName, i )
257 {
258 int NameId = Acb_NtkStrId(pNtk, pName);
259 int iObjId = 0;
260 if ( NameId < 1 )
261 printf( "Cannot find name \"%s\" in the network \"%s\".\n", pName, pNtk->pDesign->pName );
262 else
263 iObjId = Vec_IntEntry( vNamesInv, NameId );
264 Vec_IntPush( vRes, iObjId );
265 }
266 return vRes;
267}
268int Acb_NtkCollectMfsGates( char * pFileName, Vec_Ptr_t * vNamesRefed, Vec_Ptr_t * vNamesDerefed, int nGates[5] )
269{
270 Acb_Ntk_t * pNtkF = Acb_VerilogSimpleRead( pFileName, NULL );
271 Vec_Int_t * vNamesInv = Vec_IntInvert( &pNtkF->vObjName, 0 ) ;
272 Vec_Int_t * vObjsRefed = Acb_NamesToIds( pNtkF, vNamesInv, vNamesRefed );
273 Vec_Int_t * vObjsDerefed = Acb_NamesToIds( pNtkF, vNamesInv, vNamesDerefed );
274 Vec_Int_t * vNodes = Acb_NtkCollectMffc( pNtkF, vObjsRefed, vObjsDerefed );
275 int i, iObj, RetValue = Vec_IntSize(vNodes);
276 Vec_IntFree( vNamesInv );
277 Vec_IntFree( vObjsRefed );
278 Vec_IntFree( vObjsDerefed );
279 for ( i = 0; i < 5; i++ )
280 nGates[i] = 0;
281 Vec_IntForEachEntry( vNodes, iObj, i )
282 {
283 int nFan = Acb_ObjFaninNum(pNtkF, iObj);
284 int Type = Acb_ObjType( pNtkF, iObj );
285 if ( Type == ABC_OPER_CONST_F )
286 nGates[0]++;
287 else if ( Type == ABC_OPER_CONST_T )
288 nGates[1]++;
289 else if ( Type == ABC_OPER_BIT_BUF || Type == ABC_OPER_CO )
290 nGates[2]++;
291 else if ( Type == ABC_OPER_BIT_INV )
292 nGates[3]++;
293 else
294 {
295 assert( nFan >= 2 );
296 nGates[4] += Acb_ObjFaninNum(pNtkF, iObj)-1;
297 }
298 }
299 Vec_IntFree( vNodes );
300 Acb_ManFree( pNtkF->pDesign );
301 return RetValue;
302}
303Vec_Ptr_t * Acb_NtkReturnMfsGates( char * pFileName, Vec_Ptr_t * vNodes )
304{
305 Vec_Ptr_t * vMffc = Vec_PtrAlloc( 100 );
306 Acb_Ntk_t * pNtkF = Acb_VerilogSimpleRead( pFileName, NULL );
307 Vec_Int_t * vNamesInv = Vec_IntInvert( &pNtkF->vObjName, 0 ) ;
308 Vec_Int_t * vNodeObjs = Acb_NamesToIds( pNtkF, vNamesInv, vNodes );
309 Vec_Int_t * vNodeMffc = Acb_NtkCollectMffc( pNtkF, NULL, vNodeObjs );
310 int i, iObj;
311 Vec_IntForEachEntry( vNodeMffc, iObj, i )
312 Vec_PtrPush( vMffc, Abc_UtilStrsav( Acb_ObjNameStr(pNtkF, iObj) ) );
313//Vec_IntPrint( vNodeMffc );
314//Vec_PtrPrintNames( vMffc );
315 Vec_IntFree( vNodeMffc );
316 Vec_IntFree( vNodeObjs );
317 Vec_IntFree( vNamesInv );
318 Acb_ManFree( pNtkF->pDesign );
319 return vMffc;
320}
321
334{
335 int * pFanins, iFanin, k, Level = 0;
336 Acb_ObjForEachFaninFast( p, iObj, pFanins, iFanin, k )
337 Level = Abc_MaxInt( Level, Acb_ObjLevelD(p, iFanin) );
338 return Acb_ObjSetLevelD( p, iObj, Level + !Acb_ObjIsCio(p, iObj) );
339}
341{
342 // it is assumed that vTfo contains CO nodes and level of new nodes was already updated
343 int i, iObj, Level = 0;
344 if ( !Acb_NtkHasObjLevelD( p ) )
345 Acb_NtkCleanObjLevelD( p );
346 Vec_IntForEachEntryReverse( vTfo, iObj, i )
347 Acb_ObjComputeLevelD( p, iObj );
348 Acb_NtkForEachCo( p, iObj, i )
349 Level = Abc_MaxInt( Level, Acb_ObjLevelD(p, iObj) );
350 p->LevelMax = Level;
351 return Level;
352}
353
355{
356 int iFanout, k, Level = 0;
357 Acb_ObjForEachFanout( p, iObj, iFanout, k )
358 Level = Abc_MaxInt( Level, Acb_ObjLevelR(p, iFanout) );
359 return Acb_ObjSetLevelR( p, iObj, Level + !Acb_ObjIsCio(p, iObj) );
360}
362{
363 // it is assumed that vTfi contains CI nodes
364 int i, iObj, Level = 0;
365 if ( !Acb_NtkHasObjLevelR( p ) )
366 Acb_NtkCleanObjLevelR( p );
367 Vec_IntForEachEntryReverse( vTfi, iObj, i )
368 Acb_ObjComputeLevelR( p, iObj );
369 Acb_NtkForEachCi( p, iObj, i )
370 Level = Abc_MaxInt( Level, Acb_ObjLevelR(p, iObj) );
371// assert( p->LevelMax == Level );
372 p->LevelMax = Level;
373 return Level;
374}
375
376void Acb_NtkUpdateLevelD( Acb_Ntk_t * p, int Pivot )
377{
378 Vec_Int_t * vTfo = Acb_ObjCollectTfo( p, Pivot, 1 );
379 Acb_NtkComputeLevelD( p, vTfo );
380}
381
393int Acb_ObjSlack( Acb_Ntk_t * p, int iObj )
394{
395 int LevelSum = Acb_ObjLevelD(p, iObj) + Acb_ObjLevelR(p, iObj);
396 assert( !Acb_ObjIsCio(p, iObj) + p->LevelMax >= LevelSum );
397 return !Acb_ObjIsCio(p, iObj) + p->LevelMax - LevelSum;
398}
399
401{
402 int * pFanins, iFanin, k, Path = 0;
403 assert( !Acb_ObjIsCi(p, iObj) );
404 Acb_ObjForEachFaninFast( p, iObj, pFanins, iFanin, k )
405 if ( !Acb_ObjSlack(p, iFanin) )
406 Path += Acb_ObjPathD(p, iFanin);
407 return Acb_ObjSetPathD( p, iObj, Path );
408}
409int Acb_NtkComputePathsD( Acb_Ntk_t * p, Vec_Int_t * vTfo, int fReverse )
410{
411 int i, iObj, Path = 0;
412 //Vec_IntPrint( vTfo );
413 if ( !Acb_NtkHasObjPathD( p ) )
414 Acb_NtkCleanObjPathD( p );
415 // it is assumed that vTfo contains CI nodes
416 //assert( Acb_ObjSlack(p, Vec_IntEntry(vTfo, 0)) );
417 if ( fReverse )
418 {
419 Vec_IntForEachEntryReverse( vTfo, iObj, i )
420 {
421 if ( Acb_ObjIsCi(p, iObj) )
422 Acb_ObjSetPathD( p, iObj, Acb_ObjSlack(p, iObj) == 0 );
423 else if ( Acb_ObjSlack(p, iObj) )
424 Acb_ObjSetPathD( p, iObj, 0 );
425 else
426 Acb_ObjComputePathD( p, iObj );
427 }
428 }
429 else
430 {
431 Vec_IntForEachEntry( vTfo, iObj, i )
432 {
433 if ( Acb_ObjIsCi(p, iObj) )
434 Acb_ObjSetPathD( p, iObj, Acb_ObjSlack(p, iObj) == 0 );
435 else if ( Acb_ObjSlack(p, iObj) )
436 Acb_ObjSetPathD( p, iObj, 0 );
437 else
438 Acb_ObjComputePathD( p, iObj );
439 }
440 }
441 Acb_NtkForEachCo( p, iObj, i )
442 Path += Acb_ObjPathD(p, iObj);
443 p->nPaths = Path;
444 return Path;
445}
446
448{
449 int iFanout, k, Path = 0;
450 assert( !Acb_ObjIsCo(p, iObj) );
451 Acb_ObjForEachFanout( p, iObj, iFanout, k )
452 if ( !Acb_ObjSlack(p, iFanout) )
453 Path += Acb_ObjPathR(p, iFanout);
454 return Acb_ObjSetPathR( p, iObj, Path );
455}
456int Acb_NtkComputePathsR( Acb_Ntk_t * p, Vec_Int_t * vTfi, int fReverse )
457{
458 int i, iObj, Path = 0;
459 if ( !Acb_NtkHasObjPathR( p ) )
460 Acb_NtkCleanObjPathR( p );
461 // it is assumed that vTfi contains CO nodes
462 //assert( Acb_ObjSlack(p, Vec_IntEntry(vTfi, 0)) );
463 if ( fReverse )
464 {
465 Vec_IntForEachEntryReverse( vTfi, iObj, i )
466 {
467 if ( Acb_ObjIsCo(p, iObj) )
468 Acb_ObjSetPathR( p, iObj, Acb_ObjSlack(p, iObj) == 0 );
469 else if ( Acb_ObjSlack(p, iObj) )
470 Acb_ObjSetPathR( p, iObj, 0 );
471 else
472 Acb_ObjComputePathR( p, iObj );
473 }
474 }
475 else
476 {
477 Vec_IntForEachEntry( vTfi, iObj, i )
478 {
479 if ( Acb_ObjIsCo(p, iObj) )
480 Acb_ObjSetPathR( p, iObj, Acb_ObjSlack(p, iObj) == 0 );
481 else if ( Acb_ObjSlack(p, iObj) )
482 Acb_ObjSetPathR( p, iObj, 0 );
483 else
484 Acb_ObjComputePathR( p, iObj );
485 }
486 }
487 Acb_NtkForEachCi( p, iObj, i )
488 Path += Acb_ObjPathR(p, iObj);
489// assert( p->nPaths == Path );
490 p->nPaths = Path;
491 return Path;
492}
493
495{
496 int iObj;
497 Acb_NtkForEachObj( p, iObj )
498 {
499 printf( "Obj = %5d : ", iObj );
500 printf( "LevelD = %5d ", Acb_ObjLevelD(p, iObj) );
501 printf( "LevelR = %5d ", Acb_ObjLevelR(p, iObj) );
502 printf( "PathD = %5d ", Acb_ObjPathD(p, iObj) );
503 printf( "PathR = %5d ", Acb_ObjPathR(p, iObj) );
504 printf( "Paths = %5d ", Acb_ObjPathD(p, iObj) * Acb_ObjPathR(p, iObj) );
505 printf( "\n" );
506 }
507}
508
510{
511 int LevelD, LevelR;
512 Vec_Int_t * vTfi = Acb_ObjCollectTfi( p, -1, 1 );
513 Vec_Int_t * vTfo = Acb_ObjCollectTfo( p, -1, 1 );
514 Acb_NtkComputeLevelD( p, vTfo );
515 LevelD = p->LevelMax;
516 Acb_NtkComputeLevelR( p, vTfi );
517 LevelR = p->LevelMax;
518 assert( LevelD == LevelR );
519 Acb_NtkComputePathsD( p, vTfo, 1 );
520 Acb_NtkComputePathsR( p, vTfi, 1 );
521 return p->nPaths;
522}
524{
525 extern Acb_Ntk_t * Acb_NtkFromAbc( Abc_Ntk_t * p );
526 Acb_Ntk_t * pNtk = Acb_NtkFromAbc( p );
527 Acb_NtkCreateFanout( pNtk );
528 Acb_NtkCleanObjCounts( pNtk );
529 printf( "Computed %d paths.\n", Acb_NtkComputePaths(pNtk) );
530 Acb_NtkPrintPaths( pNtk );
531 Acb_ManFree( pNtk->pDesign );
532}
533
534
547{
548 int nPaths;
549 if ( Acb_ObjIsCio(p, iObj) || Acb_ObjLevelD(p, iObj) == 1 )
550 return;
551 if ( p->vQue == NULL )
552 {
553 Acb_NtkCleanObjCounts( p );
554 p->vQue = Vec_QueAlloc( 1000 );
555 Vec_QueSetPriority( p->vQue, Vec_FltArrayP(&p->vCounts) );
556 }
557 nPaths = Acb_ObjPathD(p, iObj) * Acb_ObjPathR(p, iObj);
558 Acb_ObjSetCounts( p, iObj, (float)nPaths );
559 if ( Vec_QueIsMember( p->vQue, iObj ) )
560 {
561//printf( "Updating object %d with count %d\n", iObj, nPaths );
562 Vec_QueUpdate( p->vQue, iObj );
563 }
564 else if ( nPaths )
565 {
566//printf( "Adding object %d with count %d\n", iObj, nPaths );
567 Vec_QuePush( p->vQue, iObj );
568 }
569}
570void Acb_NtkUpdateTiming( Acb_Ntk_t * p, int iObj )
571{
572 int i, Entry, LevelMax = p->LevelMax;
573 int LevelD, LevelR, nPaths1, nPaths2;
574 // assuming that direct level of the new nodes (including iObj) is up to date
575 Vec_Int_t * vTfi = Acb_ObjCollectTfi( p, iObj, 1 );
576 Vec_Int_t * vTfo = Acb_ObjCollectTfo( p, iObj, 1 );
577 if ( iObj > 0 )
578 {
579 assert( Vec_IntEntryLast(vTfi) == iObj );
580 assert( Vec_IntEntryLast(vTfo) == iObj );
581 Vec_IntPop( vTfo );
582 }
583 Acb_NtkComputeLevelD( p, vTfo );
584 LevelD = p->LevelMax;
585 Acb_NtkComputeLevelR( p, vTfi );
586 LevelR = p->LevelMax;
587 assert( LevelD == LevelR );
588 if ( iObj > 0 && LevelMax > p->LevelMax ) // reduced level
589 {
590 iObj = -1;
591 vTfi = Acb_ObjCollectTfi( p, -1, 1 );
592 vTfo = Acb_ObjCollectTfo( p, -1, 1 );
593 Vec_QueClear( p->vQue );
594 // add backup here
595 }
596 if ( iObj > 0 )
597 Acb_NtkComputePathsD( p, vTfi, 0 );
598 Acb_NtkComputePathsD( p, vTfo, 1 );
599 nPaths1 = p->nPaths;
600 if ( iObj > 0 )
601 Acb_NtkComputePathsR( p, vTfo, 0 );
602 Acb_NtkComputePathsR( p, vTfi, 1 );
603 nPaths2 = p->nPaths;
604 assert( nPaths1 == nPaths2 );
605 Vec_IntForEachEntry( vTfi, Entry, i )
606 Acb_ObjUpdatePriority( p, Entry );
607 if ( iObj > 0 )
608 Vec_IntForEachEntry( vTfo, Entry, i )
609 Acb_ObjUpdatePriority( p, Entry );
610
611// printf( "Updating timing for object %d.\n", iObj );
612// Acb_NtkPrintPaths( p );
613// while ( (Entry = (int)Vec_QueTopPriority(p->vQue)) > 0 )
614// printf( "Obj = %5d : Prio = %d.\n", Vec_QuePop(p->vQue), Entry );
615}
616
628void Acb_NtkPrintNode( Acb_Ntk_t * p, int iObj )
629{
630 int k, iFanin, * pFanins;
631 printf( "Node %5d : ", iObj );
632 Acb_ObjForEachFaninFast( p, iObj, pFanins, iFanin, k )
633 printf( "%d ", iFanin );
634 printf( "LevelD = %d. LevelR = %d.\n", Acb_ObjLevelD(p, iObj), Acb_ObjLevelR(p, iObj) );
635}
636int Acb_NtkCreateNode( Acb_Ntk_t * p, word uTruth, Vec_Int_t * vSupp )
637{
638 int Pivot = Acb_ObjAlloc( p, ABC_OPER_LUT, Vec_IntSize(vSupp), 0 );
639 Acb_ObjSetTruth( p, Pivot, uTruth );
640 Acb_ObjAddFanins( p, Pivot, vSupp );
641 Acb_ObjAddFaninFanout( p, Pivot );
642 Acb_ObjComputeLevelD( p, Pivot );
643 return Pivot;
644}
645void Acb_NtkResetNode( Acb_Ntk_t * p, int Pivot, word uTruth, Vec_Int_t * vSupp )
646{
647 // remember old fanins
648 int k, iFanin, * pFanins;
649 Vec_Int_t * vFanins = Vec_IntAlloc( 6 );
650 assert( !Acb_ObjIsCio(p, Pivot) );
651 Acb_ObjForEachFaninFast( p, Pivot, pFanins, iFanin, k )
652 Vec_IntPush( vFanins, iFanin );
653 // update function
654 Vec_WrdSetEntry( &p->vObjTruth, Pivot, uTruth );
655 Vec_IntErase( Vec_WecEntry(&p->vCnfs, Pivot) );
656 // remove old fanins
657 Acb_ObjRemoveFaninFanout( p, Pivot );
658 Acb_ObjRemoveFanins( p, Pivot );
659 // add new fanins
660 if ( vSupp != NULL )
661 {
662 assert( Acb_ObjFanoutNum(p, Pivot) > 0 );
663 Acb_ObjAddFanins( p, Pivot, vSupp );
664 Acb_ObjAddFaninFanout( p, Pivot );
665 }
666 else if ( Acb_ObjFanoutNum(p, Pivot) == 0 )
667 Acb_ObjCleanType( p, Pivot );
668 // delete dangling fanins
669 Vec_IntForEachEntry( vFanins, iFanin, k )
670 if ( !Acb_ObjIsCio(p, iFanin) && Acb_ObjFanoutNum(p, iFanin) == 0 )
671 Acb_NtkResetNode( p, iFanin, 0, NULL );
672 Vec_IntFree( vFanins );
673}
674void Acb_NtkSaveSupport( Acb_Ntk_t * p, int iObj )
675{
676 int k, iFanin, * pFanins;
677 Vec_IntClear( &p->vSuppOld );
678 Acb_ObjForEachFaninFast( p, iObj, pFanins, iFanin, k )
679 Vec_IntPush( &p->vSuppOld, iFanin );
680}
681void Acb_NtkUpdateNode( Acb_Ntk_t * p, int Pivot, word uTruth, Vec_Int_t * vSupp )
682{
683 //int Level = Acb_ObjLevelD(p, Pivot);
684 Acb_NtkSaveSupport( p, Pivot );
685 //Acb_NtkPrintNode( p, Pivot );
686 Acb_NtkResetNode( p, Pivot, uTruth, vSupp );
687 Acb_ObjComputeLevelD( p, Pivot );
688 //assert( Level > Acb_ObjLevelD(p, Pivot) );
689 //Acb_NtkPrintNode( p, Pivot );
690 if ( p->vQue == NULL )
691 Acb_NtkUpdateLevelD( p, Pivot );
692 else
693// Acb_NtkUpdateTiming( p, Pivot );
694 Acb_NtkUpdateTiming( p, -1 );
695 Vec_IntClear( &p->vSuppOld );
696}
697
709void Acb_NtkFindNodes2_rec( Acb_Ntk_t * p, int iObj, Vec_Int_t * vNodes )
710{
711 int * pFanin, iFanin, i;
712 if ( Acb_ObjSetTravIdCur(p, iObj) )
713 return;
714 if ( Acb_ObjIsCi(p, iObj) )
715 return;
716 Acb_ObjForEachFaninFast( p, iObj, pFanin, iFanin, i )
717 Acb_NtkFindNodes2_rec( p, iFanin, vNodes );
718 assert( !Acb_ObjIsCo(p, iObj) );
719 Vec_IntPush( vNodes, iObj );
720}
722{
723 int i, iObj;
724 Vec_Int_t * vNodes = Vec_IntAlloc( 1000 );
725 Acb_NtkIncTravId( p );
726 Acb_NtkForEachCo( p, iObj, i )
727 Acb_NtkFindNodes2_rec( p, Acb_ObjFanin(p, iObj, 0), vNodes );
728 return vNodes;
729}
730int Acb_ObjToGia2( Gia_Man_t * pNew, int fUseBuf, Acb_Ntk_t * p, int iObj, Vec_Int_t * vTemp, int fUseXors )
731{
732 //char * pName = Abc_NamStr( p->pDesign->pStrs, Acb_ObjName(p, iObj) );
733 int * pFanin, iFanin, k, Type, Res;
734 assert( !Acb_ObjIsCio(p, iObj) );
735 Vec_IntClear( vTemp );
736 Acb_ObjForEachFaninFast( p, iObj, pFanin, iFanin, k )
737 {
738 assert( Acb_ObjCopy(p, iFanin) >= 0 );
739 Vec_IntPush( vTemp, Acb_ObjCopy(p, iFanin) );
740 }
741 Type = Acb_ObjType( p, iObj );
742 if ( Type == ABC_OPER_CONST_F )
743 return 0;
744 if ( Type == ABC_OPER_CONST_T )
745 return 1;
746 if ( Type == ABC_OPER_BIT_BUF || Type == ABC_OPER_BIT_INV )
747 {
748 Res = fUseBuf ? Gia_ManAppendBuf(pNew, Vec_IntEntry(vTemp, 0)) : Vec_IntEntry(vTemp, 0);
749 return Abc_LitNotCond( Res, Type == ABC_OPER_BIT_INV );
750 }
751 if ( Type == ABC_OPER_BIT_AND || Type == ABC_OPER_BIT_NAND )
752 {
753 Res = 1;
754 Vec_IntForEachEntry( vTemp, iFanin, k )
755 Res = Gia_ManAppendAnd2( pNew, Res, iFanin );
756 return Abc_LitNotCond( Res, Type == ABC_OPER_BIT_NAND );
757 }
758 if ( Type == ABC_OPER_BIT_OR || Type == ABC_OPER_BIT_NOR )
759 {
760 Res = 0;
761 Vec_IntForEachEntry( vTemp, iFanin, k )
762 Res = Gia_ManAppendOr2( pNew, Res, iFanin );
763 return Abc_LitNotCond( Res, Type == ABC_OPER_BIT_NOR );
764 }
765 if ( Type == ABC_OPER_BIT_XOR || Type == ABC_OPER_BIT_NXOR )
766 {
767 Res = 0;
768 Vec_IntForEachEntry( vTemp, iFanin, k )
769 Res = fUseXors ? Gia_ManAppendXorReal2(pNew, Res, iFanin) : Gia_ManAppendXor2(pNew, Res, iFanin);
770 return Abc_LitNotCond( Res, Type == ABC_OPER_BIT_NXOR );
771 }
772 assert( 0 );
773 return -1;
774}
775Gia_Man_t * Acb_NtkToGia2( Acb_Ntk_t * p, int fUseBuf, int fUseXors, Vec_Int_t * vTargets, int nTargets )
776{
777 Gia_Man_t * pNew, * pOne;
778 Vec_Int_t * vFanins, * vNodes;
779 int i, iObj;
780 pNew = Gia_ManStart( 2 * Acb_NtkObjNum(p) + 1000 );
781 pNew->pName = Abc_UtilStrsav(Acb_NtkName(p));
782 Acb_NtkCleanObjCopies( p );
783 Acb_NtkForEachCi( p, iObj, i )
784 Acb_ObjSetCopy( p, iObj, Gia_ManAppendCi(pNew) );
785 if ( vTargets )
786 Vec_IntForEachEntry( vTargets, iObj, i )
787 Acb_ObjSetCopy( p, iObj, Gia_ManAppendCi(pNew) );
788 else
789 for ( i = 0; i < nTargets; i++ )
790 Gia_ManAppendCi(pNew);
791 vFanins = Vec_IntAlloc( 4 );
792 vNodes = Acb_NtkFindNodes2( p );
793 Vec_IntForEachEntry( vNodes, iObj, i )
794 if ( Acb_ObjCopy(p, iObj) == -1 ) // skip targets assigned above
795 Acb_ObjSetCopy( p, iObj, Acb_ObjToGia2(pNew, fUseBuf, p, iObj, vFanins, fUseXors) );
796 Vec_IntFree( vNodes );
797 Vec_IntFree( vFanins );
798 Acb_NtkForEachCo( p, iObj, i )
799 Gia_ManAppendCo( pNew, Acb_ObjCopy(p, Acb_ObjFanin(p, iObj, 0)) );
800 pNew = Gia_ManCleanup( pOne = pNew );
801 Gia_ManUpdateCopy( &p->vObjCopy, pOne );
802 Gia_ManStop( pOne );
803 return pNew;
804}
805
818{
819 int i, iObj, iLit, nTargets = Vec_IntSize(&p->vTargets);
820 Vec_Int_t * vObjs = Acb_NtkFindNodes2( p );
821 Vec_Int_t * vNodes = Vec_IntAlloc( Acb_NtkObjNum(p) );
822 Vec_Ptr_t * vNodesR = Vec_PtrStart( Gia_ManObjNum(pGia) );
823 Vec_Bit_t * vDriver = Vec_BitStart( Gia_ManObjNum(pGia) );
824 Vec_Bit_t * vPolar = Vec_BitStart( Gia_ManObjNum(pGia) );
825 Gia_ManForEachCiId( pGia, iObj, i )
826 if ( i < Gia_ManCiNum(pGia) - nTargets )
827 Vec_PtrWriteEntry( vNodesR, iObj, Abc_UtilStrsav(Acb_ObjNameStr(p, Acb_NtkCi(p, i))) );
828 else
829 Vec_PtrWriteEntry( vNodesR, iObj, Abc_UtilStrsav(Acb_ObjNameStr(p, Vec_IntEntry(&p->vTargets, i-(Gia_ManCiNum(pGia) - nTargets)))) );
830 Gia_ManForEachCoId( pGia, iObj, i )
831 {
832 Vec_BitWriteEntry( vDriver, Gia_ObjFaninId0(Gia_ManObj(pGia, iObj), iObj), 1 );
833 Vec_PtrWriteEntry( vNodesR, iObj, Abc_UtilStrsav(Acb_ObjNameStr(p, Acb_NtkCo(p, i))) );
834 Vec_IntPush( vNodes, iObj );
835 }
836 Vec_IntForEachEntry( vObjs, iObj, i )
837 if ( (iLit = Acb_ObjCopy(p, iObj)) >= 0 && Gia_ObjIsAnd(Gia_ManObj(pGia, Abc_Lit2Var(iLit))) )
838 {
839 if ( !Vec_BitEntry(vDriver, Abc_Lit2Var(iLit)) && Vec_PtrEntry(vNodesR, Abc_Lit2Var(iLit)) == NULL )
840 {
841 Vec_PtrWriteEntry( vNodesR, Abc_Lit2Var(iLit), Abc_UtilStrsav(Acb_ObjNameStr(p, iObj)) );
842 Vec_IntPush( vNodes, Abc_Lit2Var(iLit) );
843 Vec_BitWriteEntry( vPolar, Abc_Lit2Var(iLit), Abc_LitIsCompl(iLit) );
844 }
845 }
846 Vec_BitFree( vDriver );
847 Vec_IntFree( vObjs );
848 Vec_IntSort( vNodes, 0 );
849 *pvNodesR = vNodesR;
850 *pvPolar = vPolar;
851 return vNodes;
852}
854{
855 char * pTemp; int i;
856 Vec_Int_t * vRes = Vec_IntAlloc( Vec_PtrSize(vUser) );
857 Vec_Int_t * vMap = Vec_IntStart( Abc_NamObjNumMax(Acb_NtkNam(p)) );
859 if ( Acb_ObjName(p, i) > 0 )
860 Vec_IntWriteEntry( vMap, Acb_ObjName(p, i), Acb_ObjCopy(p, i) );
861 Vec_PtrForEachEntry( char *, vUser, pTemp, i )
862 if ( Acb_NtkStrId(p, pTemp) < Vec_IntSize(vMap) )
863 {
864 int iLit = Vec_IntEntry( vMap, Acb_NtkStrId(p, pTemp) );
865 assert( iLit > 0 );
866 //printf( "Obj = %3d Name = %3d Copy = %3d\n", i, Acb_NtkStrId(p, pTemp), iLit );
867 Vec_IntPush( vRes, Abc_Lit2Var(iLit) );
868 }
869 assert( Vec_IntSize(vRes) == Vec_PtrSize(vUser) );
870 Vec_IntFree( vMap );
871 Vec_IntUniqify( vRes );
872 return vRes;
873}
874
886int Acb_NtkExtract( char * pFileName0, char * pFileName1, int fUseXors, int fVerbose,
887 Gia_Man_t ** ppGiaF, Gia_Man_t ** ppGiaG, int fUseBuf, Vec_Int_t ** pvNodes, Vec_Ptr_t ** pvNodesR, Vec_Bit_t ** pvPolar )
888{
889 Acb_Ntk_t * pNtkF = Acb_VerilogSimpleRead( pFileName0, NULL );
890 Acb_Ntk_t * pNtkG = Acb_VerilogSimpleRead( pFileName1, NULL );
891 int RetValue = -1;
892 if ( pNtkF && pNtkG )
893 {
894 int nTargets = Vec_IntSize(&pNtkF->vTargets);
895 Gia_Man_t * pGiaF = Acb_NtkToGia2( pNtkF, fUseBuf, fUseXors, &pNtkF->vTargets, 0 );
896 Gia_Man_t * pGiaG = Acb_NtkToGia2( pNtkG, 0, 0, NULL, nTargets );
897 pGiaF->pSpec = Abc_UtilStrsav( pNtkF->pDesign->pSpec );
898 pGiaG->pSpec = Abc_UtilStrsav( pNtkG->pDesign->pSpec );
899 assert( Acb_NtkCiNum(pNtkF) == Acb_NtkCiNum(pNtkG) );
900 assert( Acb_NtkCoNum(pNtkF) == Acb_NtkCoNum(pNtkG) );
901 *ppGiaF = pGiaF;
902 *ppGiaG = pGiaG;
903 *pvNodes = Acb_NtkCollectCopies( pNtkF, pGiaF, pvNodesR, pvPolar );
904 RetValue = nTargets;
905 }
906 if ( pNtkF ) Acb_ManFree( pNtkF->pDesign );
907 if ( pNtkG ) Acb_ManFree( pNtkG->pDesign );
908 return RetValue;
909}
910
923{
924 int i, iObj, iLit;
925 Abc_Obj_t * pObj;
926 Vec_Ptr_t * vObjs = Abc_NtkDfs( p, 0 );
927 Vec_Int_t * vNodes = Vec_IntAlloc( Abc_NtkObjNumMax(p) );
928 Vec_Ptr_t * vNodesR = Vec_PtrStart( Gia_ManObjNum(pGia) );
929 Vec_Bit_t * vDriver = Vec_BitStart( Gia_ManObjNum(pGia) );
930 Vec_Bit_t * vPolar = Vec_BitStart( Gia_ManObjNum(pGia) );
931 Gia_ManForEachCiId( pGia, iObj, i )
932 Vec_PtrWriteEntry( vNodesR, iObj, Abc_UtilStrsav(Abc_ObjName(Abc_NtkCi(p, i))) );
933 Gia_ManForEachCoId( pGia, iObj, i )
934 {
935 Vec_BitWriteEntry( vDriver, Gia_ObjFaninId0(Gia_ManObj(pGia, iObj), iObj), 1 );
936 Vec_PtrWriteEntry( vNodesR, iObj, Abc_UtilStrsav(Abc_ObjName(Abc_NtkCo(p, i))) );
937 Vec_IntPush( vNodes, iObj );
938 }
939 Vec_PtrForEachEntry( Abc_Obj_t *, vObjs, pObj, i )
940 if ( (iLit = pObj->iTemp) >= 0 && Gia_ObjIsAnd(Gia_ManObj(pGia, Abc_Lit2Var(iLit))) )
941 {
942 if ( !Vec_BitEntry(vDriver, Abc_Lit2Var(iLit)) && Vec_PtrEntry(vNodesR, Abc_Lit2Var(iLit)) == NULL )
943 {
944 Vec_PtrWriteEntry( vNodesR, Abc_Lit2Var(iLit), Abc_UtilStrsav(Abc_ObjName(pObj)) );
945 Vec_IntPush( vNodes, Abc_Lit2Var(iLit) );
946 Vec_BitWriteEntry( vPolar, Abc_Lit2Var(iLit), Abc_LitIsCompl(iLit) );
947 }
948 }
949 Vec_BitFree( vDriver );
950 Vec_PtrFree( vObjs );
951 Vec_IntSort( vNodes, 0 );
952 *pvNodesR = vNodesR;
953 *pvPolar = vPolar;
954 return vNodes;
955}
956int Abc_ObjToGia2( Gia_Man_t * pNew, Abc_Ntk_t * p, Abc_Obj_t * pObj, Vec_Int_t * vTemp, int fUseXors )
957{
958 Abc_Obj_t * pFanin; int k;
959 assert( Abc_ObjIsNode(pObj) );
960 Vec_IntClear( vTemp );
961 Abc_ObjForEachFanin( pObj, pFanin, k )
962 {
963 assert( pFanin->iTemp >= 0 );
964 Vec_IntPush( vTemp, pFanin->iTemp );
965 }
966 if ( Abc_ObjFaninNum(pObj) == 0 )
967 return Abc_SopIsConst0( (char*)pObj->pData ) ? 0 : 1;
968 if ( Abc_ObjFaninNum(pObj) == 1 )
969 return Abc_SopIsBuf( (char*)pObj->pData ) ? Vec_IntEntry(vTemp, 0) : Abc_LitNot(Vec_IntEntry(vTemp, 0));
970 if ( Abc_ObjFaninNum(pObj) == 2 ) // nand2
971 return Abc_LitNot( Gia_ManAppendAnd2( pNew, Vec_IntEntry(vTemp, 0), Vec_IntEntry(vTemp, 1) ) );
972 assert( 0 );
973 return -1;
974}
975Gia_Man_t * Abc_NtkToGia2( Abc_Ntk_t * p, int fUseXors )
976{
977 Gia_Man_t * pNew, * pOne;
978 Vec_Int_t * vFanins;
979 Vec_Ptr_t * vNodes;
980 Abc_Obj_t * pObj; int i;
981 pNew = Gia_ManStart( 2 * Abc_NtkObjNumMax(p) + 1000 );
982 pNew->pName = Abc_UtilStrsav(Abc_NtkName(p));
983 Abc_NtkForEachObj( p, pObj, i )
984 pObj->iTemp = -1;
985 Abc_NtkForEachCi( p, pObj, i )
986 pObj->iTemp = Gia_ManAppendCi(pNew);
987 vFanins = Vec_IntAlloc( 4 );
988 vNodes = Abc_NtkDfs( p, 0 );
989 Vec_PtrForEachEntry( Abc_Obj_t *, vNodes, pObj, i )
990 pObj->iTemp = Abc_ObjToGia2(pNew, p, pObj, vFanins, fUseXors);
991 Vec_PtrFree( vNodes );
992 Vec_IntFree( vFanins );
993 Abc_NtkForEachCo( p, pObj, i )
994 Gia_ManAppendCo( pNew, Abc_ObjFanin0(pObj)->iTemp );
995 pNew = Gia_ManCleanup( pOne = pNew );
996 //Gia_ManUpdateCopy( &p->vObjCopy, pOne );
997 Gia_ManStop( pOne );
998 return pNew;
999}
1000int Abc_NtkExtract( char * pFileName0, char * pFileName1, int fUseXors, int fVerbose,
1001 Gia_Man_t ** ppGiaF, Gia_Man_t ** ppGiaG, Vec_Int_t ** pvNodes, Vec_Ptr_t ** pvNodesR, Vec_Bit_t ** pvPolar )
1002{
1003 Abc_Ntk_t * pNtkF = Io_Read( pFileName0, Io_ReadFileType(pFileName0), 1, 0 );
1004 Abc_Ntk_t * pNtkG = Io_Read( pFileName1, Io_ReadFileType(pFileName1), 1, 0 );
1005 int RetValue = -1;
1006 if ( pNtkF && pNtkG )
1007 {
1008 Gia_Man_t * pGiaF = Abc_NtkToGia2( pNtkF, fUseXors );
1009 Gia_Man_t * pGiaG = Abc_NtkToGia2( pNtkG, 0 );
1010 assert( Abc_NtkCiNum(pNtkF) == Abc_NtkCiNum(pNtkG) );
1011 assert( Abc_NtkCoNum(pNtkF) == Abc_NtkCoNum(pNtkG) );
1012 pGiaF->pSpec = Abc_UtilStrsav( pNtkF->pSpec );
1013 pGiaG->pSpec = Abc_UtilStrsav( pNtkG->pSpec );
1014 *ppGiaF = pGiaF;
1015 *ppGiaG = pGiaG;
1016 *pvNodes = Abc_NtkCollectCopies( pNtkF, pGiaF, pvNodesR, pvPolar );
1017 RetValue = 0;
1018 }
1019 if ( pNtkF ) Abc_NtkDelete( pNtkF );
1020 if ( pNtkG ) Abc_NtkDelete( pNtkG );
1021 return RetValue;
1022}
1023
1035Vec_Int_t * Acb_NtkPlaces( char * pFileName, Vec_Ptr_t * vNames )
1036{
1037 Vec_Int_t * vPlaces; int First = 1, Pos = -1, fComment = 0;
1038 char * pTemp, * pBuffer = Extra_FileReadContents( pFileName );
1039 char * pLimit = pBuffer + strlen(pBuffer);
1040 if ( pBuffer == NULL )
1041 return NULL;
1042 vPlaces = Vec_IntAlloc( Vec_PtrSize(vNames) );
1043 for ( pTemp = pBuffer; *pTemp; pTemp++ )
1044 {
1045 if ( *pTemp == '\n' )
1046 fComment = 0;
1047 if ( *pTemp == '/' && *(pTemp + 1) == '/' )
1048 fComment = 1;
1049 if ( fComment )
1050 continue;
1051
1052 if ( *pTemp == '\n' )
1053 Pos = pTemp - pBuffer + 1;
1054 else if ( *pTemp == '(' )
1055 {
1056 if ( First )
1057 First = 0;
1058 else
1059 {
1060 char * pToken = strtok( pTemp+1, " \n\r\t," );
1061 char * pName; int i;
1062 Vec_PtrForEachEntry( char *, vNames, pName, i )
1063 if ( !strcmp(pName, pToken) )
1064 Vec_IntPushTwo( vPlaces, Pos, i );
1065 pTemp = pToken + strlen(pToken);
1066 while ( *pTemp == 0 )
1067 pTemp++;
1068 assert( pTemp < pLimit );
1069 }
1070 }
1071 }
1072 assert( Vec_IntSize(vPlaces) == 2*Vec_PtrSize(vNames) );
1073 ABC_FREE( pBuffer );
1074 return vPlaces;
1075}
1076void Acb_NtkInsert( char * pFileNameIn, char * pFileNameOut, Vec_Ptr_t * vNames, int fNumber, int fSkipMffc )
1077{
1078 int i, k, Prev = 0, Pos, Pos2, iObj;
1079 Vec_Int_t * vPlaces;
1080 char * pName, * pBuffer;
1081 FILE * pFile = fopen( pFileNameOut, "wb" );
1082 if ( pFile == NULL )
1083 {
1084 printf( "Cannot open output file \"%s\".\n", pFileNameOut );
1085 return;
1086 }
1087 pBuffer = Extra_FileReadContents( pFileNameIn );
1088 if ( pBuffer == NULL )
1089 {
1090 fclose( pFile );
1091 printf( "Cannot open input file \"%s\".\n", pFileNameIn );
1092 return;
1093 }
1094 if ( fSkipMffc )
1095 {
1096 Vec_Ptr_t * vMffcNames = Acb_NtkReturnMfsGates( pFileNameIn, vNames );
1097 vPlaces = Acb_NtkPlaces( pFileNameIn, vMffcNames );
1098 Vec_IntForEachEntryDouble( vPlaces, Pos, iObj, i )
1099 {
1100 for ( k = Prev; k < Pos; k++ )
1101 fputc( pBuffer[k], pFile );
1102 fprintf( pFile, "// MFFC %d = %s //", iObj, (char *)Vec_PtrEntry(vMffcNames, iObj) );
1103 Prev = Pos;
1104 }
1105 Vec_IntFree( vPlaces );
1106 Vec_PtrFreeFree( vMffcNames );
1107 }
1108 else
1109 {
1110 vPlaces = Acb_NtkPlaces( pFileNameIn, vNames );
1111 Vec_IntForEachEntryDouble( vPlaces, Pos, iObj, i )
1112 {
1113 for ( k = Prev; k < Pos; k++ )
1114 fputc( pBuffer[k], pFile );
1115 fprintf( pFile, "// [t_%d = %s] //", iObj, (char *)Vec_PtrEntry(vNames, iObj) );
1116 Prev = Pos;
1117 }
1118 Vec_IntFree( vPlaces );
1119 }
1120 pName = strstr(pBuffer, "endmodule");
1121 Pos2 = pName - pBuffer;
1122 for ( k = Prev; k < Pos2; k++ )
1123 fputc( pBuffer[k], pFile );
1124 fprintf( pFile, "\n\n" );
1125 fprintf( pFile, " wire " );
1126 if ( fNumber )
1127 {
1128 Vec_PtrForEachEntry( char *, vNames, pName, i )
1129 fprintf( pFile, " t_%d%s", i, i==Vec_PtrSize(vNames)-1 ? ";" : "," );
1130 }
1131 else
1132 {
1133 Vec_PtrForEachEntry( char *, vNames, pName, i )
1134 fprintf( pFile, " t%d_%s%s", i, pName, i==Vec_PtrSize(vNames)-1 ? ";" : "," );
1135 }
1136 fprintf( pFile, "\n\n" );
1137 if ( fNumber )
1138 {
1139 Vec_PtrForEachEntry( char *, vNames, pName, i )
1140 fprintf( pFile, " buf( %s, t_%d );\n", pName, i );
1141 }
1142 else
1143 {
1144 Vec_PtrForEachEntry( char *, vNames, pName, i )
1145 fprintf( pFile, " buf( %s, t%d_%s );\n", pName, i, pName );
1146 }
1147 fprintf( pFile, "\n" );
1148 for ( k = Pos2; pBuffer[k]; k++ )
1149 fputc( pBuffer[k], pFile );
1150 ABC_FREE( pBuffer );
1151 fclose( pFile );
1152}
1153
1165void Acb_Ntk4CollectAdd( Acb_Ntk_t * pNtk, int iObj, Vec_Int_t * vRes, Vec_Int_t * vDists, int Dist )
1166{
1167 if ( Acb_ObjSetTravIdCur(pNtk, iObj) )
1168 return;
1169 Vec_IntWriteEntry( vDists, iObj, Dist );
1170 Vec_IntPush( vRes, iObj );
1171}
1172void Acb_Ntk4CollectRing( Acb_Ntk_t * pNtk, Vec_Int_t * vStart, Vec_Int_t * vRes, Vec_Int_t * vDists )
1173{
1174 int i, iObj;
1175 Vec_IntForEachEntry( vStart, iObj, i )
1176 {
1177 int k, iFanin, * pFanins, Weight = Vec_IntEntry(vDists, iObj);
1178 Acb_ObjForEachFaninFast( pNtk, iObj, pFanins, iFanin, k )
1179 Acb_Ntk4CollectAdd( pNtk, iFanin, vRes, vDists, Weight + 1*(Acb_ObjFaninNum(pNtk, iObj) > 1) );
1180 Acb_ObjForEachFanout( pNtk, iObj, iFanin, k )
1181 Acb_Ntk4CollectAdd( pNtk, iFanin, vRes, vDists, Weight + 2*(Acb_ObjFaninNum(pNtk, iObj) > 1) );
1182 }
1183}
1184void Acb_Ntk4DumpWeightsInt( Acb_Ntk_t * pNtk, Vec_Int_t * vObjs, char * pFileName )
1185{
1186 int i, iObj;//, Count = 0;//, Weight;
1187 Vec_Int_t * vDists, * vStart, * vNexts;
1188 FILE * pFile = fopen( pFileName, "wb" );
1189 if ( pFile == NULL )
1190 {
1191 printf( "Canont open input file \"%s\".\n", pFileName );
1192 return;
1193 }
1194 vStart = Vec_IntAlloc( 100 );
1195 vNexts = Vec_IntAlloc( 100 );
1196 vDists = Vec_IntStart( Acb_NtkObjNumMax(pNtk) );
1197 Acb_NtkIncTravId( pNtk );
1198 Vec_IntForEachEntry( vObjs, iObj, i )
1199 {
1200 Acb_ObjSetTravIdCur(pNtk, iObj);
1201 Vec_IntWriteEntry( vDists, iObj, 1 );
1202 Vec_IntPush( vStart, iObj );
1203 }
1204 while ( 1 )
1205 {
1206 Acb_Ntk4CollectRing( pNtk, vStart, vNexts, vDists );
1207 if ( Vec_IntSize(vNexts) == 0 )
1208 break;
1209 Vec_IntClear( vStart );
1210 ABC_SWAP( Vec_Int_t, *vStart, *vNexts );
1211 }
1212 Vec_IntFree( vStart );
1213 Vec_IntFree( vNexts );
1214 // create weights
1215// Vec_IntForEachEntry( vDists, Weight, i )
1216// if ( Weight && Acb_ObjNameStr(pNtk, i)[0] != '1' )
1217// fprintf( pFile, "%s %d\n", Acb_ObjNameStr(pNtk, i), 10000+Weight );
1218/*
1219 // mark reachable
1220 Vec_IntClear( &pNtk->vArray0 );
1221 Acb_NtkIncTravId( pNtk );
1222 Acb_NtkForEachCo( pNtk, iObj, i )
1223 if ( !Vec_IntEntry(vStatus, i) )
1224 Acb_ObjCollectTfi_rec( pNtk, iObj, 0 );
1225*/
1226 Acb_NtkForEachObj( pNtk, iObj )
1227 {
1228 char * pName = Acb_ObjNameStr(pNtk, iObj);
1229 int Weight = Vec_IntEntry(vDists, iObj);
1230 if ( Weight == 0 )
1231 Weight = 10000;
1232/*
1233 if ( !Acb_ObjSetTravIdCur(pNtk, iObj) )
1234 {
1235 Count++;
1236 continue;
1237 }
1238*/
1239 fprintf( pFile, "%s %d\n", pName, 100000+Weight );
1240 }
1241 //printf( "Skipped %d nodes.\n", Count );
1242 Vec_IntFree( vDists );
1243 fclose( pFile );
1244}
1245void Acb_Ntk4DumpWeights( char * pFileNameIn, Vec_Ptr_t * vObjNames, char * pFileName )
1246{
1247 char * pName; int i, iObj;
1248 Vec_Int_t * vObjs = Vec_IntAlloc( Vec_PtrSize(vObjNames) );
1249 Acb_Ntk_t * pNtkF = Acb_VerilogSimpleRead( pFileNameIn, NULL );
1250 Acb_NtkCreateFanout( pNtkF );
1251 Vec_PtrForEachEntry( char *, vObjNames, pName, i )
1252 {
1253 Acb_NtkForEachObj( pNtkF, iObj )
1254 if ( !strcmp(Acb_ObjNameStr(pNtkF, iObj), pName) )
1255 Vec_IntPush( vObjs, iObj );
1256 }
1257 Acb_Ntk4DumpWeightsInt( pNtkF, vObjs, pFileName );
1258 Acb_ManFree( pNtkF->pDesign );
1259 Vec_IntFree( vObjs );
1260}
1261
1265
1266
1268
@ ABC_OPER_LUT
Definition abcOper.h:127
@ ABC_OPER_CONST_F
Definition abcOper.h:50
@ ABC_OPER_BIT_NAND
Definition abcOper.h:58
@ ABC_OPER_BIT_XOR
Definition abcOper.h:61
@ ABC_OPER_CONST_T
Definition abcOper.h:51
@ ABC_OPER_BIT_INV
Definition abcOper.h:56
@ ABC_OPER_BIT_AND
Definition abcOper.h:57
@ ABC_OPER_BIT_NOR
Definition abcOper.h:60
@ ABC_OPER_BIT_OR
Definition abcOper.h:59
@ ABC_OPER_BIT_BUF
Definition abcOper.h:55
@ ABC_OPER_BIT_NXOR
Definition abcOper.h:62
@ ABC_OPER_CO
Definition abcOper.h:46
struct Abc_Obj_t_ Abc_Obj_t
Definition abc.h:116
#define Abc_NtkForEachCo(pNtk, pCo, i)
Definition abc.h:522
ABC_DLL int Abc_SopIsConst0(char *pSop)
Definition abcSop.c:724
ABC_DLL Vec_Ptr_t * Abc_NtkDfs(Abc_Ntk_t *pNtk, int fCollectAll)
Definition abcDfs.c:82
#define Abc_NtkForEachObj(pNtk, pObj, i)
ITERATORS ///.
Definition abc.h:449
#define Abc_ObjForEachFanin(pObj, pFanin, i)
Definition abc.h:527
ABC_DLL char * Abc_ObjName(Abc_Obj_t *pNode)
DECLARATIONS ///.
Definition abcNames.c:49
struct Abc_Ntk_t_ Abc_Ntk_t
Definition abc.h:115
#define Abc_NtkForEachCi(pNtk, pCi, i)
Definition abc.h:518
ABC_DLL void Abc_NtkDelete(Abc_Ntk_t *pNtk)
Definition abcNtk.c:1421
ABC_DLL int Abc_SopIsBuf(char *pSop)
Definition abcSop.c:756
#define ABC_SWAP(Type, a, b)
Definition abc_global.h:253
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Acb_Ntk_t * Acb_NtkFromAbc(Abc_Ntk_t *p)
Definition acbAbc.c:73
int Acb_NtkComputePaths(Acb_Ntk_t *p)
Definition acbUtil.c:509
Gia_Man_t * Abc_NtkToGia2(Abc_Ntk_t *p, int fUseXors)
Definition acbUtil.c:975
int Acb_NtkCollectMfsGates(char *pFileName, Vec_Ptr_t *vNamesRefed, Vec_Ptr_t *vNamesDerefed, int nGates[5])
Definition acbUtil.c:268
int Acb_NtkNodeRef_rec(Vec_Int_t *vRefs, Acb_Ntk_t *p, int iObj)
Definition acbUtil.c:188
void Acb_NtkSaveSupport(Acb_Ntk_t *p, int iObj)
Definition acbUtil.c:674
int Abc_NtkExtract(char *pFileName0, char *pFileName1, int fUseXors, int fVerbose, Gia_Man_t **ppGiaF, Gia_Man_t **ppGiaG, Vec_Int_t **pvNodes, Vec_Ptr_t **pvNodesR, Vec_Bit_t **pvPolar)
Definition acbUtil.c:1000
int Acb_ObjToGia2(Gia_Man_t *pNew, int fUseBuf, Acb_Ntk_t *p, int iObj, Vec_Int_t *vTemp, int fUseXors)
Definition acbUtil.c:730
int Acb_ObjSlack(Acb_Ntk_t *p, int iObj)
Definition acbUtil.c:393
void Acb_NtkInsert(char *pFileNameIn, char *pFileNameOut, Vec_Ptr_t *vNames, int fNumber, int fSkipMffc)
Definition acbUtil.c:1076
int Acb_ObjComputePathD(Acb_Ntk_t *p, int iObj)
Definition acbUtil.c:400
int Acb_NtkCountPiBuffers(Acb_Ntk_t *p, Vec_Int_t *vObjs)
Definition acbUtil.c:139
void Acb_NtkFindNodes2_rec(Acb_Ntk_t *p, int iObj, Vec_Int_t *vNodes)
Definition acbUtil.c:709
void Abc_NtkComputePaths(Abc_Ntk_t *p)
Definition acbUtil.c:523
Vec_Int_t * Acb_NtkPlaces(char *pFileName, Vec_Ptr_t *vNames)
Definition acbUtil.c:1035
void Acb_NtkUpdateLevelD(Acb_Ntk_t *p, int Pivot)
Definition acbUtil.c:376
void Acb_NtkUpdateNode(Acb_Ntk_t *p, int Pivot, word uTruth, Vec_Int_t *vSupp)
Definition acbUtil.c:681
int Acb_NtkCreateNode(Acb_Ntk_t *p, word uTruth, Vec_Int_t *vSupp)
Definition acbUtil.c:636
int Acb_NtkComputeLevelR(Acb_Ntk_t *p, Vec_Int_t *vTfi)
Definition acbUtil.c:361
void Acb_NtkPrintNode(Acb_Ntk_t *p, int iObj)
Definition acbUtil.c:628
void Acb_ObjCollectTfo_rec(Acb_Ntk_t *p, int iObj, int fTerm)
Definition acbUtil.c:85
void Acb_NtkUpdateTiming(Acb_Ntk_t *p, int iObj)
Definition acbUtil.c:570
Vec_Int_t * Acb_NtkCollectCopies(Acb_Ntk_t *p, Gia_Man_t *pGia, Vec_Ptr_t **pvNodesR, Vec_Bit_t **pvPolar)
Definition acbUtil.c:817
Vec_Int_t * Abc_NtkCollectCopies(Abc_Ntk_t *p, Gia_Man_t *pGia, Vec_Ptr_t **pvNodesR, Vec_Bit_t **pvPolar)
Definition acbUtil.c:922
int Acb_NtkComputePathsD(Acb_Ntk_t *p, Vec_Int_t *vTfo, int fReverse)
Definition acbUtil.c:409
Vec_Int_t * Acb_ObjCollectTfi(Acb_Ntk_t *p, int iObj, int fTerm)
Definition acbUtil.c:59
int Acb_NtkNodeDeref_rec(Vec_Int_t *vRefs, Acb_Ntk_t *p, int iObj)
Definition acbUtil.c:174
Vec_Int_t * Acb_ObjCollectTfoVec(Acb_Ntk_t *p, Vec_Int_t *vObjs)
Definition acbUtil.c:108
int Acb_ObjComputeLevelR(Acb_Ntk_t *p, int iObj)
Definition acbUtil.c:354
void Acb_NtkCollectDeref_rec(Vec_Int_t *vRefs, Acb_Ntk_t *p, int iObj, Vec_Int_t *vRes)
Definition acbUtil.c:213
void Acb_NtkPrintPaths(Acb_Ntk_t *p)
Definition acbUtil.c:494
int Acb_ObjComputeLevelD(Acb_Ntk_t *p, int iObj)
Definition acbUtil.c:333
void Acb_Ntk4DumpWeightsInt(Acb_Ntk_t *pNtk, Vec_Int_t *vObjs, char *pFileName)
Definition acbUtil.c:1184
Vec_Int_t * Acb_NtkCollectUser(Acb_Ntk_t *p, Vec_Ptr_t *vUser)
Definition acbUtil.c:853
int Acb_NtkCountPoDrivers(Acb_Ntk_t *p, Vec_Int_t *vObjs)
Definition acbUtil.c:146
Vec_Int_t * Acb_ObjCollectTfiVec(Acb_Ntk_t *p, Vec_Int_t *vObjs)
Definition acbUtil.c:75
void Acb_Ntk4CollectAdd(Acb_Ntk_t *pNtk, int iObj, Vec_Int_t *vRes, Vec_Int_t *vDists, int Dist)
Definition acbUtil.c:1165
Vec_Ptr_t * Acb_NtkReturnMfsGates(char *pFileName, Vec_Ptr_t *vNodes)
Definition acbUtil.c:303
Vec_Int_t * Acb_NtkFindNodes2(Acb_Ntk_t *p)
Definition acbUtil.c:721
Vec_Int_t * Acb_ObjCollectTfo(Acb_Ntk_t *p, int iObj, int fTerm)
Definition acbUtil.c:96
Vec_Int_t * Acb_NtkCollectMffc(Acb_Ntk_t *p, Vec_Int_t *vObjsRefed, Vec_Int_t *vObjsDerefed)
Definition acbUtil.c:227
int Acb_NtkExtract(char *pFileName0, char *pFileName1, int fUseXors, int fVerbose, Gia_Man_t **ppGiaF, Gia_Man_t **ppGiaG, int fUseBuf, Vec_Int_t **pvNodes, Vec_Ptr_t **pvNodesR, Vec_Bit_t **pvPolar)
Definition acbUtil.c:886
void Acb_Ntk4CollectRing(Acb_Ntk_t *pNtk, Vec_Int_t *vStart, Vec_Int_t *vRes, Vec_Int_t *vDists)
Definition acbUtil.c:1172
Vec_Int_t * Acb_NamesToIds(Acb_Ntk_t *pNtk, Vec_Int_t *vNamesInv, Vec_Ptr_t *vNames)
Definition acbUtil.c:252
int Abc_ObjToGia2(Gia_Man_t *pNew, Abc_Ntk_t *p, Abc_Obj_t *pObj, Vec_Int_t *vTemp, int fUseXors)
Definition acbUtil.c:956
void Acb_NtkResetNode(Acb_Ntk_t *p, int Pivot, word uTruth, Vec_Int_t *vSupp)
Definition acbUtil.c:645
int Acb_NtkComputePathsR(Acb_Ntk_t *p, Vec_Int_t *vTfi, int fReverse)
Definition acbUtil.c:456
ABC_NAMESPACE_IMPL_START void Acb_ObjCollectTfi_rec(Acb_Ntk_t *p, int iObj, int fTerm)
DECLARATIONS ///.
Definition acbUtil.c:48
void Acb_Ntk4DumpWeights(char *pFileNameIn, Vec_Ptr_t *vObjNames, char *pFileName)
Definition acbUtil.c:1245
int Acb_NtkComputeLevelD(Acb_Ntk_t *p, Vec_Int_t *vTfo)
Definition acbUtil.c:340
int Acb_ObjComputePathR(Acb_Ntk_t *p, int iObj)
Definition acbUtil.c:447
int Acb_NtkIsPiBuffers(Acb_Ntk_t *p, int iObj)
Definition acbUtil.c:131
void Acb_ObjUpdatePriority(Acb_Ntk_t *p, int iObj)
Definition acbUtil.c:546
Gia_Man_t * Acb_NtkToGia2(Acb_Ntk_t *p, int fUseBuf, int fUseXors, Vec_Int_t *vTargets, int nTargets)
Definition acbUtil.c:775
Acb_Ntk_t * Acb_VerilogSimpleRead(char *pFileName, char *pFileNameW)
Definition acbFunc.c:622
#define Acb_NtkForEachCi(p, iObj, i)
Definition acb.h:336
struct Acb_Ntk_t_ Acb_Ntk_t
Definition acb.h:47
#define Acb_ObjForEachFanout(p, iObj, iFanout, k)
Definition acb.h:378
#define Acb_NtkForEachCo(p, iObj, i)
Definition acb.h:338
#define Acb_NtkForEachObj(p, i)
Definition acb.h:358
#define Acb_NtkForEachNode(p, i)
Definition acb.h:362
#define Acb_ObjForEachFaninFast(p, iObj, pFanins, iFanin, k)
Definition acb.h:375
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
ush Pos
Definition deflate.h:88
Cube * p
Definition exorList.c:222
cubedist Dist
Definition exorList.c:1012
char * Extra_FileReadContents(char *pFileName)
void Gia_ManStop(Gia_Man_t *p)
Definition giaMan.c:82
#define Gia_ManForEachCoId(p, Id, i)
Definition gia.h:1240
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
Definition giaMan.c:57
void Gia_ManUpdateCopy(Vec_Int_t *vCopy, Gia_Man_t *p)
Definition giaUtil.c:2352
struct Gia_Man_t_ Gia_Man_t
Definition gia.h:96
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
Definition giaScl.c:84
#define Gia_ManForEachCiId(p, Id, i)
Definition gia.h:1230
Io_FileType_t Io_ReadFileType(char *pFileName)
DECLARATIONS ///.
Definition ioUtil.c:47
Abc_Ntk_t * Io_Read(char *pFileName, Io_FileType_t FileType, int fCheck, int fBarBufs)
Definition ioUtil.c:241
unsigned __int64 word
DECLARATIONS ///.
Definition kitPerm.c:36
char * pSpec
Definition abc.h:159
void * pData
Definition abc.h:145
int iTemp
Definition abc.h:149
char * pSpec
Definition acb.h:108
char * pName
Definition acb.h:107
Vec_Int_t vObjName
Definition acb.h:79
Acb_Man_t * pDesign
Definition acb.h:53
Vec_Int_t vTargets
Definition acb.h:86
char * pSpec
Definition gia.h:100
char * pName
Definition gia.h:99
int Abc_NamObjNumMax(Abc_Nam_t *p)
Definition utilNam.c:231
#define assert(ex)
Definition util_old.h:213
int strlen()
int strcmp()
char * strtok()
char * strstr()
typedefABC_NAMESPACE_HEADER_START struct Vec_Bit_t_ Vec_Bit_t
INCLUDES ///.
Definition vecBit.h:42
#define Vec_IntForEachEntryDouble(vVec, Entry1, Entry2, i)
Definition vecInt.h:72
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
#define Vec_IntForEachEntryReverse(vVec, pEntry, i)
Definition vecInt.h:62
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
Definition vecPtr.h:42
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
Definition vecPtr.h:55