diff options
author | Zachary Snow <zach@zachjs.com> | 2019-04-09 12:28:32 -0400 |
---|---|---|
committer | Zachary Snow <zach@zachjs.com> | 2019-04-09 12:28:32 -0400 |
commit | 5855024cccfbcb1919e3225f519bc9f0421c4056 (patch) | |
tree | 2664bb00c67f6308683557878f141f9c3b9b6bb6 /frontends/ast | |
parent | 22035c20ff071ec5c30990258850ecf97de5d5b3 (diff) | |
download | yosys-5855024cccfbcb1919e3225f519bc9f0421c4056.tar.gz yosys-5855024cccfbcb1919e3225f519bc9f0421c4056.tar.bz2 yosys-5855024cccfbcb1919e3225f519bc9f0421c4056.zip |
support repeat loops with constant repeat counts outside of constant functions
Diffstat (limited to 'frontends/ast')
-rw-r--r-- | frontends/ast/simplify.cc | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index 63b71b800..76da5a97c 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -1030,7 +1030,26 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, log_file_error(filename, linenum, "While loops are only allowed in constant functions!\n"); if (type == AST_REPEAT) - log_file_error(filename, linenum, "Repeat loops are only allowed in constant functions!\n"); + { + AstNode *count = children[0]; + AstNode *body = children[1]; + + // eval count expression + while (count->simplify(true, false, false, stage, 32, true, false)) { } + + if (count->type != AST_CONSTANT) + log_file_error(filename, linenum, "Repeat loops outside must have constant repeat counts!\n"); + + // convert to a block with the body repeated n times + type = AST_BLOCK; + children.clear(); + for (int i = 0; i < count->bitsAsConst().as_int(); i++) + children.insert(children.begin(), body->clone()); + + delete count; + delete body; + did_something = true; + } // unroll for loops and generate-for blocks if ((type == AST_GENFOR || type == AST_FOR) && children.size() != 0) |