/**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 /// ////////////////////////////////////////////////////////////////////////