/**CFile**************************************************************** FileName [attr.h] SystemName [ABC: Logic synthesis and verification system.] PackageName [Network attributes.] Synopsis [External declarations.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: attr.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #ifndef ABC__aig__ivy__attr_h #define ABC__aig__ivy__attr_h //////////////////////////////////////////////////////////////////////// /// INCLUDES /// //////////////////////////////////////////////////////////////////////// #include "misc/extra/extra.h" //////////////////////////////////////////////////////////////////////// /// PARAMETERS /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_HEADER_START //////////////////////////////////////////////////////////////////////// /// BASIC TYPES /// //////////////////////////////////////////////////////////////////////// typedef struct Attr_ManStruct_t_ Attr_Man_t; struct Attr_ManStruct_t_ { // attribute info int nAttrSize; // the size of each attribute in bytes Extra_MmFixed_t * pManMem; // memory manager for attributes int nAttrs; // the number of attributes allocated void ** pAttrs; // the array of attributes int fUseInt; // uses integer attributes // attribute specific info void * pManAttr; // the manager for this attribute void (*pFuncFreeMan) (void *); // the procedure to call to free attribute-specific manager void (*pFuncFreeObj) (void *, void *); // the procedure to call to free attribute-specific data }; // at any time, an attribute of the given ID can be // - not available (p->nAttrs < Id) // - available but not allocated (p->nAttrs >= Id && p->pAttrs[Id] == NULL) // - available and allocated (p->nAttrs >= Id && p->pAttrs[Id] != NULL) //////////////////////////////////////////////////////////////////////// /// MACRO DEFINITIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DECLARATIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Allocates the attribute manager.] Description [The manager is simple if it does not need memory manager.] SideEffects [] SeeAlso [] ***********************************************************************/ static inline Attr_Man_t * Attr_ManAlloc( int nAttrSize, int fManMem ) { Attr_Man_t * p; p = ALLOC( Attr_Man_t, 1 ); memset( p, 0, sizeof(Attr_Man_t) ); p->nAttrSize = nAttrSize; if ( fManMem ) p->pManMem = Extra_MmFixedStart( nAttrSize ); return p; } /**Function************************************************************* Synopsis [Start the attribute manager for integers.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline Attr_Man_t * Attr_ManStartInt( int nAttrs ) { Attr_Man_t * p; p = Attr_ManAlloc( sizeof(int), 0 ); p->nAttrs = nAttrs; p->pAttrs = (void **)ALLOC( int, nAttrs ); memset( (int *)p->pAttrs, 0, sizeof(int) * nAttrs ); p->fUseInt = 1; return p; } /**Function************************************************************* Synopsis [Start the attribute manager for pointers.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline Attr_Man_t * Attr_ManStartPtr( int nAttrs ) { Attr_Man_t * p; p = Attr_ManAlloc( sizeof(void *), 0 ); p->nAttrs = nAttrs; p->pAttrs = ALLOC( void *, nAttrs ); memset( p->pAttrs, 0, sizeof(void *) * nAttrs ); return p; } /**Function************************************************************* Synopsis [Start the attribute manager for the fixed entry size.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline Attr_Man_t * Attr_ManStartPtrMem( int nAttrs, int nAttrSize ) { Attr_Man_t * p; int i; p = Attr_ManAlloc( nAttrSize, 1 ); p->nAttrs = nAttrs; p->pAttrs = ALLOC( void *, nAttrs ); for ( i = 0; i < p->nAttrs; i++ ) { p->pAttrs[i] = Extra_MmFixedEntryFetch( p->pManMem ); memset( p->pAttrs[i], 0, nAttrSize ); } return p; } /**Function************************************************************* Synopsis [Stop the attribute manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline void Attr_ManStop( Attr_Man_t * p ) { // free the attributes of objects if ( p->pFuncFreeObj ) { int i; if ( p->fUseInt ) { for ( i = 0; i < p->nAttrs; i++ ) if ( ((int *)p->pAttrs)[i] ) p->pFuncFreeObj( p->pManAttr, (void *)((int *)p->pAttrs)[i] ); } else { for ( i = 0; i < p->nAttrs; i++ ) if ( p->pAttrs[i] ) p->pFuncFreeObj( p->pManAttr, p->pAttrs[i] ); } } // free the attribute manager if ( p->pManAttr && p->pFuncFreeMan ) p->pFuncFreeMan( p->pManAttr ); // free the memory manager if ( p->pManMem ) Extra_MmFixedStop( p->pManMem); // free the attribute manager FREE( p->pAttrs ); free( p ); } /**Function************************************************************* Synopsis [Reads the attribute of the given object.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline int Attr_ManReadAttrInt( Attr_Man_t * p, int Id ) { assert( p->fUseInt ); if ( Id >= p->nAttrs ) return 0; return ((int *)p->pAttrs)[Id]; } /**Function************************************************************* Synopsis [Reads the attribute of the given object.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline void * Attr_ManReadAttrPtr( Attr_Man_t * p, int Id ) { assert( !p->fUseInt ); if ( Id >= p->nAttrs ) return NULL; return p->pAttrs[Id]; } /**Function************************************************************* Synopsis [Writes the attribute of the given object.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline void Attr_ManWriteAttrInt( Attr_Man_t * p, int Id, int Attr ) { assert( p->fUseInt ); ((int *)p->pAttrs)[Id] = Attr; } /**Function************************************************************* Synopsis [Writes the attribute of the given object.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline void Attr_ManWriteAttrPtr( Attr_Man_t * p, int Id, void * pAttr ) { assert( !p->fUseInt ); assert( p->pManMem == NULL ); p->pAttrs[Id] = pAttr; } /**Function************************************************************* Synopsis [Returns or creates the pointer to the attribute of the given object.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline int * Attr_ManFetchSpotInt( Attr_Man_t * p, int Id ) { assert( p->fUseInt ); if ( Id >= p->nAttrs ) { // save the old size int i, nAttrsOld = p->nAttrs; // get the new size p->nAttrs = p->nAttrs? 2*p->nAttrs : 1024; p->pAttrs = realloc( p->pAttrs, sizeof(int) * p->nAttrs ); // fill in the empty spots for ( i = nAttrsOld; i < p->nAttrs; i++ ) ((int *)p->pAttrs)[Id] = 0; } return ((int *)p->pAttrs) + Id; } /**Function************************************************************* Synopsis [Returns or creates the pointer to the attribute of the given object.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline void ** Attr_ManFetchSpotPtr( Attr_Man_t * p, int Id ) { assert( !p->fUseInt ); if ( Id >= p->nAttrs ) { // save the old size int i, nAttrsOld = p->nAttrs; // get the new size p->nAttrs = p->nAttrs? 2*p->nAttrs : 1024; p->pAttrs = realloc( p->pAttrs, sizeof(void *) * p->nAttrs ); // fill in the empty spots for ( i = nAttrsOld; i < p->nAttrs; i++ ) p->pAttrs[Id] = NULL; } // if memory manager is available but entry is not created, create it if ( p->pManMem && p->pAttrs[Id] != NULL ) { p->pAttrs[Id] = Extra_MmFixedEntryFetch( p->pManMem ); memset( p->pAttrs[Id], 0, p->nAttrSize ); } return p->pAttrs + Id; } /**Function************************************************************* Synopsis [Returns or creates the attribute of the given object.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline int Attr_ManFetchAttrInt( Attr_Man_t * p, int Id ) { return *Attr_ManFetchSpotInt( p, Id ); } /**Function************************************************************* Synopsis [Returns or creates the attribute of the given object.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline void * Attr_ManFetchAttrPtr( Attr_Man_t * p, int Id ) { return *Attr_ManFetchSpotPtr( p, Id ); } /**Function************************************************************* Synopsis [Sets the attribute of the given object.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline void Attr_ManSetAttrInt( Attr_Man_t * p, int Id, int Attr ) { *Attr_ManFetchSpotInt( p, Id ) = Attr; } /**Function************************************************************* Synopsis [Sets the attribute of the given object.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline void Attr_ManSetAttrPtr( Attr_Man_t * p, int Id, void * pAttr ) { assert( p->pManMem == NULL ); *Attr_ManFetchSpotPtr( p, Id ) = pAttr; } ABC_NAMESPACE_HEADER_END #endif //////////////////////////////////////////////////////////////////////// /// END OF FILE /// ////////////////////////////////////////////////////////////////////////