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