From b9011d89ae002d0a20a6db1ec8a9e96b2dadd12b Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sat, 23 Mar 2013 20:18:54 -0700 Subject: [PATCH] Allow objects to work in automatic functions. --- vvp/vvp_net.cc | 5 +++++ vvp/vvp_net.h | 5 ++++- vvp/vvp_net_sig.cc | 40 +++++++++++++++++++++++++++++++++++----- vvp/vvp_net_sig.h | 16 +++++++++++----- 4 files changed, 55 insertions(+), 11 deletions(-) diff --git a/vvp/vvp_net.cc b/vvp/vvp_net.cc index 204c2fc8e..43ef8f1cd 100644 --- a/vvp/vvp_net.cc +++ b/vvp/vvp_net.cc @@ -296,6 +296,11 @@ vvp_net_fil_t::prop_t vvp_net_fil_t::filter_long(long&) return PROP; } +vvp_net_fil_t::prop_t vvp_net_fil_t::filter_object(vvp_object_t&) +{ + return PROP; +} + void vvp_net_fil_t::force_mask(vvp_vector2_t mask) { if (force_mask_.size() == 0) diff --git a/vvp/vvp_net.h b/vvp/vvp_net.h index b05c6acdf..3f05638b2 100644 --- a/vvp/vvp_net.h +++ b/vvp/vvp_net.h @@ -1231,6 +1231,7 @@ class vvp_net_fil_t : public vvp_vpi_callback { unsigned base, unsigned vwid); virtual prop_t filter_real(double&val); virtual prop_t filter_long(long&val); + virtual prop_t filter_object(vvp_object_t&val); virtual void release(vvp_net_ptr_t ptr, bool net_flag) =0; virtual void release_pv(vvp_net_ptr_t ptr, unsigned base, unsigned wid, bool net_flag) =0; @@ -1717,7 +1718,9 @@ inline void vvp_net_t::send_string(const std::string&val, vvp_context_t context) inline void vvp_net_t::send_object(vvp_object_t val, vvp_context_t context) { - assert(!fil); + if (fil && ! fil->filter_object(val)) + return; + vvp_send_object(out_, val, context); } diff --git a/vvp/vvp_net_sig.cc b/vvp/vvp_net_sig.cc index eb20e7f61..4319898bd 100644 --- a/vvp/vvp_net_sig.cc +++ b/vvp/vvp_net_sig.cc @@ -698,6 +698,11 @@ void vvp_fun_signal_object_sa::recv_object(vvp_net_ptr_t ptr, vvp_object_t bit, } } +vvp_object_t vvp_fun_signal_object_sa::get_object() const +{ + return value_; +} + vvp_fun_signal_object_aa::vvp_fun_signal_object_aa() { context_idx_ = vpip_add_item_to_context(this, vpip_peek_context_scope()); @@ -708,19 +713,44 @@ vvp_fun_signal_object_aa::~vvp_fun_signal_object_aa() assert(0); } -void vvp_fun_signal_object_aa::alloc_instance(vvp_context_t) +void vvp_fun_signal_object_aa::alloc_instance(vvp_context_t context) { - assert(0); + vvp_object_t*bits = new vvp_object_t; + vvp_set_context_item(context, context_idx_, bits); + bits->reset(); } -void vvp_fun_signal_object_aa::reset_instance(vvp_context_t) +void vvp_fun_signal_object_aa::reset_instance(vvp_context_t context) { - assert(0); + vvp_object_t*bits = static_cast + (vvp_get_context_item(context, context_idx_)); + bits->reset(); +} + +vvp_object_t vvp_fun_signal_object_aa::get_object() const +{ + vvp_object_t*bits = static_cast + (vthread_get_rd_context_item(context_idx_)); + return *bits; +} + +void vvp_fun_signal_object_aa::recv_object(vvp_net_ptr_t ptr, vvp_object_t bit, + vvp_context_t context) +{ + assert(ptr.port() == 0); + assert(context); + + vvp_object_t*bits = static_cast + (vvp_get_context_item(context, context_idx_)); + + if (*bits != bit) { + *bits = bit; + ptr.ptr()->send_object(bit, context); + } } unsigned vvp_fun_signal_object_aa::value_size() const { - assert(0); return 1; } diff --git a/vvp/vvp_net_sig.h b/vvp/vvp_net_sig.h index ce41b52c1..cf45d944d 100644 --- a/vvp/vvp_net_sig.h +++ b/vvp/vvp_net_sig.h @@ -323,13 +323,9 @@ class vvp_fun_signal_object : public vvp_fun_signal_base { public: explicit vvp_fun_signal_object() {}; - unsigned size() const { return 1; } - inline vvp_object_t get_object() const { return value_; } - - protected: - vvp_object_t value_; + virtual vvp_object_t get_object() const =0; }; /* @@ -342,6 +338,11 @@ class vvp_fun_signal_object_sa : public vvp_fun_signal_object { void recv_object(vvp_net_ptr_t port, vvp_object_t bit, vvp_context_t context); + + vvp_object_t get_object() const; + + private: + vvp_object_t value_; }; /* @@ -359,6 +360,9 @@ class vvp_fun_signal_object_aa : public vvp_fun_signal_object, public automatic_ void free_instance(vvp_context_t context); #endif + void recv_object(vvp_net_ptr_t port, vvp_object_t bit, + vvp_context_t context); + // Get information about the vector value. unsigned value_size() const; vvp_bit4_t value(unsigned idx) const; @@ -367,6 +371,8 @@ class vvp_fun_signal_object_aa : public vvp_fun_signal_object, public automatic_ //double real_value() const; //void get_signal_value(struct t_vpi_value*vp); + vvp_object_t get_object() const; + public: // These objects are only permallocated. static void* operator new(std::size_t size); static void operator delete(void*obj);