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

  FileName    [parseStack.c]

  PackageName [MVSIS 1.3: Multi-valued logic synthesis system.]

  Synopsis    [Stacks used by the formula parser.]

  Author      [MVSIS Group]
  
  Affiliation [UC Berkeley]

  Date        [Ver. 1.0. Started - August 18, 2003.]

  Revision    [$Id: parseStack.c,v 1.0 2003/02/01 00:00:00 alanmi Exp $]

***********************************************************************/

#include "parseInt.h"

ABC_NAMESPACE_IMPL_START


////////////////////////////////////////////////////////////////////////
///                        DECLARATIONS                              ///
////////////////////////////////////////////////////////////////////////

struct ParseStackFnStruct
{
    void **     pData;        // the array of elements
    int           Top;          // the index
    int           Size;         // the stack size
};

struct ParseStackOpStruct
{
    int *         pData;        // the array of elements
    int           Top;          // the index
    int           Size;         // the stack size
};

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

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

  Synopsis    [Starts the stack.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Parse_StackFn_t * Parse_StackFnStart( int nDepth )
{
    Parse_StackFn_t * p;
    p = ABC_ALLOC( Parse_StackFn_t, 1 );
    memset( p, 0, sizeof(Parse_StackFn_t) );
    p->pData = ABC_ALLOC( void *, nDepth );
    p->Size = nDepth;
    return p;
}

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

  Synopsis    [Checks whether the stack is empty.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
int Parse_StackFnIsEmpty( Parse_StackFn_t * p )
{
    return (int)(p->Top == 0);
}

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

  Synopsis    [Pushes an entry into the stack.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Parse_StackFnPush( Parse_StackFn_t * p, void * bFunc )
{
    if ( p->Top >= p->Size )
    {
        printf( "Parse_StackFnPush(): Stack size is too small!\n" );
        return;
    }
    p->pData[ p->Top++ ] = bFunc;
}

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

  Synopsis    [Pops an entry out of the stack.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void * Parse_StackFnPop( Parse_StackFn_t * p )
{
    if ( p->Top == 0 )
    {
        printf( "Parse_StackFnPush(): Trying to extract data from the empty stack!\n" );
        return NULL;
    }
    return p->pData[ --p->Top ];
}

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

  Synopsis    [Deletes the stack.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Parse_StackFnFree( Parse_StackFn_t * p )
{
    ABC_FREE( p->pData );
    ABC_FREE( p );
}




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

  Synopsis    [Starts the stack.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Parse_StackOp_t * Parse_StackOpStart( int nDepth )
{
    Parse_StackOp_t * p;
    p = ABC_ALLOC( Parse_StackOp_t, 1 );
    memset( p, 0, sizeof(Parse_StackOp_t) );
    p->pData = ABC_ALLOC( int, nDepth );
    p->Size = nDepth;
    return p;
}

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

  Synopsis    [Checks whether the stack is empty.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
int Parse_StackOpIsEmpty( Parse_StackOp_t * p )
{
    return (int)(p->Top == 0);
}

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

  Synopsis    [Pushes an entry into the stack.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Parse_StackOpPush( Parse_StackOp_t * p, int Oper )
{
    if ( p->Top >= p->Size )
    {
        printf( "Parse_StackOpPush(): Stack size is too small!\n" );
        return;
    }
    p->pData[ p->Top++ ] = Oper;
}

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

  Synopsis    [Pops an entry out of the stack.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
int Parse_StackOpPop( Parse_StackOp_t * p )
{
    if ( p->Top == 0 )
    {
        printf( "Parse_StackOpPush(): Trying to extract data from the empty stack!\n" );
        return -1;
    }
    return p->pData[ --p->Top ];
}

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

  Synopsis    [Deletes the stack.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Parse_StackOpFree( Parse_StackOp_t * p )
{
    ABC_FREE( p->pData );
    ABC_FREE( p );
}


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


ABC_NAMESPACE_IMPL_END