feat: bug solved, working project, comments added

This commit is contained in:
juanmanuel 2024-10-31 06:49:36 -05:00
parent 59eb9a23b6
commit 4517995d04
28 changed files with 2713 additions and 57 deletions

View file

@ -0,0 +1,55 @@
<?xml version="1.0" ?>
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<general>
<simulationTime value="1500"/>
<outputToFile value="true">report</outputToFile>
</general>
<noc>
<nocFile>config/conc_stream_pack_test/net.xml</nocFile>
<flitsPerPacket value="1"/>
<bitWidth value="32"/>
<Vdd value="5"/>
</noc>
<application>
<benchmark>task</benchmark>
<dataFile>config/conc_stream_pack_test/data.xml</dataFile>
<mapFile>config/conc_stream_pack_test/map.xml</mapFile>
</application>
<verbose>
<processingElements>
<function_calls value="false"/>
<send_flit value="false"/>
<send_head_flit value="true"/>
<receive_flit value="false"/>
<receive_tail_flit value="true"/>
<throttle value="false"/>
<reset value="false"/>
</processingElements>
<router>
<function_calls value="false"/>
<send_flit value="false"/>
<send_head_flit value="false"/>
<receive_flit value="false"/>
<receive_tail_flit value="false"/>
<throttle value="false"/>
<reset value="false"/>
<assign_channel value="false"/>
<buffer_overflow value="true"/>
</router>
<netrace>
<inject value="true"/>
<eject value="true"/>
<router_receive value="true"/>
</netrace>
<tasks>
<function_calls value="true"/>
<xml_parse value="false"/>
<data_receive value="true"/>
<data_send value="true"/>
<source_execute value="false"/>
</tasks>
</verbose>
<report>
<bufferReportRouters>5 6 9 10</bufferReportRouters>
</report>
</configuration>

View file

