Island ports can accept vector parts.

This commit is contained in:
Stephen Williams 2008-06-03 17:31:15 -07:00
parent ff9166d4a5
commit c2061e8199
2 changed files with 28 additions and 1 deletions

View File

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

View File

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