aboutsummaryrefslogtreecommitdiffstats
path: root/frontends
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2016-09-06 17:34:42 +0200
committerClifford Wolf <clifford@clifford.at>2016-09-06 17:34:42 +0200
commit97583ab7295499b1b78ac7035e6e0b37d7b87734 (patch)
tree9299a4475a74ac13d56d45002de90282c40c3f59 /frontends
parentdcb5a6ea8aaf857ea02f2a6c789e2a13ce501299 (diff)
downloadyosys-97583ab7295499b1b78ac7035e6e0b37d7b87734.tar.gz
yosys-97583ab7295499b1b78ac7035e6e0b37d7b87734.tar.bz2
yosys-97583ab7295499b1b78ac7035e6e0b37d7b87734.zip
Avoid creation of bogus initial blocks for assert/assume in always @*
Diffstat (limited to 'frontends')
-rw-r--r--frontends/ast/ast.cc1
-rw-r--r--frontends/ast/ast.h1
-rw-r--r--frontends/ast/simplify.cc12
3 files changed, 13 insertions, 1 deletions
diff --git a/frontends/ast/ast.cc b/frontends/ast/ast.cc
index fea7c1814..fd2724009 100644
--- a/frontends/ast/ast.cc
+++ b/frontends/ast/ast.cc
@@ -52,6 +52,7 @@ namespace AST_INTERNAL {
RTLIL::SigSpec ignoreThisSignalsInInitial;
AstNode *current_always, *current_top_block, *current_block, *current_block_child;
AstModule *current_module;
+ bool current_always_clocked;
}
// convert node types to string
diff --git a/frontends/ast/ast.h b/frontends/ast/ast.h
index c9fe58a3d..cd6e264e6 100644
--- a/frontends/ast/ast.h
+++ b/frontends/ast/ast.h
@@ -310,6 +310,7 @@ namespace AST_INTERNAL
extern RTLIL::SigSpec ignoreThisSignalsInInitial;
extern AST::AstNode *current_always, *current_top_block, *current_block, *current_block_child;
extern AST::AstModule *current_module;
+ extern bool current_always_clocked;
struct ProcessGenerator;
}
diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc
index aa2afa4ce..8387c11c6 100644
--- a/frontends/ast/simplify.cc
+++ b/frontends/ast/simplify.cc
@@ -397,9 +397,18 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
auto backup_current_block_child = current_block_child;
auto backup_current_top_block = current_top_block;
auto backup_current_always = current_always;
+ auto backup_current_always_clocked = current_always_clocked;
if (type == AST_ALWAYS || type == AST_INITIAL)
+ {
current_always = this;
+ current_always_clocked = false;
+
+ if (type == AST_ALWAYS)
+ for (auto child : children)
+ if (child->type == AST_POSEDGE || child->type == AST_NEGEDGE)
+ current_always_clocked = true;
+ }
int backup_width_hint = width_hint;
bool backup_sign_hint = sign_hint;
@@ -652,6 +661,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
current_block_child = backup_current_block_child;
current_top_block = backup_current_top_block;
current_always = backup_current_always;
+ current_always_clocked = backup_current_always_clocked;
for (auto it = backup_scope.begin(); it != backup_scope.end(); it++) {
if (it->second == NULL)
@@ -1367,7 +1377,7 @@ skip_dynamic_range_lvalue_expansion:;
AstNode *wire_en = new AstNode(AST_WIRE);
wire_en->str = id_en;
current_ast_mod->children.push_back(wire_en);
- if (current_always == nullptr || current_always->type != AST_INITIAL) {
+ if (current_always_clocked) {
current_ast_mod->children.push_back(new AstNode(AST_INITIAL, new AstNode(AST_BLOCK, new AstNode(AST_ASSIGN_LE, new AstNode(AST_IDENTIFIER), AstNode::mkconst_int(0, false, 1)))));
current_ast_mod->children.back()->children[0]->children[0]->children[0]->str = id_en;
}