/**CFile****************************************************************

  FileName    [vecBit.h]

  SystemName  [ABC: Logic synthesis and verification system.]

  PackageName [Resizable arrays.]

  Synopsis    [Resizable arrays of bits.]

  Author      [Alan Mishchenko]
  
  Affiliation [UC Berkeley]

  Date        [Ver. 1.0. Started - June 20, 2005.]

  Revision    [$Id: vecBit.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $]

***********************************************************************/
 
#ifndef ABC__misc__vec__vecBit_h
#define ABC__misc__vec__vecBit_h


////////////////////////////////////////////////////////////////////////
///                          INCLUDES                                ///
////////////////////////////////////////////////////////////////////////

#include <stdio.h>

ABC_NAMESPACE_HEADER_START


////////////////////////////////////////////////////////////////////////
///                         PARAMETERS                               ///
////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////
///                         BASIC TYPES                              ///
////////////////////////////////////////////////////////////////////////

typedef struct Vec_Bit_t_       Vec_Bit_t;
struct Vec_Bit_t_ 
{
    int              nCap;
    int              nSize;
    int *            pArray;
};

////////////////////////////////////////////////////////////////////////
///                      MACRO DEFINITIONS                           ///
////////////////////////////////////////////////////////////////////////

#define Vec_BitForEachEntry( vVec, Entry, i )                                               \
    for ( i = 0; (i < Vec_BitSize(vVec)) && (((Entry) = Vec_BitEntry(vVec, i)), 1); i++ )
#define Vec_BitForEachEntryStart( vVec, Entry, i, Start )                                   \
    for ( i = Start; (i < Vec_BitSize(vVec)) && (((Entry) = Vec_BitEntry(vVec, i)), 1); i++ )
#define Vec_BitForEachEntryStop( vVec, Entry, i, Stop )                                   \
    for ( i = 0; (i < Stop) && (((Entry) = Vec_BitEntry(vVec, i)), 1); i++ )
#define Vec_BitForEachEntryStartStop( vVec, Entry, i, Start, Stop )                         \
    for ( i = Start; (i < Stop) && (((Entry) = Vec_BitEntry(vVec, i)), 1); i++ )
#define Vec_BitForEachEntryReverse( vVec, pEntry, i )                                       \
    for ( i = Vec_BitSize(vVec) - 1; (i >= 0) && (((pEntry) = Vec_BitEntry(vVec, i)), 1); i-- )

////////////////////////////////////////////////////////////////////////
///                     FUNCTION DEFINITIONS                         ///
////////////////////////////////////////////////////////////////////////

