From c2061e81991b69137a75b1f0f0376fe9288468a0 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Tue, 3 Jun 2008 17:31:15 -0700 Subject: [PATCH] Island ports can accept vector parts. --- vvp/vvp_island.cc | 23 +++++++++++++++++++++++ vvp/vvp_net.cc | 6 +++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/vvp/vvp_island.cc b/vvp/vvp_island.cc index 4a93f3c66..eea7b7f7f 100644 --- a/vvp/vvp_island.cc +++ b/vvp/vvp_island.cc @@ -124,6 +124,8 @@ class vvp_island_port : public vvp_net_fun_t { ~vvp_island_port(); virtual void recv_vec4(vvp_net_ptr_t port, const vvp_vector4_t&bit); + virtual void recv_vec4_pv(vvp_net_ptr_t port, const vvp_vector4_t&bit, + unsigned base, unsigned wid, unsigned vwid); virtual void recv_vec8(vvp_net_ptr_t port, const vvp_vector8_t bit); vvp_vector8_t invalue; @@ -220,6 +222,7 @@ void vvp_island::add_branch(vvp_island_branch*branch, const char*pa, const char* assert(ports_); branch->a = ports_->sym_get_value(pa); branch->b = ports_->sym_get_value(pb); + assert(branch->a && branch->b); vvp_branch_ptr_t ptra (branch, 0); vvp_branch_ptr_t ptrb (branch, 1); @@ -286,6 +289,26 @@ void vvp_island_port::recv_vec4(vvp_net_ptr_t port, const vvp_vector4_t&bit) recv_vec8(port, vvp_vector8_t(bit, 6, 6)); } +void vvp_island_port::recv_vec4_pv(vvp_net_ptr_t port, const vvp_vector4_t&bit, + unsigned base, unsigned wid, unsigned vwid) +{ + vvp_vector8_t tmp(bit, 6, 6); + if (invalue.size()==0) { + assert(tmp.size() == wid); + invalue = part_expand(tmp, vwid, base); + } else { + assert(invalue.size() == vwid); + for (unsigned idx = 0 ; idx < wid ; idx += 1) { + if ((base+idx) >= invalue.size()) + break; + invalue.set_bit(base+idx, tmp.value(idx)); + } + } + + island_->flag_island(); +} + + void vvp_island_port::recv_vec8(vvp_net_ptr_t port, const vvp_vector8_t bit) { invalue = bit; diff --git a/vvp/vvp_net.cc b/vvp/vvp_net.cc index b11b0469e..2ed915689 100644 --- a/vvp/vvp_net.cc +++ b/vvp/vvp_net.cc @@ -1802,6 +1802,10 @@ vvp_vector8_t::vvp_vector8_t(const vvp_vector4_t&that, vvp_vector8_t& vvp_vector8_t::operator= (const vvp_vector8_t&that) { + // Assign to self. + if (size_ > 0 && bits_ == that.bits_) + return *this; + if (size_ != that.size_) { if (size_ > 0) delete[]bits_; @@ -1845,7 +1849,7 @@ vvp_vector8_t vvp_vector8_t::subvalue(unsigned base, unsigned wid) const vvp_vector8_t tmp (wid); unsigned idx = 0; - while (base+idx < size_) { + while (idx < wid && base+idx < size_) { tmp.bits_[idx] = bits_[base+idx]; idx += 1; }