2001-03-16 02:44:34 +01:00
|
|
|
#ifndef __vpi_priv_H
|
|
|
|
|
#define __vpi_priv_H
|
|
|
|
|
/*
|
2007-11-07 05:26:03 +01:00
|
|
|
* Copyright (c) 2001-2007 Stephen Williams (steve@icarus.com)
|
2001-03-16 02:44:34 +01:00
|
|
|
*
|
|
|
|
|
* This source code is free software; you can redistribute it
|
|
|
|
|
* and/or modify it in source code form under the terms of the GNU
|
|
|
|
|
* General Public License as published by the Free Software
|
|
|
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
|
|
|
* any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
# include "vpi_user.h"
|
2001-03-20 07:16:23 +01:00
|
|
|
# include "pointers.h"
|
2004-12-11 03:31:25 +01:00
|
|
|
# include "vvp_net.h"
|
2001-05-09 01:59:33 +02:00
|
|
|
# include "memory.h"
|
2001-03-16 02:44:34 +01:00
|
|
|
|
2007-09-11 00:30:00 +02:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Added to use some "vvp_fun_modpath_src"
|
|
|
|
|
* and "vvp_fun_modpath" classes definitions
|
|
|
|
|
*/
|
|
|
|
|
#include "delay.h"
|
|
|
|
|
|
|
|
|
|
|
2001-03-16 02:44:34 +01:00
|
|
|
/*
|
|
|
|
|
* This header file contains the internal definitions that the vvp
|
|
|
|
|
* program uses to implement the public interface in the vpi_user.h
|
|
|
|
|
* header file elsewhere.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
2002-05-18 04:34:11 +02:00
|
|
|
/*
|
|
|
|
|
* The vpi_mode_flag contains the major mode for VPI use. This is used
|
2003-02-10 00:33:26 +01:00
|
|
|
* to generate error messages when vpi functions are called
|
2002-05-18 04:34:11 +02:00
|
|
|
* incorrectly.
|
|
|
|
|
*/
|
|
|
|
|
enum vpi_mode_t {
|
|
|
|
|
VPI_MODE_NONE =0,
|
|
|
|
|
/* The compiler is calling a register function. */
|
|
|
|
|
VPI_MODE_REGISTER,
|
|
|
|
|
/* The compiler is calling a compiletf function. */
|
|
|
|
|
VPI_MODE_COMPILETF,
|
|
|
|
|
/* The compiler is calling a calltf function. */
|
|
|
|
|
VPI_MODE_CALLTF,
|
|
|
|
|
/* We are in the midst of a RWSync callback. */
|
|
|
|
|
VPI_MODE_RWSYNC,
|
|
|
|
|
/* We are in a ROSync callback. */
|
|
|
|
|
VPI_MODE_ROSYNC
|
|
|
|
|
};
|
|
|
|
|
extern vpi_mode_t vpi_mode_flag;
|
2001-03-16 02:44:34 +01:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* This structure is the very base of a vpiHandle. Every handle
|
|
|
|
|
* structure starts with this structure, so that the library can
|
|
|
|
|
* internally pass the derived types as pointers to one of these.
|
|
|
|
|
*/
|
|
|
|
|
struct __vpiHandle {
|
|
|
|
|
const struct __vpirt *vpi_type;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Objects with this structure are used to represent a type of
|
|
|
|
|
* vpiHandle. A specific object becomes of this type by holding a
|
|
|
|
|
* pointer to an instance of this structure.
|
|
|
|
|
*/
|
|
|
|
|
struct __vpirt {
|
|
|
|
|
int type_code;
|
|
|
|
|
|
|
|
|
|
/* These methods extract information from the handle. */
|
|
|
|
|
int (*vpi_get_)(int, vpiHandle);
|
|
|
|
|
char* (*vpi_get_str_)(int, vpiHandle);
|
|
|
|
|
void (*vpi_get_value_)(vpiHandle, p_vpi_value);
|
2004-05-19 05:26:24 +02:00
|
|
|
vpiHandle (*vpi_put_value_)(vpiHandle, p_vpi_value);
|
2001-03-16 02:44:34 +01:00
|
|
|
|
|
|
|
|
/* These methods follow references. */
|
|
|
|
|
vpiHandle (*handle_)(int, vpiHandle);
|
|
|
|
|
vpiHandle (*iterate_)(int, vpiHandle);
|
|
|
|
|
vpiHandle (*index_)(vpiHandle, int);
|
2002-05-03 17:44:11 +02:00
|
|
|
|
|
|
|
|
/* This implements the vpi_free_object method. */
|
|
|
|
|
int (*vpi_free_object_)(vpiHandle);
|
2007-09-11 00:30:00 +02:00
|
|
|
|
|
|
|
|
/*
|
2007-12-03 18:44:31 +01:00
|
|
|
These two methods are used to read/write delay
|
|
|
|
|
values from/into modpath records
|
2007-09-11 00:30:00 +02:00
|
|
|
*/
|
|
|
|
|
void (*vpi_get_delays_)(vpiHandle, p_vpi_delay);
|
|
|
|
|
void (*vpi_put_delays_)(vpiHandle, p_vpi_delay);
|
2001-03-16 02:44:34 +01:00
|
|
|
};
|
|
|
|
|
|
2007-10-31 04:14:40 +01:00
|
|
|
/*
|
|
|
|
|
* In general a vpi object is a structure that contains the member
|
|
|
|
|
* "base" that is a __vpiHandle object. This template can convert any
|
|
|
|
|
* of those structures into a vpiHandle object.
|
|
|
|
|
*/
|
|
|
|
|
template <class T> struct __vpiHandle*vpi_handle(T obj)
|
|
|
|
|
{ return &obj->base; }
|
|
|
|
|
|
2001-03-16 02:44:34 +01:00
|
|
|
/*
|
|
|
|
|
* The vpiHandle for an iterator has this structure. The definition of
|
|
|
|
|
* the methods lives in vpi_iter.c
|
2002-05-03 17:44:11 +02:00
|
|
|
*
|
|
|
|
|
* The args and nargs members point to the array of vpiHandle objects
|
|
|
|
|
* that are to be iterated over. The next member is the index of the
|
|
|
|
|
* next item to be returned by a vpi_scan.
|
|
|
|
|
*
|
|
|
|
|
* The free_args_flag member is true if when this iterator object is
|
|
|
|
|
* released it must also free the args array.
|
2001-03-16 02:44:34 +01:00
|
|
|
*/
|
|
|
|
|
struct __vpiIterator {
|
|
|
|
|
struct __vpiHandle base;
|
|
|
|
|
vpiHandle *args;
|
|
|
|
|
unsigned nargs;
|
|
|
|
|
unsigned next;
|
2002-05-03 17:44:11 +02:00
|
|
|
bool free_args_flag;
|
2001-03-16 02:44:34 +01:00
|
|
|
};
|
|
|
|
|
|
2002-05-03 17:44:11 +02:00
|
|
|
extern vpiHandle vpip_make_iterator(unsigned nargs, vpiHandle*args,
|
|
|
|
|
bool free_args_flag);
|
2001-03-18 05:35:18 +01:00
|
|
|
|
2002-05-19 07:18:16 +02:00
|
|
|
/*
|
2003-02-10 00:33:26 +01:00
|
|
|
* This represents callback handles. There are some private types that
|
2002-05-19 07:18:16 +02:00
|
|
|
* are defined and used in vpi_callback.cc.
|
|
|
|
|
*/
|
|
|
|
|
struct __vpiCallback {
|
|
|
|
|
struct __vpiHandle base;
|
|
|
|
|
|
|
|
|
|
// user supplied callback data
|
|
|
|
|
struct t_cb_data cb_data;
|
|
|
|
|
struct t_vpi_time cb_time;
|
|
|
|
|
|
|
|
|
|
// scheduled event
|
|
|
|
|
struct sync_cb* cb_sync;
|
|
|
|
|
|
|
|
|
|
// Used for listing callbacks.
|
|
|
|
|
struct __vpiCallback*next;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
extern struct __vpiCallback* new_vpi_callback();
|
|
|
|
|
extern void callback_execute(struct __vpiCallback*cur);
|
|
|
|
|
|
2002-12-21 01:55:57 +01:00
|
|
|
struct __vpiSystemTime {
|
|
|
|
|
struct __vpiHandle base;
|
|
|
|
|
struct __vpiScope *scope;
|
|
|
|
|
};
|
|
|
|
|
|
2001-03-18 01:37:55 +01:00
|
|
|
/*
|
2002-12-21 01:55:57 +01:00
|
|
|
* Scopes are created by .scope statements in the source. These
|
2003-02-10 00:33:26 +01:00
|
|
|
* objects hold the items and properties that are knowingly bound to a
|
2002-12-21 01:55:57 +01:00
|
|
|
* scope.
|
2001-03-18 01:37:55 +01:00
|
|
|
*/
|
|
|
|
|
struct __vpiScope {
|
|
|
|
|
struct __vpiHandle base;
|
2001-10-15 03:49:50 +02:00
|
|
|
struct __vpiScope *scope;
|
2001-03-18 01:37:55 +01:00
|
|
|
/* The scope has a name. */
|
2002-07-05 19:14:15 +02:00
|
|
|
const char*name;
|
2003-05-29 04:21:45 +02:00
|
|
|
const char*tname;
|
2002-12-21 01:55:57 +01:00
|
|
|
/* The scope has a system time of its own. */
|
|
|
|
|
struct __vpiSystemTime scoped_time;
|
2003-02-01 06:50:04 +01:00
|
|
|
struct __vpiSystemTime scoped_realtime;
|
2002-12-21 01:55:57 +01:00
|
|
|
/* Keep an array of internal scope items. */
|
2001-03-18 01:37:55 +01:00
|
|
|
struct __vpiHandle**intern;
|
|
|
|
|
unsigned nintern;
|
2001-04-18 06:21:23 +02:00
|
|
|
/* Keep a list of threads in the scope. */
|
|
|
|
|
vthread_t threads;
|
2002-12-21 01:55:57 +01:00
|
|
|
signed int time_units :8;
|
2007-09-28 20:21:08 +02:00
|
|
|
signed int time_precision :8;
|
2001-03-18 01:37:55 +01:00
|
|
|
};
|
2001-04-18 06:21:23 +02:00
|
|
|
|
|
|
|
|
extern struct __vpiScope* vpip_peek_current_scope(void);
|
2001-03-18 01:37:55 +01:00
|
|
|
extern void vpip_attach_to_current_scope(vpiHandle obj);
|
2002-01-06 01:48:39 +01:00
|
|
|
extern vpiHandle vpip_make_root_iterator(void);
|
2003-02-23 07:41:54 +01:00
|
|
|
extern void vpip_make_root_iterator(struct __vpiHandle**&table,
|
|
|
|
|
unsigned&ntable);
|
2001-03-18 01:37:55 +01:00
|
|
|
|
2001-03-20 07:16:23 +01:00
|
|
|
/*
|
|
|
|
|
* Signals include the variable types (reg, integer, time) and are
|
|
|
|
|
* distinguished by the vpiType code. They also have a parent scope,
|
|
|
|
|
* a declared name and declaration indices.
|
|
|
|
|
*/
|
|
|
|
|
struct __vpiSignal {
|
|
|
|
|
struct __vpiHandle base;
|
2007-12-03 18:44:31 +01:00
|
|
|
vpiHandle parent;
|
2001-04-18 06:21:23 +02:00
|
|
|
struct __vpiScope* scope;
|
2007-12-03 20:41:52 +01:00
|
|
|
/* The name of this reg/net, or the index for array words. */
|
|
|
|
|
union {
|
|
|
|
|
const char*name;
|
|
|
|
|
vpiHandle index;
|
|
|
|
|
} id;
|
2001-03-20 07:16:23 +01:00
|
|
|
/* The indices that define the width and access offset. */
|
|
|
|
|
int msb, lsb;
|
2001-04-04 19:43:19 +02:00
|
|
|
/* Flags */
|
|
|
|
|
unsigned signed_flag : 1;
|
2003-02-10 00:33:26 +01:00
|
|
|
unsigned isint_ : 1; // original type was integer
|
2001-03-20 07:16:23 +01:00
|
|
|
/* The represented value is here. */
|
2004-12-11 03:31:25 +01:00
|
|
|
vvp_net_t*node;
|
2001-03-20 07:16:23 +01:00
|
|
|
};
|
2007-11-07 03:15:08 +01:00
|
|
|
extern unsigned vpip_size(__vpiSignal *sig);
|
2002-07-05 19:14:15 +02:00
|
|
|
extern vpiHandle vpip_make_int(const char*name, int msb, int lsb,
|
2004-12-11 03:31:25 +01:00
|
|
|
vvp_net_t*vec);
|
2002-07-05 19:14:15 +02:00
|
|
|
extern vpiHandle vpip_make_reg(const char*name, int msb, int lsb,
|
2004-12-11 03:31:25 +01:00
|
|
|
bool signed_flag, vvp_net_t*net);
|
2002-07-05 19:14:15 +02:00
|
|
|
extern vpiHandle vpip_make_net(const char*name, int msb, int lsb,
|
2004-12-11 03:31:25 +01:00
|
|
|
bool signed_flag, vvp_net_t*node);
|
2001-06-22 00:54:12 +02:00
|
|
|
|
2007-01-16 06:44:14 +01:00
|
|
|
/*
|
|
|
|
|
* This function safely converts a vpiHandle back to a
|
|
|
|
|
* __vpiSignal. Return a nil if the type is not appropriate.
|
|
|
|
|
*/
|
|
|
|
|
extern __vpiSignal* vpip_signal_from_handle(vpiHandle obj);
|
|
|
|
|
|
2005-07-06 06:29:25 +02:00
|
|
|
|
2007-11-06 04:58:20 +01:00
|
|
|
struct __vpiModPathTerm {
|
|
|
|
|
struct __vpiHandle base;
|
|
|
|
|
vpiHandle expr;
|
2007-12-14 05:42:06 +01:00
|
|
|
/* The value returned by vpi_get(vpiEdge, ...); */
|
|
|
|
|
int edge;
|
2007-11-06 04:58:20 +01:00
|
|
|
};
|
|
|
|
|
|
2007-09-11 00:30:00 +02:00
|
|
|
struct __vpiModPathSrc {
|
2007-11-06 04:58:20 +01:00
|
|
|
struct __vpiHandle base;
|
|
|
|
|
struct __vpiModPath *dest;
|
|
|
|
|
int type;
|
|
|
|
|
|
|
|
|
|
/* This is the input expression for this modpath. */
|
|
|
|
|
struct __vpiModPathTerm path_term_in;
|
2007-09-11 00:30:00 +02:00
|
|
|
|
2007-11-06 04:58:20 +01:00
|
|
|
/* This is the input net for the modpath. signals on this net
|
|
|
|
|
are used to determine the modpath. They are *not* propagated
|
|
|
|
|
anywhere. */
|
|
|
|
|
vvp_net_t *net;
|
2007-09-11 00:30:00 +02:00
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
* The vpiMoaPath vpiHandle will define
|
|
|
|
|
* a vpiModPath of record .modpath as defined
|
|
|
|
|
* in the IEEE 1364
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
struct __vpiModPath {
|
|
|
|
|
struct __vpiScope *scope ;
|
|
|
|
|
|
2007-10-31 04:14:40 +01:00
|
|
|
class vvp_fun_modpath*modpath;
|
|
|
|
|
|
2007-11-03 03:59:08 +01:00
|
|
|
struct __vpiModPathTerm path_term_out;
|
2007-09-11 00:30:00 +02:00
|
|
|
vvp_net_t *input_net ;
|
|
|
|
|
};
|
|
|
|
|
|
2007-11-03 03:59:08 +01:00
|
|
|
extern struct __vpiModPathTerm* vpip_modpath_term_from_handle(vpiHandle ref);
|
2007-10-31 04:14:40 +01:00
|
|
|
extern struct __vpiModPathSrc* vpip_modpath_src_from_handle(vpiHandle ref);
|
2007-09-11 00:30:00 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* The Function is used to create the vpiHandle
|
|
|
|
|
* for vpiModPath && vpiModPathIn objects
|
|
|
|
|
*/
|
|
|
|
|
|
2007-11-06 04:58:20 +01:00
|
|
|
extern struct __vpiModPathSrc* vpip_make_modpath_src (struct __vpiModPath*path_dest,
|
|
|
|
|
vvp_time64_t use_delay[12] ,
|
|
|
|
|
vvp_net_t *net ) ;
|
2007-09-11 00:30:00 +02:00
|
|
|
|
2007-11-06 04:58:20 +01:00
|
|
|
extern struct __vpiModPath* vpip_make_modpath(vvp_net_t *net) ;
|
2007-09-11 00:30:00 +02:00
|
|
|
|
|
|
|
|
|
2002-05-18 04:34:11 +02:00
|
|
|
/*
|
|
|
|
|
* These methods support the vpi creation of events. The name string
|
|
|
|
|
* passed in will be saved, so the caller must allocate it (or not
|
|
|
|
|
* free it) after it is handed to this function.
|
|
|
|
|
*/
|
2002-05-19 07:18:16 +02:00
|
|
|
struct __vpiNamedEvent {
|
|
|
|
|
struct __vpiHandle base;
|
|
|
|
|
/* base name of the event object */
|
2002-07-05 19:14:15 +02:00
|
|
|
const char*name;
|
2002-05-19 07:18:16 +02:00
|
|
|
/* Parent scope of this object. */
|
|
|
|
|
struct __vpiScope*scope;
|
2003-04-23 05:09:25 +02:00
|
|
|
/* The functor, used for %set operations. */
|
2004-12-11 03:31:25 +01:00
|
|
|
vvp_net_t*funct;
|
2002-05-19 07:18:16 +02:00
|
|
|
/* List of callbacks interested in this event. */
|
|
|
|
|
struct __vpiCallback*callbacks;
|
|
|
|
|
};
|
|
|
|
|
|
2004-12-11 03:31:25 +01:00
|
|
|
extern vpiHandle vpip_make_named_event(const char*name, vvp_net_t*f);
|
2002-05-19 07:18:16 +02:00
|
|
|
extern void vpip_run_named_event_callbacks(vpiHandle ref);
|
2003-02-10 06:20:10 +01:00
|
|
|
extern void vpip_real_value_change(struct __vpiCallback*cbh,
|
|
|
|
|
vpiHandle ref);
|
2002-05-18 04:34:11 +02:00
|
|
|
|
2001-05-09 01:59:33 +02:00
|
|
|
/*
|
|
|
|
|
* Memory is an array of bits that is accessible in N-bit chunks, with
|
|
|
|
|
* N being the width of a word. The memory word handle just points
|
|
|
|
|
* back to the memory and uses an index to identify its position in
|
|
|
|
|
* the memory.
|
|
|
|
|
*/
|
|
|
|
|
|
2005-03-03 05:33:10 +01:00
|
|
|
extern vpiHandle vpip_make_memory(vvp_memory_t mem, const char*name);
|
2006-03-05 06:45:58 +01:00
|
|
|
extern void vpip_memory_value_change(struct __vpiCallback*cbh,
|
|
|
|
|
vpiHandle ref);
|
|
|
|
|
|
|
|
|
|
extern void vpip_run_memory_value_change(vpiHandle ref, unsigned adr);
|
2001-05-09 01:59:33 +02:00
|
|
|
|
2003-01-26 00:48:05 +01:00
|
|
|
/*
|
|
|
|
|
* These are the various variable types.
|
|
|
|
|
*/
|
2005-07-06 06:29:25 +02:00
|
|
|
struct __vpiRealVar {
|
|
|
|
|
struct __vpiHandle base;
|
2007-12-03 18:44:31 +01:00
|
|
|
vpiHandle parent;
|
2007-08-17 00:13:25 +02:00
|
|
|
struct __vpiScope* scope;
|
2007-12-03 20:41:52 +01:00
|
|
|
/* The name of this variable, or the index for array words. */
|
|
|
|
|
union {
|
|
|
|
|
const char*name;
|
|
|
|
|
vpiHandle index;
|
|
|
|
|
} id;
|
2005-07-06 06:29:25 +02:00
|
|
|
vvp_net_t*net;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
extern vpiHandle vpip_make_real_var(const char*name, vvp_net_t*net);
|
2003-01-26 00:48:05 +01:00
|
|
|
|
2001-03-16 02:44:34 +01:00
|
|
|
/*
|
|
|
|
|
* When a loaded VPI module announces a system task/function, one
|
|
|
|
|
* __vpiUserSystf object is created to hold the definition of that
|
2001-05-20 02:46:12 +02:00
|
|
|
* task/function. The distinction between task and function is stored
|
|
|
|
|
* in the vpi_systf_data structure data that was supplied by the
|
|
|
|
|
* external module.
|
2001-03-16 02:44:34 +01:00
|
|
|
*
|
|
|
|
|
* When the compiler encounters a %vpi_call statement, it creates a
|
|
|
|
|
* __vpiSysTaskCall to represent that particular call. The call refers
|
|
|
|
|
* to the definition handle so that when the %vpi_call instruction is
|
|
|
|
|
* encountered at run-time, the definition can be located and used.
|
2001-05-20 02:46:12 +02:00
|
|
|
*
|
|
|
|
|
* The vpiSysTaskCall handles both functions and tasks, as the two are
|
|
|
|
|
* extremely similar. The different VPI type is reflected in a
|
|
|
|
|
* different vpi_type pointer in the base structure. The only
|
|
|
|
|
* additional part is the vbit/vwid that is used by the put of the
|
|
|
|
|
* system function call to place the values in the vthread bit space.
|
2001-03-16 02:44:34 +01:00
|
|
|
*/
|
|
|
|
|
struct __vpiUserSystf {
|
|
|
|
|
struct __vpiHandle base;
|
|
|
|
|
s_vpi_systf_data info;
|
|
|
|
|
};
|
|
|
|
|
|
2006-06-18 06:15:50 +02:00
|
|
|
extern struct __vpiUserSystf* vpip_find_systf(const char*name);
|
|
|
|
|
|
|
|
|
|
|
2001-03-16 02:44:34 +01:00
|
|
|
struct __vpiSysTaskCall {
|
|
|
|
|
struct __vpiHandle base;
|
2001-04-18 06:21:23 +02:00
|
|
|
struct __vpiScope* scope;
|
2001-03-16 02:44:34 +01:00
|
|
|
struct __vpiUserSystf*defn;
|
|
|
|
|
unsigned nargs;
|
|
|
|
|
vpiHandle*args;
|
2003-01-09 05:09:44 +01:00
|
|
|
/* Support for vpi_get_userdata. */
|
|
|
|
|
void*userdata;
|
2001-05-20 02:46:12 +02:00
|
|
|
/* These represent where in the vthread to put the return value. */
|
2003-06-17 21:17:42 +02:00
|
|
|
unsigned vbit;
|
|
|
|
|
signed vwid;
|
2006-06-18 06:15:50 +02:00
|
|
|
class vvp_net_t*fnet;
|
2001-03-16 02:44:34 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
extern struct __vpiSysTaskCall*vpip_cur_task;
|
|
|
|
|
|
2001-03-18 05:35:18 +01:00
|
|
|
/*
|
|
|
|
|
* These are implemented in vpi_const.cc. These are vpiHandles for
|
|
|
|
|
* constants.
|
2003-02-24 07:35:45 +01:00
|
|
|
*
|
|
|
|
|
* The persistent flag to vpip_make_string_const causes the created
|
|
|
|
|
* handle to be persistent. This is necessary for cases where the
|
|
|
|
|
* string handle may be reused, which is the normal case.
|
2001-03-18 05:35:18 +01:00
|
|
|
*/
|
|
|
|
|
struct __vpiStringConst {
|
|
|
|
|
struct __vpiHandle base;
|
2003-02-24 07:35:45 +01:00
|
|
|
char*value;
|
2007-02-26 00:08:24 +01:00
|
|
|
size_t value_len;
|
2001-03-18 05:35:18 +01:00
|
|
|
};
|
|
|
|
|
|
2003-02-24 07:35:45 +01:00
|
|
|
vpiHandle vpip_make_string_const(char*text, bool persistent =true);
|
2003-03-11 00:37:07 +01:00
|
|
|
vpiHandle vpip_make_string_param(char*name, char*value);
|
2001-03-18 05:35:18 +01:00
|
|
|
|
2001-04-02 02:24:30 +02:00
|
|
|
struct __vpiBinaryConst {
|
|
|
|
|
struct __vpiHandle base;
|
2006-03-06 06:43:15 +01:00
|
|
|
vvp_vector4_t bits;
|
2006-03-18 23:51:10 +01:00
|
|
|
/* TRUE if this constant is signed. */
|
|
|
|
|
int signed_flag :1;
|
|
|
|
|
/* TRUE if this constant has an explicit size (i.e. 19'h0 vs. 'h0) */
|
|
|
|
|
int sized_flag :1;
|
2001-04-02 02:24:30 +02:00
|
|
|
};
|
|
|
|
|
|
2007-04-12 06:25:58 +02:00
|
|
|
vpiHandle vpip_make_binary_const(unsigned wid, const char*bits);
|
2006-03-18 23:51:10 +01:00
|
|
|
vpiHandle vpip_make_binary_param(char*name, const vvp_vector4_t&bits,
|
|
|
|
|
bool signed_flag);
|
2001-03-18 05:35:18 +01:00
|
|
|
|
2002-01-31 05:28:17 +01:00
|
|
|
struct __vpiDecConst {
|
|
|
|
|
struct __vpiHandle base;
|
|
|
|
|
int value;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
vpiHandle vpip_make_dec_const(int value);
|
2002-05-17 06:12:19 +02:00
|
|
|
vpiHandle vpip_make_dec_const(struct __vpiDecConst*obj, int value);
|
2002-01-31 05:28:17 +01:00
|
|
|
|
2006-06-18 06:15:50 +02:00
|
|
|
struct __vpiRealConst {
|
|
|
|
|
struct __vpiHandle base;
|
|
|
|
|
double value;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
vpiHandle vpip_make_real_const(double value);
|
|
|
|
|
|
2001-05-10 02:26:53 +02:00
|
|
|
/*
|
2004-10-04 03:10:51 +02:00
|
|
|
* This one looks like a constant, but really is a vector in the current
|
|
|
|
|
* thread.
|
2001-05-10 02:26:53 +02:00
|
|
|
*/
|
|
|
|
|
|
2002-04-14 04:56:19 +02:00
|
|
|
vpiHandle vpip_make_vthr_vector(unsigned base, unsigned wid, bool signed_flag);
|
2001-05-10 02:26:53 +02:00
|
|
|
|
2003-01-26 19:16:22 +01:00
|
|
|
vpiHandle vpip_make_vthr_word(unsigned base, const char*type);
|
|
|
|
|
|
2001-03-16 02:44:34 +01:00
|
|
|
/*
|
|
|
|
|
* This function is called before any compilation to load VPI
|
|
|
|
|
* modules. This gives the modules a chance to announce their
|
|
|
|
|
* contained functions before compilation commences. It is called only
|
2001-07-26 05:13:51 +02:00
|
|
|
* once per module.
|
2001-03-16 02:44:34 +01:00
|
|
|
*/
|
2001-07-26 05:13:51 +02:00
|
|
|
extern void vpip_load_module(const char*name);
|
|
|
|
|
|
|
|
|
|
# define VPIP_MODULE_PATH_MAX 64
|
2001-07-30 04:44:05 +02:00
|
|
|
extern const char* vpip_module_path[64];
|
2001-07-26 05:13:51 +02:00
|
|
|
extern unsigned vpip_module_path_cnt;
|
2001-03-16 02:44:34 +01:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* The vpip_build_vpi_call function creates a __vpiSysTaskCall object
|
|
|
|
|
* and returns the handle. The compiler uses this function when it
|
2004-06-30 05:00:36 +02:00
|
|
|
* encounters a %vpi_call or %vpi_func statement.
|
2001-03-16 02:44:34 +01:00
|
|
|
*
|
|
|
|
|
* The %vpi_call instruction has as its only parameter the handle that
|
|
|
|
|
* is returned by the vpip_build_vpi_call. This includes all the
|
|
|
|
|
* information needed by vpip_execute_vpi_call to actually execute the
|
2001-03-18 05:35:18 +01:00
|
|
|
* call. However, the vpiSysTaskCall that is the returned handle,
|
|
|
|
|
* holds a parameter argument list that is passed in here.
|
|
|
|
|
*
|
2001-05-20 02:46:12 +02:00
|
|
|
* The vbit and vwid fields are used if this turns out to be a system
|
|
|
|
|
* function. In that case, the vbit and vwid are used to address the
|
2004-06-30 05:00:36 +02:00
|
|
|
* vector in thread bit space where the result is supposed to go.
|
2001-05-20 02:46:12 +02:00
|
|
|
*
|
|
|
|
|
* Note that the argv array is saved in the handle, and should should
|
|
|
|
|
* not be released by the caller.
|
2001-03-16 02:44:34 +01:00
|
|
|
*/
|
2001-03-18 05:35:18 +01:00
|
|
|
extern vpiHandle vpip_build_vpi_call(const char*name,
|
2003-01-27 01:14:37 +01:00
|
|
|
unsigned vbit, int vwid,
|
2006-06-18 06:15:50 +02:00
|
|
|
class vvp_net_t*fnet,
|
2001-03-18 05:35:18 +01:00
|
|
|
unsigned argc,
|
|
|
|
|
vpiHandle*argv);
|
2001-03-16 02:44:34 +01:00
|
|
|
|
2001-05-10 02:26:53 +02:00
|
|
|
extern vthread_t vpip_current_vthread;
|
|
|
|
|
|
|
|
|
|
extern void vpip_execute_vpi_call(vthread_t thr, vpiHandle obj);
|
2001-03-16 02:44:34 +01:00
|
|
|
|
|
|
|
|
|
2001-03-18 01:37:55 +01:00
|
|
|
/*
|
|
|
|
|
* These are functions used by the compiler to prepare for compilation
|
|
|
|
|
* and to finish compilation in preparation for execution.
|
|
|
|
|
*/
|
|
|
|
|
|
2002-12-21 01:55:57 +01:00
|
|
|
vpiHandle vpip_sim_time(struct __vpiScope*scope);
|
2003-02-01 06:50:04 +01:00
|
|
|
vpiHandle vpip_sim_realtime(struct __vpiScope*scope);
|
2001-03-31 21:00:43 +02:00
|
|
|
|
2001-07-01 01:03:16 +02:00
|
|
|
extern int vpip_get_time_precision(void);
|
|
|
|
|
extern void vpip_set_time_precision(int pres);
|
|
|
|
|
|
2003-05-02 06:29:57 +02:00
|
|
|
extern int vpip_time_units_from_handle(vpiHandle obj);
|
2007-09-28 20:21:08 +02:00
|
|
|
extern int vpip_time_precision_from_handle(vpiHandle obj);
|
2003-05-02 06:29:57 +02:00
|
|
|
|
2002-04-20 06:33:23 +02:00
|
|
|
extern void vpip_time_to_timestruct(struct t_vpi_time*ts, vvp_time64_t ti);
|
|
|
|
|
extern vvp_time64_t vpip_timestruct_to_time(const struct t_vpi_time*ts);
|
|
|
|
|
|
2007-11-11 04:54:21 +01:00
|
|
|
extern double vpip_time_to_scaled_real(vvp_time64_t ti, struct __vpiScope*sc);
|
|
|
|
|
extern vvp_time64_t vpip_scaled_real_to_time64(double val, struct __vpiScope*sc);
|
|
|
|
|
|
2003-03-06 05:32:00 +01:00
|
|
|
/*
|
|
|
|
|
* These functions are used mostly as compile time to strings into
|
|
|
|
|
* permallocated memory. The vpip_string function is the most general,
|
|
|
|
|
* it allocates a fresh string no matter what. The vpip_name_string
|
|
|
|
|
* allocates a string and keeps a pointer in the hash, and tries to
|
|
|
|
|
* reuse it if it can. This us useful for handle names, which may be
|
|
|
|
|
* reused in different scopes.
|
|
|
|
|
*/
|
2002-07-05 19:14:15 +02:00
|
|
|
extern const char* vpip_string(const char*str);
|
2003-03-06 05:32:00 +01:00
|
|
|
extern const char* vpip_name_string(const char*str);
|
2002-01-06 18:50:50 +01:00
|
|
|
|
|
|
|
|
|
2002-02-03 02:01:51 +01:00
|
|
|
/*
|
|
|
|
|
* This function is used to make decimal string versions of various
|
|
|
|
|
* vectors. The input format is an array of bit values (0, 1, 2, 3)
|
|
|
|
|
* lsb first, and the result is written into buf, without overflowing
|
|
|
|
|
* nbuf.
|
|
|
|
|
*/
|
|
|
|
|
extern unsigned vpip_bits_to_dec_str(const unsigned char *bits,
|
|
|
|
|
unsigned int nbits,
|
|
|
|
|
char *buf, unsigned int nbuf,
|
|
|
|
|
int signed_flag);
|
2006-02-21 03:39:27 +01:00
|
|
|
extern unsigned vpip_vec4_to_dec_str(const vvp_vector4_t&vec4,
|
|
|
|
|
char *buf, unsigned int nbuf,
|
|
|
|
|
int signed_flag);
|
2002-05-11 06:39:35 +02:00
|
|
|
|
2006-02-21 06:31:54 +01:00
|
|
|
extern void vpip_bin_str_to_vec4(vvp_vector4_t&val,
|
2002-05-11 06:39:35 +02:00
|
|
|
const char*buf, bool signed_flag);
|
|
|
|
|
|
2005-06-13 02:54:04 +02:00
|
|
|
extern void vpip_vec4_to_hex_str(const vvp_vector4_t&bits, char*buf,
|
|
|
|
|
unsigned nbuf, bool signed_flag);
|
2002-05-11 06:39:35 +02:00
|
|
|
|
|
|
|
|
extern void vpip_bits_to_oct_str(const unsigned char*bits, unsigned nbits,
|
|
|
|
|
char*buf, unsigned nbuf, bool signed_flag);
|
2005-06-13 02:54:04 +02:00
|
|
|
extern void vpip_vec4_to_oct_str(const vvp_vector4_t&bits, char*buf,
|
|
|
|
|
unsigned nbuf, bool signed_flag);
|
2002-05-11 06:39:35 +02:00
|
|
|
|
2006-02-21 03:39:27 +01:00
|
|
|
extern void vpip_oct_str_to_vec4(vvp_vector4_t&val, const char*str);
|
|
|
|
|
extern void vpip_dec_str_to_vec4(vvp_vector4_t&val, const char*str, bool sign);
|
|
|
|
|
extern void vpip_hex_str_to_vec4(vvp_vector4_t&val, const char*str);
|
|
|
|
|
|
2006-03-06 06:43:15 +01:00
|
|
|
extern void vpip_vec4_get_value(const vvp_vector4_t&word_val, unsigned width,
|
|
|
|
|
bool signed_flag, s_vpi_value*vp);
|
2002-05-11 06:39:35 +02:00
|
|
|
|
2002-07-09 05:24:37 +02:00
|
|
|
/*
|
|
|
|
|
* Function defined in vpi_signal.cc to manage vpi_get_* persistent
|
|
|
|
|
* storage.
|
|
|
|
|
*/
|
|
|
|
|
enum vpi_rbuf_t {
|
|
|
|
|
RBUF_VAL =0,
|
|
|
|
|
/* Storage for *_get_value() */
|
|
|
|
|
RBUF_STR
|
|
|
|
|
/* Storage for *_get_str() */
|
|
|
|
|
};
|
2004-10-04 03:10:51 +02:00
|
|
|
extern char *need_result_buf(unsigned cnt, vpi_rbuf_t type);
|
2007-12-19 00:11:50 +01:00
|
|
|
/* following two routines use need_result_buf(, RBUF_STR) */
|
|
|
|
|
extern char *simple_set_rbuf_str(const char *s1);
|
|
|
|
|
extern char *generic_get_str(int code, vpiHandle ref, const char *name, const char *index);
|
2002-07-09 05:24:37 +02:00
|
|
|
|
2001-03-16 02:44:34 +01:00
|
|
|
#endif
|