Refactor vpi module path code.
Also restore the original behaviour of the '-M -' option, although it's probably not needed now we add the default path last.
This commit is contained in:
parent
dd33da0d5b
commit
6887c31d8c
88
vvp/main.cc
88
vvp/main.cc
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2015 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001-2018 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
|
||||||
|
|
@ -303,14 +303,9 @@ int main(int argc, char*argv[])
|
||||||
break;
|
break;
|
||||||
case 'M':
|
case 'M':
|
||||||
if (strcmp(optarg,"-") == 0) {
|
if (strcmp(optarg,"-") == 0) {
|
||||||
vpip_module_path_cnt = 0;
|
vpip_clear_module_paths();
|
||||||
vpip_module_path[0] = 0;
|
|
||||||
} else {
|
} else {
|
||||||
if (vpip_module_path_cnt >= VPIP_MODULE_PATH_MAX) {
|
vpip_add_module_path(optarg);
|
||||||
fprintf(stderr, "Too many paths specified\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
vpip_module_path[vpip_module_path_cnt++] = optarg;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
|
|
@ -336,82 +331,7 @@ int main(int argc, char*argv[])
|
||||||
flag_errors += 1;
|
flag_errors += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (char *var = ::getenv("IVERILOG_VPI_MODULE_PATH")) {
|
vpip_add_env_and_default_module_paths();
|
||||||
char *ptr = var;
|
|
||||||
char *end = var+strlen(var);
|
|
||||||
int len = 0;
|
|
||||||
while (ptr <= end) {
|
|
||||||
if (*ptr == 0 || *ptr == ':' || *ptr == ';') {
|
|
||||||
if (len > 0) {
|
|
||||||
if (vpip_module_path_cnt >= VPIP_MODULE_PATH_MAX) {
|
|
||||||
fprintf(stderr, "Too many paths specified\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
vpip_module_path[vpip_module_path_cnt++] = strndup(var, len);
|
|
||||||
}
|
|
||||||
len = 0;
|
|
||||||
var = ptr+1;
|
|
||||||
} else {
|
|
||||||
len++;
|
|
||||||
}
|
|
||||||
ptr++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __MINGW32__
|
|
||||||
/* Calculate the module path from the path to the command.
|
|
||||||
This is necessary because of the installation process on
|
|
||||||
Windows. Mostly, it is those darn drive letters, but oh
|
|
||||||
well. We know the command path is formed like this:
|
|
||||||
|
|
||||||
D:\iverilog\bin\iverilog.exe
|
|
||||||
|
|
||||||
The IVL_ROOT in a Windows installation is the path:
|
|
||||||
|
|
||||||
D:\iverilog\lib\ivl$(suffix)
|
|
||||||
|
|
||||||
so we chop the file name and the last directory by
|
|
||||||
turning the last two \ characters to null. Then we append
|
|
||||||
the lib\ivl$(suffix) to finish. */
|
|
||||||
char *s;
|
|
||||||
char basepath[4096], tmp[4096];
|
|
||||||
GetModuleFileName(NULL, tmp, sizeof tmp);
|
|
||||||
/* Convert to a short name to remove any embedded spaces. */
|
|
||||||
GetShortPathName(tmp, basepath, sizeof basepath);
|
|
||||||
s = strrchr(basepath, '\\');
|
|
||||||
if (s) *s = 0;
|
|
||||||
else {
|
|
||||||
fprintf(stderr, "%s: Missing first \\ in exe path!\n", argv[0]);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
s = strrchr(basepath, '\\');
|
|
||||||
if (s) *s = 0;
|
|
||||||
else {
|
|
||||||
fprintf(stderr, "%s: Missing second \\ in exe path!\n", argv[0]);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
strcat(s, "\\lib\\ivl" IVL_SUFFIX);
|
|
||||||
if (vpip_module_path_cnt >= VPIP_MODULE_PATH_MAX) {
|
|
||||||
fprintf(stderr, "Too many paths specified\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
vpip_module_path[vpip_module_path_cnt++] = strdup(basepath);
|
|
||||||
#else
|
|
||||||
#ifdef MODULE_DIR1
|
|
||||||
if (vpip_module_path_cnt >= VPIP_MODULE_PATH_MAX) {
|
|
||||||
fprintf(stderr, "Too many paths specified\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
vpip_module_path[vpip_module_path_cnt++] = MODULE_DIR1;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#ifdef MODULE_DIR2
|
|
||||||
if (vpip_module_path_cnt >= VPIP_MODULE_PATH_MAX) {
|
|
||||||
fprintf(stderr, "Too many paths specified\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
vpip_module_path[vpip_module_path_cnt++] = MODULE_DIR2;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (flag_errors)
|
if (flag_errors)
|
||||||
return flag_errors;
|
return flag_errors;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2010 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001-2018 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
|
||||||
|
|
@ -32,10 +32,96 @@ static unsigned dll_list_cnt = 0;
|
||||||
|
|
||||||
typedef void (*vlog_startup_routines_t)(void);
|
typedef void (*vlog_startup_routines_t)(void);
|
||||||
|
|
||||||
|
# define VPIP_MODULE_PATH_MAX 64
|
||||||
|
|
||||||
const char* vpip_module_path[VPIP_MODULE_PATH_MAX] = {0};
|
static const char* vpip_module_path[VPIP_MODULE_PATH_MAX] = {0};
|
||||||
|
|
||||||
unsigned vpip_module_path_cnt = 0;
|
static unsigned vpip_module_path_cnt = 0;
|
||||||
|
|
||||||
|
static bool disable_default_paths = false;
|
||||||
|
|
||||||
|
void vpip_clear_module_paths()
|
||||||
|
{
|
||||||
|
vpip_module_path_cnt = 0;
|
||||||
|
vpip_module_path[0] = 0;
|
||||||
|
disable_default_paths = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vpip_add_module_path(const char*path)
|
||||||
|
{
|
||||||
|
if (vpip_module_path_cnt >= VPIP_MODULE_PATH_MAX) {
|
||||||
|
fprintf(stderr, "Too many module paths specified\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
vpip_module_path[vpip_module_path_cnt++] = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vpip_add_env_and_default_module_paths()
|
||||||
|
{
|
||||||
|
if (disable_default_paths)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (char *var = ::getenv("IVERILOG_VPI_MODULE_PATH")) {
|
||||||
|
char *ptr = var;
|
||||||
|
char *end = var+strlen(var);
|
||||||
|
int len = 0;
|
||||||
|
while (ptr <= end) {
|
||||||
|
if (*ptr == 0 || *ptr == ':' || *ptr == ';') {
|
||||||
|
if (len > 0) {
|
||||||
|
vpip_add_module_path(strndup(var, len));
|
||||||
|
}
|
||||||
|
len = 0;
|
||||||
|
var = ptr+1;
|
||||||
|
} else {
|
||||||
|
len++;
|
||||||
|
}
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
/* Calculate the module path from the path to the command.
|
||||||
|
This is necessary because of the installation process on
|
||||||
|
Windows. Mostly, it is those darn drive letters, but oh
|
||||||
|
well. We know the command path is formed like this:
|
||||||
|
|
||||||
|
D:\iverilog\bin\iverilog.exe
|
||||||
|
|
||||||
|
The IVL_ROOT in a Windows installation is the path:
|
||||||
|
|
||||||
|
D:\iverilog\lib\ivl$(suffix)
|
||||||
|
|
||||||
|
so we chop the file name and the last directory by
|
||||||
|
turning the last two \ characters to null. Then we append
|
||||||
|
the lib\ivl$(suffix) to finish. */
|
||||||
|
char *s;
|
||||||
|
char basepath[4096], tmp[4096];
|
||||||
|
GetModuleFileName(NULL, tmp, sizeof tmp);
|
||||||
|
/* Convert to a short name to remove any embedded spaces. */
|
||||||
|
GetShortPathName(tmp, basepath, sizeof basepath);
|
||||||
|
s = strrchr(basepath, '\\');
|
||||||
|
if (s) *s = 0;
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "%s: Missing first \\ in exe path!\n", argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
s = strrchr(basepath, '\\');
|
||||||
|
if (s) *s = 0;
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "%s: Missing second \\ in exe path!\n", argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
strcat(s, "\\lib\\ivl" IVL_SUFFIX);
|
||||||
|
vpip_add_module_path(strdup(basepath));
|
||||||
|
#else
|
||||||
|
#ifdef MODULE_DIR1
|
||||||
|
vpip_add_module_path(MODULE_DIR1);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef MODULE_DIR2
|
||||||
|
vpip_add_module_path(MODULE_DIR2);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void load_module_delete(void)
|
void load_module_delete(void)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef IVL_vpi_priv_H
|
#ifndef IVL_vpi_priv_H
|
||||||
#define IVL_vpi_priv_H
|
#define IVL_vpi_priv_H
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2017 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001-2018 Stephen Williams (steve@icarus.com)
|
||||||
* Copyright (c) 2016 CERN Michele Castellana (michele.castellana@cern.ch)
|
* Copyright (c) 2016 CERN Michele Castellana (michele.castellana@cern.ch)
|
||||||
*
|
*
|
||||||
* This source code is free software; you can redistribute it
|
* This source code is free software; you can redistribute it
|
||||||
|
|
@ -873,9 +873,9 @@ vpiHandle vpip_make_vthr_APV(char*label, unsigned index, unsigned bit, unsigned
|
||||||
*/
|
*/
|
||||||
extern void vpip_load_module(const char*name);
|
extern void vpip_load_module(const char*name);
|
||||||
|
|
||||||
# define VPIP_MODULE_PATH_MAX 64
|
extern void vpip_clear_module_paths();
|
||||||
extern const char* vpip_module_path[VPIP_MODULE_PATH_MAX];
|
extern void vpip_add_module_path(const char *path);
|
||||||
extern unsigned vpip_module_path_cnt;
|
extern void vpip_add_env_and_default_module_paths();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The vpip_build_vpi_call function creates a __vpiSysTaskCall object
|
* The vpip_build_vpi_call function creates a __vpiSysTaskCall object
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue