From ac78ae347b79b0b052c66ba4edc2f0770e26f343 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Sun, 28 Jun 2009 20:54:20 -0700 Subject: [PATCH] Make force_fil_* methods virtual and part of vvp_net_fil_t. These methods are type specific, but the code that invokes them get at them from pointers to filter objects, so it makes sense to make them abstract methods of the vvp_net_fil_t class. --- vvp/vvp_net.h | 7 +++++++ vvp/vvp_net_sig.cc | 36 ++++++++++++++++++++++++++++++++---- vvp/vvp_net_sig.h | 7 +++++++ 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/vvp/vvp_net.h b/vvp/vvp_net.h index c00846ce4..500b4ef66 100644 --- a/vvp/vvp_net.h +++ b/vvp/vvp_net.h @@ -1129,6 +1129,13 @@ class vvp_net_fil_t : public vvp_vpi_callback { void force_link(vvp_net_t*dst, vvp_net_t*src); void force_unlink(void); + + public: + // Suport for force methods + virtual void force_fil_vec4(const vvp_vector4_t&val, vvp_vector2_t mask) =0; + virtual void force_fil_vec8(const vvp_vector8_t&val, vvp_vector2_t mask) =0; + virtual void force_fil_real(double val, vvp_vector2_t mask) =0; + protected: // Set bits of the filter force mask void force_mask(vvp_vector2_t mask); diff --git a/vvp/vvp_net_sig.cc b/vvp/vvp_net_sig.cc index 2901e57f9..c5314e160 100644 --- a/vvp/vvp_net_sig.cc +++ b/vvp/vvp_net_sig.cc @@ -96,15 +96,28 @@ void vvp_fun_signal4::force_fil_vec4(const vvp_vector4_t&val, vvp_vector2_t mask } } +void vvp_fun_signal4::force_fil_vec8(const vvp_vector8_t&val, vvp_vector2_t mask) +{ + assert(0); +} + +void vvp_fun_signal4::force_fil_real(double val, vvp_vector2_t mask) +{ + assert(0); +} + void vvp_net_t::force_vec4(const vvp_vector4_t&val, vvp_vector2_t mask) { - vvp_fun_signal4*sig = dynamic_cast (fil); - assert(sig); - - sig->force_fil_vec4(val, mask); + assert(fil); + fil->force_fil_vec4(val, mask); send_vec4(val, 0); } +void vvp_fun_signal8::force_fil_vec4(const vvp_vector4_t&val, vvp_vector2_t mask) +{ + force_fil_vec8(vvp_vector8_t(val,6,6), mask); +} + void vvp_fun_signal8::force_fil_vec8(const vvp_vector8_t&val, vvp_vector2_t mask) { force_mask(mask); @@ -120,6 +133,11 @@ void vvp_fun_signal8::force_fil_vec8(const vvp_vector8_t&val, vvp_vector2_t mask } } +void vvp_fun_signal8::force_fil_real(double val, vvp_vector2_t mask) +{ + assert(0); +} + void vvp_net_t::force_vec8(const vvp_vector8_t&val, vvp_vector2_t mask) { vvp_fun_signal8*sig = dynamic_cast (fil); @@ -129,6 +147,16 @@ void vvp_net_t::force_vec8(const vvp_vector8_t&val, vvp_vector2_t mask) send_vec8(val); } +void vvp_fun_signal_real::force_fil_vec4(const vvp_vector4_t&val, vvp_vector2_t mask) +{ + assert(0); +} + +void vvp_fun_signal_real::force_fil_vec8(const vvp_vector8_t&val, vvp_vector2_t mask) +{ + assert(0); +} + void vvp_fun_signal_real::force_fil_real(double val, vvp_vector2_t mask) { force_mask(mask); diff --git a/vvp/vvp_net_sig.h b/vvp/vvp_net_sig.h index 324ef655a..3c7a1455e 100644 --- a/vvp/vvp_net_sig.h +++ b/vvp/vvp_net_sig.h @@ -140,6 +140,8 @@ class vvp_fun_signal4 : public vvp_fun_signal_vec { public: // Enable filter force. void force_fil_vec4(const vvp_vector4_t&val, vvp_vector2_t mask); + void force_fil_vec8(const vvp_vector8_t&val, vvp_vector2_t mask); + void force_fil_real(double val, vvp_vector2_t mask); const vvp_vector4_t* filter_vec4(const vvp_vector4_t&val); // Test the value against the filter. vvp_bit4_t filtered_value(const vvp_vector4_t&val, unsigned idx) const; @@ -254,7 +256,9 @@ class vvp_fun_signal8 : public vvp_fun_signal_vec { public: // Enable filter force. + void force_fil_vec4(const vvp_vector4_t&val, vvp_vector2_t mask); void force_fil_vec8(const vvp_vector8_t&val, vvp_vector2_t mask); + void force_fil_real(double val, vvp_vector2_t mask); const vvp_vector8_t* filter_vec8(const vvp_vector8_t&val); // Test the value against the filter. vvp_scalar_t filtered_value(const vvp_vector8_t&val, unsigned idx) const; @@ -278,7 +282,10 @@ class vvp_fun_signal_real : public vvp_fun_signal_base { public: // Enable filter force. + void force_fil_vec4(const vvp_vector4_t&val, vvp_vector2_t mask); + void force_fil_vec8(const vvp_vector8_t&val, vvp_vector2_t mask); void force_fil_real(double val, vvp_vector2_t mask); + bool filter_real(double&val); // Test the value against the filter. double filtered_real(double val) const;