/**Function*************************************************************

  Synopsis    [Allocates a vector with the given capacity.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline Vec_Bit_t * Vec_BitAlloc( int nCap )
{
    Vec_Bit_t * p;
    nCap = (nCap >> 5) + ((nCap & 31) > 0);
    p = ABC_ALLOC( Vec_Bit_t, 1 );
    p->nSize  = 0;
    p->nCap   = nCap * 32;
    p->pArray = nCap? ABC_ALLOC( int, nCap ) : NULL;
    return p;
}

/**Function*************************************************************

  Synopsis    [Allocates a vector with the given size and cleans it.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline Vec_Bit_t * Vec_BitStart( int nSize )
{
    Vec_Bit_t * p;
    nSize = (nSize >> 5) + ((nSize & 31) > 0);
    p = Vec_BitAlloc( nSize * 32 );
    p->nSize = nSize * 32;
    memset( p->pArray, 0, sizeof(int) * nSize );
    return p;
}

/**Function*************************************************************

  Synopsis    [Allocates a vector with the given size and cleans it.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline Vec_Bit_t * Vec_BitStartFull( int nSize )
{
    Vec_Bit_t * p;
    nSize = (nSize >> 5) + ((nSize & 31) > 0);
    p = Vec_BitAlloc( nSize * 32 );
    p->nSize = nSize * 32;
    memset( p->pArray, 0xff, sizeof(int) * nSize );
    return p;
}

/**Function*************************************************************

  Synopsis    [Duplicates the integer array.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline Vec_Bit_t * Vec_BitDup( Vec_Bit_t * pVec )
{
    Vec_Bit_t * p;
    assert( (pVec->nSize & 31) == 0 );
    p = ABC_ALLOC( Vec_Bit_t, 1 );
    p->nSize  = pVec->nSize;
    p->nCap   = pVec->nSize;
    p->pArray = p->nCap? ABC_ALLOC( int, p->nCap >> 5 ) : NULL;
    memcpy( p->pArray, pVec->pArray, sizeof(int) * (p->nCap >> 5) );
    return p;
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline void Vec_BitFree( Vec_Bit_t * p )
{
    ABC_FREE( p->pArray );
    ABC_FREE( p );
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline void Vec_BitFreeP( Vec_Bit_t ** p )
{
    if ( *p == NULL )
        return;
    ABC_FREE( (*p)->pArray );
    ABC_FREE( (*p) );
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline int * Vec_BitReleaseArray( Vec_Bit_t * p )
{
    int * pArray = p->pArray;
    p->nCap = 0;
    p->nSize = 0;
    p->pArray = NULL;
    return pArray;
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline int * Vec_BitArray( Vec_Bit_t * p )
{
    return p->pArray;
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline int Vec_BitSize( Vec_Bit_t * p )
{
    return p->nSize;
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline int Vec_BitCap( Vec_Bit_t * p )
{
    return p->nCap;
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline double Vec_BitMemory( Vec_Bit_t * p )
{
    return !p ? 0.0 : 1.0 * sizeof(int) * p->nCap + sizeof(Vec_Bit_t);
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline int Vec_BitEntry( Vec_Bit_t * p, int i )
{
    assert( i >= 0 && i < p->nSize );
    return (p->pArray[i >> 5] >> (i & 31)) & 1;
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline void Vec_BitWriteEntry( Vec_Bit_t * p, int i, int Entry )
{
    assert( i >= 0 && i < p->nSize );
    if ( Entry == 1 )
        p->pArray[i >> 5] |=  (1 << (i & 31));
    else if ( Entry == 0 )
        p->pArray[i >> 5] &= ~(1 << (i & 31));
    else assert(0);
}
static inline int Vec_BitAddEntry( Vec_Bit_t * p, int i )
{
    if ( Vec_BitEntry(p, i) )
        return 1;
    Vec_BitWriteEntry( p, i, 1 );
    return 0;
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline int Vec_BitEntryLast( Vec_Bit_t * p )
{
    assert( p->nSize > 0 );
    return Vec_BitEntry( p, p->nSize-1 );
}

/**Function*************************************************************

  Synopsis    [Resizes the vector to the given capacity.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline void Vec_BitGrow( Vec_Bit_t * p, int nCapMin )
{
    if ( p->nCap >= nCapMin )
        return;
    nCapMin = (nCapMin >> 5) + ((nCapMin & 31) > 0);
    p->pArray = ABC_REALLOC( int, p->pArray, nCapMin ); 
    assert( p->pArray );
    p->nCap   = nCapMin * 32;
}

/**Function*************************************************************

  Synopsis    [Fills the vector with given number of entries.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline void Vec_BitFill( Vec_Bit_t * p, int nSize, int Fill )
{
    int i;
    Vec_BitGrow( p, nSize );
    nSize = (nSize >> 5) + ((nSize & 31) > 0);
    if ( Fill == 0 )
    {
        for ( i = 0; i < nSize; i++ )
            p->pArray[i] = 0;
    }
    else if ( Fill == 1 )
    {
        for ( i = 0; i < nSize; i++ )
            p->pArray[i] = ~0;
    }
    else assert( 0 );
    p->nSize = nSize * 32;
}

/**Function*************************************************************

  Synopsis    [Fills the vector with given number of entries.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline void Vec_BitFillExtra( Vec_Bit_t * p, int nSize, int Fill )
{
    int i;
    if ( nSize <= p->nSize )
        return;
    if ( nSize > 2 * p->nCap )
        Vec_BitGrow( p, nSize );
    else if ( nSize > p->nCap )
        Vec_BitGrow( p, 2 * p->nCap );

    assert( p->nSize < nSize );
    if ( (p->nSize >> 5) == (nSize >> 5) )
    {
        unsigned Mask = (~(~0 << (nSize-p->nSize)) << p->nSize);
        if ( Fill == 1 )
            p->pArray[nSize >> 5] |= Mask;
        else if ( Fill == 0 )
            p->pArray[nSize >> 5] &= ~Mask;
        else assert( 0 );
    }
    else
    {
        unsigned Mask1 = (p->nSize & 31) ? ~0 << (p->nSize & 31) : 0;
        unsigned Mask2 = (nSize & 31)    ? ~(~0 << (nSize & 31)) : 0;
        int w1 = (p->nSize >> 5);
        int w2 = (nSize >> 5);
        if ( Fill == 1 )
        {
            p->pArray[w1] |= Mask1;
            p->pArray[w2] |= Mask2;
            for ( i = w1 + 1; i < w2; i++ )
                p->pArray[i] = ~0;
        }
        else if ( Fill == 0 )
        {
            p->pArray[w1] &= ~Mask1;
            p->pArray[w2] &= ~Mask2;
            for ( i = w1 + 1; i < w2; i++ )
                p->pArray[i] = 0;
        }
        else assert( 0 );
    }
    p->nSize = nSize;
}

/**Function*************************************************************

  Synopsis    [Returns the entry even if the place not exist.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline int Vec_BitGetEntry( Vec_Bit_t * p, int i )
{
    Vec_BitFillExtra( p, i + 1, 0 );
    return Vec_BitEntry( p, i );
}

/**Function*************************************************************

  Synopsis    [Inserts the entry even if the place does not exist.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline void Vec_BitSetEntry( Vec_Bit_t * p, int i, int Entry )
{
    Vec_BitFillExtra( p, i + 1, 0 );
    Vec_BitWriteEntry( p, i, Entry );
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline void Vec_BitShrink( Vec_Bit_t * p, int nSizeNew )
{
    assert( p->nSize >= nSizeNew );
    p->nSize = nSizeNew;
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline void Vec_BitClear( Vec_Bit_t * p )
{
    p->nSize = 0;
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline void Vec_BitPush( Vec_Bit_t * p, int Entry )
{
    if ( p->nSize == p->nCap )
    {
        if ( p->nCap < 16 )
            Vec_BitGrow( p, 16 );
        else
            Vec_BitGrow( p, 2 * p->nCap );
    }
    if ( Entry == 1 )
        p->pArray[p->nSize >> 5] |=  (1 << (p->nSize & 31));
    else if ( Entry == 0 )
        p->pArray[p->nSize >> 5] &= ~(1 << (p->nSize & 31));
    else assert( 0 );
    p->nSize++;
}

/**Function*************************************************************

  Synopsis    [Returns the last entry and removes it from the list.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline int Vec_BitPop( Vec_Bit_t * p )
{
    int Entry;
    assert( p->nSize > 0 );
    Entry = Vec_BitEntryLast( p );
    p->nSize--;
    return Entry;
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline int Vec_BitCountWord( unsigned uWord )
{
    uWord = (uWord & 0x55555555) + ((uWord>>1) & 0x55555555);
    uWord = (uWord & 0x33333333) + ((uWord>>2) & 0x33333333);
    uWord = (uWord & 0x0F0F0F0F) + ((uWord>>4) & 0x0F0F0F0F);
    uWord = (uWord & 0x00FF00FF) + ((uWord>>8) & 0x00FF00FF);
    return  (uWord & 0x0000FFFF) + (uWord>>16);
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline int Vec_BitCount( Vec_Bit_t * p ) 
{
    unsigned * pArray = (unsigned *)p->pArray;
    int nWords = (p->nSize >> 5) + ((p->nSize & 31) > 0);
    int i, Counter = 0;
    if ( p->nSize & 31 )
    {
        assert( nWords > 0 );
        for ( i = 0; i < nWords-1; i++ )
            Counter += Vec_BitCountWord( pArray[i] );
        Counter += Vec_BitCountWord( pArray[i] & ~(~0 << (p->nSize & 31)) );
    }
    else
    {
        for ( i = 0; i < nWords; i++ )
            Counter += Vec_BitCountWord( pArray[i] );
    }
    return Counter;
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
static inline void Vec_BitReset( Vec_Bit_t * p ) 
{
    int i, nWords = (p->nSize >> 5) + ((p->nSize & 31) > 0);
    for ( i = 0; i < nWords; i++ )
        p->pArray[i] = 0;
}

ABC_NAMESPACE_HEADER_END

#endif

////////////////////////////////////////////////////////////////////////
///                       END OF FILE                                ///
////////////////////////////////////////////////////////////////////////

