Cleanup vvp with suggestions from cppcheck
This commit is contained in:
parent
e0313cecbd
commit
7299625ab5
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2017 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001-2021 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
|
||||||
|
|
@ -35,7 +35,7 @@ vvp_arith_::vvp_arith_(unsigned wid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void vvp_arith_::dispatch_operand_(vvp_net_ptr_t ptr, vvp_vector4_t bit)
|
void vvp_arith_::dispatch_operand_(vvp_net_ptr_t ptr, const vvp_vector4_t&bit)
|
||||||
{
|
{
|
||||||
unsigned port = ptr.port();
|
unsigned port = ptr.port();
|
||||||
switch (port) {
|
switch (port) {
|
||||||
|
|
@ -159,7 +159,7 @@ void vvp_arith_cast_vec2::recv_real(vvp_net_ptr_t ptr, double bit,
|
||||||
void vvp_arith_cast_vec2::recv_vec4(vvp_net_ptr_t ptr, const vvp_vector4_t&bit,
|
void vvp_arith_cast_vec2::recv_vec4(vvp_net_ptr_t ptr, const vvp_vector4_t&bit,
|
||||||
vvp_context_t)
|
vvp_context_t)
|
||||||
{
|
{
|
||||||
vvp_vector2_t tmp = bit;
|
vvp_vector2_t tmp = vvp_vector2_t(bit);
|
||||||
ptr.ptr()->send_vec4(vector2_to_vector4(tmp,wid_), 0);
|
ptr.ptr()->send_vec4(vector2_to_vector4(tmp,wid_), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef IVL_arith_H
|
#ifndef IVL_arith_H
|
||||||
#define IVL_arith_H
|
#define IVL_arith_H
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2017 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001-2021 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
|
||||||
|
|
@ -42,7 +42,7 @@ class vvp_arith_ : public vvp_net_fun_t {
|
||||||
vvp_context_t ctx);
|
vvp_context_t ctx);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void dispatch_operand_(vvp_net_ptr_t ptr, vvp_vector4_t bit);
|
void dispatch_operand_(vvp_net_ptr_t ptr, const vvp_vector4_t&bit);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
unsigned wid_;
|
unsigned wid_;
|
||||||
|
|
|
||||||
13
vvp/array.cc
13
vvp/array.cc
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007-2013 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2007-2021 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
|
||||||
|
|
@ -210,18 +210,11 @@ void __vpiArray::get_word_value(struct __vpiArrayWord*word, p_vpi_value vp)
|
||||||
case vpiHexStrVal:
|
case vpiHexStrVal:
|
||||||
case vpiScalarVal:
|
case vpiScalarVal:
|
||||||
case vpiIntVal:
|
case vpiIntVal:
|
||||||
{
|
|
||||||
vvp_vector4_t v;
|
|
||||||
vals->get_word(index, v);
|
|
||||||
vpip_vec4_get_value(v, vals_width, signed_flag, vp);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case vpiVectorVal:
|
case vpiVectorVal:
|
||||||
{
|
{
|
||||||
vvp_vector4_t v;
|
vvp_vector4_t v;
|
||||||
vals->get_word(index, v);
|
vals->get_word(index, v);
|
||||||
vpip_vec2_get_value(v, vals_width, signed_flag, vp);
|
vpip_vec4_get_value(v, vals_width, signed_flag, vp);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
@ -1460,7 +1453,7 @@ value_callback*vpip_array_word_change(p_cb_data data)
|
||||||
struct __vpiArray*parent = 0;
|
struct __vpiArray*parent = 0;
|
||||||
array_word_value_callback*cbh = 0;
|
array_word_value_callback*cbh = 0;
|
||||||
if (struct __vpiArrayWord*word = array_var_word_from_handle(data->obj)) {
|
if (struct __vpiArrayWord*word = array_var_word_from_handle(data->obj)) {
|
||||||
parent = (__vpiArray*) word->get_parent();
|
parent = static_cast<__vpiArray*>(word->get_parent());
|
||||||
unsigned addr = word->get_index();
|
unsigned addr = word->get_index();
|
||||||
cbh = new array_word_value_callback(data);
|
cbh = new array_word_value_callback(data);
|
||||||
cbh->word_addr = addr;
|
cbh->word_addr = addr;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
// The new() operator is always used to allocate space for this class and
|
// The new() operator is always used to allocate space for this class and
|
||||||
// pool is defined there.
|
// pool is defined there.
|
||||||
uninitVar:vvp_net.cc:190
|
uninitMemberVar:vvp_net.cc:190
|
||||||
|
|
||||||
// These functions are not used by Icarus
|
// These functions are not used by Icarus
|
||||||
// vpi_chk_error()
|
// vpi_chk_error()
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2011-2020 Cary R. (cygcary@yahoo.com)
|
* Copyright (C) 2011-2021 Cary R. (cygcary@yahoo.com)
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
@ -19,12 +19,18 @@
|
||||||
# include "compile.h"
|
# include "compile.h"
|
||||||
# include "vpi_priv.h"
|
# include "vpi_priv.h"
|
||||||
|
|
||||||
struct __vpiFileLine : public __vpiHandle {
|
class __vpiFileLine : public __vpiHandle {
|
||||||
__vpiFileLine();
|
public:
|
||||||
|
explicit __vpiFileLine(const char*desc_, long file_idx_, long lineno_);
|
||||||
int get_type_code(void) const;
|
int get_type_code(void) const;
|
||||||
int vpi_get(int code);
|
int vpi_get(int code);
|
||||||
char* vpi_get_str(int code);
|
char* vpi_get_str(int code);
|
||||||
|
|
||||||
|
const char* get_description() const { return description; };
|
||||||
|
unsigned get_file_idx() const { return file_idx; };
|
||||||
|
unsigned get_lineno() const { return lineno; };
|
||||||
|
|
||||||
|
private:
|
||||||
const char *description;
|
const char *description;
|
||||||
unsigned file_idx;
|
unsigned file_idx;
|
||||||
unsigned lineno;
|
unsigned lineno;
|
||||||
|
|
@ -35,12 +41,12 @@ bool code_is_instrumented = false;
|
||||||
|
|
||||||
static int file_line_get(int type, vpiHandle ref)
|
static int file_line_get(int type, vpiHandle ref)
|
||||||
{
|
{
|
||||||
struct __vpiFileLine*rfp = dynamic_cast<__vpiFileLine*>(ref);
|
__vpiFileLine*rfp = dynamic_cast<__vpiFileLine*>(ref);
|
||||||
assert(rfp);
|
assert(rfp);
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case vpiLineNo:
|
case vpiLineNo:
|
||||||
return rfp->lineno;
|
return rfp->get_lineno();
|
||||||
default:
|
default:
|
||||||
return vpiUndefined;
|
return vpiUndefined;
|
||||||
}
|
}
|
||||||
|
|
@ -48,23 +54,30 @@ static int file_line_get(int type, vpiHandle ref)
|
||||||
|
|
||||||
static char *file_line_get_str(int type, vpiHandle ref)
|
static char *file_line_get_str(int type, vpiHandle ref)
|
||||||
{
|
{
|
||||||
struct __vpiFileLine*rfp = dynamic_cast<__vpiFileLine*>(ref);
|
__vpiFileLine*rfp = dynamic_cast<__vpiFileLine*>(ref);
|
||||||
assert(rfp);
|
assert(rfp);
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case vpiFile:
|
case vpiFile:
|
||||||
assert(rfp->file_idx < file_names.size());
|
assert(rfp->get_file_idx() < file_names.size());
|
||||||
return simple_set_rbuf_str(file_names[rfp->file_idx]);
|
return simple_set_rbuf_str(file_names[rfp->get_file_idx()]);
|
||||||
case _vpiDescription:
|
case _vpiDescription:
|
||||||
if (rfp->description) return simple_set_rbuf_str(rfp->description);
|
if (rfp->get_description()) {
|
||||||
else return simple_set_rbuf_str("Procedural tracing.");
|
return simple_set_rbuf_str(rfp->get_description());
|
||||||
|
} else return simple_set_rbuf_str("Procedural tracing.");
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline __vpiFileLine::__vpiFileLine()
|
inline __vpiFileLine::__vpiFileLine(const char*desc_, long file_idx_,
|
||||||
{ }
|
long lineno_)
|
||||||
|
{
|
||||||
|
if (desc_) description = vpip_name_string(desc_);
|
||||||
|
else description = 0;
|
||||||
|
file_idx = (unsigned) file_idx_;
|
||||||
|
lineno = (unsigned) lineno_;
|
||||||
|
}
|
||||||
|
|
||||||
int __vpiFileLine::get_type_code(void) const
|
int __vpiFileLine::get_type_code(void) const
|
||||||
{ return _vpiFileLine; }
|
{ return _vpiFileLine; }
|
||||||
|
|
@ -78,15 +91,10 @@ char* __vpiFileLine::vpi_get_str(int code)
|
||||||
|
|
||||||
vpiHandle vpip_build_file_line(char*description, long file_idx, long lineno)
|
vpiHandle vpip_build_file_line(char*description, long file_idx, long lineno)
|
||||||
{
|
{
|
||||||
struct __vpiFileLine*obj = new struct __vpiFileLine;
|
__vpiFileLine*obj = new __vpiFileLine(description, file_idx, lineno);
|
||||||
|
|
||||||
/* You can turn on the diagnostic output if we find a %file_line. */
|
/* You can turn on the diagnostic output if we find a %file_line. */
|
||||||
code_is_instrumented = true;
|
code_is_instrumented = true;
|
||||||
|
|
||||||
if (description) obj->description = vpip_name_string(description);
|
|
||||||
else obj->description = 0;
|
|
||||||
obj->file_idx = (unsigned) file_idx;
|
|
||||||
obj->lineno = (unsigned) lineno;
|
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2008-2018 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2008-2021 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
|
||||||
|
|
@ -46,7 +46,7 @@ struct vvp_island_branch_tran : public vvp_island_branch {
|
||||||
vvp_island_branch_tran(vvp_net_t*en__, bool active_high__,
|
vvp_island_branch_tran(vvp_net_t*en__, bool active_high__,
|
||||||
unsigned width__, unsigned part__,
|
unsigned width__, unsigned part__,
|
||||||
unsigned offset__, bool resistive__);
|
unsigned offset__, bool resistive__);
|
||||||
bool run_test_enabled();
|
void run_test_enabled();
|
||||||
void run_resolution();
|
void run_resolution();
|
||||||
void run_output();
|
void run_output();
|
||||||
|
|
||||||
|
|
@ -85,11 +85,10 @@ void vvp_island_tran::run_island()
|
||||||
// Test to see if any of the branches are enabled. This loop
|
// Test to see if any of the branches are enabled. This loop
|
||||||
// tests the enabled inputs for all the branches and caches
|
// tests the enabled inputs for all the branches and caches
|
||||||
// the results in the state for each branch.
|
// the results in the state for each branch.
|
||||||
bool runnable = false;
|
|
||||||
for (vvp_island_branch*cur = branches_ ; cur ; cur = cur->next_branch) {
|
for (vvp_island_branch*cur = branches_ ; cur ; cur = cur->next_branch) {
|
||||||
vvp_island_branch_tran*tmp = dynamic_cast<vvp_island_branch_tran*>(cur);
|
vvp_island_branch_tran*tmp = dynamic_cast<vvp_island_branch_tran*>(cur);
|
||||||
assert(tmp);
|
assert(tmp);
|
||||||
runnable |= tmp->run_test_enabled();
|
tmp->run_test_enabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now resolve all the branches in the island.
|
// Now resolve all the branches in the island.
|
||||||
|
|
@ -184,7 +183,7 @@ void vvp_island_tran::count_drivers(vvp_island_port*port, unsigned bit_idx,
|
||||||
count_drivers_(endpoint, false, bit_idx, counts);
|
count_drivers_(endpoint, false, bit_idx, counts);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool vvp_island_branch_tran::run_test_enabled()
|
void vvp_island_branch_tran::run_test_enabled()
|
||||||
{
|
{
|
||||||
vvp_island_port*ep = en? dynamic_cast<vvp_island_port*> (en->fun) : 0;
|
vvp_island_port*ep = en? dynamic_cast<vvp_island_port*> (en->fun) : 0;
|
||||||
|
|
||||||
|
|
@ -192,7 +191,7 @@ bool vvp_island_branch_tran::run_test_enabled()
|
||||||
// tran branch. Assume it is always enabled.
|
// tran branch. Assume it is always enabled.
|
||||||
if (ep == 0) {
|
if (ep == 0) {
|
||||||
state = tran_enabled;
|
state = tran_enabled;
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the input that is driving this enable.
|
// Get the input that is driving this enable.
|
||||||
|
|
@ -229,7 +228,6 @@ bool vvp_island_branch_tran::run_test_enabled()
|
||||||
state = tran_unknown;
|
state = tran_unknown;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return (state != tran_disabled);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// The IEEE standard does not specify the behaviour when a tranif control
|
// The IEEE standard does not specify the behaviour when a tranif control
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2020 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001-2021 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
|
||||||
|
|
@ -31,6 +31,7 @@
|
||||||
# include <cstdlib>
|
# include <cstdlib>
|
||||||
# include <cstring>
|
# include <cstring>
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
|
# include <cassert>
|
||||||
#ifdef CHECK_WITH_VALGRIND
|
#ifdef CHECK_WITH_VALGRIND
|
||||||
# include <pthread.h>
|
# include <pthread.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -155,6 +156,7 @@ void verify_version(char*ivl_ver, char*commit)
|
||||||
if (rc == 2) {
|
if (rc == 2) {
|
||||||
file_extra[0] = 0;
|
file_extra[0] = 0;
|
||||||
rc = sscanf(ivl_ver, "%d.%d %127s", &file_major, &file_minor, file_extra);
|
rc = sscanf(ivl_ver, "%d.%d %127s", &file_major, &file_minor, file_extra);
|
||||||
|
assert((rc == 2) || (rc == 3));
|
||||||
file_minor2 = 0;
|
file_minor2 = 0;
|
||||||
}
|
}
|
||||||
delete[] ivl_ver;
|
delete[] ivl_ver;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2018 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001-2021 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
|
||||||
|
|
@ -74,6 +74,7 @@ void event_s::single_step_display(void)
|
||||||
struct event_time_s {
|
struct event_time_s {
|
||||||
event_time_s() {
|
event_time_s() {
|
||||||
count_time_events += 1;
|
count_time_events += 1;
|
||||||
|
delay = 0;
|
||||||
start = 0;
|
start = 0;
|
||||||
active = 0;
|
active = 0;
|
||||||
inactive = 0;
|
inactive = 0;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2018 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001-2021 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
|
||||||
|
|
@ -691,7 +691,8 @@ void callback_execute(struct __vpiCallback*cur)
|
||||||
case vpiScaledRealTime: {
|
case vpiScaledRealTime: {
|
||||||
cur->cb_data.time->real =
|
cur->cb_data.time->real =
|
||||||
vpip_time_to_scaled_real(schedule_simtime(),
|
vpip_time_to_scaled_real(schedule_simtime(),
|
||||||
(__vpiScope *) vpi_handle(vpiScope, cur->cb_data.obj));
|
static_cast<__vpiScope *>(vpi_handle(vpiScope,
|
||||||
|
cur->cb_data.obj)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case vpiSuppressTime:
|
case vpiSuppressTime:
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2012-2015 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2012-2021 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
|
||||||
|
|
@ -109,18 +109,11 @@ void __vpiDarrayVar::get_word_value(struct __vpiArrayWord*word, p_vpi_value vp)
|
||||||
case vpiHexStrVal:
|
case vpiHexStrVal:
|
||||||
case vpiScalarVal:
|
case vpiScalarVal:
|
||||||
case vpiIntVal:
|
case vpiIntVal:
|
||||||
{
|
case vpiVectorVal:
|
||||||
vvp_vector4_t v;
|
|
||||||
aobj->get_word(index, v); // width == 1?
|
|
||||||
vpip_vec4_get_value(v, 1, false, vp); // TODO sign?
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case vpiVectorVal: // TODO vpip_vec2_ or vpip_vec4_?
|
|
||||||
{
|
{
|
||||||
vvp_vector4_t v;
|
vvp_vector4_t v;
|
||||||
aobj->get_word(index, v);
|
aobj->get_word(index, v);
|
||||||
vpip_vec2_get_value(v, v.size(), false, vp); // TODO sign?
|
vpip_vec4_get_value(v, v.size(), false, vp); // TODO sign?
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2008-2020 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2008-2021 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
|
||||||
|
|
@ -111,7 +111,8 @@ unsigned vpip_size(__vpiSignal *sig)
|
||||||
__vpiScope* vpip_scope(__vpiSignal*sig)
|
__vpiScope* vpip_scope(__vpiSignal*sig)
|
||||||
{
|
{
|
||||||
if (sig->is_netarray)
|
if (sig->is_netarray)
|
||||||
return (__vpiScope*) vpi_handle(vpiScope, sig->within.parent);
|
return static_cast<__vpiScope*>(vpi_handle(vpiScope,
|
||||||
|
sig->within.parent));
|
||||||
else
|
else
|
||||||
return sig->within.scope;
|
return sig->within.scope;
|
||||||
}
|
}
|
||||||
|
|
@ -119,7 +120,8 @@ __vpiScope* vpip_scope(__vpiSignal*sig)
|
||||||
__vpiScope* vpip_scope(__vpiRealVar*sig)
|
__vpiScope* vpip_scope(__vpiRealVar*sig)
|
||||||
{
|
{
|
||||||
if (sig->is_netarray)
|
if (sig->is_netarray)
|
||||||
return (__vpiScope*) vpi_handle(vpiScope, sig->within.parent);
|
return static_cast<__vpiScope*>(vpi_handle(vpiScope,
|
||||||
|
sig->within.parent));
|
||||||
else
|
else
|
||||||
return sig->within.scope;
|
return sig->within.scope;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -601,8 +601,9 @@ void def_table_delete(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct __vpiSystfIterator : public __vpiHandle {
|
class __vpiSystfIterator : public __vpiHandle {
|
||||||
__vpiSystfIterator();
|
public:
|
||||||
|
explicit __vpiSystfIterator(unsigned idx);
|
||||||
int get_type_code(void) const;
|
int get_type_code(void) const;
|
||||||
vpiHandle vpi_index(int idx);
|
vpiHandle vpi_index(int idx);
|
||||||
free_object_fun_t free_object_fun(void);
|
free_object_fun_t free_object_fun(void);
|
||||||
|
|
@ -612,7 +613,7 @@ struct __vpiSystfIterator : public __vpiHandle {
|
||||||
|
|
||||||
static vpiHandle systf_iterator_scan(vpiHandle ref, int)
|
static vpiHandle systf_iterator_scan(vpiHandle ref, int)
|
||||||
{
|
{
|
||||||
struct __vpiSystfIterator*obj = dynamic_cast<__vpiSystfIterator*>(ref);
|
__vpiSystfIterator*obj = dynamic_cast<__vpiSystfIterator*>(ref);
|
||||||
|
|
||||||
if (obj->next >= def_count) {
|
if (obj->next >= def_count) {
|
||||||
vpi_free_object(ref);
|
vpi_free_object(ref);
|
||||||
|
|
@ -634,13 +635,13 @@ static vpiHandle systf_iterator_scan(vpiHandle ref, int)
|
||||||
|
|
||||||
static int systf_iterator_free_object(vpiHandle ref)
|
static int systf_iterator_free_object(vpiHandle ref)
|
||||||
{
|
{
|
||||||
struct __vpiSystfIterator*obj = dynamic_cast<__vpiSystfIterator*>(ref);
|
__vpiSystfIterator*obj = dynamic_cast<__vpiSystfIterator*>(ref);
|
||||||
delete obj;
|
delete obj;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline __vpiSystfIterator::__vpiSystfIterator()
|
inline __vpiSystfIterator::__vpiSystfIterator(unsigned idx)
|
||||||
{ }
|
{ next = idx; }
|
||||||
|
|
||||||
int __vpiSystfIterator::get_type_code(void) const
|
int __vpiSystfIterator::get_type_code(void) const
|
||||||
{ return vpiIterator; }
|
{ return vpiIterator; }
|
||||||
|
|
@ -664,7 +665,7 @@ vpiHandle vpip_make_systf_iterator(void)
|
||||||
}
|
}
|
||||||
if (!have_user_defn) return 0;
|
if (!have_user_defn) return 0;
|
||||||
|
|
||||||
struct __vpiSystfIterator*res = new __vpiSystfIterator;
|
__vpiSystfIterator*res = new __vpiSystfIterator(idx);
|
||||||
res->next = idx;
|
res->next = idx;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2018 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001-2021 Stephen Williams (steve@icarus.com)
|
||||||
* Copyright (c) 2001 Stephan Boettcher <stephan@nevis.columbia.edu>
|
* Copyright (c) 2001 Stephan Boettcher <stephan@nevis.columbia.edu>
|
||||||
*
|
*
|
||||||
* This source code is free software; you can redistribute it
|
* This source code is free software; you can redistribute it
|
||||||
|
|
@ -50,12 +50,17 @@ extern const char hex_digits[256];
|
||||||
extern const char oct_digits[64];
|
extern const char oct_digits[64];
|
||||||
|
|
||||||
|
|
||||||
struct __vpiVThrWord : public __vpiHandle {
|
class __vpiVThrWord : public __vpiHandle {
|
||||||
__vpiVThrWord();
|
public:
|
||||||
|
explicit __vpiVThrWord(unsigned base);
|
||||||
int get_type_code(void) const;
|
int get_type_code(void) const;
|
||||||
int vpi_get(int code);
|
int vpi_get(int code);
|
||||||
void vpi_get_value(p_vpi_value val);
|
void vpi_get_value(p_vpi_value val);
|
||||||
|
|
||||||
|
int get_subtype() const { return subtype; };
|
||||||
|
unsigned get_index() const { return index; };
|
||||||
|
|
||||||
|
private:
|
||||||
const char* name;
|
const char* name;
|
||||||
int subtype;
|
int subtype;
|
||||||
unsigned index;
|
unsigned index;
|
||||||
|
|
@ -63,12 +68,12 @@ struct __vpiVThrWord : public __vpiHandle {
|
||||||
|
|
||||||
static int vthr_word_get(int code, vpiHandle ref)
|
static int vthr_word_get(int code, vpiHandle ref)
|
||||||
{
|
{
|
||||||
struct __vpiVThrWord*rfp = dynamic_cast<__vpiVThrWord*>(ref);
|
__vpiVThrWord*rfp = dynamic_cast<__vpiVThrWord*>(ref);
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
|
|
||||||
case vpiConstType:
|
case vpiConstType:
|
||||||
return rfp->subtype;
|
return rfp->get_subtype();
|
||||||
|
|
||||||
#if defined(CHECK_WITH_VALGRIND) || defined(BR916_STOPGAP_FIX)
|
#if defined(CHECK_WITH_VALGRIND) || defined(BR916_STOPGAP_FIX)
|
||||||
case _vpiFromThr:
|
case _vpiFromThr:
|
||||||
|
|
@ -91,7 +96,7 @@ static double vlg_round(double rval)
|
||||||
|
|
||||||
static void vthr_real_get_value(vpiHandle ref, s_vpi_value*vp)
|
static void vthr_real_get_value(vpiHandle ref, s_vpi_value*vp)
|
||||||
{
|
{
|
||||||
struct __vpiVThrWord*obj = dynamic_cast<__vpiVThrWord*>(ref);
|
__vpiVThrWord*obj = dynamic_cast<__vpiVThrWord*>(ref);
|
||||||
char *rbuf = (char *) need_result_buf(66, RBUF_VAL);
|
char *rbuf = (char *) need_result_buf(66, RBUF_VAL);
|
||||||
|
|
||||||
double val = 0.0;
|
double val = 0.0;
|
||||||
|
|
@ -102,7 +107,8 @@ static void vthr_real_get_value(vpiHandle ref, s_vpi_value*vp)
|
||||||
will not have access to the proper value. Punt and return a
|
will not have access to the proper value. Punt and return a
|
||||||
0.0 value instead. */
|
0.0 value instead. */
|
||||||
if (vpip_current_vthread)
|
if (vpip_current_vthread)
|
||||||
val = vthread_get_real_stack(vpip_current_vthread, obj->index);
|
val = vthread_get_real_stack(vpip_current_vthread,
|
||||||
|
obj->get_index());
|
||||||
|
|
||||||
switch (vp->format) {
|
switch (vp->format) {
|
||||||
|
|
||||||
|
|
@ -174,8 +180,12 @@ static void vthr_real_get_value(vpiHandle ref, s_vpi_value*vp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline __vpiVThrWord::__vpiVThrWord()
|
inline __vpiVThrWord::__vpiVThrWord(unsigned base)
|
||||||
{ }
|
{
|
||||||
|
name = vpip_name_string("W<>");
|
||||||
|
subtype = vpiRealConst;
|
||||||
|
index = base;
|
||||||
|
}
|
||||||
|
|
||||||
int __vpiVThrWord::get_type_code(void) const
|
int __vpiVThrWord::get_type_code(void) const
|
||||||
{ return vpiConstant; }
|
{ return vpiConstant; }
|
||||||
|
|
@ -188,14 +198,9 @@ void __vpiVThrWord::vpi_get_value(p_vpi_value val)
|
||||||
|
|
||||||
vpiHandle vpip_make_vthr_word(unsigned base, const char*type)
|
vpiHandle vpip_make_vthr_word(unsigned base, const char*type)
|
||||||
{
|
{
|
||||||
struct __vpiVThrWord*obj = new __vpiVThrWord;
|
|
||||||
|
|
||||||
assert(type[0] == 'r');
|
assert(type[0] == 'r');
|
||||||
|
|
||||||
obj->name = vpip_name_string("W<>");
|
|
||||||
obj->subtype = vpiRealConst;
|
|
||||||
assert(base < 65536);
|
assert(base < 65536);
|
||||||
obj->index = base;
|
__vpiVThrWord*obj = new __vpiVThrWord(base);
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
@ -449,7 +454,6 @@ void __vpiVThrVec4Stack::vpi_get_value_octstr_(p_vpi_value vp, const vvp_vector4
|
||||||
if (owid > 0) {
|
if (owid > 0) {
|
||||||
owid -= 1;
|
owid -= 1;
|
||||||
rbuf[owid] = oct_digits[oval];
|
rbuf[owid] = oct_digits[oval];
|
||||||
oval = 0;
|
|
||||||
}
|
}
|
||||||
vp->value.str = rbuf;
|
vp->value.str = rbuf;
|
||||||
}
|
}
|
||||||
|
|
@ -490,7 +494,6 @@ void __vpiVThrVec4Stack::vpi_get_value_hexstr_(p_vpi_value vp, const vvp_vector4
|
||||||
if (hwid > 0) {
|
if (hwid > 0) {
|
||||||
hwid -= 1;
|
hwid -= 1;
|
||||||
rbuf[hwid] = hex_digits[hval];
|
rbuf[hwid] = hex_digits[hval];
|
||||||
hval = 0;
|
|
||||||
}
|
}
|
||||||
vp->value.str = rbuf;
|
vp->value.str = rbuf;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2020 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001-2021 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
|
||||||
|
|
@ -2654,7 +2654,7 @@ static bool do_disable(vthread_t thr, vthread_t match)
|
||||||
*/
|
*/
|
||||||
bool of_DISABLE(vthread_t thr, vvp_code_t cp)
|
bool of_DISABLE(vthread_t thr, vvp_code_t cp)
|
||||||
{
|
{
|
||||||
__vpiScope*scope = (__vpiScope*)cp->handle;
|
__vpiScope*scope = static_cast<__vpiScope*>(cp->handle);
|
||||||
|
|
||||||
bool disabled_myself_flag = false;
|
bool disabled_myself_flag = false;
|
||||||
|
|
||||||
|
|
@ -3954,8 +3954,11 @@ bool of_LOAD_VEC4(vthread_t thr, vvp_code_t cp)
|
||||||
if (sig == 0) {
|
if (sig == 0) {
|
||||||
cerr << thr->get_fileline()
|
cerr << thr->get_fileline()
|
||||||
<< "%load/v error: Net arg not a signal? "
|
<< "%load/v error: Net arg not a signal? "
|
||||||
<< (net->fil ? typeid(*net->fil).name() : typeid(*net->fun).name()) << endl;
|
<< (net->fil ? typeid(*net->fil).name() :
|
||||||
|
typeid(*net->fun).name())
|
||||||
|
<< endl;
|
||||||
assert(sig);
|
assert(sig);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extract the value from the signal and directly into the
|
// Extract the value from the signal and directly into the
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef IVL_vvp_net_H
|
#ifndef IVL_vvp_net_H
|
||||||
#define IVL_vvp_net_H
|
#define IVL_vvp_net_H
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2004-2020 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2004-2021 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
|
||||||
|
|
@ -674,7 +674,7 @@ class vvp_vector2_t {
|
||||||
// is true and there are X or Z bits, then the result becomes
|
// is true and there are X or Z bits, then the result becomes
|
||||||
// a NaN value. If enable_NaN is false then X or Z bits are
|
// a NaN value. If enable_NaN is false then X or Z bits are
|
||||||
// converted to 0 as per the standard Verilog rules.
|
// converted to 0 as per the standard Verilog rules.
|
||||||
vvp_vector2_t(const vvp_vector4_t&that, bool allow_NaN = false);
|
explicit vvp_vector2_t(const vvp_vector4_t&that, bool allow_NaN = false);
|
||||||
// Make from a native long and a specified width.
|
// Make from a native long and a specified width.
|
||||||
vvp_vector2_t(unsigned long val, unsigned wid);
|
vvp_vector2_t(unsigned long val, unsigned wid);
|
||||||
// Make with the width, and filled with 1 or 0 bits.
|
// Make with the width, and filled with 1 or 0 bits.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue