diff options
author | Clifford Wolf <clifford@clifford.at> | 2014-06-07 11:48:50 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2014-06-07 11:48:50 +0200 |
commit | e275e8eef9ae47670075bd73a671f3acd3c0ca52 (patch) | |
tree | 415c0b5d2de494ac0d72a92745d3a1c0cc703275 /frontends/ast | |
parent | 0b1ce63a19025f73fe4d2a54253134ea9a4de625 (diff) | |
download | yosys-e275e8eef9ae47670075bd73a671f3acd3c0ca52.tar.gz yosys-e275e8eef9ae47670075bd73a671f3acd3c0ca52.tar.bz2 yosys-e275e8eef9ae47670075bd73a671f3acd3c0ca52.zip |
Add support for cell arrays
Diffstat (limited to 'frontends/ast')
-rw-r--r-- | frontends/ast/ast.cc | 1 | ||||
-rw-r--r-- | frontends/ast/ast.h | 1 | ||||
-rw-r--r-- | frontends/ast/simplify.cc | 25 |
3 files changed, 27 insertions, 0 deletions
diff --git a/frontends/ast/ast.cc b/frontends/ast/ast.cc index 105645f95..0780f7b59 100644 --- a/frontends/ast/ast.cc +++ b/frontends/ast/ast.cc @@ -127,6 +127,7 @@ std::string AST::type2str(AstNodeType type) X(AST_ASSIGN) X(AST_CELL) X(AST_PRIMITIVE) + X(AST_CELLARRAY) X(AST_ALWAYS) X(AST_INITIAL) X(AST_BLOCK) diff --git a/frontends/ast/ast.h b/frontends/ast/ast.h index 3e69e3bc0..802bf98ff 100644 --- a/frontends/ast/ast.h +++ b/frontends/ast/ast.h @@ -107,6 +107,7 @@ namespace AST AST_ASSIGN, AST_CELL, AST_PRIMITIVE, + AST_CELLARRAY, AST_ALWAYS, AST_INITIAL, AST_BLOCK, diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index e5e8980a2..fc040baac 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -878,6 +878,31 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, did_something = true; } + // unroll cell arrays + if (type == AST_CELLARRAY) + { + if (!children.at(0)->range_valid) + log_error("Non-constant array range on cell array at %s:%d.\n", filename.c_str(), linenum); + + newNode = new AstNode(AST_GENBLOCK); + int num = std::max(children.at(0)->range_left, children.at(0)->range_right) - std::min(children.at(0)->range_left, children.at(0)->range_right) + 1; + + for (int i = 0; i < num; i++) { + int idx = children.at(0)->range_left > children.at(0)->range_right ? children.at(0)->range_right + i : children.at(0)->range_right - i; + AstNode *new_cell = children.at(1)->clone(); + newNode->children.push_back(new_cell); + new_cell->str += stringf("[%d]", idx); + if (new_cell->type == AST_PRIMITIVE) { + log_error("Cell arrays of primitives are currently not supported at %s:%d.\n", filename.c_str(), linenum); + } else { + log_assert(new_cell->children.at(0)->type == AST_CELLTYPE); + new_cell->children.at(0)->str = stringf("$array:%d:%d:%s", i, num, new_cell->children.at(0)->str.c_str()); + } + } + + goto apply_newNode; + } + // replace primitives with assignmens if (type == AST_PRIMITIVE) { |