21 #ifndef RECONFIGURATION_MANAGER_BASE_H
22 #define RECONFIGURATION_MANAGER_BASE_H
24 #define SC_INCLUDE_DYNAMIC_PROCESSES
28 #include "tlm_utils/peq_with_cb_and_phase.h"
29 #include "tlm_utils/multi_passthrough_initiator_socket.h"
30 #include "tlm_utils/multi_passthrough_target_socket.h"
31 #include "tlm_utils/simple_target_socket.h"
32 #include "tlm_utils/simple_initiator_socket.h"
57 using namespace sc_core;
58 using namespace sc_dt;
61 using namespace tlm_utils;
70 sc_time last_running_time;
71 sc_time running_time_duration;
80 last_running_time = other.last_running_time;
81 running_time_duration = other.running_time_duration;
87 last_running_time = sc_time(0, SC_NS);
88 running_time_duration = sc_time(0, SC_NS);
91 void update_running_time(
Task_state new_state) {
93 sc_time current_time = sc_time_stamp();
95 if (new_state == IDLE) {
98 else if (new_state == RUNNING && state != RUNNING) {
99 last_running_time = current_time;
101 else if (state == RUNNING) {
102 running_time_duration += (current_time - last_running_time);
103 last_running_time = current_time;
109 sc_time get_running_time_duration() {
110 if (state == RUNNING)
111 return running_time_duration + (sc_time_stamp() - last_running_time);
113 return running_time_duration;
125 static sc_time SCHEDULER_EXECUTION_TIME;
126 static double SCHEDULER_ENERGY_CONSUMPTION;
127 static double ENERGY_CONSUMPTION_LIMIT;
128 static bool GENERATE_ZERO_FILLED_LINE_IN_CSV;
129 static double SCHEDULER_PERFORMANCE_EFFORT;
130 static double SCHEDULER_POWER_EFFORT;
131 static double SCHEDULER_AREA_EFFORT;
132 static int NB_HW_RECONFIGURATION_UNITS;
133 static int NB_SW_RECONFIGURATION_UNITS;
134 static bool ALL_DEPENDENCIES_REQUIRED_BEFORE_REQUEST;
135 static sc_time TRACE_WINDOW_FUNCTION_LENGTH;
136 static sc_time MAXIMUM_SIMULATION_TIME;
146 static int RZ_TASK_BLANK;
147 static bool CONSIDER_WAITING_STATE_AS_RUNNING_MODE;
148 static bool SEND_CONFIGURATION_NOTIFICATION_AFTER_IDLE_STATE;
153 multi_passthrough_target_socket<Reconfiguration_manager_base> module_target_socket;
156 multi_passthrough_target_socket<Reconfiguration_manager_base> testbench_target_socket;
159 multi_passthrough_initiator_socket<Reconfiguration_manager_base> module_initiator_socket;
162 multi_passthrough_initiator_socket<Reconfiguration_manager_base> testbench_initiator_socket;
170 sc_event scheduler_thread_event;
174 #ifdef GENERATE_TASK_STATE_FILE
175 ofstream file_task_state;
177 #ifdef GENERATE_RZ_STATE_FILE
178 ofstream file_rz_state;
186 map<int, vector<RZ *> > map_compatible_rz;
187 map<RZ *, int> map_current_module;
188 vector<Task_state> task_state_table;
191 vector<Manager_interface *> modules_table;
192 vector<RZ *> rz_table;
195 static vector<Application> applicationVector;
198 vector<int> preempted_tasks_list;
201 vector<Running_time_information> running_time_table;
205 list<ConfigurationRequest> reconfiguration_waiting_list;
206 sc_event* hw_reconfiguration_event_table;
210 list<ConfigurationRequest> software_reconfiguration_waiting_list;
211 sc_event* sw_reconfiguration_event_table;
215 int nb_calls_scheduler;
216 sc_time scheduler_busy_time;
217 vector<vector<int> > finished_precedence_vectors;
220 vector<sc_event* > monitoring_end_of_scheduling_event_list;
221 vector<sc_event* > monitoring_start_of_scheduling_event_list;
222 vector<sc_event* > monitoring_update_rz_state_event_list;
223 vector<sc_event* > monitoring_update_task_state_event_list;
230 vector<Task> task_table;
231 double total_energy_consumption;
233 map<string, RZ_config*> rz_parameter_table;
236 sc_time *deadlines_table;
238 sc_buffer<ConfigurationRequest> *rz_configuration_request_buffer;
239 sc_event *rz_configured_event;
247 module_initiator_socket(
"Manager2Module_initiator_socket"),
248 testbench_initiator_socket(
"Manager2Testbench_initiator_socket"),
249 module_target_socket(
"Manager2Module_target_socket"),
250 testbench_target_socket(
"Manager2Testbench_target_socket"),
254 #ifdef GENERATE_TASK_STATE_FILE
255 file_task_state(
"log/task.csv"),
257 #ifdef GENERATE_RZ_STATE_FILE
258 file_rz_state(
"log/rz.csv"),
260 scheduler_busy_time(SC_ZERO_TIME),
263 rz_parameter_table(table),
264 waiting_queue_handler_ptr(handler) {
266 #ifdef GENERATE_RZ_STATE_FILE
267 for(
int i = 0; i < (int) rz_table.size(); i++) file_rz_state <<
"; " << rz_table[i]->getName();
268 file_rz_state << endl;
271 nb_calls_scheduler = 0;
272 total_energy_consumption = 0;
274 simulationOK =
false;
282 for(
int i = 0; i < (int) rz_table.size(); i++) {
288 if (Scheduler_exist_rz_properties(
"RZDefaultGroupName") ==
true) {
289 RZ_config rz_config = Scheduler_get_rz_properties(
"RZDefaultGroupName");
291 string hwRZdomainName =
"";
292 if (rz_config.getConfigDomain() != NULL) {
293 hwRZdefaultPt = rz_config.getConfigDomain()->getNominalFctPoint();
294 hwRZdomainName = rz_config.getConfigDomain()->getGroupName();
297 for(
int i = 0; i < (int) rz_table.size(); i++) {
298 RZ *rz = rz_table.at(i);
299 if (rz->get_implementation_type() == HARD) {
300 rz->setConfigFctPoint(&hwRZdefaultPt);
301 rz->setGroupDomainName(hwRZdomainName);
304 rz_config = Scheduler_get_rz_properties(rz);
305 if (rz_config.getConfigDomain() != NULL) {
306 Config_fct_point swRZdefaultPt = rz_config.getConfigDomain()->getNominalFctPoint();
307 rz->setConfigFctPoint(&swRZdefaultPt);
308 rz->setGroupDomainName(rz_config.getConfigDomain()->getGroupName());
317 hw_reconfiguration_event_table =
new sc_event[NB_HW_RECONFIGURATION_UNITS];
318 sw_reconfiguration_event_table =
new sc_event[NB_SW_RECONFIGURATION_UNITS];
320 SC_THREAD(scheduler_thread);
321 SC_THREAD(occupation_rate_update_thread);
324 module_target_socket.register_b_transport(
this, &Reconfiguration_manager_base::b_transport_module);
325 testbench_target_socket.register_b_transport(
this, &Reconfiguration_manager_base::b_transport_testbench);
328 for(
int i = 0; i < NB_HW_RECONFIGURATION_UNITS; i++) {
329 string process_name(
"HW_reconfiguration_unit_");
332 process_name.append(out.str());
338 for(
int i = 0; i < NB_SW_RECONFIGURATION_UNITS; i++) {
339 string process_name(
"SW_reconfiguration_unit_");
342 process_name.append(out.str());
347 rz_configuration_request_buffer =
new sc_buffer<ConfigurationRequest>[(int) rz_table.size()];
348 rz_configured_event =
new sc_event[(int) rz_table.size()];
349 for(
int i = 0; i < (int) rz_table.size(); i++) {
350 string process_name(
"RZ_configuration_request_handler_");
351 process_name.append(Utils::itoa(i));
352 sc_spawn(sc_bind(&Reconfiguration_manager_base::rz_configuration_request_thread,
this, i), process_name.c_str());
358 delete deadlines_table;
359 delete[] previous_implementation_on_RZ;
360 delete[] current_implementation_on_RZ;
361 delete[] hw_reconfiguration_units;
362 delete[] sw_reconfiguration_units;
363 delete[] hw_reconfiguration_event_table;
364 delete[] sw_reconfiguration_event_table;
367 for (
int i=0; i<(int)monitoring_end_of_scheduling_event_list.size(); i++) {
368 delete monitoring_end_of_scheduling_event_list.at(i);
369 delete monitoring_start_of_scheduling_event_list.at(i);
370 delete monitoring_update_rz_state_event_list.at(i);
371 delete monitoring_update_task_state_event_list.at(i);
374 for(
int i = 0; i < (int) rz_table.size(); i++)
delete rz_table.at(i);
378 int addApplication(
string appName,
string appPrefix, vector<Manager_interface *> table,
double qos,
int appInstanceID = -1);
379 void applicationDefined(
void);
382 virtual void b_transport_module(
int id, tlm_generic_payload& trans, sc_time& delay) = 0;
383 virtual void b_transport_testbench(
int id, tlm_generic_payload& trans, sc_time& delay) = 0;
386 void set_scheduler_execution_time(sc_time t);
387 void set_generate_zeros_in_csv(
bool gen);
388 void display_occupation_rates(
void);
389 void generateSimulationResultFile(
void);
390 void update_occupation_rate_end_simulation(
void);
391 void enable_debug_signals_trace(
void);
392 void activate_trace(
void);
393 void generateCSVResultFile(
string filename);
395 static vector<Application> * getApplicationVectorPtr(
void);
398 bool isSimulationOK(
void);
399 static void endApplication(
string appname,
bool ok);
400 static void verifySimulationTimes(
void);
401 static sc_time getMaximumSimulationTime(
void);
404 vector<RZ *> Scheduler_get_compatible_rz_vector(
int task_id);
405 sc_time Scheduler_get_task_running_time(
int task_id);
406 vector<RZ *> Scheduler_get_all_rz_vector(
void);
407 int Scheduler_get_current_module_ID(
RZ* rz);
408 bool Scheduler_is_RZ_blank(
RZ *rz);
410 int Scheduler_get_application_number(
void);
412 bool Scheduler_exist_rz_properties(
string inst_name);
413 bool Scheduler_exist_rz_properties(
RZ *rz);
414 RZ_config& Scheduler_get_rz_properties(
string inst_name);
417 void Scheduler_emulate_scheduler_behavior(
void);
418 void Scheduler_set_scheduler_active(
int taskid);
419 bool Scheduler_has_task_already_requested_mapping(
int task_to_map,
int request_owner);
420 void Scheduler_add_finished_precedence(
int task_mapped,
int precedence);
421 void Scheduler_notify_request_owner_module_ready(
int owner,
int ready);
422 void Scheduler_send_update_parameters_to_module(
RZ* rz);
423 void Scheduler_print_finished_precedence_vector(
int task_id);
424 void Scheduler_configure_task(
RZ* rz,
int id,
int implID,
int requestOwner);
426 void Scheduler_set_current_task(
RZ *rz,
int task_id);
427 Task_state Scheduler_get_task_state(
int task_id);
428 bool Scheduler_set_blank(
RZ *rz);
429 bool Scheduler_set_blank(
int hosting_rz_id);
431 bool Scheduler_is_task_preempted(
int taskid)
const;
432 double Scheduler_get_performance_effort(
void)
const;
433 double Scheduler_get_power_effort(
void)
const;
434 double Scheduler_get_area_effort(
void)
const;
435 const char* Scheduler_get_name(
void)
const;
436 ostream& Scheduler_get_output_stream(
void);
437 void Scheduler_display_task_state_table(
void)
const;
438 void Scheduler_display_rz_current_module_table(
void)
const;
441 static FPGA* getFPGAptr(
void);
445 void setMonitoringEvent(
int threadNumber);
446 void notifyStartOfSchedulingEventMonitoringEvent();
447 void notifyEndOfSchedulingEventMonitoringEvent();
448 void notifyUpdateRZStateEvent();
449 void notifyUpdateTaskStateEvent();
450 RZ_config* getRZProperties(
string inst_name);
453 sc_event& endOfSchedulingEvent(
int id);
454 sc_event& startOfSchedulingEvent(
int id);
455 sc_event& updateRZStateEvent(
int id);
456 sc_event& updateTaskStateEvent(
int id);
459 vector<Application>& getApplications();
462 sc_trace_file* getTraceFile()
const;
468 void scheduler_thread(
void);
469 void send_next_module_ready(
int module_id,
int module_ready_id);
470 void send_current_module_ready(
int module_id);
471 void send_module_ready_to_testbench(
int tbid,
int module_ready_id);
472 void notify_request_owner_module_ready(
int owner_id,
int ready_module_id);
476 void init_maps(
void);
477 void transcoder_initialisation_method(
int id, sc_dt::uint64 data);
480 void configure_task(
int id,
int implID,
RZ* rz);
481 void reconfiguration_engine_thread(
void);
482 void hardware_reconfiguration_engine_thread(
int unitID);
483 void software_reconfiguration_engine_thread(
int unitID);
486 void check_deadline(
int task_id);
487 void notify_simulation_controller(
void);
490 bool is_task_preempted(
int id)
const;
491 bool is_task_preempted(
string taskname)
const;
492 void add_task_to_preemption_list(
int id);
493 void remove_task_from_preemption_list(
int id);
496 void set_target_phase(tlm_phase phase);
497 void set_icap_reconf_task(
int hw_unit,
int id);
498 void set_icap_idle(
int hw_unit);
499 void set_software_loader_config_task(
int sw_unit,
int id);
500 void set_software_loader_idle(
int sw_unit);
501 void set_task_state(
int id,
int rz_id,
Task_state state);
502 void set_rz_state(
int rz_id, RZState state);
503 int get_hosting_rz_id(
int taskid);
504 void update_occupation_rate(
int rz_id, RZState newState);
505 void set_initiator_phase(
int id, tlm_phase phase);
506 void set_scheduler_idle(
void);
507 void set_scheduler_active(
int taskID);
508 void occupation_rate_update_thread(
void);
509 void update_resources_trace(
int rz_id,
int task_id);
510 void update_processor_occupation_rate(
void);
511 void set_hyperperiod_status(
int hpid);
514 void display_map_compatible_RZ(
void);
515 void display_map_current_module(
void);
516 void display_task_state_table(
void)
const;
517 void display_rz_current_module_table(
void)
const;
518 bool task_runs_on_implementation_type(
int taskID, PEImplementation impl);
519 int getApplicationIncludingTask(
int taskID);
520 void deadline_check_thread(
int appID);
523 void set_task_context_save(
int task_id,
int rz_id);
524 void set_task_context_restore(
int task_id,
int rz_id);
526 int get_module_ID(
string moduleName);
528 void update_deadline(
int modID);
530 void rz_configuration_request_thread(
int rzid);
Definition: qos_management.h:32
Definition: qos_interface.h:40
void software_reconfiguration_engine_thread(int unitID)
Definition: reconfiguration_manager_base.cpp:748
Definition: task_to_schedule_interface.h:28
Definition: reconfiguration_unit.h:32
Definition: monitoring_interface.h:63
Definition: memory_manager.h:29
Definition: config_fct_point.h:31
Definition: reconfiguration_manager_base.h:119
Definition: reconfigurable_zone.h:62
Definition: rz_config.h:36
Definition: scheduler_request.h:27
static int nbApplicationTerminated
Definition: reconfiguration_manager_base.h:141
Definition: application_interface.h:29
Definition: scheduler_request.h:47
void hardware_reconfiguration_engine_thread(int unitID)
Definition: reconfiguration_manager_base.cpp:681
Task_state
Definition: task_implementation.h:40
Definition: task_implementation.h:46
Definition: scheduler_interface.h:138