Make .part/pv strength aware and resolv vec8_pv aware.
This patch makes .part/pv strength aware, resolv vec8_pv aware. vvp_net_fun_t adds vec8_pv as a virtual function with an appropriate error default. vvp_fun_signal should full support vec8_pv (not tested and may not be needed).
This commit is contained in:
parent
5207be0778
commit
7a4f85d382
15
vvp/part.cc
15
vvp/part.cc
|
|
@ -109,6 +109,21 @@ void vvp_fun_part_pv::recv_vec4(vvp_net_ptr_t port, const vvp_vector4_t&bit)
|
||||||
vvp_send_vec4_pv(port.ptr()->out, bit, base_, wid_, vwid_);
|
vvp_send_vec4_pv(port.ptr()->out, bit, base_, wid_, vwid_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vvp_fun_part_pv::recv_vec8(vvp_net_ptr_t port, const vvp_vector8_t&bit)
|
||||||
|
{
|
||||||
|
assert(port.port() == 0);
|
||||||
|
|
||||||
|
if (bit.size() != wid_) {
|
||||||
|
cerr << "internal error: part_pv (strength-aware) data mismatch. "
|
||||||
|
<< "base_=" << base_ << ", wid_=" << wid_
|
||||||
|
<< ", vwid_=" << vwid_ << ", bit=" << bit
|
||||||
|
<< endl;
|
||||||
|
}
|
||||||
|
assert(bit.size() == wid_);
|
||||||
|
|
||||||
|
vvp_send_vec8_pv(port.ptr()->out, bit, base_, wid_, vwid_);
|
||||||
|
}
|
||||||
|
|
||||||
vvp_fun_part_var::vvp_fun_part_var(unsigned w)
|
vvp_fun_part_var::vvp_fun_part_var(unsigned w)
|
||||||
: base_(0), wid_(w)
|
: base_(0), wid_(w)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@ class vvp_fun_part_pv : public vvp_net_fun_t {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void recv_vec4(vvp_net_ptr_t port, const vvp_vector4_t&bit);
|
void recv_vec4(vvp_net_ptr_t port, const vvp_vector4_t&bit);
|
||||||
|
void recv_vec8(vvp_net_ptr_t port, const vvp_vector8_t&bit);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
unsigned base_;
|
unsigned base_;
|
||||||
|
|
|
||||||
|
|
@ -97,6 +97,24 @@ void resolv_functor::recv_vec8(vvp_net_ptr_t port, const vvp_vector8_t&bit)
|
||||||
vvp_send_vec8(ptr->out, out);
|
vvp_send_vec8(ptr->out, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void resolv_functor::recv_vec8_pv(vvp_net_ptr_t port, const vvp_vector8_t&bit,
|
||||||
|
unsigned base, unsigned wid, unsigned vwid)
|
||||||
|
{
|
||||||
|
assert(bit.size() == wid);
|
||||||
|
vvp_vector8_t res (vwid);
|
||||||
|
|
||||||
|
for (unsigned idx = 0 ; idx < base ; idx += 1)
|
||||||
|
res.set_bit(idx, vvp_scalar_t());
|
||||||
|
|
||||||
|
for (unsigned idx = 0 ; idx < wid ; idx += 1)
|
||||||
|
res.set_bit(idx+base, bit.value(idx));
|
||||||
|
|
||||||
|
for (unsigned idx = base+wid ; idx < vwid ; idx += 1)
|
||||||
|
res.set_bit(idx, vvp_scalar_t());
|
||||||
|
|
||||||
|
recv_vec8(port, res);
|
||||||
|
}
|
||||||
|
|
||||||
resolv_wired_logic::resolv_wired_logic()
|
resolv_wired_logic::resolv_wired_logic()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,8 @@ class resolv_functor : public vvp_net_fun_t {
|
||||||
|
|
||||||
void recv_vec4_pv(vvp_net_ptr_t port, const vvp_vector4_t&bit,
|
void recv_vec4_pv(vvp_net_ptr_t port, const vvp_vector4_t&bit,
|
||||||
unsigned base, unsigned wid, unsigned vwid);
|
unsigned base, unsigned wid, unsigned vwid);
|
||||||
|
void recv_vec8_pv(vvp_net_ptr_t port, const vvp_vector8_t&bit,
|
||||||
|
unsigned base, unsigned wid, unsigned vwid);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
vvp_vector8_t val_[4];
|
vvp_vector8_t val_[4];
|
||||||
|
|
|
||||||
|
|
@ -2123,7 +2123,16 @@ void vvp_net_fun_t::recv_vec4_pv(vvp_net_ptr_t, const vvp_vector4_t&bits,
|
||||||
unsigned base, unsigned wid, unsigned vwid)
|
unsigned base, unsigned wid, unsigned vwid)
|
||||||
{
|
{
|
||||||
cerr << "internal error: " << typeid(*this).name() << ": "
|
cerr << "internal error: " << typeid(*this).name() << ": "
|
||||||
<< "recv_vect_pv(" << bits << ", " << base
|
<< "recv_vec4_pv(" << bits << ", " << base
|
||||||
|
<< ", " << wid << ", " << vwid << ") not implemented" << endl;
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vvp_net_fun_t::recv_vec8_pv(vvp_net_ptr_t, const vvp_vector8_t&bits,
|
||||||
|
unsigned base, unsigned wid, unsigned vwid)
|
||||||
|
{
|
||||||
|
cerr << "internal error: " << typeid(*this).name() << ": "
|
||||||
|
<< "recv_vec8_pv(" << bits << ", " << base
|
||||||
<< ", " << wid << ", " << vwid << ") not implemented" << endl;
|
<< ", " << wid << ", " << vwid << ") not implemented" << endl;
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
@ -2402,6 +2411,12 @@ void vvp_fun_signal::recv_vec4_pv(vvp_net_ptr_t ptr, const vvp_vector4_t&bit,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vvp_fun_signal::recv_vec8_pv(vvp_net_ptr_t ptr, const vvp_vector8_t&bit,
|
||||||
|
unsigned base, unsigned wid, unsigned vwid)
|
||||||
|
{
|
||||||
|
recv_vec4_pv(ptr, reduce4(bit), base, wid, vwid);
|
||||||
|
}
|
||||||
|
|
||||||
void vvp_fun_signal::calculate_output_(vvp_net_ptr_t ptr)
|
void vvp_fun_signal::calculate_output_(vvp_net_ptr_t ptr)
|
||||||
{
|
{
|
||||||
if (force_mask_.size()) {
|
if (force_mask_.size()) {
|
||||||
|
|
|
||||||
|
|
@ -870,6 +870,8 @@ class vvp_net_fun_t {
|
||||||
// Part select variants of above
|
// Part select variants of above
|
||||||
virtual void recv_vec4_pv(vvp_net_ptr_t p, const vvp_vector4_t&bit,
|
virtual void recv_vec4_pv(vvp_net_ptr_t p, const vvp_vector4_t&bit,
|
||||||
unsigned base, unsigned wid, unsigned vwid);
|
unsigned base, unsigned wid, unsigned vwid);
|
||||||
|
virtual void recv_vec8_pv(vvp_net_ptr_t p, const vvp_vector8_t&bit,
|
||||||
|
unsigned base, unsigned wid, unsigned vwid);
|
||||||
virtual void recv_long_pv(vvp_net_ptr_t port, long bit,
|
virtual void recv_long_pv(vvp_net_ptr_t port, long bit,
|
||||||
unsigned base, unsigned wid);
|
unsigned base, unsigned wid);
|
||||||
|
|
||||||
|
|
@ -1114,6 +1116,8 @@ class vvp_fun_signal : public vvp_fun_signal_vec {
|
||||||
// Part select variants of above
|
// Part select variants of above
|
||||||
void recv_vec4_pv(vvp_net_ptr_t port, const vvp_vector4_t&bit,
|
void recv_vec4_pv(vvp_net_ptr_t port, const vvp_vector4_t&bit,
|
||||||
unsigned base, unsigned wid, unsigned vwid);
|
unsigned base, unsigned wid, unsigned vwid);
|
||||||
|
void recv_vec8_pv(vvp_net_ptr_t port, const vvp_vector8_t&bit,
|
||||||
|
unsigned base, unsigned wid, unsigned vwid);
|
||||||
|
|
||||||
// Get information about the vector value.
|
// Get information about the vector value.
|
||||||
unsigned size() const;
|
unsigned size() const;
|
||||||
|
|
@ -1320,4 +1324,17 @@ inline void vvp_send_vec4_pv(vvp_net_ptr_t ptr, const vvp_vector4_t&val,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void vvp_send_vec8_pv(vvp_net_ptr_t ptr, const vvp_vector8_t&val,
|
||||||
|
unsigned base, unsigned wid, unsigned vwid)
|
||||||
|
{
|
||||||
|
while (struct vvp_net_t*cur = ptr.ptr()) {
|
||||||
|
vvp_net_ptr_t next = cur->port[ptr.port()];
|
||||||
|
|
||||||
|
if (cur->fun)
|
||||||
|
cur->fun->recv_vec8_pv(ptr, val, base, wid, vwid);
|
||||||
|
|
||||||
|
ptr = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue