diff options
author | Clifford Wolf <clifford@clifford.at> | 2016-09-06 17:34:42 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2016-09-06 17:34:42 +0200 |
commit | 97583ab7295499b1b78ac7035e6e0b37d7b87734 (patch) | |
tree | 9299a4475a74ac13d56d45002de90282c40c3f59 | |
parent | dcb5a6ea8aaf857ea02f2a6c789e2a13ce501299 (diff) | |
download | yosys-97583ab7295499b1b78ac7035e6e0b37d7b87734.tar.gz yosys-97583ab7295499b1b78ac7035e6e0b37d7b87734.tar.bz2 yosys-97583ab7295499b1b78ac7035e6e0b37d7b87734.zip |
Avoid creation of bogus initial blocks for assert/assume in always @*
-rw-r--r-- | frontends/ast/ast.cc | 1 | ||||
-rw-r--r-- | frontends/ast/ast.h | 1 | ||||
-rw-r--r-- | frontends/ast/simplify.cc | 12 |
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; } |