From 147b84d7a64e354bfe12e1b28ae720249df1f421 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sun, 18 Feb 2024 11:07:40 +0000 Subject: [PATCH] Move assert counter logic into rt/assert.c --- src/jit/jit-exits.c | 12 --------- src/rt/assert.c | 38 +++++++++++++++++++++++++++++ src/rt/assert.h | 7 +++--- src/rt/model.c | 59 ++------------------------------------------- src/rt/shell.c | 7 +++++- 5 files changed, 49 insertions(+), 74 deletions(-) diff --git a/src/jit/jit-exits.c b/src/jit/jit-exits.c index 0c741e23..29e23f5c 100644 --- a/src/jit/jit-exits.c +++ b/src/jit/jit-exits.c @@ -453,12 +453,6 @@ void __nvc_do_exit(jit_exit_t which, jit_anchor_t *anchor, jit_scalar_t *args, int8_t hint_valid = args[5].integer; object_t *where = args[6].pointer; - if (jit_has_runtime(thread->jit)) { - if (!get_vhdl_assert_enable(severity)) - break; - increment_vhdl_assert_count(severity); - } - x_assert_fail(msg, len, severity, hint_left, hint_right, hint_valid, where); } @@ -471,12 +465,6 @@ void __nvc_do_exit(jit_exit_t which, jit_anchor_t *anchor, jit_scalar_t *args, int32_t severity = args[2].integer; object_t *where = args[3].pointer; - if (jit_has_runtime(thread->jit)) { - if (!get_vhdl_assert_enable(severity)) - break; - increment_vhdl_assert_count(severity); - } - x_report(msg, len, severity, where); } break; diff --git a/src/rt/assert.c b/src/rt/assert.c index 05787b79..378c8d65 100644 --- a/src/rt/assert.c +++ b/src/rt/assert.c @@ -76,6 +76,8 @@ static const struct { static format_part_t *format[SEVERITY_FAILURE + 1]; static vhdl_severity_t exit_severity = SEVERITY_FAILURE; +static unsigned counts[SEVERITY_FAILURE + 1]; +static unsigned enable_mask = ~0u; static void free_format(format_part_t *f) { @@ -387,6 +389,8 @@ static void emit_vhdl_diag(diag_t *d, vhdl_severity_t severity) diag_emit(d); + relaxed_add(&counts[severity], 1); + if (severity >= exit_severity) jit_abort_with_status(EXIT_FAILURE); } @@ -396,6 +400,9 @@ void x_report(const uint8_t *msg, int32_t msg_len, int8_t severity, { assert(severity <= SEVERITY_FAILURE); + if (!(enable_mask & (1 << severity))) + return; + const diag_level_t level = get_diag_severity(severity); diag_t *d = diag_new(level, &(where->loc)); @@ -428,6 +435,9 @@ void x_assert_fail(const uint8_t *msg, int32_t msg_len, int8_t severity, assert(severity <= SEVERITY_FAILURE); + if (!(enable_mask & (1 << severity))) + return; + const diag_level_t level = get_diag_severity(severity); diag_t *d = diag_new(level, &(where->loc)); @@ -487,3 +497,31 @@ void set_stderr_severity(vhdl_severity_t severity) { opt_set_int(OPT_STDERR_LEVEL, get_diag_severity(severity)); } + +int64_t get_vhdl_assert_count(vhdl_severity_t severity) +{ + assert(severity <= SEVERITY_FAILURE); + return counts[severity]; +} + +void clear_vhdl_assert(void) +{ + for (int i = SEVERITY_NOTE; i <= SEVERITY_FAILURE; i++) + counts[i] = 0; +} + +void set_vhdl_assert_enable(vhdl_severity_t severity, bool enable) +{ + assert(severity <= SEVERITY_FAILURE); + + if (enable) + enable_mask |= (1 << severity); + else + enable_mask &= ~(1 << severity); +} + +bool get_vhdl_assert_enable(vhdl_severity_t severity) +{ + assert(severity <= SEVERITY_FAILURE); + return !!(enable_mask & (1 << severity)); +} diff --git a/src/rt/assert.h b/src/rt/assert.h index 6dec92bd..b55a05fe 100644 --- a/src/rt/assert.h +++ b/src/rt/assert.h @@ -33,10 +33,9 @@ diag_level_t vhdl_to_diag_severity(vhdl_severity_t severity); vhdl_severity_t set_exit_severity(vhdl_severity_t severity); void set_stderr_severity(vhdl_severity_t severity); -int64_t get_vhdl_assert_count(int8_t severity); -void increment_vhdl_assert_count(int8_t severity); +int64_t get_vhdl_assert_count(vhdl_severity_t severity); void clear_vhdl_assert(void); -void set_vhdl_assert_enable(int8_t severity, bool enable); -bool get_vhdl_assert_enable(int8_t severity); +void set_vhdl_assert_enable(vhdl_severity_t severity, bool enable); +bool get_vhdl_assert_enable(vhdl_severity_t severity); #endif // _RT_ASSERT_H diff --git a/src/rt/model.c b/src/rt/model.c index b1691230..0519544f 100644 --- a/src/rt/model.c +++ b/src/rt/model.c @@ -74,11 +74,6 @@ typedef struct { rt_scope_t *active_scope; } __attribute__((aligned(64))) model_thread_t; -typedef struct _rt_asserts { - unsigned cnts[SEVERITY_FAILURE + 1]; - bool enables[SEVERITY_FAILURE + 1]; -} rt_asserts_t; - typedef void (*defer_fn_t)(rt_model_t *, void *); typedef struct { @@ -125,7 +120,6 @@ typedef struct _rt_model { memblock_t *memblocks; model_thread_t *threads[MAX_THREADS]; ptr_list_t eventsigs; - rt_asserts_t asserts; bool shuffle; } rt_model_t; @@ -2130,14 +2124,6 @@ static void reset_coverage(rt_model_t *m) fbuf_close(f, NULL); } -static void reset_asserts(rt_model_t *m) -{ - for (int i = SEVERITY_NOTE; i <= SEVERITY_FAILURE; i++) { - m->asserts.cnts[i] = 0; - m->asserts.enables[i] = true; - } -} - static void emit_coverage(rt_model_t *m) { if (m->cover != NULL) { @@ -2299,7 +2285,6 @@ void model_reset(rt_model_t *m) // Initialisation is described in LRM 93 section 12.6.4 reset_coverage(m); - reset_asserts(m); reset_scope(m, m->root); if (m->force_stop) @@ -3479,8 +3464,8 @@ int model_exit_status(rt_model_t *m) int status; if (jit_exit_status(m->jit, &status)) return status; - else if (m->asserts.cnts[SEVERITY_ERROR] > 0 - || m->asserts.cnts[SEVERITY_FAILURE] > 0) + else if (get_vhdl_assert_count(SEVERITY_ERROR) > 0 + || get_vhdl_assert_count(SEVERITY_FAILURE) > 0) return EXIT_FAILURE; else if (m->stop_delta > 0 && m->iteration == m->stop_delta) return EXIT_FAILURE; @@ -3565,46 +3550,6 @@ void get_forcing_value(rt_signal_t *s, uint8_t *value) assert(p == value + s->shared.size); } -int64_t get_vhdl_assert_count(int8_t severity) -{ - rt_model_t *m = get_model(); - - assert(severity <= SEVERITY_FAILURE); - return m->asserts.cnts[severity]; -} - -void clear_vhdl_assert(void) -{ - rt_model_t *m = get_model(); - - for (int i = SEVERITY_NOTE; i <= SEVERITY_FAILURE; i++) - m->asserts.cnts[i] = 0; -} - -void increment_vhdl_assert_count(int8_t severity) -{ - rt_model_t *m = get_model(); - - assert(severity <= SEVERITY_FAILURE); - m->asserts.cnts[severity]++; -} - -void set_vhdl_assert_enable(int8_t severity, bool enable) -{ - rt_model_t *m = get_model(); - - assert(severity <= SEVERITY_FAILURE); - m->asserts.enables[severity] = enable; -} - -bool get_vhdl_assert_enable(int8_t severity) -{ - rt_model_t *m = get_model(); - - assert(severity <= SEVERITY_FAILURE); - return m->asserts.enables[severity]; -} - int32_t *get_cover_counter(rt_model_t *m, int32_t tag) { assert(tag >= 0); diff --git a/src/rt/shell.c b/src/rt/shell.c index 1bdc0a6e..2789095b 100644 --- a/src/rt/shell.c +++ b/src/rt/shell.c @@ -1,5 +1,5 @@ // -// Copyright (C) 2011-2023 Nick Gasson +// Copyright (C) 2011-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 @@ -24,6 +24,7 @@ #include "lower.h" #include "phase.h" #include "printer.h" +#include "rt/assert.h" #include "rt/model.h" #include "rt/structs.h" #include "scan.h" @@ -337,6 +338,10 @@ static int shell_cmd_restart(ClientData cd, Tcl_Interp *interp, jit_reset(sh->jit); + clear_vhdl_assert(); + for (vhdl_severity_t s = SEVERITY_NOTE; s <= SEVERITY_FAILURE; s++) + set_vhdl_assert_enable(s, true); + shell_create_model(sh); shell_signal_t *wptr = sh->signals; -- 2.39.2