ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
fpgaVec.c
Go to the documentation of this file.
1
18
19#include "fpgaInt.h"
20
22
23
27
28static int Fpga_NodeVecCompareLevels( Fpga_Node_t ** pp1, Fpga_Node_t ** pp2 );
29
33
46{
49 if ( nCap > 0 && nCap < 16 )
50 nCap = 16;
51 p->nSize = 0;
52 p->nCap = nCap;
53 p->pArray = p->nCap? ABC_ALLOC( Fpga_Node_t *, p->nCap ) : NULL;
54 return p;
55}
56
69{
70 ABC_FREE( p->pArray );
71 ABC_FREE( p );
72}
73
86{
87 return p->pArray;
88}
89
102{
103 return p->nSize;
104}
105
117void Fpga_NodeVecGrow( Fpga_NodeVec_t * p, int nCapMin )
118{
119 if ( p->nCap >= nCapMin )
120 return;
121 p->pArray = ABC_REALLOC( Fpga_Node_t *, p->pArray, nCapMin );
122 p->nCap = nCapMin;
123}
124
136void Fpga_NodeVecShrink( Fpga_NodeVec_t * p, int nSizeNew )
137{
138 assert( p->nSize >= nSizeNew );
139 p->nSize = nSizeNew;
140}
141
154{
155 p->nSize = 0;
156}
157
170{
171 if ( p->nSize == p->nCap )
172 {
173 if ( p->nCap < 16 )
174 Fpga_NodeVecGrow( p, 16 );
175 else
176 Fpga_NodeVecGrow( p, 2 * p->nCap );
177 }
178 p->pArray[p->nSize++] = Entry;
179}
180
193{
194 int i;
195 for ( i = 0; i < p->nSize; i++ )
196 if ( p->pArray[i] == Entry )
197 return 1;
198 Fpga_NodeVecPush( p, Entry );
199 return 0;
200}
201
214{
215 return p->pArray[--p->nSize];
216}
217
230{
231 assert( i >= 0 && i < p->nSize );
232 p->pArray[i] = Entry;
233}
234
247{
248 assert( i >= 0 && i < p->nSize );
249 return p->pArray[i];
250}
251
263int Fpga_NodeVecCompareLevels( Fpga_Node_t ** pp1, Fpga_Node_t ** pp2 )
264{
265 int Level1 = Fpga_Regular(*pp1)->Level;
266 int Level2 = Fpga_Regular(*pp2)->Level;
267 if ( Level1 < Level2 )
268 return -1;
269 if ( Level1 > Level2 )
270 return 1;
271 if ( Fpga_Regular(*pp1)->Num < Fpga_Regular(*pp2)->Num )
272 return -1;
273 if ( Fpga_Regular(*pp1)->Num > Fpga_Regular(*pp2)->Num )
274 return 1;
275 return 0;
276}
277
290{
291 qsort( (void *)p->pArray, (size_t)p->nSize, sizeof(Fpga_Node_t *),
292 (int (*)(const void *, const void *)) Fpga_NodeVecCompareLevels );
293}
294
307{
308 if ( (*ppS1)->pCutBest->tArrival < (*ppS2)->pCutBest->tArrival )
309 return -1;
310 if ( (*ppS1)->pCutBest->tArrival > (*ppS2)->pCutBest->tArrival )
311 return 1;
312 return 0;
313}
314
327{
328 qsort( (void *)p->pArray, (size_t)p->nSize, sizeof(Fpga_Node_t *),
329 (int (*)(const void *, const void *)) Fpga_NodeVecCompareArrivals );
330// assert( Fpga_CompareNodesByLevel( p->pArray, p->pArray + p->nSize - 1 ) <= 0 );
331}
332
333
346{
347 int i;
349 for ( i = 0; i < p1->nSize; i++ )
350 Fpga_NodeVecPush( p, p1->pArray[i] );
351 for ( i = 0; i < p2->nSize; i++ )
352 Fpga_NodeVecPush( p, p2->pArray[i] );
353}
354
366void Fpga_NodeVecPushOrder( Fpga_NodeVec_t * vNodes, Fpga_Node_t * pNode, int fIncreasing )
367{
368 Fpga_Node_t * pNode1, * pNode2;
369 int i;
370 Fpga_NodeVecPush( vNodes, pNode );
371 // find the place of the node
372 for ( i = vNodes->nSize-1; i > 0; i-- )
373 {
374 pNode1 = vNodes->pArray[i ];
375 pNode2 = vNodes->pArray[i-1];
376 if (( fIncreasing && pNode1->pCutBest->tArrival >= pNode2->pCutBest->tArrival) ||
377 (!fIncreasing && pNode1->pCutBest->tArrival <= pNode2->pCutBest->tArrival) )
378 break;
379 vNodes->pArray[i ] = pNode2;
380 vNodes->pArray[i-1] = pNode1;
381 }
382}
383
396{
397 Fpga_Node_t * pNode1, * pNode2;
398 int i;
399 for ( i = 0; i < vNodes->nSize/2; i++ )
400 {
401 pNode1 = vNodes->pArray[i];
402 pNode2 = vNodes->pArray[vNodes->nSize-1-i];
403 vNodes->pArray[i] = pNode2;
404 vNodes->pArray[vNodes->nSize-1-i] = pNode1;
405 }
406}
407
411
413
#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
Fpga_Node_t * Fpga_NodeVecPop(Fpga_NodeVec_t *p)
Definition fpgaVec.c:213
int Fpga_NodeVecCompareArrivals(Fpga_Node_t **ppS1, Fpga_Node_t **ppS2)
Definition fpgaVec.c:306
void Fpga_NodeVecUnion(Fpga_NodeVec_t *p, Fpga_NodeVec_t *p1, Fpga_NodeVec_t *p2)
Definition fpgaVec.c:345
void Fpga_NodeVecSortByLevel(Fpga_NodeVec_t *p)
Definition fpgaVec.c:289
int Fpga_NodeVecPushUnique(Fpga_NodeVec_t *p, Fpga_Node_t *Entry)
Definition fpgaVec.c:192
int Fpga_NodeVecReadSize(Fpga_NodeVec_t *p)
Definition fpgaVec.c:101
void Fpga_NodeVecShrink(Fpga_NodeVec_t *p, int nSizeNew)
Definition fpgaVec.c:136
void Fpga_NodeVecPushOrder(Fpga_NodeVec_t *vNodes, Fpga_Node_t *pNode, int fIncreasing)
Definition fpgaVec.c:366
Fpga_NodeVec_t * Fpga_NodeVecAlloc(int nCap)
FUNCTION DEFINITIONS ///.
Definition fpgaVec.c:45
void Fpga_NodeVecWriteEntry(Fpga_NodeVec_t *p, int i, Fpga_Node_t *Entry)
Definition fpgaVec.c:229
void Fpga_NodeVecFree(Fpga_NodeVec_t *p)
Definition fpgaVec.c:68
Fpga_Node_t ** Fpga_NodeVecReadArray(Fpga_NodeVec_t *p)
Definition fpgaVec.c:85
void Fpga_NodeVecClear(Fpga_NodeVec_t *p)
Definition fpgaVec.c:153
void Fpga_NodeVecReverse(Fpga_NodeVec_t *vNodes)
Definition fpgaVec.c:395
void Fpga_NodeVecPush(Fpga_NodeVec_t *p, Fpga_Node_t *Entry)
Definition fpgaVec.c:169
void Fpga_SortNodesByArrivalTimes(Fpga_NodeVec_t *p)
Definition fpgaVec.c:326
void Fpga_NodeVecGrow(Fpga_NodeVec_t *p, int nCapMin)
Definition fpgaVec.c:117
Fpga_Node_t * Fpga_NodeVecReadEntry(Fpga_NodeVec_t *p, int i)
Definition fpgaVec.c:246
struct Fpga_NodeStruct_t_ Fpga_Node_t
Definition fpga.h:44
struct Fpga_NodeVecStruct_t_ Fpga_NodeVec_t
Definition fpga.h:45
#define Fpga_Regular(p)
Definition fpga.h:58
Fpga_Cut_t * pCutBest
Definition fpgaInt.h:222
Fpga_Node_t ** pArray
Definition fpgaInt.h:252
#define assert(ex)
Definition util_old.h:213