ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
aigMem.c File Reference
#include "aig.h"
Include dependency graph for aigMem.c:

Go to the source code of this file.

Classes

struct  Aig_MmFixed_t_
 DECLARATIONS ///. More...
 
struct  Aig_MmFlex_t_
 
struct  Aig_MmStep_t_
 

Functions

Aig_MmFixed_tAig_MmFixedStart (int nEntrySize, int nEntriesMax)
 FUNCTION DEFINITIONS ///.
 
void Aig_MmFixedStop (Aig_MmFixed_t *p, int fVerbose)
 
char * Aig_MmFixedEntryFetch (Aig_MmFixed_t *p)
 
void Aig_MmFixedEntryRecycle (Aig_MmFixed_t *p, char *pEntry)
 
void Aig_MmFixedRestart (Aig_MmFixed_t *p)
 
int Aig_MmFixedReadMemUsage (Aig_MmFixed_t *p)
 
int Aig_MmFixedReadMaxEntriesUsed (Aig_MmFixed_t *p)
 
Aig_MmFlex_tAig_MmFlexStart ()
 
void Aig_MmFlexStop (Aig_MmFlex_t *p, int fVerbose)
 
char * Aig_MmFlexEntryFetch (Aig_MmFlex_t *p, int nBytes)
 
void Aig_MmFlexRestart (Aig_MmFlex_t *p)
 
int Aig_MmFlexReadMemUsage (Aig_MmFlex_t *p)
 
Aig_MmStep_tAig_MmStepStart (int nSteps)
 
void Aig_MmStepStop (Aig_MmStep_t *p, int fVerbose)
 
char * Aig_MmStepEntryFetch (Aig_MmStep_t *p, int nBytes)
 
void Aig_MmStepEntryRecycle (Aig_MmStep_t *p, char *pEntry, int nBytes)
 
int Aig_MmStepReadMemUsage (Aig_MmStep_t *p)
 

Function Documentation

◆ Aig_MmFixedEntryFetch()

char * Aig_MmFixedEntryFetch ( Aig_MmFixed_t * p)

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 161 of file aigMem.c.

162{
163 char * pTemp;
164 int i;
165
166 // check if there are still free entries
167 if ( p->nEntriesUsed == p->nEntriesAlloc )
168 { // need to allocate more entries
169 assert( p->pEntriesFree == NULL );
170 if ( p->nChunks == p->nChunksAlloc )
171 {
172 p->nChunksAlloc *= 2;
173 p->pChunks = ABC_REALLOC( char *, p->pChunks, p->nChunksAlloc );
174 }
175 p->pEntriesFree = ABC_ALLOC( char, p->nEntrySize * p->nChunkSize );
176 p->nMemoryAlloc += p->nEntrySize * p->nChunkSize;
177 // transform these entries into a linked list
178 pTemp = p->pEntriesFree;
179 for ( i = 1; i < p->nChunkSize; i++ )
180 {
181 *((char **)pTemp) = pTemp + p->nEntrySize;
182 pTemp += p->nEntrySize;
183 }
184 // set the last link
185 *((char **)pTemp) = NULL;
186 // add the chunk to the chunk storage
187 p->pChunks[ p->nChunks++ ] = p->pEntriesFree;
188 // add to the number of entries allocated
189 p->nEntriesAlloc += p->nChunkSize;
190 }
191 // incrememt the counter of used entries
192 p->nEntriesUsed++;
193 if ( p->nEntriesMax < p->nEntriesUsed )
194 p->nEntriesMax = p->nEntriesUsed;
195 // return the first entry in the free entry list
196 pTemp = p->pEntriesFree;
197 p->pEntriesFree = *((char **)pTemp);
198 return pTemp;
199}
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_REALLOC(type, obj, num)
Definition abc_global.h:268
Cube * p
Definition exorList.c:222
#define assert(ex)
Definition util_old.h:213
Here is the caller graph for this function:

