static PLI_INT32 sys_mti_dist_uniform_calltf(ICARUS_VPI_CONST PLI_BYTE8*name) { vpiHandle callh, argv, seed, start, end; s_vpi_value val; long i_seed, i_start, i_end; /* Get the argument handles and convert them. */ callh = vpi_handle(vpiSysTfCall, 0); argv = vpi_iterate(vpiArgument, callh); seed = vpi_scan(argv); start = vpi_scan(argv); end = vpi_scan(argv); val.format = vpiIntVal; vpi_get_value(seed, &val); i_seed = val.value.integer; vpi_get_value(start, &val); i_start = val.value.integer; vpi_get_value(end, &val); i_end = val.value.integer; /* Calculate and return the result. */ val.value.integer = mti_dist_uniform(&i_seed, i_start, i_end); vpi_put_value(callh, &val, 0, vpiNoDelay); /* Return the seed. */ val.value.integer = i_seed; vpi_put_value(seed, &val, 0, vpiNoDelay); vpi_free_object(argv); return 0; }
static PLI_INT32 sys_mti_dist_uniform_calltf(PLI_BYTE8*name) { s_vpi_value val; vpiHandle call_handle; vpiHandle argv; vpiHandle seed = 0, start, end; long i_seed, i_start, i_end; call_handle = vpi_handle(vpiSysTfCall, 0); assert(call_handle); argv = vpi_iterate(vpiArgument, call_handle); if (argv == 0) { vpi_printf("ERROR: %s requires parameters " "(seed, start, end)\n", name); return 0; } seed = vpi_scan(argv); assert(seed); start = vpi_scan(argv); assert(start); end = vpi_scan(argv); assert(end); vpi_free_object(argv); val.format = vpiIntVal; vpi_get_value(seed, &val); i_seed = val.value.integer; vpi_get_value(start, &val); i_start = val.value.integer; vpi_get_value(end, &val); i_end = val.value.integer; val.format = vpiIntVal; val.value.integer = mti_dist_uniform(&i_seed, i_start, i_end); vpi_put_value(call_handle, &val, 0, vpiNoDelay); val.format = vpiIntVal; val.value.integer = i_seed; vpi_put_value(seed, &val, 0, vpiNoDelay); return 0; }