3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-06-20 21:03:40 +00:00

raise_error.cc: Option for direct to stderr

Add more to help text to describe usage.
Add test for no value (should `exit(1)`).
This commit is contained in:
Krystine Sherwin 2025-05-13 17:05:17 +12:00
parent 107b768cdd
commit b5c91c53a6
No known key found for this signature in database
2 changed files with 57 additions and 10 deletions

View file

@ -9,18 +9,35 @@ struct RaiseErrorPass : public Pass {
{ {
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
log("\n"); log("\n");
log(" raise_error [selection]\n"); log(" raise_error [options] [selection]\n");
log("\n"); log("\n");
log("Test error handling by raising arbitrary errors. This pass iterates over the\n"); log("Test error handling by raising arbitrary errors. This pass iterates over the\n");
log("design (or selection of it) checking for objects with the 'raise_error'\n"); log("design (or selection of it) checking for objects with the 'raise_error'\n");
log("attribute set.\n"); log("attribute set. Assigning 'raise_error' to a string more than one character long\n");
log("will log that string as an error message before exiting. Assigning 'raise_error'\n");
log("to an integer (less than 256) will exit with that value as the exit code.\n");
log("\n");
log(" -stderr\n");
log(" Log error messages directly to stderr instead of using 'log_error'.\n");
log("\n"); log("\n");
} }
void execute(vector<string> args, RTLIL::Design *design) override void execute(vector<string> args, RTLIL::Design *design) override
{ {
log_header(design, "Executing RAISE_ERROR pass.\n"); log_header(design, "Executing RAISE_ERROR pass.\n");
extra_args(args, 1, design, true); bool use_stderr = false;
int argidx;
for (argidx = 1; argidx < GetSize(args); argidx++)
{
if (args[argidx] == "-stderr") {
use_stderr = true;
continue;
}
break;
}
extra_args(args, argidx, design, true);
RTLIL::NamedObject *err_obj = nullptr; RTLIL::NamedObject *err_obj = nullptr;
@ -43,15 +60,20 @@ struct RaiseErrorPass : public Pass {
auto err_no = err_obj->attributes[ID::raise_error].as_int(); auto err_no = err_obj->attributes[ID::raise_error].as_int();
if (err_no < 256) { if (err_no < 256) {
log_flush(); log_flush();
} else {
auto err_msg = err_obj->get_string_attribute(ID::raise_error);
if (use_stderr) {
std::cerr << err_msg << std::endl;
err_no = 1;
} else {
log_error("%s\n", err_msg.c_str());
}
}
#if defined(_MSC_VER) #if defined(_MSC_VER)
_exit(err_no); _exit(err_no);
#else #else
_Exit(err_no); _Exit(err_no);
#endif #endif
} else {
auto err_msg = err_obj->get_string_attribute(ID::raise_error);
log_error("%s\n", err_msg.c_str());
}
} else { } else {
log("'raise_error' attribute not found\n"); log("'raise_error' attribute not found\n");
} }

View file

@ -7,7 +7,8 @@ endmodule
module other(); module other();
endmodule endmodule
module zzy(); (* raise_error *)
module def();
endmodule endmodule
EOF EOF
select -assert-mod-count 3 =* select -assert-mod-count 3 =*
@ -25,3 +26,27 @@ rename top abc
bugpoint -yosys ../../yosys -command raise_error -grep "help me" bugpoint -yosys ../../yosys -command raise_error -grep "help me"
select -assert-mod-count 1 =* select -assert-mod-count 1 =*
select -assert-mod-count 1 other select -assert-mod-count 1 other
# raise_error with no value exits with 1
design -load read
rename def zzy
bugpoint -yosys ../../yosys -command raise_error -expect-return 1
select -assert-mod-count 1 =*
select -assert-mod-count 1 zzy
# raise_error -stderr exits with 1
design -load read
rename top abc
delete def
bugpoint -yosys ../../yosys -command "raise_error -stderr" -expect-return 1
select -assert-mod-count 1 =*
select -assert-mod-count 1 other
#TODO
# raise_error -stderr prints to stderr
design -load read
rename top abc
delete def
# bugpoint -yosys ../../yosys -command "raise_error -stderr" -grep "help me"
# select -assert-mod-count 1 =*
# select -assert-mod-count 1 other