Implement release and deassign more directly.

There is no use implementing the release and deassign methods as
port commands. It's confusing and a waste of vvp_net_t functionality.
It also obscures what needs to be done to more force/release into
the filter object.
This commit is contained in:
Stephen Williams 2009-05-15 20:49:07 -07:00
parent d780af1eca
commit 682ab886d8
4 changed files with 17 additions and 80 deletions

View File

@ -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<vvp_fun_signal_base*>(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;
}

View File

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

View File

@ -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)
{

View File

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