iverilog/ivtest/vpi/by_index.c

113 lines
2.7 KiB
C

#include <assert.h>
#include "vpi_user.h"
static PLI_INT32 check_val_calltf(ICARUS_VPI_CONST PLI_BYTE8*name)
{
(void) name; /* Not used */
vpiHandle callh = vpi_handle(vpiSysTfCall, 0);
vpiHandle argv = vpi_iterate(vpiArgument, callh);
vpiHandle item, index, value;
s_vpi_value val;
assert(argv);
item = vpi_scan(argv);
assert(item);
index = vpi_scan(argv);
assert(index);
value = vpi_scan(argv);
assert(value);
vpi_free_object(argv);
PLI_INT32 i_idx;
val.format = vpiIntVal;
vpi_get_value(index, &val);
i_idx = val.value.integer;
vpiHandle sel;
sel = vpi_handle_by_index(item, i_idx);
assert(sel);
vpi_printf("The index is %d\n", vpi_get(vpiIndex, sel));
vpi_printf("The type is %s\n", vpi_get_str(vpiType, sel));
vpi_printf("%s ", vpi_get_str(vpiName, sel));
val.format = vpiObjTypeVal;
vpi_get_value(value, &val);
if (val.format == vpiRealVal) {
vpi_printf("=> %.2f == ", val.value.real);
val.format = vpiRealVal;
vpi_get_value(sel, &val);
vpi_printf("%.2f\n", val.value.real);
} else {
val.format = vpiDecStrVal;
vpi_get_value(value, &val);
vpi_printf("=> %s == ", val.value.str);
val.format = vpiDecStrVal;
vpi_get_value(sel, &val);
vpi_printf("%s\n", val.value.str);
}
return 0;
}
static PLI_INT32 put_val_calltf(ICARUS_VPI_CONST PLI_BYTE8*name)
{
(void) name; /* Not used */
vpiHandle callh = vpi_handle(vpiSysTfCall, 0);
vpiHandle argv = vpi_iterate(vpiArgument, callh);
vpiHandle item, index, value;
s_vpi_value val;
assert(argv);
item = vpi_scan(argv);
assert(item);
index = vpi_scan(argv);
assert(index);
value = vpi_scan(argv);
assert(value);
vpi_free_object(argv);
PLI_INT32 i_idx;
val.format = vpiIntVal;
vpi_get_value(index, &val);
i_idx = val.value.integer;
vpiHandle sel;
sel = vpi_handle_by_index(item, i_idx);
assert(sel);
val.format = vpiObjTypeVal;
vpi_get_value(value, &val);
assert (val.format != vpiRealVal);
val.format = vpiIntVal;
vpi_get_value(value, &val);
vpi_put_value(sel, &val, NULL, vpiNoDelay);
return 0;
}
static void check_val_register(void)
{
s_vpi_systf_data tf_data;
tf_data.type = vpiSysTask;
tf_data.tfname = "$check_val";
tf_data.calltf = check_val_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
vpi_register_systf(&tf_data);
tf_data.type = vpiSysTask;
tf_data.tfname = "$put_val";
tf_data.calltf = put_val_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
vpi_register_systf(&tf_data);
}
void (*vlog_startup_routines[])(void) = {
check_val_register,
0
};