Fix initialisation order bug with `if' statements
If an assignment appears inside an if statement branch it could be incorrectly used as the signal's initial value.
This commit is contained in:
parent
d343db34fd
commit
4504c2bceb
|
|
@ -239,22 +239,26 @@ static T *make_assignment(vhdl_procedural *proc, stmt_container *container,
|
||||||
// internal signals not ports
|
// internal signals not ports
|
||||||
if (proc->get_scope()->initializing()
|
if (proc->get_scope()->initializing()
|
||||||
&& ivl_signal_port(sig) == IVL_SIP_NONE
|
&& ivl_signal_port(sig) == IVL_SIP_NONE
|
||||||
&& !decl->has_initial() && rhs->constant()
|
&& !decl->has_initial() && rhs->constant()) {
|
||||||
&& container == proc->get_container()) { // Top-level container
|
|
||||||
|
|
||||||
decl->set_initial(rhs);
|
// If this assignment is not in the top-level container
|
||||||
|
// it will not be made on all paths through the code
|
||||||
return NULL;
|
// This precludes any future extraction of an initialiser
|
||||||
}
|
if (container != proc->get_container())
|
||||||
else {
|
decl->set_initial(NULL); // Default initial value
|
||||||
vhdl_var_ref *lval_ref =
|
else {
|
||||||
make_assign_lhs(sig, proc->get_scope(), base, lval_width);
|
decl->set_initial(rhs);
|
||||||
|
return NULL;
|
||||||
T *a = new T(lval_ref, rhs);
|
}
|
||||||
container->add_stmt(a);
|
|
||||||
|
|
||||||
return a;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vhdl_var_ref *lval_ref =
|
||||||
|
make_assign_lhs(sig, proc->get_scope(), base, lval_width);
|
||||||
|
|
||||||
|
T *a = new T(lval_ref, rhs);
|
||||||
|
container->add_stmt(a);
|
||||||
|
|
||||||
|
return a;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue