/*******************************************************************************
* vpi_user.h
*
* IEEE 1364-2005 Verilog HDL Programming Language Interface (PLI)
*
* This file contains the constant definitions, structure definitions, and
* routine declarations used by the Verilog PLI procedural interface VPI
* access routines.
*
******************************************************************************/
/*******************************************************************************
* NOTE: the constant values 1 through 299 are reserved for use in this
* vpi_user.h file.
******************************************************************************/
#ifndef VPI_USER_H
#define VPI_USER_H
#include <stdarg.h>
#ifdef __cplusplus
extern "C" {
#endif
/*----------------------------------------------------------------------------*/
/*--------------------------- Version compatibility --------------------------*/
/*----------------------------------------------------------------------------*/

/* This is the VPI API version that can be selected by the user.
   There are four possible versions (assuming the next SystemVerilog update to
   happen in 2008) here: VERILOG_1995, VERILOG_2001, VERILOG_2005, and the
   default value set below, which is VERILOG_2008. The define below selects
   the VERILOG_2008 version to be the default one, which can be overridden
   by the user by defining VPI_USER_VERSION.

   NOTE: this asserts that VPI_USER_VERSION is always defined ...
         below it will be checked to have always a correct value ...
 */
#ifndef VPI_USER_VERSION
#define VPI_USER_VERSION VERILOG_2008
#endif

/* The code below maps the standard VPI functions to the specific function
   for the given interface kind (2008, 2005, 2001, or 1995). It also checks
   that VPI_USER_VERSION just have valid values assigned.

   NOTE: This assumes we want to have a complete set of functions for each
         Verilog standard version. It might be sufficient to just have two ...

   NOTE: If VPI_USER_VERSION has no value assigned, no mapping will happen,
         and the user chooses the standard vpi_ functions (which might be
         the same as the 1995 ones).
*/

#if VPI_USER_VERSION == VERILOG_2008

#define vpi_register_cb            vpi2008_register_cb
#define vpi_remove_cb              vpi2008_remove_cb
#define vpi_get_cb_info            vpi2008_get_cb_info
#define vpi_register_systf         vpi2008_register_systf
#define vpi_get_systf_info         vpi2008_get_systf_info
#define vpi_handle_by_name         vpi2008_handle_by_name
#define vpi_handle_by_index        vpi2008_handle_by_index
#define vpi_handle                 vpi2008_handle
#define vpi_handle_multi           vpi2008_handle_multi
#define vpi_iterate                vpi2008_iterate
#define vpi_scan                   vpi2008_scan
#define vpi_get                    vpi2008_get
#define vpi_get_str                vpi2008_get_str
#define vpi_get_delays             vpi2008_get_delays;
#define vpi_put_delays             vpi2008_put_delays
#define vpi_get_value              vpi2008_get_value
#define vpi_put_value              vpi2008_put_value
#define vpi_get_time               vpi2008_get_time
#define vpi_mcd_open               vpi2008_mcd_open
#define vpi_mcd_close              vpi2008_mcd_close
#define vpi_mcd_name               vpi2008_mcd_name
#define vpi_mcd_printf             vpi2008_mcd_printf
#define vpi_printf                 vpi2008_printf
#define vpi_compare_objects        vpi2008_compare_objects
#define vpi_chk_error              vpi2008_chk_error
#define vpi_free_object            vpi2008_free_object
#define vpi_get_vlog_info          vpi2008_get_vlog_info
#define vpi_get_data               vpi2008_get_data
#define vpi_put_data               vpi2008_put_data
#define vpi_get_userdata           vpi2008_get_userdata
#define vpi_put_userdata           vpi2008_put_userdata
#define vpi_vprintf                vpi2008_vprintf
#define vpi_mcd_vprintf            vpi2008_mcd_vprintf
#define vpi_flush                  vpi2008_flush
#define vpi_mcd_flush              vpi2008_mcd_flush
#define vpi_control                vpi2008_control
#define vpi_handle_by_multi_index  vpi2008_handle_by_multi_index


#else  /* #if VPI_USER_VERSION == VERILOG_2008 */
#if VPI_USER_VERSION == VERILOG_2005

#define vpi_register_cb            vpi2005_register_cb
#define vpi_remove_cb              vpi2005_remove_cb
#define vpi_get_cb_info            vpi2005_get_cb_info
#define vpi_register_systf         vpi2005_register_systf
#define vpi_get_systf_info         vpi2005_get_systf_info
#define vpi_handle_by_name         vpi2005_handle_by_name
#define vpi_handle_by_index        vpi2005_handle_by_index
#define vpi_handle                 vpi2005_handle
#define vpi_handle_multi           vpi2005_handle_multi
#define vpi_iterate                vpi2005_iterate
#define vpi_scan                   vpi2005_scan
#define vpi_get                    vpi2005_get
#define vpi_get_str                vpi2005_get_str
#define vpi_get_delays             vpi2005_get_delays;
#define vpi_put_delays             vpi2005_put_delays
#define vpi_get_value              vpi2005_get_value
#define vpi_put_value              vpi2005_put_value
#define vpi_get_time               vpi2005_get_time
#define vpi_mcd_open               vpi2005_mcd_open
#define vpi_mcd_close              vpi2005_mcd_close
#define vpi_mcd_name               vpi2005_mcd_name
#define vpi_mcd_printf             vpi2005_mcd_printf
#define vpi_printf                 vpi2005_printf
#define vpi_compare_objects        vpi2005_compare_objects
#define vpi_chk_error              vpi2005_chk_error
#define vpi_free_object            vpi2005_free_object
#define vpi_get_vlog_info          vpi2005_get_vlog_info
#define vpi_get_data               vpi2005_get_data
#define vpi_put_data               vpi2005_put_data
#define vpi_get_userdata           vpi2005_get_userdata
#define vpi_put_userdata           vpi2005_put_userdata
#define vpi_vprintf                vpi2005_vprintf
#define vpi_mcd_vprintf            vpi2005_mcd_vprintf
#define vpi_flush                  vpi2005_flush
#define vpi_mcd_flush              vpi2005_mcd_flush
#define vpi_control                vpi2005_control
#define vpi_handle_by_multi_index  vpi2005_handle_by_multi_index


#else  /*  #if VPI_USER_VERSION == VERILOG_2005 */
#if VPI_USER_VERSION == VERILOG_2001

#define vpi_register_cb            vpi2001_register_cb
...
#define vpi_handle_by_multi_index  vpi2001_handle_by_multi_index


#else  /*  #if VPI_USER_VERSION == VERILOG_2001 */
#if VPI_USER_VERSION == VERILOG_1995

#define vpi_register_cb            vpi1995_register_cb
...
#define vpi_handle_by_multi_index  vpi1995_handle_by_multi_index


#else  /*  #if VPI_USER_VERSION == VERILOG_1995 */

/* This will be raised, if VPI_USER_VERSION has an illegal value */
#error
"#define VPI_USER_VERSION must have a value of VERILOG_{1995|2001|2005|2008}"

#endif  /*  #if VPI_USER_VERSION == VERILOG_1995 */
#endif  /*  #if VPI_USER_VERSION == VERILOG_2001 */
#endif  /*  #if VPI_USER_VERSION == VERILOG_2005 */
#endif  /* #if VPI_USER_VERSION == VERILOG_2008 */


/*----------------------------------------------------------------------------*/
/*--------------------------- Version compatibility --------------------------*/
/*----------------------------------------------------------------------------*/

/* This is the VPI API version that can be selected by the user.
   There are four possible versions (assuming the next SystemVerilog update to
   happen in 2008) here: VERILOG_1995, VERILOG_2001, VERILOG_2005, and the
   default value set below, which is VERILOG_2008. The define below selects
   the VERILOG_2008 version to be the default one, which can be overridden
   by the user by defining VPI_USER_VERSION.

   NOTE: this asserts that VPI_USER_VERSION is always defined ...
         below it will be checked to have always a correct value ...
 */
#ifndef VPI_USER_VERSION

/* this is the default value, if it has not been defined elsewhere */
#define VPI_USER_VERSION VERILOG_2008

#else

#if (VPI_USER_VERSION != VERILOG_2005) && (VPI_USER_VERSION != VERILOG_2001) && (VPI_USER_VERSION != VERILOG_1995)

/* This will be raised, if VPI_USER_VERSION has an illegal value */
#error
"#define VPI_USER_VERSION must have a value of VERILOG_{1995|2001|2005|2008}"

#endif

#endif

/************************** FUNCTION TRAY DECLARATION *************************/

typedef struct t_vpi_user_function_tray
{

XXTERN vpiHandle register_cb PROTO_PARAMS((p_cb_data cb_data_p));
XXTERN PLI_INT32 remove_cb PROTO_PARAMS((vpiHandle cb_obj));
XXTERN void get_cb_info PROTO_PARAMS((vpiHandle object,p_cb_data cb_data_p));
XXTERN vpiHandle register_systf PROTO_PARAMS((p_vpi_systf_data systf_data_p));
XXTERN void get_systf_info PROTO_PARAMS((vpiHandle object, p_vpi_systf_data systf_data_p));
/* for obtaining handles */
XXTERN vpiHandle handle_by_name PROTO_PARAMS((PLI_BYTE8 *name, vpiHandle scope));
XXTERN vpiHandle handle_by_index PROTO_PARAMS((vpiHandle object, PLI_INT32 indx));
/* for traversing relationships */
XXTERN vpiHandle handle PROTO_PARAMS((PLI_INT32 type, vpiHandle refHandle));
XXTERN vpiHandle handle_multi PROTO_PARAMS((PLI_INT32 type, vpiHandle refHandle1, vpiHandle refHandle2, ... ));
XXTERN vpiHandle iterate PROTO_PARAMS((PLI_INT32 type, vpiHandle refHandle));
XXTERN vpiHandle scan PROTO_PARAMS((vpiHandle iterator));
/* for processing properties */
XXTERN PLI_INT32 get PROTO_PARAMS((PLI_INT32 property, vpiHandle object));
XXTERN PLI_BYTE8 *vpi_get_str PROTO_PARAMS((PLI_INT32 property, vpiHandle object));
/* delay processing */
XXTERN void get_delays PROTO_PARAMS((vpiHandle object, p_vpi_delay delay_p));
XXTERN void put_delays PROTO_PARAMS((vpiHandle object, p_vpi_delay delay_p));
/* value processing */
XXTERN void get_value PROTO_PARAMS((vpiHandle expr, p_vpi_value value_p));
XXTERN vpiHandle put_value PROTO_PARAMS((vpiHandle object, p_vpi_value value_p,
p_vpi_time time_p, PLI_INT32 flags));
/* time processing */
XXTERN void get_time PROTO_PARAMS((vpiHandle object, p_vpi_time time_p));
/* I/O routines */
XXTERN PLI_UINT32 mcd_open PROTO_PARAMS((PLI_BYTE8 *fileName));
XXTERN PLI_UINT32 mcd_close PROTO_PARAMS((PLI_UINT32 mcd));
XXTERN PLI_BYTE8 *vpi_mcd_name PROTO_PARAMS((PLI_UINT32 cd));
XXTERN PLI_INT32 mcd_printf PROTO_PARAMS((PLI_UINT32 mcd, PLI_BYTE8 *format, ...));
XXTERN PLI_INT32 printf PROTO_PARAMS((PLI_BYTE8 *format,...));
/* utility routines */
XXTERN PLI_INT32 compare_objects PROTO_PARAMS((vpiHandle object1, vpiHandle object2));
XXTERN PLI_INT32 chk_error PROTO_PARAMS((p_vpi_error_info error_info_p));
XXTERN PLI_INT32 free_object PROTO_PARAMS((vpiHandle object));
XXTERN PLI_INT32 get_vlog_info PROTO_PARAMS((p_vpi_vlog_info vlog_info_p));
/* routines added with 1364-1995 */
XXTERN PLI_INT32 get_data PROTO_PARAMS((PLI_INT32 id, PLI_BYTE8 *dataLoc,PLI_INT32 numOfBytes));
XXTERN PLI_INT32 put_data PROTO_PARAMS((PLI_INT32 id,PLI_BYTE8 *dataLoc,PLI_INT32 numOfBytes));
XXTERN void *vpi_get_userdata PROTO_PARAMS((vpiHandle obj));
XXTERN PLI_INT32 put_userdata PROTO_PARAMS((vpiHandle obj,void *userdata));
XXTERN PLI_INT32 vprintf PROTO_PARAMS((PLI_BYTE8 *format, va_list ap));
XXTERN PLI_INT32 mcd_vprintf PROTO_PARAMS((PLI_UINT32 mcd, PLI_BYTE8 *format, va_list ap));
XXTERN PLI_INT32 flush PROTO_PARAMS((void));
XXTERN PLI_INT32 mcd_flush PROTO_PARAMS((PLI_UINT32 mcd));
XXTERN PLI_INT32 control PROTO_PARAMS((PLI_INT32 operation, ...));
XXTERN vpiHandle handle_by_multi_index PROTO_PARAMS((vpiHandle obj, PLI_INT32 num_index, PLI_INT32 *index_array));

...
} s_vpi_user_function_tray_data, * p_vpi_user_function_tray_data;

 

/* This is the declaration of the only new symbol to be added */

extern t_vpi_user_function_tray* vpi_standard_function_tray;

 


/* The code below maps the standard VPI functions to the specific function
   defined within the common function tray. For this function tray we can
   define a function to switch between interfaces.

   Benefit: more flexible
   Drawback: only two possible versions (standard code + function_tray)


*/

#if VPI_USER_VERSION != VERILOG_2008

#define vpi_register_cb            vpi_standard_function_tray->register_cb
#define vpi_remove_cb              vpi_standard_function_tray->remove_cb
#define vpi_get_cb_info            vpi_standard_function_tray->get_cb_info
#define vpi_register_systf         vpi_standard_function_tray->register_systf
#define vpi_get_systf_info         vpi_standard_function_tray->get_systf_info
#define vpi_handle_by_name         vpi_standard_function_tray->handle_by_name
#define vpi_handle_by_index        vpi_standard_function_tray->handle_by_index
#define vpi_handle                 vpi_standard_function_tray->handle
#define vpi_handle_multi           vpi_standard_function_tray->handle_multi
#define vpi_iterate                vpi_standard_function_tray->iterate
#define vpi_scan                   vpi_standard_function_tray->scan
#define vpi_get                    vpi_standard_function_tray->get
#define vpi_get_str                vpi_standard_function_tray->get_str
#define vpi_get_delays             vpi_standard_function_tray->get_delays;
#define vpi_put_delays             vpi_standard_function_tray->put_delays
#define vpi_get_value              vpi_standard_function_tray->get_value
#define vpi_put_value              vpi_standard_function_tray->put_value
#define vpi_get_time               vpi_standard_function_tray->get_time
#define vpi_mcd_open               vpi_standard_function_tray->mcd_open
#define vpi_mcd_close              vpi_standard_function_tray->mcd_close
#define vpi_mcd_name               vpi_standard_function_tray->mcd_name
#define vpi_mcd_printf             vpi_standard_function_tray->mcd_printf
#define vpi_printf                 vpi_standard_function_tray->printf
#define vpi_compare_objects        vpi_standard_function_tray->compare_objects
#define vpi_chk_error              vpi_standard_function_tray->chk_error
#define vpi_free_object            vpi_standard_function_tray->free_object
#define vpi_get_vlog_info          vpi_standard_function_tray->get_vlog_info
#define vpi_get_data               vpi_standard_function_tray->get_data
#define vpi_put_data               vpi_standard_function_tray->put_data
#define vpi_get_userdata           vpi_standard_function_tray->get_userdata
#define vpi_put_userdata           vpi_standard_function_tray->put_userdata
#define vpi_vprintf                vpi_standard_function_tray->vprintf
#define vpi_mcd_vprintf            vpi_standard_function_tray->mcd_vprintf
#define vpi_flush                  vpi_standard_function_tray->flush
#define vpi_mcd_flush              vpi_standard_function_tray->mcd_flush
#define vpi_control                vpi_standard_function_tray->control
#define vpi_handle_by_multi_index  vpi_standard_function_tray->handle_by_multi_index


#endif



/*----------------------------------------------------------------------------*/
/*----------------------------- Portability Help -----------------------------*/
/*----------------------------------------------------------------------------*/

/* Sized variables */
#ifndef PLI_TYPES
...

/********************************** TYPEDEFS **********************************/
typedef PLI_UINT32 *vpiHandle;
/******************************** OBJECT TYPES ********************************/
#define vpiAlways 1 /* always construct */
...

/*************************** STRUCTURE DEFINITIONS ****************************/
/******************************* time structure *******************************/
typedef struct t_vpi_time
{
...


/***************************** value structures *******************************/
/

#define vpiSupplyDrive 0x80
...

/* bit mask for the flags argument to vpi_put_value() */
#define vpiReturnEvent 0x1000
...

/*********************** system task/function structure ***********************/

/* I am not sure something needs to be done here as well. ???? */


typedef struct t_vpi_systf_data
{
...
PLI_INT32 (*calltf)(PLI_BYTE8 *);
PLI_INT32 (*compiletf)(PLI_BYTE8 *);
PLI_INT32 (*sizetf)(PLI_BYTE8 *); /* for sized function callbacks only */
...
} s_vpi_systf_data, *p_vpi_systf_data;

#define vpiSysTask 1
...

/**************************** callback structures *****************************/
/* normal callback structure */

/* NOTE: I do not think we need to modify this structure, any special handling
         for callbacks should be done by the register_cb function, which can
         then wrap the callback function accordingly.
 */

typedef struct t_cb_data
{
...
PLI_INT32 (*cb_rtn)(struct t_cb_data *); /* call routine */
...
} s_cb_data, *p_cb_data;
/****************************** CALLBACK REASONS ******************************/
/***************************** Simulation related *****************************/
#define cbValueChange 1
...

/**************************** FUNCTION DECLARATIONS ***************************/
/* callback related */
XXTERN vpiHandle vpi_register_cb PROTO_PARAMS((p_cb_data cb_data_p));
XXTERN PLI_INT32 vpi_remove_cb PROTO_PARAMS((vpiHandle cb_obj));
XXTERN void vpi_get_cb_info PROTO_PARAMS((vpiHandle object,p_cb_data cb_data_p));
XXTERN vpiHandle vpi_register_systf PROTO_PARAMS((p_vpi_systf_data systf_data_p));
XXTERN void vpi_get_systf_info PROTO_PARAMS((vpiHandle object, p_vpi_systf_data systf_data_p));
/* for obtaining handles */
XXTERN vpiHandle vpi_handle_by_name PROTO_PARAMS((PLI_BYTE8 *name, vpiHandle scope));
XXTERN vpiHandle vpi_handle_by_index PROTO_PARAMS((vpiHandle object, PLI_INT32 indx));
/* for traversing relationships */
XXTERN vpiHandle vpi_handle PROTO_PARAMS((PLI_INT32 type, vpiHandle refHandle));
XXTERN vpiHandle vpi_handle_multi PROTO_PARAMS((PLI_INT32 type, vpiHandle refHandle1, vpiHandle refHandle2, ... ));
XXTERN vpiHandle vpi_iterate PROTO_PARAMS((PLI_INT32 type, vpiHandle refHandle));
XXTERN vpiHandle vpi_scan PROTO_PARAMS((vpiHandle iterator));
/* for processing properties */
XXTERN PLI_INT32 vpi_get PROTO_PARAMS((PLI_INT32 property, vpiHandle object));
XXTERN PLI_BYTE8 *vpi_get_str PROTO_PARAMS((PLI_INT32 property, vpiHandle object));
/* delay processing */
XXTERN void vpi_get_delays PROTO_PARAMS((vpiHandle object, p_vpi_delay delay_p));
XXTERN void vpi_put_delays PROTO_PARAMS((vpiHandle object, p_vpi_delay delay_p));
/* value processing */
XXTERN void vpi_get_value PROTO_PARAMS((vpiHandle expr, p_vpi_value value_p));
XXTERN vpiHandle vpi_put_value PROTO_PARAMS((vpiHandle object, p_vpi_value value_p,
p_vpi_time time_p, PLI_INT32 flags));
/* time processing */
XXTERN void vpi_get_time PROTO_PARAMS((vpiHandle object, p_vpi_time time_p));
/* I/O routines */
XXTERN PLI_UINT32 vpi_mcd_open PROTO_PARAMS((PLI_BYTE8 *fileName));
XXTERN PLI_UINT32 vpi_mcd_close PROTO_PARAMS((PLI_UINT32 mcd));
XXTERN PLI_BYTE8 *vpi_mcd_name PROTO_PARAMS((PLI_UINT32 cd));
XXTERN PLI_INT32 vpi_mcd_printf PROTO_PARAMS((PLI_UINT32 mcd, PLI_BYTE8 *format, ...));
XXTERN PLI_INT32 vpi_printf PROTO_PARAMS((PLI_BYTE8 *format,...));
/* utility routines */
XXTERN PLI_INT32 vpi_compare_objects PROTO_PARAMS((vpiHandle object1, vpiHandle object2));
XXTERN PLI_INT32 vpi_chk_error PROTO_PARAMS((p_vpi_error_info error_info_p));
XXTERN PLI_INT32 vpi_free_object PROTO_PARAMS((vpiHandle object));
XXTERN PLI_INT32 vpi_get_vlog_info PROTO_PARAMS((p_vpi_vlog_info vlog_info_p));
/* routines added with 1364-1995 */
XXTERN PLI_INT32 vpi_get_data PROTO_PARAMS((PLI_INT32 id, PLI_BYTE8 *dataLoc,PLI_INT32 numOfBytes));
XXTERN PLI_INT32 vpi_put_data PROTO_PARAMS((PLI_INT32 id,PLI_BYTE8 *dataLoc,PLI_INT32 numOfBytes));
XXTERN void *vpi_get_userdata PROTO_PARAMS((vpiHandle obj));
XXTERN PLI_INT32 vpi_put_userdata PROTO_PARAMS((vpiHandle obj,void *userdata));
XXTERN PLI_INT32 vpi_vprintf PROTO_PARAMS((PLI_BYTE8 *format, va_list ap));
XXTERN PLI_INT32 vpi_mcd_vprintf PROTO_PARAMS((PLI_UINT32 mcd, PLI_BYTE8 *format, va_list ap));
XXTERN PLI_INT32 vpi_flush PROTO_PARAMS((void));
XXTERN PLI_INT32 vpi_mcd_flush PROTO_PARAMS((PLI_UINT32 mcd));
XXTERN PLI_INT32 vpi_control PROTO_PARAMS((PLI_INT32 operation, ...));
XXTERN vpiHandle vpi_handle_by_multi_index PROTO_PARAMS((vpiHandle obj, PLI_INT32 num_index, PLI_INT32 *index_array));


/**************************** FUNCTION DECLARATIONS ***************************/
/* callback related */
XXTERN vpiHandle vpi2005_register_cb PROTO_PARAMS((p_cb_data cb_data_p));
XXTERN PLI_INT32 vpi2005_remove_cb PROTO_PARAMS((vpiHandle cb_obj));
XXTERN void vpi2005_get_cb_info PROTO_PARAMS((vpiHandle object,p_cb_data cb_data_p));
XXTERN vpiHandle vpi2005_register_systf PROTO_PARAMS((p_vpi_systf_data systf_data_p));
XXTERN void vpi2005_get_systf_info PROTO_PARAMS((vpiHandle object, p_vpi_systf_data systf_data_p));
/* for obtaining handles */
XXTERN vpiHandle vpi2005_handle_by_name PROTO_PARAMS((PLI_BYTE8 *name, vpiHandle scope));
XXTERN vpiHandle vpi2005_handle_by_index PROTO_PARAMS((vpiHandle object, PLI_INT32 indx));
/* for traversing relationships */
XXTERN vpiHandle vpi2005_handle PROTO_PARAMS((PLI_INT32 type, vpiHandle refHandle));
XXTERN vpiHandle vpi2005_handle_multi PROTO_PARAMS((PLI_INT32 type, vpiHandle refHandle1, vpiHandle refHandle2, ... ));
XXTERN vpiHandle vpi2005_iterate PROTO_PARAMS((PLI_INT32 type, vpiHandle refHandle));
XXTERN vpiHandle vpi2005_scan PROTO_PARAMS((vpiHandle iterator));
/* for processing properties */
XXTERN PLI_INT32 vpi2005_get PROTO_PARAMS((PLI_INT32 property, vpiHandle object));
XXTERN PLI_BYTE8 *vpi_get_str PROTO_PARAMS((PLI_INT32 property, vpiHandle object));
/* delay processing */
XXTERN void vpi2005_get_delays PROTO_PARAMS((vpiHandle object, p_vpi_delay delay_p));
XXTERN void vpi2005_put_delays PROTO_PARAMS((vpiHandle object, p_vpi_delay delay_p));
/* value processing */
XXTERN void vpi2005_get_value PROTO_PARAMS((vpiHandle expr, p_vpi_value value_p));
XXTERN vpiHandle vpi2005_put_value PROTO_PARAMS((vpiHandle object, p_vpi_value value_p,
p_vpi_time time_p, PLI_INT32 flags));
/* time processing */
XXTERN void vpi2005_get_time PROTO_PARAMS((vpiHandle object, p_vpi_time time_p));
/* I/O routines */
XXTERN PLI_UINT32 vpi2005_mcd_open PROTO_PARAMS((PLI_BYTE8 *fileName));
XXTERN PLI_UINT32 vpi2005_mcd_close PROTO_PARAMS((PLI_UINT32 mcd));
XXTERN PLI_BYTE8 *vpi_mcd_name PROTO_PARAMS((PLI_UINT32 cd));
XXTERN PLI_INT32 vpi2005_mcd_printf PROTO_PARAMS((PLI_UINT32 mcd, PLI_BYTE8 *format, ...));
XXTERN PLI_INT32 vpi2005_printf PROTO_PARAMS((PLI_BYTE8 *format,...));
/* utility routines */
XXTERN PLI_INT32 vpi2005_compare_objects PROTO_PARAMS((vpiHandle object1, vpiHandle object2));
XXTERN PLI_INT32 vpi2005_chk_error PROTO_PARAMS((p_vpi_error_info error_info_p));
XXTERN PLI_INT32 vpi2005_free_object PROTO_PARAMS((vpiHandle object));
XXTERN PLI_INT32 vpi2005_get_vlog_info PROTO_PARAMS((p_vpi_vlog_info vlog_info_p));
/* routines added with 1364-1995 */
XXTERN PLI_INT32 vpi2005_get_data PROTO_PARAMS((PLI_INT32 id, PLI_BYTE8 *dataLoc,PLI_INT32 numOfBytes));
XXTERN PLI_INT32 vpi2005_put_data PROTO_PARAMS((PLI_INT32 id,PLI_BYTE8 *dataLoc,PLI_INT32 numOfBytes));
XXTERN void *vpi_get_userdata PROTO_PARAMS((vpiHandle obj));
XXTERN PLI_INT32 vpi2005_put_userdata PROTO_PARAMS((vpiHandle obj,void *userdata));
XXTERN PLI_INT32 vpi2005_vprintf PROTO_PARAMS((PLI_BYTE8 *format, va_list ap));
XXTERN PLI_INT32 vpi2005_mcd_vprintf PROTO_PARAMS((PLI_UINT32 mcd, PLI_BYTE8 *format, va_list ap));
XXTERN PLI_INT32 vpi2005_flush PROTO_PARAMS((void));
XXTERN PLI_INT32 vpi2005_mcd_flush PROTO_PARAMS((PLI_UINT32 mcd));
XXTERN PLI_INT32 vpi2005_control PROTO_PARAMS((PLI_INT32 operation, ...));
XXTERN vpiHandle vpi2005_handle_by_multi_index PROTO_PARAMS((vpiHandle obj, PLI_INT32 num_index, PLI_INT32 *index_array));


/**************************** FUNCTION DECLARATIONS ***************************/
/* callback related */
XXTERN vpiHandle vpi2001_register_cb PROTO_PARAMS((p_cb_data cb_data_p));
XXTERN PLI_INT32 vpi2001_remove_cb PROTO_PARAMS((vpiHandle cb_obj));
XXTERN void vpi2001_get_cb_info PROTO_PARAMS((vpiHandle object,p_cb_data cb_data_p));
XXTERN vpiHandle vpi2001_register_systf PROTO_PARAMS((p_vpi_systf_data systf_data_p));
XXTERN void vpi2001_get_systf_info PROTO_PARAMS((vpiHandle object, p_vpi_systf_data systf_data_p));
/* for obtaining handles */
XXTERN vpiHandle vpi2001_handle_by_name PROTO_PARAMS((PLI_BYTE8 *name, vpiHandle scope));
XXTERN vpiHandle vpi2001_handle_by_index PROTO_PARAMS((vpiHandle object, PLI_INT32 indx));
/* for traversing relationships */
XXTERN vpiHandle vpi2001_handle PROTO_PARAMS((PLI_INT32 type, vpiHandle refHandle));
XXTERN vpiHandle vpi2001_handle_multi PROTO_PARAMS((PLI_INT32 type, vpiHandle refHandle1, vpiHandle refHandle2, ... ));
XXTERN vpiHandle vpi2001_iterate PROTO_PARAMS((PLI_INT32 type, vpiHandle refHandle));
XXTERN vpiHandle vpi2001_scan PROTO_PARAMS((vpiHandle iterator));
/* for processing properties */
XXTERN PLI_INT32 vpi2001_get PROTO_PARAMS((PLI_INT32 property, vpiHandle object));
XXTERN PLI_BYTE8 *vpi_get_str PROTO_PARAMS((PLI_INT32 property, vpiHandle object));
/* delay processing */
XXTERN void vpi2001_get_delays PROTO_PARAMS((vpiHandle object, p_vpi_delay delay_p));
XXTERN void vpi2001_put_delays PROTO_PARAMS((vpiHandle object, p_vpi_delay delay_p));
/* value processing */
XXTERN void vpi2001_get_value PROTO_PARAMS((vpiHandle expr, p_vpi_value value_p));
XXTERN vpiHandle vpi2001_put_value PROTO_PARAMS((vpiHandle object, p_vpi_value value_p,
p_vpi_time time_p, PLI_INT32 flags));
/* time processing */
XXTERN void vpi2001_get_time PROTO_PARAMS((vpiHandle object, p_vpi_time time_p));
/* I/O routines */
XXTERN PLI_UINT32 vpi2001_mcd_open PROTO_PARAMS((PLI_BYTE8 *fileName));
XXTERN PLI_UINT32 vpi2001_mcd_close PROTO_PARAMS((PLI_UINT32 mcd));
XXTERN PLI_BYTE8 *vpi_mcd_name PROTO_PARAMS((PLI_UINT32 cd));
XXTERN PLI_INT32 vpi2001_mcd_printf PROTO_PARAMS((PLI_UINT32 mcd, PLI_BYTE8 *format, ...));
XXTERN PLI_INT32 vpi2001_printf PROTO_PARAMS((PLI_BYTE8 *format,...));
/* utility routines */
XXTERN PLI_INT32 vpi2001_compare_objects PROTO_PARAMS((vpiHandle object1, vpiHandle object2));
XXTERN PLI_INT32 vpi2001_chk_error PROTO_PARAMS((p_vpi_error_info error_info_p));
XXTERN PLI_INT32 vpi2001_free_object PROTO_PARAMS((vpiHandle object));
XXTERN PLI_INT32 vpi2001_get_vlog_info PROTO_PARAMS((p_vpi_vlog_info vlog_info_p));
/* routines added with 1364-1995 */
XXTERN PLI_INT32 vpi2001_get_data PROTO_PARAMS((PLI_INT32 id, PLI_BYTE8 *dataLoc,PLI_INT32 numOfBytes));
XXTERN PLI_INT32 vpi2001_put_data PROTO_PARAMS((PLI_INT32 id,PLI_BYTE8 *dataLoc,PLI_INT32 numOfBytes));
XXTERN void *vpi_get_userdata PROTO_PARAMS((vpiHandle obj));
XXTERN PLI_INT32 vpi2001_put_userdata PROTO_PARAMS((vpiHandle obj,void *userdata));
XXTERN PLI_INT32 vpi2001_vprintf PROTO_PARAMS((PLI_BYTE8 *format, va_list ap));
XXTERN PLI_INT32 vpi2001_mcd_vprintf PROTO_PARAMS((PLI_UINT32 mcd, PLI_BYTE8 *format, va_list ap));
XXTERN PLI_INT32 vpi2001_flush PROTO_PARAMS((void));
XXTERN PLI_INT32 vpi2001_mcd_flush PROTO_PARAMS((PLI_UINT32 mcd));
XXTERN PLI_INT32 vpi2001_control PROTO_PARAMS((PLI_INT32 operation, ...));
XXTERN vpiHandle vpi2001_handle_by_multi_index PROTO_PARAMS((vpiHandle obj, PLI_INT32 num_index, PLI_INT32 *index_array));



/****************************** GLOBAL VARIABLES ******************************/
PLI_VEXTERN PLI_DLLESPEC void (*vlog_startup_routines[])();
/* array of function pointers, last pointer should be null */
#undef PLI_EXTERN
#undef PLI_VEXTERN



#ifdef __cplusplus
}
#endif
#endif /* USER_H */