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-28 09:53:27 -07:00
committed by Stephen Williams
parent 7a1180868a
commit f04fb0fc45
2 changed files with 26 additions and 1 deletions
+25 -1
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);
}
}
}