abc/src/misc/vec/vecAtt.h

291 lines
8.2 KiB
C
Raw Normal View History

2006-11-22 17:01:00 +01:00
/**CFile****************************************************************
FileName [vecAtt.h]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [Resizable arrays.]
Synopsis [Array of user-specified attiributes.]
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [$Id: vecAtt.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
***********************************************************************/
#ifndef __Vec_Att_H__
#define __Vec_Att_H__
////////////////////////////////////////////////////////////////////////
/// INCLUDES ///
////////////////////////////////////////////////////////////////////////
#include <stdio.h>
////////////////////////////////////////////////////////////////////////
/// PARAMETERS ///
////////////////////////////////////////////////////////////////////////
// various attributes
typedef enum {
VEC_ATTR_NONE = 0, // 0
VEC_ATTR_COPY, // 1
VEC_ATTR_LOCAL_AIG, // 2
VEC_ATTR_LOCAL_SOP, // 3
VEC_ATTR_LOCAL_BDD, // 4
VEC_ATTR_GLOBAL_AIG, // 5
VEC_ATTR_GLOBAL_SOP, // 6
VEC_ATTR_GLOBAL_BDD, // 7
VEC_ATTR_LEVEL, // 8
VEC_ATTR_LEVEL_REV, // 9
VEC_ATTR_RETIME_LAG, // 10
VEC_ATTR_FRAIG, // 11
2007-01-10 17:01:00 +01:00
VEC_ATTR_MVVAR, // 12
VEC_ATTR_DATA1, // 13
VEC_ATTR_DATA2, // 14
2006-11-22 17:01:00 +01:00
VEC_ATTR_TOTAL_NUM // 15
} Vec_AttrType_t;
////////////////////////////////////////////////////////////////////////
/// BASIC TYPES ///
////////////////////////////////////////////////////////////////////////
typedef struct Vec_Att_t_ Vec_Att_t;
struct Vec_Att_t_
{
// storage for attributes
int nCap; // the size of array allocated
2008-07-02 17:01:00 +02:00
// Removed pArrayInt as it's not 64-bit safe, it generates compiler
// warnings, and it's unused.
2006-11-22 17:01:00 +01:00
void ** pArrayPtr; // the pointer attribute array
// attribute specific info
void * pMan; // the manager for this attribute
2009-02-15 17:01:00 +01:00
void (*pFuncFreeMan) (void *); // the procedure to ABC_FREE the manager
2006-11-22 17:01:00 +01:00
void*(*pFuncStartObj)(void *); // the procedure to start one attribute
2009-02-15 17:01:00 +01:00
void (*pFuncFreeObj) (void *, void *); // the procedure to ABC_FREE one attribute
2006-11-22 17:01:00 +01:00
};
////////////////////////////////////////////////////////////////////////
/// MACRO DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis [Allocates a vector with the given capacity.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline Vec_Att_t * Vec_AttAlloc(
2008-07-02 17:01:00 +02:00
int nSize, void * pMan,
2006-11-22 17:01:00 +01:00
void (*pFuncFreeMan) (void *),
void*(*pFuncStartObj)(void *),
void (*pFuncFreeObj) (void *, void *) )
{
Vec_Att_t * p;
2009-02-15 17:01:00 +01:00
p = ABC_ALLOC( Vec_Att_t, 1 );
2006-11-22 17:01:00 +01:00
memset( p, 0, sizeof(Vec_Att_t) );
p->pMan = pMan;
p->pFuncFreeMan = pFuncFreeMan;
p->pFuncStartObj = pFuncStartObj;
p->pFuncFreeObj = pFuncFreeObj;
p->nCap = nSize? nSize : 16;
2009-02-15 17:01:00 +01:00
p->pArrayPtr = ABC_ALLOC( void *, p->nCap );
2008-07-02 17:01:00 +02:00
memset( p->pArrayPtr, 0, sizeof(void *) * p->nCap );
2006-11-22 17:01:00 +01:00
return p;
}
/**Function*************************************************************
Synopsis [Frees the vector.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline void * Vec_AttFree( Vec_Att_t * p, int fFreeMan )
{
void * pMan;
if ( p == NULL )
return NULL;
2009-02-15 17:01:00 +01:00
// ABC_FREE the attributes of objects
2006-11-22 17:01:00 +01:00
if ( p->pFuncFreeObj )
{
int i;
2008-07-02 17:01:00 +02:00
for ( i = 0; i < p->nCap; i++ )
if ( p->pArrayPtr[i] )
p->pFuncFreeObj( p->pMan, p->pArrayPtr[i] );
2006-11-22 17:01:00 +01:00
}
2009-02-15 17:01:00 +01:00
// ABC_FREE the memory manager
2006-11-22 17:01:00 +01:00
pMan = fFreeMan? NULL : p->pMan;
if ( p->pMan && fFreeMan )
p->pFuncFreeMan( p->pMan );
2009-02-15 17:01:00 +01:00
ABC_FREE( p->pArrayPtr );
ABC_FREE( p );
2006-11-22 17:01:00 +01:00
return pMan;
}
/**Function*************************************************************
Synopsis [Clears the vector.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline void Vec_AttClear( Vec_Att_t * p )
{
2009-02-15 17:01:00 +01:00
// ABC_FREE the attributes of objects
2006-11-22 17:01:00 +01:00
if ( p->pFuncFreeObj )
{
int i;
2008-07-02 17:01:00 +02:00
if ( p->pFuncFreeObj )
for ( i = 0; i < p->nCap; i++ )
if ( p->pArrayPtr[i] )
p->pFuncFreeObj( p->pMan, p->pArrayPtr[i] );
2006-11-22 17:01:00 +01:00
}
2008-07-02 17:01:00 +02:00
memset( p->pArrayPtr, 0, sizeof(void *) * p->nCap );
2006-11-22 17:01:00 +01:00
}
/**Function*************************************************************
Synopsis [Deletes one entry from the attribute manager.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline void Vec_AttFreeEntry( Vec_Att_t * p, int i )
{
if ( i >= p->nCap )
return;
if ( p->pMan )
{
if ( p->pArrayPtr[i] && p->pFuncFreeObj )
p->pFuncFreeObj( p->pMan, (void *)p->pArrayPtr[i] );
}
2008-07-02 17:01:00 +02:00
p->pArrayPtr[i] = NULL;
2006-11-22 17:01:00 +01:00
}
/**Function*************************************************************
Synopsis [Resizes the vector to the given capacity.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline void Vec_AttGrow( Vec_Att_t * p, int nCapMin )
{
if ( p->nCap >= nCapMin )
return;
2009-02-15 17:01:00 +01:00
p->pArrayPtr = ABC_REALLOC( void *, p->pArrayPtr, nCapMin );
2008-07-02 17:01:00 +02:00
memset( p->pArrayPtr + p->nCap, 0, sizeof(void *) * (nCapMin - p->nCap) );
2006-11-22 17:01:00 +01:00
p->nCap = nCapMin;
}
/**Function*************************************************************
Synopsis [Writes the entry into its place.]
Description [Only works if the manager is not defined.]
SideEffects []
SeeAlso []
***********************************************************************/
static inline void Vec_AttWriteEntry( Vec_Att_t * p, int i, void * pEntry )
{
assert( p->pArrayPtr );
assert( p->pFuncStartObj == NULL );
if ( i >= p->nCap )
2007-01-10 17:01:00 +01:00
Vec_AttGrow( p, (2 * p->nCap > i)? 2 * p->nCap : i + 10 );
2006-11-22 17:01:00 +01:00
p->pArrayPtr[i] = pEntry;
}
/**Function*************************************************************
Synopsis [Returns the entry.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline void * Vec_AttEntry( Vec_Att_t * p, int i )
{
assert( p->pArrayPtr );
if ( i >= p->nCap )
2007-01-10 17:01:00 +01:00
Vec_AttGrow( p, (2 * p->nCap > i)? 2 * p->nCap : i + 10 );
2006-11-22 17:01:00 +01:00
if ( p->pArrayPtr[i] == NULL && p->pFuncStartObj )
p->pArrayPtr[i] = p->pFuncStartObj( p->pMan );
return p->pArrayPtr[i];
}
/**Function*************************************************************
Synopsis [Returns the entry.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline void * Vec_AttMan( Vec_Att_t * p )
{
return p->pMan;
}
/**Function*************************************************************
Synopsis [Returns the array of attributes.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline void ** Vec_AttArray( Vec_Att_t * p )
{
return p->pArrayPtr;
}
#endif
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////