diff options
author | Clifford Wolf <clifford@clifford.at> | 2014-07-17 13:49:32 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2014-07-17 13:49:32 +0200 |
commit | 5867f6bcdc10cbccc196a6889f5242c0f090a2f1 (patch) | |
tree | 49d4b6f8c738d739c7fbd075b78a5cb2e30c8f87 /frontends | |
parent | 6d69d4aaa81f176ec97654b5103f6f59eb98c211 (diff) | |
download | yosys-5867f6bcdc10cbccc196a6889f5242c0f090a2f1.tar.gz yosys-5867f6bcdc10cbccc196a6889f5242c0f090a2f1.tar.bz2 yosys-5867f6bcdc10cbccc196a6889f5242c0f090a2f1.zip |
Added support for bit/part select to mem2reg rewriter
Diffstat (limited to 'frontends')
-rw-r--r-- | frontends/ast/simplify.cc | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index 320c80d72..eee5a7b39 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -1974,6 +1974,8 @@ void AstNode::mem2reg_as_needed_pass2(std::set<AstNode*> &mem2reg_set, AstNode * continue; AstNode *cond_node = new AstNode(AST_COND, AstNode::mkconst_int(i, false, addr_bits), new AstNode(AST_BLOCK)); AstNode *assign_reg = new AstNode(type, new AstNode(AST_IDENTIFIER), new AstNode(AST_IDENTIFIER)); + if (children[0]->children.size() == 2) + assign_reg->children[0]->children.push_back(children[0]->children[1]->clone()); assign_reg->children[0]->str = stringf("%s[%d]", children[0]->str.c_str(), i); assign_reg->children[1]->str = id_data; cond_node->children[1]->children.push_back(assign_reg); @@ -1990,6 +1992,10 @@ void AstNode::mem2reg_as_needed_pass2(std::set<AstNode*> &mem2reg_set, AstNode * if (type == AST_IDENTIFIER && id2ast && mem2reg_set.count(id2ast) > 0) { + AstNode *bit_part_sel = NULL; + if (children.size() == 2) + bit_part_sel = children[1]->clone(); + if (children[0]->children[0]->type == AST_CONSTANT) { int id = children[0]->children[0]->integer; @@ -2073,6 +2079,9 @@ void AstNode::mem2reg_as_needed_pass2(std::set<AstNode*> &mem2reg_set, AstNode * id2ast = NULL; str = id_data; } + + if (bit_part_sel) + children.push_back(bit_part_sel); } assert(id2ast == NULL || mem2reg_set.count(id2ast) == 0); |