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
|
// 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 || type == AST_TCALL) && !str.empty())
|
||||||
{
|
{
|
||||||
if (type == AST_FCALL) {
|
if (type == AST_FCALL)
|
||||||
if (current_scope.count(str) == 0 || current_scope[str]->type != AST_FUNCTION) {
|
{
|
||||||
current_ast_mod->dumpAst(stderr, "> ");
|
if (str == "\\$clog2")
|
||||||
log_error("Can't resolve function name `%s' at %s:%d.\n", str.c_str(), filename.c_str(), linenum);
|
{
|
||||||
|
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 (type == AST_TCALL) {
|
||||||
if (current_scope.count(str) == 0 || current_scope[str]->type != AST_TASK)
|
if (current_scope.count(str) == 0 || current_scope[str]->type != AST_TASK)
|
||||||
|
|
Loading…
Reference in New Issue