diff options
author | Andrew Zonenberg <azonenberg@drawersteak.com> | 2015-09-19 00:00:00 +0000 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2015-09-19 10:33:37 +0200 |
commit | c469f221447bb01b5e35c16819eee81ece7d356a (patch) | |
tree | 9d48b0ad7957fb19188e31e1e88f55d7832a2f7a /frontends | |
parent | 598a475724b51954cb40c991dc3ed26cc11f81ec (diff) | |
download | yosys-c469f221447bb01b5e35c16819eee81ece7d356a.tar.gz yosys-c469f221447bb01b5e35c16819eee81ece7d356a.tar.bz2 yosys-c469f221447bb01b5e35c16819eee81ece7d356a.zip |
Improvements to $display system task
Diffstat (limited to 'frontends')
-rw-r--r-- | frontends/ast/simplify.cc | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index dd4f0797e..6dc9aed31 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -212,6 +212,19 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, // format specifier if(sformat[i] == '%') { + // If there's no next character, that's a problem + if(i+1 >= sformat.length()) + log_error("System task `%s' called with `%%' at end of string at %s:%d.\n", str.c_str(), filename.c_str(), linenum); + + char cformat = sformat[++i]; + + // %% is special, does not need a matching argument + if(cformat == '%') + { + sout += '%'; + continue; + } + // If we're out of arguments, that's a problem! if(next_arg >= nargs) log_error("System task `%s' called with more format specifiers than arguments at %s:%d.\n", str.c_str(), filename.c_str(), linenum); @@ -222,18 +235,9 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, if (node_arg->type != AST_CONSTANT) log_error("Failed to evaluate system task `%s' with non-constant argument at %s:%d.\n", str.c_str(), filename.c_str(), linenum); - // If there's no next character, that's a problem - if(i+1 >= sformat.length()) - log_error("System task `%s' called with `%%' at end of string at %s:%d.\n", str.c_str(), filename.c_str(), linenum); - // Everything from here on depends on the format specifier - char cformat = sformat[++i]; switch(cformat) { - case '%': - sout += '%'; - break; - case 's': case 'S': sout += node_arg->bitsAsConst().decode_string(); @@ -248,6 +252,15 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, } break; + case 'x': + case 'X': + { + char tmp[128]; + snprintf(tmp, sizeof(tmp), "%x", node_arg->bitsAsConst().as_int()); + sout += tmp; + } + break; + default: log_error("System task `%s' called with invalid format specifier at %s:%d.\n", str.c_str(), filename.c_str(), linenum); break; |