ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
giaDfs.c
Go to the documentation of this file.
1
20
21#include "gia.h"
22
24
25
29
33
46{
47 if ( Gia_ObjIsTravIdCurrent(p, pObj) )
48 return;
49 Gia_ObjSetTravIdCurrent(p, pObj);
50 if ( Gia_ObjIsCi(pObj) )
51 {
52 Vec_IntPush( vSupp, Gia_ObjId(p, pObj) );
53 return;
54 }
55 assert( Gia_ObjIsAnd(pObj) );
56 Gia_ManCollectCis_rec( p, Gia_ObjFanin0(pObj), vSupp );
57 Gia_ManCollectCis_rec( p, Gia_ObjFanin1(pObj), vSupp );
58}
59
71void Gia_ManCollectCis( Gia_Man_t * p, int * pNodes, int nNodes, Vec_Int_t * vSupp )
72{
73 Gia_Obj_t * pObj;
74 int i;
75 Vec_IntClear( vSupp );
77 Gia_ObjSetTravIdCurrent( p, Gia_ManConst0(p) );
78 for ( i = 0; i < nNodes; i++ )
79 {
80 pObj = Gia_ManObj( p, pNodes[i] );
81 if ( Gia_ObjIsCo(pObj) )
82 Gia_ManCollectCis_rec( p, Gia_ObjFanin0(pObj), vSupp );
83 else
84 Gia_ManCollectCis_rec( p, pObj, vSupp );
85 }
86}
87
99void Gia_ManCollectAnds_rec( Gia_Man_t * p, int iObj, Vec_Int_t * vNodes )
100{
101 Gia_Obj_t * pObj;
102 if ( Gia_ObjIsTravIdCurrentId(p, iObj) )
103 return;
104 Gia_ObjSetTravIdCurrentId(p, iObj);
105 pObj = Gia_ManObj( p, iObj );
106 if ( Gia_ObjIsCi(pObj) )
107 return;
108 assert( Gia_ObjIsAnd(pObj) );
109 Gia_ManCollectAnds_rec( p, Gia_ObjFaninId0(pObj, iObj), vNodes );
110 Gia_ManCollectAnds_rec( p, Gia_ObjFaninId1(pObj, iObj), vNodes );
111 Vec_IntPush( vNodes, iObj );
112}
113
125void Gia_ManCollectAnds( Gia_Man_t * p, int * pNodes, int nNodes, Vec_Int_t * vNodes, Vec_Int_t * vLeaves )
126{
127 int i, iLeaf;
128// Gia_ManIncrementTravId( p );
129 Gia_ObjSetTravIdCurrentId( p, 0 );
130 if ( vLeaves )
131 Vec_IntForEachEntry( vLeaves, iLeaf, i )
132 Gia_ObjSetTravIdCurrentId( p, iLeaf );
133 Vec_IntClear( vNodes );
134 for ( i = 0; i < nNodes; i++ )
135 {
136 Gia_Obj_t * pObj = Gia_ManObj( p, pNodes[i] );
137 if ( Gia_ObjIsCo(pObj) )
138 Gia_ManCollectAnds_rec( p, Gia_ObjFaninId0(pObj, pNodes[i]), vNodes );
139 else if ( Gia_ObjIsAnd(pObj) )
140 Gia_ManCollectAnds_rec( p, pNodes[i], vNodes );
141 }
142}
143
156{
157 Gia_Obj_t * pObj; int i;
158 Vec_Int_t * vNodes = Vec_IntAlloc( Gia_ManAndNum(p) );
159 Gia_ManForEachAnd( p, pObj, i )
160 Vec_IntPush( vNodes, i );
161 return vNodes;
162}
163
176{
177 if ( Gia_ObjIsTravIdCurrent(p, pObj) )
178 return;
179 Gia_ObjSetTravIdCurrent(p, pObj);
180 if ( Gia_ObjIsCi(pObj) )
181 {
182 Vec_IntPush( vNodes, Gia_ObjId(p, pObj) );
183 return;
184 }
185 assert( Gia_ObjIsAnd(pObj) );
186 Gia_ManCollectNodesCis_rec( p, Gia_ObjFanin0(pObj), vNodes );
187 Gia_ManCollectNodesCis_rec( p, Gia_ObjFanin1(pObj), vNodes );
188 Vec_IntPush( vNodes, Gia_ObjId(p, pObj) );
189}
190
202Vec_Int_t * Gia_ManCollectNodesCis( Gia_Man_t * p, int * pNodes, int nNodes )
203{
204 Vec_Int_t * vNodes;
205 Gia_Obj_t * pObj;
206 int i;
207 vNodes = Vec_IntAlloc( 10000 );
209 Gia_ObjSetTravIdCurrent( p, Gia_ManConst0(p) );
210 for ( i = 0; i < nNodes; i++ )
211 {
212 pObj = Gia_ManObj( p, pNodes[i] );
213 if ( Gia_ObjIsCo(pObj) )
214 Gia_ManCollectNodesCis_rec( p, Gia_ObjFanin0(pObj), vNodes );
215 else
216 Gia_ManCollectNodesCis_rec( p, pObj, vNodes );
217 }
218 return vNodes;
219}
220
233{
234 Vec_Int_t * vNodes;
235 Gia_Obj_t * pObj;
236 int i, iNode;
237 abctime clk = Abc_Clock();
238 vNodes = Vec_IntAlloc( 100 );
240 Gia_ManForEachCo( p, pObj, i )
241 {
242 iNode = Gia_ObjId(p, pObj);
243 Gia_ManCollectAnds( p, &iNode, 1, vNodes, NULL );
244 }
245 Vec_IntFree( vNodes );
246 ABC_PRT( "DFS from each output", Abc_Clock() - clk );
247}
248
261{
262 if ( Gia_ObjIsTravIdCurrent(p, pObj) )
263 return 0;
264 Gia_ObjSetTravIdCurrent(p, pObj);
265 if ( Gia_ObjIsCi(pObj) )
266 return 1;
267 assert( Gia_ObjIsAnd(pObj) );
268 return Gia_ManSuppSize_rec( p, Gia_ObjFanin0(pObj) ) +
269 Gia_ManSuppSize_rec( p, Gia_ObjFanin1(pObj) );
270}
271
284{
286 return Gia_ManSuppSize_rec( p, pObj );
287}
288
301{
302 Gia_Obj_t * pObj;
303 int i, Counter = 0;
304 abctime clk = Abc_Clock();
305 Gia_ManForEachObj( p, pObj, i )
306 if ( Gia_ObjIsAnd(pObj) )
307 Counter += (Gia_ManSuppSizeOne(p, pObj) <= 16);
308 printf( "Nodes with small support %d (out of %d)\n", Counter, Gia_ManAndNum(p) );
309 Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
310 return Counter;
311}
312
324int Gia_ManSuppSize( Gia_Man_t * p, int * pNodes, int nNodes )
325{
326 Gia_Obj_t * pObj;
327 int i, Counter = 0;
329 Gia_ObjSetTravIdCurrent( p, Gia_ManConst0(p) );
330 for ( i = 0; i < nNodes; i++ )
331 {
332 pObj = Gia_ManObj( p, pNodes[i] );
333 if ( Gia_ObjIsCo(pObj) )
334 Counter += Gia_ManSuppSize_rec( p, Gia_ObjFanin0(pObj) );
335 else
336 Counter += Gia_ManSuppSize_rec( p, pObj );
337 }
338 return Counter;
339}
340
353{
354 if ( Gia_ObjIsTravIdCurrent(p, pObj) )
355 return 0;
356 Gia_ObjSetTravIdCurrent(p, pObj);
357 if ( Gia_ObjIsCi(pObj) )
358 return 0;
359 assert( Gia_ObjIsAnd(pObj) );
360 return 1 + Gia_ManConeSize_rec( p, Gia_ObjFanin0(pObj) ) +
361 Gia_ManConeSize_rec( p, Gia_ObjFanin1(pObj) );
362}
363
375int Gia_ManConeSize( Gia_Man_t * p, int * pNodes, int nNodes )
376{
377 Gia_Obj_t * pObj;
378 int i, Counter = 0;
380 Gia_ObjSetTravIdCurrent( p, Gia_ManConst0(p) );
381 for ( i = 0; i < nNodes; i++ )
382 {
383 pObj = Gia_ManObj( p, pNodes[i] );
384 if ( Gia_ObjIsCo(pObj) )
385 Counter += Gia_ManConeSize_rec( p, Gia_ObjFanin0(pObj) );
386 else
387 Counter += Gia_ManConeSize_rec( p, pObj );
388 }
389 return Counter;
390}
391
404{
405 Gia_Obj_t * pObj;
406 Vec_Vec_t * vLevels;
407 int nLevels, Level, i;
408 nLevels = Gia_ManLevelNum( p );
409 vLevels = Vec_VecStart( nLevels + 1 );
410 Gia_ManForEachAnd( p, pObj, i )
411 {
412 Level = Gia_ObjLevel( p, pObj );
413 assert( Level <= nLevels );
414 Vec_VecPush( vLevels, Level, pObj );
415 }
416 return vLevels;
417}
418
431{
432 Gia_Obj_t * pObj;
433 Vec_Wec_t * vLevels;
434 int nLevels, Level, i;
435 nLevels = Gia_ManLevelRNum( p );
436 vLevels = Vec_WecStart( nLevels + 1 );
437 Gia_ManForEachObj( p, pObj, i )
438 {
439 if ( i == 0 || (!Gia_ObjIsCo(pObj) && !Gia_ObjLevel(p, pObj)) )
440 continue;
441 Level = Gia_ObjLevel( p, pObj );
442 assert( Level <= nLevels );
443 Vec_WecPush( vLevels, Level, i );
444 }
445 return vLevels;
446}
447
460{
461 Gia_Obj_t * pObj;
462 Vec_Vec_t * vLevels;
463 Vec_Ptr_t * vLevel;
464 Vec_Int_t * vResult;
465 int i, k;
466 vLevels = Vec_VecStart( 100 );
467 // make sure levels are assigned
468 Gia_ManForEachAnd( p, pObj, i )
469 assert( Gia_ObjLevel(p, pObj) > 0 );
470 // add CO nodes based on the level of their fanin
471 Gia_ManForEachCo( p, pObj, i )
472 Vec_VecPush( vLevels, Gia_ObjLevel(p, Gia_ObjFanin0(pObj)), pObj );
473 // add other nodes based on their level
474 Gia_ManForEachObj( p, pObj, i )
475 if ( !Gia_ObjIsCo(pObj) )
476 Vec_VecPush( vLevels, Gia_ObjLevel(p, pObj), pObj );
477 // put the nodes in the reverse topological order
478 vResult = Vec_IntAlloc( Gia_ManObjNum(p) );
479 Vec_VecForEachLevelReverse( vLevels, vLevel, i )
480 Vec_PtrForEachEntry( Gia_Obj_t *, vLevel, pObj, k )
481 Vec_IntPush( vResult, Gia_ObjId(p, pObj) );
482 Vec_VecFree( vLevels );
483 return vResult;
484}
485
497void Gia_ManCollectSeq_rec( Gia_Man_t * p, int Id, Vec_Int_t * vRoots, Vec_Int_t * vObjs )
498{
499 Gia_Obj_t * pObj;
500 if ( Gia_ObjIsTravIdCurrentId( p, Id ) )
501 return;
502 Gia_ObjSetTravIdCurrentId( p, Id );
503 pObj = Gia_ManObj( p, Id );
504 if ( Gia_ObjIsAnd(pObj) )
505 {
506 Gia_ManCollectSeq_rec( p, Gia_ObjFaninId0(pObj, Id), vRoots, vObjs );
507 Gia_ManCollectSeq_rec( p, Gia_ObjFaninId1(pObj, Id), vRoots, vObjs );
508 }
509 else if ( Gia_ObjIsCi(pObj) )
510 {
511 if ( Gia_ObjIsRo(p, pObj) )
512 Vec_IntPush( vRoots, Gia_ObjId(p, Gia_ObjRoToRi(p, pObj)) );
513 }
514 else if ( Gia_ObjIsCo(pObj) )
515 Gia_ManCollectSeq_rec( p, Gia_ObjFaninId0(pObj, Id), vRoots, vObjs );
516 else assert( 0 );
517 Vec_IntPush( vObjs, Id );
518}
519Vec_Int_t * Gia_ManCollectSeq( Gia_Man_t * p, int * pPos, int nPos )
520{
521 Vec_Int_t * vObjs, * vRoots;
522 int i, iRoot;
523 // collect roots
524 vRoots = Vec_IntAlloc( 100 );
525 for ( i = 0; i < nPos; i++ )
526 Vec_IntPush( vRoots, Gia_ObjId(p, Gia_ManPo(p, pPos[i])) );
527 // start trav IDs
529 Gia_ObjSetTravIdCurrentId( p, 0 );
530 // collect objects
531 vObjs = Vec_IntAlloc( 1000 );
532 Vec_IntPush( vObjs, 0 );
533 Vec_IntForEachEntry( vRoots, iRoot, i )
534 Gia_ManCollectSeq_rec( p, iRoot, vRoots, vObjs );
535 Vec_IntFree( vRoots );
536 return vObjs;
537}
539{
540 Vec_Int_t * vObjs;
541 int i;
542 abctime clk = Abc_Clock();
543 for ( i = 0; i < Gia_ManPoNum(p); i++ )
544 {
545 if ( i % 10000 == 0 )
546 printf( "%8d finished...\r", i );
547
548 vObjs = Gia_ManCollectSeq( p, &i, 1 );
549// printf( "%d ", Vec_IntSize(vObjs) );
550 Vec_IntFree( vObjs );
551 }
552 Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
553
554}
555
567void Gia_ManCollectTfi_rec( Gia_Man_t * p, int iObj, Vec_Int_t * vNodes )
568{
569 Gia_Obj_t * pObj;
570 if ( Gia_ObjIsTravIdCurrentId(p, iObj) )
571 return;
572 Gia_ObjSetTravIdCurrentId(p, iObj);
573 pObj = Gia_ManObj( p, iObj );
574 if ( Gia_ObjIsCi(pObj) )
575 return;
576 assert( Gia_ObjIsAnd(pObj) );
577 Gia_ManCollectTfi_rec( p, Gia_ObjFaninId0(pObj, iObj), vNodes );
578 Gia_ManCollectTfi_rec( p, Gia_ObjFaninId1(pObj, iObj), vNodes );
579 Vec_IntPush( vNodes, iObj );
580}
581void Gia_ManCollectTfi( Gia_Man_t * p, Vec_Int_t * vRoots, Vec_Int_t * vNodes )
582{
583 int i, iRoot;
584 Vec_IntClear( vNodes );
586 Vec_IntForEachEntry( vRoots, iRoot, i )
587 Gia_ManCollectTfi_rec( p, iRoot, vNodes );
588}
589
601void Gia_ManCollectTfo_rec( Gia_Man_t * p, int iObj, Vec_Int_t * vNodes )
602{
603 Gia_Obj_t * pObj; int i, iFan;
604 if ( Gia_ObjIsTravIdCurrentId(p, iObj) )
605 return;
606 Gia_ObjSetTravIdCurrentId(p, iObj);
607 pObj = Gia_ManObj( p, iObj );
608 if ( Gia_ObjIsCo(pObj) )
609 return;
610 assert( Gia_ObjIsAnd(pObj) );
611 Gia_ObjForEachFanoutStaticId( p, iObj, iFan, i )
612 Gia_ManCollectTfo_rec( p, iFan, vNodes );
613 Vec_IntPush( vNodes, iObj );
614}
615void Gia_ManCollectTfo( Gia_Man_t * p, Vec_Int_t * vRoots, Vec_Int_t * vNodes )
616{
617 int i, iRoot;
618 Vec_IntClear( vNodes );
620 Vec_IntForEachEntry( vRoots, iRoot, i )
621 Gia_ManCollectTfo_rec( p, iRoot, vNodes );
622}
623
627
628
630
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_PRT(a, t)
Definition abc_global.h:255
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
Cube * p
Definition exorList.c:222
Vec_Wec_t * Gia_ManLevelizeR(Gia_Man_t *p)
Definition giaDfs.c:430
int Gia_ManSuppSize(Gia_Man_t *p, int *pNodes, int nNodes)
Definition giaDfs.c:324
void Gia_ManCollectTfo_rec(Gia_Man_t *p, int iObj, Vec_Int_t *vNodes)
Definition giaDfs.c:601
int Gia_ManSuppSize_rec(Gia_Man_t *p, Gia_Obj_t *pObj)
Definition giaDfs.c:260
void Gia_ManCollectTfo(Gia_Man_t *p, Vec_Int_t *vRoots, Vec_Int_t *vNodes)
Definition giaDfs.c:615
void Gia_ManCollectNodesCis_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vNodes)
Definition giaDfs.c:175
void Gia_ManCollectSeq_rec(Gia_Man_t *p, int Id, Vec_Int_t *vRoots, Vec_Int_t *vObjs)
Definition giaDfs.c:497
int Gia_ManConeSize_rec(Gia_Man_t *p, Gia_Obj_t *pObj)
Definition giaDfs.c:352
Vec_Int_t * Gia_ManOrderReverse(Gia_Man_t *p)
Definition giaDfs.c:459
int Gia_ManSuppSizeOne(Gia_Man_t *p, Gia_Obj_t *pObj)
Definition giaDfs.c:283
void Gia_ManCollectSeqTest(Gia_Man_t *p)
Definition giaDfs.c:538
Vec_Vec_t * Gia_ManLevelize(Gia_Man_t *p)
Definition giaDfs.c:403
void Gia_ManCollectAnds_rec(Gia_Man_t *p, int iObj, Vec_Int_t *vNodes)
Definition giaDfs.c:99
void Gia_ManCollectTest(Gia_Man_t *p)
Definition giaDfs.c:232
void Gia_ManCollectTfi(Gia_Man_t *p, Vec_Int_t *vRoots, Vec_Int_t *vNodes)
Definition giaDfs.c:581
int Gia_ManSuppSizeTest(Gia_Man_t *p)
Definition giaDfs.c:300
int Gia_ManConeSize(Gia_Man_t *p, int *pNodes, int nNodes)
Definition giaDfs.c:375
Vec_Int_t * Gia_ManCollectNodesCis(Gia_Man_t *p, int *pNodes, int nNodes)
Definition giaDfs.c:202
void Gia_ManCollectCis(Gia_Man_t *p, int *pNodes, int nNodes, Vec_Int_t *vSupp)
Definition giaDfs.c:71
ABC_NAMESPACE_IMPL_START void Gia_ManCollectCis_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vSupp)
DECLARATIONS ///.
Definition giaDfs.c:45
Vec_Int_t * Gia_ManCollectAndsAll(Gia_Man_t *p)
Definition giaDfs.c:155
void Gia_ManCollectTfi_rec(Gia_Man_t *p, int iObj, Vec_Int_t *vNodes)
Definition giaDfs.c:567
Vec_Int_t * Gia_ManCollectSeq(Gia_Man_t *p, int *pPos, int nPos)
Definition giaDfs.c:519
void Gia_ManCollectAnds(Gia_Man_t *p, int *pNodes, int nNodes, Vec_Int_t *vNodes, Vec_Int_t *vLeaves)
Definition giaDfs.c:125
#define Gia_ManForEachAnd(p, pObj, i)
Definition gia.h:1214
int Gia_ManLevelRNum(Gia_Man_t *p)
Definition giaUtil.c:566
struct Gia_Obj_t_ Gia_Obj_t
Definition gia.h:76
struct Gia_Man_t_ Gia_Man_t
Definition gia.h:96
void Gia_ManIncrementTravId(Gia_Man_t *p)
Definition giaUtil.c:190
#define Gia_ObjForEachFanoutStaticId(p, Id, FanId, i)
Definition gia.h:1127
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
Definition gia.h:1190
#define Gia_ManForEachCo(p, pObj, i)
Definition gia.h:1236
int Gia_ManLevelNum(Gia_Man_t *p)
Definition giaUtil.c:546
#define assert(ex)
Definition util_old.h:213
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
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
#define Vec_VecForEachLevelReverse(vGlob, vVec, i)
Definition vecVec.h:63
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.
Definition vecVec.h:42
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.
Definition vecWec.h:42