103 p->nEntrySize = nEntrySize;
104 p->nEntriesAlloc = 0;
106 p->pEntriesFree = NULL;
108 p->nChunkSize = nEntriesMax / 8;
109 if (
p->nChunkSize < 8 )
112 p->nChunksAlloc = 64;
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 );
144 for ( i = 0; i <
p->nChunks; i++ )
167 if (
p->nEntriesUsed ==
p->nEntriesAlloc )
169 assert(
p->pEntriesFree == NULL );
170 if (
p->nChunks ==
p->nChunksAlloc )
172 p->nChunksAlloc *= 2;
175 p->pEntriesFree =
ABC_ALLOC(
char,
p->nEntrySize *
p->nChunkSize );
176 p->nMemoryAlloc +=
p->nEntrySize *
p->nChunkSize;
178 pTemp =
p->pEntriesFree;
179 for ( i = 1; i <
p->nChunkSize; i++ )
181 *((
char **)pTemp) = pTemp +
p->nEntrySize;
182 pTemp +=
p->nEntrySize;
185 *((
char **)pTemp) = NULL;
187 p->pChunks[
p->nChunks++ ] =
p->pEntriesFree;
189 p->nEntriesAlloc +=
p->nChunkSize;
193 if (
p->nEntriesMax <
p->nEntriesUsed )
194 p->nEntriesMax =
p->nEntriesUsed;
196 pTemp =
p->pEntriesFree;
197 p->pEntriesFree = *((
char **)pTemp);
217 *((
char **)pEntry) =
p->pEntriesFree;
218 p->pEntriesFree = pEntry;
236 if (
p->nChunks == 0 )
239 for ( i = 1; i <
p->nChunks; i++ )
243 pTemp =
p->pChunks[0];
244 for ( i = 1; i <
p->nChunkSize; i++ )
246 *((
char **)pTemp) = pTemp +
p->nEntrySize;
247 pTemp +=
p->nEntrySize;
250 *((
char **)pTemp) = NULL;
252 p->pEntriesFree =
p->pChunks[0];
254 p->nMemoryAlloc =
p->nEntrySize *
p->nChunkSize;
256 p->nEntriesAlloc =
p->nChunkSize;
273 return p->nMemoryAlloc;
289 return p->nEntriesMax;
316 p->nChunkSize = (1 << 18);
317 p->nChunksAlloc = 64;
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 );
349 for ( i = 0; i <
p->nChunks; i++ )
371 nBytes += (ABC_MEMALIGN - nBytes % ABC_MEMALIGN) % ABC_MEMALIGN;
374 if (
p->pCurrent == NULL ||
p->pCurrent + nBytes >
p->pEnd )
376 if (
p->nChunks ==
p->nChunksAlloc )
378 p->nChunksAlloc *= 2;
381 if ( nBytes >
p->nChunkSize )
385 p->nChunkSize = 2 * nBytes;
388 p->pEnd =
p->pCurrent +
p->nChunkSize;
389 p->nMemoryAlloc +=
p->nChunkSize;
391 p->pChunks[
p->nChunks++ ] =
p->pCurrent;
393 assert(
p->pCurrent + nBytes <= p->pEnd );
397 p->nMemoryUsed += nBytes;
400 p->pCurrent += nBytes;
418 if (
p->nChunks == 0 )
421 for ( i = 1; i <
p->nChunks; i++ )
424 p->nMemoryAlloc =
p->nChunkSize;
426 p->pCurrent =
p->pChunks[0];
427 p->pEnd =
p->pCurrent +
p->nChunkSize;
445 return p->nMemoryUsed;
481 for ( i = 0; i <
p->nMems; i++ )
484 p->nMapSize = (4<<
p->nMems);
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];
494 p->nChunksAlloc = 64;
514 for ( i = 0; i <
p->nMems; i++ )
516 if (
p->nChunksAlloc )
518 for ( i = 0; i <
p->nChunks; i++ )
544 nBytes += (ABC_MEMALIGN - nBytes % ABC_MEMALIGN) % ABC_MEMALIGN;
546 if ( nBytes >
p->nMapSize )
548 if (
p->nChunks ==
p->nChunksAlloc )
550 p->nChunksAlloc *= 2;
553 p->pChunks[
p->nChunks++ ] =
ABC_ALLOC(
char, nBytes );
554 return p->pChunks[
p->nChunks-1];
577 nBytes += (ABC_MEMALIGN - nBytes % ABC_MEMALIGN) % ABC_MEMALIGN;
579 if ( nBytes >
p->nMapSize )
600 int i, nMemTotal = 0;
601 for ( i = 0; i <
p->nMems; i++ )
602 nMemTotal +=
p->pMems[i]->nMemoryAlloc;
#define ABC_ALLOC(type, num)
#define ABC_REALLOC(type, obj, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int Aig_MmStepReadMemUsage(Aig_MmStep_t *p)
void Aig_MmFlexRestart(Aig_MmFlex_t *p)
void Aig_MmFlexStop(Aig_MmFlex_t *p, int fVerbose)
int Aig_MmFixedReadMemUsage(Aig_MmFixed_t *p)
char * Aig_MmStepEntryFetch(Aig_MmStep_t *p, int nBytes)
char * Aig_MmFixedEntryFetch(Aig_MmFixed_t *p)
char * Aig_MmFlexEntryFetch(Aig_MmFlex_t *p, int nBytes)
int Aig_MmFixedReadMaxEntriesUsed(Aig_MmFixed_t *p)
Aig_MmFixed_t * Aig_MmFixedStart(int nEntrySize, int nEntriesMax)
FUNCTION DEFINITIONS ///.
void Aig_MmStepStop(Aig_MmStep_t *p, int fVerbose)
void Aig_MmFixedRestart(Aig_MmFixed_t *p)
Aig_MmFlex_t * Aig_MmFlexStart()
void Aig_MmFixedEntryRecycle(Aig_MmFixed_t *p, char *pEntry)
int Aig_MmFlexReadMemUsage(Aig_MmFlex_t *p)
Aig_MmStep_t * Aig_MmStepStart(int nSteps)
void Aig_MmFixedStop(Aig_MmFixed_t *p, int fVerbose)
void Aig_MmStepEntryRecycle(Aig_MmStep_t *p, char *pEntry, int nBytes)
struct Aig_MmFlex_t_ Aig_MmFlex_t
Aig_MmFixed_t * Aig_MmFixedStart(int nEntrySize, int nEntriesMax)
FUNCTION DEFINITIONS ///.
struct Aig_MmFixed_t_ Aig_MmFixed_t
struct Aig_MmStep_t_ Aig_MmStep_t