Allow objects to work in automatic functions.

This commit is contained in:
Stephen Williams 2013-03-23 20:18:54 -07:00
parent 3b3a4d3ddc
commit b9011d89ae
4 changed files with 55 additions and 11 deletions

View File

@ -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)

View File

@ -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);
}

View File

@ -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_object_t*>
(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<vvp_object_t*>
(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_object_t*>
(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;
}

View File

@ -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);