272 lines
8.5 KiB
C
272 lines
8.5 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [mem2.h]
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
PackageName [Memory management.]
|
|
|
|
Synopsis [External declarations.]
|
|
|
|
Author [Alan Mishchenko]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - June 20, 2005.]
|
|
|
|
Revision [$Id: mem2.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#ifndef ABC__aig__mem__mem2_h
|
|
#define ABC__aig__mem__mem2_h
|
|
|
|
#include "misc/vec/vec.h"
|
|
|
|
ABC_NAMESPACE_HEADER_START
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
typedef struct Mmr_Flex_t_ Mmr_Flex_t;
|
|
typedef struct Mmr_Fixed_t_ Mmr_Fixed_t;
|
|
typedef struct Mmr_Step_t_ Mmr_Step_t;
|
|
|
|
struct Mmr_Flex_t_
|
|
{
|
|
int nPageBase; // log2 page size in words
|
|
int PageMask; // page mask
|
|
int nEntries; // entries allocated
|
|
int nEntriesMax; // max number of enries used
|
|
int iNext; // next word to be used
|
|
Vec_Ptr_t vPages; // memory pages
|
|
};
|
|
|
|
struct Mmr_Fixed_t_
|
|
{
|
|
int nPageBase; // log2 page size in words
|
|
int PageMask; // page mask
|
|
int nEntryWords; // entry size in words
|
|
int nEntries; // entries allocated
|
|
int nEntriesMax; // max number of enries used
|
|
Vec_Ptr_t vPages; // memory pages
|
|
Vec_Int_t vFrees; // free entries
|
|
};
|
|
|
|
struct Mmr_Step_t_
|
|
{
|
|
int nBits; // the number of bits
|
|
int uMask; // the number of managers minus 1
|
|
int nEntries; // the number of entries
|
|
int nEntriesMax; // the max number of entries
|
|
int nEntriesAll; // the total number of entries
|
|
Mmr_Fixed_t pMems[0]; // memory managers: 2^0 words, 2^1 words, etc
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DEFINITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
static inline Mmr_Flex_t * Mmr_FlexStart( int nPageBase )
|
|
{
|
|
Mmr_Flex_t * p;
|
|
p = ABC_CALLOC( Mmr_Flex_t, 1 );
|
|
p->nPageBase = nPageBase;
|
|
p->PageMask = (1 << nPageBase) - 1;
|
|
p->iNext = (1 << nPageBase);
|
|
return p;
|
|
}
|
|
static inline void Mmr_FlexStop( Mmr_Flex_t * p )
|
|
{
|
|
word * pPage;
|
|
int i;
|
|
if ( 0 && Vec_PtrSize(&p->vPages) )
|
|
printf( "Using %3d pages of %6d words each with %6d entries (max = %6d). Total memory = %5.2f MB.\n",
|
|
Vec_PtrSize(&p->vPages), p->nPageBase ? 1 << p->nPageBase : 0, p->nEntries, p->nEntriesMax,
|
|
1.0 * Vec_PtrSize(&p->vPages) * (1 << p->nPageBase) * 8 / (1 << 20) );
|
|
Vec_PtrForEachEntry( word *, &p->vPages, pPage, i )
|
|
ABC_FREE( pPage );
|
|
ABC_FREE( p->vPages.pArray );
|
|
ABC_FREE( p );
|
|
}
|
|
static inline word * Mmr_FlexEntry( Mmr_Flex_t * p, int h )
|
|
{
|
|
assert( h > 0 && h < p->iNext );
|
|
return (word *)Vec_PtrEntry(&p->vPages, (h >> p->nPageBase)) + (h & p->PageMask);
|
|
}
|
|
static inline int Mmr_FlexFetch( Mmr_Flex_t * p, int nWords )
|
|
{
|
|
int hEntry;
|
|
assert( nWords > 0 && nWords < p->PageMask );
|
|
if ( p->iNext + nWords >= p->PageMask )
|
|
{
|
|
Vec_PtrPush( &p->vPages, ABC_FALLOC( word, p->PageMask + 1 ) );
|
|
p->iNext = 1;
|
|
}
|
|
hEntry = ((Vec_PtrSize(&p->vPages) - 1) << p->nPageBase) | p->iNext;
|
|
p->iNext += nWords;
|
|
p->nEntries++;
|
|
p->nEntriesMax = Abc_MaxInt( p->nEntriesMax, p->nEntries );
|
|
return hEntry;
|
|
}
|
|
static inline void Mmr_FlexRelease( Mmr_Flex_t * p, int h )
|
|
{
|
|
assert( h > 0 && h < p->iNext );
|
|
if ( (h >> p->nPageBase) && Vec_PtrEntry(&p->vPages, (h >> p->nPageBase) - 1) )
|
|
{
|
|
word * pPage = (word *)Vec_PtrEntry(&p->vPages, (h >> p->nPageBase) - 1);
|
|
Vec_PtrWriteEntry( &p->vPages, (h >> p->nPageBase) - 1, NULL );
|
|
ABC_FREE( pPage );
|
|
}
|
|
}
|
|
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
static inline void Mmr_FixedCreate( Mmr_Fixed_t * p, int nPageBase, int nEntryWords )
|
|
{
|
|
assert( nEntryWords > 0 && nEntryWords < (1 << nPageBase) );
|
|
p->nPageBase = nPageBase;
|
|
p->PageMask = (1 << nPageBase) - 1;
|
|
p->nEntryWords = nEntryWords;
|
|
}
|
|
static inline Mmr_Fixed_t * Mmr_FixedStart( int nPageBase, int nEntryWords )
|
|
{
|
|
Mmr_Fixed_t * p = ABC_CALLOC( Mmr_Fixed_t, 1 );
|
|
Mmr_FixedCreate( p, nPageBase, nEntryWords );
|
|
return p;
|
|
}
|
|
static inline void Mmr_FixedStop( Mmr_Fixed_t * p, int fFreeLast )
|
|
{
|
|
word * pPage;
|
|
int i;
|
|
if ( 0 && Vec_PtrSize(&p->vPages) )
|
|
printf( "Using %3d pages of %6d words each with %6d entries (max = %6d) of size %d. Total memory = %5.2f MB.\n",
|
|
Vec_PtrSize(&p->vPages), p->nPageBase ? 1 << p->nPageBase : 0, p->nEntries, p->nEntriesMax, p->nEntryWords,
|
|
1.0 * Vec_PtrSize(&p->vPages) * (1 << p->nPageBase) * 8 / (1 << 20) );
|
|
Vec_PtrForEachEntry( word *, &p->vPages, pPage, i )
|
|
ABC_FREE( pPage );
|
|
ABC_FREE( p->vPages.pArray );
|
|
ABC_FREE( p->vFrees.pArray );
|
|
if ( fFreeLast )
|
|
ABC_FREE( p );
|
|
}
|
|
static inline word * Mmr_FixedEntry( Mmr_Fixed_t * p, int h )
|
|
{
|
|
assert( h > 0 && h < (Vec_PtrSize(&p->vPages) << p->nPageBase) );
|
|
return (word *)Vec_PtrEntry(&p->vPages, (h >> p->nPageBase)) + (h & p->PageMask);
|
|
}
|
|
static inline int Mmr_FixedFetch( Mmr_Fixed_t * p )
|
|
{
|
|
if ( Vec_IntSize(&p->vFrees) == 0 )
|
|
{
|
|
int i, hEntry = Vec_PtrSize(&p->vPages) << p->nPageBase;
|
|
Vec_PtrPush( &p->vPages, ABC_FALLOC( word, p->PageMask + 1 ) );
|
|
for ( i = 1; i + p->nEntryWords <= p->PageMask; i += p->nEntryWords )
|
|
Vec_IntPush( &p->vFrees, hEntry | i );
|
|
Vec_IntReverseOrder( &p->vFrees );
|
|
}
|
|
p->nEntries++;
|
|
p->nEntriesMax = Abc_MaxInt( p->nEntriesMax, p->nEntries );
|
|
return Vec_IntPop( &p->vFrees );
|
|
}
|
|
static inline void Mmr_FixedRecycle( Mmr_Fixed_t * p, int h )
|
|
{
|
|
p->nEntries--;
|
|
memset( Mmr_FixedEntry(p, h), 0xFF, sizeof(word) * p->nEntryWords );
|
|
Vec_IntPush( &p->vFrees, h );
|
|
}
|
|
static inline int Mmr_FixedMemory( Mmr_Fixed_t * p )
|
|
{
|
|
return Vec_PtrSize(&p->vPages) * (p->PageMask + 1);
|
|
}
|
|
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
static inline Mmr_Step_t * Mmr_StepStart( int nPageBase, int nWordBase )
|
|
{
|
|
char * pMemory = ABC_CALLOC( char, sizeof(Mmr_Step_t) + sizeof(Mmr_Fixed_t) * (1 << nWordBase) );
|
|
Mmr_Step_t * p = (Mmr_Step_t *)pMemory;
|
|
int i;
|
|
p->nBits = nWordBase;
|
|
p->uMask = (1 << nWordBase) - 1;
|
|
for ( i = 1; i <= p->uMask; i++ )
|
|
Mmr_FixedCreate( p->pMems + i, nPageBase, i );
|
|
return p;
|
|
}
|
|
static inline void Mmr_StepStop( Mmr_Step_t * p )
|
|
{
|
|
int i;
|
|
for ( i = 0; i <= p->uMask; i++ )
|
|
Mmr_FixedStop( p->pMems + i, 0 );
|
|
ABC_FREE( p );
|
|
}
|
|
static inline word * Mmr_StepEntry( Mmr_Step_t * p, int h )
|
|
{
|
|
assert( (h & p->uMask) > 0 );
|
|
return Mmr_FixedEntry( p->pMems + (h & p->uMask), (h >> p->nBits) );
|
|
}
|
|
static inline int Mmr_StepFetch( Mmr_Step_t * p, int nWords )
|
|
{
|
|
assert( nWords > 0 && nWords <= p->uMask );
|
|
p->nEntries++;
|
|
p->nEntriesAll++;
|
|
p->nEntriesMax = Abc_MaxInt( p->nEntriesMax, p->nEntries );
|
|
return (Mmr_FixedFetch(p->pMems + nWords) << p->nBits) | nWords;
|
|
}
|
|
static inline void Mmr_StepRecycle( Mmr_Step_t * p, int h )
|
|
{
|
|
p->nEntries--;
|
|
Mmr_FixedRecycle( p->pMems + (h & p->uMask), (h >> p->nBits) );
|
|
}
|
|
static inline int Mmr_StepMemory( Mmr_Step_t * p )
|
|
{
|
|
int i, Mem = 0;
|
|
for ( i = 1; i <= p->uMask; i++ )
|
|
Mem += Mmr_FixedMemory( p->pMems + i );
|
|
return Mem;
|
|
}
|
|
|
|
|
|
ABC_NAMESPACE_HEADER_END
|
|
|
|
#endif
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|