mirror of https://github.com/YosysHQ/yosys.git
Added support for $clog2 system function
This commit is contained in:
parent
4a4a3fc337
commit
3c220e0b32
|
@ -1052,11 +1052,27 @@ skip_dynamic_range_lvalue_expansion:;
|
|||
// replace function and task calls with the code from the function or task
|
||||
if ((type == AST_FCALL || type == AST_TCALL) && !str.empty())
|
||||
{
|
||||
if (type == AST_FCALL) {
|
||||
if (current_scope.count(str) == 0 || current_scope[str]->type != AST_FUNCTION) {
|
||||
current_ast_mod->dumpAst(stderr, "> ");
|
||||
log_error("Can't resolve function name `%s' at %s:%d.\n", str.c_str(), filename.c_str(), linenum);
|
||||
if (type == AST_FCALL)
|
||||
{
|
||||
if (str == "\\$clog2")
|
||||
{
|
||||
AstNode *buf = children[0]->clone();
|
||||
while (buf->simplify(true, false, false, stage, width_hint, sign_hint)) { }
|
||||
if (!buf->type == AST_CONSTANT)
|
||||
log_error("Failed to evaluate system function `%s' with non-constant value at %s:%d.\n", str.c_str(), filename.c_str(), linenum);
|
||||
|
||||
RTLIL::Const arg_value = buf->bitsAsConst();
|
||||
uint32_t result = 0;
|
||||
for (size_t i = 0; i < arg_value.bits.size(); i++)
|
||||
if (arg_value.bits.at(i) == RTLIL::State::S1)
|
||||
result = i;
|
||||
|
||||
newNode = mkconst_int(result, false);
|
||||
goto apply_newNode;
|
||||
}
|
||||
|
||||
if (current_scope.count(str) == 0 || current_scope[str]->type != AST_FUNCTION)
|
||||
log_error("Can't resolve function name `%s' at %s:%d.\n", str.c_str(), filename.c_str(), linenum);
|
||||
}
|
||||
if (type == AST_TCALL) {
|
||||
if (current_scope.count(str) == 0 || current_scope[str]->type != AST_TASK)
|
||||
|
|
Loading…
Reference in New Issue