diff options
author | Clifford Wolf <clifford@clifford.at> | 2014-10-16 00:44:23 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2014-10-16 00:44:23 +0200 |
commit | 6b05a9e8075af923c67ec3bb1b74573294ac8838 (patch) | |
tree | fad7b2de23e12e36198d1753921b21db7c7c6333 /frontends/ast | |
parent | 82ed814fa1d0e8e58392210976069daa4faa3f4a (diff) | |
download | yosys-6b05a9e8075af923c67ec3bb1b74573294ac8838.tar.gz yosys-6b05a9e8075af923c67ec3bb1b74573294ac8838.tar.bz2 yosys-6b05a9e8075af923c67ec3bb1b74573294ac8838.zip |
Fixed handling of invalid array access in mem2reg code
Diffstat (limited to 'frontends/ast')
-rw-r--r-- | frontends/ast/ast.h | 1 | ||||
-rw-r--r-- | frontends/ast/simplify.cc | 17 |
2 files changed, 15 insertions, 3 deletions
diff --git a/frontends/ast/ast.h b/frontends/ast/ast.h index 0a4016736..56f5d888d 100644 --- a/frontends/ast/ast.h +++ b/frontends/ast/ast.h @@ -209,6 +209,7 @@ namespace AST void mem2reg_as_needed_pass1(std::map<AstNode*, std::set<std::string>> &mem2reg_places, std::map<AstNode*, uint32_t> &mem2reg_flags, std::map<AstNode*, uint32_t> &proc_flags, uint32_t &status_flags); void mem2reg_as_needed_pass2(std::set<AstNode*> &mem2reg_set, AstNode *mod, AstNode *block); + bool mem2reg_check(std::set<AstNode*> &mem2reg_set); void meminfo(int &mem_width, int &mem_size, int &addr_bits); // additional functionality for evaluating constant functions diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index 9f33ea780..7e15283c4 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -2179,14 +2179,25 @@ void AstNode::mem2reg_as_needed_pass1(std::map<AstNode*, std::set<std::string>> } } +bool AstNode::mem2reg_check(std::set<AstNode*> &mem2reg_set) +{ + if (type != AST_IDENTIFIER || !id2ast || !mem2reg_set.count(id2ast)) + return false; + + if (children.empty() || children[0]->type != AST_RANGE || GetSize(children[0]->children) != 1) + log_error("Invalid array access at %s:%d.\n", filename.c_str(), linenum); + + return true; +} + // actually replace memories with registers void AstNode::mem2reg_as_needed_pass2(std::set<AstNode*> &mem2reg_set, AstNode *mod, AstNode *block) { if (type == AST_BLOCK) block = this; - if ((type == AST_ASSIGN_LE || type == AST_ASSIGN_EQ) && block != NULL && children[0]->id2ast && - mem2reg_set.count(children[0]->id2ast) > 0 && children[0]->children[0]->children[0]->type != AST_CONSTANT) + if ((type == AST_ASSIGN_LE || type == AST_ASSIGN_EQ) && block != NULL && + children[0]->mem2reg_check(mem2reg_set) && children[0]->children[0]->children[0]->type != AST_CONSTANT) { std::stringstream sstr; sstr << "$mem2reg_wr$" << children[0]->str << "$" << filename << ":" << linenum << "$" << (autoidx++); @@ -2242,7 +2253,7 @@ void AstNode::mem2reg_as_needed_pass2(std::set<AstNode*> &mem2reg_set, AstNode * type = AST_ASSIGN_EQ; } - if (type == AST_IDENTIFIER && id2ast && mem2reg_set.count(id2ast) > 0) + if (mem2reg_check(mem2reg_set)) { AstNode *bit_part_sel = NULL; if (children.size() == 2) |