◆ Aig_MmFixedEntryRecycle()

void Aig_MmFixedEntryRecycle ( Aig_MmFixed_t * p,
char * pEntry )

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 212 of file aigMem.c.

213{
214 // decrement the counter of used entries
215 p->nEntriesUsed--;
216 // add the entry to the linked list of free entries
217 *((char **)pEntry) = p->pEntriesFree;
218 p->pEntriesFree = pEntry;
219}
Here is the caller graph for this function:

◆ Aig_MmFixedReadMaxEntriesUsed()

int Aig_MmFixedReadMaxEntriesUsed ( Aig_MmFixed_t * p)

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 287 of file aigMem.c.

288{
289 return p->nEntriesMax;
290}

◆ Aig_MmFixedReadMemUsage()

int Aig_MmFixedReadMemUsage ( Aig_MmFixed_t * p)

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 271 of file aigMem.c.

272{
273 return p->nMemoryAlloc;
274}
Here is the caller graph for this function:

◆ Aig_MmFixedRestart()

void Aig_MmFixedRestart ( Aig_MmFixed_t * p)

Function*************************************************************

Synopsis []

Description [Relocates all the memory except the first chunk.]

SideEffects []

SeeAlso []

Definition at line 232 of file aigMem.c.

233{
234 int i;
235 char * pTemp;
236 if ( p->nChunks == 0 )
237 return;
238 // deallocate all chunks except the first one
239 for ( i = 1; i < p->nChunks; i++ )
240 ABC_FREE( p->pChunks[i] );
241 p->nChunks = 1;
242 // transform these entries into a linked list
243 pTemp = p->pChunks[0];
244 for ( i = 1; i < p->nChunkSize; i++ )
245 {
246 *((char **)pTemp) = pTemp + p->nEntrySize;
247 pTemp += p->nEntrySize;
248 }
249 // set the last link
250 *((char **)pTemp) = NULL;
251 // set the free entry list
252 p->pEntriesFree = p->pChunks[0];
253 // set the correct statistics
254 p->nMemoryAlloc = p->nEntrySize * p->nChunkSize;
255 p->nMemoryUsed = 0;
256 p->nEntriesAlloc = p->nChunkSize;
257 p->nEntriesUsed = 0;
258}
#define ABC_FREE(obj)
Definition abc_global.h:267
Here is the caller graph for this function:

◆ Aig_MmFixedStart()

Aig_MmFixed_t * Aig_MmFixedStart ( int nEntrySize,
int nEntriesMax )

FUNCTION DEFINITIONS ///.

Function*************************************************************

Synopsis [Allocates memory pieces of fixed size.]

Description [The size of the chunk is computed as the minimum of 1024 entries and 64K. Can only work with entry size at least 4 byte long.]

SideEffects []

SeeAlso []

Definition at line 96 of file aigMem.c.

97{
99
100 p = ABC_ALLOC( Aig_MmFixed_t, 1 );
101 memset( p, 0, sizeof(Aig_MmFixed_t) );
102
103 p->nEntrySize = nEntrySize;
104 p->nEntriesAlloc = 0;
105 p->nEntriesUsed = 0;
106 p->pEntriesFree = NULL;
107
108 p->nChunkSize = nEntriesMax / 8;
109 if ( p->nChunkSize < 8 )
110 p->nChunkSize = 8;
111
112 p->nChunksAlloc = 64;
113 p->nChunks = 0;
114 p->pChunks = ABC_ALLOC( char *, p->nChunksAlloc );
115
116 p->nMemoryUsed = 0;
117 p->nMemoryAlloc = 0;
118 return p;
119}
struct Aig_MmFixed_t_ Aig_MmFixed_t
Definition aig.h:52
char * memset()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Aig_MmFixedStop()

void Aig_MmFixedStop ( Aig_MmFixed_t * p,
int fVerbose )

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 132 of file aigMem.c.