@ -0,0 +1,385 @@
<?xml version="1.0" ?>
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<dataTypes>
<dataType id="0">
<name value="Packet"/>
</dataType>
<dataType id="1">
<name value="Stream"/>
</dataType>
<dataType id="2">
<name value="ConfigRouter"/>
</dataType>
</dataTypes>
<tasks>
<task id="0">
<start min="0" max="0"/>
<duration min="-1" max="-1"/>
<repeat min="1" max="1"/>
<generates>
<possibility id="0">
<probability value="1"/>
<destinations>
<destination id="0">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="2"/>
<task value="1"/>
<config link="0" destination="1"/>
</destination>
<destination id="1">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="2"/>
<task value="2"/>
<config link="2" destination="1"/>
</destination>
<destination id="2">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="2"/>
<task value="3"/>
<config link="2" destination="1"/>
</destination>
<destination id="3">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="2"/>
<task value="4"/>
<config link="2" destination="3"/>
</destination>
<destination id="4">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="2"/>
<task value="5"/>
<config link="4" destination="3"/>
</destination>
<destination id="5">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="2"/>
<task value="6"/>
<config link="4" destination="0"/>
</destination>
</destinations>
</possibility>
</generates>
</task>
<task id="1">
<start max="0" min="0"/>
<duration max="-1" min="-1"/>
<repeat max="1" min="1"/>
<requires>
<requirement id="0">
<type value="2"/>
<source value="0"/>
<count max="1" min="1"/>
</requirement>
</requires>
<generates>
<possibility id="0">
<probability value="1"/>
<destinations>
<destination id="0">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="0"/>
<task value="6"/>
</destination>
</destinations>
</possibility>
</generates>
</task>
<task id="2">
<start max="0" min="0"/>
<duration max="-1" min="-1"/>
<repeat max="1" min="1"/>
<requires>
<requirement id="0">
<type value="2"/>
<source value="0"/>
<count max="1" min="1"/>
</requirement>
</requires>
<generates>
<possibility id="0">
<probability value="1"/>
<destinations>
<destination id="0">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="0"/>
<task value="6"/>
</destination>
</destinations>
</possibility>
</generates>
</task>
<task id="3">
<start max="0" min="0"/>
<duration max="-1" min="-1"/>
<repeat max="1" min="1"/>
<requires>
<requirement id="0">
<type value="2"/>
<source value="0"/>
<count max="1" min="1"/>
</requirement>
</requires>
<generates>
<possibility id="0">
<probability value="1"/>
<destinations>
<destination id="0">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="0"/>
<task value="6"/>
</destination>
</destinations>
</possibility>
</generates>
</task>
<task id="4">
<start max="0" min="0"/>
<duration max="-1" min="-1"/>
<repeat max="1" min="1"/>
<requires>
<requirement id="0">
<type value="2"/>
<source value="0"/>
<count max="1" min="1"/>
</requirement>
</requires>
<generates>
<possibility id="0">
<probability value="1"/>
<destinations>
<destination id="0">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="0"/>
<task value="6"/>
</destination>
</destinations>
</possibility>
</generates>
</task>
<task id="5">
<start max="0" min="0"/>
<duration max="-1" min="-1"/>
<repeat max="1" min="1"/>
<requires>
<requirement id="0">
<type value="2"/>
<source value="0"/>
<count max="1" min="1"/>
</requirement>
</requires>
<generates>
<possibility id="0">
<probability value="1"/>
<destinations>
<destination id="0">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="0"/>
<task value="6"/>
</destination>
</destinations>
</possibility>
</generates>
</task>
<task id="6">
<start max="0" min="0"/>
<duration max="-1" min="-1"/>
<repeat max="1" min="1"/>
<requires>
<requirement id="0">
<type value="0"/>
<source value="0"/>
<count max="5" min="5"/>
</requirement>
</requires>
<generates>
<possibility id="0">
<probability value="1"/>
<destinations>
<destination id="0">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="1"/>
<task value="7"/>
</destination>
<destination id="1">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="1"/>
<task value="7"/>
</destination>
<destination id="2">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="1"/>
<task value="7"/>
</destination>
<destination id="3">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="1"/>
<task value="7"/>
</destination>
<destination id="4">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="1"/>
<task value="7"/>
</destination>
<destination id="5">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="1"/>
<task value="7"/>
</destination>
</destinations>
</possibility>
</generates>
</task>
<task id="7">
<start max="0" min="0"/>
<duration max="-1" min="-1"/>
<repeat max="1" min="1"/>
<requires>
<requirement id="0">
<type value="1"/>
<source value="4"/>
<count max="6" min="6"/>
</requirement>
</requires>
</task>
<task id="8">
<start min="0" max="0"/>
<duration min="-1" max="-1"/>
<repeat min="1" max="1"/>
<generates>
<possibility id="0">
<probability value="1"/>
<destinations>
<destination id="0">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="4" max="4"/>
<type value="0"/>
<task value="9"/>
</destination>
</destinations>
</possibility>
</generates>
</task>
<task id="9">
<start max="0" min="0"/>
<duration max="-1" min="-1"/>
<repeat max="1" min="1"/>
<requires>
<requirement id="0">
<type value="0"/>
<source value="0"/>
<count max="4" min="4"/>
</requirement>
</requires>
</task>
<task id="10">
<start min="0" max="0"/>
<duration min="-1" max="-1"/>
<repeat min="1" max="1"/>
<generates>
<possibility id="0">
<probability value="1"/>
<destinations>
<destination id="0">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="6" max="6"/>
<type value="0"/>
<task value="11"/>
</destination>
</destinations>
</possibility>
</generates>
</task>
<task id="11">
<start max="0" min="0"/>
<duration max="-1" min="-1"/>
<repeat max="1" min="1"/>
<requires>
<requirement id="0">
<type value="0"/>
<source value="0"/>
<count max="6" min="6"/>
</requirement>
</requires>
</task>
<task id="12">
<start min="0" max="0"/>
<duration min="-1" max="-1"/>
<repeat min="1" max="1"/>
<generates>
<possibility id="0">
<probability value="1"/>
<destinations>
<destination id="0">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="3" max="3"/>
<type value="0"/>
<task value="13"/>
</destination>
</destinations>
</possibility>
</generates>
</task>
<task id="13">
<start max="0" min="0"/>
<duration max="-1" min="-1"/>
<repeat max="1" min="1"/>
<requires>
<requirement id="0">
<type value="0"/>
<source value="0"/>
<count max="3" min="3"/>
</requirement>
</requires>
</task>
</tasks>
</data>

View file

