xref: /linux/include/rv/automata.h (revision 69050f8d6d075dc01af7a5f2f550a8067510366f)
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 #ifndef _RV_AUTOMATA_H
10 #define _RV_AUTOMATA_H
11 
12 #ifndef MONITOR_NAME
13 #error "MONITOR_NAME macro is not defined. Did you include $(MODEL_NAME).h generated by rvgen?"
14 #endif
15 
16 #define RV_AUTOMATON_NAME CONCATENATE(automaton_, MONITOR_NAME)
17 #define EVENT_MAX CONCATENATE(event_max_, MONITOR_NAME)
18 #define STATE_MAX CONCATENATE(state_max_, MONITOR_NAME)
19 #define events CONCATENATE(events_, MONITOR_NAME)
20 #define states CONCATENATE(states_, MONITOR_NAME)
21 
22 /*
23  * model_get_state_name - return the (string) name of the given state
24  */
25 static char *model_get_state_name(enum states state)
26 {
27 	if ((state < 0) || (state >= STATE_MAX))
28 		return "INVALID";
29 
30 	return RV_AUTOMATON_NAME.state_names[state];
31 }
32 
33 /*
34  * model_get_event_name - return the (string) name of the given event
35  */
36 static char *model_get_event_name(enum events event)
37 {
38 	if ((event < 0) || (event >= EVENT_MAX))
39 		return "INVALID";
40 
41 	return RV_AUTOMATON_NAME.event_names[event];
42 }
43 
44 /*
45  * model_get_initial_state - return the automaton's initial state
46  */
47 static inline enum states model_get_initial_state(void)
48 {
49 	return RV_AUTOMATON_NAME.initial_state;
50 }
51 
52 /*
53  * model_get_next_state - process an automaton event occurrence
54  *
55  * Given the current state (curr_state) and the event (event), returns
56  * the next state, or INVALID_STATE in case of error.
57  */
58 static inline enum states model_get_next_state(enum states curr_state,
59 					enum events event)
60 {
61 	if ((curr_state < 0) || (curr_state >= STATE_MAX))
62 		return INVALID_STATE;
63 
64 	if ((event < 0) || (event >= EVENT_MAX))
65 		return INVALID_STATE;
66 
67 	return RV_AUTOMATON_NAME.function[curr_state][event];
68 }
69 
70 /*
71  * model_is_final_state - check if the given state is a final state
72  */
73 static inline bool model_is_final_state(enum states state)
74 {
75 	if ((state < 0) || (state >= STATE_MAX))
76 		return 0;
77 
78 	return RV_AUTOMATON_NAME.final_states[state];
79 }
80 
81 #endif
82