Add support for multiple models
This commit is contained in:
parent
123178c340
commit
9041583207
@ -17,7 +17,8 @@ add_library(emu STATIC
|
||||
emu.c
|
||||
emu_args.c
|
||||
emu_ev.c
|
||||
emu_model.c
|
||||
model.c
|
||||
models.c
|
||||
player.c
|
||||
stream.c
|
||||
trace.c
|
||||
|
@ -51,18 +51,20 @@ emu_init(struct emu *emu, int argc, char *argv[])
|
||||
return -1;
|
||||
}
|
||||
|
||||
// /* Register all the models */
|
||||
// emu_model_register(&emu->model, &ovni_model_spec, emu);
|
||||
model_init(&emu->model);
|
||||
|
||||
if (model_ovni.create && model_ovni.create(emu) != 0) {
|
||||
err("model ovni create failed");
|
||||
return -1;
|
||||
}
|
||||
if (model_nanos6.create && model_nanos6.create(emu) != 0) {
|
||||
err("model nanos6 create failed");
|
||||
/* Register all the models */
|
||||
models_register(&emu->model);
|
||||
|
||||
if (model_probe(&emu->model, emu) != 0) {
|
||||
err("model_probe failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (model_create(&emu->model, emu) != 0) {
|
||||
err("model_create failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -70,14 +72,11 @@ emu_init(struct emu *emu, int argc, char *argv[])
|
||||
int
|
||||
emu_connect(struct emu *emu)
|
||||
{
|
||||
if (model_ovni.connect && model_ovni.connect(emu) != 0) {
|
||||
err("model ovni connect failed");
|
||||
return -1;
|
||||
}
|
||||
if (model_nanos6.connect && model_nanos6.connect(emu) != 0) {
|
||||
err("model nanos6 connect failed");
|
||||
if (model_connect(&emu->model, emu) != 0) {
|
||||
err("model_connect failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -143,14 +142,8 @@ emu_step(struct emu *emu)
|
||||
}
|
||||
|
||||
/* Otherwise progress */
|
||||
if (emu->ev->m == 'O' && model_ovni.event(emu) != 0) {
|
||||
err("ovni event failed");
|
||||
panic(emu);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (emu->ev->m == '6' && model_nanos6.event(emu) != 0) {
|
||||
err("nanos6 event failed");
|
||||
if (model_event(&emu->model, emu, emu->ev->m) != 0) {
|
||||
err("model_event failed");
|
||||
panic(emu);
|
||||
return -1;
|
||||
}
|
||||
|
@ -9,7 +9,7 @@
|
||||
#include "emu_args.h"
|
||||
#include "system.h"
|
||||
#include "player.h"
|
||||
#include "emu_model.h"
|
||||
#include "model.h"
|
||||
#include "emu_ev.h"
|
||||
#include "recorder.h"
|
||||
|
||||
@ -25,7 +25,7 @@ struct emu {
|
||||
struct trace trace;
|
||||
struct system system;
|
||||
struct player player;
|
||||
struct emu_model model;
|
||||
struct model model;
|
||||
struct recorder recorder;
|
||||
|
||||
/* Quick access */
|
||||
|
@ -1,27 +0,0 @@
|
||||
/* Copyright (c) 2021-2023 Barcelona Supercomputing Center (BSC)
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later */
|
||||
|
||||
#include "emu_model.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
int
|
||||
emu_model_register(struct emu_model *model, struct model_spec *spec, void *ctx)
|
||||
{
|
||||
int i = spec->model;
|
||||
model->ctx[i] = ctx;
|
||||
model->spec[i] = spec;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *
|
||||
emu_model_get_context(struct emu_model *model, struct model_spec *spec, int imodel)
|
||||
{
|
||||
for (int i = 0; spec->depends[i]; i++) {
|
||||
if (spec->depends[i] == imodel)
|
||||
return model->ctx[imodel];
|
||||
}
|
||||
|
||||
/* Not allowed */
|
||||
return NULL;
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
/* Copyright (c) 2021-2023 Barcelona Supercomputing Center (BSC)
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later */
|
||||
|
||||
#ifndef EMU_MODEL_H
|
||||
#define EMU_MODEL_H
|
||||
|
||||
#include "emu_hook.h"
|
||||
|
||||
struct model_spec {
|
||||
char *name;
|
||||
int model;
|
||||
char *depends;
|
||||
emu_hook_t *probe;
|
||||
emu_hook_t *create;
|
||||
emu_hook_t *connect;
|
||||
emu_hook_t *event;
|
||||
};
|
||||
|
||||
struct emu_model {
|
||||
struct model_spec *spec[256];
|
||||
void *ctx[256];
|
||||
};
|
||||
|
||||
int emu_model_parse(struct emu_model *model, struct model_spec *spec, void *ctx);
|
||||
int emu_model_register(struct emu_model *model, struct model_spec *spec, void *ctx);
|
||||
int emu_model_register(struct emu_model *model, struct model_spec *spec, void *ctx);
|
||||
void *emu_model_get_context(struct emu_model *model, struct model_spec *spec, int imodel);
|
||||
|
||||
#endif /* EMU_MODEL_H */
|
98
src/emu/model.c
Normal file
98
src/emu/model.c
Normal file
@ -0,0 +1,98 @@
|
||||
/* Copyright (c) 2021-2023 Barcelona Supercomputing Center (BSC)
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later */
|
||||
|
||||
#include "model.h"
|
||||
|
||||
#include "common.h"
|
||||
#include <string.h>
|
||||
|
||||
void
|
||||
model_init(struct model *model)
|
||||
{
|
||||
memset(model, 0, sizeof(struct model));
|
||||
}
|
||||
|
||||
void
|
||||
model_register(struct model *model, struct model_spec *spec)
|
||||
{
|
||||
int i = spec->model;
|
||||
model->spec[i] = spec;
|
||||
model->registered[i] = 1;
|
||||
}
|
||||
|
||||
int
|
||||
model_probe(struct model *model, struct emu *emu)
|
||||
{
|
||||
for (int i = 0; i < MAX_MODELS; i++) {
|
||||
if (!model->registered[i])
|
||||
continue;
|
||||
|
||||
struct model_spec *spec = model->spec[i];
|
||||
if (spec->probe == NULL)
|
||||
continue;
|
||||
|
||||
if (spec->probe(emu) != 0) {
|
||||
err("probe failed for model '%c'", (char) i);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
model_create(struct model *model, struct emu *emu)
|
||||
{
|
||||
for (int i = 0; i < MAX_MODELS; i++) {
|
||||
if (!model->registered[i])
|
||||
continue;
|
||||
|
||||
struct model_spec *spec = model->spec[i];
|
||||
if (spec->create == NULL)
|
||||
continue;
|
||||
|
||||
if (spec->create(emu) != 0) {
|
||||
err("create failed for model '%c'", (char) i);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
model_connect(struct model *model, struct emu *emu)
|
||||
{
|
||||
for (int i = 0; i < MAX_MODELS; i++) {
|
||||
if (!model->registered[i])
|
||||
continue;
|
||||
|
||||
struct model_spec *spec = model->spec[i];
|
||||
if (spec->connect == NULL)
|
||||
continue;
|
||||
|
||||
if (spec->connect(emu) != 0) {
|
||||
err("connect failed for model '%c'", (char) i);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
model_event(struct model *model, struct emu *emu, int index)
|
||||
{
|
||||
if (!model->registered[index]) {
|
||||
err("no model registered for '%c'", (char) index);
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct model_spec *spec = model->spec[index];
|
||||
if (spec->event == NULL)
|
||||
return 0;
|
||||
|
||||
if (spec->event(emu) != 0) {
|
||||
err("event() failed for model '%c'", (char) index);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
34
src/emu/model.h
Normal file
34
src/emu/model.h
Normal file
@ -0,0 +1,34 @@
|
||||
/* Copyright (c) 2021-2023 Barcelona Supercomputing Center (BSC)
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later */
|
||||
|
||||
#ifndef MODEL_H
|
||||
#define MODEL_H
|
||||
|
||||
#include "emu_hook.h"
|
||||
|
||||
struct model_spec {
|
||||
char *name;
|
||||
int model;
|
||||
char *depends;
|
||||
emu_hook_t *probe;
|
||||
emu_hook_t *create;
|
||||
emu_hook_t *connect;
|
||||
emu_hook_t *event;
|
||||
};
|
||||
|
||||
#define MAX_MODELS 256
|
||||
|
||||
struct model {
|
||||
struct model_spec *spec[MAX_MODELS];
|
||||
int registered[MAX_MODELS];
|
||||
};
|
||||
|
||||
void model_init(struct model *model);
|
||||
void model_register(struct model *model, struct model_spec *spec);
|
||||
|
||||
int model_probe(struct model *model, struct emu *emu);
|
||||
int model_create(struct model *model, struct emu *emu);
|
||||
int model_connect(struct model *model, struct emu *emu);
|
||||
int model_event(struct model *model, struct emu *emu, int index);
|
||||
|
||||
#endif /* MODEL_H */
|
23
src/emu/models.c
Normal file
23
src/emu/models.c
Normal file
@ -0,0 +1,23 @@
|
||||
/* Copyright (c) 2023 Barcelona Supercomputing Center (BSC)
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later */
|
||||
|
||||
#include "models.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
extern struct model_spec model_ovni;
|
||||
extern struct model_spec model_nanos6;
|
||||
|
||||
static struct model_spec *models[] = {
|
||||
&model_ovni,
|
||||
&model_nanos6,
|
||||
NULL
|
||||
};
|
||||
|
||||
void
|
||||
models_register(struct model *model)
|
||||
{
|
||||
for (int i = 0; models[i] != NULL; i++) {
|
||||
model_register(model, models[i]);
|
||||
}
|
||||
}
|
@ -4,9 +4,9 @@
|
||||
#ifndef MODELS_H
|
||||
#define MODELS_H
|
||||
|
||||
#include "emu_model.h"
|
||||
#include "model.h"
|
||||
|
||||
extern struct model_spec model_ovni;
|
||||
extern struct model_spec model_nanos6;
|
||||
void
|
||||
models_register(struct model *model);
|
||||
|
||||
#endif /* MODELS_H */
|
||||
|
Loading…
Reference in New Issue
Block a user