Line data Source code
1 : /*!
2 : * \file
3 : * \brief Class module::Module.
4 : */
5 : #ifndef MODULE_HPP_
6 : #define MODULE_HPP_
7 :
8 : #include <cstddef>
9 : #include <functional>
10 : #include <memory>
11 : #include <string>
12 : #include <type_traits>
13 : #include <vector>
14 :
15 : #include "Runtime/Socket/Socket.hpp"
16 : #include "Runtime/Task/Task.hpp"
17 : #include "Tools/Interface/Interface_clone.hpp"
18 : #include "Tools/Interface/Interface_get_set_n_frames.hpp"
19 :
20 : namespace spu
21 : {
22 : namespace module
23 : {
24 : class Stateful;
25 : class Stateless;
26 : /*!
27 : * \class Module
28 : *
29 : * \brief A Module is an abstract concept. Basically, all the objects used in a Simulation are a Module.
30 : */
31 : class Module
32 : : public tools::Interface_clone
33 : , public tools::Interface_get_set_n_frames
34 : {
35 : friend Stateful;
36 : friend Stateless;
37 :
38 : protected:
39 : size_t n_frames; /*!< Number of frames to process in this Module */
40 : size_t n_frames_per_wave;
41 : size_t n_waves;
42 : size_t n_frames_per_wave_rest;
43 : bool single_wave;
44 : std::string name; /*!< Name of the Module. */
45 : std::string short_name; /*!< Short name of the Module. */
46 : std::string custom_name; /*!< Custom name of the Module. */
47 : std::vector<std::shared_ptr<runtime::Task>> tasks_with_nullptr;
48 :
49 : public:
50 : std::vector<std::shared_ptr<runtime::Task>> tasks;
51 :
52 : protected:
53 : /*!
54 : * \brief Constructor.
55 : */
56 : explicit Module();
57 :
58 : public:
59 : /*!
60 : * \brief Destructor.
61 : */
62 1509 : virtual ~Module() = default;
63 :
64 : virtual Module* clone() const;
65 :
66 : /*!
67 : * \brief Get the number of frames.
68 : *
69 : * \return the number of frames to process in this Module.
70 : */
71 : inline size_t get_n_frames() const;
72 :
73 : virtual void set_n_frames(const size_t n_frames);
74 :
75 : inline size_t get_n_frames_per_wave() const;
76 :
77 : inline size_t get_n_waves() const;
78 :
79 : inline size_t get_n_frames_per_wave_rest() const;
80 :
81 : inline bool is_single_wave() const;
82 :
83 : const std::string& get_name() const;
84 :
85 : const std::string& get_short_name() const;
86 :
87 : void set_custom_name(const std::string& custom_name);
88 :
89 : const std::string& get_custom_name() const;
90 :
91 : void remove_custom_name();
92 :
93 : inline runtime::Task& operator[](const size_t id);
94 : inline const runtime::Task& operator[](const size_t id) const;
95 : inline runtime::Socket& operator[](const std::string& tsk_sck);
96 : inline runtime::Task& operator()(const std::string& tsk_name);
97 :
98 : void set_fast(const bool fast);
99 :
100 : void create_reset_task();
101 :
102 : bool is_stateless() const;
103 : bool is_stateful() const;
104 : bool is_clonable() const;
105 :
106 : private:
107 : void deep_copy(const Module& m);
108 :
109 : void set_name(const std::string& name);
110 :
111 : void set_short_name(const std::string& short_name);
112 :
113 : runtime::Task& create_task(const std::string& name, const int id = -1);
114 : runtime::Task& create_tsk(const std::string& name, const int id = -1);
115 :
116 : template<typename T>
117 : size_t create_socket_in(runtime::Task& task, const std::string& name, const size_t n_elmts);
118 : size_t create_socket_in(runtime::Task& task,
119 : const std::string& name,
120 : const size_t n_elmts,
121 : const std::type_index& datatype);
122 : size_t create_socket_in(runtime::Task& task,
123 : const std::string& name,
124 : const size_t n_elmts,
125 : const runtime::datatype_t datatype);
126 :
127 : template<typename T>
128 : size_t create_sck_in(runtime::Task& task, const std::string& name, const size_t n_elmts);
129 : size_t create_sck_in(runtime::Task& task,
130 : const std::string& name,
131 : const size_t n_elmts,
132 : const std::type_index& datatype);
133 : size_t create_sck_in(runtime::Task& task,
134 : const std::string& name,
135 : const size_t n_elmts,
136 : const runtime::datatype_t datatype);
137 :
138 : template<typename T>
139 : size_t create_socket_out(runtime::Task& task, const std::string& name, const size_t n_elmts);
140 : size_t create_socket_out(runtime::Task& task,
141 : const std::string& name,
142 : const size_t n_elmts,
143 : const std::type_index& datatype);
144 : size_t create_socket_out(runtime::Task& task,
145 : const std::string& name,
146 : const size_t n_elmts,
147 : const runtime::datatype_t datatype);
148 :
149 : template<typename T>
150 : size_t create_sck_out(runtime::Task& task, const std::string& name, const size_t n_elmts);
151 : size_t create_sck_out(runtime::Task& task,
152 : const std::string& name,
153 : const size_t n_elmts,
154 : const std::type_index& datatype);
155 : size_t create_sck_out(runtime::Task& task,
156 : const std::string& name,
157 : const size_t n_elmts,
158 : const runtime::datatype_t datatype);
159 :
160 : template<typename T>
161 : size_t create_socket_fwd(runtime::Task& task, const std::string& name, const size_t n_elmts);
162 : size_t create_socket_fwd(runtime::Task& task,
163 : const std::string& name,
164 : const size_t n_elmts,
165 : const std::type_index& datatype);
166 : size_t create_socket_fwd(runtime::Task& task,
167 : const std::string& name,
168 : const size_t n_elmts,
169 : const runtime::datatype_t datatype);
170 :
171 : template<typename T>
172 : size_t create_sck_fwd(runtime::Task& task, const std::string& name, const size_t n_elmts);
173 : size_t create_sck_fwd(runtime::Task& task,
174 : const std::string& name,
175 : const size_t n_elmts,
176 : const std::type_index& datatype);
177 : size_t create_sck_fwd(runtime::Task& task,
178 : const std::string& name,
179 : const size_t n_elmts,
180 : const runtime::datatype_t datatype);
181 :
182 : template<typename T>
183 : size_t create_2d_socket_in(runtime::Task& task, const std::string& name, const size_t n_rows, const size_t n_cols);
184 : size_t create_2d_socket_in(runtime::Task& task,
185 : const std::string& name,
186 : const size_t n_rows,
187 : const size_t n_cols,
188 : const std::type_index& datatype);
189 : size_t create_2d_socket_in(runtime::Task& task,
190 : const std::string& name,
191 : const size_t n_rows,
192 : const size_t n_cols,
193 : const runtime::datatype_t datatype);
194 :
195 : template<typename T>
196 : size_t create_2d_sck_in(runtime::Task& task, const std::string& name, const size_t n_rows, const size_t n_cols);
197 : size_t create_2d_sck_in(runtime::Task& task,
198 : const std::string& name,
199 : const size_t n_rows,
200 : const size_t n_cols,
201 : const std::type_index& datatype);
202 : size_t create_2d_sck_in(runtime::Task& task,
203 : const std::string& name,
204 : const size_t n_rows,
205 : const size_t n_cols,
206 : const runtime::datatype_t datatype);
207 :
208 : template<typename T>
209 : size_t create_2d_socket_out(runtime::Task& task, const std::string& name, const size_t n_rows, const size_t n_cols);
210 : size_t create_2d_socket_out(runtime::Task& task,
211 : const std::string& name,
212 : const size_t n_rows,
213 : const size_t n_cols,
214 : const std::type_index& datatype);
215 : size_t create_2d_socket_out(runtime::Task& task,
216 : const std::string& name,
217 : const size_t n_rows,
218 : const size_t n_cols,
219 : const runtime::datatype_t datatype);
220 :
221 : template<typename T>
222 : size_t create_2d_sck_out(runtime::Task& task, const std::string& name, const size_t n_rows, const size_t n_cols);
223 : size_t create_2d_sck_out(runtime::Task& task,
224 : const std::string& name,
225 : const size_t n_rows,
226 : const size_t n_cols,
227 : const std::type_index& datatype);
228 : size_t create_2d_sck_out(runtime::Task& task,
229 : const std::string& name,
230 : const size_t n_rows,
231 : const size_t n_cols,
232 : const runtime::datatype_t datatype);
233 :
234 : template<typename T>
235 : size_t create_2d_socket_fwd(runtime::Task& task, const std::string& name, const size_t n_rows, const size_t n_cols);
236 : size_t create_2d_socket_fwd(runtime::Task& task,
237 : const std::string& name,
238 : const size_t n_rows,
239 : const size_t n_cols,
240 : const std::type_index& datatype);
241 : size_t create_2d_socket_fwd(runtime::Task& task,
242 : const std::string& name,
243 : const size_t n_rows,
244 : const size_t n_cols,
245 : const runtime::datatype_t datatype);
246 :
247 : template<typename T>
248 : size_t create_2d_sck_fwd(runtime::Task& task, const std::string& name, const size_t n_rows, const size_t n_cols);
249 : size_t create_2d_sck_fwd(runtime::Task& task,
250 : const std::string& name,
251 : const size_t n_rows,
252 : const size_t n_cols,
253 : const std::type_index& datatype);
254 : size_t create_2d_sck_fwd(runtime::Task& task,
255 : const std::string& name,
256 : const size_t n_rows,
257 : const size_t n_cols,
258 : const runtime::datatype_t datatype);
259 :
260 : void create_codelet(runtime::Task& task,
261 : std::function<int(Module& m, runtime::Task& t, const size_t frame_id)> codelet);
262 : void create_cdl(runtime::Task& task,
263 : std::function<int(Module& m, runtime::Task& t, const size_t frame_id)> codelet);
264 :
265 : void register_timer(runtime::Task& task, const std::string& key);
266 :
267 : virtual void set_n_frames_per_wave(const size_t n_frames_per_wave);
268 :
269 : void set_single_wave(const bool enable_single_wave);
270 :
271 : void _set_n_frames_per_wave(const size_t n_frames_per_wave);
272 : void _set_n_frames(const size_t n_frames);
273 : };
274 : }
275 : }
276 :
277 : #ifndef DOXYGEN_SHOULD_SKIP_THIS
278 : #include "Module/Module.hxx"
279 : #endif
280 :
281 : #endif /* MODULE_HPP_ */
|