From 6b3208b522d80467dcde5da5034a89a74cd07f39 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Thu, 28 Jul 2022 18:42:50 +0100 Subject: [PATCH] Lowering for 'STABLE and 'QUIET attributes. Issue #495 --- src/lower.c | 29 +++++++++++++++++++++++++++++ test/regress/implicit4.vhd | 33 +++++++++++++++++++++++++++++++++ test/regress/testlist.txt | 1 + 3 files changed, 63 insertions(+) create mode 100644 test/regress/implicit4.vhd diff --git a/src/lower.c b/src/lower.c index 98c6d4a1..ea063972 100644 --- a/src/lower.c +++ b/src/lower.c @@ -4001,6 +4001,35 @@ static vcode_reg_t lower_attr_ref(tree_t expr, expr_ctx_t ctx) return emit_cast(lower_type(type), lower_bounds(type), arg); } + case ATTR_STABLE: + case ATTR_QUIET: + { + tree_t param = tree_value(tree_param(expr, 0)); + vcode_reg_t param_reg = lower_param(param, NULL, PORT_IN); + + type_t name_type = tree_type(name); + vcode_reg_t name_reg = lower_expr(name, EXPR_LVALUE), len_reg; + if (type_is_array(name_type)) { + len_reg = lower_array_total_len(name_type, name_reg); + name_reg = lower_array_data(name_reg); + } + else + len_reg = emit_const(vtype_offset(), 1); + + vcode_reg_t flag_reg, time_reg; + if (predef == ATTR_STABLE) { + time_reg = emit_last_event(name_reg, len_reg); + flag_reg = emit_event_flag(name_reg, len_reg); + } + else { + time_reg = emit_last_active(name_reg, len_reg); + flag_reg = emit_active_flag(name_reg, len_reg); + } + + vcode_reg_t cmp_reg = emit_cmp(VCODE_CMP_GEQ, time_reg, param_reg); + return emit_and(cmp_reg, emit_not(flag_reg)); + } + default: fatal_at(tree_loc(expr), "cannot lower attribute %s (%d)", istr(tree_ident(expr)), predef); diff --git a/test/regress/implicit4.vhd b/test/regress/implicit4.vhd new file mode 100644 index 00000000..7b868f31 --- /dev/null +++ b/test/regress/implicit4.vhd @@ -0,0 +1,33 @@ +entity implicit4 is +end entity; + +architecture test of implicit4 is + signal x : integer; +begin + + p1: process is + begin + assert x'stable; + assert x'quiet; + assert x'stable(1 hr); + assert x'quiet(1 hr); + x <= 4; + wait for 0 ns; + assert not x'stable; + assert not x'quiet; + wait for 0 ns; + assert x'stable; + assert x'quiet; + assert not x'stable(1 ns); + assert not x'quiet(1 ns); + wait for 1 ns; + assert x'stable(1 ns); + assert x'quiet(1 ns); + x <= 4; + wait for 0 ns; + assert x'stable; + assert not x'quiet; + wait; + end process; + +end architecture; diff --git a/test/regress/testlist.txt b/test/regress/testlist.txt index 415df2ce..9419aaa5 100644 --- a/test/regress/testlist.txt +++ b/test/regress/testlist.txt @@ -634,3 +634,4 @@ issue493 shell issue494 fail,gold record36 normal,2008 issue497 normal,2008 +implicit4 normal -- 2.39.2