From 97583ab7295499b1b78ac7035e6e0b37d7b87734 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Tue, 6 Sep 2016 17:34:42 +0200 Subject: [PATCH] Avoid creation of bogus initial blocks for assert/assume in always @* --- frontends/ast/ast.cc | 1 + frontends/ast/ast.h | 1 + frontends/ast/simplify.cc | 12 +++++++++++- 3 files changed, 13 insertions(+), 1 deletion(-) 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; } -- 2.30.2