File simulatormodule.cpp

Callback Handling

Handle a callback coming from GPI

GILState before calling: Unknown

GILState after calling: Unknown

Makes one call to TAKE_GIL and one call to DROP_GIL

Returns 0 on success or 1 on a failure.

Handles a callback from the simulator, all of which call this function.

We extract the associated context and find the Python function (usually cocotb.scheduler.react) calling it with a reference to the trigger that fired. The scheduler can then call next() on all the coroutines that are waiting on that particular trigger.

TODO:

  • Tidy up return values

  • Ensure cleanup correctly in exception cases

struct PyModuleDef moduledef = {PyModuleDef_HEAD_INIT, MODULE_NAME, NULL, -1, SimulatorMethods, NULL, NULL, NULL, NULL}
PyMethodDef gpi_sim_hdl_methods[]
PyMethodDef gpi_cb_hdl_methods [] = { {"deregister", (PyCFunction)deregister, METH_NOARGS, PyDoc_STR( "deregister($self)\n" "--\n\n" "deregister() -> None\n" "De-register this callback." )}, {NULL, NULL, 0, NULL} }
int handle_gpi_callback(void *user_data)
PyObject *log_msg(PyObject *self, PyObject *args)
callback_data *callback_data_new(PyObject *func, PyObject *args, PyObject *kwargs)
PyObject *register_readonly_callback(PyObject *self, PyObject *args)
PyObject *register_rwsynch_callback(PyObject *self, PyObject *args)
PyObject *register_nextstep_callback(PyObject *self, PyObject *args)
PyObject *register_timed_callback(PyObject *self, PyObject *args)
PyObject *register_value_change_callback(PyObject *self, PyObject *args)
PyObject *iterate(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *next(gpi_hdl_Object<gpi_iterator_hdl> *self)
PyObject *get_signal_val_binstr(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *get_signal_val_str(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *get_signal_val_real(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *get_signal_val_long(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *set_signal_val_binstr(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *set_signal_val_str(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *set_signal_val_real(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *set_signal_val_long(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *get_definition_name(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *get_definition_file(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *get_handle_by_name(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *get_handle_by_index(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *get_root_handle(PyObject *self, PyObject *args)
PyObject *get_name_string(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *get_type(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *get_const(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *get_type_string(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *is_running(PyObject *self, PyObject *args)
PyObject *get_sim_time(PyObject *self, PyObject *args)
PyObject *get_precision(PyObject *self, PyObject *args)
PyObject *get_simulator_product(PyObject *m, PyObject *args)
PyObject *get_simulator_version(PyObject *m, PyObject *args)
PyObject *get_num_elems(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *get_range(gpi_hdl_Object<gpi_sim_hdl> *self, PyObject *args)
PyObject *stop_simulator(PyObject *self, PyObject *args)
PyObject *deregister(gpi_hdl_Object<gpi_cb_hdl> *self, PyObject *args)
PyObject *log_level(PyObject *self, PyObject *args)
int add_module_constants(PyObject *simulator)
int add_module_types(PyObject *simulator)
PyMODINIT_FUNC PyInit_simulator(void)

Typedefs

typedef int (*gpi_function_t)(const void*)

Functions

PyGILState_STATE TAKE_GIL(void)
void DROP_GIL(PyGILState_STATE state)

Variables

int takes = 0
int releases = 0
int sim_ending = 0
struct sim_time cache_time
struct sim_time

Public Members

uint32_t high
uint32_t low