From bee3acfd123a1b379466e8e33c81869145254a08 Mon Sep 17 00:00:00 2001 From: steve Date: Thu, 19 Dec 2002 21:37:04 +0000 Subject: [PATCH] Add tf_message, tf_get/setworkarea, and ty_typep functions, along with defines related to these functions. --- libveriuser/Makefile.in | 4 +- libveriuser/io_print.c | 23 ++++++- libveriuser/typep.c | 82 ++++++++++++++++++++++++ libveriuser/workarea.c | 94 ++++++++++++++++++++++++++++ veriuser.h | 135 +++++++++++++++++++++++++++++++++++++++- 5 files changed, 334 insertions(+), 4 deletions(-) create mode 100644 libveriuser/typep.c create mode 100644 libveriuser/workarea.c diff --git a/libveriuser/Makefile.in b/libveriuser/Makefile.in index bdfbaafe7..bf77bf703 100644 --- a/libveriuser/Makefile.in +++ b/libveriuser/Makefile.in @@ -16,7 +16,7 @@ # 59 Temple Place - Suite 330 # Boston, MA 02111-1307, USA # -#ident "$Id: Makefile.in,v 1.14 2002/06/11 15:19:12 steve Exp $" +#ident "$Id: Makefile.in,v 1.15 2002/12/19 21:37:04 steve Exp $" # # SHELL = /bin/sh @@ -50,7 +50,7 @@ a_initialize.o a_next_topmod.o a_object_of_type.o a_product_version.o \ a_set_value.o a_version.o O = asynch.o finish.o getcstringp.o getinstance.o getlongp.o \ getp.o getsimtime.o io_print.o mc_scan_plusargs.o nump.o putlongp.o \ -putp.o veriusertfs.o $A +putp.o typep.o workarea.o veriusertfs.o $A all: libveriuser.a diff --git a/libveriuser/io_print.c b/libveriuser/io_print.c index 003e14209..575f6bfc5 100644 --- a/libveriuser/io_print.c +++ b/libveriuser/io_print.c @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: io_print.c,v 1.3 2002/08/12 01:35:02 steve Exp $" +#ident "$Id: io_print.c,v 1.4 2002/12/19 21:37:04 steve Exp $" #endif # include @@ -56,8 +56,29 @@ void tf_error(const char *fmt, ...) va_end(ap); } +PLI_INT32 tf_message(PLI_INT32 level, char*facility, + char*messno, char*fmt, ...) +{ + va_list ap; + + vpi_printf("%s[%s] ", facility, messno); + + va_start(ap, fmt); + vpi_vprintf(fmt, ap); + va_end(ap); + + vpi_printf("\n"); + return 0; +} + + /* * $Log: io_print.c,v $ + * Revision 1.4 2002/12/19 21:37:04 steve + * Add tf_message, tf_get/setworkarea, and + * ty_typep functions, along with defines + * related to these functions. + * * Revision 1.3 2002/08/12 01:35:02 steve * conditional ident string using autoconfig. * diff --git a/libveriuser/typep.c b/libveriuser/typep.c new file mode 100644 index 000000000..e7c3e9a4c --- /dev/null +++ b/libveriuser/typep.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2002 Stephen Williams (steve@icarus.com) + * + * 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 + */ +#ifdef HAVE_CVS_IDENT +#ident "$Id: typep.c,v 1.1 2002/12/19 21:37:04 steve Exp $" +#endif + +#include +#include +#include + +PLI_INT32 tf_typep(PLI_INT32 narg) +{ + vpiHandle sys_h, argv, arg_h = 0; + s_vpi_value value; + int rtn; + + assert(narg > 0); + + /* get task/func handle */ + sys_h = vpi_handle(vpiSysTfCall, 0); + argv = vpi_iterate(vpiArgument, sys_h); + + /* find nth arg */ + while (narg > 0) { + /* Watch that the argument is not out of range. */ + if (!(arg_h = vpi_scan(argv))) + return TF_NULLPARAM; + narg -= 1; + } + + switch (vpi_get(vpiType, arg_h)) { + case vpiConstant: + switch (vpi_get(vpiConstType, arg_h)) { + case vpiStringConst: + rtn = TF_STRING; + break; + default: + rtn = TF_READONLY; + break; + } + break; + + case vpiIntegerVar: + case vpiReg: + case vpiMemoryWord: + rtn = TF_READWRITE; + break; + + default: + rtn = TF_READONLY; + break; + } + + vpi_free_object(argv); + return rtn; +} + +/* + * $Log: typep.c,v $ + * Revision 1.1 2002/12/19 21:37:04 steve + * Add tf_message, tf_get/setworkarea, and + * ty_typep functions, along with defines + * related to these functions. + * + */ + diff --git a/libveriuser/workarea.c b/libveriuser/workarea.c new file mode 100644 index 000000000..ec2a36ed9 --- /dev/null +++ b/libveriuser/workarea.c @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2002 Stephen Williams (steve@icarus.com) + * + * 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 + */ +#ifdef HAVE_CVS_IDENT +#ident "$Id: workarea.c,v 1.1 2002/12/19 21:37:04 steve Exp $" +#endif + +# include +# include +# include +#ifdef HAVE_MALLOC_H +# include +#endif + +/* + * Keep a list of sys handle to work area bindings. + */ +struct workarea_cell { + vpiHandle sys; + void* area; + struct workarea_cell*next; +}; + +static struct workarea_cell*area_list = 0; + +PLI_INT32 tf_setworkarea(void*workarea) +{ + vpiHandle sys; + struct workarea_cell*cur; + + sys = vpi_handle(vpiSysTfCall, 0); + cur = area_list; + + while (cur) { + if (cur->sys == sys) { + cur->area = workarea; + return 0; + } + + cur = cur->next; + } + + cur = calloc(1, sizeof (struct workarea_cell)); + cur->next = area_list; + cur->sys = sys; + cur->area = workarea; + area_list = cur; + + return 0; +} + +PLI_BYTE8* tf_getworkarea(void) +{ + struct workarea_cell*cur; + vpiHandle sys; + + sys = vpi_handle(vpiSysTfCall, 0); + cur = area_list; + + while (cur) { + if (cur->sys == sys) { + return cur->area; + } + + cur = cur->next; + } + + return 0; +} + +/* + * $Log: workarea.c,v $ + * Revision 1.1 2002/12/19 21:37:04 steve + * Add tf_message, tf_get/setworkarea, and + * ty_typep functions, along with defines + * related to these functions. + * + */ + diff --git a/veriuser.h b/veriuser.h index 9008ca9f0..1989842d5 100644 --- a/veriuser.h +++ b/veriuser.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: veriuser.h,v 1.17 2002/08/12 01:35:01 steve Exp $" +#ident "$Id: veriuser.h,v 1.18 2002/12/19 21:37:04 steve Exp $" #endif /* @@ -56,6 +56,47 @@ EXTERN_C_START +#ifndef PLI_TYPES +#define PLI_TYPES +typedef signed int PLI_INT32; +typedef unsigned int PLI_UINT32; +typedef signed short PLI_INT16; +typedef unsigned short PLI_UINT12; +typedef signed char PLI_BYTE8; +typedef unsigned char PLI_UBYTE8; +#endif + +/* + * defines for tf_message + */ +#define ERR_MESSAGE 1 +#define ERR_WARNING 2 +#define ERR_ERROR 3 +#define ERR_INTERNAL 4 +#define ERR_SYSTEM 5 + +/* + * These are some defines for backwards compatibility. They should not + * be used in new code. + */ +#ifndef TRUE +# define TRUE 1 +#endif +#ifndef FALSE +# define FALSE 0 +#endif +#ifndef __cplusplus +# ifndef true +# define true 1 +# endif +# ifndef false +# define false 0 +# endif +# ifndef bool +# define bool int +# endif +#endif + /* * structure for veriusertfs array */ @@ -74,6 +115,20 @@ typedef struct t_tfcell char reserved[20]; /* reserved */ } s_tfcell, *p_tfcell; +/* + * Normal PLI1.0 modules export a veriusertfs array that contains all + * the function definitions for use by the simulator. The user code is + * expected to supply that array. + * + * However, Icarus Verilog doesn't normally look for the veriusertfs + * array, it instead looks for the vlog_startup_routines array, as + * declared in vpi_user.h. So the veriuser library includes the + * veriusertfs_register function that can be used to do the PLI 1.0 + * setup. Create a vlog_startup_routines table like this if you are + * just interested in making your PLI1 functions work: + * + * void (*vlog_startup_routines[])() = { &veriusertfs_register }; + */ extern s_tfcell veriusertfs[]; extern void veriusertfs_register(); @@ -88,6 +143,64 @@ extern void veriusertfs_register(); #define reason_finish 9 #define reason_endofcompile 16 +/* These are values returned by tf_typep */ +#define tf_nullparam 0 +#define TF_NULLPARAM tf_nullparam +#define tf_string 1 +#define TF_STRING tf_string +#define tf_readonly 10 +#define TF_READONLY tf_readonly +#define tf_readwrite 11 +#define TF_READWRITE tf_readwrite +#define tf_rwbitselect 12 +#define TF_RWBITSELECT tf_rwbitselect +#define tf_rwpartselect 13 +#define TF_RWPARTSELECT tf_rwpartselect +#define tf_rwmemselect 14 +#define TF_RWMEMSELECT tf_rwmemselect +#define tf_readonlyreal 15 +#define TF_READONLYREAL tf_readonlyreal +#define tf_readwritereal 16 +#define TF_READWRITEREAD tf_readwritereal + +typedef struct t_tfnodeinfo { + PLI_INT16 node_type; + PLI_INT16 padding; + union { + struct t_vecval *vecval_p; + struct t_strengthval *strengthval_p; + PLI_BYTE8 *memoryval_p; + double *read_value_p; + } node_value; + char* node_symbol; + PLI_INT32 node_ngroups; + PLI_INT32 node_vec_size; + PLI_INT32 node_sign; + PLI_INT32 node_ms_index; + PLI_INT32 node_ls_index; + PLI_INT32 node_mem_size; + PLI_INT32 node_lhs_element; + PLI_INT32 node_rhs_element; + PLI_INT32*node_handle; +} s_tfnodeinfo, *p_tfnodeinfo; + +/* values used in the node_type of the tfnodeinfo structure. */ +#define tf_null_node 100 +#define TF_NULL_NODE tf_null_node +#define tf_reg_node 101 +#define TF_REG_NODE tf_reg_node +#define tf_integer_node 102 +#define TF_INTEGER_NODE tf_integer_node +#define tf_time_node 103 +#define TF_TIME_NODE tf_time_node +#define tf_netvector_node 104 +#define TF_NETVECTOR_NODE tf_netvector_node +#define tf_netscalar_node 105 +#define TF_NETSCALAR_NODE tf_netscalar_node +#define tf_memory_node 106 +#define TF_MEMORY_NODE tf_memory_node +#define tf_real_node 107 +#define TF_REAL_NODE tf_real_node /* Extern functions from the library. */ extern void io_printf (const char *, ...) @@ -114,6 +227,12 @@ extern int tf_getlongtime(int*high_bits); extern int tf_getp(int pnum); +extern PLI_BYTE8* tf_getworkarea(void); + +extern PLI_INT32 tf_message(PLI_INT32 level, char*facility, + char*messno, char*fmt, ...) + __attribute__((format (printf,4,5))); + extern int tf_nump(void); /* IEEE1364 NOTE: tf_putlongp is listed as returning in in the header @@ -123,6 +242,15 @@ extern void tf_putlongp(int pnum, int lowvalue, int highvalue); extern void tf_putp(int pnum, int value); +/* IEEE1364 NOTE: tf_setworkarea is listed as taking a PLI_BYTE8*, but + that is silly, it really takes any kind of pointer. Taking void* is + compatible with those who pass a PLI_BYTE8*. */ +extern PLI_INT32 tf_setworkarea(void*workarea); + +extern char* tf_spname(void); + +extern PLI_INT32 tf_typep(PLI_INT32 narg); + extern void tf_warning(const char*, ...) __attribute__((format (printf,1,2))); @@ -130,6 +258,11 @@ EXTERN_C_END /* * $Log: veriuser.h,v $ + * Revision 1.18 2002/12/19 21:37:04 steve + * Add tf_message, tf_get/setworkarea, and + * ty_typep functions, along with defines + * related to these functions. + * * Revision 1.17 2002/08/12 01:35:01 steve * conditional ident string using autoconfig. *