2008-06-03 04:23:48 +02:00
|
|
|
/*
|
2021-01-21 08:50:06 +01:00
|
|
|
* Copyright (c) 2003-2021 Stephen Williams (steve@icarus.com)
|
2008-06-03 04:23:48 +02: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
|
2012-08-29 03:41:23 +02:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2008-06-03 04:23:48 +02:00
|
|
|
*/
|
|
|
|
|
|
2010-05-17 18:38:23 +02:00
|
|
|
#include "sys_priv.h"
|
2008-06-03 04:23:48 +02:00
|
|
|
#include <assert.h>
|
2009-02-25 01:47:46 +01:00
|
|
|
#include <ctype.h>
|
2020-05-17 06:05:44 +02:00
|
|
|
#include <errno.h>
|
2009-02-25 01:47:46 +01:00
|
|
|
#include <stdlib.h>
|
2008-06-06 04:25:19 +02:00
|
|
|
#include <string.h>
|
2010-10-24 00:52:56 +02:00
|
|
|
#include "ivl_alloc.h"
|
2008-06-03 04:23:48 +02:00
|
|
|
|
2010-05-28 05:09:32 +02:00
|
|
|
PLI_UINT64 timerec_to_time64(const struct t_vpi_time*timerec)
|
2008-06-03 04:23:48 +02:00
|
|
|
{
|
|
|
|
|
PLI_UINT64 tmp;
|
|
|
|
|
|
2010-05-28 05:09:32 +02:00
|
|
|
tmp = timerec->high;
|
2008-06-03 04:23:48 +02:00
|
|
|
tmp <<= 32;
|
2010-05-28 05:09:32 +02:00
|
|
|
tmp |= (PLI_UINT64) timerec->low;
|
2008-06-03 04:23:48 +02:00
|
|
|
|
|
|
|
|
return tmp;
|
|
|
|
|
}
|
|
|
|
|
|
2009-02-27 00:22:21 +01:00
|
|
|
char *as_escaped(char *arg)
|
2009-02-25 01:47:46 +01:00
|
|
|
{
|
2017-01-09 05:44:17 +01:00
|
|
|
unsigned idx, cur, cnt, len = strlen(arg) + 1;
|
|
|
|
|
char *res = (char *) malloc(sizeof(char) * len);
|
2009-02-25 01:47:46 +01:00
|
|
|
cur = 0;
|
2017-01-09 05:44:17 +01:00
|
|
|
cnt = len - 1;
|
2009-02-25 01:47:46 +01:00
|
|
|
for (idx = 0; idx < cnt; idx++) {
|
2010-04-11 20:00:39 +02:00
|
|
|
if (isprint((int)arg[idx])) {
|
2009-02-25 01:47:46 +01:00
|
|
|
res[cur] = arg[idx];
|
|
|
|
|
cur += 1;
|
|
|
|
|
} else {
|
|
|
|
|
len += 3;
|
2017-01-09 05:44:17 +01:00
|
|
|
res = (char *) realloc(res, sizeof(char) * len);
|
2009-02-25 01:47:46 +01:00
|
|
|
sprintf(&(res[cur]), "\\%03o", arg[idx]);
|
|
|
|
|
cur += 4;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
res[cur] = 0;
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Generic routine to get the filename from the given handle.
|
|
|
|
|
* The result is duplicated so call free when the name is no
|
|
|
|
|
* longer needed. Returns 0 (NULL) for an error.
|
|
|
|
|
*/
|
2010-10-04 18:53:55 +02:00
|
|
|
char *get_filename(vpiHandle callh, const char *name, vpiHandle file)
|
2009-02-25 01:47:46 +01:00
|
|
|
{
|
|
|
|
|
s_vpi_value val;
|
|
|
|
|
unsigned len, idx;
|
2010-05-23 23:30:48 +02:00
|
|
|
|
2009-02-25 01:47:46 +01:00
|
|
|
/* Get the filename. */
|
|
|
|
|
val.format = vpiStringVal;
|
|
|
|
|
vpi_get_value(file, &val);
|
|
|
|
|
|
|
|
|
|
/* Verify that we have a string and that it is not NULL. */
|
|
|
|
|
if (val.format != vpiStringVal || !*(val.value.str)) {
|
|
|
|
|
vpi_printf("WARNING: %s:%d: ", vpi_get_str(vpiFile, callh),
|
|
|
|
|
(int)vpi_get(vpiLineNo, callh));
|
|
|
|
|
vpi_printf("%s's file name argument (%s) is not a valid string.\n",
|
|
|
|
|
name, vpi_get_str(vpiType, file));
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Verify that the file name is composed of only printable
|
|
|
|
|
* characters.
|
|
|
|
|
*/
|
|
|
|
|
len = strlen(val.value.str);
|
|
|
|
|
for (idx = 0; idx < len; idx++) {
|
2010-04-11 20:00:39 +02:00
|
|
|
if (! isprint((int)val.value.str[idx])) {
|
2011-05-02 18:09:22 +02:00
|
|
|
char msg[64];
|
2009-02-25 01:47:46 +01:00
|
|
|
char *esc_fname = as_escaped(val.value.str);
|
2011-05-02 18:09:22 +02:00
|
|
|
snprintf(msg, sizeof(msg), "WARNING: %s:%d:",
|
2009-02-25 01:47:46 +01:00
|
|
|
vpi_get_str(vpiFile, callh),
|
|
|
|
|
(int)vpi_get(vpiLineNo, callh));
|
2011-05-02 18:09:22 +02:00
|
|
|
msg[sizeof(msg)-1] = 0;
|
2009-02-25 01:47:46 +01:00
|
|
|
vpi_printf("%s %s's file name argument contains non-"
|
|
|
|
|
"printable characters.\n", msg, name);
|
|
|
|
|
vpi_printf("%*s \"%s\"\n", (int) strlen(msg), " ", esc_fname);
|
|
|
|
|
free(esc_fname);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return strdup(val.value.str);
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-26 23:05:42 +01:00
|
|
|
/*
|
|
|
|
|
* Create a new copy of the path with the suffix appended.
|
|
|
|
|
*/
|
|
|
|
|
char* attach_suffix_to_filename(char *path, const char*suff)
|
2019-10-30 20:23:24 +01:00
|
|
|
{
|
|
|
|
|
/* If the name already has a suffix, then don't replace it or
|
|
|
|
|
add another suffix. Just return this path. */
|
|
|
|
|
char*tailp = strrchr(path, '.');
|
|
|
|
|
if (tailp != 0) return path;
|
|
|
|
|
|
|
|
|
|
/* The name doesn't have a suffix, so append the passed in
|
|
|
|
|
suffix to the file name. */
|
|
|
|
|
char*new_path = malloc(strlen(path) + strlen(suff) + 2);
|
|
|
|
|
strcpy(new_path, path);
|
|
|
|
|
strcat(new_path, ".");
|
|
|
|
|
strcat(new_path, suff);
|
|
|
|
|
free(path);
|
|
|
|
|
return new_path;
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-26 23:05:42 +01:00
|
|
|
char* get_filename_with_suffix(vpiHandle callh, const char *name, vpiHandle file, const char*suff)
|
|
|
|
|
{
|
|
|
|
|
char*path = get_filename(callh, name, file);
|
|
|
|
|
if (path == 0) return 0;
|
|
|
|
|
|
|
|
|
|
return attach_suffix_to_filename(path, suff);
|
|
|
|
|
}
|
|
|
|
|
|
2010-10-04 18:53:55 +02:00
|
|
|
void check_for_extra_args(vpiHandle argv, vpiHandle callh, const char *name,
|
2010-09-27 20:03:43 +02:00
|
|
|
const char *arg_str, unsigned opt)
|
2009-02-27 00:22:21 +01:00
|
|
|
{
|
|
|
|
|
/* Check that there are no extra arguments. */
|
|
|
|
|
if (vpi_scan(argv) != 0) {
|
2011-05-02 18:09:22 +02:00
|
|
|
char msg[64];
|
2009-02-27 00:22:21 +01:00
|
|
|
unsigned argc;
|
|
|
|
|
|
2011-05-02 18:09:22 +02:00
|
|
|
snprintf(msg, sizeof(msg), "ERROR: %s:%d:",
|
2009-02-27 00:22:21 +01:00
|
|
|
vpi_get_str(vpiFile, callh),
|
|
|
|
|
(int)vpi_get(vpiLineNo, callh));
|
2011-05-02 18:09:22 +02:00
|
|
|
msg[sizeof(msg)-1] = 0;
|
2009-02-27 00:22:21 +01:00
|
|
|
|
|
|
|
|
argc = 1;
|
|
|
|
|
while (vpi_scan(argv)) argc += 1;
|
|
|
|
|
|
|
|
|
|
vpi_printf("%s %s takes %s%s.\n", msg, name,
|
|
|
|
|
opt ? "at most ": "", arg_str);
|
|
|
|
|
vpi_printf("%*s Found %u extra argument%s.\n",
|
|
|
|
|
(int) strlen(msg), " ", argc, argc == 1 ? "" : "s");
|
2021-01-21 08:50:06 +01:00
|
|
|
vpip_set_return_value(1);
|
2009-02-27 00:22:21 +01:00
|
|
|
vpi_control(vpiFinish, 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2008-06-03 04:23:48 +02:00
|
|
|
/*
|
|
|
|
|
* This routine returns 1 if the argument is a constant value,
|
|
|
|
|
* otherwise it returns 0.
|
2008-08-30 06:11:44 +02:00
|
|
|
*
|
|
|
|
|
* This routine was also copied to sys_clog2.c since it is not
|
|
|
|
|
* part of the standard system functions.
|
2008-06-03 04:23:48 +02:00
|
|
|
*/
|
|
|
|
|
unsigned is_constant_obj(vpiHandle obj)
|
|
|
|
|
{
|
|
|
|
|
unsigned rtn = 0;
|
|
|
|
|
|
2008-09-30 03:06:47 +02:00
|
|
|
assert(obj);
|
|
|
|
|
|
2008-06-03 04:23:48 +02:00
|
|
|
switch(vpi_get(vpiType, obj)) {
|
|
|
|
|
case vpiConstant:
|
|
|
|
|
case vpiParameter:
|
|
|
|
|
rtn = 1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return rtn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* This routine returns 1 if the argument supports has a numeric value,
|
|
|
|
|
* otherwise it returns 0.
|
|
|
|
|
*/
|
|
|
|
|
unsigned is_numeric_obj(vpiHandle obj)
|
|
|
|
|
{
|
|
|
|
|
unsigned rtn = 0;
|
|
|
|
|
|
2008-09-30 03:06:47 +02:00
|
|
|
assert(obj);
|
|
|
|
|
|
2008-06-03 04:23:48 +02:00
|
|
|
switch(vpi_get(vpiType, obj)) {
|
|
|
|
|
case vpiConstant:
|
|
|
|
|
case vpiParameter:
|
|
|
|
|
/* These cannot be a string constant. */
|
|
|
|
|
if (vpi_get(vpiConstType, obj) != vpiStringConst) rtn = 1;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
/* These can have a valid numeric value. */
|
|
|
|
|
case vpiIntegerVar:
|
2011-09-06 02:35:26 +02:00
|
|
|
case vpiBitVar:
|
|
|
|
|
case vpiByteVar:
|
|
|
|
|
case vpiShortIntVar:
|
|
|
|
|
case vpiIntVar:
|
|
|
|
|
case vpiLongIntVar:
|
2008-06-03 04:23:48 +02:00
|
|
|
case vpiMemoryWord:
|
|
|
|
|
case vpiNet:
|
|
|
|
|
case vpiPartSelect:
|
|
|
|
|
case vpiRealVar:
|
|
|
|
|
case vpiReg:
|
|
|
|
|
case vpiTimeVar:
|
Rework $plusarg routines.
This patch addresses a number of issues:
Rewrote the $test$plusargs and $value$plusargs routines to have
better error/warning messages, to support runtime strings, to
correctly load bit based values (truncating, padding, negative
value), added support for the real formats using strtod() and
added "x/X" as an alias for "h/H" to match the other part of
Icarus.
Rewrite the vpip_{bin,oct,hex}_str_to_vec4 routines to ignore
embedded "_" characters. Add support for a negative value and
set the entire value to 'bx if an invalid digit is found. A
warning is printed for this case.
Rewrite vpip_dec_str_to_vec4 to ignore embedded "_" characters,
to support a single "x" or "z" constant and to return 'bx if an
invalid digit is found. A warning is printed for this case.
It simplifies the system task/functions error/warning messages.
It removes the signed flag for the bin and dec string conversions.
This was not being used (was always false) and the new negative
value support makes this obsolete.
Add support for a real variable to handle Bin, Oct, Dec and Hex
strings. They are converted into a vvp_vector4_t which is then
converted to a real value.
Add support for setting a bit based value using a real value.
Removed an unneeded rfp signal in vpip_make_reg()
2008-11-13 22:28:19 +01:00
|
|
|
rtn = 1;
|
2008-06-03 04:23:48 +02:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return rtn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* This routine returns 1 if the argument supports a valid string value,
|
|
|
|
|
* otherwise it returns 0.
|
|
|
|
|
*/
|
|
|
|
|
unsigned is_string_obj(vpiHandle obj)
|
|
|
|
|
{
|
|
|
|
|
unsigned rtn = 0;
|
|
|
|
|
|
2008-09-30 03:06:47 +02:00
|
|
|
assert(obj);
|
|
|
|
|
|
2008-06-03 04:23:48 +02:00
|
|
|
switch(vpi_get(vpiType, obj)) {
|
|
|
|
|
case vpiConstant:
|
|
|
|
|
case vpiParameter: {
|
|
|
|
|
/* These must be a string or binary constant. */
|
|
|
|
|
PLI_INT32 ctype = vpi_get(vpiConstType, obj);
|
|
|
|
|
if (ctype == vpiStringConst || ctype == vpiBinaryConst) rtn = 1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* These can have a valid string value. */
|
|
|
|
|
case vpiIntegerVar:
|
2011-09-06 02:35:26 +02:00
|
|
|
case vpiBitVar:
|
|
|
|
|
case vpiByteVar:
|
|
|
|
|
case vpiShortIntVar:
|
|
|
|
|
case vpiIntVar:
|
|
|
|
|
case vpiLongIntVar:
|
2008-06-03 04:23:48 +02:00
|
|
|
case vpiMemoryWord:
|
|
|
|
|
case vpiNet:
|
|
|
|
|
case vpiPartSelect:
|
|
|
|
|
case vpiReg:
|
|
|
|
|
case vpiTimeVar:
|
2013-06-14 22:00:39 +02:00
|
|
|
case vpiStringVar:
|
Rework $plusarg routines.
This patch addresses a number of issues:
Rewrote the $test$plusargs and $value$plusargs routines to have
better error/warning messages, to support runtime strings, to
correctly load bit based values (truncating, padding, negative
value), added support for the real formats using strtod() and
added "x/X" as an alias for "h/H" to match the other part of
Icarus.
Rewrite the vpip_{bin,oct,hex}_str_to_vec4 routines to ignore
embedded "_" characters. Add support for a negative value and
set the entire value to 'bx if an invalid digit is found. A
warning is printed for this case.
Rewrite vpip_dec_str_to_vec4 to ignore embedded "_" characters,
to support a single "x" or "z" constant and to return 'bx if an
invalid digit is found. A warning is printed for this case.
It simplifies the system task/functions error/warning messages.
It removes the signed flag for the bin and dec string conversions.
This was not being used (was always false) and the new negative
value support makes this obsolete.
Add support for a real variable to handle Bin, Oct, Dec and Hex
strings. They are converted into a vvp_vector4_t which is then
converted to a real value.
Add support for setting a bit based value using a real value.
Removed an unneeded rfp signal in vpip_make_reg()
2008-11-13 22:28:19 +01:00
|
|
|
rtn = 1;
|
2008-06-03 04:23:48 +02:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return rtn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-05-17 03:02:46 +02:00
|
|
|
/*
|
|
|
|
|
* Check if the file descriptor or MCD is valid.
|
|
|
|
|
* For a MCD check that every bit set is a valid file and
|
|
|
|
|
* for a FD make sure it exists.
|
|
|
|
|
*/
|
|
|
|
|
unsigned is_valid_fd_mcd(PLI_UINT32 fd_mcd)
|
|
|
|
|
{
|
|
|
|
|
assert(fd_mcd); // Should already be handled!
|
|
|
|
|
|
|
|
|
|
if (IS_MCD(fd_mcd)){
|
|
|
|
|
if (vpi_mcd_printf(fd_mcd, "%s", "") == EOF) return 0;
|
|
|
|
|
} else {
|
|
|
|
|
if (vpi_get_file(fd_mcd) == NULL) return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-17 06:05:44 +02:00
|
|
|
/*
|
|
|
|
|
* Get a FD/MCD from the given argument and check if it is valid. Return the
|
|
|
|
|
* FD/MCD in the fd_mcd argument and return 0 if it is valid and 1 if it is
|
|
|
|
|
* invalid. We do not print a warning mesage if the FD/MCD is zero.
|
|
|
|
|
*/
|
|
|
|
|
unsigned get_fd_mcd_from_arg(PLI_UINT32 *fd_mcd, vpiHandle arg,
|
|
|
|
|
vpiHandle callh, const char *name)
|
|
|
|
|
{
|
|
|
|
|
s_vpi_value val;
|
|
|
|
|
|
|
|
|
|
val.format = vpiIntVal;
|
|
|
|
|
vpi_get_value(arg, &val);
|
|
|
|
|
*fd_mcd = val.value.integer;
|
|
|
|
|
|
|
|
|
|
if (*fd_mcd == 0) return 1;
|
|
|
|
|
|
|
|
|
|
errno = 0;
|
|
|
|
|
if (! is_valid_fd_mcd(*fd_mcd)) {
|
|
|
|
|
vpi_printf("WARNING: %s:%d: ", vpi_get_str(vpiFile, callh),
|
|
|
|
|
(int)vpi_get(vpiLineNo, callh));
|
|
|
|
|
vpi_printf("invalid %s (0x%x) given to %s().\n",
|
|
|
|
|
IS_MCD(*fd_mcd) ? "MCD" : "file descriptor",
|
|
|
|
|
(unsigned int)*fd_mcd,
|
|
|
|
|
name);
|
|
|
|
|
errno = EBADF;
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-17 03:02:46 +02:00
|
|
|
|
2008-06-03 04:23:48 +02:00
|
|
|
/*
|
2016-07-22 23:48:20 +02:00
|
|
|
* Find the enclosing module. If there is no enclosing module (which can be
|
|
|
|
|
* the case in SystemVerilog), return the highest enclosing scope.
|
2008-06-03 04:23:48 +02:00
|
|
|
*/
|
|
|
|
|
vpiHandle sys_func_module(vpiHandle obj)
|
|
|
|
|
{
|
|
|
|
|
assert(obj);
|
|
|
|
|
|
|
|
|
|
while (vpi_get(vpiType, obj) != vpiModule) {
|
2016-07-22 23:48:20 +02:00
|
|
|
vpiHandle scope = vpi_handle(vpiScope, obj);
|
|
|
|
|
if (scope == 0)
|
|
|
|
|
break;
|
|
|
|
|
obj = scope;
|
2008-06-03 04:23:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return obj;
|
|
|
|
|
}
|
2008-06-06 04:25:19 +02:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Standard compiletf routines.
|
|
|
|
|
*/
|
|
|
|
|
|
2008-06-14 05:46:18 +02:00
|
|
|
/* For system tasks/functions that do not take an argument. */
|
2010-10-04 18:31:01 +02:00
|
|
|
PLI_INT32 sys_no_arg_compiletf(ICARUS_VPI_CONST PLI_BYTE8 *name)
|
2008-06-06 04:25:19 +02:00
|
|
|
{
|
|
|
|
|
vpiHandle callh = vpi_handle(vpiSysTfCall, 0);
|
|
|
|
|
vpiHandle argv = vpi_iterate(vpiArgument, callh);
|
|
|
|
|
|
|
|
|
|
/* Make sure there are no arguments. */
|
|
|
|
|
if (argv != 0) {
|
2011-05-02 18:09:22 +02:00
|
|
|
char msg[64];
|
2008-09-30 03:06:47 +02:00
|
|
|
unsigned argc;
|
|
|
|
|
|
2011-05-02 18:09:22 +02:00
|
|
|
snprintf(msg, sizeof(msg), "ERROR: %s:%d:",
|
2008-06-06 04:25:19 +02:00
|
|
|
vpi_get_str(vpiFile, callh),
|
|
|
|
|
(int)vpi_get(vpiLineNo, callh));
|
2011-05-02 18:09:22 +02:00
|
|
|
msg[sizeof(msg)-1] = 0;
|
2008-06-06 04:25:19 +02:00
|
|
|
|
2008-09-30 03:06:47 +02:00
|
|
|
argc = 0;
|
2008-06-06 04:25:19 +02:00
|
|
|
while (vpi_scan(argv)) argc += 1;
|
|
|
|
|
|
|
|
|
|
vpi_printf("%s %s does not take an argument.\n", msg, name);
|
|
|
|
|
vpi_printf("%*s Found %u extra argument%s.\n",
|
2008-06-20 19:12:17 +02:00
|
|
|
(int) strlen(msg), " ", argc, argc == 1 ? "" : "s");
|
2021-01-21 08:50:06 +01:00
|
|
|
vpip_set_return_value(1);
|
2008-06-06 04:25:19 +02:00
|
|
|
vpi_control(vpiFinish, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2008-06-14 05:46:18 +02:00
|
|
|
/* For system tasks/functions that take a single numeric argument. */
|
2010-10-04 18:31:01 +02:00
|
|
|
PLI_INT32 sys_one_numeric_arg_compiletf(ICARUS_VPI_CONST PLI_BYTE8 *name)
|
2008-06-06 04:25:19 +02:00
|
|
|
{
|
|
|
|
|
vpiHandle callh = vpi_handle(vpiSysTfCall, 0);
|
|
|
|
|
vpiHandle argv = vpi_iterate(vpiArgument, callh);
|
|
|
|
|
|
|
|
|
|
/* Check that there is an argument and that it is numeric. */
|
|
|
|
|
if (argv == 0) {
|
Rework $plusarg routines.
This patch addresses a number of issues:
Rewrote the $test$plusargs and $value$plusargs routines to have
better error/warning messages, to support runtime strings, to
correctly load bit based values (truncating, padding, negative
value), added support for the real formats using strtod() and
added "x/X" as an alias for "h/H" to match the other part of
Icarus.
Rewrite the vpip_{bin,oct,hex}_str_to_vec4 routines to ignore
embedded "_" characters. Add support for a negative value and
set the entire value to 'bx if an invalid digit is found. A
warning is printed for this case.
Rewrite vpip_dec_str_to_vec4 to ignore embedded "_" characters,
to support a single "x" or "z" constant and to return 'bx if an
invalid digit is found. A warning is printed for this case.
It simplifies the system task/functions error/warning messages.
It removes the signed flag for the bin and dec string conversions.
This was not being used (was always false) and the new negative
value support makes this obsolete.
Add support for a real variable to handle Bin, Oct, Dec and Hex
strings. They are converted into a vvp_vector4_t which is then
converted to a real value.
Add support for setting a bit based value using a real value.
Removed an unneeded rfp signal in vpip_make_reg()
2008-11-13 22:28:19 +01:00
|
|
|
vpi_printf("ERROR: %s:%d: ", vpi_get_str(vpiFile, callh),
|
2008-06-06 04:25:19 +02:00
|
|
|
(int)vpi_get(vpiLineNo, callh));
|
|
|
|
|
vpi_printf("%s requires a single numeric argument.\n", name);
|
2021-01-21 08:50:06 +01:00
|
|
|
vpip_set_return_value(1);
|
2008-06-06 04:25:19 +02:00
|
|
|
vpi_control(vpiFinish, 1);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (! is_numeric_obj(vpi_scan(argv))) {
|
Rework $plusarg routines.
This patch addresses a number of issues:
Rewrote the $test$plusargs and $value$plusargs routines to have
better error/warning messages, to support runtime strings, to
correctly load bit based values (truncating, padding, negative
value), added support for the real formats using strtod() and
added "x/X" as an alias for "h/H" to match the other part of
Icarus.
Rewrite the vpip_{bin,oct,hex}_str_to_vec4 routines to ignore
embedded "_" characters. Add support for a negative value and
set the entire value to 'bx if an invalid digit is found. A
warning is printed for this case.
Rewrite vpip_dec_str_to_vec4 to ignore embedded "_" characters,
to support a single "x" or "z" constant and to return 'bx if an
invalid digit is found. A warning is printed for this case.
It simplifies the system task/functions error/warning messages.
It removes the signed flag for the bin and dec string conversions.
This was not being used (was always false) and the new negative
value support makes this obsolete.
Add support for a real variable to handle Bin, Oct, Dec and Hex
strings. They are converted into a vvp_vector4_t which is then
converted to a real value.
Add support for setting a bit based value using a real value.
Removed an unneeded rfp signal in vpip_make_reg()
2008-11-13 22:28:19 +01:00
|
|
|
vpi_printf("ERROR: %s:%d: ", vpi_get_str(vpiFile, callh),
|
2008-06-06 04:25:19 +02:00
|
|
|
(int)vpi_get(vpiLineNo, callh));
|
|
|
|
|
vpi_printf("%s's argument must be numeric.\n", name);
|
2021-01-21 08:50:06 +01:00
|
|
|
vpip_set_return_value(1);
|
2008-06-06 04:25:19 +02:00
|
|
|
vpi_control(vpiFinish, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Make sure there are no extra arguments. */
|
2009-02-27 00:22:21 +01:00
|
|
|
check_for_extra_args(argv, callh, name, "a single numeric argument", 0);
|
2008-06-06 04:25:19 +02:00
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2008-06-14 05:46:18 +02:00
|
|
|
/* For system tasks/functions that take a single optional numeric argument. */
|
2010-10-04 18:31:01 +02:00
|
|
|
PLI_INT32 sys_one_opt_numeric_arg_compiletf(ICARUS_VPI_CONST PLI_BYTE8 *name)
|
2008-06-06 04:25:19 +02:00
|
|
|
{
|
|
|
|
|
vpiHandle callh = vpi_handle(vpiSysTfCall, 0);
|
|
|
|
|
vpiHandle argv = vpi_iterate(vpiArgument, callh);
|
|
|
|
|
|
|
|
|
|
/* The argument is optional so just return if none are found. */
|
|
|
|
|
if (argv == 0) return 0;
|
|
|
|
|
|
|
|
|
|
if (! is_numeric_obj(vpi_scan(argv))) {
|
Rework $plusarg routines.
This patch addresses a number of issues:
Rewrote the $test$plusargs and $value$plusargs routines to have
better error/warning messages, to support runtime strings, to
correctly load bit based values (truncating, padding, negative
value), added support for the real formats using strtod() and
added "x/X" as an alias for "h/H" to match the other part of
Icarus.
Rewrite the vpip_{bin,oct,hex}_str_to_vec4 routines to ignore
embedded "_" characters. Add support for a negative value and
set the entire value to 'bx if an invalid digit is found. A
warning is printed for this case.
Rewrite vpip_dec_str_to_vec4 to ignore embedded "_" characters,
to support a single "x" or "z" constant and to return 'bx if an
invalid digit is found. A warning is printed for this case.
It simplifies the system task/functions error/warning messages.
It removes the signed flag for the bin and dec string conversions.
This was not being used (was always false) and the new negative
value support makes this obsolete.
Add support for a real variable to handle Bin, Oct, Dec and Hex
strings. They are converted into a vvp_vector4_t which is then
converted to a real value.
Add support for setting a bit based value using a real value.
Removed an unneeded rfp signal in vpip_make_reg()
2008-11-13 22:28:19 +01:00
|
|
|
vpi_printf("ERROR: %s:%d: ", vpi_get_str(vpiFile, callh),
|
2008-06-06 04:25:19 +02:00
|
|
|
(int)vpi_get(vpiLineNo, callh));
|
|
|
|
|
vpi_printf("%s's argument must be numeric.\n", name);
|
2021-01-21 08:50:06 +01:00
|
|
|
vpip_set_return_value(1);
|
2008-06-06 04:25:19 +02:00
|
|
|
vpi_control(vpiFinish, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Make sure there are no extra arguments. */
|
2009-02-27 00:22:21 +01:00
|
|
|
check_for_extra_args(argv, callh, name, "one numeric argument", 1);
|
2008-06-14 05:46:18 +02:00
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* For system tasks/functions that take two numeric arguments. */
|
2010-10-04 18:31:01 +02:00
|
|
|
PLI_INT32 sys_two_numeric_args_compiletf(ICARUS_VPI_CONST PLI_BYTE8 *name)
|
2008-06-14 05:46:18 +02:00
|
|
|
{
|
|
|
|
|
vpiHandle callh = vpi_handle(vpiSysTfCall, 0);
|
|
|
|
|
vpiHandle argv = vpi_iterate(vpiArgument, callh);
|
|
|
|
|
vpiHandle arg;
|
|
|
|
|
|
|
|
|
|
/* Check that there are two argument and that they are numeric. */
|
|
|
|
|
if (argv == 0) {
|
Rework $plusarg routines.
This patch addresses a number of issues:
Rewrote the $test$plusargs and $value$plusargs routines to have
better error/warning messages, to support runtime strings, to
correctly load bit based values (truncating, padding, negative
value), added support for the real formats using strtod() and
added "x/X" as an alias for "h/H" to match the other part of
Icarus.
Rewrite the vpip_{bin,oct,hex}_str_to_vec4 routines to ignore
embedded "_" characters. Add support for a negative value and
set the entire value to 'bx if an invalid digit is found. A
warning is printed for this case.
Rewrite vpip_dec_str_to_vec4 to ignore embedded "_" characters,
to support a single "x" or "z" constant and to return 'bx if an
invalid digit is found. A warning is printed for this case.
It simplifies the system task/functions error/warning messages.
It removes the signed flag for the bin and dec string conversions.
This was not being used (was always false) and the new negative
value support makes this obsolete.
Add support for a real variable to handle Bin, Oct, Dec and Hex
strings. They are converted into a vvp_vector4_t which is then
converted to a real value.
Add support for setting a bit based value using a real value.
Removed an unneeded rfp signal in vpip_make_reg()
2008-11-13 22:28:19 +01:00
|
|
|
vpi_printf("ERROR: %s:%d: ", vpi_get_str(vpiFile, callh),
|
2008-06-14 05:46:18 +02:00
|
|
|
(int)vpi_get(vpiLineNo, callh));
|
|
|
|
|
vpi_printf("%s requires two numeric arguments.\n", name);
|
2021-01-21 08:50:06 +01:00
|
|
|
vpip_set_return_value(1);
|
2008-06-14 05:46:18 +02:00
|
|
|
vpi_control(vpiFinish, 1);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (! is_numeric_obj(vpi_scan(argv))) {
|
Rework $plusarg routines.
This patch addresses a number of issues:
Rewrote the $test$plusargs and $value$plusargs routines to have
better error/warning messages, to support runtime strings, to
correctly load bit based values (truncating, padding, negative
value), added support for the real formats using strtod() and
added "x/X" as an alias for "h/H" to match the other part of
Icarus.
Rewrite the vpip_{bin,oct,hex}_str_to_vec4 routines to ignore
embedded "_" characters. Add support for a negative value and
set the entire value to 'bx if an invalid digit is found. A
warning is printed for this case.
Rewrite vpip_dec_str_to_vec4 to ignore embedded "_" characters,
to support a single "x" or "z" constant and to return 'bx if an
invalid digit is found. A warning is printed for this case.
It simplifies the system task/functions error/warning messages.
It removes the signed flag for the bin and dec string conversions.
This was not being used (was always false) and the new negative
value support makes this obsolete.
Add support for a real variable to handle Bin, Oct, Dec and Hex
strings. They are converted into a vvp_vector4_t which is then
converted to a real value.
Add support for setting a bit based value using a real value.
Removed an unneeded rfp signal in vpip_make_reg()
2008-11-13 22:28:19 +01:00
|
|
|
vpi_printf("ERROR: %s:%d: ", vpi_get_str(vpiFile, callh),
|
2008-06-14 05:46:18 +02:00
|
|
|
(int)vpi_get(vpiLineNo, callh));
|
|
|
|
|
vpi_printf("%s's first argument must be numeric.\n", name);
|
2021-01-21 08:50:06 +01:00
|
|
|
vpip_set_return_value(1);
|
2008-06-14 05:46:18 +02:00
|
|
|
vpi_control(vpiFinish, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
arg = vpi_scan(argv);
|
|
|
|
|
if (! arg) {
|
Rework $plusarg routines.
This patch addresses a number of issues:
Rewrote the $test$plusargs and $value$plusargs routines to have
better error/warning messages, to support runtime strings, to
correctly load bit based values (truncating, padding, negative
value), added support for the real formats using strtod() and
added "x/X" as an alias for "h/H" to match the other part of
Icarus.
Rewrite the vpip_{bin,oct,hex}_str_to_vec4 routines to ignore
embedded "_" characters. Add support for a negative value and
set the entire value to 'bx if an invalid digit is found. A
warning is printed for this case.
Rewrite vpip_dec_str_to_vec4 to ignore embedded "_" characters,
to support a single "x" or "z" constant and to return 'bx if an
invalid digit is found. A warning is printed for this case.
It simplifies the system task/functions error/warning messages.
It removes the signed flag for the bin and dec string conversions.
This was not being used (was always false) and the new negative
value support makes this obsolete.
Add support for a real variable to handle Bin, Oct, Dec and Hex
strings. They are converted into a vvp_vector4_t which is then
converted to a real value.
Add support for setting a bit based value using a real value.
Removed an unneeded rfp signal in vpip_make_reg()
2008-11-13 22:28:19 +01:00
|
|
|
vpi_printf("ERROR: %s:%d: ", vpi_get_str(vpiFile, callh),
|
2008-06-14 05:46:18 +02:00
|
|
|
(int)vpi_get(vpiLineNo, callh));
|
|
|
|
|
vpi_printf("%s requires a second (numeric) argument.\n", name);
|
2021-01-21 08:50:06 +01:00
|
|
|
vpip_set_return_value(1);
|
2008-06-14 05:46:18 +02:00
|
|
|
vpi_control(vpiFinish, 1);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (! is_numeric_obj(arg)) {
|
Rework $plusarg routines.
This patch addresses a number of issues:
Rewrote the $test$plusargs and $value$plusargs routines to have
better error/warning messages, to support runtime strings, to
correctly load bit based values (truncating, padding, negative
value), added support for the real formats using strtod() and
added "x/X" as an alias for "h/H" to match the other part of
Icarus.
Rewrite the vpip_{bin,oct,hex}_str_to_vec4 routines to ignore
embedded "_" characters. Add support for a negative value and
set the entire value to 'bx if an invalid digit is found. A
warning is printed for this case.
Rewrite vpip_dec_str_to_vec4 to ignore embedded "_" characters,
to support a single "x" or "z" constant and to return 'bx if an
invalid digit is found. A warning is printed for this case.
It simplifies the system task/functions error/warning messages.
It removes the signed flag for the bin and dec string conversions.
This was not being used (was always false) and the new negative
value support makes this obsolete.
Add support for a real variable to handle Bin, Oct, Dec and Hex
strings. They are converted into a vvp_vector4_t which is then
converted to a real value.
Add support for setting a bit based value using a real value.
Removed an unneeded rfp signal in vpip_make_reg()
2008-11-13 22:28:19 +01:00
|
|
|
vpi_printf("ERROR: %s:%d: ", vpi_get_str(vpiFile, callh),
|
2008-06-14 05:46:18 +02:00
|
|
|
(int)vpi_get(vpiLineNo, callh));
|
|
|
|
|
vpi_printf("%s's second argument must be numeric.\n", name);
|
2021-01-21 08:50:06 +01:00
|
|
|
vpip_set_return_value(1);
|
2008-06-14 05:46:18 +02:00
|
|
|
vpi_control(vpiFinish, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Make sure there are no extra arguments. */
|
2009-02-27 00:22:21 +01:00
|
|
|
check_for_extra_args(argv, callh, name, "two numeric arguments", 0);
|
2008-06-14 05:46:18 +02:00
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* For system tasks/functions that take a single string argument. */
|
2010-10-04 18:31:01 +02:00
|
|
|
PLI_INT32 sys_one_string_arg_compiletf(ICARUS_VPI_CONST PLI_BYTE8 *name)
|
2008-06-14 05:46:18 +02:00
|
|
|
{
|
|
|
|
|
vpiHandle callh = vpi_handle(vpiSysTfCall, 0);
|
|
|
|
|
vpiHandle argv = vpi_iterate(vpiArgument, callh);
|
|
|
|
|
|
|
|
|
|
/* Check that there is an argument and that it is a string. */
|
|
|
|
|
if (argv == 0) {
|
Rework $plusarg routines.
This patch addresses a number of issues:
Rewrote the $test$plusargs and $value$plusargs routines to have
better error/warning messages, to support runtime strings, to
correctly load bit based values (truncating, padding, negative
value), added support for the real formats using strtod() and
added "x/X" as an alias for "h/H" to match the other part of
Icarus.
Rewrite the vpip_{bin,oct,hex}_str_to_vec4 routines to ignore
embedded "_" characters. Add support for a negative value and
set the entire value to 'bx if an invalid digit is found. A
warning is printed for this case.
Rewrite vpip_dec_str_to_vec4 to ignore embedded "_" characters,
to support a single "x" or "z" constant and to return 'bx if an
invalid digit is found. A warning is printed for this case.
It simplifies the system task/functions error/warning messages.
It removes the signed flag for the bin and dec string conversions.
This was not being used (was always false) and the new negative
value support makes this obsolete.
Add support for a real variable to handle Bin, Oct, Dec and Hex
strings. They are converted into a vvp_vector4_t which is then
converted to a real value.
Add support for setting a bit based value using a real value.
Removed an unneeded rfp signal in vpip_make_reg()
2008-11-13 22:28:19 +01:00
|
|
|
vpi_printf("ERROR: %s:%d: ", vpi_get_str(vpiFile, callh),
|
2008-06-14 05:46:18 +02:00
|
|
|
(int)vpi_get(vpiLineNo, callh));
|
|
|
|
|
vpi_printf("%s requires a single string argument.\n", name);
|
2021-01-21 08:50:06 +01:00
|
|
|
vpip_set_return_value(1);
|
2008-06-14 05:46:18 +02:00
|
|
|
vpi_control(vpiFinish, 1);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
if (! is_string_obj(vpi_scan(argv))) {
|
Rework $plusarg routines.
This patch addresses a number of issues:
Rewrote the $test$plusargs and $value$plusargs routines to have
better error/warning messages, to support runtime strings, to
correctly load bit based values (truncating, padding, negative
value), added support for the real formats using strtod() and
added "x/X" as an alias for "h/H" to match the other part of
Icarus.
Rewrite the vpip_{bin,oct,hex}_str_to_vec4 routines to ignore
embedded "_" characters. Add support for a negative value and
set the entire value to 'bx if an invalid digit is found. A
warning is printed for this case.
Rewrite vpip_dec_str_to_vec4 to ignore embedded "_" characters,
to support a single "x" or "z" constant and to return 'bx if an
invalid digit is found. A warning is printed for this case.
It simplifies the system task/functions error/warning messages.
It removes the signed flag for the bin and dec string conversions.
This was not being used (was always false) and the new negative
value support makes this obsolete.
Add support for a real variable to handle Bin, Oct, Dec and Hex
strings. They are converted into a vvp_vector4_t which is then
converted to a real value.
Add support for setting a bit based value using a real value.
Removed an unneeded rfp signal in vpip_make_reg()
2008-11-13 22:28:19 +01:00
|
|
|
vpi_printf("ERROR: %s:%d: ", vpi_get_str(vpiFile, callh),
|
2008-06-14 05:46:18 +02:00
|
|
|
(int)vpi_get(vpiLineNo, callh));
|
|
|
|
|
vpi_printf("%s's argument must be a string.\n", name);
|
2021-01-21 08:50:06 +01:00
|
|
|
vpip_set_return_value(1);
|
2008-06-14 05:46:18 +02:00
|
|
|
vpi_control(vpiFinish, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Make sure there are no extra arguments. */
|
2009-02-27 00:22:21 +01:00
|
|
|
check_for_extra_args(argv, callh, name, "a single string argument", 0);
|
2008-06-06 04:25:19 +02:00
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2018-08-31 07:29:22 +02:00
|
|
|
|
|
|
|
|
/* Return an integer value to the caller. */
|
|
|
|
|
void put_integer_value(vpiHandle callh, PLI_INT32 result)
|
|
|
|
|
{
|
|
|
|
|
s_vpi_value val;
|
|
|
|
|
|
|
|
|
|
val.format = vpiIntVal;
|
|
|
|
|
val.value.integer = result;
|
|
|
|
|
vpi_put_value(callh, &val, 0, vpiNoDelay);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Return a scalar value to the caller. */
|
|
|
|
|
void put_scalar_value(vpiHandle callh, PLI_INT32 result)
|
|
|
|
|
{
|
|
|
|
|
s_vpi_value val;
|
|
|
|
|
|
|
|
|
|
val.format = vpiScalarVal;
|
|
|
|
|
val.value.scalar = result;
|
|
|
|
|
vpi_put_value(callh, &val, 0, vpiNoDelay);
|
|
|
|
|
}
|