diff options
author | Michael Singer <michael@a-singer.de> | 2021-02-23 01:19:06 +0100 |
---|---|---|
committer | Zachary Snow <zachary.j.snow@gmail.com> | 2021-02-26 12:28:58 -0500 |
commit | 04b41ed04a9fef53ab8be9d8ba1fd438a2286346 (patch) | |
tree | 2192e1d9bb3022537163ba782e74fe9246859285 /frontends/ast/simplify.cc | |
parent | 8434ba5a3bb497f6fbf91dc4384390a4815bb98f (diff) | |
download | yosys-04b41ed04a9fef53ab8be9d8ba1fd438a2286346.tar.gz yosys-04b41ed04a9fef53ab8be9d8ba1fd438a2286346.tar.bz2 yosys-04b41ed04a9fef53ab8be9d8ba1fd438a2286346.zip |
Implement $countones, $isunknown and $onehot{,0}
Diffstat (limited to 'frontends/ast/simplify.cc')
-rw-r--r-- | frontends/ast/simplify.cc | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index 159487771..5c4dd290f 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -3148,6 +3148,34 @@ skip_dynamic_range_lvalue_expansion:; goto apply_newNode; } + if (str == "\\$countones" || str == "\\$isunknown" || str == "\\$onehot" || str == "\\$onehot0") { + if (children.size() != 1) + log_file_error(filename, location.first_line, "System function %s got %d arguments, expected 1.\n", + RTLIL::unescape_id(str).c_str(), int(children.size())); + + AstNode *countbits = clone(); + countbits->str = "\\$countbits"; + + if (str == "\\$countones") { + countbits->children.push_back(mkconst_bits({RTLIL::State::S1}, false)); + newNode = countbits; + } else if (str == "\\$isunknown") { + countbits->children.push_back(mkconst_bits({RTLIL::Sx}, false)); + countbits->children.push_back(mkconst_bits({RTLIL::Sz}, false)); + newNode = new AstNode(AST_GT, countbits, mkconst_int(0, false)); + } else if (str == "\\$onehot") { + countbits->children.push_back(mkconst_bits({RTLIL::State::S1}, false)); + newNode = new AstNode(AST_EQ, countbits, mkconst_int(1, false)); + } else if (str == "\\$onehot0") { + countbits->children.push_back(mkconst_bits({RTLIL::State::S1}, false)); + newNode = new AstNode(AST_LE, countbits, mkconst_int(1, false)); + } else { + log_abort(); + } + + goto apply_newNode; + } + if (current_scope.count(str) != 0 && current_scope[str]->type == AST_DPI_FUNCTION) { AstNode *dpi_decl = current_scope[str]; |