From 9bc463aac0e65c6e5f27b5d5feea474bab376e26 Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Fri, 28 Nov 2014 11:14:42 +0100 Subject: [PATCH] vvp: Moved array_word_change(), array_attach_word(), array_alias_word() to __vpiArray. --- vvp/array.cc | 73 ++++++++++++++++++++++----------------------- vvp/array.h | 7 ----- vvp/vpi_callback.cc | 2 +- vvp/vpi_priv.h | 4 +++ vvp/words.cc | 8 ++--- 5 files changed, 45 insertions(+), 49 deletions(-) diff --git a/vvp/array.cc b/vvp/array.cc index 62b2766ef..26b1ea46c 100644 --- a/vvp/array.cc +++ b/vvp/array.cc @@ -686,7 +686,7 @@ void __vpiArray::set_word(unsigned address, unsigned part_off, vvp_vector4_t val } else { vals4->set_word(address, val); } - array_word_change(this, address); + word_change(address); return; } @@ -696,7 +696,7 @@ void __vpiArray::set_word(unsigned address, unsigned part_off, vvp_vector4_t val assert(part_off==0); assert(val.size() == vals_width); vals->set_word(address, val); - array_word_change(this, address); + word_change(address); return; } @@ -708,7 +708,7 @@ void __vpiArray::set_word(unsigned address, unsigned part_off, vvp_vector4_t val assert(vsig); vsig->node->send_vec4_pv(val, part_off, val.size(), vpip_size(vsig), 0); - array_word_change(this, address); + word_change(address); } void __vpiArray::set_word(unsigned address, double val) @@ -720,7 +720,7 @@ void __vpiArray::set_word(unsigned address, double val) return; vals->set_word(address, val); - array_word_change(this, address); + word_change(address); } void __vpiArray::set_word(unsigned address, const string&val) @@ -732,7 +732,7 @@ void __vpiArray::set_word(unsigned address, const string&val) return; vals->set_word(address, val); - array_word_change(this, address); + word_change(address); } void __vpiArray::set_word(unsigned address, const vvp_object_t&val) @@ -744,7 +744,7 @@ void __vpiArray::set_word(unsigned address, const vvp_object_t&val) return; vals->set_word(address, val); - array_word_change(this, address); + word_change(address); } vvp_vector4_t __vpiArray::get_word(unsigned address) @@ -921,33 +921,32 @@ vpiHandle vpip_make_array(char*label, const char*name, return obj; } -void array_alias_word(vvp_array_t array, unsigned long addr, vpiHandle word, - int msb, int lsb) +void __vpiArray::alias_word(unsigned long addr, vpiHandle word, int msb_, int lsb_) { - assert(array->msb.get_value() == msb); - assert(array->lsb.get_value() == lsb); - assert(addr < array->get_size()); - assert(array->nets); - array->nets[addr] = word; + assert(msb.get_value() == msb_); + assert(lsb.get_value() == lsb_); + assert(addr < get_size()); + assert(nets); + nets[addr] = word; } -void array_attach_word(vvp_array_t array, unsigned addr, vpiHandle word) +void __vpiArray::attach_word(unsigned addr, vpiHandle word) { - assert(addr < array->get_size()); - assert(array->nets); - array->nets[addr] = word; + assert(addr < get_size()); + assert(nets); + nets[addr] = word; if (struct __vpiSignal*sig = dynamic_cast<__vpiSignal*>(word)) { vvp_net_t*net = sig->node; assert(net); vvp_vpi_callback*fun = dynamic_cast(net->fil); assert(fun); - fun->attach_as_word(array, addr); + fun->attach_as_word(this, addr); sig->is_netarray = 1; - sig->within.parent = array; - sig->id.index = new __vpiDecConst(addr + array->first_addr.get_value()); + sig->within.parent = this; + sig->id.index = new __vpiDecConst(addr + first_addr.get_value()); // Now we know the data type, update the array signed_flag. - array->signed_flag = sig->signed_flag; + signed_flag = sig->signed_flag; return; } @@ -956,12 +955,12 @@ void array_attach_word(vvp_array_t array, unsigned addr, vpiHandle word) assert(net); vvp_vpi_callback*fun = dynamic_cast(net->fil); assert(fun); - fun->attach_as_word(array, addr); + fun->attach_as_word(this, addr); sig->is_netarray = 1; - sig->within.parent = array; - sig->id.index = new __vpiDecConst(addr + array->first_addr.get_value()); + sig->within.parent = this; + sig->id.index = new __vpiDecConst(addr + first_addr.get_value()); // Now we know the data type, update the array signed_flag. - array->signed_flag = true; + signed_flag = true; return; } } @@ -1116,7 +1115,7 @@ class vvp_fun_arrayport : public vvp_net_fun_t { unsigned long addr_; friend void array_attach_port(vvp_array_t, vvp_fun_arrayport*); - friend void array_word_change(vvp_array_t, unsigned long); + friend void __vpiArray::word_change(unsigned long); vvp_fun_arrayport*next_; }; @@ -1361,13 +1360,13 @@ class array_word_value_callback : public value_callback { long word_addr; }; -void array_word_change(vvp_array_t array, unsigned long addr) +void __vpiArray::word_change(unsigned long addr) { - for (vvp_fun_arrayport*cur = array->ports_; cur; cur = cur->next_) + for (vvp_fun_arrayport*cur = ports_; cur; cur = cur->next_) cur->check_word_change(addr); // Run callbacks attached to the array itself. - struct __vpiCallback *next = array->vpi_callbacks; + struct __vpiCallback *next = vpi_callbacks; struct __vpiCallback *prev = 0; while (next) { @@ -1383,21 +1382,21 @@ void array_word_change(vvp_array_t array, unsigned long addr) // For whole array callbacks we need to set the index. if (cur->word_addr == -1) { cur->cb_data.index = (PLI_INT32) ((int)addr + - array->first_addr.get_value()); + first_addr.get_value()); } if (cur->cb_data.cb_rtn != 0) { if (cur->test_value_callback_ready()) { if (cur->cb_data.value) { - if (vpi_array_is_real(array)) { + if (vpi_array_is_real(this)) { double val = 0.0; - if (addr < array->vals->get_size()) - array->vals->get_word(addr, val); + if (addr < vals->get_size()) + vals->get_word(addr, val); vpip_real_get_value(val, cur->cb_data.value); } else { - vpip_vec4_get_value(array->vals4->get_word(addr), - array->vals_width, - array->signed_flag, + vpip_vec4_get_value(vals4->get_word(addr), + vals_width, + signed_flag, cur->cb_data.value); } } @@ -1409,7 +1408,7 @@ void array_word_change(vvp_array_t array, unsigned long addr) } else if (prev == 0) { - array->vpi_callbacks = next; + vpi_callbacks = next; cur->next = 0; delete cur; diff --git a/vvp/array.h b/vvp/array.h index 6aa021225..7b62f7cc0 100644 --- a/vvp/array.h +++ b/vvp/array.h @@ -31,14 +31,7 @@ class value_callback; */ extern vvp_array_t array_find(const char*label); -extern void array_word_change(vvp_array_t array, unsigned long addr); - -extern void array_attach_word(vvp_array_t array, unsigned addr, vpiHandle word); -extern void array_alias_word(vvp_array_t array, unsigned long addr, - vpiHandle word, int msb, int lsb); - /* VPI hooks */ - extern value_callback* vpip_array_word_change(p_cb_data data); extern value_callback* vpip_array_change(p_cb_data data); diff --git a/vvp/vpi_callback.cc b/vvp/vpi_callback.cc index cf12f0850..2d2574564 100644 --- a/vvp/vpi_callback.cc +++ b/vvp/vpi_callback.cc @@ -688,7 +688,7 @@ void vvp_vpi_callback::clear_all_callbacks() */ void vvp_vpi_callback::run_vpi_callbacks() { - if (array_) array_word_change(array_, array_word_); + if (array_) array_->word_change(array_word_); value_callback *next = vpi_callbacks_; value_callback *prev = 0; diff --git a/vvp/vpi_priv.h b/vvp/vpi_priv.h index cc70185f5..f83e09b30 100644 --- a/vvp/vpi_priv.h +++ b/vvp/vpi_priv.h @@ -618,6 +618,10 @@ struct __vpiArray : public __vpiArrayBase, public __vpiHandle { void get_word_obj(unsigned address, vvp_object_t&val); std::string get_word_str(unsigned address); + void alias_word(unsigned long addr, vpiHandle word, int msb, int lsb); + void attach_word(unsigned addr, vpiHandle word); + void word_change(unsigned long addr); + const char*name; /* Permanently allocated string */ __vpiDecConst first_addr; __vpiDecConst last_addr; diff --git a/vvp/words.cc b/vvp/words.cc index a09e880d1..e7480bd05 100644 --- a/vvp/words.cc +++ b/vvp/words.cc @@ -59,7 +59,7 @@ static void __compile_var_real(char*label, char*name, } if (array) { assert(!name); - array_attach_word(array, array_addr, obj); + array->attach_word(array_addr, obj); } free(label); delete[] name; @@ -365,7 +365,7 @@ static void do_compile_net(vvp_net_t*node, vvp_array_t array, define_functor_symbol(my_label, node); if (array) - array_attach_word(array, array_addr, obj); + array->attach_word(array_addr, obj); else if (obj) vpip_attach_to_scope(scope,obj); @@ -495,7 +495,7 @@ static void __compile_real_net2(vvp_net_t*node, vvp_array_t array, define_functor_symbol(my_label, node); if (array) - array_attach_word(array, array_addr, obj); + array->attach_word(array_addr, obj); else if (obj) vpip_attach_to_scope(scope, obj); @@ -583,7 +583,7 @@ void compile_aliasw(char*label, char*array_label, unsigned long array_addr, vpiHandle obj = vvp_lookup_handle(argv[0].text); assert(obj); - array_alias_word(array, array_addr, obj, msb, lsb); + array->alias_word(array_addr, obj, msb, lsb); free(label); free(array_label);