automata.h 2.1 KB

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