From edfb1489c44f473f4d9924a02d562c95edefb9f6 Mon Sep 17 00:00:00 2001 From: Sean Anderson Date: Mon, 22 May 2023 12:01:38 -0400 Subject: [PATCH] Fix coverage generation for unary operators Unary functions (such as reductions) cause an assertion failure in lower_logic_expr_coverage. As they operate on arrays, and arrays are skipped anyway, modify this function to skip such operators. Also remove a debug print while we're here. Add a test case to ensure such functions are excluded from coverage. Closes: #698 --- src/lower.c | 13 ++++--------- test/regress/cover16.sh | 12 ++++++++++++ test/regress/cover16.vhd | 26 ++++++++++++++++++++++++++ test/regress/gold/cover16.txt | 7 +++++++ test/regress/testlist.txt | 1 + 5 files changed, 50 insertions(+), 9 deletions(-) create mode 100755 test/regress/cover16.sh create mode 100644 test/regress/cover16.vhd create mode 100644 test/regress/gold/cover16.txt diff --git a/src/lower.c b/src/lower.c index 78c3d503..2ba27e5d 100644 --- a/src/lower.c +++ b/src/lower.c @@ -1913,23 +1913,18 @@ static vcode_reg_t lower_logic_expr_coverage_for(tree_t fcall, static void lower_logic_expr_coverage(lower_unit_t *lu, tree_t fcall, tree_t decl, vcode_reg_t *args) { - fmt_loc(stdout, tree_loc(decl)); - unsigned flags = cover_get_std_log_expr_flags(decl); if (!flags) return; flags |= COV_FLAG_EXPR_STD_LOGIC; - assert(tree_params(fcall) == 2); - - bool is_array[2] = { - type_is_array(type_param(tree_type(decl), 0)), - type_is_array(type_param(tree_type(decl), 1)) - }; + if (tree_params(fcall) != 2) + return; // Skip arrays -> Matches behavior of VCS and Modelsim - if (is_array[0] || is_array[1]) + if (type_is_array(type_param(tree_type(decl), 0)) || + type_is_array(type_param(tree_type(decl), 1))) return; vcode_reg_t mask = diff --git a/test/regress/cover16.sh b/test/regress/cover16.sh new file mode 100755 index 00000000..aa87f722 --- /dev/null +++ b/test/regress/cover16.sh @@ -0,0 +1,12 @@ +set -xe + +pwd +which nvc + +nvc --std=2019 -a $TESTDIR/regress/cover16.vhd -e --cover cover16 -r +nvc -c --report html work/_WORK.COVER16.elab.covdb 2>&1 | tee out.txt + +# Adjust output to be work directory relative +sed -i -e "s/[^ ]*regress\/data\//data\//g" out.txt + +diff -u $TESTDIR/regress/gold/cover16.txt out.txt diff --git a/test/regress/cover16.vhd b/test/regress/cover16.vhd new file mode 100644 index 00000000..aab9cd5d --- /dev/null +++ b/test/regress/cover16.vhd @@ -0,0 +1,26 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity cover16 is +end cover16; + +architecture test of cover16 is + signal a, b: std_logic := '0'; + signal c, d: std_logic_vector(7 downto 0) := X"00"; +begin + + process begin + c <= d and d; + wait for 1 ns; + c <= b and d; + wait for 1 ns; + c <= d and b; + wait for 1 ns; + a <= and d; + wait for 1 ns; + -- Ensure we have at least one covered expression + a <= '1' and b; + wait; + end process; + +end architecture; diff --git a/test/regress/gold/cover16.txt b/test/regress/gold/cover16.txt new file mode 100644 index 00000000..dbb96dbb --- /dev/null +++ b/test/regress/gold/cover16.txt @@ -0,0 +1,7 @@ +** Note: Code coverage report folder: html. +** Note: Code coverage report contains: covered, uncovered, excluded coverage details. +** Note: code coverage results for: WORK.COVER16 +** Note: statement: 100.0 % (10/10) +** Note: branch: N.A. +** Note: toggle: N.A. +** Note: expression: 33.3 % (1/3) diff --git a/test/regress/testlist.txt b/test/regress/testlist.txt index 0877df0b..7de69223 100644 --- a/test/regress/testlist.txt +++ b/test/regress/testlist.txt @@ -781,3 +781,4 @@ func23 normal,2019 protected9 normal,2019 func24 normal,2019 vhpi6 normal,vhpi +cover16 cover,shell -- 2.39.2