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:
parent
7a1180868a
commit
f04fb0fc45
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue