blob: f7af34e5c5d31097e101e0187571ad0ca47e37d2 [file] [log] [blame]
/*
* Copyright (c) 2023 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef NSI_COMMON_SRC_INCL_HWS_MODELS_IF_H
#define NSI_COMMON_SRC_INCL_HWS_MODELS_IF_H
#include <stdint.h>
#include "nsi_utils.h"
#include "nsi_hw_scheduler.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Internal structure used to link HW events */
struct nsi_hw_event_st {
void (*const callback)(void);
uint64_t *timer;
};
/**
* Register an event timer and event callback
*
* The HW scheduler will keep track of this event, and call its callback whenever its
* timer is reached.
* The ordering of events in the same microsecond is given by prio (lowest first).
* (Normally HW models will not care about the event ordering, and will simply set a prio like 100)
*
* Only very particular models will need to execute before or after others.
*
* Priority can be a number between 0 and 999.
*/
#define NSI_HW_EVENT(t, fn, prio) \
static const struct nsi_hw_event_st NSI_CONCAT(NSI_CONCAT(__nsi_hw_event_, fn), t) \
__attribute__((__used__)) \
__attribute__((__section__(".nsi_hw_event_" NSI_STRINGIFY(prio)))) \
= { \
.callback = fn, \
.timer = &t, \
}
#ifdef __cplusplus
}
#endif
#endif /* NSI_COMMON_SRC_INCL_HWS_MODELS_IF_H */