ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
abcMulti.c
Go to the documentation of this file.
1
20
21#include "base/abc/abc.h"
22
23#ifdef ABC_USE_CUDD
24#include "bdd/extrab/extraBdd.h"
25#endif
26
28
29
33
34#ifdef ABC_USE_CUDD
35
36static void Abc_NtkMultiInt( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew );
37static Abc_Obj_t * Abc_NtkMulti_rec( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pNodeOld );
38
39static DdNode * Abc_NtkMultiDeriveBdd_rec( DdManager * dd, Abc_Obj_t * pNodeOld, Vec_Ptr_t * vFanins );
40static DdNode * Abc_NtkMultiDeriveBdd( DdManager * dd, Abc_Obj_t * pNodeOld, Vec_Ptr_t * vFaninsOld );
41
42static void Abc_NtkMultiSetBounds( Abc_Ntk_t * pNtk, int nThresh, int nFaninMax );
43static void Abc_NtkMultiSetBoundsCnf( Abc_Ntk_t * pNtk );
44static void Abc_NtkMultiSetBoundsMulti( Abc_Ntk_t * pNtk, int nThresh );
45static void Abc_NtkMultiSetBoundsSimple( Abc_Ntk_t * pNtk );
46static void Abc_NtkMultiSetBoundsFactor( Abc_Ntk_t * pNtk );
47static void Abc_NtkMultiCone( Abc_Obj_t * pNode, Vec_Ptr_t * vCone );
48
52
64Abc_Ntk_t * Abc_NtkMulti( Abc_Ntk_t * pNtk, int nThresh, int nFaninMax, int fCnf, int fMulti, int fSimple, int fFactor )
65{
66 Abc_Ntk_t * pNtkNew;
67
68 assert( Abc_NtkIsStrash(pNtk) );
69 assert( nThresh >= 0 );
70 assert( nFaninMax > 1 );
71
72 // print a warning about choice nodes
73 if ( Abc_NtkGetChoiceNum( pNtk ) )
74 printf( "Warning: The choice nodes in the AIG are removed by renoding.\n" );
75
76 // define the boundary
77 if ( fCnf )
78 Abc_NtkMultiSetBoundsCnf( pNtk );
79 else if ( fMulti )
80 Abc_NtkMultiSetBoundsMulti( pNtk, nThresh );
81 else if ( fSimple )
82 Abc_NtkMultiSetBoundsSimple( pNtk );
83 else if ( fFactor )
84 Abc_NtkMultiSetBoundsFactor( pNtk );
85 else
86 Abc_NtkMultiSetBounds( pNtk, nThresh, nFaninMax );
87
88 // perform renoding for this boundary
90 Abc_NtkMultiInt( pNtk, pNtkNew );
91 Abc_NtkFinalize( pNtk, pNtkNew );
92
93 // make the network minimum base
94 Abc_NtkMinimumBase( pNtkNew );
95
96 // fix the problem with complemented and duplicated CO edges
97 Abc_NtkLogicMakeSimpleCos( pNtkNew, 0 );
98
99 // report the number of CNF objects
100 if ( fCnf )
101 {
102// int nClauses = Abc_NtkGetClauseNum(pNtkNew) + 2*Abc_NtkPoNum(pNtkNew) + 2*Abc_NtkLatchNum(pNtkNew);
103// printf( "CNF variables = %d. CNF clauses = %d.\n", Abc_NtkNodeNum(pNtkNew), nClauses );
104 }
105//printf( "Maximum fanin = %d.\n", Abc_NtkGetFaninMax(pNtkNew) );
106
107 if ( pNtk->pExdc )
108 pNtkNew->pExdc = Abc_NtkDup( pNtk->pExdc );
109 // make sure everything is okay
110 if ( !Abc_NtkCheck( pNtkNew ) )
111 {
112 printf( "Abc_NtkMulti: The network check has failed.\n" );
113 Abc_NtkDelete( pNtkNew );
114 return NULL;
115 }
116 return pNtkNew;
117}
118
130void Abc_NtkMultiInt( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew )
131{
132 ProgressBar * pProgress;
133 Abc_Obj_t * pNode, * pConst1, * pNodeNew;
134 int i;
135
136 // set the constant node
137 pConst1 = Abc_AigConst1(pNtk);
138 if ( Abc_ObjFanoutNum(pConst1) > 0 )
139 {
140 pNodeNew = Abc_NtkCreateNode( pNtkNew );
141 pNodeNew->pData = Cudd_ReadOne( (DdManager *)pNtkNew->pManFunc ); Cudd_Ref( (DdNode *)pNodeNew->pData );
142 pConst1->pCopy = pNodeNew;
143 }
144
145 // perform renoding for POs
146 pProgress = Extra_ProgressBarStart( stdout, Abc_NtkCoNum(pNtk) );
147 Abc_NtkForEachCo( pNtk, pNode, i )
148 {
149 Extra_ProgressBarUpdate( pProgress, i, NULL );
150 if ( Abc_ObjIsCi(Abc_ObjFanin0(pNode)) )
151 continue;
152 Abc_NtkMulti_rec( pNtkNew, Abc_ObjFanin0(pNode) );
153 }
154 Extra_ProgressBarStop( pProgress );
155
156 // clean the boundaries and data field in the old network
157 Abc_NtkForEachObj( pNtk, pNode, i )
158 {
159 pNode->fMarkA = 0;
160 pNode->pData = NULL;
161 }
162}
163
175Abc_Obj_t * Abc_NtkMulti_rec( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pNodeOld )
176{
177 Vec_Ptr_t * vCone;
178 Abc_Obj_t * pNodeNew;
179 int i;
180
181 assert( !Abc_ObjIsComplement(pNodeOld) );
182 // return if the result if known
183 if ( pNodeOld->pCopy )
184 return pNodeOld->pCopy;
185 assert( Abc_ObjIsNode(pNodeOld) );
186 assert( !Abc_AigNodeIsConst(pNodeOld) );
187 assert( pNodeOld->fMarkA );
188
189//printf( "%d ", Abc_NodeMffcSizeSupp(pNodeOld) );
190
191 // collect the renoding cone
192 vCone = Vec_PtrAlloc( 10 );
193 Abc_NtkMultiCone( pNodeOld, vCone );
194
195 // create a new node
196 pNodeNew = Abc_NtkCreateNode( pNtkNew );
197 for ( i = 0; i < vCone->nSize; i++ )
198 Abc_ObjAddFanin( pNodeNew, Abc_NtkMulti_rec(pNtkNew, (Abc_Obj_t *)vCone->pArray[i]) );
199
200 // derive the function of this node
201 pNodeNew->pData = Abc_NtkMultiDeriveBdd( (DdManager *)pNtkNew->pManFunc, pNodeOld, vCone );
202 Cudd_Ref( (DdNode *)pNodeNew->pData );
203 Vec_PtrFree( vCone );
204
205 // remember the node
206 pNodeOld->pCopy = pNodeNew;
207 return pNodeOld->pCopy;
208}
209
210
222DdNode * Abc_NtkMultiDeriveBdd( DdManager * dd, Abc_Obj_t * pNodeOld, Vec_Ptr_t * vFaninsOld )
223{
224 Abc_Obj_t * pFaninOld;
225 DdNode * bFunc;
226 int i;
227 assert( !Abc_AigNodeIsConst(pNodeOld) );
228 assert( Abc_ObjIsNode(pNodeOld) );
229 // set the elementary BDD variables for the input nodes
230 for ( i = 0; i < vFaninsOld->nSize; i++ )
231 {
232 pFaninOld = (Abc_Obj_t *)vFaninsOld->pArray[i];
233 pFaninOld->pData = Cudd_bddIthVar( dd, i ); Cudd_Ref( (DdNode *)pFaninOld->pData );
234 pFaninOld->fMarkC = 1;
235 }
236 // call the recursive BDD computation
237 bFunc = Abc_NtkMultiDeriveBdd_rec( dd, pNodeOld, vFaninsOld ); Cudd_Ref( bFunc );
238 // dereference the intermediate nodes
239 for ( i = 0; i < vFaninsOld->nSize; i++ )
240 {
241 pFaninOld = (Abc_Obj_t *)vFaninsOld->pArray[i];
242 Cudd_RecursiveDeref( dd, (DdNode *)pFaninOld->pData );
243 pFaninOld->fMarkC = 0;
244 }
245 Cudd_Deref( bFunc );
246 return bFunc;
247}
248
260DdNode * Abc_NtkMultiDeriveBdd_rec( DdManager * dd, Abc_Obj_t * pNode, Vec_Ptr_t * vFanins )
261{
262 DdNode * bFunc, * bFunc0, * bFunc1;
263 assert( !Abc_ObjIsComplement(pNode) );
264 // if the result is available return
265 if ( pNode->fMarkC )
266 {
267 assert( pNode->pData ); // network has a cycle
268 return (DdNode *)pNode->pData;
269 }
270 // mark the node as visited
271 pNode->fMarkC = 1;
272 Vec_PtrPush( vFanins, pNode );
273 // compute the result for both branches
274 bFunc0 = Abc_NtkMultiDeriveBdd_rec( dd, Abc_ObjFanin(pNode,0), vFanins ); Cudd_Ref( bFunc0 );
275 bFunc1 = Abc_NtkMultiDeriveBdd_rec( dd, Abc_ObjFanin(pNode,1), vFanins ); Cudd_Ref( bFunc1 );
276 bFunc0 = Cudd_NotCond( bFunc0, (long)Abc_ObjFaninC0(pNode) );
277 bFunc1 = Cudd_NotCond( bFunc1, (long)Abc_ObjFaninC1(pNode) );
278 // get the final result
279 bFunc = Cudd_bddAnd( dd, bFunc0, bFunc1 ); Cudd_Ref( bFunc );
280 Cudd_RecursiveDeref( dd, bFunc0 );
281 Cudd_RecursiveDeref( dd, bFunc1 );
282 // set the result
283 pNode->pData = bFunc;
284 assert( pNode->pData );
285 return bFunc;
286}
287
288
289
301int Abc_NtkMultiLimit_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vCone, int nFaninMax, int fCanStop, int fFirst )
302{
303 int nNodes0, nNodes1;
304 assert( !Abc_ObjIsComplement(pNode) );
305 // check if the node should be added to the fanins
306 if ( !fFirst && (pNode->fMarkA || !Abc_ObjIsNode(pNode)) )
307 {
308 Vec_PtrPushUnique( vCone, pNode );
309 return 0;
310 }
311 // if we cannot stop in this branch, collect all nodes
312 if ( !fCanStop )
313 {
314 Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,0), vCone, nFaninMax, 0, 0 );
315 Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,1), vCone, nFaninMax, 0, 0 );
316 return 0;
317 }
318 // if we can stop, try the left branch first, and return if we stopped
319 assert( vCone->nSize == 0 );
320 if ( Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,0), vCone, nFaninMax, 1, 0 ) )
321 return 1;
322 // save the number of nodes in the left branch and call for the right branch
323 nNodes0 = vCone->nSize;
324 assert( nNodes0 <= nFaninMax );
325 Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,1), vCone, nFaninMax, 0, 0 );
326 // check the number of nodes
327 if ( vCone->nSize <= nFaninMax )
328 return 0;
329 // the number of nodes exceeds the limit
330
331 // get the number of nodes in the right branch
332 vCone->nSize = 0;
333 Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,1), vCone, nFaninMax, 0, 0 );
334 // if this number exceeds the limit, solve the problem for this branch
335 if ( vCone->nSize > nFaninMax )
336 {
337 int RetValue;
338 vCone->nSize = 0;
339 RetValue = Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,1), vCone, nFaninMax, 1, 0 );
340 assert( RetValue == 1 );
341 return 1;
342 }
343
344 nNodes1 = vCone->nSize;
345 assert( nNodes1 <= nFaninMax );
346 if ( nNodes0 >= nNodes1 )
347 { // the left branch is larger - cut it
348 assert( Abc_ObjFanin(pNode,0)->fMarkA == 0 );
349 Abc_ObjFanin(pNode,0)->fMarkA = 1;
350 }
351 else
352 { // the right branch is larger - cut it
353 assert( Abc_ObjFanin(pNode,1)->fMarkA == 0 );
354 Abc_ObjFanin(pNode,1)->fMarkA = 1;
355 }
356 return 1;
357}
358
370int Abc_NtkMultiLimit( Abc_Obj_t * pNode, Vec_Ptr_t * vCone, int nFaninMax )
371{
372 vCone->nSize = 0;
373 return Abc_NtkMultiLimit_rec( pNode, vCone, nFaninMax, 1, 1 );
374}
375
388void Abc_NtkMultiSetBounds( Abc_Ntk_t * pNtk, int nThresh, int nFaninMax )
389{
390 Vec_Ptr_t * vCone = Vec_PtrAlloc(10);
391 Abc_Obj_t * pNode;
392 int i, nFanouts, nConeSize;
393
394 // make sure the mark is not set
395 Abc_NtkForEachObj( pNtk, pNode, i )
396 assert( pNode->fMarkA == 0 );
397
398 // mark the nodes where expansion stops using pNode->fMarkA
399 Abc_NtkForEachNode( pNtk, pNode, i )
400 {
401 // skip PI/PO nodes
402// if ( Abc_NodeIsConst(pNode) )
403// continue;
404 // mark the nodes with multiple fanouts
405 nFanouts = Abc_ObjFanoutNum(pNode);
406 nConeSize = Abc_NodeMffcSize(pNode);
407 if ( (nFanouts - 1) * nConeSize > nThresh )
408 pNode->fMarkA = 1;
409 }
410
411 // mark the PO drivers
412 Abc_NtkForEachCo( pNtk, pNode, i )
413 Abc_ObjFanin0(pNode)->fMarkA = 1;
414
415 // make sure the fanin limit is met
416 Abc_NtkForEachNode( pNtk, pNode, i )
417 {
418 // skip PI/PO nodes
419// if ( Abc_NodeIsConst(pNode) )
420// continue;
421 if ( pNode->fMarkA == 0 )
422 continue;
423 // continue cutting branches until it meets the fanin limit
424 while ( Abc_NtkMultiLimit(pNode, vCone, nFaninMax) );
425 assert( vCone->nSize <= nFaninMax );
426 }
427 Vec_PtrFree(vCone);
428/*
429 // make sure the fanin limit is met
430 Abc_NtkForEachNode( pNtk, pNode, i )
431 {
432 // skip PI/PO nodes
433// if ( Abc_NodeIsConst(pNode) )
434// continue;
435 if ( pNode->fMarkA == 0 )
436 continue;
437 Abc_NtkMultiCone( pNode, vCone );
438 assert( vCone->nSize <= nFaninMax );
439 }
440*/
441}
442
455void Abc_NtkMultiSetBoundsCnf( Abc_Ntk_t * pNtk )
456{
457 Abc_Obj_t * pNode;
458 int i, nMuxes;
459
460 // make sure the mark is not set
461 Abc_NtkForEachObj( pNtk, pNode, i )
462 assert( pNode->fMarkA == 0 );
463
464 // mark the nodes where expansion stops using pNode->fMarkA
465 Abc_NtkForEachNode( pNtk, pNode, i )
466 {
467 // skip PI/PO nodes
468// if ( Abc_NodeIsConst(pNode) )
469// continue;
470 // mark the nodes with multiple fanouts
471 if ( Abc_ObjFanoutNum(pNode) > 1 )
472 pNode->fMarkA = 1;
473 // mark the nodes that are roots of MUXes
474 if ( Abc_NodeIsMuxType( pNode ) )
475 {
476 pNode->fMarkA = 1;
477 Abc_ObjFanin0( Abc_ObjFanin0(pNode) )->fMarkA = 1;
478 Abc_ObjFanin0( Abc_ObjFanin1(pNode) )->fMarkA = 1;
479 Abc_ObjFanin1( Abc_ObjFanin0(pNode) )->fMarkA = 1;
480 Abc_ObjFanin1( Abc_ObjFanin1(pNode) )->fMarkA = 1;
481 }
482 else // mark the complemented edges
483 {
484 if ( Abc_ObjFaninC0(pNode) )
485 Abc_ObjFanin0(pNode)->fMarkA = 1;
486 if ( Abc_ObjFaninC1(pNode) )
487 Abc_ObjFanin1(pNode)->fMarkA = 1;
488 }
489 }
490
491 // mark the PO drivers
492 Abc_NtkForEachCo( pNtk, pNode, i )
493 Abc_ObjFanin0(pNode)->fMarkA = 1;
494
495 // count the number of MUXes
496 nMuxes = 0;
497 Abc_NtkForEachNode( pNtk, pNode, i )
498 {
499 // skip PI/PO nodes
500// if ( Abc_NodeIsConst(pNode) )
501// continue;
502 if ( Abc_NodeIsMuxType(pNode) &&
503 Abc_ObjFanin0(pNode)->fMarkA == 0 &&
504 Abc_ObjFanin1(pNode)->fMarkA == 0 )
505 nMuxes++;
506 }
507// printf( "The number of MUXes detected = %d (%5.2f %% of logic).\n", nMuxes, 300.0*nMuxes/Abc_NtkNodeNum(pNtk) );
508}
509
521void Abc_NtkMultiSetBoundsMulti( Abc_Ntk_t * pNtk, int nThresh )
522{
523 Abc_Obj_t * pNode;
524 int i, nFanouts, nConeSize;
525
526 // make sure the mark is not set
527 Abc_NtkForEachObj( pNtk, pNode, i )
528 assert( pNode->fMarkA == 0 );
529
530 // mark the nodes where expansion stops using pNode->fMarkA
531 Abc_NtkForEachNode( pNtk, pNode, i )
532 {
533 // skip PI/PO nodes
534// if ( Abc_NodeIsConst(pNode) )
535// continue;
536 // mark the nodes with multiple fanouts
537// if ( Abc_ObjFanoutNum(pNode) > 1 )
538// pNode->fMarkA = 1;
539 // mark the nodes with multiple fanouts
540 nFanouts = Abc_ObjFanoutNum(pNode);
541 nConeSize = Abc_NodeMffcSizeStop(pNode);
542 if ( (nFanouts - 1) * nConeSize > nThresh )
543 pNode->fMarkA = 1;
544 // mark the children if they are pointed by the complemented edges
545 if ( Abc_ObjFaninC0(pNode) )
546 Abc_ObjFanin0(pNode)->fMarkA = 1;
547 if ( Abc_ObjFaninC1(pNode) )
548 Abc_ObjFanin1(pNode)->fMarkA = 1;
549 }
550
551 // mark the PO drivers
552 Abc_NtkForEachCo( pNtk, pNode, i )
553 Abc_ObjFanin0(pNode)->fMarkA = 1;
554}
555
567void Abc_NtkMultiSetBoundsSimple( Abc_Ntk_t * pNtk )
568{
569 Abc_Obj_t * pNode;
570 int i;
571 // make sure the mark is not set
572 Abc_NtkForEachObj( pNtk, pNode, i )
573 assert( pNode->fMarkA == 0 );
574 // mark the nodes where expansion stops using pNode->fMarkA
575 Abc_NtkForEachNode( pNtk, pNode, i )
576 pNode->fMarkA = 1;
577}
578
590void Abc_NtkMultiSetBoundsFactor( Abc_Ntk_t * pNtk )
591{
592 Abc_Obj_t * pNode;
593 int i;
594 // make sure the mark is not set
595 Abc_NtkForEachObj( pNtk, pNode, i )
596 assert( pNode->fMarkA == 0 );
597 // mark the nodes where expansion stops using pNode->fMarkA
598 Abc_NtkForEachNode( pNtk, pNode, i )
599 pNode->fMarkA = (pNode->vFanouts.nSize > 1 && !Abc_NodeIsMuxControlType(pNode));
600 // mark the PO drivers
601 Abc_NtkForEachCo( pNtk, pNode, i )
602 Abc_ObjFanin0(pNode)->fMarkA = 1;
603}
604
616void Abc_NtkMultiCone_rec( Abc_Obj_t * pNode, Vec_Ptr_t * vCone )
617{
618 assert( !Abc_ObjIsComplement(pNode) );
619 if ( pNode->fMarkA || !Abc_ObjIsNode(pNode) )
620 {
621 Vec_PtrPushUnique( vCone, pNode );
622 return;
623 }
624 Abc_NtkMultiCone_rec( Abc_ObjFanin(pNode,0), vCone );
625 Abc_NtkMultiCone_rec( Abc_ObjFanin(pNode,1), vCone );
626}
627
639void Abc_NtkMultiCone( Abc_Obj_t * pNode, Vec_Ptr_t * vCone )
640{
641 assert( !Abc_ObjIsComplement(pNode) );
642 assert( Abc_ObjIsNode(pNode) );
643 vCone->nSize = 0;
644 Abc_NtkMultiCone_rec( Abc_ObjFanin(pNode,0), vCone );
645 Abc_NtkMultiCone_rec( Abc_ObjFanin(pNode,1), vCone );
646}
647
648#else
649
650Abc_Ntk_t * Abc_NtkMulti( Abc_Ntk_t * pNtk, int nThresh, int nFaninMax, int fCnf, int fMulti, int fSimple, int fFactor ) { return NULL; }
651
652#endif
653
657
658
660
ABC_NAMESPACE_IMPL_START Abc_Ntk_t * Abc_NtkMulti(Abc_Ntk_t *pNtk, int nThresh, int nFaninMax, int fCnf, int fMulti, int fSimple, int fFactor)
DECLARATIONS ///.
Definition abcMulti.c:650
struct Abc_Obj_t_ Abc_Obj_t
Definition abc.h:116
#define Abc_NtkForEachCo(pNtk, pCo, i)
Definition abc.h:522
ABC_DLL void Abc_ObjAddFanin(Abc_Obj_t *pObj, Abc_Obj_t *pFanin)
Definition abcFanio.c:84
ABC_DLL int Abc_NodeMffcSize(Abc_Obj_t *pNode)
FUNCTION DEFINITIONS ///.
Definition abcRefs.c:48
ABC_DLL int Abc_NodeMffcSizeStop(Abc_Obj_t *pNode)
Definition abcRefs.c:74
ABC_DLL int Abc_NtkGetChoiceNum(Abc_Ntk_t *pNtk)
Definition abcUtil.c:463
ABC_DLL int Abc_NtkCheck(Abc_Ntk_t *pNtk)
FUNCTION DEFINITIONS ///.
Definition abcCheck.c:64
#define Abc_NtkForEachObj(pNtk, pObj, i)
ITERATORS ///.
Definition abc.h:449
struct Abc_Ntk_t_ Abc_Ntk_t
Definition abc.h:115
ABC_DLL void Abc_NtkFinalize(Abc_Ntk_t *pNtk, Abc_Ntk_t *pNtkNew)
Definition abcNtk.c:355
@ ABC_NTK_LOGIC
Definition abc.h:57
ABC_DLL int Abc_NodeIsMuxControlType(Abc_Obj_t *pNode)
Definition abcUtil.c:1398
ABC_DLL int Abc_NtkLogicMakeSimpleCos(Abc_Ntk_t *pNtk, int fDuplicate)
Definition abcUtil.c:1080
ABC_DLL int Abc_NtkMinimumBase(Abc_Ntk_t *pNtk)
DECLARATIONS ///.
Definition abcMinBase.c:892
ABC_DLL void Abc_NtkDelete(Abc_Ntk_t *pNtk)
Definition abcNtk.c:1421
@ ABC_FUNC_BDD
Definition abc.h:66
ABC_DLL int Abc_NodeIsMuxType(Abc_Obj_t *pNode)
Definition abcUtil.c:1342
ABC_DLL Abc_Ntk_t * Abc_NtkStartFrom(Abc_Ntk_t *pNtk, Abc_NtkType_t Type, Abc_NtkFunc_t Func)
Definition abcNtk.c:157
ABC_DLL Abc_Ntk_t * Abc_NtkDup(Abc_Ntk_t *pNtk)
Definition abcNtk.c:472
ABC_DLL Abc_Obj_t * Abc_AigConst1(Abc_Ntk_t *pNtk)
Definition abcAig.c:683
#define Abc_NtkForEachNode(pNtk, pNode, i)
Definition abc.h:464
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_NAMESPACE_IMPL_START typedef char ProgressBar
Definition bbrNtbdd.c:27
void Extra_ProgressBarStop(ProgressBar *p)
ProgressBar * Extra_ProgressBarStart(FILE *pFile, int nItemsTotal)
FUNCTION DEFINITIONS ///.
Abc_Ntk_t * pExdc
Definition abc.h:201
void * pManFunc
Definition abc.h:191
void * pData
Definition abc.h:145
unsigned fMarkC
Definition abc.h:136
Vec_Int_t vFanouts
Definition abc.h:144
Abc_Obj_t * pCopy
Definition abc.h:148
unsigned fMarkA
Definition abc.h:134
#define assert(ex)
Definition util_old.h:213
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
Definition vecPtr.h:42