133{
134 int i;
135 if ( p == NULL )
136 return;
137 if ( fVerbose )
138 {
139 printf( "Fixed memory manager: Entry = %5d. Chunk = %5d. Chunks used = %5d.\n",
140 p->nEntrySize, p->nChunkSize, p->nChunks );
141 printf( " Entries used = %8d. Entries peak = %8d. Memory used = %8d. Memory alloc = %8d.\n",
142 p->nEntriesUsed, p->nEntriesMax, p->nEntrySize * p->nEntriesUsed, p->nMemoryAlloc );
143 }
144 for ( i = 0; i < p->nChunks; i++ )
145 ABC_FREE( p->pChunks[i] );
146 ABC_FREE( p->pChunks );
147 ABC_FREE( p );
148}
Here is the caller graph for this function:

◆ Aig_MmFlexEntryFetch()

char * Aig_MmFlexEntryFetch ( Aig_MmFlex_t * p,
int nBytes )

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 366 of file aigMem.c.

367{
368 char * pTemp;
369#ifdef ABC_MEMALIGN
370 // extend size to max alignment
371 nBytes += (ABC_MEMALIGN - nBytes % ABC_MEMALIGN) % ABC_MEMALIGN;
372#endif
373 // check if there are still free entries
374 if ( p->pCurrent == NULL || p->pCurrent + nBytes > p->pEnd )
375 { // need to allocate more entries
376 if ( p->nChunks == p->nChunksAlloc )
377 {
378 p->nChunksAlloc *= 2;
379 p->pChunks = ABC_REALLOC( char *, p->pChunks, p->nChunksAlloc );
380 }
381 if ( nBytes > p->nChunkSize )
382 {
383 // resize the chunk size if more memory is requested than it can give
384 // (ideally, this should never happen)
385 p->nChunkSize = 2 * nBytes;
386 }
387 p->pCurrent = ABC_ALLOC( char, p->nChunkSize );
388 p->pEnd = p->pCurrent + p->nChunkSize;
389 p->nMemoryAlloc += p->nChunkSize;
390 // add the chunk to the chunk storage
391 p->pChunks[ p->nChunks++ ] = p->pCurrent;
392 }
393 assert( p->pCurrent + nBytes <= p->pEnd );
394 // increment the counter of used entries
395 p->nEntriesUsed++;
396 // keep track of the memory used
397 p->nMemoryUsed += nBytes;
398 // return the next entry
399 pTemp = p->pCurrent;
400 p->pCurrent += nBytes;
401 return pTemp;
402}
Here is the caller graph for this function:

◆ Aig_MmFlexReadMemUsage()

int Aig_MmFlexReadMemUsage ( Aig_MmFlex_t * p)

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 443 of file aigMem.c.

444{
445 return p->nMemoryUsed;
446}

◆ Aig_MmFlexRestart()

void Aig_MmFlexRestart ( Aig_MmFlex_t * p)

Function*************************************************************

Synopsis []

Description [Relocates all the memory except the first chunk.]

SideEffects []

SeeAlso []

Definition at line 415 of file aigMem.c.

416{
417 int i;
418 if ( p->nChunks == 0 )
419 return;
420 // deallocate all chunks except the first one
421 for ( i = 1; i < p->nChunks; i++ )
422 ABC_FREE( p->pChunks[i] );
423 p->nChunks = 1;
424 p->nMemoryAlloc = p->nChunkSize;
425 // transform these entries into a linked list
426 p->pCurrent = p->pChunks[0];
427 p->pEnd = p->pCurrent + p->nChunkSize;
428 p->nEntriesUsed = 0;
429 p->nMemoryUsed = 0;
430}
Here is the caller graph for this function:

◆ Aig_MmFlexStart()

Aig_MmFlex_t * Aig_MmFlexStart ( )

Function*************************************************************

Synopsis [Allocates entries of flexible size.]

Description [Can only work with entry size at least 4 byte long.]

SideEffects []

SeeAlso []

Definition at line 305 of file aigMem.c.

306{
307 Aig_MmFlex_t * p;
308
309 p = ABC_ALLOC( Aig_MmFlex_t, 1 );
310 memset( p, 0, sizeof(Aig_MmFlex_t) );
311
312 p->nEntriesUsed = 0;
313 p->pCurrent = NULL;
314 p->pEnd = NULL;
315
316 p->nChunkSize = (1 << 18);
317 p->nChunksAlloc = 64;
318 p->nChunks = 0;
319 p->pChunks = ABC_ALLOC( char *, p->nChunksAlloc );
320
321 p->nMemoryUsed = 0;
322 p->nMemoryAlloc = 0;
323 return p;
324}
struct Aig_MmFlex_t_ Aig_MmFlex_t
Definition aig.h:53
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Aig_MmFlexStop()

void Aig_MmFlexStop ( Aig_MmFlex_t * p,
int fVerbose )

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 337 of file aigMem.c.

338{
339 int i;
340 if ( p == NULL )
341 return;
342 if ( fVerbose )
343 {
344 printf( "Flexible memory manager: Chunk size = %d. Chunks used = %d.\n",
345 p->nChunkSize, p->nChunks );
346 printf( " Entries used = %d. Memory used = %d. Memory alloc = %d.\n",
347 p->nEntriesUsed, p->nMemoryUsed, p->nMemoryAlloc );
348 }
349 for ( i = 0; i < p->nChunks; i++ )
350 ABC_FREE( p->pChunks[i] );
351 ABC_FREE( p->pChunks );
352 ABC_FREE( p );
353}
Here is the caller graph for this function:

◆ Aig_MmStepEntryFetch()

char * Aig_MmStepEntryFetch ( Aig_MmStep_t * p,
int nBytes )

Function*************************************************************

Synopsis [Creates the entry.]

Description []

SideEffects []

SeeAlso []

Definition at line 538 of file aigMem.c.

539{
540 if ( nBytes == 0 )
541 return NULL;
542#ifdef ABC_MEMALIGN
543 // extend size to max alignment
544 nBytes += (ABC_MEMALIGN - nBytes % ABC_MEMALIGN) % ABC_MEMALIGN;
545#endif
546 if ( nBytes > p->nMapSize )
547 {
548 if ( p->nChunks == p->nChunksAlloc )
549 {
550 p->nChunksAlloc *= 2;
551 p->pChunks = ABC_REALLOC( char *, p->pChunks, p->nChunksAlloc );
552 }
553 p->pChunks[ p->nChunks++ ] = ABC_ALLOC( char, nBytes );
554 return p->pChunks[p->nChunks-1];
555 }
556 return Aig_MmFixedEntryFetch( p->pMap[nBytes] );
557}
char * Aig_MmFixedEntryFetch(Aig_MmFixed_t *p)
Definition aigMem.c:161
Here is the call graph for this function:

◆ Aig_MmStepEntryRecycle()

void Aig_MmStepEntryRecycle ( Aig_MmStep_t * p,
char * pEntry,
int nBytes )

Function*************************************************************

Synopsis [Recycles the entry.]

Description []

SideEffects []

SeeAlso []

Definition at line 571 of file aigMem.c.

572{
573 if ( nBytes == 0 )
574 return;
575#ifdef ABC_MEMALIGN
576 // extend size to max alignment
577 nBytes += (ABC_MEMALIGN - nBytes % ABC_MEMALIGN) % ABC_MEMALIGN;
578#endif
579 if ( nBytes > p->nMapSize )
580 {
581// ABC_FREE( pEntry );
582 return;
583 }
584 Aig_MmFixedEntryRecycle( p->pMap[nBytes], pEntry );
585}
void Aig_MmFixedEntryRecycle(Aig_MmFixed_t *p, char *pEntry)
Definition aigMem.c:212
Here is the call graph for this function:

◆ Aig_MmStepReadMemUsage()

int Aig_MmStepReadMemUsage ( Aig_MmStep_t * p)

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 598 of file aigMem.c.

599{
600 int i, nMemTotal = 0;
601 for ( i = 0; i < p->nMems; i++ )
602 nMemTotal += p->pMems[i]->nMemoryAlloc;
603 return nMemTotal;
604}

◆ Aig_MmStepStart()

Aig_MmStep_t * Aig_MmStepStart ( int nSteps)

Function*************************************************************

Synopsis [Starts the hierarchical memory manager.]

Description [This manager can allocate entries of any size. Iternally they are mapped into the entries with the number of bytes equal to the power of 2. The smallest entry size is 8 bytes. The next one is 16 bytes etc. So, if the user requests 6 bytes, he gets 8 byte entry. If we asks for 25 bytes, he gets 32 byte entry etc. The input parameters "nSteps" says how many fixed memory managers are employed internally. Calling this procedure with nSteps equal to 10 results in 10 hierarchically arranged internal memory managers, which can allocate up to 4096 (1Kb) entries. Requests for larger entries are handed over to malloc() and then ABC_FREE()ed.]

SideEffects []

SeeAlso []

Definition at line 472 of file aigMem.c.

473{
474 Aig_MmStep_t * p;
475 int i, k;
476 p = ABC_ALLOC( Aig_MmStep_t, 1 );
477 memset( p, 0, sizeof(Aig_MmStep_t) );
478 p->nMems = nSteps;
479 // start the fixed memory managers
480 p->pMems = ABC_ALLOC( Aig_MmFixed_t *, p->nMems );
481 for ( i = 0; i < p->nMems; i++ )
482 p->pMems[i] = Aig_MmFixedStart( (8<<i), (1<<13) );
483 // set up the mapping of the required memory size into the corresponding manager
484 p->nMapSize = (4<<p->nMems);
485 p->pMap = ABC_ALLOC( Aig_MmFixed_t *, p->nMapSize+1 );
486 p->pMap[0] = NULL;
487 for ( k = 1; k <= 4; k++ )
488 p->pMap[k] = p->pMems[0];
489 for ( i = 0; i < p->nMems; i++ )
490 for ( k = (4<<i)+1; k <= (8<<i); k++ )
491 p->pMap[k] = p->pMems[i];
492//for ( i = 1; i < 100; i ++ )
493//printf( "%10d: size = %10d\n", i, p->pMap[i]->nEntrySize );
494 p->nChunksAlloc = 64;
495 p->nChunks = 0;
496 p->pChunks = ABC_ALLOC( char *, p->nChunksAlloc );
497 return p;
498}
Aig_MmFixed_t * Aig_MmFixedStart(int nEntrySize, int nEntriesMax)
FUNCTION DEFINITIONS ///.
Definition aigMem.c:96
struct Aig_MmStep_t_ Aig_MmStep_t
Definition aig.h:54
Here is the call graph for this function:

◆ Aig_MmStepStop()

void Aig_MmStepStop ( Aig_MmStep_t * p,
int fVerbose )

Function*************************************************************

Synopsis [Stops the memory manager.]

Description []

SideEffects []

SeeAlso []

Definition at line 511 of file aigMem.c.

512{
513 int i;
514 for ( i = 0; i < p->nMems; i++ )
515 Aig_MmFixedStop( p->pMems[i], fVerbose );
516 if ( p->nChunksAlloc )
517 {
518 for ( i = 0; i < p->nChunks; i++ )
519 ABC_FREE( p->pChunks[i] );
520 ABC_FREE( p->pChunks );
521 }
522 ABC_FREE( p->pMems );
523 ABC_FREE( p->pMap );
524 ABC_FREE( p );
525}
void Aig_MmFixedStop(Aig_MmFixed_t *p, int fVerbose)
Definition aigMem.c:132
Here is the call graph for this function: