diff --git a/tgt-vhdl/expr.cc b/tgt-vhdl/expr.cc index 9e383dfc9..f0aec0019 100644 --- a/tgt-vhdl/expr.cc +++ b/tgt-vhdl/expr.cc @@ -484,3 +484,21 @@ vhdl_expr *translate_expr(ivl_expr_t e) return NULL; } } + +/* + * Translate an expression into a time. This is achieved simply + * by multiplying the expression by 1ns. + */ +vhdl_expr *translate_time_expr(ivl_expr_t e) +{ + vhdl_expr *time = translate_expr(e); + if (NULL == time) + return NULL; + + vhdl_type integer(VHDL_TYPE_INTEGER); + time = time->cast(&integer); + + vhdl_expr *ns1 = new vhdl_const_time(1, TIME_UNIT_NS); + return new vhdl_binop_expr(time, VHDL_BINOP_MULT, ns1, + vhdl_type::time()); +} diff --git a/tgt-vhdl/scope.cc b/tgt-vhdl/scope.cc index 69808076b..826def5ad 100644 --- a/tgt-vhdl/scope.cc +++ b/tgt-vhdl/scope.cc @@ -247,19 +247,8 @@ static void declare_logic(vhdl_arch *arch, ivl_scope_t scope) vhdl_cassign_stmt *ass = new vhdl_cassign_stmt(lhs, rhs); ivl_expr_t delay = ivl_logic_delay(log, 1); - vhdl_expr *after; - if (delay && (after = translate_expr(delay))) { - // Need to make 'after' a time value - // we can do this by multiplying by 1ns - vhdl_type integer(VHDL_TYPE_INTEGER); - after = after->cast(&integer); - - vhdl_expr *ns1 = new vhdl_const_time(1, TIME_UNIT_NS); - after = new vhdl_binop_expr(after, VHDL_BINOP_MULT, ns1, - vhdl_type::time()); - - ass->set_after(after); - } + if (delay) + ass->set_after(translate_time_expr(delay)); arch->add_stmt(ass); } diff --git a/tgt-vhdl/stmt.cc b/tgt-vhdl/stmt.cc index 87efac0e2..68e9e20ec 100644 --- a/tgt-vhdl/stmt.cc +++ b/tgt-vhdl/stmt.cc @@ -269,19 +269,8 @@ static T *make_assignment(vhdl_procedural *proc, stmt_container *container, container->add_stmt(a); ivl_expr_t i_delay; - if (NULL == after && (i_delay = ivl_stmt_delay_expr(stmt))) { - if ((after = translate_expr(i_delay)) == NULL) - return NULL; - - // Need to make 'after' a time value - // we can do this by multiplying by 1ns - vhdl_type integer(VHDL_TYPE_INTEGER); - after = after->cast(&integer); - - vhdl_expr *ns1 = new vhdl_const_time(1, TIME_UNIT_NS); - after = new vhdl_binop_expr(after, VHDL_BINOP_MULT, ns1, - vhdl_type::time()); - } + if (NULL == after && (i_delay = ivl_stmt_delay_expr(stmt))) + after = translate_time_expr(i_delay); if (after != NULL) a->set_after(after); @@ -349,16 +338,9 @@ static int draw_delay(vhdl_procedural *proc, stmt_container *container, time = new vhdl_const_time(value, TIME_UNIT_NS); } else { - time = translate_expr(ivl_stmt_delay_expr(stmt)); + time = translate_time_expr(ivl_stmt_delay_expr(stmt)); if (NULL == time) return 1; - - vhdl_type integer(VHDL_TYPE_INTEGER); - time = time->cast(&integer); - - vhdl_expr *ns1 = new vhdl_const_time(1, TIME_UNIT_NS); - time = new vhdl_binop_expr(time, VHDL_BINOP_MULT, ns1, - vhdl_type::time()); } // If the sub-statement is an assignment then VHDL lets diff --git a/tgt-vhdl/vhdl_target.h b/tgt-vhdl/vhdl_target.h index 20584eecf..62e784845 100644 --- a/tgt-vhdl/vhdl_target.h +++ b/tgt-vhdl/vhdl_target.h @@ -22,6 +22,7 @@ int draw_stmt(vhdl_procedural *proc, stmt_container *container, int draw_lpm(vhdl_arch *arch, ivl_lpm_t lpm); vhdl_expr *translate_expr(ivl_expr_t e); +vhdl_expr *translate_time_expr(ivl_expr_t e); vhdl_var_ref *lpm_output(vhdl_scope *scope, ivl_lpm_t lpm); void remember_entity(vhdl_entity *ent);