Fix for vvp assertion error on forward reference to array.

If an &A() operator contains a label for an array that has not
yet been declared, vvp fails with an assertion error. This
patch delays the calls to array_find() in the functions that
compile &A() operators, using the usual resolve list mechanism.
This commit is contained in:
Martin Whitaker 2009-01-24 14:10:34 +00:00 committed by Stephen Williams
parent c419e77710
commit b8e350188e
1 changed files with 41 additions and 13 deletions

View File

@ -1239,6 +1239,27 @@ void array_word_change(vvp_array_t array, unsigned long addr)
}
}
class array_resolv_list_t : public resolv_list_s {
public:
explicit array_resolv_list_t(char*lab) : resolv_list_s(lab) { }
vvp_array_t*array;
bool resolve(bool mes);
private:
};
bool array_resolv_list_t::resolve(bool mes)
{
*array = array_find(label());
if (*array == 0) {
assert(!mes);
return false;
}
return true;
}
class array_port_resolv_list_t : public resolv_list_s {
public:
@ -1375,14 +1396,15 @@ vpiHandle vpip_make_vthr_A(char*label, unsigned addr)
obj->base.vpi_type = &vpip_array_vthr_A_rt;
obj->array = array_find(label);
assert(obj->array);
free(label);
array_resolv_list_t*resolv_mem
= new array_resolv_list_t(label);
resolv_mem->array = &obj->array;
resolv_submit(resolv_mem);
obj->address_handle = 0;
obj->address = addr;
obj->wid = 0;
assert(addr < obj->array->array_count);
return &(obj->base);
}
@ -1394,9 +1416,11 @@ vpiHandle vpip_make_vthr_A(char*label, unsigned tbase, unsigned twid)
obj->base.vpi_type = &vpip_array_vthr_A_rt;
obj->array = array_find(label);
assert(obj->array);
free(label);
array_resolv_list_t*resolv_mem
= new array_resolv_list_t(label);
resolv_mem->array = &obj->array;
resolv_submit(resolv_mem);
obj->address_handle = 0;
obj->address = tbase;
@ -1412,9 +1436,11 @@ vpiHandle vpip_make_vthr_A(char*label, char*symbol)
obj->base.vpi_type = &vpip_array_vthr_A_rt;
obj->array = array_find(label);
assert(obj->array);
free(label);
array_resolv_list_t*resolv_mem
= new array_resolv_list_t(label);
resolv_mem->array = &obj->array;
resolv_submit(resolv_mem);
obj->address_handle = 0;
compile_vpi_lookup(&obj->address_handle, symbol);
@ -1430,9 +1456,11 @@ vpiHandle vpip_make_vthr_A(char*label, vpiHandle handle)
obj->base.vpi_type = &vpip_array_vthr_A_rt;
obj->array = array_find(label);
assert(obj->array);
free(label);
array_resolv_list_t*resolv_mem
= new array_resolv_list_t(label);
resolv_mem->array = &obj->array;
resolv_submit(resolv_mem);
obj->address_handle = handle;
obj->address = 0;