| /**CFile**************************************************************** |
| |
| FileName [nmApi.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [Name manager.] |
| |
| Synopsis [APIs of the name manager.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - June 20, 2005.] |
| |
| Revision [$Id: nmApi.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "nmInt.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [Allocates the name manager.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Nm_Man_t * Nm_ManCreate( int nSize ) |
| { |
| Nm_Man_t * p; |
| // allocate the table |
| p = ABC_ALLOC( Nm_Man_t, 1 ); |
| memset( p, 0, sizeof(Nm_Man_t) ); |
| // set the parameters |
| p->nSizeFactor = 2; // determined the limit on the grow of data before the table resizes |
| p->nGrowthFactor = 3; // determined how much the table grows after resizing |
| // allocate and clean the bins |
| p->nBins = Abc_PrimeCudd(nSize); |
| p->pBinsI2N = ABC_ALLOC( Nm_Entry_t *, p->nBins ); |
| p->pBinsN2I = ABC_ALLOC( Nm_Entry_t *, p->nBins ); |
| memset( p->pBinsI2N, 0, sizeof(Nm_Entry_t *) * p->nBins ); |
| memset( p->pBinsN2I, 0, sizeof(Nm_Entry_t *) * p->nBins ); |
| // start the memory manager |
| p->pMem = Extra_MmFlexStart(); |
| return p; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Deallocates the name manager.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Nm_ManFree( Nm_Man_t * p ) |
| { |
| Extra_MmFlexStop( p->pMem ); |
| ABC_FREE( p->pBinsI2N ); |
| ABC_FREE( p->pBinsN2I ); |
| ABC_FREE( p ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Returns the number of objects with names.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Nm_ManNumEntries( Nm_Man_t * p ) |
| { |
| return p->nEntries; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Creates a new entry in the name manager.] |
| |
| Description [Returns 1 if the entry with the given object ID |
| already exists in the name manager.] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| char * Nm_ManStoreIdName( Nm_Man_t * p, int ObjId, int Type, char * pName, char * pSuffix ) |
| { |
| Nm_Entry_t * pEntry; |
| int RetValue, nEntrySize; |
| // check if the object with this ID is already stored |
| if ( (pEntry = Nm_ManTableLookupId(p, ObjId)) ) |
| { |
| printf( "Nm_ManStoreIdName(): Entry with the same ID already exists.\n" ); |
| return NULL; |
| } |
| // create a new entry |
| nEntrySize = sizeof(Nm_Entry_t) + strlen(pName) + (pSuffix?strlen(pSuffix):0) + 1; |
| // nEntrySize = (nEntrySize / 4 + ((nEntrySize % 4) > 0)) * 4; |
| nEntrySize = (nEntrySize / sizeof(char*) + ((nEntrySize % sizeof(char*)) > 0)) * sizeof(char*); // added by Saurabh on Sep 3, 2009 |
| pEntry = (Nm_Entry_t *)Extra_MmFlexEntryFetch( p->pMem, nEntrySize ); |
| pEntry->pNextI2N = pEntry->pNextN2I = pEntry->pNameSake = NULL; |
| pEntry->ObjId = ObjId; |
| pEntry->Type = Type; |
| sprintf( pEntry->Name, "%s%s", pName, pSuffix? pSuffix : "" ); |
| // add the entry to the hash table |
| RetValue = Nm_ManTableAdd( p, pEntry ); |
| assert( RetValue == 1 ); |
| return pEntry->Name; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Creates a new entry in the name manager.] |
| |
| Description [Returns 1 if the entry with the given object ID |
| already exists in the name manager.] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Nm_ManDeleteIdName( Nm_Man_t * p, int ObjId ) |
| { |
| Nm_Entry_t * pEntry; |
| pEntry = Nm_ManTableLookupId(p, ObjId); |
| if ( pEntry == NULL ) |
| { |
| printf( "Nm_ManDeleteIdName(): This entry is not in the table.\n" ); |
| return; |
| } |
| // remove entry from the table |
| Nm_ManTableDelete( p, ObjId ); |
| } |
| |
| |
| /**Function************************************************************* |
| |
| Synopsis [Finds a unique name for the node.] |
| |
| Description [If the name exists, tries appending numbers to it until |
| it becomes unique. The name is not added to the table.] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| char * Nm_ManCreateUniqueName( Nm_Man_t * p, int ObjId ) |
| { |
| static char NameStr[1000]; |
| Nm_Entry_t * pEntry; |
| int i; |
| if ( (pEntry = Nm_ManTableLookupId(p, ObjId)) ) |
| return pEntry->Name; |
| sprintf( NameStr, "n%d", ObjId ); |
| for ( i = 1; Nm_ManTableLookupName(p, NameStr, -1); i++ ) |
| sprintf( NameStr, "n%d_%d", ObjId, i ); |
| return NameStr; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Returns name of the object if the ID is known.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| char * Nm_ManFindNameById( Nm_Man_t * p, int ObjId ) |
| { |
| Nm_Entry_t * pEntry; |
| if ( (pEntry = Nm_ManTableLookupId(p, ObjId)) ) |
| return pEntry->Name; |
| return NULL; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Returns ID of the object if its name is known.] |
| |
| Description [This procedure may return two IDs because POs and latches |
| may have the same name (the only allowed case of name duplication).] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Nm_ManFindIdByName( Nm_Man_t * p, char * pName, int Type ) |
| { |
| Nm_Entry_t * pEntry; |
| if ( (pEntry = Nm_ManTableLookupName(p, pName, Type)) ) |
| return pEntry->ObjId; |
| return -1; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Returns ID of the object if its name is known.] |
| |
| Description [This procedure may return two IDs because POs and latches |
| may have the same name (the only allowed case of name duplication).] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Nm_ManFindIdByNameTwoTypes( Nm_Man_t * p, char * pName, int Type1, int Type2 ) |
| { |
| int iNodeId; |
| iNodeId = Nm_ManFindIdByName( p, pName, Type1 ); |
| if ( iNodeId == -1 ) |
| iNodeId = Nm_ManFindIdByName( p, pName, Type2 ); |
| if ( iNodeId == -1 ) |
| return -1; |
| return iNodeId; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Return the IDs of objects with names.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Vec_Int_t * Nm_ManReturnNameIds( Nm_Man_t * p ) |
| { |
| Vec_Int_t * vNameIds; |
| int i; |
| vNameIds = Vec_IntAlloc( p->nEntries ); |
| for ( i = 0; i < p->nBins; i++ ) |
| if ( p->pBinsI2N[i] ) |
| Vec_IntPush( vNameIds, p->pBinsI2N[i]->ObjId ); |
| return vNameIds; |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |