blob: 1574d047c85fcb23413338a33b711b7bd8a8b586 [file] [log] [blame]
Zane Shelley0b8368c2021-03-18 17:33:41 -05001#pragma once
2
3#include <analyzer/service_data.hpp>
4
5namespace analyzer
6{
7
8/** @brief An abstract class for service event resolutions. */
9class Resolution
10{
11 public:
12 /** @brief Pure virtual destructor. */
13 virtual ~Resolution() = 0;
14
15 public:
16 /**
17 * @brief Resolves the service actions required by this resolution.
18 * @param io_sd An object containing the service data collected during
19 * hardware error analysis.
20 */
21 virtual void resolve(ServiceData& io_sd) const = 0;
22};
23
24// Pure virtual destructor must be defined.
25inline Resolution::~Resolution() {}
26
27/** @brief Resolves a hardware callout service event. */
28class HardwareCalloutResolution : public Resolution
29{
30 public:
31 /**
32 * @brief Constructor from components.
33 * @param i_path The devtree path of a guardable unit relative to a
34 * chip. An empty string refers to the chip itself.
35 * @param i_priority The callout priority.
Zane Shelley2f921302021-08-09 13:23:25 -050036 * @param i_guard True, if guard is required. False, otherwise.
Zane Shelley0b8368c2021-03-18 17:33:41 -050037 */
38 HardwareCalloutResolution(const std::string& i_path,
Zane Shelleyc85716c2021-08-17 10:54:06 -050039 callout::Priority i_priority, bool i_guard) :
Zane Shelley0b8368c2021-03-18 17:33:41 -050040 iv_path(i_path),
41 iv_priority(i_priority), iv_guard(i_guard)
42 {}
43
44 private:
45 /** The devtree path of a guardable unit relative to a chip. An empty string
46 * refers to the chip itself. */
47 const std::string iv_path;
48
49 /** The callout priority. */
Zane Shelleyc85716c2021-08-17 10:54:06 -050050 const callout::Priority iv_priority;
Zane Shelley0b8368c2021-03-18 17:33:41 -050051
Zane Shelley2f921302021-08-09 13:23:25 -050052 /** True, if guard is required. False, otherwise. */
53 const bool iv_guard;
Zane Shelley0b8368c2021-03-18 17:33:41 -050054
55 public:
56 void resolve(ServiceData& io_sd) const override;
57};
58
Zane Shelley84721d92021-09-08 13:30:27 -050059/** @brief Resolves a clock callout service event. */
60class ClockCalloutResolution : public Resolution
61{
62 public:
63 /**
64 * @brief Constructor from components.
65 * @param i_clockType The clock type.
66 * @param i_priority The callout priority.
67 * @param i_guard The guard type for this callout.
68 */
69 ClockCalloutResolution(const callout::ClockType& i_clockType,
70 const callout::Priority& i_priority, bool i_guard) :
71 iv_clockType(i_clockType),
72 iv_priority(i_priority), iv_guard(i_guard)
73 {}
74
75 private:
76 /** The clock type. */
77 const callout::ClockType iv_clockType;
78
79 /** The callout priority. */
80 const callout::Priority iv_priority;
81
82 /** True, if guard is required. False, otherwise. */
83 const bool iv_guard;
84
85 public:
86 void resolve(ServiceData& io_sd) const override;
87};
88
Zane Shelley0b8368c2021-03-18 17:33:41 -050089/** @brief Resolves a procedure callout service event. */
90class ProcedureCalloutResolution : public Resolution
91{
92 public:
93 /**
94 * @brief Constructor from components.
95 * @param i_procedure The procedure callout type.
96 * @param i_priority The callout priority.
97 */
Zane Shelleyc85716c2021-08-17 10:54:06 -050098 ProcedureCalloutResolution(const callout::Procedure& i_procedure,
99 const callout::Priority& i_priority) :
Zane Shelley0b8368c2021-03-18 17:33:41 -0500100 iv_procedure(i_procedure),
101 iv_priority(i_priority)
102 {}
103
104 private:
105 /** The procedure callout type. */
Zane Shelleyc85716c2021-08-17 10:54:06 -0500106 const callout::Procedure iv_procedure;
Zane Shelley0b8368c2021-03-18 17:33:41 -0500107
108 /** The callout priority. */
Zane Shelleyc85716c2021-08-17 10:54:06 -0500109 const callout::Priority iv_priority;
Zane Shelley0b8368c2021-03-18 17:33:41 -0500110
111 public:
Zane Shelleyc85716c2021-08-17 10:54:06 -0500112 void resolve(ServiceData& io_sd) const override;
Zane Shelley0b8368c2021-03-18 17:33:41 -0500113};
114
115/**
Zane Shelley723fa232021-08-09 12:02:06 -0500116 * @brief Contains a list of resolutions. This resolutions will be resolved the
117 * list in the order in which they were inputted into the constructor.
Zane Shelley0b8368c2021-03-18 17:33:41 -0500118 */
Zane Shelley723fa232021-08-09 12:02:06 -0500119class ResolutionList : public Resolution
Zane Shelley0b8368c2021-03-18 17:33:41 -0500120{
121 public:
Zane Shelley723fa232021-08-09 12:02:06 -0500122 /** @brief Default constructor. */
123 ResolutionList() = default;
Zane Shelley0b8368c2021-03-18 17:33:41 -0500124
125 private:
Zane Shelley723fa232021-08-09 12:02:06 -0500126 /** The resolution list. */
127 std::vector<std::shared_ptr<Resolution>> iv_list;
Zane Shelley0b8368c2021-03-18 17:33:41 -0500128
129 public:
Zane Shelley723fa232021-08-09 12:02:06 -0500130 /**
131 * @brief Adds a new resolution to the end of the list.
132 * @param i_resolution The new resolution
133 */
134 void push(const std::shared_ptr<Resolution>& i_resolution)
135 {
136 iv_list.push_back(i_resolution);
137 }
138
139 // Overloaded from parent.
Zane Shelley0b8368c2021-03-18 17:33:41 -0500140 void resolve(ServiceData& io_sd) const override
141 {
Zane Shelley723fa232021-08-09 12:02:06 -0500142 for (const auto& e : iv_list)
143 {
144 e->resolve(io_sd);
145 }
Zane Shelley0b8368c2021-03-18 17:33:41 -0500146 }
147};
148
149} // namespace analyzer