@ -0,0 +1,59 @@
<?xml version="1.0" ?>
<map xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<bind>
<task value="0"/>
<node value="1"/>
</bind>
<bind>
<task value="1"/>
<node value="5"/>
</bind>
<bind>
<task value="2"/>
<node value="9"/>
</bind>
<bind>
<task value="3"/>
<node value="13"/>
</bind>
<bind>
<task value="4"/>
<node value="14"/>
</bind>
<bind>
<task value="5"/>
<node value="15"/>
</bind>
<bind>
<task value="6"/>
<node value="1"/>
</bind>
<bind>
<task value="7"/>
<node value="15"/>
</bind>
<bind>
<task value="8"/>
<node value="0"/>
</bind>
<bind>
<task value="9"/>
<node value="14"/>
</bind>
<bind>
<task value="10"/>
<node value="5"/>
</bind>
<bind>
<task value="11"/>
<node value="10"/>
</bind>
<bind>
<task value="12"/>
<node value="11"/>
</bind>
<bind>
<task value="13"/>
<node value="1"/>
</bind>
</map>

File diff suppressed because it is too large Load diff

View file

@ -34,7 +34,7 @@
<count min="1" max="1"/>
<type value="2"/>
<task value="2"/>
<config link="2" destination="3"/>
<config link="4" destination="3"/>
</destination>
<destination id="2">
<delay min="0" max="100"/>
@ -42,7 +42,7 @@
<count min="1" max="1"/>
<type value="2"/>
<task value="3"/>
<config link="2" destination="0"/>
<config link="4" destination="0"/>
</destination>
</destinations>
</possibility>
@ -60,6 +60,20 @@
<count max="1" min="1"/>
</requirement>
</requires>
<generates>
<possibility id="0">
<probability value="1"/>
<destinations>
<destination id="0">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="0"/>
<task value="4"/>
</destination>
</destinations>
</possibility>
</generates>
</task>
<task id="2">
@ -82,7 +96,7 @@
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="0"/>
<task value="3"/>
<task value="4"/>
</destination>
</destinations>
</possibility>
@ -96,7 +110,7 @@
<requires>
<requirement id="0">
<type value="2"/>
<source value="2"/>
<source value="0"/>
<count max="1" min="1"/>
</requirement>
</requires>
@ -108,14 +122,7 @@
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="1"/>
<task value="4"/>
</destination>
<destination id="1">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="1"/>
<type value="0"/>
<task value="4"/>
</destination>
</destinations>
@ -129,13 +136,59 @@
<repeat max="1" min="1"/>
<requires>
<requirement id="0">
<type value="1"/>
<type value="0"/>
<source value="0"/>
<count max="3" min="3"/>
</requirement>
</requires>
<generates>
<possibility id="0">
<probability value="1"/>
<destinations>
<destination id="0">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="1"/>
<task value="5"/>
</destination>
<destination id="1">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="1"/>
<task value="5"/>
</destination>
<destination id="2">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="1"/>
<task value="5"/>
</destination>
</destinations>
</possibility>
</generates>
</task>
<task id="5">
<start max="0" min="0"/>
<duration max="-1" min="-1"/>
<repeat max="1" min="1"/>
<requires>
<requirement id="0">
<type value="1"/>
<source value="4"/>
<count max="1" min="1"/>
</requirement>
<requirement id="1">
<type value="1"/>
<source value="0"/>
<source value="4"/>
<count max="1" min="1"/>
</requirement>
<requirement id="2">
<type value="1"/>
<source value="4"/>
<count max="1" min="1"/>
</requirement>
</requires>

View file

@ -6,18 +6,22 @@
</bind>
<bind>
<task value="1"/>
<node value="1"/>
</bind>
<bind>
<task value="2"/>
<node value="2"/>
</bind>
<bind>
<task value="3"/>
<node value="0"/>
</bind>
<bind>
<task value="2"/>
<node value="1"/>
</bind>
<bind>
<task value="3"/>
<node value="2"/>
</bind>
<bind>
<task value="4"/>
<node value="0"/>
</bind>
<bind>
<task value="5"/>
<node value="2"/>
</bind>
</map>

View file

