From 0ba2a2b1fa898e48feffa23b8958255d9ed0834c Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Thu, 13 Feb 2020 13:35:29 +0100 Subject: Add new logger pass --- passes/cmds/Makefile.inc | 1 + passes/cmds/logger.cc | 141 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 passes/cmds/logger.cc (limited to 'passes/cmds') diff --git a/passes/cmds/Makefile.inc b/passes/cmds/Makefile.inc index 07a5d3ddc..20b38bf8e 100644 --- a/passes/cmds/Makefile.inc +++ b/passes/cmds/Makefile.inc @@ -33,3 +33,4 @@ OBJS += passes/cmds/blackbox.o OBJS += passes/cmds/ltp.o OBJS += passes/cmds/bugpoint.o OBJS += passes/cmds/scratchpad.o +OBJS += passes/cmds/logger.o diff --git a/passes/cmds/logger.cc b/passes/cmds/logger.cc new file mode 100644 index 000000000..3feef7dc5 --- /dev/null +++ b/passes/cmds/logger.cc @@ -0,0 +1,141 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2020 Miodrag Milanovic + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#include "kernel/register.h" +#include "kernel/log.h" + +USING_YOSYS_NAMESPACE +PRIVATE_NAMESPACE_BEGIN + +struct LoggerPass : public Pass { + LoggerPass() : Pass("logger", "set logger properties") { } + void help() YS_OVERRIDE + { + // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| + log("\n"); + log(" logger [options]\n"); + log("\n"); + log("This command sets global logger properties, also available using command line\n"); + log("options.\n"); + log("\n"); + log(" -[no]time\n"); + log(" enable/disable display of timestamp in log output.\n"); + log("\n"); + log(" -[no]stderr\n"); + log(" enable/disable logging errors to stderr.\n"); + log("\n"); + log(" -warn regex\n"); + log(" print a warning for all log messages matching the regex.\n"); + log("\n"); + log(" -nowarn regex\n"); + log(" if a warning message matches the regex, it is printed as regular\n"); + log(" message instead.\n"); + log("\n"); + log(" -werror regex\n"); + log(" if a warning message matches the regex, it is printed as error\n"); + log(" message instead and the tool terminates with a nonzero return code.\n"); + log("\n"); + log(" -[no]debug\n"); + log(" globally enable/disable debug log messages.\n"); + log("\n"); + log(" -experimental \n"); + log(" do not print warnings for the specified experimental feature\n"); + log("\n"); + } + + void execute(std::vector args, RTLIL::Design * design) YS_OVERRIDE + { + size_t argidx; + for (argidx = 1; argidx < args.size(); argidx++) + { + + if (args[argidx] == "-time") { + log_time = true; + log("Enabled timestamp in logs."); + continue; + } + if (args[argidx] == "-notime") { + log_time = false; + log("Disabled timestamp in logs."); + continue; + } + if (args[argidx] == "-stderr") { + log_error_stderr = true; + log("Enabled loggint errors to stderr."); + continue; + } + if (args[argidx] == "-nostderr") { + log_error_stderr = false; + log("Disabled loggint errors to stderr."); + continue; + } + if (args[argidx] == "-warn" && argidx+1 < args.size()) { + std::string pattern = args[++argidx]; + if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2); + log("Added regex '%s' for warnings to warn list.", pattern.c_str()); + log_warn_regexes.push_back(std::regex(pattern, + std::regex_constants::nosubs | + std::regex_constants::optimize | + std::regex_constants::egrep)); + continue; + } + if (args[argidx] == "-nowarn" && argidx+1 < args.size()) { + std::string pattern = args[++argidx]; + if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2); + log("Added regex '%s' for warnings to nowarn list.", pattern.c_str()); + log_nowarn_regexes.push_back(std::regex(pattern, + std::regex_constants::nosubs | + std::regex_constants::optimize | + std::regex_constants::egrep)); + continue; + } + if (args[argidx] == "-werror" && argidx+1 < args.size()) { + std::string pattern = args[++argidx]; + if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2); + log("Added regex '%s' for warnings to werror list.", pattern.c_str()); + log_werror_regexes.push_back(std::regex(pattern, + std::regex_constants::nosubs | + std::regex_constants::optimize | + std::regex_constants::egrep)); + continue; + } + if (args[argidx] == "-debug") { + log_force_debug = 1; + log("Enabled debug log messages."); + continue; + } + if (args[argidx] == "-nodebug") { + log_force_debug = 0; + log("Disabled debug log messages."); + continue; + } + break; + if (args[argidx] == "-experimental" && argidx+1 < args.size()) { + std::string value = args[++argidx]; + log("Added '%s' experimental ignore list.", value.c_str()); + log_experimentals_ignored.insert(value); + continue; + } + break; + } + extra_args(args, argidx, design, false); + } +} LoggerPass; + +PRIVATE_NAMESPACE_END -- cgit v1.2.3 From 31b7a9c3127560ea0c488b88e93077e08600652f Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 14 Feb 2020 12:21:16 +0100 Subject: Add expect option to logger command --- passes/cmds/logger.cc | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) (limited to 'passes/cmds') diff --git a/passes/cmds/logger.cc b/passes/cmds/logger.cc index 3feef7dc5..30768980e 100644 --- a/passes/cmds/logger.cc +++ b/passes/cmds/logger.cc @@ -57,6 +57,9 @@ struct LoggerPass : public Pass { log(" -experimental \n"); log(" do not print warnings for the specified experimental feature\n"); log("\n"); + log(" -expect \n"); + log(" expect log,warning or error to appear. In case of error return code is 0.\n"); + log("\n"); } void execute(std::vector args, RTLIL::Design * design) YS_OVERRIDE @@ -125,13 +128,44 @@ struct LoggerPass : public Pass { log("Disabled debug log messages."); continue; } - break; if (args[argidx] == "-experimental" && argidx+1 < args.size()) { std::string value = args[++argidx]; log("Added '%s' experimental ignore list.", value.c_str()); log_experimentals_ignored.insert(value); continue; } + if (args[argidx] == "-expect" && argidx+3 < args.size()) { + std::string type = args[++argidx]; + if (type!="error" && type!="warning" && type!="log") + log_cmd_error("Expect command require type to be 'log', 'warning' or 'error' !\n"); + if (type=="error" && log_expect_error.size()>0) + log_cmd_error("Only single error message can be expected !\n"); + std::string pattern = args[++argidx]; + if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2); + int count = atoi(args[++argidx].c_str()); + if (count<=0) + log_cmd_error("Number of expected messages must be higher then 0 !\n"); + if (type=="error" && count!=1) + log_cmd_error("Expected error message occurrences must be 1 !\n"); + log("Added regex '%s' for warnings to expected %s list.\n", pattern.c_str(), type.c_str()); + if (type=="error") + log_expect_error.push_back(std::make_pair(std::regex(pattern, + std::regex_constants::nosubs | + std::regex_constants::optimize | + std::regex_constants::egrep), LogExpectedItem(pattern, count))); + else if (type=="warning") + log_expect_warning.push_back(std::make_pair(std::regex(pattern, + std::regex_constants::nosubs | + std::regex_constants::optimize | + std::regex_constants::egrep), LogExpectedItem(pattern, count))); + else + log_expect_log.push_back(std::make_pair(std::regex(pattern, + std::regex_constants::nosubs | + std::regex_constants::optimize | + std::regex_constants::egrep), LogExpectedItem(pattern, count))); + + continue; + } break; } extra_args(args, argidx, design, false); -- cgit v1.2.3 From 5641b0248fe0781ee62fa3bc903f8db95e80b0c4 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Mon, 17 Feb 2020 15:36:06 +0100 Subject: Option to expect no warnings --- passes/cmds/logger.cc | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'passes/cmds') diff --git a/passes/cmds/logger.cc b/passes/cmds/logger.cc index 30768980e..947b178c5 100644 --- a/passes/cmds/logger.cc +++ b/passes/cmds/logger.cc @@ -60,6 +60,9 @@ struct LoggerPass : public Pass { log(" -expect \n"); log(" expect log,warning or error to appear. In case of error return code is 0.\n"); log("\n"); + log(" -expect-no-warnings\n"); + log(" gives error in case there is at least one warning.\n"); + log("\n"); } void execute(std::vector args, RTLIL::Design * design) YS_OVERRIDE @@ -166,6 +169,10 @@ struct LoggerPass : public Pass { continue; } + if (args[argidx] == "-expect-no-warnings") { + log_expect_no_warnings = true; + continue; + } break; } extra_args(args, argidx, design, false); -- cgit v1.2.3 From 419e67c1706367a3a10feb70a1d7a2f9cafb591b Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Thu, 20 Feb 2020 11:41:37 +0100 Subject: check for regex errors --- passes/cmds/logger.cc | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) (limited to 'passes/cmds') diff --git a/passes/cmds/logger.cc b/passes/cmds/logger.cc index 947b178c5..3abe4e93b 100644 --- a/passes/cmds/logger.cc +++ b/passes/cmds/logger.cc @@ -151,22 +151,26 @@ struct LoggerPass : public Pass { if (type=="error" && count!=1) log_cmd_error("Expected error message occurrences must be 1 !\n"); log("Added regex '%s' for warnings to expected %s list.\n", pattern.c_str(), type.c_str()); - if (type=="error") - log_expect_error.push_back(std::make_pair(std::regex(pattern, - std::regex_constants::nosubs | - std::regex_constants::optimize | - std::regex_constants::egrep), LogExpectedItem(pattern, count))); - else if (type=="warning") - log_expect_warning.push_back(std::make_pair(std::regex(pattern, - std::regex_constants::nosubs | - std::regex_constants::optimize | - std::regex_constants::egrep), LogExpectedItem(pattern, count))); - else - log_expect_log.push_back(std::make_pair(std::regex(pattern, - std::regex_constants::nosubs | - std::regex_constants::optimize | - std::regex_constants::egrep), LogExpectedItem(pattern, count))); - + try { + if (type=="error") + log_expect_error.push_back(std::make_pair(std::regex(pattern, + std::regex_constants::nosubs | + std::regex_constants::optimize | + std::regex_constants::egrep), LogExpectedItem(pattern, count))); + else if (type=="warning") + log_expect_warning.push_back(std::make_pair(std::regex(pattern, + std::regex_constants::nosubs | + std::regex_constants::optimize | + std::regex_constants::egrep), LogExpectedItem(pattern, count))); + else + log_expect_log.push_back(std::make_pair(std::regex(pattern, + std::regex_constants::nosubs | + std::regex_constants::optimize | + std::regex_constants::egrep), LogExpectedItem(pattern, count))); + } + catch (const std::regex_error& e) { + log_cmd_error("Error in regex expression '%s' !\n", pattern.c_str()); + } continue; } if (args[argidx] == "-expect-no-warnings") { -- cgit v1.2.3 From 596bb2d443a589df4deede4cc86783249e3bb09c Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 22 Feb 2020 10:31:56 +0100 Subject: Check other regex parameters --- passes/cmds/logger.cc | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) (limited to 'passes/cmds') diff --git a/passes/cmds/logger.cc b/passes/cmds/logger.cc index 3abe4e93b..018a3e6cf 100644 --- a/passes/cmds/logger.cc +++ b/passes/cmds/logger.cc @@ -94,31 +94,46 @@ struct LoggerPass : public Pass { if (args[argidx] == "-warn" && argidx+1 < args.size()) { std::string pattern = args[++argidx]; if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2); - log("Added regex '%s' for warnings to warn list.", pattern.c_str()); - log_warn_regexes.push_back(std::regex(pattern, - std::regex_constants::nosubs | - std::regex_constants::optimize | - std::regex_constants::egrep)); + try { + log("Added regex '%s' for warnings to warn list.", pattern.c_str()); + log_warn_regexes.push_back(std::regex(pattern, + std::regex_constants::nosubs | + std::regex_constants::optimize | + std::regex_constants::egrep)); + } + catch (const std::regex_error& e) { + log_cmd_error("Error in regex expression '%s' !\n", pattern.c_str()); + } continue; } if (args[argidx] == "-nowarn" && argidx+1 < args.size()) { std::string pattern = args[++argidx]; if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2); - log("Added regex '%s' for warnings to nowarn list.", pattern.c_str()); - log_nowarn_regexes.push_back(std::regex(pattern, - std::regex_constants::nosubs | - std::regex_constants::optimize | - std::regex_constants::egrep)); + try { + log("Added regex '%s' for warnings to nowarn list.", pattern.c_str()); + log_nowarn_regexes.push_back(std::regex(pattern, + std::regex_constants::nosubs | + std::regex_constants::optimize | + std::regex_constants::egrep)); + } + catch (const std::regex_error& e) { + log_cmd_error("Error in regex expression '%s' !\n", pattern.c_str()); + } continue; } if (args[argidx] == "-werror" && argidx+1 < args.size()) { std::string pattern = args[++argidx]; if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2); - log("Added regex '%s' for warnings to werror list.", pattern.c_str()); - log_werror_regexes.push_back(std::regex(pattern, - std::regex_constants::nosubs | - std::regex_constants::optimize | - std::regex_constants::egrep)); + try { + log("Added regex '%s' for warnings to werror list.", pattern.c_str()); + log_werror_regexes.push_back(std::regex(pattern, + std::regex_constants::nosubs | + std::regex_constants::optimize | + std::regex_constants::egrep)); + } + catch (const std::regex_error& e) { + log_cmd_error("Error in regex expression '%s' !\n", pattern.c_str()); + } continue; } if (args[argidx] == "-debug") { -- cgit v1.2.3 From 010d6514501f9f2df1c34ca3fe615a941d6a9cad Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 22 Feb 2020 10:53:23 +0100 Subject: Update explanation for expect-no-warnings --- passes/cmds/logger.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'passes/cmds') diff --git a/passes/cmds/logger.cc b/passes/cmds/logger.cc index 018a3e6cf..ac1cd306c 100644 --- a/passes/cmds/logger.cc +++ b/passes/cmds/logger.cc @@ -61,7 +61,7 @@ struct LoggerPass : public Pass { log(" expect log,warning or error to appear. In case of error return code is 0.\n"); log("\n"); log(" -expect-no-warnings\n"); - log(" gives error in case there is at least one warning.\n"); + log(" gives error in case there is at least one warning that is not expected.\n"); log("\n"); } -- cgit v1.2.3 From 48eed2860c83593f7a074ae27fbd98588a3a062b Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sun, 23 Feb 2020 10:05:21 +0100 Subject: Fix line endings --- passes/cmds/logger.cc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'passes/cmds') diff --git a/passes/cmds/logger.cc b/passes/cmds/logger.cc index ac1cd306c..bd1038a7e 100644 --- a/passes/cmds/logger.cc +++ b/passes/cmds/logger.cc @@ -73,29 +73,29 @@ struct LoggerPass : public Pass { if (args[argidx] == "-time") { log_time = true; - log("Enabled timestamp in logs."); + log("Enabled timestamp in logs.\n"); continue; } if (args[argidx] == "-notime") { log_time = false; - log("Disabled timestamp in logs."); + log("Disabled timestamp in logs.\n"); continue; } if (args[argidx] == "-stderr") { log_error_stderr = true; - log("Enabled loggint errors to stderr."); + log("Enabled loggint errors to stderr.\n"); continue; } if (args[argidx] == "-nostderr") { log_error_stderr = false; - log("Disabled loggint errors to stderr."); + log("Disabled loggint errors to stderr.\n"); continue; } if (args[argidx] == "-warn" && argidx+1 < args.size()) { std::string pattern = args[++argidx]; if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2); try { - log("Added regex '%s' for warnings to warn list.", pattern.c_str()); + log("Added regex '%s' for warnings to warn list.\n", pattern.c_str()); log_warn_regexes.push_back(std::regex(pattern, std::regex_constants::nosubs | std::regex_constants::optimize | @@ -110,7 +110,7 @@ struct LoggerPass : public Pass { std::string pattern = args[++argidx]; if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2); try { - log("Added regex '%s' for warnings to nowarn list.", pattern.c_str()); + log("Added regex '%s' for warnings to nowarn list.\n", pattern.c_str()); log_nowarn_regexes.push_back(std::regex(pattern, std::regex_constants::nosubs | std::regex_constants::optimize | @@ -125,7 +125,7 @@ struct LoggerPass : public Pass { std::string pattern = args[++argidx]; if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2); try { - log("Added regex '%s' for warnings to werror list.", pattern.c_str()); + log("Added regex '%s' for warnings to werror list.\n", pattern.c_str()); log_werror_regexes.push_back(std::regex(pattern, std::regex_constants::nosubs | std::regex_constants::optimize | @@ -138,17 +138,17 @@ struct LoggerPass : public Pass { } if (args[argidx] == "-debug") { log_force_debug = 1; - log("Enabled debug log messages."); + log("Enabled debug log messages.\n"); continue; } if (args[argidx] == "-nodebug") { log_force_debug = 0; - log("Disabled debug log messages."); + log("Disabled debug log messages.\n"); continue; } if (args[argidx] == "-experimental" && argidx+1 < args.size()) { std::string value = args[++argidx]; - log("Added '%s' experimental ignore list.", value.c_str()); + log("Added '%s' experimental ignore list.\n", value.c_str()); log_experimentals_ignored.insert(value); continue; } -- cgit v1.2.3