mirror of https://github.com/YosysHQ/yosys.git
Added support for DPI function with different names in C and Verilog
This commit is contained in:
parent
085c8e873d
commit
6c5cafcd8b
|
@ -1451,15 +1451,15 @@ skip_dynamic_range_lvalue_expansion:;
|
||||||
std::vector<AstNode*> args;
|
std::vector<AstNode*> args;
|
||||||
|
|
||||||
rtype = RTLIL::unescape_id(dpi_decl->children.at(0)->str);
|
rtype = RTLIL::unescape_id(dpi_decl->children.at(0)->str);
|
||||||
fname = RTLIL::unescape_id(dpi_decl->str);
|
fname = RTLIL::unescape_id(dpi_decl->children.at(1)->str);
|
||||||
|
|
||||||
for (int i = 1; i < SIZE(dpi_decl->children); i++)
|
for (int i = 2; i < SIZE(dpi_decl->children); i++)
|
||||||
{
|
{
|
||||||
if (i-1 >= SIZE(children))
|
if (i-2 >= SIZE(children))
|
||||||
log_error("Insufficient number of arguments in DPI function call at %s:%d.\n", filename.c_str(), linenum);
|
log_error("Insufficient number of arguments in DPI function call at %s:%d.\n", filename.c_str(), linenum);
|
||||||
|
|
||||||
argtypes.push_back(RTLIL::unescape_id(dpi_decl->children.at(i)->str));
|
argtypes.push_back(RTLIL::unescape_id(dpi_decl->children.at(i)->str));
|
||||||
args.push_back(children.at(i-1)->clone());
|
args.push_back(children.at(i-2)->clone());
|
||||||
while (args.back()->simplify(true, false, false, stage, -1, false, true)) { }
|
while (args.back()->simplify(true, false, false, stage, -1, false, true)) { }
|
||||||
|
|
||||||
if (args.back()->type != AST_CONSTANT && args.back()->type != AST_REALVALUE)
|
if (args.back()->type != AST_CONSTANT && args.back()->type != AST_REALVALUE)
|
||||||
|
|
|
@ -280,10 +280,6 @@ import[ \t\r\n]+\"(DPI|DPI-C)\"[ \t\r\n]+function[ \t\r\n]+ {
|
||||||
return TOK_DPI_FUNCTION;
|
return TOK_DPI_FUNCTION;
|
||||||
}
|
}
|
||||||
|
|
||||||
<IMPORT_DPI>[(),] {
|
|
||||||
return *yytext;
|
|
||||||
}
|
|
||||||
|
|
||||||
<IMPORT_DPI>[a-zA-Z_$][a-zA-Z0-9_$]* {
|
<IMPORT_DPI>[a-zA-Z_$][a-zA-Z0-9_$]* {
|
||||||
frontend_verilog_yylval.string = new std::string(std::string("\\") + yytext);
|
frontend_verilog_yylval.string = new std::string(std::string("\\") + yytext);
|
||||||
return TOK_ID;
|
return TOK_ID;
|
||||||
|
@ -296,6 +292,10 @@ import[ \t\r\n]+\"(DPI|DPI-C)\"[ \t\r\n]+function[ \t\r\n]+ {
|
||||||
return *yytext;
|
return *yytext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<IMPORT_DPI>. {
|
||||||
|
return *yytext;
|
||||||
|
}
|
||||||
|
|
||||||
"\\"[^ \t\r\n]+ {
|
"\\"[^ \t\r\n]+ {
|
||||||
frontend_verilog_yylval.string = new std::string(yytext);
|
frontend_verilog_yylval.string = new std::string(yytext);
|
||||||
return TOK_ID;
|
return TOK_ID;
|
||||||
|
|
|
@ -416,7 +416,7 @@ module_body_stmt:
|
||||||
|
|
||||||
task_func_decl:
|
task_func_decl:
|
||||||
attr TOK_DPI_FUNCTION TOK_ID TOK_ID {
|
attr TOK_DPI_FUNCTION TOK_ID TOK_ID {
|
||||||
current_function_or_task = new AstNode(AST_DPI_FUNCTION, AstNode::mkconst_str(*$3));
|
current_function_or_task = new AstNode(AST_DPI_FUNCTION, AstNode::mkconst_str(*$3), AstNode::mkconst_str(*$4));
|
||||||
current_function_or_task->str = *$4;
|
current_function_or_task->str = *$4;
|
||||||
append_attr(current_function_or_task, $1);
|
append_attr(current_function_or_task, $1);
|
||||||
ast_stack.back()->children.push_back(current_function_or_task);
|
ast_stack.back()->children.push_back(current_function_or_task);
|
||||||
|
@ -425,6 +425,17 @@ task_func_decl:
|
||||||
} opt_dpi_function_args ';' {
|
} opt_dpi_function_args ';' {
|
||||||
current_function_or_task = NULL;
|
current_function_or_task = NULL;
|
||||||
} |
|
} |
|
||||||
|
attr TOK_DPI_FUNCTION TOK_ID '=' TOK_ID TOK_ID {
|
||||||
|
current_function_or_task = new AstNode(AST_DPI_FUNCTION, AstNode::mkconst_str(*$5), AstNode::mkconst_str(*$3));
|
||||||
|
current_function_or_task->str = *$6;
|
||||||
|
append_attr(current_function_or_task, $1);
|
||||||
|
ast_stack.back()->children.push_back(current_function_or_task);
|
||||||
|
delete $3;
|
||||||
|
delete $5;
|
||||||
|
delete $6;
|
||||||
|
} opt_dpi_function_args ';' {
|
||||||
|
current_function_or_task = NULL;
|
||||||
|
} |
|
||||||
attr TOK_TASK TOK_ID ';' {
|
attr TOK_TASK TOK_ID ';' {
|
||||||
current_function_or_task = new AstNode(AST_TASK);
|
current_function_or_task = new AstNode(AST_TASK);
|
||||||
current_function_or_task->str = *$3;
|
current_function_or_task->str = *$3;
|
||||||
|
|
Loading…
Reference in New Issue