ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
vecQue.h
Go to the documentation of this file.
1
20
21#ifndef ABC__misc__vec__Queue_h
22#define ABC__misc__vec__Queue_h
23
27
28#include <stdio.h>
29
31
35
39
40typedef struct Vec_Que_t_ Vec_Que_t;
42{
43 int nCap;
44 int nSize;
45 int * pHeap;
46 int * pOrder;
47 float ** pCostsFlt; // owned by the caller
48};
49
50static inline float Vec_QuePrio( Vec_Que_t * p, int v ) { return *p->pCostsFlt ? (*p->pCostsFlt)[v] : v; }
51
55
59
71static inline Vec_Que_t * Vec_QueAlloc( int nCap )
72{
73 Vec_Que_t * p;
74 p = ABC_CALLOC( Vec_Que_t, 1 );
75 if ( nCap < 16 )
76 nCap = 16;
77 p->nSize = 1;
78 p->nCap = nCap + 1;
79 p->pHeap = ABC_FALLOC( int, p->nCap );
80 p->pOrder = ABC_FALLOC( int, p->nCap );
81 return p;
82}
83static inline void Vec_QueFree( Vec_Que_t * p )
84{
85 ABC_FREE( p->pOrder );
86 ABC_FREE( p->pHeap );
87 ABC_FREE( p );
88}
89static inline void Vec_QueFreeP( Vec_Que_t ** p )
90{
91 if ( *p )
92 Vec_QueFree( *p );
93 *p = NULL;
94}
95static inline void Vec_QueSetPriority( Vec_Que_t * p, float ** pCosts )
96{
97 assert( p->pCostsFlt == NULL );
98 p->pCostsFlt = pCosts;
99}
100static inline void Vec_QueGrow( Vec_Que_t * p, int nCapMin )
101{
102 if ( p->nCap >= nCapMin )
103 return;
104 assert( p->nCap < ABC_INT_MAX );
105 p->pHeap = ABC_REALLOC( int, p->pHeap, nCapMin );
106 p->pOrder = ABC_REALLOC( int, p->pOrder, nCapMin );
107 memset( p->pHeap + p->nCap, 0xff, (size_t)(nCapMin - p->nCap) * sizeof(int) );
108 memset( p->pOrder + p->nCap, 0xff, (size_t)(nCapMin - p->nCap) * sizeof(int) );
109 p->nCap = nCapMin;
110}
111static inline void Vec_QueClear( Vec_Que_t * p )
112{
113 int i;
114 assert( p->pHeap[0] == -1 );
115 for ( i = 1; i < p->nSize; i++ )
116 {
117 assert( p->pHeap[i] >= 0 && p->pOrder[p->pHeap[i]] == i );
118 p->pOrder[p->pHeap[i]] = -1;
119 p->pHeap[i] = -1;
120 }
121 p->nSize = 1;
122}
123static inline double Vec_QueMemory( Vec_Que_t * p )
124{
125 return !p ? 0.0 : 2.0 * sizeof(int) * (size_t)p->nCap + sizeof(Vec_Que_t) ;
126}
127
139static inline int Vec_QueSize( Vec_Que_t * p )
140{
141 assert( p->nSize > 0 );
142 return p->nSize - 1;
143}
144static inline int Vec_QueTop( Vec_Que_t * p )
145{
146 return Vec_QueSize(p) > 0 ? p->pHeap[1] : -1;
147}
148static inline float Vec_QueTopPriority( Vec_Que_t * p )
149{
150 return Vec_QueSize(p) > 0 ? Vec_QuePrio(p, p->pHeap[1]) : -ABC_INFINITY;
151}
152
164static inline int Vec_QueMoveUp( Vec_Que_t * p, int v )
165{
166 float Cost = Vec_QuePrio(p, v);
167 int i = p->pOrder[v];
168 int parent = i >> 1;
169 int fMoved = 0;
170 assert( p->pOrder[v] != -1 );
171 assert( p->pHeap[i] == v );
172 while ( i > 1 && Cost > Vec_QuePrio(p, p->pHeap[parent]) )
173 {
174 p->pHeap[i] = p->pHeap[parent];
175 p->pOrder[p->pHeap[i]] = i;
176 i = parent;
177 parent = i >> 1;
178 fMoved = 1;
179 }
180 p->pHeap[i] = v;
181 p->pOrder[v] = i;
182 return fMoved;
183}
184static inline void Vec_QueMoveDown( Vec_Que_t * p, int v )
185{
186 float Cost = Vec_QuePrio(p, v);
187 int i = p->pOrder[v];
188 int child = i << 1;
189 while ( child < p->nSize )
190 {
191 if ( child + 1 < p->nSize && Vec_QuePrio(p, p->pHeap[child]) < Vec_QuePrio(p, p->pHeap[child+1]) )
192 child++;
193 assert( child < p->nSize );
194 if ( Cost >= Vec_QuePrio(p, p->pHeap[child]))
195 break;
196 p->pHeap[i] = p->pHeap[child];
197 p->pOrder[p->pHeap[i]] = i;
198 i = child;
199 child = child << 1;
200 }
201 p->pHeap[i] = v;
202 p->pOrder[v] = i;
203}
204static inline void Vec_QueUpdate( Vec_Que_t * p, int v )
205{
206 if ( !Vec_QueMoveUp( p, v ) )
207 Vec_QueMoveDown( p, v );
208}
209
221static inline int Vec_QueIsMember( Vec_Que_t * p, int v )
222{
223 assert( v >= 0 );
224 return (int)( v < p->nCap && p->pOrder[v] >= 0 );
225}
226static inline void Vec_QuePush( Vec_Que_t * p, int v )
227{
228 if ( p->nSize >= p->nCap )
229 Vec_QueGrow( p, Abc_MaxInt(p->nSize+1, p->nCap < ABC_INT_MAX/2 ? 2 * p->nCap : ABC_INT_MAX) );
230 if ( v >= p->nCap )
231 Vec_QueGrow( p, Abc_MaxInt(v+1, p->nCap < ABC_INT_MAX/2 ? 2 * p->nCap : ABC_INT_MAX) );
232 assert( p->nSize < p->nCap );
233 assert( p->pOrder[v] == -1 );
234 assert( p->pHeap[p->nSize] == -1 );
235 p->pOrder[v] = p->nSize;
236 p->pHeap[p->nSize++] = v;
237 Vec_QueMoveUp( p, v );
238}
239static inline int Vec_QuePop( Vec_Que_t * p )
240{
241 int v, Res;
242 assert( p->nSize > 1 );
243 Res = p->pHeap[1]; p->pOrder[Res] = -1;
244 if ( --p->nSize == 1 )
245 {
246 p->pHeap[1] = -1;
247 return Res;
248 }
249 v = p->pHeap[p->nSize]; p->pHeap[p->nSize] = -1;
250 p->pHeap[1] = v; p->pOrder[v] = 1;
251 Vec_QueMoveDown( p, v );
252 return Res;
253}
254
266static inline void Vec_QuePrint( Vec_Que_t * p )
267{
268 int i, k, m;
269 for ( i = k = 1; i < p->nSize; i += k, k *= 2 )
270 {
271 for ( m = 0; m < k; m++ )
272 if ( i+m < p->nSize )
273 printf( "%-5d", p->pHeap[i+m] );
274 printf( "\n" );
275 for ( m = 0; m < k; m++ )
276 if ( i+m < p->nSize )
277 printf( "%-5.0f", Vec_QuePrio(p, p->pHeap[i+m]) );
278 printf( "\n" );
279 printf( "\n" );
280 }
281}
282
294static inline void Vec_QueCheck( Vec_Que_t * p )
295{
296 int i, child;
297 assert( p->nSize > 0 );
298 assert( p->nSize <= p->nCap );
299 // check mapping
300 for ( i = 0; i < p->nSize-1; i++ )
301 assert( p->pOrder[i] > 0 );
302 for ( ; i < p->nCap; i++ )
303 assert( p->pOrder[i] == -1 );
304 // check heap
305 assert( p->pHeap[0] == -1 );
306 for ( i = 0; i < p->nSize-1; i++ )
307 assert( p->pHeap[p->pOrder[i]] == i );
308 for ( i++; i < p->nCap; i++ )
309 assert( p->pHeap[i] == -1 );
310 // check heap property
311 for ( i = 1; i < p->nSize; i++ )
312 {
313 child = i << 1;
314 if ( child < p->nSize )
315 assert( Vec_QuePrio(p, p->pHeap[i]) >= Vec_QuePrio(p, p->pHeap[child]) );
316 child++;
317 if ( child < p->nSize )
318 assert( Vec_QuePrio(p, p->pHeap[i]) >= Vec_QuePrio(p, p->pHeap[child]) );
319 }
320}
321
333static inline void Vec_QueTest( Vec_Flt_t * vCosts )
334{
335 Vec_Int_t * vTop;
336 Vec_Que_t * p;
337 int i, Entry;
338
339 // start the queue
340 p = Vec_QueAlloc( Vec_FltSize(vCosts) );
341 Vec_QueSetPriority( p, Vec_FltArrayP(vCosts) );
342 for ( i = 0; i < Vec_FltSize(vCosts); i++ )
343 Vec_QuePush( p, i );
344// Vec_QuePrint( p );
345 Vec_QueCheck( p );
346
347 // find the topmost 10%
348 vTop = Vec_IntAlloc( Vec_FltSize(vCosts) / 10 );
349 while ( Vec_IntSize(vTop) < Vec_FltSize(vCosts) / 10 )
350 Vec_IntPush( vTop, Vec_QuePop(p) );
351// Vec_IntPrint( vTop );
352// Vec_QueCheck( p ); // queque is not ready at this point!!!
353
354 // put them back
355 Vec_IntForEachEntry( vTop, Entry, i )
356 Vec_QuePush( p, Entry );
357 Vec_IntFree( vTop );
358 Vec_QueCheck( p );
359
360 Vec_QueFree( p );
361}
362
363/*
364 {
365 extern void Vec_QueTest( Vec_Flt_t * p );
366 Vec_QueTest( p->vTimesOut );
367 }
368*/
369
373
374
375
377
378#endif
379
#define ABC_FALLOC(type, num)
Definition abc_global.h:266
#define ABC_INT_MAX
Definition abc_global.h:251
#define ABC_REALLOC(type, obj, num)
Definition abc_global.h:268
#define ABC_INFINITY
MACRO DEFINITIONS ///.
Definition abc_global.h:250
#define ABC_CALLOC(type, num)
Definition abc_global.h:265
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
Cube * p
Definition exorList.c:222
float ** pCostsFlt
Definition vecQue.h:47
int nSize
Definition vecQue.h:44
int nCap
Definition vecQue.h:43
int * pOrder
Definition vecQue.h:46
int * pHeap
Definition vecQue.h:45
#define assert(ex)
Definition util_old.h:213
char * memset()
typedefABC_NAMESPACE_HEADER_START struct Vec_Flt_t_ Vec_Flt_t
INCLUDES ///.
Definition vecFlt.h:42
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
typedefABC_NAMESPACE_HEADER_START struct Vec_Que_t_ Vec_Que_t
INCLUDES ///.
Definition vecQue.h:40