Merge pull request #1309 from caryr/v13-branch

V13 branch
This commit is contained in:
Cary R. 2026-03-09 18:38:59 -07:00 committed by GitHub
commit d1cbaf08d2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 82 additions and 210 deletions

66
aclocal.m4 vendored
View File

@ -285,7 +285,7 @@ echo "timestamp for $_config_header" > `AS_DIRNAME(["$_config_header"])`/[]$_sta
# and this notice are preserved. This file is offered as-is, without any # and this notice are preserved. This file is offered as-is, without any
# warranty. # warranty.
#serial 18 #serial 26
AU_ALIAS([AC_PROG_CC_FOR_BUILD], [AX_PROG_CC_FOR_BUILD]) AU_ALIAS([AC_PROG_CC_FOR_BUILD], [AX_PROG_CC_FOR_BUILD])
AC_DEFUN([AX_PROG_CC_FOR_BUILD], [dnl AC_DEFUN([AX_PROG_CC_FOR_BUILD], [dnl
@ -296,14 +296,16 @@ AC_REQUIRE([AC_CANONICAL_BUILD])dnl
dnl Use the standard macros, but make them use other variable names dnl Use the standard macros, but make them use other variable names
dnl dnl
pushdef([ac_cv_prog_CPP], ac_cv_build_prog_CPP)dnl pushdef([ac_cv_prog_CPP], ac_cv_build_prog_CPP)dnl
pushdef([ac_cv_prog_cc_c89], ac_cv_build_prog_cc_c89)dnl
pushdef([ac_cv_prog_gcc], ac_cv_build_prog_gcc)dnl pushdef([ac_cv_prog_gcc], ac_cv_build_prog_gcc)dnl
pushdef([ac_cv_prog_cc_c89], ac_cv_build_prog_cc_c89)dnl
pushdef([ac_cv_prog_cc_c99], ac_cv_build_prog_cc_c99)dnl
pushdef([ac_cv_prog_cc_c11], ac_cv_build_prog_cc_c11)dnl
pushdef([ac_cv_prog_cc_c23], ac_cv_build_prog_cc_c23)dnl
pushdef([ac_cv_prog_cc_stdc], ac_cv_build_prog_cc_stdc)dnl
pushdef([ac_cv_prog_cc_works], ac_cv_build_prog_cc_works)dnl pushdef([ac_cv_prog_cc_works], ac_cv_build_prog_cc_works)dnl
pushdef([ac_cv_prog_cc_cross], ac_cv_build_prog_cc_cross)dnl pushdef([ac_cv_prog_cc_cross], ac_cv_build_prog_cc_cross)dnl
pushdef([ac_cv_prog_cc_g], ac_cv_build_prog_cc_g)dnl pushdef([ac_cv_prog_cc_g], ac_cv_build_prog_cc_g)dnl
pushdef([ac_cv_c_compiler_gnu], ac_cv_build_c_compiler_gnu)dnl pushdef([ac_prog_cc_stdc], ac_build_prog_cc_stdc)dnl
pushdef([ac_cv_exeext], ac_cv_build_exeext)dnl
pushdef([ac_cv_objext], ac_cv_build_objext)dnl
pushdef([ac_exeext], ac_build_exeext)dnl pushdef([ac_exeext], ac_build_exeext)dnl
pushdef([ac_objext], ac_build_objext)dnl pushdef([ac_objext], ac_build_objext)dnl
pushdef([CC], CC_FOR_BUILD)dnl pushdef([CC], CC_FOR_BUILD)dnl
@ -311,9 +313,7 @@ pushdef([CPP], CPP_FOR_BUILD)dnl
pushdef([GCC], GCC_FOR_BUILD)dnl pushdef([GCC], GCC_FOR_BUILD)dnl
pushdef([CFLAGS], CFLAGS_FOR_BUILD)dnl pushdef([CFLAGS], CFLAGS_FOR_BUILD)dnl
pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl
pushdef([EXEEXT], BUILD_EXEEXT)dnl
pushdef([LDFLAGS], LDFLAGS_FOR_BUILD)dnl pushdef([LDFLAGS], LDFLAGS_FOR_BUILD)dnl
pushdef([OBJEXT], BUILD_OBJEXT)dnl
pushdef([host], build)dnl pushdef([host], build)dnl
pushdef([host_alias], build_alias)dnl pushdef([host_alias], build_alias)dnl
pushdef([host_cpu], build_cpu)dnl pushdef([host_cpu], build_cpu)dnl
@ -328,6 +328,32 @@ pushdef([ac_tool_prefix], ac_build_tool_prefix)dnl
pushdef([am_cv_CC_dependencies_compiler_type], am_cv_build_CC_dependencies_compiler_type)dnl pushdef([am_cv_CC_dependencies_compiler_type], am_cv_build_CC_dependencies_compiler_type)dnl
pushdef([am_cv_prog_cc_c_o], am_cv_build_prog_cc_c_o)dnl pushdef([am_cv_prog_cc_c_o], am_cv_build_prog_cc_c_o)dnl
pushdef([cross_compiling], cross_compiling_build)dnl pushdef([cross_compiling], cross_compiling_build)dnl
dnl
dnl These variables are problematic to rename by M4 macros, so we save
dnl their values in alternative names, and restore the values later.
dnl
dnl _AC_COMPILER_EXEEXT and _AC_COMPILER_OBJEXT internally call
dnl AC_SUBST which prevents the renaming of EXEEXT and OBJEXT
dnl variables. It's not a good idea to rename ac_cv_exeext and
dnl ac_cv_objext either as they're related.
dnl Renaming ac_exeext and ac_objext is safe though.
dnl
ac_cv_host_exeext=$ac_cv_exeext
AS_VAR_SET_IF([ac_cv_build_exeext],
[ac_cv_exeext=$ac_cv_build_exeext],
[AS_UNSET([ac_cv_exeext])])
ac_cv_host_objext=$ac_cv_objext
AS_VAR_SET_IF([ac_cv_build_objext],
[ac_cv_objext=$ac_cv_build_objext],
[AS_UNSET([ac_cv_objext])])
dnl
dnl ac_cv_c_compiler_gnu is used in _AC_LANG_COMPILER_GNU (called by
dnl AC_PROG_CC) indirectly.
dnl
ac_cv_host_c_compiler_gnu=$ac_cv_c_compiler_gnu
AS_VAR_SET_IF([ac_cv_build_c_compiler_gnu],
[ac_cv_c_compiler_gnu=$ac_cv_build_c_compiler_gnu],
[AS_UNSET([ac_cv_c_compiler_gnu])])
cross_compiling_build=no cross_compiling_build=no
@ -341,6 +367,9 @@ _AC_COMPILER_EXEEXT
_AC_COMPILER_OBJEXT _AC_COMPILER_OBJEXT
AC_PROG_CPP AC_PROG_CPP
BUILD_EXEEXT=$ac_cv_exeext
BUILD_OBJEXT=$ac_cv_objext
dnl Restore the old definitions dnl Restore the old definitions
dnl dnl
popdef([cross_compiling])dnl popdef([cross_compiling])dnl
@ -357,9 +386,7 @@ popdef([host_vendor])dnl
popdef([host_cpu])dnl popdef([host_cpu])dnl
popdef([host_alias])dnl popdef([host_alias])dnl
popdef([host])dnl popdef([host])dnl
popdef([OBJEXT])dnl
popdef([LDFLAGS])dnl popdef([LDFLAGS])dnl
popdef([EXEEXT])dnl
popdef([CPPFLAGS])dnl popdef([CPPFLAGS])dnl
popdef([CFLAGS])dnl popdef([CFLAGS])dnl
popdef([GCC])dnl popdef([GCC])dnl
@ -367,25 +394,34 @@ popdef([CPP])dnl
popdef([CC])dnl popdef([CC])dnl
popdef([ac_objext])dnl popdef([ac_objext])dnl
popdef([ac_exeext])dnl popdef([ac_exeext])dnl
popdef([ac_cv_objext])dnl popdef([ac_prog_cc_stdc])dnl
popdef([ac_cv_exeext])dnl
popdef([ac_cv_c_compiler_gnu])dnl
popdef([ac_cv_prog_cc_g])dnl popdef([ac_cv_prog_cc_g])dnl
popdef([ac_cv_prog_cc_cross])dnl popdef([ac_cv_prog_cc_cross])dnl
popdef([ac_cv_prog_cc_works])dnl popdef([ac_cv_prog_cc_works])dnl
popdef([ac_cv_prog_cc_stdc])dnl
popdef([ac_cv_prog_cc_c23])dnl
popdef([ac_cv_prog_cc_c11])dnl
popdef([ac_cv_prog_cc_c99])dnl
popdef([ac_cv_prog_cc_c89])dnl popdef([ac_cv_prog_cc_c89])dnl
popdef([ac_cv_prog_gcc])dnl popdef([ac_cv_prog_gcc])dnl
popdef([ac_cv_prog_CPP])dnl popdef([ac_cv_prog_CPP])dnl
dnl
ac_cv_exeext=$ac_cv_host_exeext
EXEEXT=$ac_cv_host_exeext
ac_cv_objext=$ac_cv_host_objext
OBJEXT=$ac_cv_host_objext
ac_cv_c_compiler_gnu=$ac_cv_host_c_compiler_gnu
ac_compiler_gnu=$ac_cv_host_c_compiler_gnu
dnl restore global variables ac_ext, ac_cpp, ac_compile, dnl restore global variables ac_ext, ac_cpp, ac_compile,
dnl ac_link, ac_compiler_gnu (dependant on the current dnl ac_link, ac_compiler_gnu (dependent on the current
dnl language after popping): dnl language after popping):
AC_LANG_POP([C]) AC_LANG_POP([C])
dnl Finally, set Makefile variables dnl Finally, set Makefile variables
dnl dnl
AC_SUBST(BUILD_EXEEXT)dnl AC_SUBST([BUILD_EXEEXT])dnl
AC_SUBST(BUILD_OBJEXT)dnl AC_SUBST([BUILD_OBJEXT])dnl
AC_SUBST([CFLAGS_FOR_BUILD])dnl AC_SUBST([CFLAGS_FOR_BUILD])dnl
AC_SUBST([CPPFLAGS_FOR_BUILD])dnl AC_SUBST([CPPFLAGS_FOR_BUILD])dnl
AC_SUBST([LDFLAGS_FOR_BUILD])dnl AC_SUBST([LDFLAGS_FOR_BUILD])dnl

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003-2010 Stephen Williams (steve@icarus.com) * Copyright (c) 2003-2026 Stephen Williams (steve@icarus.com)
* *
* This source code is free software; you can redistribute it * This source code is free software; you can redistribute it
* and/or modify it in source code form under the terms of the GNU * and/or modify it in source code form under the terms of the GNU
@ -53,7 +53,7 @@ static void thunker_register(void)
strncpy(module, cp, bp-cp); strncpy(module, cp, bp-cp);
module[bp-cp] = 0; module[bp-cp] = 0;
mod = ivl_dlopen(module); mod = ivl_dlopen(module, false);
if (mod == 0) { if (mod == 0) {
vpi_printf("%s link: %s\n", vlog_info.argv[idx], dlerror()); vpi_printf("%s link: %s\n", vlog_info.argv[idx], dlerror());
free(module); free(module);

View File

@ -1,94 +0,0 @@
#ifndef IVL_ivl_dlfcn_H
#define IVL_ivl_dlfcn_H
/*
* Copyright (c) 2001-2014 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#if defined(__MINGW32__)
# include <windows.h>
# include <stdio.h>
typedef void * ivl_dll_t;
#elif defined(HAVE_DLFCN_H)
# include <dlfcn.h>
typedef void* ivl_dll_t;
#elif defined(HAVE_DL_H)
# include <dl.h>
typedef shl_t ivl_dll_t;
#endif
#if defined(__MINGW32__)
static __inline__ ivl_dll_t ivl_dlopen(const char *name)
{ return (void *)LoadLibrary(name); }
static __inline__ void *ivl_dlsym(ivl_dll_t dll, const char *nm)
{ return (void *)GetProcAddress((HINSTANCE)dll,nm);}
static __inline__ void ivl_dlclose(ivl_dll_t dll)
{ (void)FreeLibrary((HINSTANCE)dll);}
static __inline__ const char *dlerror(void)
{
static char msg[256];
unsigned long err = GetLastError();
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
err,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &msg,
sizeof(msg) - 1,
NULL
);
return msg;
}
#elif defined(HAVE_DLFCN_H)
static __inline__ ivl_dll_t ivl_dlopen(const char*name)
{ return dlopen(name,RTLD_LAZY); }
static __inline__ void* ivl_dlsym(ivl_dll_t dll, const char*nm)
{
void*sym = dlsym(dll, nm);
/* Not found? try without the leading _ */
if (sym == 0 && nm[0] == '_')
sym = dlsym(dll, nm+1);
return sym;
}
static __inline__ void ivl_dlclose(ivl_dll_t dll)
{ dlclose(dll); }
#elif defined(HAVE_DL_H)
static __inline__ ivl_dll_t ivl_dlopen(const char*name)
{ return shl_load(name, BIND_IMMEDIATE, 0); }
static __inline__ void* ivl_dlsym(ivl_dll_t dll, const char*nm)
{
void*sym;
int rc = shl_findsym(&dll, nm, TYPE_PROCEDURE, &sym);
return (rc == 0) ? sym : 0;
}
static __inline__ void ivl_dlclose(ivl_dll_t dll)
{ shl_unload(dll); }
static __inline__ const char*dlerror(void)
{ return strerror( errno ); }
#endif
#endif /* IVL_ivl_dlfcn_H */

View File

@ -1,7 +1,7 @@
#ifndef IVL_ivl_dlfcn_H #ifndef IVL_ivl_dlfcn_H
#define IVL_ivl_dlfcn_H #define IVL_ivl_dlfcn_H
/* /*
* Copyright (c) 2001-2014 Stephen Williams (steve@icarus.com) * Copyright (c) 2001-2026 Stephen Williams (steve@icarus.com)
* *
* This source code is free software; you can redistribute it * This source code is free software; you can redistribute it
* and/or modify it in source code form under the terms of the GNU * and/or modify it in source code form under the terms of the GNU
@ -21,7 +21,11 @@
#if defined(__MINGW32__) #if defined(__MINGW32__)
# include <windows.h> # include <windows.h>
#if defined(__cplusplus)
# include <cstdio> # include <cstdio>
#else
# include <stdio.h>
#endif
typedef void * ivl_dll_t; typedef void * ivl_dll_t;
#elif defined(HAVE_DLFCN_H) #elif defined(HAVE_DLFCN_H)
# include <dlfcn.h> # include <dlfcn.h>
@ -32,7 +36,7 @@ typedef shl_t ivl_dll_t;
#endif #endif
#if defined(__MINGW32__) #if defined(__MINGW32__)
inline ivl_dll_t ivl_dlopen(const char *name, bool) static inline ivl_dll_t ivl_dlopen(const char *name, bool global_flag)
{ {
static char full_name[4096]; static char full_name[4096];
unsigned long length = GetFullPathName(name, sizeof(full_name), unsigned long length = GetFullPathName(name, sizeof(full_name),
@ -40,16 +44,18 @@ inline ivl_dll_t ivl_dlopen(const char *name, bool)
if ((length == 0) || (length > sizeof(full_name))) if ((length == 0) || (length > sizeof(full_name)))
return 0; return 0;
(void)global_flag;
return (void *)LoadLibrary(full_name); return (void *)LoadLibrary(full_name);
} }
inline void *ivl_dlsym(ivl_dll_t dll, const char *nm) static inline void *ivl_dlsym(ivl_dll_t dll, const char *nm)
{ return (void *)GetProcAddress((HINSTANCE)dll,nm);} { return (void *)GetProcAddress((HINSTANCE)dll,nm);}
inline void ivl_dlclose(ivl_dll_t dll) static inline void ivl_dlclose(ivl_dll_t dll)
{ (void)FreeLibrary((HINSTANCE)dll);} { (void)FreeLibrary((HINSTANCE)dll);}
inline const char *dlerror(void) static inline const char *dlerror(void)
{ {
static char msg[256]; static char msg[256];
unsigned long err = GetLastError(); unsigned long err = GetLastError();
@ -66,10 +72,10 @@ inline const char *dlerror(void)
} }
#elif defined(HAVE_DLFCN_H) #elif defined(HAVE_DLFCN_H)
inline ivl_dll_t ivl_dlopen(const char*name, bool global_flag) static inline ivl_dll_t ivl_dlopen(const char*name, bool global_flag)
{ return dlopen(name,RTLD_LAZY|(global_flag?RTLD_GLOBAL:0)); } { return dlopen(name,RTLD_LAZY|(global_flag?RTLD_GLOBAL:0)); }
inline void* ivl_dlsym(ivl_dll_t dll, const char*nm) static inline void* ivl_dlsym(ivl_dll_t dll, const char*nm)
{ {
void*sym = dlsym(dll, nm); void*sym = dlsym(dll, nm);
/* Not found? try without the leading _ */ /* Not found? try without the leading _ */
@ -78,24 +84,28 @@ inline void* ivl_dlsym(ivl_dll_t dll, const char*nm)
return sym; return sym;
} }
inline void ivl_dlclose(ivl_dll_t dll) static inline void ivl_dlclose(ivl_dll_t dll)
{ dlclose(dll); } { dlclose(dll); }
#elif defined(HAVE_DL_H) #elif defined(HAVE_DL_H)
inline ivl_dll_t ivl_dlopen(const char*name) static inline ivl_dll_t ivl_dlopen(const char*name, bool global_flag)
{ return shl_load(name, BIND_IMMEDIATE, 0); } {
(void)global_flag;
inline void* ivl_dlsym(ivl_dll_t dll, const char*nm) return shl_load(name, BIND_IMMEDIATE, 0);
}
static inline void* ivl_dlsym(ivl_dll_t dll, const char*nm)
{ {
void*sym; void*sym;
int rc = shl_findsym(&dll, nm, TYPE_PROCEDURE, &sym); int rc = shl_findsym(&dll, nm, TYPE_PROCEDURE, &sym);
return (rc == 0) ? sym : 0; return (rc == 0) ? sym : 0;
} }
inline void ivl_dlclose(ivl_dll_t dll) static inline void ivl_dlclose(ivl_dll_t dll)
{ shl_unload(dll); } { shl_unload(dll); }
inline const char*dlerror(void) static inline const char*dlerror(void)
{ return strerror( errno ); } { return strerror( errno ); }
#endif #endif

View File

@ -38,74 +38,6 @@ using namespace std;
struct dll_target dll_target_obj; struct dll_target dll_target_obj;
#if defined(__WIN32__)
inline ivl_dll_t ivl_dlopen(const char *name)
{
ivl_dll_t res = static_cast<ivl_dll_t>(LoadLibrary(name));
return res;
}
inline void * ivl_dlsym(ivl_dll_t dll, const char *nm)
{
return reinterpret_cast<void*>(GetProcAddress((HMODULE)dll, nm));
}
inline void ivl_dlclose(ivl_dll_t dll)
{
FreeLibrary((HMODULE)dll);
}
const char *dlerror(void)
{
static char msg[256];
unsigned long err = GetLastError();
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
err,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &msg,
sizeof(msg) - 1,
NULL
);
return msg;
}
#elif defined(HAVE_DLFCN_H)
inline ivl_dll_t ivl_dlopen(const char*name)
{ return dlopen(name,RTLD_LAZY); }
inline void* ivl_dlsym(ivl_dll_t dll, const char*nm)
{
void*sym = dlsym(dll, nm);
/* Not found? try without the leading _ */
if (sym == 0 && nm[0] == '_')
sym = dlsym(dll, nm+1);
return sym;
}
inline void ivl_dlclose(ivl_dll_t dll)
{ dlclose(dll); }
#elif defined(HAVE_DL_H)
inline ivl_dll_t ivl_dlopen(const char*name)
{ return shl_load(name, BIND_IMMEDIATE, 0); }
inline void* ivl_dlsym(ivl_dll_t dll, const char*nm)
{
void*sym;
int rc = shl_findsym(&dll, nm, TYPE_PROCEDURE, &sym);
return (rc == 0) ? sym : 0;
}
inline void ivl_dlclose(ivl_dll_t dll)
{ shl_unload(dll); }
inline const char*dlerror(void)
{ return strerror( errno ); }
#endif
ivl_scope_s::ivl_scope_s() ivl_scope_s::ivl_scope_s()
: func_type(IVL_VT_NO_TYPE) : func_type(IVL_VT_NO_TYPE)
{ {
@ -667,13 +599,13 @@ bool dll_target::start_design(const Design*des)
{ {
const char*dll_path_ = des->get_flag("DLL"); const char*dll_path_ = des->get_flag("DLL");
dll_ = ivl_dlopen(dll_path_); dll_ = ivl_dlopen(dll_path_, false);
if ((dll_ == 0) && (dll_path_[0] != '/')) { if ((dll_ == 0) && (dll_path_[0] != '/')) {
size_t len = strlen(basedir) + 1 + strlen(dll_path_) + 1; size_t len = strlen(basedir) + 1 + strlen(dll_path_) + 1;
char*tmp = new char[len]; char*tmp = new char[len];
snprintf(tmp, len, "%s/%s", basedir, dll_path_); snprintf(tmp, len, "%s/%s", basedir, dll_path_);
dll_ = ivl_dlopen(tmp); dll_ = ivl_dlopen(tmp, false);
delete[]tmp; delete[]tmp;
} }
@ -2852,13 +2784,13 @@ bool dll_target::signal_paths(const NetNet*net)
void dll_target::test_version(const char*target_name) void dll_target::test_version(const char*target_name)
{ {
dll_ = ivl_dlopen(target_name); dll_ = ivl_dlopen(target_name, false);
if ((dll_ == 0) && (target_name[0] != '/')) { if ((dll_ == 0) && (target_name[0] != '/')) {
size_t len = strlen(basedir) + 1 + strlen(target_name) + 1; size_t len = strlen(basedir) + 1 + strlen(target_name) + 1;
char*tmp = new char[len]; char*tmp = new char[len];
snprintf(tmp, len, "%s/%s", basedir, target_name); snprintf(tmp, len, "%s/%s", basedir, target_name);
dll_ = ivl_dlopen(tmp); dll_ = ivl_dlopen(tmp, false);
delete[]tmp; delete[]tmp;
} }

14
t-dll.h
View File

@ -22,24 +22,12 @@
# include "target.h" # include "target.h"
# include "ivl_target.h" # include "ivl_target.h"
# include "ivl_target_priv.h" # include "ivl_target_priv.h"
# include "ivl_dlfcn.h"
# include "StringHeap.h" # include "StringHeap.h"
# include "netlist.h" # include "netlist.h"
# include <vector> # include <vector>
# include <map> # include <map>
#if defined(__MINGW32__)
#include <windows.h>
typedef void *ivl_dll_t;
#elif defined(HAVE_DLFCN_H)
# include <dlfcn.h>
typedef void* ivl_dll_t;
#elif defined(HAVE_DL_H)
# include <dl.h>
typedef shl_t ivl_dll_t;
#else
# error No DLL stub support for this target.
#endif
/* /*
* The DLL target type loads a named object file to handle the process * The DLL target type loads a named object file to handle the process
* of scanning the netlist. When it is time to start the design, I * of scanning the netlist. When it is time to start the design, I

View File

@ -21,7 +21,7 @@
#include "compiler.h" #include "compiler.h"
#include "vpi_user.h" #include "vpi_user.h"
#include "sv_vpi_user.h" #include "sv_vpi_user.h"
#include "vvp/ivl_dlfcn.h" #include "ivl_dlfcn.h"
using namespace std; using namespace std;