vlog95: Add support for recognizing a call to an automatic task.
Automatic tasks are not supported by 1364-1995, but the converter should be able to correctly convert a call to an automatic task.
This commit is contained in:
parent
dc387ad9d1
commit
b6ec138644
|
|
@ -688,6 +688,9 @@ static void emit_port(ivl_scope_t scope, struct port_expr_s port_expr)
|
||||||
* appropriate task call. It returns true (1) if it successfully
|
* appropriate task call. It returns true (1) if it successfully
|
||||||
* translated the block to a task call, otherwise it returns false
|
* translated the block to a task call, otherwise it returns false
|
||||||
* (0) to indicate the block needs to be emitted.
|
* (0) to indicate the block needs to be emitted.
|
||||||
|
*
|
||||||
|
* When calling automatic tasks there is an initial ALLOC statement
|
||||||
|
* and a final FREE statement.
|
||||||
*/
|
*/
|
||||||
static unsigned is_utask_call_with_args(ivl_scope_t scope,
|
static unsigned is_utask_call_with_args(ivl_scope_t scope,
|
||||||
ivl_statement_t stmt)
|
ivl_statement_t stmt)
|
||||||
|
|
@ -695,17 +698,31 @@ static unsigned is_utask_call_with_args(ivl_scope_t scope,
|
||||||
unsigned idx, ports, task_idx = 0;
|
unsigned idx, ports, task_idx = 0;
|
||||||
unsigned count = ivl_stmt_block_count(stmt);
|
unsigned count = ivl_stmt_block_count(stmt);
|
||||||
unsigned lineno = ivl_stmt_lineno(stmt);
|
unsigned lineno = ivl_stmt_lineno(stmt);
|
||||||
|
unsigned start, stop, is_auto = 0;
|
||||||
ivl_scope_t task_scope = 0;
|
ivl_scope_t task_scope = 0;
|
||||||
port_expr_t port_exprs;
|
port_expr_t port_exprs;
|
||||||
/* Check to see if the block is of the basic form first. */
|
/* Check to see if the block is of the basic form first. */
|
||||||
for (idx = 0; idx < count; idx += 1) {
|
for (idx = 0; idx < count; idx += 1) {
|
||||||
ivl_statement_t tmp = ivl_stmt_block_stmt(stmt, idx);
|
ivl_statement_t tmp = ivl_stmt_block_stmt(stmt, idx);
|
||||||
|
/* For an automatic task the ALLOC must be first. */
|
||||||
|
if (ivl_statement_type(tmp) == IVL_ST_ALLOC) {
|
||||||
|
if (idx == 0) {
|
||||||
|
is_auto = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (ivl_statement_type(tmp) == IVL_ST_ASSIGN) continue;
|
if (ivl_statement_type(tmp) == IVL_ST_ASSIGN) continue;
|
||||||
if (ivl_statement_type(tmp) == IVL_ST_UTASK && !task_scope) {
|
if (ivl_statement_type(tmp) == IVL_ST_UTASK && !task_scope) {
|
||||||
task_idx = idx;
|
task_idx = idx;
|
||||||
task_scope = ivl_stmt_call(tmp);
|
task_scope = ivl_stmt_call(tmp);
|
||||||
assert(ivl_scope_type(task_scope) == IVL_SCT_TASK);
|
assert(ivl_scope_type(task_scope) == IVL_SCT_TASK);
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
/* For an automatic task the FREE must be last. */
|
||||||
|
if (ivl_statement_type(tmp) == IVL_ST_FREE) {
|
||||||
|
if (idx == count-1) {
|
||||||
|
if (is_auto) continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -720,8 +737,11 @@ static unsigned is_utask_call_with_args(ivl_scope_t scope,
|
||||||
port_exprs[idx].type = IVL_SIP_NONE;
|
port_exprs[idx].type = IVL_SIP_NONE;
|
||||||
port_exprs[idx].expr.rval = 0;
|
port_exprs[idx].expr.rval = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check that the input arguments are correct. */
|
/* Check that the input arguments are correct. */
|
||||||
for (idx = 0; idx < task_idx; idx += 1) {
|
if (is_auto) start = 1;
|
||||||
|
else start = 0;
|
||||||
|
for (idx = start; idx < task_idx; idx += 1) {
|
||||||
ivl_statement_t assign = ivl_stmt_block_stmt(stmt, idx);
|
ivl_statement_t assign = ivl_stmt_block_stmt(stmt, idx);
|
||||||
unsigned port = utask_in_port_idx(task_scope, assign);
|
unsigned port = utask_in_port_idx(task_scope, assign);
|
||||||
if ((port == ports) || (lineno != ivl_stmt_lineno(assign))) {
|
if ((port == ports) || (lineno != ivl_stmt_lineno(assign))) {
|
||||||
|
|
@ -732,7 +752,9 @@ static unsigned is_utask_call_with_args(ivl_scope_t scope,
|
||||||
port_exprs[port].expr.rval = ivl_stmt_rval(assign);
|
port_exprs[port].expr.rval = ivl_stmt_rval(assign);
|
||||||
}
|
}
|
||||||
/* Check that the output arguments are correct. */
|
/* Check that the output arguments are correct. */
|
||||||
for (idx = task_idx + 1; idx < count; idx += 1) {
|
if (is_auto) stop = count-1;
|
||||||
|
else stop = count;
|
||||||
|
for (idx = task_idx + 1; idx < stop; idx += 1) {
|
||||||
ivl_statement_t assign = ivl_stmt_block_stmt(stmt, idx);
|
ivl_statement_t assign = ivl_stmt_block_stmt(stmt, idx);
|
||||||
unsigned port = utask_out_port_idx(task_scope, assign);
|
unsigned port = utask_out_port_idx(task_scope, assign);
|
||||||
if ((port == ports) || (lineno != ivl_stmt_lineno(assign))) {
|
if ((port == ports) || (lineno != ivl_stmt_lineno(assign))) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue