Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/include/rv/automata.h
26282 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
/*
3
* Copyright (C) 2019-2022 Red Hat, Inc. Daniel Bristot de Oliveira <[email protected]>
4
*
5
* Deterministic automata helper functions, to be used with the automata
6
* models in C generated by the dot2k tool.
7
*/
8
9
/*
10
* DECLARE_AUTOMATA_HELPERS - define a set of helper functions for automata
11
*
12
* Define a set of helper functions for automata. The 'name' argument is used
13
* as suffix for the functions and data. These functions will handle automaton
14
* with data type 'type'.
15
*/
16
#define DECLARE_AUTOMATA_HELPERS(name, type) \
17
\
18
/* \
19
* model_get_state_name_##name - return the (string) name of the given state \
20
*/ \
21
static char *model_get_state_name_##name(enum states_##name state) \
22
{ \
23
if ((state < 0) || (state >= state_max_##name)) \
24
return "INVALID"; \
25
\
26
return automaton_##name.state_names[state]; \
27
} \
28
\
29
/* \
30
* model_get_event_name_##name - return the (string) name of the given event \
31
*/ \
32
static char *model_get_event_name_##name(enum events_##name event) \
33
{ \
34
if ((event < 0) || (event >= event_max_##name)) \
35
return "INVALID"; \
36
\
37
return automaton_##name.event_names[event]; \
38
} \
39
\
40
/* \
41
* model_get_initial_state_##name - return the automaton's initial state \
42
*/ \
43
static inline type model_get_initial_state_##name(void) \
44
{ \
45
return automaton_##name.initial_state; \
46
} \
47
\
48
/* \
49
* model_get_next_state_##name - process an automaton event occurrence \
50
* \
51
* Given the current state (curr_state) and the event (event), returns \
52
* the next state, or INVALID_STATE in case of error. \
53
*/ \
54
static inline type model_get_next_state_##name(enum states_##name curr_state, \
55
enum events_##name event) \
56
{ \
57
if ((curr_state < 0) || (curr_state >= state_max_##name)) \
58
return INVALID_STATE; \
59
\
60
if ((event < 0) || (event >= event_max_##name)) \
61
return INVALID_STATE; \
62
\
63
return automaton_##name.function[curr_state][event]; \
64
} \
65
\
66
/* \
67
* model_is_final_state_##name - check if the given state is a final state \
68
*/ \
69
static inline bool model_is_final_state_##name(enum states_##name state) \
70
{ \
71
if ((state < 0) || (state >= state_max_##name)) \
72
return 0; \
73
\
74
return automaton_##name.final_states[state]; \
75
}
76
77