diff --git a/vvp/event.cc b/vvp/event.cc index de4caff5e..02e02c77b 100644 --- a/vvp/event.cc +++ b/vvp/event.cc @@ -271,6 +271,17 @@ void vvp_fun_edge_sa::recv_vec4(vvp_net_ptr_t port, const vvp_vector4_t&bit, } } +void vvp_fun_edge_sa::recv_vec4_pv(vvp_net_ptr_t port, const vvp_vector4_t&bit, + unsigned base, unsigned wid, unsigned vwid, + vvp_context_t) +{ + assert(base == 0); + if (recv_vec4_(port, bit, bits_[port.port()], threads_)) { + vvp_net_t*net = port.ptr(); + net->send_vec4_pv(bit, base, wid, vwid, 0); + } +} + vvp_fun_edge_aa::vvp_fun_edge_aa(edge_t e) : vvp_fun_edge(e) { @@ -422,6 +433,24 @@ void vvp_fun_anyedge_sa::recv_vec4(vvp_net_ptr_t port, const vvp_vector4_t&bit, } } +void vvp_fun_anyedge_sa::recv_vec4_pv(vvp_net_ptr_t port, const vvp_vector4_t&bit, + unsigned base, unsigned wid, unsigned vwid, + vvp_context_t) +{ + vvp_vector4_t tmp = bits_[port.port()]; + if (tmp.size() == 0) + tmp = vvp_vector4_t(vwid, BIT4_Z); + assert(wid == bit.size()); + assert(base+wid <= vwid); + assert(tmp.size() == vwid); + tmp.set_vec(base, bit); + + if (recv_vec4_(port, tmp, bits_[port.port()], threads_)) { + vvp_net_t*net = port.ptr(); + net->send_vec4(bit, 0); + } +} + void vvp_fun_anyedge_sa::recv_real(vvp_net_ptr_t port, double bit, vvp_context_t) { diff --git a/vvp/event.h b/vvp/event.h index 55582d79b..d30da2be7 100644 --- a/vvp/event.h +++ b/vvp/event.h @@ -182,6 +182,9 @@ class vvp_fun_edge_sa : public vvp_fun_edge { void recv_vec4(vvp_net_ptr_t port, const vvp_vector4_t&bit, vvp_context_t context); + void recv_vec4_pv(vvp_net_ptr_t port, const vvp_vector4_t&bit, + unsigned base, unsigned wid, unsigned vwid, + vvp_context_t context); private: vthread_t threads_; @@ -252,6 +255,9 @@ class vvp_fun_anyedge_sa : public vvp_fun_anyedge { void recv_vec4(vvp_net_ptr_t port, const vvp_vector4_t&bit, vvp_context_t context); + void recv_vec4_pv(vvp_net_ptr_t port, const vvp_vector4_t&bit, + unsigned base, unsigned wid, unsigned vwid, + vvp_context_t context); void recv_real(vvp_net_ptr_t port, double bit, vvp_context_t context);