diff --git a/vvp/vpi_signal.cc b/vvp/vpi_signal.cc index bccbc2e5f..4ae87285e 100644 --- a/vvp/vpi_signal.cc +++ b/vvp/vpi_signal.cc @@ -757,9 +757,13 @@ static vpiHandle signal_put_value(vpiHandle ref, s_vpi_value*vp, int flags) value. Instead, issue a release "command" to the signal node to cause it to release a forced value. */ if (flags == vpiReleaseFlag) { - vvp_net_ptr_t dest_cmd(rfp->node, 3); + vvp_fun_signal_base*sig + = reinterpret_cast(rfp->node->fun); + assert(sig); + + vvp_net_ptr_t ptr(rfp->node, 0); /* Assume this is a net. (XXXX Are we sure?) */ - vvp_send_long(dest_cmd, 2 /* release/net */); + sig->release(ptr, true); return ref; } diff --git a/vvp/vthread.cc b/vvp/vthread.cc index e7611fdba..b11a2f034 100644 --- a/vvp/vthread.cc +++ b/vvp/vthread.cc @@ -1747,11 +1747,10 @@ bool of_DEASSIGN(vthread_t thr, vvp_code_t cp) } /* Do we release all or part of the net? */ - vvp_net_ptr_t ptr (net, 3); if (full_sig) { - vvp_send_long(ptr, 1); + sig->deassign(); } else { - vvp_send_long_pv(ptr, 1, base, width); + sig->deassign_pv(base, width); } return true; @@ -1772,8 +1771,7 @@ bool of_DEASSIGN_WR(vthread_t thr, vvp_code_t cp) sig->cassign_link = 0; } - vvp_net_ptr_t ptr (net, 3); - vvp_send_long(ptr, 1); + sig->deassign(); return true; } @@ -3940,11 +3938,11 @@ bool of_RELEASE_NET(vthread_t thr, vvp_code_t cp) assert(sig->force_link == 0); /* Do we release all or part of the net? */ - vvp_net_ptr_t ptr (net, 3); + vvp_net_ptr_t ptr (net, 0); if (full_sig) { - vvp_send_long(ptr, 2); + sig->release(ptr, true); } else { - vvp_send_long_pv(ptr, 2, base, width); + sig->release_pv(ptr, true, base, width); } return true; @@ -3980,11 +3978,11 @@ bool of_RELEASE_REG(vthread_t thr, vvp_code_t cp) // Send a command to this signal to unforce itself. /* Do we release all or part of the net? */ - vvp_net_ptr_t ptr (net, 3); + vvp_net_ptr_t ptr (net, 0); if (full_sig) { - vvp_send_long(ptr, 3); + sig->release(ptr, false); } else { - vvp_send_long_pv(ptr, 3, base, width); + sig->release_pv(ptr, false, base, width); } return true; @@ -4008,9 +4006,8 @@ bool of_RELEASE_WR(vthread_t thr, vvp_code_t cp) } // Send a command to this signal to unforce itself. - vvp_net_ptr_t ptr (net, 3); - vvp_send_long(ptr, 2 + type); - + vvp_net_ptr_t ptr (net, 0); + sig->release(ptr, type==0); return true; } diff --git a/vvp/vvp_net_sig.cc b/vvp/vvp_net_sig.cc index b5d62c351..5a99f18de 100644 --- a/vvp/vvp_net_sig.cc +++ b/vvp/vvp_net_sig.cc @@ -254,67 +254,6 @@ vvp_fun_signal_base::vvp_fun_signal_base() count_functors_sig += 1; } -/* - * The signal functor takes commands as long values to port-3. This - * method interprets those commands. - */ -void vvp_fun_signal_base::recv_long(vvp_net_ptr_t ptr, long bit) -{ - switch (ptr.port()) { - case 3: // Command port - switch (bit) { - case 1: // deassign command - deassign(); - break; - case 2: // release/net - release(ptr, true); - break; - case 3: // release/reg - release(ptr, false); - break; - default: - fprintf(stderr, "Unsupported command %ld.\n", bit); - assert(0); - break; - } - break; - - default: // Other ports are errors. - fprintf(stderr, "Unsupported port type %d.\n", ptr.port()); - assert(0); - break; - } -} - -void vvp_fun_signal_base::recv_long_pv(vvp_net_ptr_t ptr, long bit, - unsigned base, unsigned wid) -{ - switch (ptr.port()) { - case 3: // Command port - switch (bit) { - case 1: // deassign command - deassign_pv(base, wid); - break; - case 2: // release/net - release_pv(ptr, true, base, wid); - break; - case 3: // release/reg - release_pv(ptr, false, base, wid); - break; - default: - fprintf(stderr, "Unsupported command %ld.\n", bit); - assert(0); - break; - } - break; - - default: // Other ports are errors. - fprintf(stderr, "Unsupported port type %d.\n", ptr.port()); - assert(0); - break; - } -} - vvp_fun_signal4_sa::vvp_fun_signal4_sa(unsigned wid, vvp_bit4_t init) : bits4_(wid, init) { diff --git a/vvp/vvp_net_sig.h b/vvp/vvp_net_sig.h index 115e0e1ab..049bf9a9b 100644 --- a/vvp/vvp_net_sig.h +++ b/vvp/vvp_net_sig.h @@ -188,9 +188,6 @@ class vvp_fun_signal_base : public vvp_net_fun_t, public vvp_filter_wire_base { public: vvp_fun_signal_base(); - void recv_long(vvp_net_ptr_t port, long bit); - void recv_long_pv(vvp_net_ptr_t port, long bit, - unsigned base, unsigned wid); void deassign(); void deassign_pv(unsigned base, unsigned wid);