From f04fb0fc450b460ad8a52beb0f00db7f16228fc1 Mon Sep 17 00:00:00 2001 From: Cary R Date: Tue, 27 May 2008 15:11:17 -0700 Subject: [PATCH] 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. --- vvp/vpi_priv.h | 1 + vvp/vpi_tasks.cc | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/vvp/vpi_priv.h b/vvp/vpi_priv.h index fc43caeff..ab4e11658 100644 --- a/vvp/vpi_priv.h +++ b/vvp/vpi_priv.h @@ -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; diff --git a/vvp/vpi_tasks.cc b/vvp/vpi_tasks.cc index f82a43c41..fdad4ffc3 100644 --- a/vvp/vpi_tasks.cc +++ b/vvp/vpi_tasks.cc @@ -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); + } } }