aboutsummaryrefslogtreecommitdiffstats
path: root/frontends/ast
diff options
context:
space:
mode:
authorZachary Snow <zach@zachjs.com>2022-02-22 16:57:08 +0100
committerZachary Snow <zachary.j.snow@gmail.com>2022-04-05 14:43:48 -0600
commitbf15dbd0f7cac8cfb572e137b9332016d0cc483d (patch)
tree091c9d597ba8be61fa1ffae67cce214f2433f272 /frontends/ast
parent957fdb328a2d9640ca4fb0787189eaded84efbd4 (diff)
downloadyosys-bf15dbd0f7cac8cfb572e137b9332016d0cc483d.tar.gz
yosys-bf15dbd0f7cac8cfb572e137b9332016d0cc483d.tar.bz2
yosys-bf15dbd0f7cac8cfb572e137b9332016d0cc483d.zip
sv: fix always_comb auto nosync for nested and function blocks
Diffstat (limited to 'frontends/ast')
-rw-r--r--frontends/ast/simplify.cc12
1 files changed, 11 insertions, 1 deletions
diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc
index 565025d3a..bd3e09c4b 100644
--- a/frontends/ast/simplify.cc
+++ b/frontends/ast/simplify.cc
@@ -744,6 +744,16 @@ static void mark_auto_nosync(AstNode *block, const AstNode *wire)
false);
}
+// block names can be prefixed with an explicit scope during elaboration
+static bool is_autonamed_block(const std::string &str) {
+ size_t last_dot = str.rfind('.');
+ // unprefixed names: autonamed if the first char is a dollar sign
+ if (last_dot == std::string::npos)
+ return str.at(0) == '$'; // e.g., `$fordecl_block$1`
+ // prefixed names: autonamed if the final chunk begins with a dollar sign
+ return str.rfind(".$") == last_dot; // e.g., `\foo.bar.$fordecl_block$1`
+}
+
// check a procedural block for auto-nosync markings, remove them, and add
// nosync to local variables as necessary
static void check_auto_nosync(AstNode *node)
@@ -2355,7 +2365,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
// if this is an autonamed block is in an always_comb
if (current_always && current_always->attributes.count(ID::always_comb)
- && str.at(0) == '$')
+ && is_autonamed_block(str))
// track local variables in this block so we can consider adding
// nosync once the block has been fully elaborated
for (AstNode *child : children)