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