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