From 4517995d04384355e2d6793809aba6b2a3deb7d1 Mon Sep 17 00:00:00 2001 From: juanmanuel Date: Thu, 31 Oct 2024 06:49:36 -0500 Subject: [PATCH] feat: bug solved, working project, comments added --- config/conc_stream_pack_test/config.xml | 55 + config/conc_stream_pack_test/data.xml | 385 ++++ config/conc_stream_pack_test/map.xml | 59 + config/conc_stream_pack_test/net.xml | 1612 +++++++++++++++++ config/simple_2_layer_test/data.xml | 81 +- config/simple_2_layer_test/map.xml | 20 +- scripts/generate_config_task.py | 135 ++ src/networkInterface/NetworkInterfaceTlm.cpp | 96 +- src/networkInterface/NetworkInterfaceTlm.h | 18 +- src/noc/noc.cpp | 14 +- src/processingElement/ProcessingElementCS.cpp | 27 +- src/processingElement/ProcessingElementCS.h | 41 + .../processingElement/ProcessingElementVC.cpp | 1 - src/router/router.cpp | 5 +- src/router/router.h | 1 + src/router/router_cs.cpp | 6 + src/traffic/PacketCS.cpp | 21 + src/traffic/PacketCS.h | 21 + src/traffic/task/TaskPoolCS.cpp | 21 + src/traffic/task/TaskPoolCS.h | 21 + src/utils/GlobalResourcesCS.cpp | 2 +- src/utils/GlobalResourcesCS.h | 2 +- src/utils/NetworkParticipantCS.h | 21 + src/utils/PacketFactoryCS.cpp | 21 + src/utils/PacketFactoryCS.h | 21 + src/utils/noc_logger.cpp | 21 + src/utils/structures_cs.h | 21 + src/utils/utils.cpp | 21 + 28 files changed, 2713 insertions(+), 57 deletions(-) create mode 100755 config/conc_stream_pack_test/config.xml create mode 100644 config/conc_stream_pack_test/data.xml create mode 100644 config/conc_stream_pack_test/map.xml create mode 100644 config/conc_stream_pack_test/net.xml create mode 100644 scripts/generate_config_task.py diff --git a/config/conc_stream_pack_test/config.xml b/config/conc_stream_pack_test/config.xml new file mode 100755 index 0000000..428b4e0 --- /dev/null +++ b/config/conc_stream_pack_test/config.xml @@ -0,0 +1,55 @@ + + + + + report + + + config/conc_stream_pack_test/net.xml + + + + + + task + config/conc_stream_pack_test/data.xml + config/conc_stream_pack_test/map.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 6 9 10 + + diff --git a/config/conc_stream_pack_test/data.xml b/config/conc_stream_pack_test/data.xml new file mode 100644 index 0000000..d1af841 --- /dev/null +++ b/config/conc_stream_pack_test/data.xml @@ -0,0 +1,385 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/conc_stream_pack_test/map.xml b/config/conc_stream_pack_test/map.xml new file mode 100644 index 0000000..dbec488 --- /dev/null +++ b/config/conc_stream_pack_test/map.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/conc_stream_pack_test/net.xml b/config/conc_stream_pack_test/net.xml new file mode 100644 index 0000000..7c7104a --- /dev/null +++ b/config/conc_stream_pack_test/net.xml @@ -0,0 +1,1612 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/simple_2_layer_test/data.xml b/config/simple_2_layer_test/data.xml index 0fc5fbc..0baaf57 100644 --- a/config/simple_2_layer_test/data.xml +++ b/config/simple_2_layer_test/data.xml @@ -34,7 +34,7 @@ - + @@ -42,7 +42,7 @@ - + @@ -60,6 +60,20 @@ + + + + + + + + + + + + + + @@ -82,7 +96,7 @@ - + @@ -96,7 +110,7 @@ - + @@ -108,14 +122,7 @@ - - - - - - - - + @@ -129,13 +136,59 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + diff --git a/config/simple_2_layer_test/map.xml b/config/simple_2_layer_test/map.xml index 7c2fd0a..796faae 100644 --- a/config/simple_2_layer_test/map.xml +++ b/config/simple_2_layer_test/map.xml @@ -6,18 +6,22 @@ - - - - - - - - + + + + + + + + + + + + diff --git a/scripts/generate_config_task.py b/scripts/generate_config_task.py new file mode 100644 index 0000000..96a9a4a --- /dev/null +++ b/scripts/generate_config_task.py @@ -0,0 +1,135 @@ +MAX_ROUT_Y = 4 + +sourc_x = 0 +sourc_y = 1 + +dest_x = 3 +dest_y = 3 + +GEN_TASK_START = """ + + + + + + + + """ +GEN_TASK_END = """ + + + """ + +REQ_TASK_START = """ + + + """ + +REQ_TASK_END = " " + +LAST_TASK = """ + + + + + + + + + + + """ + +REQ_TASK_REQ = """ + + + + + + """ + +REQ_TASK_GEN = """ + + + + + + + + + + + + + """ + +DEST_HEADER = " " +DEST_H_END = " " + +DELAY_TAG = " " +INTERVAL_TAG = " " +COUNT_TAG = " " +TYPE_TAG = " " +TASK_TAG = " " +CONFIG_TAG = " " + + +BIND = """ + + + """ + + +id = 0 +print("**********************FOR data.xml**********************") +print(GEN_TASK_START) +for x in range(sourc_x, dest_x): + print(DEST_HEADER.format(id)) + print(DELAY_TAG) + print(INTERVAL_TAG) + print(COUNT_TAG) + print(TYPE_TAG) + print(TASK_TAG.format(id+1)) + link = 0 if id==0 else 2 + print(CONFIG_TAG.format(link, 1)) + print(DEST_H_END) + id+=1 + +for y in range(sourc_y, dest_y+1): + print(DEST_HEADER.format(id)) + print(DELAY_TAG) + print(INTERVAL_TAG) + print(COUNT_TAG) + print(TYPE_TAG) + print(TASK_TAG.format(id+1)) + link = 2 if y == sourc_y else 4 + dest = 0 if y == dest_y else 3 + print(CONFIG_TAG.format(link, dest)) + print(DEST_H_END) + id+=1 +print(GEN_TASK_END) + + +for i in range(1, id): + print() + print(REQ_TASK_START.format(i)) + print(REQ_TASK_REQ) + print(REQ_TASK_GEN.format(id)) + print(REQ_TASK_END) + +print() +print(LAST_TASK.format(id, id-1, id-1)) + +print() +print("**********************FOR map.xml**********************") +x = sourc_x +y = sourc_y +for i in range (0, id+1): + print(BIND.format(i, x*MAX_ROUT_Y+y)) + if(y == dest_y): + x = sourc_x + y = sourc_y + elif(x == dest_x): + y += 1 + else: + x +=1 \ No newline at end of file diff --git a/src/networkInterface/NetworkInterfaceTlm.cpp b/src/networkInterface/NetworkInterfaceTlm.cpp index 8958660..5eaebb7 100755 --- a/src/networkInterface/NetworkInterfaceTlm.cpp +++ b/src/networkInterface/NetworkInterfaceTlm.cpp @@ -34,7 +34,7 @@ NetworkInterfaceTlm::NetworkInterfaceTlm(sc_module_name nm, Node& node, init_peq(this, &NetworkInterfaceTlm::init_peq_cb), target_peq(this, &NetworkInterfaceTlm::target_peq_cb), curr_req(0), resp_in_progress(false), - nxt_resp_pend(0), end_req_pend(0) { + nxt_resp_pend(0) { sc_report_handler::set_actions(NI_LOG, SC_INFO, SC_LOG|SC_DISPLAY); try { this->id = node.id%(globalResources.nodes.size()/2); @@ -57,12 +57,12 @@ NetworkInterfaceTlm::NetworkInterfaceTlm(sc_module_name nm, Node& node, initiator[lay] = new ni_init_socket((string(nm)+"_"+ to_string(lay)+"_init").c_str()); initiator[lay]->register_nb_transport_bw(this, - &NetworkInterfaceTlm::nb_transport_bw_cb, 0); + &NetworkInterfaceTlm::nb_transport_bw_cb, lay); target[lay] = new ni_targ_socket((string(nm)+"_"+ to_string(lay)+"targ").c_str()); target[lay]->register_nb_transport_fw(this, - &NetworkInterfaceTlm::nb_transport_fw_cb, 0); + &NetworkInterfaceTlm::nb_transport_fw_cb, lay); } } @@ -156,6 +156,7 @@ tlm_gp* NetworkInterfaceTlm::build_transaction(PacketCS* p, Flit* f){ trans->set_byte_enable_ptr(0); trans->set_dmi_allowed(false); trans->set_response_status(tlm::TLM_INCOMPLETE_RESPONSE); + curr_req = trans; return trans; } @@ -163,8 +164,6 @@ tlm_gp* NetworkInterfaceTlm::build_transaction(PacketCS* p, Flit* f){ void NetworkInterfaceTlm::send_flit(PacketCS* p, Flit* f){ tlm_gp* trans = build_transaction(p, f); - credit_counter--; - log_info("Credit counter updated: "+to_string(credit_counter)); sc_time delay = sc_time(REQ_INIT_DELAY, UNITS_DELAY); tlm::tlm_phase send_phase = tlm::BEGIN_REQ; @@ -173,6 +172,7 @@ void NetworkInterfaceTlm::send_flit(PacketCS* p, Flit* f){ log_info("Sending flit of type "+STR_TYPES[p->dataType]+ " to layer "+to_string(lay)); (*initiator[lay])->nb_transport_fw(*trans, send_phase, delay); + update_credits(*trans, -1); } @@ -183,10 +183,16 @@ int NetworkInterfaceTlm::get_type_from_extension(tlm_gp& trans){ } +int NetworkInterfaceTlm::get_packet_id_from_extension(tlm_gp& trans){ + link_extension* extension; + trans.get_extension(extension); + return extension->packet_id; +} + bool NetworkInterfaceTlm::check_cs_needed(tlm_gp& trans){ int type = get_type_from_extension(trans); return type == TYPE_ROUT_CONFIG; -}; +} void NetworkInterfaceTlm::send_cs_rout_conf_msg(tlm_gp& trans){ tlm_gp* new_trans = m_mm.allocate(); @@ -246,15 +252,25 @@ void NetworkInterfaceTlm::send_data_to_noc(){ void NetworkInterfaceTlm::thread() { + bool log_wait = true; while(true){ //log_info("send_data_process()"); if (clk.posedge()) { if (!packet_send_queue.empty()) { - if (credit_counter != 0){ + if (credit_counter != 0 && curr_req == 0){ send_data_to_noc(); + log_wait = true; } else { - log_info("Waiting for Router!"); + if(log_wait){ + if(credit_counter == 0){ + log_info("No more credits. Waiting for Router!"); + } + else{ + log_info("Transaction in progress. Waiting for Router!"); + } + log_wait = false; + } } } if (!packet_recv_queue.empty()) { @@ -281,15 +297,31 @@ void NetworkInterfaceTlm::thread() { tlm::tlm_sync_enum NetworkInterfaceTlm::nb_transport_bw_cb(int id, tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_time& delay) { + int p_id = get_packet_id_from_extension(trans); + log_info("Backward transport callback start from layer " + + to_string(id) + ". Packet id: " + to_string(p_id)); + log_info("Sanity check: Phase " + string(phase.get_name()) + ", " + + "Delay: " + delay.to_string()); init_peq.notify(trans, phase, delay); return tlm::TLM_ACCEPTED; } void NetworkInterfaceTlm::init_peq_cb(tlm_gp& trans, const tlm::tlm_phase& phase){ + int p_id = get_packet_id_from_extension(trans); + log_info("Init PEQ callback start for packet "+to_string(p_id)); + log_info("Phase "+string(phase.get_name())+" received"); if (phase == tlm::END_REQ) { - credit_counter++; - log_info("Credit counter updated: "+to_string(credit_counter)); + update_credits(trans, 1); + curr_req = 0; + if(p_id == -1){ + // Config msg transaction ended, so packet can be scheduled for deletion + trans.set_response_status(tlm::TLM_OK_RESPONSE); + unsigned char* data_ptr = trans.get_data_ptr(); + Flit* received_flit = reinterpret_cast(data_ptr); + PacketCS* p = dynamic_cast(received_flit->packet); + packet_recv_queue.push(p); + } } else if (phase == tlm::BEGIN_REQ || phase == tlm::END_RESP) log_fatal("Illegal transaction phase received by initiator"); @@ -327,6 +359,11 @@ void NetworkInterfaceTlm::check_transaction(tlm_gp& trans) { tlm::tlm_sync_enum NetworkInterfaceTlm::nb_transport_fw_cb(int id, tlm_gp& trans, tlm::tlm_phase& phase, sc_time& delay){ + int p_id = get_packet_id_from_extension(trans); + log_info("Forward transport callback start from layer " + + to_string(id) + ". Packet id: " + to_string(p_id)); + log_info("Sanity check: Phase " + string(phase.get_name()) + ", " + + "Delay: " + delay.to_string()); unsigned int len = trans.get_data_length(); unsigned char* byt = trans.get_byte_enable_ptr(); unsigned int wid = trans.get_streaming_width(); @@ -370,23 +407,27 @@ void NetworkInterfaceTlm::receive_and_process_flit(tlm_gp& trans){ } //globalReport.issueNoCOutputDataAmount(sc_time_stamp(),globalResources.bitWidth); if (p->toTransmit.empty() && p->inTransmit.empty()){ - packet_recv_queue.push(p); // send config message when all flits of packet arrive if(check_cs_needed(trans)){ - log_info("Send router configuration message"); + log_info("Send router configuration message. Packet id: " + + to_string(p->id)); send_cs_rout_conf_msg(trans); } + else{ + packet_recv_queue.push(p); + } } - credit_counter++; - log_info("Credit counter updated: "+to_string(credit_counter)); + //credit_counter++; no need to update credit in target (unless receiving response) + //log_info("Credit counter updated: "+to_string(credit_counter)); // send response if not type stream if(p->dataType != TYPE_STREAM){ if(resp_in_progress) { if(nxt_resp_pend){ log_fatal("Attempt to have two pending responses in target"); - nxt_resp_pend = &trans; } + log_info("Previous response transaction still in progress, scheduling it for next time"); + nxt_resp_pend = &trans; } else{ send_response(trans); } } @@ -394,6 +435,9 @@ void NetworkInterfaceTlm::receive_and_process_flit(tlm_gp& trans){ void NetworkInterfaceTlm::target_peq_cb(tlm_gp& trans, const tlm::tlm_phase& phase){ + int p_id = get_packet_id_from_extension(trans); + log_info("Target PEQ callback start for packet "+to_string(p_id)); + log_info("Phase "+string(phase.get_name())+" received"); switch (phase) { case tlm::BEGIN_REQ: trans.acquire(); @@ -406,8 +450,7 @@ void NetworkInterfaceTlm::target_peq_cb(tlm_gp& trans, const tlm::tlm_phase& pha "Illegal transaction phase END_RESP received by target"); } trans.release(); - credit_counter++; - log_info("Credit counter updated: "+to_string(credit_counter)); + update_credits(trans, 1); // Target itself is now clear to issue the next BEGIN_RESP resp_in_progress = false; if (nxt_resp_pend){ @@ -438,6 +481,7 @@ tlm::tlm_sync_enum NetworkInterfaceTlm::send_end_req(tlm_gp& trans){ bw_phase, delay); if (status == tlm::TLM_COMPLETED) { trans.release(); + curr_req = 0; return status; } @@ -453,14 +497,15 @@ tlm::tlm_sync_enum NetworkInterfaceTlm::send_end_req(tlm_gp& trans){ void NetworkInterfaceTlm::send_response(tlm_gp& trans){ + int p_id = get_packet_id_from_extension(trans); + log_info("Send response for packet "+to_string(p_id)); resp_in_progress = true; sc_time delay = SC_ZERO_TIME; tlm::tlm_phase bw_phase = tlm::BEGIN_RESP; tlm::tlm_sync_enum status = (*target[0])->nb_transport_bw( trans, bw_phase, delay); - credit_counter--; - log_info("Credit counter updated: "+to_string(credit_counter)); + update_credits(trans, -1); if (status == tlm::TLM_UPDATED){ target_peq.notify(trans, bw_phase, delay); @@ -469,11 +514,20 @@ void NetworkInterfaceTlm::send_response(tlm_gp& trans){ // The initiator has terminated the transaction trans.release(); resp_in_progress = false; - credit_counter++; - log_info("Credit counter updated: "+to_string(credit_counter)); + update_credits(trans, 1); + curr_req = 0; } } +void NetworkInterfaceTlm::update_credits(tlm_gp&trans, int added_creds){ + int type = get_type_from_extension(trans); + int p_id = get_packet_id_from_extension(trans); + + if(type == TYPE_PACKET || (type==TYPE_ROUT_CONFIG && p_id != -1)){ + credit_counter += added_creds; + log_info("Credit counter updated: "+to_string(credit_counter)); + } +} void NetworkInterfaceTlm::log_info(string msg){ string log_msg = ni_name + ": (Node" + diff --git a/src/networkInterface/NetworkInterfaceTlm.h b/src/networkInterface/NetworkInterfaceTlm.h index d2b2099..acd156b 100755 --- a/src/networkInterface/NetworkInterfaceTlm.h +++ b/src/networkInterface/NetworkInterfaceTlm.h @@ -64,14 +64,10 @@ public: tlm_utils::peq_with_cb_and_phase init_peq; tlm_utils::peq_with_cb_and_phase target_peq; tlm_gp* curr_req; - tlm_gp* end_req_pend; tlm_gp* nxt_resp_pend; - tlm_gp* nxt_send_data_pend; bool resp_in_progress; - bool send_data_in_progress; int credit_counter; - Dir send_data_in_prog_dest; MemoryManager m_mm; uint8_t max_pos[3]; bool valid_socket[NUM_ACC_LAYERS] = {false}; @@ -135,6 +131,13 @@ public: */ int get_type_from_extension(tlm_gp& trans); + /** + * Get packet id from extension + * + * @param trans TLM generic payload object + */ + int get_packet_id_from_extension(tlm_gp& trans); + /** * If message is init streaming, a router_cs needs to be * configured @@ -254,6 +257,13 @@ public: */ void send_response(tlm_gp& trans); + /** + * Updates num of credits + * + * @param trans TLM generic payload object + * @param added_creds Amount of credits to add (or substract) + */ + void update_credits(tlm_gp&trans, int added_creds); /** Log info * @param msg log message diff --git a/src/noc/noc.cpp b/src/noc/noc.cpp index 791e70b..45d2453 100755 --- a/src/noc/noc.cpp +++ b/src/noc/noc.cpp @@ -73,10 +73,16 @@ void TlmNoc::initNoc() { string msg = " initialized in position " + to_string(rout_pos[0]) + "," + to_string(rout_pos[1])+ "," + to_string(rout_pos[2]); - string rout_name = n.type->model == "Router" ? - "router_" : "router_cs_"; - rout_name += to_string(n.id); - TlmRouter* r = new TlmRouter(rout_name.c_str(), rout_pos, max_pos); + TlmRouter* r; + string rout_name; + if(n.type->model=="Router"){ + rout_name = "router_"+to_string(n.id); + r = new TlmRouter(rout_name.c_str(), rout_pos, max_pos); + } + else{ + rout_name = "router_cs_"+to_string(n.id); + r = new TlmRouterCS(rout_name.c_str(), rout_pos, max_pos); + } routers.push_back(r); mapNodeRouter.insert( pair(n.id, int(routers.size())-1)); diff --git a/src/processingElement/ProcessingElementCS.cpp b/src/processingElement/ProcessingElementCS.cpp index 4502d5b..e6a00ee 100644 --- a/src/processingElement/ProcessingElementCS.cpp +++ b/src/processingElement/ProcessingElementCS.cpp @@ -1,3 +1,24 @@ +/******************************************************************************* + * Copyright (C) 2024 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + ******************************************************************************/ #include "ProcessingElementCS.h" #include "traffic/PacketCS.h" @@ -238,7 +259,11 @@ void ProcessingElementCS::checkNeed() // EXPLAIN: iterate over tasks needing the data for (const TaskCS& t : neededFor.at(type)) { std::pair pair = std::make_pair(t, type); - neededAmount.at(pair) -= receivedData.at(type); + /* EXPLAIN: commented because received data should always + count to one, the purpose of this line is unclear, but it caused + an error where the requirement in a task wouldn't be read */ + //neededAmount.at(pair) -= receivedData.at(type); + neededAmount.at(pair)--; /* This line was commented out because if a task requires several packets from several data types, it says that the task is finished receiving the required packets while in fact, it still needs some packets. receivedData.at(type) = 0; diff --git a/src/processingElement/ProcessingElementCS.h b/src/processingElement/ProcessingElementCS.h index eb3e08f..2fea5aa 100644 --- a/src/processingElement/ProcessingElementCS.h +++ b/src/processingElement/ProcessingElementCS.h @@ -1,3 +1,24 @@ +/******************************************************************************* + * Copyright (C) 2024 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + ******************************************************************************/ #pragma once #include "ratatoskrUtils/processingElement/ProcessingElementVC.h" @@ -6,6 +27,7 @@ class ProcessingElementCS : public ProcessingElementVC { public: + // Almost same functionality as ProcessingElementVC but uses TaskCS std::map> neededFor; std::map, int> neededAmount; std::map> needs; @@ -25,13 +47,32 @@ public: ProcessingElementCS(sc_module_name mn, Node& node, TrafficPool* tp): ProcessingElementVC(mn, node, tp) {}; + /** + * On every clock cycle, checks if task needs to begin and starts it + */ void thread() override; + /** + * Updates requirements and sends messages at the right time + * + * @param taskcs Circuit switching task to execute + */ void execute(TaskCS&); + /** + * Receives packet and processes it + */ void receive() override; + /** + * Sends message with a random delay + * + * @param taskcs Circuit switching task from which to send a message + */ void startSending(TaskCS&); + /** + * Checks if requirements are fullfilled + */ void checkNeed(); }; diff --git a/src/ratatoskrUtils/processingElement/ProcessingElementVC.cpp b/src/ratatoskrUtils/processingElement/ProcessingElementVC.cpp index dcd56d7..8beb49d 100755 --- a/src/ratatoskrUtils/processingElement/ProcessingElementVC.cpp +++ b/src/ratatoskrUtils/processingElement/ProcessingElementVC.cpp @@ -226,7 +226,6 @@ void ProcessingElementVC::thread() void ProcessingElementVC::execute(Task& task) { - cout<<"hmm"<release(); } } @@ -339,6 +339,7 @@ void TlmRouter::switching(int link, tlm_gp& trans){ } // validate pending response if(resp_in_progress[link]) { + //TODO: Make sure that there is always only one transaction per link if(nxt_resp_pend[link]){ log_error(link,trans, "Attempt to have two pending responses in target"); diff --git a/src/router/router.h b/src/router/router.h index b26f0b4..1eceb1b 100755 --- a/src/router/router.h +++ b/src/router/router.h @@ -27,6 +27,7 @@ #include #include + #include "tlm.h" #include "tlm_utils/simple_initiator_socket.h" #include "tlm_utils/simple_target_socket.h" diff --git a/src/router/router_cs.cpp b/src/router/router_cs.cpp index f2a847e..6662bbf 100755 --- a/src/router/router_cs.cpp +++ b/src/router/router_cs.cpp @@ -64,12 +64,16 @@ void TlmRouterCS::send_begin_req(int link, tlm_gp& trans, int dest_link){ *new_trans, phase, delay); curr_req[dest_link] = new_trans; credit_counter[dest_link]--; + log_info(link, trans, + "credits value updated: " + to_string(credit_counter[link])); // react to result if(status == TLM_COMPLETED) { log_error(link, trans, "Request completed prematurely"); curr_req[dest_link] = 0; check_transaction(link, *new_trans); credit_counter[dest_link]++; + log_info(link, trans, + "credits value updated: " + to_string(credit_counter[dest_link])); new_trans->release(); } } @@ -84,6 +88,8 @@ void TlmRouterCS::configure_router(int link, tlm_gp& trans){ int config_link = rec_packet->msg.config_link; int destination = rec_packet->msg.dest_link; // set auto router map + log_info(link, trans, "Set auto route of link "+DIR::toString(config_link) + + " to "+DIR::toString(destination)); set_auto_router_map(config_link, Dir(destination)); } diff --git a/src/traffic/PacketCS.cpp b/src/traffic/PacketCS.cpp index 0b3adf3..56a9fac 100755 --- a/src/traffic/PacketCS.cpp +++ b/src/traffic/PacketCS.cpp @@ -1,3 +1,24 @@ +/******************************************************************************* + * Copyright (C) 2024 Juan Neyra + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + ******************************************************************************/ #include "PacketCS.h" PacketCS::PacketCS(Node& src, Node& dst, int size, double generationTime, diff --git a/src/traffic/PacketCS.h b/src/traffic/PacketCS.h index 3879719..e64b8e5 100755 --- a/src/traffic/PacketCS.h +++ b/src/traffic/PacketCS.h @@ -1,3 +1,24 @@ +/******************************************************************************* + * Copyright (C) 2024 Juan Neyra + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + ******************************************************************************/ # pragma once #include "ratatoskrUtils/traffic/Packet.h" diff --git a/src/traffic/task/TaskPoolCS.cpp b/src/traffic/task/TaskPoolCS.cpp index aeb4eb4..3019a88 100644 --- a/src/traffic/task/TaskPoolCS.cpp +++ b/src/traffic/task/TaskPoolCS.cpp @@ -1,3 +1,24 @@ +/******************************************************************************* + * Copyright (C) 2024 Juan Neyra + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + ******************************************************************************/ #include "TaskPoolCS.h" void TaskPoolCS::start() diff --git a/src/traffic/task/TaskPoolCS.h b/src/traffic/task/TaskPoolCS.h index 01f2e69..fd1b9ed 100644 --- a/src/traffic/task/TaskPoolCS.h +++ b/src/traffic/task/TaskPoolCS.h @@ -1,3 +1,24 @@ +/******************************************************************************* + * Copyright (C) 2024 Juan Neyra + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + ******************************************************************************/ #pragma once #include "systemc.h" diff --git a/src/utils/GlobalResourcesCS.cpp b/src/utils/GlobalResourcesCS.cpp index 8219919..5c51a8d 100644 --- a/src/utils/GlobalResourcesCS.cpp +++ b/src/utils/GlobalResourcesCS.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2018 Jan Moritz Joseph + * Copyright (C) 2024 Juan Neyra based on 2018 Jan Moritz Joseph original version * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/utils/GlobalResourcesCS.h b/src/utils/GlobalResourcesCS.h index 98dcae4..545875b 100644 --- a/src/utils/GlobalResourcesCS.h +++ b/src/utils/GlobalResourcesCS.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2018 Jan Moritz Joseph + * Copyright (C) 2024 Juan Neyra based on 2018 Jan Moritz Joseph original version * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/utils/NetworkParticipantCS.h b/src/utils/NetworkParticipantCS.h index 68ab624..e2d4510 100755 --- a/src/utils/NetworkParticipantCS.h +++ b/src/utils/NetworkParticipantCS.h @@ -1,3 +1,24 @@ +/******************************************************************************* + * Copyright (C) 2024 Juan Neyra + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + ******************************************************************************/ #pragma once #include "systemc.h" diff --git a/src/utils/PacketFactoryCS.cpp b/src/utils/PacketFactoryCS.cpp index 033027c..7e3226a 100755 --- a/src/utils/PacketFactoryCS.cpp +++ b/src/utils/PacketFactoryCS.cpp @@ -1,3 +1,24 @@ +/******************************************************************************* + * Copyright (C) 2024 Juan Neyra + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + ******************************************************************************/ #include "PacketFactoryCS.h" PacketFactoryCS& PacketFactoryCS::getInstance() diff --git a/src/utils/PacketFactoryCS.h b/src/utils/PacketFactoryCS.h index d13bd7a..d5dcb37 100755 --- a/src/utils/PacketFactoryCS.h +++ b/src/utils/PacketFactoryCS.h @@ -1,3 +1,24 @@ +/******************************************************************************* + * Copyright (C) 2024 Juan Neyra + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + ******************************************************************************/ #pragma once #include diff --git a/src/utils/noc_logger.cpp b/src/utils/noc_logger.cpp index 82a83cf..73e7e67 100755 --- a/src/utils/noc_logger.cpp +++ b/src/utils/noc_logger.cpp @@ -1,3 +1,24 @@ +/******************************************************************************* + * Copyright (C) 2024 Juan Neyra + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + ******************************************************************************/ #include "noc_logger.h" #include #include diff --git a/src/utils/structures_cs.h b/src/utils/structures_cs.h index 72afe65..3256139 100644 --- a/src/utils/structures_cs.h +++ b/src/utils/structures_cs.h @@ -1,3 +1,24 @@ +/******************************************************************************* + * Copyright (C) 2024 Juan Neyra + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + ******************************************************************************/ #pragma once #include "ratatoskrUtils/utils/Structures.h" diff --git a/src/utils/utils.cpp b/src/utils/utils.cpp index 73d9527..beeb585 100755 --- a/src/utils/utils.cpp +++ b/src/utils/utils.cpp @@ -1,3 +1,24 @@ +/******************************************************************************* + * Copyright (C) 2024 Juan Neyra + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + ******************************************************************************/ #include "utils.h" #include "configuration.h" #include "utils/GlobalResourcesCS.h"