Each Simics class implemented by a module must be registered with Simics. Remember that classes registered in a module should be listed in the MODULE_CLASSES variable in the module's Makefile. This allows Simics to automatically load the required modules when reading a configuration file.
Registering a class is done by creating and filling a class_data_t structure, and then call the function SIM_register_class with the new class name and the class_data_t structure that describes it. The members in the class_data_t structure are:
In C/C++, registration of classes is usually done from within the mandatory init_local() function. The C definition of class_data_t and SIM_register_class() is the following:
typedef struct class_data {
conf_object_t *(*new_instance)(parse_object_t *parse_obj);
int (*delete_instance)(conf_object_t *obj);
void (*finalize_instance)(conf_object_t *obj);
const char *description;
class_kind_t kind;
} class_data_t;
conf_class_t *
SIM_register_class(const char *name, class_data_t *class_data);
SIM_register_class() returns a pointer to a conf_class_t structure which is used internally by Simics to keep track of the class information. This pointer can be used when referring to the class in calls to other functions.
A simple init_local() initialization function could look like this:
void
init_local(void)
{
class_data_t cdata;
conf_class_t *my_class;
memset(&cdata, 0, sizeof(cdata));
cdata.new_instance = my_new_instance;
cdata.description = "This is my class";
cdata.kind = Sim_Class_Kind_Session;
my_class = SIM_register_class("my-class", &cdata);
// Other initializations...
}
In Python, the registration is done when the global statements of the module are executed (at load time):
def new_instance(parse_obj):
...
def finalize_instance(obj):
...
class_data = class_data_t()
class_data.new_instance = new_instance
class_data.finalize_instance = finalize_instance
class_data.description = """
A sample class used for documentation purposes only.""";
SIM_register_class("sample-doc-class", class_data)