ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
fraigVec.c
Go to the documentation of this file.
1
18
19#include "fraigInt.h"
20
22
23
27
31
44{
47 if ( nCap > 0 && nCap < 8 )
48 nCap = 8;
49 p->nSize = 0;
50 p->nCap = nCap;
51 p->pArray = p->nCap? ABC_ALLOC( Fraig_Node_t *, p->nCap ) : NULL;
52 return p;
53}
54
67{
68 ABC_FREE( p->pArray );
69 ABC_FREE( p );
70}
71
84{
87 p->nSize = pVec->nSize;
88 p->nCap = pVec->nCap;
89 p->pArray = p->nCap? ABC_ALLOC( Fraig_Node_t *, p->nCap ) : NULL;
90 memcpy( p->pArray, pVec->pArray, sizeof(Fraig_Node_t *) * pVec->nSize );
91 return p;
92}
93
106{
107 return p->pArray;
108}
109
122{
123 return p->nSize;
124}
125
137void Fraig_NodeVecGrow( Fraig_NodeVec_t * p, int nCapMin )
138{
139 if ( p->nCap >= nCapMin )
140 return;
141 p->pArray = ABC_REALLOC( Fraig_Node_t *, p->pArray, nCapMin );
142 p->nCap = nCapMin;
143}
144
156void Fraig_NodeVecShrink( Fraig_NodeVec_t * p, int nSizeNew )
157{
158 assert( p->nSize >= nSizeNew );
159 p->nSize = nSizeNew;
160}
161
174{
175 p->nSize = 0;
176}
177
190{
191 if ( p->nSize == p->nCap )
192 {
193 if ( p->nCap < 16 )
194 Fraig_NodeVecGrow( p, 16 );
195 else
196 Fraig_NodeVecGrow( p, 2 * p->nCap );
197 }
198 p->pArray[p->nSize++] = Entry;
199}
200
213{
214 int i;
215 for ( i = 0; i < p->nSize; i++ )
216 if ( p->pArray[i] == Entry )
217 return 1;
218 Fraig_NodeVecPush( p, Entry );
219 return 0;
220}
221
234{
235 Fraig_Node_t * pNode1, * pNode2;
236 int i;
237 Fraig_NodeVecPush( p, pNode );
238 // find the p of the node
239 for ( i = p->nSize-1; i > 0; i-- )
240 {
241 pNode1 = p->pArray[i ];
242 pNode2 = p->pArray[i-1];
243 if ( pNode1 >= pNode2 )
244 break;
245 p->pArray[i ] = pNode2;
246 p->pArray[i-1] = pNode1;
247 }
248}
249
262{
263 int i;
264 for ( i = 0; i < p->nSize; i++ )
265 if ( p->pArray[i] == pNode )
266 return 1;
267 Fraig_NodeVecPushOrder( p, pNode );
268 return 0;
269}
270
283{
284 Fraig_Node_t * pNode1, * pNode2;
285 int i;
286 Fraig_NodeVecPush( p, pNode );
287 // find the p of the node
288 for ( i = p->nSize-1; i > 0; i-- )
289 {
290 pNode1 = p->pArray[i ];
291 pNode2 = p->pArray[i-1];
292 if ( Fraig_Regular(pNode1)->Level <= Fraig_Regular(pNode2)->Level )
293 break;
294 p->pArray[i ] = pNode2;
295 p->pArray[i-1] = pNode1;
296 }
297}
298
311{
312 int i;
313 for ( i = 0; i < p->nSize; i++ )
314 if ( p->pArray[i] == pNode )
315 return 1;
317 return 0;
318}
319
332{
333 return p->pArray[--p->nSize];
334}
335
348{
349 int i;
350 for ( i = 0; i < p->nSize; i++ )
351 if ( p->pArray[i] == Entry )
352 break;
353 assert( i < p->nSize );
354 for ( i++; i < p->nSize; i++ )
355 p->pArray[i-1] = p->pArray[i];
356 p->nSize--;
357}
358
371{
372 assert( i >= 0 && i < p->nSize );
373 p->pArray[i] = Entry;
374}
375
388{
389 assert( i >= 0 && i < p->nSize );
390 return p->pArray[i];
391}
392
405{
406 int Level1 = Fraig_Regular(*pp1)->Level;
407 int Level2 = Fraig_Regular(*pp2)->Level;
408 if ( Level1 < Level2 )
409 return -1;
410 if ( Level1 > Level2 )
411 return 1;
412 return 0;
413}
414
427{
428 int Level1 = Fraig_Regular(*pp1)->Level;
429 int Level2 = Fraig_Regular(*pp2)->Level;
430 if ( Level1 > Level2 )
431 return -1;
432 if ( Level1 < Level2 )
433 return 1;
434 return 0;
435}
436
449{
450 int Num1 = Fraig_Regular(*pp1)->Num;
451 int Num2 = Fraig_Regular(*pp2)->Num;
452 if ( Num1 < Num2 )
453 return -1;
454 if ( Num1 > Num2 )
455 return 1;
456 return 0;
457}
458
471{
472 int nRefs1 = Fraig_Regular(*pp1)->nRefs;
473 int nRefs2 = Fraig_Regular(*pp2)->nRefs;
474
475 if ( nRefs1 < nRefs2 )
476 return -1;
477 if ( nRefs1 > nRefs2 )
478 return 1;
479
480 nRefs1 = Fraig_Regular(*pp1)->Level;
481 nRefs2 = Fraig_Regular(*pp2)->Level;
482
483 if ( nRefs1 < nRefs2 )
484 return -1;
485 if ( nRefs1 > nRefs2 )
486 return 1;
487 return 0;
488}
489
502{
503 if ( fIncreasing )
504 qsort( (void *)p->pArray, (size_t)p->nSize, sizeof(Fraig_Node_t *),
505 (int (*)(const void *, const void *)) Fraig_NodeVecCompareLevelsIncreasing );
506 else
507 qsort( (void *)p->pArray, (size_t)p->nSize, sizeof(Fraig_Node_t *),
508 (int (*)(const void *, const void *)) Fraig_NodeVecCompareLevelsDecreasing );
509}
510
523{
524 qsort( (void *)p->pArray, (size_t)p->nSize, sizeof(Fraig_Node_t *),
525 (int (*)(const void *, const void *)) Fraig_NodeVecCompareNumbers );
526}
527
540{
541 qsort( (void *)p->pArray, (size_t)p->nSize, sizeof(Fraig_Node_t *),
542 (int (*)(const void *, const void *)) Fraig_NodeVecCompareRefCounts );
543}
544
548
550
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_REALLOC(type, obj, num)
Definition abc_global.h:268
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Cube * p
Definition exorList.c:222
Fraig_NodeVec_t * Fraig_NodeVecDup(Fraig_NodeVec_t *pVec)
Definition fraigVec.c:83
void Fraig_NodeVecFree(Fraig_NodeVec_t *p)
Definition fraigVec.c:66
void Fraig_NodeVecWriteEntry(Fraig_NodeVec_t *p, int i, Fraig_Node_t *Entry)
Definition fraigVec.c:370
int Fraig_NodeVecReadSize(Fraig_NodeVec_t *p)
Definition fraigVec.c:121
int Fraig_NodeVecCompareLevelsIncreasing(Fraig_Node_t **pp1, Fraig_Node_t **pp2)
Definition fraigVec.c:404
int Fraig_NodeVecPushUnique(Fraig_NodeVec_t *p, Fraig_Node_t *Entry)
Definition fraigVec.c:212
void Fraig_NodeVecSortByRefCount(Fraig_NodeVec_t *p)
Definition fraigVec.c:539
void Fraig_NodeVecClear(Fraig_NodeVec_t *p)
Definition fraigVec.c:173
ABC_NAMESPACE_IMPL_START Fraig_NodeVec_t * Fraig_NodeVecAlloc(int nCap)
DECLARATIONS ///.
Definition fraigVec.c:43
Fraig_Node_t ** Fraig_NodeVecReadArray(Fraig_NodeVec_t *p)
Definition fraigVec.c:105
int Fraig_NodeVecPushUniqueOrderByLevel(Fraig_NodeVec_t *p, Fraig_Node_t *pNode)
Definition fraigVec.c:310
void Fraig_NodeVecShrink(Fraig_NodeVec_t *p, int nSizeNew)
Definition fraigVec.c:156
void Fraig_NodeVecSortByNumber(Fraig_NodeVec_t *p)
Definition fraigVec.c:522
Fraig_Node_t * Fraig_NodeVecPop(Fraig_NodeVec_t *p)
Definition fraigVec.c:331
void Fraig_NodeVecSortByLevel(Fraig_NodeVec_t *p, int fIncreasing)
Definition fraigVec.c:501
int Fraig_NodeVecCompareRefCounts(Fraig_Node_t **pp1, Fraig_Node_t **pp2)
Definition fraigVec.c:470
void Fraig_NodeVecPushOrderByLevel(Fraig_NodeVec_t *p, Fraig_Node_t *pNode)
Definition fraigVec.c:282
void Fraig_NodeVecPush(Fraig_NodeVec_t *p, Fraig_Node_t *Entry)
Definition fraigVec.c:189
void Fraig_NodeVecRemove(Fraig_NodeVec_t *p, Fraig_Node_t *Entry)
Definition fraigVec.c:347
int Fraig_NodeVecCompareLevelsDecreasing(Fraig_Node_t **pp1, Fraig_Node_t **pp2)
Definition fraigVec.c:426
void Fraig_NodeVecPushOrder(Fraig_NodeVec_t *p, Fraig_Node_t *pNode)
Definition fraigVec.c:233
Fraig_Node_t * Fraig_NodeVecReadEntry(Fraig_NodeVec_t *p, int i)
Definition fraigVec.c:387
void Fraig_NodeVecGrow(Fraig_NodeVec_t *p, int nCapMin)
Definition fraigVec.c:137
int Fraig_NodeVecPushUniqueOrder(Fraig_NodeVec_t *p, Fraig_Node_t *pNode)
Definition fraigVec.c:261
int Fraig_NodeVecCompareNumbers(Fraig_Node_t **pp1, Fraig_Node_t **pp2)
Definition fraigVec.c:448
#define Fraig_Regular(p)
Definition fraig.h:108
struct Fraig_NodeVecStruct_t_ Fraig_NodeVec_t
Definition fraig.h:42
struct Fraig_NodeStruct_t_ Fraig_Node_t
Definition fraig.h:41
Fraig_Node_t ** pArray
Definition fraigInt.h:267
#define assert(ex)
Definition util_old.h:213
char * memcpy()