iverilog/ivtest/vpi/start_of_simtime1.c

97 lines
2.0 KiB
C
Raw Normal View History

# include <vpi_user.h>
# include <stdlib.h>
# include <assert.h>
struct poke_details {
vpiHandle dst;
int val;
};
static PLI_INT32 delayed_poke(p_cb_data cb_data)
{
s_vpi_value value;
struct poke_details*poke = (struct poke_details*)cb_data->user_data;
value.format = vpiIntVal;
value.value.integer = poke->val;
vpi_put_value(poke->dst, &value, 0, vpiNoDelay);
free(poke);
return 0;
}
static PLI_INT32 poke_compiletf(char*xx)
{
(void)xx; /* Parameter is not used. */
return 0;
}
static PLI_INT32 poke_calltf(char*xx)
{
s_vpi_value value;
s_vpi_time poke_time;
s_cb_data cb_data;
vpiHandle sys = vpi_handle(vpiSysTfCall, 0);
vpiHandle argv = vpi_iterate(vpiArgument, sys);
vpiHandle dst, val, del, tmp;
struct poke_details*poke;
(void)xx; /* Parameter is not used. */
assert(argv);
dst = vpi_scan(argv);
assert(dst);
val = vpi_scan(argv);
assert(val);
del = vpi_scan(argv);
assert(del);
tmp = vpi_scan(argv);
assert(tmp == 0);
poke = calloc(1, sizeof (struct poke_details));
assert(poke);
poke->dst = dst;
value.format = vpiIntVal;
vpi_get_value(val, &value);
poke->val = value.value.integer;
value.format = vpiIntVal;
vpi_get_value(del, &value);
poke_time.low = value.value.integer;
poke_time.high = 0;
poke_time.type = vpiSimTime;
cb_data.reason = cbAtStartOfSimTime;
cb_data.cb_rtn = delayed_poke;
cb_data.user_data = (char*)poke;
cb_data.time = &poke_time;
vpi_register_cb(&cb_data);
return 0;
}
static void poke_after_delay_register(void)
{
s_vpi_systf_data tf_data;
tf_data.type = vpiSysTask;
tf_data.tfname = "$poke_at_simtime";
tf_data.calltf = poke_calltf;
tf_data.compiletf = poke_compiletf;
tf_data.sizetf = 0;
vpi_register_systf(&tf_data);
}
void (*vlog_startup_routines[])(void) = {
poke_after_delay_register,
0
};