System functions have a default return value.

If a system function does not call vpi_put_value it is
supposed to have a default return value of 0. This patch
adds this functionality.
This commit is contained in:
Cary R 2008-05-27 15:11:17 -07:00 committed by Stephen Williams
parent 7a1180868a
commit f04fb0fc45
2 changed files with 26 additions and 1 deletions

View File

@ -368,6 +368,7 @@ struct __vpiSysTaskCall {
class vvp_net_t*fnet;
unsigned file_idx;
unsigned lineno;
bool put_value;
};
extern struct __vpiSysTaskCall*vpip_cur_task;

View File

@ -167,6 +167,8 @@ static vpiHandle sysfunc_put_value(vpiHandle ref, p_vpi_value vp, int)
struct __vpiSysTaskCall*rfp = (struct __vpiSysTaskCall*)ref;
rfp->put_value = true;
assert(rfp->vbit >= 4);
switch (vp->format) {
@ -271,6 +273,8 @@ static vpiHandle sysfunc_put_real_value(vpiHandle ref, p_vpi_value vp, int)
struct __vpiSysTaskCall*rfp = (struct __vpiSysTaskCall*)ref;
rfp->put_value = true;
/* Make sure this is a real valued function. */
assert(rfp->vwid == -vpiRealConst);
@ -297,6 +301,8 @@ static vpiHandle sysfunc_put_4net_value(vpiHandle ref, p_vpi_value vp, int)
struct __vpiSysTaskCall*rfp = (struct __vpiSysTaskCall*)ref;
rfp->put_value = true;
unsigned vwid = (unsigned) rfp->vwid;
vvp_vector4_t val (vwid);
@ -384,8 +390,10 @@ static vpiHandle sysfunc_put_rnet_value(vpiHandle ref, p_vpi_value vp, int)
assert(ref->vpi_type->type_code == vpiSysFuncCall);
struct __vpiSysTaskCall*rfp = (struct __vpiSysTaskCall*)ref;
double val;
rfp->put_value = true;
double val;
switch (vp->format) {
case vpiRealVal:
@ -563,6 +571,7 @@ vpiHandle vpip_build_vpi_call(const char*name, unsigned vbit, int vwid,
obj->file_idx = (unsigned) file_idx;
obj->lineno = (unsigned) lineno;
obj->userdata = 0;
obj->put_value = false;
compile_compiletf(obj);
@ -590,8 +599,23 @@ void vpip_execute_vpi_call(vthread_t thr, vpiHandle ref)
if (vpip_cur_task->defn->info.calltf) {
assert(vpi_mode_flag == VPI_MODE_NONE);
vpi_mode_flag = VPI_MODE_CALLTF;
vpip_cur_task->put_value = false;
vpip_cur_task->defn->info.calltf(vpip_cur_task->defn->info.user_data);
vpi_mode_flag = VPI_MODE_NONE;
/* If the function call did not set a value then put a
* default value (0). */
if (ref->vpi_type->type_code == vpiSysFuncCall &&
!vpip_cur_task->put_value) {
s_vpi_value val;
if (vpip_cur_task->vwid == -vpiRealConst) {
val.format = vpiRealVal;
val.value.real = 0.0;
} else {
val.format = vpiIntVal;
val.value.integer = 0;
}
vpi_put_value(ref, &val, 0, vpiNoDelay);
}
}
}