1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2019-2022 Red Hat, Inc. Daniel Bristot de Oliveira  <bristot@kernel.org>
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