@ -0,0 +1,135 @@
MAX_ROUT_Y = 4
sourc_x = 0
sourc_y = 1
dest_x = 3
dest_y = 3
GEN_TASK_START = """ <tasks>
<task id="0">
<start min="0" max="0"/>
<duration min="-1" max="-1"/>
<repeat min="1" max="1"/>
<generates>
<possibility id="0">
<probability value="1"/>
<destinations>"""
GEN_TASK_END = """ </destinations>
</possibility>
</generates>
</task>"""
REQ_TASK_START = """ <task id="{}">
<start max="0" min="0"/>
<duration max="-1" min="-1"/>
<repeat max="1" min="1"/>"""
REQ_TASK_END = " </task>"
LAST_TASK = """ <task id="{}">
<start max="0" min="0"/>
<duration max="-1" min="-1"/>
<repeat max="1" min="1"/>
<requires>
<requirement id="0">
<type value="0"/>
<source value="0"/>
<count max="{}" min="{}"/>
</requirement>
</requires>
</task>"""
REQ_TASK_REQ = """ <requires>
<requirement id="0">
<type value="2"/>
<source value="0"/>
<count max="1" min="1"/>
</requirement>
</requires>"""
REQ_TASK_GEN = """ <generates>
<possibility id="0">
<probability value="1"/>
<destinations>
<destination id="0">
<delay min="0" max="100"/>
<interval min="100" max="100"/>
<count min="1" max="1"/>
<type value="0"/>
<task value="{}"/>
</destination>
</destinations>
</possibility>
</generates>"""
DEST_HEADER = " <destination id=\"{}\">"
DEST_H_END = " </destination>"
DELAY_TAG = " <delay min=\"0\" max=\"100\"/>"
INTERVAL_TAG = " <interval min=\"100\" max=\"100\"/>"
COUNT_TAG = " <count min=\"1\" max=\"1\"/>"
TYPE_TAG = " <type value=\"2\"/>"
TASK_TAG = " <task value=\"{}\"/>"
CONFIG_TAG = " <config link=\"{}\" destination=\"{}\"/>"
BIND = """ <bind>
<task value="{}"/>
<node value="{}"/>
</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

View file

@ -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<link_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<Flit*>(data_ptr);
PacketCS* p = dynamic_cast<PacketCS*>(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" +

View file

@ -64,14 +64,10 @@ public:
tlm_utils::peq_with_cb_and_phase<NetworkInterfaceTlm> init_peq;
tlm_utils::peq_with_cb_and_phase<NetworkInterfaceTlm> 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

View file

@ -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<int,int>(n.id, int(routers.size())-1));

View file

@ -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<TaskCS, dataTypeID_t> 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;

View file

@ -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<dataTypeID_t, std::set<TaskCS>> neededFor;
std::map<std::pair<TaskCS, dataTypeID_t>, int> neededAmount;
std::map<TaskCS, std::set<dataTypeID_t>> 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();
};

View file

@ -226,7 +226,6 @@ void ProcessingElementVC::thread()
void ProcessingElementVC::execute(Task& task)
{
cout<<"hmm"<<endl;
// EXPLAIN: if there are no repetitions of the task left, create a new number of repetitions (probably used only in the first call for init)
if (!taskRepeatLeft.count(task)) {
taskRepeatLeft[task] = globalResources.getRandomIntBetween(task.minRepeat, task.maxRepeat);

View file

@ -99,7 +99,7 @@ void TlmRouter::send_begin_req(int link, tlm_gp& trans, int dest_link){
curr_req[dest_link] = new_trans;
credit_counter[dest_link]--;
log_info(link, trans,
"credits value updated: " + to_string(credit_counter[link]));
"credits value updated: " + to_string(credit_counter[dest_link]));
// react to result
if(status == TLM_UPDATED) {
init_peq.notify(*new_trans, phase, delay);
@ -110,7 +110,7 @@ void TlmRouter::send_begin_req(int link, tlm_gp& trans, int dest_link){
check_transaction(link, *new_trans);
credit_counter[dest_link]++;
log_info(link, trans,
"credits value updated: " + to_string(credit_counter[link]));
"credits value updated: " + to_string(credit_counter[dest_link]));
new_trans->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");

View file

@ -27,6 +27,7 @@
#include <systemc>
#include <string>
#include "tlm.h"
#include "tlm_utils/simple_initiator_socket.h"
#include "tlm_utils/simple_target_socket.h"

View file

@ -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));
}

View file

@ -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,

View file

@ -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"

View file

@ -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()

View file

@ -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"

View file

@ -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

View file

@ -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

View file

@ -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"

View file

@ -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()

View file

@ -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 <vector>

View file

@ -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 <iostream>
#include <fstream>

View file

@ -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"

View file

@ -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"