From 7fb9470d5dbe2b732a187883c8d3fdaedf9a2ab0 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Tue, 27 Feb 2024 18:07:41 +0000 Subject: [PATCH] Look up signal bounds dynamically in FST dumper. Issue #851 --- src/nvc.c | 2 +- src/rt/wave.c | 61 ++++++++++++++------------------- src/rt/wave.h | 4 +-- test/regress/gold/issue851.dump | 10 ++++++ test/regress/issue851.vhd | 19 ++++++++++ test/regress/testlist.txt | 1 + 6 files changed, 59 insertions(+), 38 deletions(-) create mode 100644 test/regress/gold/issue851.dump create mode 100644 test/regress/issue851.vhd diff --git a/src/nvc.c b/src/nvc.c index 86a36006..0a4f9eb5 100644 --- a/src/nvc.c +++ b/src/nvc.c @@ -836,7 +836,7 @@ static int run_cmd(int argc, char **argv, cmd_state_t *state) model_reset(model); if (dumper != NULL) - wave_dumper_restart(dumper, model); + wave_dumper_restart(dumper, model, state->jit); model_run(model, stop_time); diff --git a/src/rt/wave.c b/src/rt/wave.c index 5273755d..55680637 100644 --- a/src/rt/wave.c +++ b/src/rt/wave.c @@ -1,5 +1,5 @@ // -// Copyright (C) 2013-2022 Nick Gasson +// Copyright (C) 2013-2024 Nick Gasson // // 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 @@ -98,6 +98,7 @@ typedef struct _wave_dumper { FILE *vcdfile; char *tmpfst; uint64_t last_time; + jit_t *jit; } wave_dumper_t; static glob_array_t incl; @@ -417,44 +418,33 @@ static fst_type_t *fst_type_for(type_t type, const loc_t *loc) return NULL; } -static void fst_get_array_range(type_t type, rt_signal_t *s, +static void fst_get_array_range(wave_dumper_t *wd, type_t type, rt_signal_t *s, int64_t *msb, int64_t *lsb, int64_t *length) { - tree_t r; - if (type_is_unconstrained(type)) { - const int signal_w = s->shared.size / s->nexus.size; - - *lsb = 0; - *msb = signal_w - 1; - *length = signal_w; - return; + if (!type_is_unconstrained(type)) { + tree_t r = range_of(type, 0); + if (folded_length(r, length)) { + *msb = assume_int(tree_left(r)); + *lsb = assume_int(tree_right(r)); + return; + } } - else - r = range_of(type, 0); - const range_kind_t rkind = tree_subkind(r); - assert(rkind != RANGE_EXPR); + if (s->parent->kind == SCOPE_INSTANCE) { + jit_handle_t handle = jit_lazy_compile(wd->jit, s->parent->name); + void *base = jit_get_frame_var(wd->jit, handle, tree_ident(s->where)); + ffi_dim_t *dims = base + 2*sizeof(int64_t); - int64_t low, high; - if (!folded_bounds(r, &low, &high)) { + *lsb = ffi_array_right(dims[0].left, dims[0].length); + *msb = dims[0].left; + *length = ffi_array_length(dims[0].length); + } + else { const int signal_w = s->shared.size / s->nexus.size; - - tree_t tlow = rkind == RANGE_TO ? tree_left(r) : tree_right(r); - tree_t thigh = rkind == RANGE_TO ? tree_right(r) : tree_left(r); - - if (folded_int(tlow, &low)) - high = low + signal_w - 1; - else if (folded_int(thigh, &high)) - low = high - signal_w + 1; - else { - low = 0; - high = signal_w - 1; - } + *msb = signal_w - 1; + *lsb = 0; + *length = signal_w; } - - *msb = rkind == RANGE_TO ? low : high; - *lsb = rkind == RANGE_TO ? high : low; - *length = MAX(high - low + 1, 0); } static void fst_create_array_var(wave_dumper_t *wd, tree_t d, rt_signal_t *s, @@ -471,7 +461,7 @@ static void fst_create_array_var(wave_dumper_t *wd, tree_t d, rt_signal_t *s, } int64_t lsb, msb, length; - fst_get_array_range(type, s, &msb, &lsb, &length); + fst_get_array_range(wd, type, s, &msb, &lsb, &length); tb_rewind(tb); tb_istr(tb, tree_ident(d)); @@ -686,7 +676,7 @@ static void fst_alias_var(wave_dumper_t *wd, tree_t d, rt_signal_t *s, tb_istr(tb, tree_ident(d)); if (type_is_array(type)) { int64_t lsb, msb, length; - fst_get_array_range(type, s, &msb, &lsb, &length); + fst_get_array_range(wd, type, s, &msb, &lsb, &length); tb_printf(tb, "[%"PRIi64":%"PRIi64"]", msb, lsb); } @@ -835,10 +825,11 @@ static void fst_walk_design(wave_dumper_t *wd, tree_t block) } } -void wave_dumper_restart(wave_dumper_t *wd, rt_model_t *m) +void wave_dumper_restart(wave_dumper_t *wd, rt_model_t *m, jit_t *jit) { wd->last_time = UINT64_MAX; wd->model = m; + wd->jit = jit; fst_walk_design(wd, tree_stmt(wd->top, 0)); diff --git a/src/rt/wave.h b/src/rt/wave.h index 9ec51f92..2e7bbd4a 100644 --- a/src/rt/wave.h +++ b/src/rt/wave.h @@ -1,5 +1,5 @@ // -// Copyright (C) 2013-2022 Nick Gasson +// Copyright (C) 2013-2024 Nick Gasson // // 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 @@ -28,7 +28,7 @@ typedef enum { wave_dumper_t *wave_dumper_new(const char *file, const char *gtkw_file, tree_t top, wave_format_t format); void wave_dumper_free(wave_dumper_t *wd); -void wave_dumper_restart(wave_dumper_t *wd, rt_model_t *m); +void wave_dumper_restart(wave_dumper_t *wd, rt_model_t *m, jit_t *jit); void wave_include_glob(const char *glob); void wave_exclude_glob(const char *glob); diff --git a/test/regress/gold/issue851.dump b/test/regress/gold/issue851.dump new file mode 100644 index 00000000..ee9ecd17 --- /dev/null +++ b/test/regress/gold/issue851.dump @@ -0,0 +1,10 @@ +#0 issue851.b.t[1:3] 000 +#0 issue851.b.p[1:3] 101 +#0 issue851.s[1:3] 101 +#1000000 issue851.s[1:3] 111 +#1000000 issue851.b.p[1:3] 111 +#1000000 issue851.b.t[1:3] 101 +#2000000 issue851.b.t[1:3] 111 +#2000000 issue851.b.p[1:3] 001 +#2000000 issue851.s[1:3] 001 +#3000000 issue851.b.t[1:3] 001 diff --git a/test/regress/issue851.vhd b/test/regress/issue851.vhd new file mode 100644 index 00000000..9b577580 --- /dev/null +++ b/test/regress/issue851.vhd @@ -0,0 +1,19 @@ +entity issue851 is +end entity; + +architecture test of issue851 is + signal s : bit_vector(1 to 3); +begin + + b: block is + port ( p : in bit_vector ); + port map ( s ); + + signal t : p'subtype; + begin + t <= s after 1 ns; + end block; + + s <= "101", "111" after 1 ns, "001" after 2 ns; + +end architecture; diff --git a/test/regress/testlist.txt b/test/regress/testlist.txt index d5eff261..2ad118ea 100644 --- a/test/regress/testlist.txt +++ b/test/regress/testlist.txt @@ -945,3 +945,4 @@ issue850 shell vlog7 verilog,gold wait27 normal issue808 verilog,gold +issue851 wave,2008 -- 2.39.2