summaryrefslogtreecommitdiff
path: root/frontends
diff options
context:
space:
mode:
authorAndrew Zonenberg <azonenberg@drawersteak.com>2015-09-19 00:00:00 +0000
committerClifford Wolf <clifford@clifford.at>2015-09-19 10:33:37 +0200
commitc469f221447bb01b5e35c16819eee81ece7d356a (patch)
tree9d48b0ad7957fb19188e31e1e88f55d7832a2f7a /frontends
parent598a475724b51954cb40c991dc3ed26cc11f81ec (diff)
Improvements to $display system task
Diffstat (limited to 'frontends')
-rw-r--r--frontends/ast/simplify.cc31
1 files changed, 22 insertions, 9 deletions
diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc
index dd4f0797..6dc9aed3 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;