From 08d76b8a1dcfd844ba9df0d5655827fc0abc42c7 Mon Sep 17 00:00:00 2001 From: Artyom Peshkov Date: Sat, 24 May 2025 01:38:31 +0300 Subject: [PATCH 01/22] done --- source/device/device.hpp | 8 ++-- source/device/receiver.cpp | 51 +++++------------------ source/device/receiver.hpp | 10 ++--- source/device/routing_module.cpp | 33 ++++++++++++--- source/device/routing_module.hpp | 12 +++--- source/device/sender.cpp | 43 ++++--------------- source/device/sender.hpp | 10 ++--- source/device/switch.cpp | 38 ++++------------- source/device/switch.hpp | 10 ++--- source/flow.cpp | 3 ++ source/packet.cpp | 30 +++++-------- source/packet.hpp | 8 +++- source/simulator.hpp | 4 +- source/utils/algorithms.cpp | 6 +-- source/utils/algorithms.hpp | 2 +- test/device/link_to_device_test.cpp | 18 ++++---- test/device/update_table_test.cpp | 11 ++--- test/link/utils.cpp | 7 ++-- test/link/utils.hpp | 6 +-- test/simulator/flow_mock.cpp | 28 +++++++++++++ test/simulator/flow_mock.hpp | 29 +++++++++++++ test/simulator/recalculate_paths_test.cpp | 6 ++- test/simulator/utils.cpp | 10 ++--- test/simulator/utils.hpp | 2 +- test/switch/receiver_mock.cpp | 5 +-- test/switch/receiver_mock.hpp | 5 +-- test/switch/test_switch.cpp | 23 +++++----- test/utils/fake_packet.hpp | 16 +++++++ 28 files changed, 223 insertions(+), 211 deletions(-) create mode 100644 test/simulator/flow_mock.cpp create mode 100644 test/simulator/flow_mock.hpp create mode 100644 test/utils/fake_packet.hpp diff --git a/source/device/device.hpp b/source/device/device.hpp index bc5a497870..c0f599cdcf 100644 --- a/source/device/device.hpp +++ b/source/device/device.hpp @@ -7,6 +7,7 @@ namespace sim { +struct Packet; class ILink; enum DeviceType { SWITCH, SENDER, RECEIVER }; @@ -27,12 +28,11 @@ class IRoutingDevice { public: virtual ~IRoutingDevice() = default; + virtual Id get_id() const = 0; virtual bool add_inlink(std::shared_ptr link) = 0; virtual bool add_outlink(std::shared_ptr link) = 0; - virtual bool update_routing_table(std::shared_ptr dest, - std::shared_ptr link, size_t paths_count = 1) = 0; - virtual std::shared_ptr get_link_to_destination( - std::shared_ptr device) const = 0; + virtual bool update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count = 1) = 0; + virtual std::shared_ptr get_link_to_destination(Packet packet) const = 0; virtual std::shared_ptr next_inlink() = 0; virtual std::set>get_outlinks() = 0; }; diff --git a/source/device/receiver.cpp b/source/device/receiver.cpp index 9cb034c899..ca57fe47af 100644 --- a/source/device/receiver.cpp +++ b/source/device/receiver.cpp @@ -11,18 +11,12 @@ namespace sim { Receiver::Receiver() - : m_router(std::make_unique()), - m_id(IdentifierFactory::get_instance().generate_id()) {} + : m_router(std::make_unique()) {} bool Receiver::add_inlink(std::shared_ptr link) { if (!is_valid_link(link)) { return false; } - if (this != link->get_to().get()) { - LOG_WARN( - "Link destination device is incorrect (expected current device)"); - return false; - } return m_router->add_inlink(link); } @@ -30,36 +24,22 @@ bool Receiver::add_outlink(std::shared_ptr link) { if (!is_valid_link(link)) { return false; } - if (this != link->get_from().get()) { - LOG_WARN("Outlink source is not our device"); - return false; - } return m_router->add_outlink(link); } -bool Receiver::update_routing_table(std::shared_ptr dest, - std::shared_ptr link, size_t paths_count) { - if (dest == nullptr) { - LOG_WARN("Passed destination is null"); - return false; - } +bool Receiver::update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count) { if (!is_valid_link(link)) { return false; } - if (this != link->get_from().get()) { - LOG_WARN("Link source device is incorrect (expected current device)"); - return false; - } - return m_router->update_routing_table(dest, link, paths_count); + return m_router->update_routing_table(dest_id, link, paths_count); } std::shared_ptr Receiver::next_inlink() { return m_router->next_inlink(); }; -std::shared_ptr Receiver::get_link_to_destination( - std::shared_ptr dest) const { - return m_router->get_link_to_destination(dest); +std::shared_ptr Receiver::get_link_to_destination(Packet packet) const { + return m_router->get_link_to_destination(packet); }; DeviceType Receiver::get_type() const { return DeviceType::RECEIVER; } @@ -89,12 +69,7 @@ Time Receiver::process() { LOG_INFO("Processing packet from link on receiver. Packet: " + data_packet.to_string()); - std::shared_ptr destination = data_packet.get_destination(); - if (destination == nullptr) { - LOG_WARN("Destination device pointer is expired"); - return total_processing_time; - } - if (data_packet.type == DATA && destination.get() == this) { + if (data_packet.type == DATA && data_packet.dest_id == get_id()) { // TODO: think about processing time // Not sure if we want to send ack before processing or after it total_processing_time += send_ack(data_packet); @@ -102,7 +77,7 @@ Time Receiver::process() { LOG_WARN( "Packet arrived to Receiver that is not its destination; using " "routing table to send it further"); - std::shared_ptr next_link = get_link_to_destination(destination); + std::shared_ptr next_link = get_link_to_destination(data_packet); if (next_link == nullptr) { LOG_WARN("No link corresponds to destination device"); @@ -117,15 +92,9 @@ Time Receiver::process() { Time Receiver::send_ack(Packet data_packet) { Time processing_time = 1; - Packet ack = {PacketType::ACK, 1, data_packet.flow}; - - auto destination = ack.get_destination(); - if (destination == nullptr) { - LOG_ERROR("Ack destination does not exists"); - return processing_time; - } + Packet ack = Packet(PacketType::ACK, 1, data_packet.flow, data_packet.flow->get_receiver()->get_id(), data_packet.flow->get_sender()->get_id(), 0); - std::shared_ptr link_to_dest = get_link_to_destination(destination); + std::shared_ptr link_to_dest = get_link_to_destination(ack); if (link_to_dest == nullptr) { LOG_ERROR("Link to send ack does not exist"); return processing_time; @@ -143,6 +112,6 @@ std::set> Receiver::get_outlinks() { return m_router->get_outlinks(); } -Id Receiver::get_id() const { return m_id; } +Id Receiver::get_id() const { return m_router->get_id(); } } // namespace sim diff --git a/source/device/receiver.hpp b/source/device/receiver.hpp index ad12641dad..4e3a3154fe 100644 --- a/source/device/receiver.hpp +++ b/source/device/receiver.hpp @@ -10,8 +10,7 @@ namespace sim { struct Packet; class IReceiver : public IRoutingDevice, - public IProcessingDevice, - public Identifiable { + public IProcessingDevice { public: virtual ~IReceiver() = default; }; @@ -24,11 +23,9 @@ class Receiver : public IReceiver, bool add_inlink(std::shared_ptr link) final; bool add_outlink(std::shared_ptr link) final; - bool update_routing_table(std::shared_ptr dest, - std::shared_ptr link, size_t paths_count = 1) final; + bool update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count = 1) final; std::shared_ptr next_inlink() final; - std::shared_ptr get_link_to_destination( - std::shared_ptr dest) const final; + std::shared_ptr get_link_to_destination(Packet packet) const final; std::set> get_outlinks() final; DeviceType get_type() const final; @@ -45,7 +42,6 @@ class Receiver : public IReceiver, private: Time send_ack(Packet data_packet); std::unique_ptr m_router; - Id m_id; }; } // namespace sim diff --git a/source/device/routing_module.cpp b/source/device/routing_module.cpp index ce71bf31c6..63989d3e70 100644 --- a/source/device/routing_module.cpp +++ b/source/device/routing_module.cpp @@ -8,7 +8,19 @@ namespace sim { +RoutingModule::RoutingModule() + : m_id(IdentifierFactory::get_instance().generate_id()) {} + +Id RoutingModule::get_id() const { + return m_id; +} + bool RoutingModule::add_inlink(std::shared_ptr link) { + if (m_id != link->get_to()->get_id()) { + LOG_WARN( + "Link destination device is incorrect (expected current device)"); + return false; + } if (m_inlinks.contains(link)) { LOG_WARN("Unexpected already added inlink"); return false; @@ -22,6 +34,10 @@ bool RoutingModule::add_inlink(std::shared_ptr link) { } bool RoutingModule::add_outlink(std::shared_ptr link) { + if (m_id != link->get_from()->get_id()) { + LOG_WARN("Outlink source is not our device"); + return false; + } if (m_outlinks.contains(link)) { LOG_WARN("Unexpected already added outlink"); return false; @@ -30,8 +46,11 @@ bool RoutingModule::add_outlink(std::shared_ptr link) { return true; } -bool RoutingModule::update_routing_table(std::shared_ptr dest, - std::shared_ptr link, size_t paths_count) { +bool RoutingModule::update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count) { + if (m_id != link->get_from()->get_id()) { + LOG_WARN("Link source device is incorrect (expected current device)"); + return false; + } if (link == nullptr) { LOG_WARN("Unexpected nullptr link"); return false; @@ -39,19 +58,20 @@ bool RoutingModule::update_routing_table(std::shared_ptr dest, auto link_dest = link->get_to(); // TODO: discuss storing weak_ptrs instead of shared - m_routing_table[dest][link] += paths_count; + m_routing_table[dest_id][link] += paths_count; return true; } -std::shared_ptr RoutingModule::get_link_to_destination( - std::shared_ptr device) const { - auto iterator = m_routing_table.find(device); +std::shared_ptr RoutingModule::get_link_to_destination(Packet packet) const { + auto iterator = m_routing_table.find(packet.dest_id); if (iterator == m_routing_table.end()) { + LOG_ERROR("1"); return nullptr; } const auto& link_map = iterator->second; if (link_map.empty()) { + LOG_ERROR("2"); return nullptr; } @@ -71,6 +91,7 @@ std::shared_ptr RoutingModule::get_link_to_destination( } } + LOG_ERROR("3"); return nullptr; } diff --git a/source/device/routing_module.hpp b/source/device/routing_module.hpp index 3254066ad5..9072ac6d64 100644 --- a/source/device/routing_module.hpp +++ b/source/device/routing_module.hpp @@ -11,16 +11,16 @@ namespace sim { class RoutingModule : public IRoutingDevice { public: + RoutingModule(); ~RoutingModule() = default; + Id get_id() const final; bool add_inlink(std::shared_ptr link) final; bool add_outlink(std::shared_ptr link) final; - bool update_routing_table(std::shared_ptr dest, - std::shared_ptr link, size_t paths_count = 1) final; + bool update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count = 1) final; // returns next inlink and moves inlinks set iterator forward std::shared_ptr next_inlink() final; - std::shared_ptr get_link_to_destination( - std::shared_ptr dest) const final; + std::shared_ptr get_link_to_destination(Packet packet) const final; std::set> get_outlinks() final; void correctify_inlinks(); @@ -35,12 +35,14 @@ class RoutingModule : public IRoutingDevice { m_outlinks; // A routing table: maps the final destination to a specific link - MapWeakPtr> m_routing_table; + std::unordered_map> m_routing_table; // Iterator for the next ingress to process LoopIterator, std::owner_less>>::iterator> m_next_inlink; + + Id m_id; }; } // namespace sim diff --git a/source/device/sender.cpp b/source/device/sender.cpp index 06ddc2d64a..df36ae95b6 100644 --- a/source/device/sender.cpp +++ b/source/device/sender.cpp @@ -12,18 +12,12 @@ namespace sim { Sender::Sender() - : m_router(std::make_unique()), - m_id(IdentifierFactory::get_instance().generate_id()) {} + : m_router(std::make_unique()) {} bool Sender::add_inlink(std::shared_ptr link) { if (!is_valid_link(link)) { return false; } - if (this != link->get_to().get()) { - LOG_WARN( - "Link destination device is incorrect (expected current device)"); - return false; - } return m_router->add_inlink(link); } @@ -31,28 +25,15 @@ bool Sender::add_outlink(std::shared_ptr link) { if (!is_valid_link(link)) { return false; } - if (this != link->get_from().get()) { - LOG_WARN("Outlink source is not our device"); - return false; - } m_router->add_outlink(link); return true; } -bool Sender::update_routing_table(std::shared_ptr dest, - std::shared_ptr link, size_t paths_count) { - if (dest == nullptr) { - LOG_WARN("Passed destination is null"); - return false; - } +bool Sender::update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count) { if (!is_valid_link(link)) { return false; } - if (this != link->get_from().get()) { - LOG_WARN("Link source device is incorrect (expected current device)"); - return false; - } - m_router->update_routing_table(dest, link, paths_count); + m_router->update_routing_table(dest_id, link, paths_count); return true; } @@ -60,9 +41,8 @@ std::shared_ptr Sender::next_inlink() { return m_router->next_inlink(); }; -std::shared_ptr Sender::get_link_to_destination( - std::shared_ptr dest) const { - return m_router->get_link_to_destination(dest); +std::shared_ptr Sender::get_link_to_destination(Packet packet) const { + return m_router->get_link_to_destination(packet); }; DeviceType Sender::get_type() const { return DeviceType::SENDER; } @@ -97,18 +77,13 @@ Time Sender::process() { LOG_INFO("Processing packet from link on sender. Packet: " + packet.to_string()); - auto destination = packet.get_destination(); - if (destination == nullptr) { - LOG_WARN("Destination device pointer is expired"); - return total_processing_time; - } - if (packet.type == PacketType::ACK && destination.get() == this) { + if (packet.type == PacketType::ACK && packet.dest_id == get_id()) { packet.flow->update(packet, get_type()); } else { LOG_WARN( "Packet arrived to Sender that is not its destination; use routing " "table to send it further"); - std::shared_ptr next_link = get_link_to_destination(destination); + std::shared_ptr next_link = get_link_to_destination(packet); if (next_link == nullptr) { LOG_WARN("No link corresponds to destination device"); @@ -136,7 +111,7 @@ Time Sender::send_data() { LOG_INFO("Taken new data packet on sender. Packet: " + data_packet.to_string()); - auto next_link = get_link_to_destination(data_packet.get_destination()); + auto next_link = get_link_to_destination(data_packet); if (next_link == nullptr) { LOG_WARN("Link to send data packet does not exist"); return total_processing_time; @@ -155,6 +130,6 @@ std::set> Sender::get_outlinks() { return m_router->get_outlinks(); } -Id Sender::get_id() const { return m_id; } +Id Sender::get_id() const { return m_router->get_id(); } } // namespace sim diff --git a/source/device/sender.hpp b/source/device/sender.hpp index d539544855..c275b2f7d2 100644 --- a/source/device/sender.hpp +++ b/source/device/sender.hpp @@ -10,8 +10,7 @@ namespace sim { struct Packet; class ISender : public IRoutingDevice, - public IProcessingDevice, - public Identifiable { + public IProcessingDevice { public: virtual ~ISender() = default; virtual void enqueue_packet(Packet packet) = 0; @@ -25,11 +24,9 @@ class Sender : public ISender, public std::enable_shared_from_this { bool add_inlink(std::shared_ptr link) final; bool add_outlink(std::shared_ptr link) final; - bool update_routing_table(std::shared_ptr dest, - std::shared_ptr link, size_t paths_count = 1) final; + bool update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count = 1) final; std::shared_ptr next_inlink() final; - std::shared_ptr get_link_to_destination( - std::shared_ptr dest) const final; + std::shared_ptr get_link_to_destination(Packet packet) const final; std::set> get_outlinks() final; DeviceType get_type() const final; @@ -50,7 +47,6 @@ class Sender : public ISender, public std::enable_shared_from_this { private: std::queue m_flow_buffer; std::unique_ptr m_router; - Id m_id; }; } // namespace sim diff --git a/source/device/switch.cpp b/source/device/switch.cpp index 9b30375395..d836f2e221 100644 --- a/source/device/switch.cpp +++ b/source/device/switch.cpp @@ -9,17 +9,12 @@ namespace sim { Switch::Switch() - : m_router(std::make_unique()), - m_id(IdentifierFactory::get_instance().generate_id()) {} + : m_router(std::make_unique()) {} bool Switch::add_inlink(std::shared_ptr link) { if (!is_valid_link(link)) { return false; } - if (link->get_to().get() != this) { - LOG_WARN("Inlink destination is not our device"); - return false; - } return m_router->add_inlink(link); } @@ -27,34 +22,20 @@ bool Switch::add_outlink(std::shared_ptr link) { if (!is_valid_link(link)) { return false; } - if (link->get_from().get() != this) { - LOG_WARN("Outlink source is not our device"); - return false; - } return m_router->add_outlink(link); } -bool Switch::update_routing_table(std::shared_ptr dest, - std::shared_ptr link, size_t paths_count) { - if (dest == nullptr) { - LOG_WARN("Destination device does not exist"); - return false; - } +bool Switch::update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count) { if (!is_valid_link(link)) { return false; } - if (link->get_from().get() != this) { - LOG_WARN("Link source is not our device"); - return false; - } - return m_router->update_routing_table(dest, link, paths_count); + return m_router->update_routing_table(dest_id, link, paths_count); } std::shared_ptr Switch::next_inlink() { return m_router->next_inlink(); } -std::shared_ptr Switch::get_link_to_destination( - std::shared_ptr dest) const { - return m_router->get_link_to_destination(dest); +std::shared_ptr Switch::get_link_to_destination(Packet packet) const { + return m_router->get_link_to_destination(packet); } DeviceType Switch::get_type() const { return DeviceType::SWITCH; } @@ -78,13 +59,8 @@ Time Switch::process() { LOG_WARN("No flow in packet"); return total_processing_time; } - std::shared_ptr destination = packet.get_destination(); - if (destination == nullptr) { - LOG_WARN("Destination device pointer is expired"); - return total_processing_time; - } - std::shared_ptr next_link = get_link_to_destination(destination); + std::shared_ptr next_link = get_link_to_destination(packet); if (next_link == nullptr) { LOG_WARN("No link corresponds to destination device"); @@ -104,6 +80,6 @@ std::set> Switch::get_outlinks() { return m_router->get_outlinks(); } -Id Switch::get_id() const { return m_id; } +Id Switch::get_id() const { return m_router->get_id(); } } // namespace sim diff --git a/source/device/switch.hpp b/source/device/switch.hpp index eb4ce3bb59..5c830b62ec 100644 --- a/source/device/switch.hpp +++ b/source/device/switch.hpp @@ -8,8 +8,7 @@ namespace sim { class ISwitch : public IRoutingDevice, - public IProcessingDevice, - public Identifiable { + public IProcessingDevice { public: virtual ~ISwitch() = default; }; @@ -21,11 +20,9 @@ class Switch : public ISwitch, public std::enable_shared_from_this { bool add_inlink(std::shared_ptr link) final; bool add_outlink(std::shared_ptr link) final; - bool update_routing_table(std::shared_ptr dest, - std::shared_ptr link, size_t paths_count = 1) final; + bool update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count = 1) final; std::shared_ptr next_inlink() final; - std::shared_ptr get_link_to_destination( - std::shared_ptr dest) const final; + std::shared_ptr get_link_to_destination(Packet packet) const final; std::set> get_outlinks() final; DeviceType get_type() const final; @@ -39,7 +36,6 @@ class Switch : public ISwitch, public std::enable_shared_from_this { private: std::unique_ptr m_router; - Id m_id; }; } // namespace sim diff --git a/source/flow.cpp b/source/flow.cpp index 7aadfada4e..177c8553f6 100644 --- a/source/flow.cpp +++ b/source/flow.cpp @@ -30,6 +30,9 @@ Packet Flow::generate_packet() { packet.type = sim::PacketType::DATA; packet.size_byte = m_packet_size; packet.flow = this; + packet.source_id = get_sender()->get_id(); + packet.dest_id = get_receiver()->get_id(); + packet.RTT = 0; return packet; } diff --git a/source/packet.cpp b/source/packet.cpp index aebc3bb31b..e51e0cc3fa 100644 --- a/source/packet.cpp +++ b/source/packet.cpp @@ -3,25 +3,14 @@ #include namespace sim { -Packet::Packet(PacketType a_type, Size a_size_byte, IFlow* a_flow) - : type(a_type), size_byte(a_size_byte), flow(a_flow) {} - -std::shared_ptr Packet::get_destination() const { - if (flow == nullptr) { - return nullptr; - } - switch (type) { - case ACK: - return flow->get_sender(); - case DATA: - return flow->get_receiver(); - default: - return nullptr; - } -}; +Packet::Packet(PacketType a_type, Size a_size_byte, IFlow* a_flow, Id a_source_id, Id a_dest_id, Time a_RTT) + : type(a_type), source_id(a_source_id), dest_id(a_dest_id), RTT(a_RTT), size_byte(a_size_byte), flow(a_flow) {} bool Packet::operator==(const Packet& packet) const { - return flow == packet.flow && size_byte == packet.size_byte && + return flow == packet.flow && + source_id == packet.source_id && + dest_id == packet.dest_id && + size_byte == packet.size_byte && type == packet.type; } @@ -42,9 +31,12 @@ std::string Packet::to_string() const { oss << "UNKNOWN"; break; } - + + oss << ", source_id: " << source_id; + oss << ", dest_id: " << dest_id; + oss << ", packet_num: " << packet_num; oss << ", size(byte): " << size_byte; - oss << ", flow: " << (flow ? "set" : "null"); + oss << ", flow: " << (flow ? std::to_string(flow->get_id()) : "null"); oss << "]"; return oss.str(); diff --git a/source/packet.hpp b/source/packet.hpp index 65693d9f70..d9559b48b9 100644 --- a/source/packet.hpp +++ b/source/packet.hpp @@ -8,18 +8,22 @@ namespace sim { class IFlow; +class IRoutingDevice; enum PacketType { ACK, DATA }; struct Packet { Packet(PacketType a_type = PacketType::DATA, Size a_size_byte = 0, - IFlow* flow = nullptr); + IFlow* a_flow = nullptr, Id a_source_id = 0, Id a_dest_id = 0, Time a_RTT = 0); bool operator==(const Packet& packet) const; std::string to_string() const; - std::shared_ptr get_destination() const; + std::uint32_t packet_num; PacketType type; + Id source_id; + Id dest_id; + Time RTT; Size size_byte; IFlow* flow; }; diff --git a/source/simulator.hpp b/source/simulator.hpp index 8b19b38c8c..b245dac710 100644 --- a/source/simulator.hpp +++ b/source/simulator.hpp @@ -107,9 +107,9 @@ class Simulator { void recalculate_paths() { for (auto src_device : get_devices()) { RoutingTable routing_table = bfs(src_device); - for (auto [dest_device, links] : routing_table) { + for (auto [dest_device_id, links] : routing_table) { for (auto [link, paths_count]: links) { - src_device->update_routing_table(dest_device, link, paths_count); + src_device->update_routing_table(dest_device_id, link, paths_count); } } } diff --git a/source/utils/algorithms.cpp b/source/utils/algorithms.cpp index 070122dcdd..f8083281bb 100644 --- a/source/utils/algorithms.cpp +++ b/source/utils/algorithms.cpp @@ -41,12 +41,12 @@ RoutingTable bfs(std::shared_ptr& start_device) { wave_front.insert(next_hop); if (curr_device == start_device) { - routing_table[next_hop][link] = 1; + routing_table[next_hop->get_id()][link] = 1; } else { // Here we get all ways to get to the previous device and add them to next hop // This part might be called several times for same device - for (auto [link, paths_count]: routing_table[curr_device]) { - routing_table[next_hop][link] += paths_count; + for (auto [link, paths_count]: routing_table[curr_device->get_id()]) { + routing_table[next_hop->get_id()][link] += paths_count; } } } diff --git a/source/utils/algorithms.hpp b/source/utils/algorithms.hpp index cbd5fc8804..e730baf7f7 100644 --- a/source/utils/algorithms.hpp +++ b/source/utils/algorithms.hpp @@ -8,7 +8,7 @@ namespace sim { using RoutingTable = - std::unordered_map, std::unordered_map, int>>; + std::unordered_map, int>>; // returns start device routing table // Unlike standard BFS that processes nodes one by one, this processes all nodes at the current distance level together. diff --git a/test/device/link_to_device_test.cpp b/test/device/link_to_device_test.cpp index 0d18a55fee..770c8c1b32 100644 --- a/test/device/link_to_device_test.cpp +++ b/test/device/link_to_device_test.cpp @@ -1,6 +1,7 @@ #include #include "utils.hpp" +#include "../utils/fake_packet.hpp" namespace test { @@ -16,7 +17,8 @@ TEST_F(LinkToDevice, NoLinkToDevice) { auto link = std::make_shared(source, dest); dest->add_inlink(link); - EXPECT_EQ(source->get_link_to_destination(dest), nullptr); + auto destPacket = FakePacket(dest); + EXPECT_EQ(source->get_link_to_destination(destPacket), nullptr); } TEST_F(LinkToDevice, LinkIsPresent) { @@ -28,16 +30,16 @@ TEST_F(LinkToDevice, LinkIsPresent) { auto link_neighbour = std::make_shared(TestLink(source, neighbour)); - source->update_routing_table(neighbour, link_neighbour); + source->update_routing_table(neighbour->get_id(), link_neighbour); auto link_dest = std::make_shared(TestLink(source, dest)); - source->update_routing_table(dest, link_dest); + source->update_routing_table(dest->get_id(), link_dest); - EXPECT_EQ(source->get_link_to_destination(dest), link_dest); - EXPECT_EQ(source->get_link_to_destination(neighbour), link_neighbour); - EXPECT_EQ(source->get_link_to_destination(another_dest), nullptr); - source->update_routing_table(another_dest, link_neighbour); + EXPECT_EQ(source->get_link_to_destination(FakePacket(dest)), link_dest); + EXPECT_EQ(source->get_link_to_destination(FakePacket(neighbour)), link_neighbour); + EXPECT_EQ(source->get_link_to_destination(FakePacket(another_dest)), nullptr); + source->update_routing_table(another_dest->get_id(), link_neighbour); - EXPECT_EQ(source->get_link_to_destination(another_dest), link_neighbour); + EXPECT_EQ(source->get_link_to_destination(FakePacket(another_dest)), link_neighbour); } } // namespace test diff --git a/test/device/update_table_test.cpp b/test/device/update_table_test.cpp index cc94b5ac7e..494a8c7d9a 100644 --- a/test/device/update_table_test.cpp +++ b/test/device/update_table_test.cpp @@ -1,6 +1,7 @@ #include #include "utils.hpp" +#include "../utils/fake_packet.hpp" namespace test { @@ -20,13 +21,13 @@ TEST_F(UpdateTable, RouteIsPresent) { auto link_neighbour = std::make_shared(TestLink(source, neighbour)); - EXPECT_EQ(source->get_link_to_destination(dest), nullptr); - EXPECT_EQ(source->get_link_to_destination(another_dest), nullptr); + EXPECT_EQ(source->get_link_to_destination(FakePacket(dest)), nullptr); + EXPECT_EQ(source->get_link_to_destination(FakePacket(another_dest)), nullptr); - source->update_routing_table(dest, link_neighbour); + source->update_routing_table(dest->get_id(), link_neighbour); - EXPECT_EQ(source->get_link_to_destination(dest), link_neighbour); - EXPECT_EQ(source->get_link_to_destination(another_dest), nullptr); + EXPECT_EQ(source->get_link_to_destination(FakePacket(dest)), link_neighbour); + EXPECT_EQ(source->get_link_to_destination(FakePacket(another_dest)), nullptr); } } // namespace test diff --git a/test/link/utils.cpp b/test/link/utils.cpp index 35cb3f5a32..f6794bc236 100644 --- a/test/link/utils.cpp +++ b/test/link/utils.cpp @@ -10,11 +10,13 @@ void LinkTest::SetUp() {} void LinkTest::TearDown() { sim::Scheduler::get_instance().clear(); } +Id DeviceMock::get_id() const { return 0; }; + bool DeviceMock::add_inlink(std::shared_ptr link) { return false; } bool DeviceMock::add_outlink(std::shared_ptr link) { return false; } -bool DeviceMock::update_routing_table(std::shared_ptr dest, +bool DeviceMock::update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count) { return false; } @@ -23,8 +25,7 @@ std::set> DeviceMock::get_outlinks() { return {}; } -std::shared_ptr DeviceMock::get_link_to_destination( - std::shared_ptr device) const { +std::shared_ptr DeviceMock::get_link_to_destination(sim::Packet packet) const { return nullptr; } diff --git a/test/link/utils.hpp b/test/link/utils.hpp index 9d605d6ee9..6b55fbb2ae 100644 --- a/test/link/utils.hpp +++ b/test/link/utils.hpp @@ -18,13 +18,13 @@ class DeviceMock : public sim::IRoutingDevice { public: ~DeviceMock() = default; + Id get_id() const final; bool add_inlink(std::shared_ptr link) final; bool add_outlink(std::shared_ptr link) final; - bool update_routing_table(std::shared_ptr dest, + bool update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count) final; std::shared_ptr next_inlink() final; - std::shared_ptr get_link_to_destination( - std::shared_ptr dest) const final; + std::shared_ptr get_link_to_destination(sim::Packet packet) const final; std::set> get_outlinks() final; }; diff --git a/test/simulator/flow_mock.cpp b/test/simulator/flow_mock.cpp new file mode 100644 index 0000000000..fa795f8283 --- /dev/null +++ b/test/simulator/flow_mock.cpp @@ -0,0 +1,28 @@ +#include "flow_mock.hpp" + +namespace test { + +FlowMock::FlowMock(std::shared_ptr m_receiver) + : m_receiver(m_receiver) {} + +void FlowMock::start(std::uint32_t time) {} +Time FlowMock::create_new_data_packet() { + return 1; +}; +Time FlowMock::put_data_to_device() { + return 1; +}; + +void FlowMock::update(sim::Packet packet, sim::DeviceType type) { + +}; +std::shared_ptr FlowMock::get_sender() const { + return nullptr; +} +std::shared_ptr FlowMock::get_receiver() const { + return m_receiver.lock(); +} + +Id FlowMock::get_id() const { return 42; } + +} // namespace test diff --git a/test/simulator/flow_mock.hpp b/test/simulator/flow_mock.hpp new file mode 100644 index 0000000000..1369d1af96 --- /dev/null +++ b/test/simulator/flow_mock.hpp @@ -0,0 +1,29 @@ +#pragma once +#include "flow.hpp" +#include "device/sender.hpp" + +namespace test { + +class FlowMock : public sim::IFlow { +public: + ~FlowMock() = default; + FlowMock(std::shared_ptr a_receiver); + + void start(Time time) final; + + Time create_new_data_packet() final; + Time put_data_to_device() final; + + void update(sim::Packet packet, sim::DeviceType type) final; + std::uint32_t get_updates_number() const; + + std::shared_ptr get_sender() const final; + std::shared_ptr get_receiver() const final; + + Id get_id() const final; + +private: + std::weak_ptr m_receiver; +}; + +} // namespace test diff --git a/test/simulator/recalculate_paths_test.cpp b/test/simulator/recalculate_paths_test.cpp index 30dd9ad29e..f46890f8f6 100644 --- a/test/simulator/recalculate_paths_test.cpp +++ b/test/simulator/recalculate_paths_test.cpp @@ -2,7 +2,9 @@ #include "device/device.hpp" #include "simulator.hpp" +#include "flow_mock.hpp" #include "utils.hpp" +#include "logger/logger.hpp" namespace test { @@ -29,7 +31,9 @@ static void check_pairwise_reachability( for (auto src : devices) { for (auto dest : devices) { if (src != dest) { - EXPECT_TRUE(check_reachability(src, dest)); + // FlowMock fake_flow = FlowMock(dest); + sim::Packet packet_to_dest = sim::Packet(sim::PacketType::DATA, 0, nullptr, src->get_id(), dest->get_id()); + EXPECT_TRUE(check_reachability(src, packet_to_dest)); } } } diff --git a/test/simulator/utils.cpp b/test/simulator/utils.cpp index 7a275069ac..7f5ea32578 100644 --- a/test/simulator/utils.cpp +++ b/test/simulator/utils.cpp @@ -14,8 +14,8 @@ void add_two_way_links(sim::BasicSimulator& sim, static std::shared_ptr get_next_device( std::shared_ptr curr_device, - std::shared_ptr dest_device) { - auto next_link = curr_device->get_link_to_destination(dest_device); + sim::Packet packet_to_dest) { + auto next_link = curr_device->get_link_to_destination(packet_to_dest); if (next_link == nullptr) { return nullptr; } @@ -23,15 +23,15 @@ static std::shared_ptr get_next_device( } bool check_reachability(std::shared_ptr src_device, - std::shared_ptr dest_device) { + sim::Packet packet_to_dest) { std::set> used; auto curr_device = src_device; - while (curr_device != dest_device) { + while (curr_device->get_id() != packet_to_dest.dest_id) { if (curr_device == nullptr || used.contains(curr_device)) { return false; } used.insert(curr_device); - curr_device = get_next_device(curr_device, dest_device); + curr_device = get_next_device(curr_device, packet_to_dest); } return true; } diff --git a/test/simulator/utils.hpp b/test/simulator/utils.hpp index 9bdd2cf710..fa4adf5a33 100644 --- a/test/simulator/utils.hpp +++ b/test/simulator/utils.hpp @@ -16,6 +16,6 @@ void add_two_way_links(sim::BasicSimulator& sim, std::initializer_list links); bool check_reachability(std::shared_ptr src_device, - std::shared_ptr dest_device); + sim::Packet packet_to_dest); } // namespace test diff --git a/test/switch/receiver_mock.cpp b/test/switch/receiver_mock.cpp index 6176d37b8f..4555ed4571 100644 --- a/test/switch/receiver_mock.cpp +++ b/test/switch/receiver_mock.cpp @@ -14,15 +14,14 @@ bool ReceiverMock::add_outlink(std::shared_ptr link) { return false; } -bool ReceiverMock::update_routing_table(std::shared_ptr dest, +bool ReceiverMock::update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count) { return false; } std::shared_ptr ReceiverMock::next_inlink() { return nullptr; } -std::shared_ptr ReceiverMock::get_link_to_destination( - std::shared_ptr device) const { +std::shared_ptr ReceiverMock::get_link_to_destination(sim::Packet packet) const { return nullptr; } diff --git a/test/switch/receiver_mock.hpp b/test/switch/receiver_mock.hpp index 348bfc7ff0..f048389885 100644 --- a/test/switch/receiver_mock.hpp +++ b/test/switch/receiver_mock.hpp @@ -13,11 +13,10 @@ class ReceiverMock : public sim::IReceiver { bool add_inlink(std::shared_ptr link) final; bool add_outlink(std::shared_ptr link) final; - bool update_routing_table(std::shared_ptr dest, + bool update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count) final; std::shared_ptr next_inlink() final; - std::shared_ptr get_link_to_destination( - std::shared_ptr dest) const final; + std::shared_ptr get_link_to_destination(sim::Packet packet) const final; std::set> get_outlinks() final; Time process() final; diff --git a/test/switch/test_switch.cpp b/test/switch/test_switch.cpp index e8c5bcf485..e11799d2cd 100644 --- a/test/switch/test_switch.cpp +++ b/test/switch/test_switch.cpp @@ -11,6 +11,7 @@ #include "link_mock.hpp" #include "packet.hpp" #include "receiver_mock.hpp" +#include "../utils/fake_packet.hpp" namespace test { @@ -33,24 +34,26 @@ TEST_F(TestSwitch, test_add_incorrect_inlink) { ASSERT_FALSE(switch_device->add_inlink(link)); } -TEST_F(TestSwitch, nullptr_destination_device) { - auto switch_device = std::make_shared(); - auto temp_device = std::make_shared(); - auto link = std::make_shared(switch_device, temp_device); - ASSERT_FALSE(switch_device->update_routing_table(nullptr, link)); -} +// Real system does not know if another device exists or not, so this test is not correct at all +// TEST_F(TestSwitch, nullptr_destination_device) { +// auto switch_device = std::make_shared(); +// auto temp_device = std::make_shared(); +// auto link = std::make_shared(switch_device, temp_device); +// ASSERT_FALSE(switch_device->update_routing_table(nullptr, link)); +// } TEST_F(TestSwitch, nullptr_outlink) { auto switch_device = std::make_shared(); auto temp_device = std::make_shared(); - ASSERT_FALSE(switch_device->update_routing_table(temp_device, nullptr)); + Id fake_id = temp_device->get_id() + switch_device->get_id(); + ASSERT_FALSE(switch_device->update_routing_table(fake_id, nullptr)); } TEST_F(TestSwitch, add_foreign_inlink) { auto switch_device = std::make_shared(); auto temp_device = std::make_shared(); auto link = std::make_shared(temp_device, switch_device); - ASSERT_FALSE(switch_device->update_routing_table(temp_device, link)); + ASSERT_FALSE(switch_device->update_routing_table(temp_device->get_id(), link)); } TEST_F(TestSwitch, test_no_senders) { @@ -115,7 +118,7 @@ void test_senders(size_t senders_count) { // create packets std::vector packets(senders_count); for (size_t i = 0; i < senders_count; i++) { - packets[i] = sim::Packet(sim::PacketType::DATA, i, &flows[i]); + packets[i] = sim::Packet(sim::PacketType::DATA, i, &flows[i], 0, flows[i].get_receiver()->get_id()); } // create links @@ -129,7 +132,7 @@ void test_senders(size_t senders_count) { } std::shared_ptr switch_reciever_link = std::make_shared(switch_device, receiver); - switch_device->update_routing_table(receiver, switch_reciever_link); + switch_device->update_routing_table(receiver->get_id(), switch_reciever_link); // set ingress packets for (size_t i = 0; i < senders_count; i++) { diff --git a/test/utils/fake_packet.hpp b/test/utils/fake_packet.hpp new file mode 100644 index 0000000000..6860d47b6f --- /dev/null +++ b/test/utils/fake_packet.hpp @@ -0,0 +1,16 @@ +#pragma once +#include +#include + +#include "packet.hpp" + +#include "logger/logger.hpp" +namespace test { + +struct FakePacket: public sim::Packet { + FakePacket(std::shared_ptr device) { + dest_id = device->get_id(); + }; +}; + +} // namespace test From 3bf3265b5424eb4a9027e497a8fe739fec848f38 Mon Sep 17 00:00:00 2001 From: Artyom Peshkov Date: Sat, 24 May 2025 01:48:20 +0300 Subject: [PATCH 02/22] fix --- source/device/routing_module.cpp | 3 --- source/packet.hpp | 1 - test/simulator/flow_mock.cpp | 28 ---------------------- test/simulator/flow_mock.hpp | 29 ----------------------- test/simulator/recalculate_paths_test.cpp | 2 -- test/switch/test_switch.cpp | 3 +-- 6 files changed, 1 insertion(+), 65 deletions(-) delete mode 100644 test/simulator/flow_mock.cpp delete mode 100644 test/simulator/flow_mock.hpp diff --git a/source/device/routing_module.cpp b/source/device/routing_module.cpp index 63989d3e70..3659962247 100644 --- a/source/device/routing_module.cpp +++ b/source/device/routing_module.cpp @@ -65,13 +65,11 @@ bool RoutingModule::update_routing_table(Id dest_id, std::shared_ptr link std::shared_ptr RoutingModule::get_link_to_destination(Packet packet) const { auto iterator = m_routing_table.find(packet.dest_id); if (iterator == m_routing_table.end()) { - LOG_ERROR("1"); return nullptr; } const auto& link_map = iterator->second; if (link_map.empty()) { - LOG_ERROR("2"); return nullptr; } @@ -91,7 +89,6 @@ std::shared_ptr RoutingModule::get_link_to_destination(Packet packet) con } } - LOG_ERROR("3"); return nullptr; } diff --git a/source/packet.hpp b/source/packet.hpp index d9559b48b9..be0230fb80 100644 --- a/source/packet.hpp +++ b/source/packet.hpp @@ -8,7 +8,6 @@ namespace sim { class IFlow; -class IRoutingDevice; enum PacketType { ACK, DATA }; diff --git a/test/simulator/flow_mock.cpp b/test/simulator/flow_mock.cpp deleted file mode 100644 index fa795f8283..0000000000 --- a/test/simulator/flow_mock.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include "flow_mock.hpp" - -namespace test { - -FlowMock::FlowMock(std::shared_ptr m_receiver) - : m_receiver(m_receiver) {} - -void FlowMock::start(std::uint32_t time) {} -Time FlowMock::create_new_data_packet() { - return 1; -}; -Time FlowMock::put_data_to_device() { - return 1; -}; - -void FlowMock::update(sim::Packet packet, sim::DeviceType type) { - -}; -std::shared_ptr FlowMock::get_sender() const { - return nullptr; -} -std::shared_ptr FlowMock::get_receiver() const { - return m_receiver.lock(); -} - -Id FlowMock::get_id() const { return 42; } - -} // namespace test diff --git a/test/simulator/flow_mock.hpp b/test/simulator/flow_mock.hpp deleted file mode 100644 index 1369d1af96..0000000000 --- a/test/simulator/flow_mock.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once -#include "flow.hpp" -#include "device/sender.hpp" - -namespace test { - -class FlowMock : public sim::IFlow { -public: - ~FlowMock() = default; - FlowMock(std::shared_ptr a_receiver); - - void start(Time time) final; - - Time create_new_data_packet() final; - Time put_data_to_device() final; - - void update(sim::Packet packet, sim::DeviceType type) final; - std::uint32_t get_updates_number() const; - - std::shared_ptr get_sender() const final; - std::shared_ptr get_receiver() const final; - - Id get_id() const final; - -private: - std::weak_ptr m_receiver; -}; - -} // namespace test diff --git a/test/simulator/recalculate_paths_test.cpp b/test/simulator/recalculate_paths_test.cpp index f46890f8f6..71949ae843 100644 --- a/test/simulator/recalculate_paths_test.cpp +++ b/test/simulator/recalculate_paths_test.cpp @@ -2,7 +2,6 @@ #include "device/device.hpp" #include "simulator.hpp" -#include "flow_mock.hpp" #include "utils.hpp" #include "logger/logger.hpp" @@ -31,7 +30,6 @@ static void check_pairwise_reachability( for (auto src : devices) { for (auto dest : devices) { if (src != dest) { - // FlowMock fake_flow = FlowMock(dest); sim::Packet packet_to_dest = sim::Packet(sim::PacketType::DATA, 0, nullptr, src->get_id(), dest->get_id()); EXPECT_TRUE(check_reachability(src, packet_to_dest)); } diff --git a/test/switch/test_switch.cpp b/test/switch/test_switch.cpp index e11799d2cd..ae26f13da6 100644 --- a/test/switch/test_switch.cpp +++ b/test/switch/test_switch.cpp @@ -45,8 +45,7 @@ TEST_F(TestSwitch, test_add_incorrect_inlink) { TEST_F(TestSwitch, nullptr_outlink) { auto switch_device = std::make_shared(); auto temp_device = std::make_shared(); - Id fake_id = temp_device->get_id() + switch_device->get_id(); - ASSERT_FALSE(switch_device->update_routing_table(fake_id, nullptr)); + ASSERT_FALSE(switch_device->update_routing_table(temp_device->get_id(), nullptr)); } TEST_F(TestSwitch, add_foreign_inlink) { From ab98a0d5226241cab1ec7f592749973be4b68221 Mon Sep 17 00:00:00 2001 From: Artyom Peshkov Date: Sat, 24 May 2025 04:07:21 +0300 Subject: [PATCH 03/22] add hasher --- source/device/routing_module.cpp | 6 ++--- source/device/routing_module.hpp | 2 ++ source/utils/hasher.hpp | 43 ++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 source/utils/hasher.hpp diff --git a/source/device/routing_module.cpp b/source/device/routing_module.cpp index 3659962247..182f28ecb9 100644 --- a/source/device/routing_module.cpp +++ b/source/device/routing_module.cpp @@ -9,7 +9,8 @@ namespace sim { RoutingModule::RoutingModule() - : m_id(IdentifierFactory::get_instance().generate_id()) {} + : m_id(IdentifierFactory::get_instance().generate_id()), + m_hasher() {} Id RoutingModule::get_id() const { return m_id; @@ -78,8 +79,7 @@ std::shared_ptr RoutingModule::get_link_to_destination(Packet packet) con total_weight += weight; } - // TODO: instead of rand use packet header hash (so packets of the same flow go the same path) - int random_value = rand() % total_weight; + int random_value = m_hasher.get_hash(packet) % total_weight; int cumulative_weight = 0; for (const auto& [link, weight] : link_map) { diff --git a/source/device/routing_module.hpp b/source/device/routing_module.hpp index 9072ac6d64..b8c30b529a 100644 --- a/source/device/routing_module.hpp +++ b/source/device/routing_module.hpp @@ -5,6 +5,7 @@ #include "device.hpp" #include "types.hpp" +#include "utils/hasher.hpp" #include "utils/loop_iterator.hpp" namespace sim { @@ -43,6 +44,7 @@ class RoutingModule : public IRoutingDevice { m_next_inlink; Id m_id; + BaseHasher m_hasher; }; } // namespace sim diff --git a/source/utils/hasher.hpp b/source/utils/hasher.hpp new file mode 100644 index 0000000000..54b1bfac91 --- /dev/null +++ b/source/utils/hasher.hpp @@ -0,0 +1,43 @@ +#include + +#include "packet.hpp" + +namespace sim { + +class IHasher { +public: + virtual ~IHasher() = default; + virtual std::uint32_t get_hash(Packet packet) const = 0; +}; + +class RandomHasher : public IHasher { +public: + std::uint32_t get_hash(Packet) const override { + return static_cast(std::rand()); + } +}; + +class BaseHasher : public IHasher { +public: + std::uint32_t get_hash(Packet packet) const override { + std::string flow_id_str = ((packet.flow == nullptr) ? "0" : std::to_string(packet.flow->get_id())); + + std::hash hasher; + std::string header_str = flow_id_str + " " + std::to_string(packet.source_id) + " " + std::to_string(packet.dest_id); + return static_cast(hasher(header_str)); + } +}; + +class SymmetricHasher : public IHasher { +public: + std::uint32_t get_hash(Packet packet) const override { + std::string combined_id_str = std::to_string(packet.source_id ^ packet.dest_id); + std::string flow_id_str = ((packet.flow == nullptr) ? "0" : std::to_string(packet.flow->get_id())); + + std::hash hasher; + std::string header_str = flow_id_str + " " + combined_id_str; + return static_cast(hasher(header_str)); + } +}; + +} // namespace sim From ab4056b95d9af5a6c3feac430bc5364fddaebf79 Mon Sep 17 00:00:00 2001 From: Artyom Peshkov Date: Sat, 24 May 2025 04:47:56 +0300 Subject: [PATCH 04/22] add hasher --- source/device/receiver.hpp | 1 + source/device/routing_module.cpp | 4 ++-- source/device/routing_module.hpp | 5 ++++- source/utils/hasher.cpp | 28 ++++++++++++++++++++++++++++ source/utils/hasher.hpp | 27 ++++++++++----------------- test/device/add_link_test.cpp | 8 ++++---- test/device/link_to_device_test.cpp | 12 ++++++------ test/device/next_inlink_test.cpp | 2 +- test/device/update_table_test.cpp | 8 ++++---- 9 files changed, 60 insertions(+), 35 deletions(-) create mode 100644 source/utils/hasher.cpp diff --git a/source/device/receiver.hpp b/source/device/receiver.hpp index 4e3a3154fe..3b6e5cb58a 100644 --- a/source/device/receiver.hpp +++ b/source/device/receiver.hpp @@ -8,6 +8,7 @@ namespace sim { struct Packet; +class RoutingModule; class IReceiver : public IRoutingDevice, public IProcessingDevice { diff --git a/source/device/routing_module.cpp b/source/device/routing_module.cpp index 182f28ecb9..e195622c09 100644 --- a/source/device/routing_module.cpp +++ b/source/device/routing_module.cpp @@ -10,7 +10,7 @@ namespace sim { RoutingModule::RoutingModule() : m_id(IdentifierFactory::get_instance().generate_id()), - m_hasher() {} + m_hasher(std::make_unique()) {} Id RoutingModule::get_id() const { return m_id; @@ -79,7 +79,7 @@ std::shared_ptr RoutingModule::get_link_to_destination(Packet packet) con total_weight += weight; } - int random_value = m_hasher.get_hash(packet) % total_weight; + int random_value = m_hasher->get_hash(packet) % total_weight; int cumulative_weight = 0; for (const auto& [link, weight] : link_map) { diff --git a/source/device/routing_module.hpp b/source/device/routing_module.hpp index b8c30b529a..62cb1ecc4d 100644 --- a/source/device/routing_module.hpp +++ b/source/device/routing_module.hpp @@ -9,6 +9,9 @@ #include "utils/loop_iterator.hpp" namespace sim { + +struct Packet; +class IHasher; class RoutingModule : public IRoutingDevice { public: @@ -44,7 +47,7 @@ class RoutingModule : public IRoutingDevice { m_next_inlink; Id m_id; - BaseHasher m_hasher; + std::unique_ptr m_hasher; }; } // namespace sim diff --git a/source/utils/hasher.cpp b/source/utils/hasher.cpp new file mode 100644 index 0000000000..c24c82bc2a --- /dev/null +++ b/source/utils/hasher.cpp @@ -0,0 +1,28 @@ +#include + +#include "hasher.hpp" + +namespace sim { + +std::uint32_t RandomHasher::get_hash(Packet) const { + return static_cast(std::rand()); +}; + +std::uint32_t BaseHasher::get_hash(Packet packet) const { + std::string flow_id_str = ((packet.flow == nullptr) ? "0" : std::to_string(packet.flow->get_id())); + + std::hash hasher; + std::string header_str = flow_id_str + " " + std::to_string(packet.source_id) + " " + std::to_string(packet.dest_id); + return static_cast(hasher(header_str)); +}; + +std::uint32_t SymmetricHasher::get_hash(Packet packet) const { + std::string combined_id_str = std::to_string(packet.source_id ^ packet.dest_id); + std::string flow_id_str = ((packet.flow == nullptr) ? "0" : std::to_string(packet.flow->get_id())); + + std::hash hasher; + std::string header_str = flow_id_str + " " + combined_id_str; + return static_cast(hasher(header_str)); +}; + +} // namespace sim diff --git a/source/utils/hasher.hpp b/source/utils/hasher.hpp index 54b1bfac91..79a806b419 100644 --- a/source/utils/hasher.hpp +++ b/source/utils/hasher.hpp @@ -1,3 +1,5 @@ +#pragma once + #include #include "packet.hpp" @@ -12,32 +14,23 @@ class IHasher { class RandomHasher : public IHasher { public: - std::uint32_t get_hash(Packet) const override { - return static_cast(std::rand()); - } + ~RandomHasher() = default; + + std::uint32_t get_hash(Packet) const final; }; class BaseHasher : public IHasher { public: - std::uint32_t get_hash(Packet packet) const override { - std::string flow_id_str = ((packet.flow == nullptr) ? "0" : std::to_string(packet.flow->get_id())); + ~BaseHasher() = default; - std::hash hasher; - std::string header_str = flow_id_str + " " + std::to_string(packet.source_id) + " " + std::to_string(packet.dest_id); - return static_cast(hasher(header_str)); - } + std::uint32_t get_hash(Packet packet) const final; }; class SymmetricHasher : public IHasher { public: - std::uint32_t get_hash(Packet packet) const override { - std::string combined_id_str = std::to_string(packet.source_id ^ packet.dest_id); - std::string flow_id_str = ((packet.flow == nullptr) ? "0" : std::to_string(packet.flow->get_id())); - - std::hash hasher; - std::string header_str = flow_id_str + " " + combined_id_str; - return static_cast(hasher(header_str)); - } + ~SymmetricHasher() = default; + + std::uint32_t get_hash(Packet packet) const final; }; } // namespace sim diff --git a/test/device/add_link_test.cpp b/test/device/add_link_test.cpp index 4a9fbf7f0c..2110bbfc66 100644 --- a/test/device/add_link_test.cpp +++ b/test/device/add_link_test.cpp @@ -18,8 +18,8 @@ class AddLink : public testing::Test { }; TEST_F(AddLink, LinkIsPresent) { - auto source = std::make_shared(sim::RoutingModule()); - auto dest = std::make_shared(sim::RoutingModule()); + auto source = std::make_shared(); + auto dest = std::make_shared(); auto link = std::make_shared(TestLink(source, dest)); EXPECT_EQ(dest->next_inlink(), nullptr); @@ -39,8 +39,8 @@ TEST_F(AddLink, SameLinkMultipleTimes) { size_t NUMBER_OF_LOOPS = 3; auto neighbour_devices = createRoutingModules(NUMBER_OF_NEIGHBOURS); - auto dest = std::make_shared(sim::RoutingModule()); - auto source = std::make_shared(sim::RoutingModule()); + auto dest = std::make_shared(); + auto source = std::make_shared(); std::mt19937 gen(RANDOM_SEED); std::uniform_int_distribution<> dis(1, MAX_LINKS); diff --git a/test/device/link_to_device_test.cpp b/test/device/link_to_device_test.cpp index 770c8c1b32..d105568f1c 100644 --- a/test/device/link_to_device_test.cpp +++ b/test/device/link_to_device_test.cpp @@ -12,8 +12,8 @@ class LinkToDevice : public testing::Test { }; TEST_F(LinkToDevice, NoLinkToDevice) { - auto source = std::make_shared(sim::RoutingModule()); - auto dest = std::make_shared(sim::RoutingModule()); + auto source = std::make_shared(); + auto dest = std::make_shared(); auto link = std::make_shared(source, dest); dest->add_inlink(link); @@ -22,11 +22,11 @@ TEST_F(LinkToDevice, NoLinkToDevice) { } TEST_F(LinkToDevice, LinkIsPresent) { - auto source = std::make_shared(sim::RoutingModule()); - auto neighbour = std::make_shared(sim::RoutingModule()); - auto dest = std::make_shared(sim::RoutingModule()); + auto source = std::make_shared(); + auto neighbour = std::make_shared(); + auto dest = std::make_shared(); auto another_dest = - std::make_shared(sim::RoutingModule()); + std::make_shared(); auto link_neighbour = std::make_shared(TestLink(source, neighbour)); diff --git a/test/device/next_inlink_test.cpp b/test/device/next_inlink_test.cpp index 6705f91f47..526f88bca5 100644 --- a/test/device/next_inlink_test.cpp +++ b/test/device/next_inlink_test.cpp @@ -14,7 +14,7 @@ TEST_F(LinkToDevice, RoundRobin) { int NUMBER_OF_LINKS = 2; int NUMBER_OF_LOOPS = 3; auto sources = createRoutingModules(NUMBER_OF_LINKS); - auto dest = std::make_shared(sim::RoutingModule()); + auto dest = std::make_shared(); auto links = std::vector>(); for (int i = 0; i < NUMBER_OF_LINKS; i++) { diff --git a/test/device/update_table_test.cpp b/test/device/update_table_test.cpp index 494a8c7d9a..d5e6f48144 100644 --- a/test/device/update_table_test.cpp +++ b/test/device/update_table_test.cpp @@ -12,11 +12,11 @@ class UpdateTable : public testing::Test { }; TEST_F(UpdateTable, RouteIsPresent) { - auto source = std::make_shared(sim::RoutingModule()); - auto neighbour = std::make_shared(sim::RoutingModule()); - auto dest = std::make_shared(sim::RoutingModule()); + auto source = std::make_shared(); + auto neighbour = std::make_shared(); + auto dest = std::make_shared(); auto another_dest = - std::make_shared(sim::RoutingModule()); + std::make_shared(); auto link_neighbour = std::make_shared(TestLink(source, neighbour)); From b9ada2f1a543e0ac49957a307c412b9b03b8d3d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9F=D0=B5=D1=88=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2?= <47276660+ArtyomPeshkov@users.noreply.github.com> Date: Sat, 24 May 2025 11:52:58 +0300 Subject: [PATCH 05/22] Update routing_module.cpp --- source/device/routing_module.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/device/routing_module.cpp b/source/device/routing_module.cpp index e195622c09..62f07f81bb 100644 --- a/source/device/routing_module.cpp +++ b/source/device/routing_module.cpp @@ -8,9 +8,9 @@ namespace sim { -RoutingModule::RoutingModule() +RoutingModule::RoutingModule(std::unique_ptr&& a_hasher) : m_id(IdentifierFactory::get_instance().generate_id()), - m_hasher(std::make_unique()) {} + m_hasher(std::move(a_hasher)) {} Id RoutingModule::get_id() const { return m_id; From 0134447968f6c654b4ec34961d557dfb9699e8b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9F=D0=B5=D1=88=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2?= <47276660+ArtyomPeshkov@users.noreply.github.com> Date: Sat, 24 May 2025 11:53:20 +0300 Subject: [PATCH 06/22] Update routing_module.hpp --- source/device/routing_module.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/device/routing_module.hpp b/source/device/routing_module.hpp index 62cb1ecc4d..5a7259967e 100644 --- a/source/device/routing_module.hpp +++ b/source/device/routing_module.hpp @@ -15,7 +15,7 @@ class IHasher; class RoutingModule : public IRoutingDevice { public: - RoutingModule(); + RoutingModule(std::unique_ptr&& a_hasher = std::make_unique()); ~RoutingModule() = default; Id get_id() const final; From 5e374f11c14be9bac8cf15da5d5fa01ee547b399 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9F=D0=B5=D1=88=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2?= <47276660+ArtyomPeshkov@users.noreply.github.com> Date: Sat, 24 May 2025 11:55:37 +0300 Subject: [PATCH 07/22] fix --- source/device/routing_module.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/source/device/routing_module.hpp b/source/device/routing_module.hpp index 5a7259967e..03a9c2384e 100644 --- a/source/device/routing_module.hpp +++ b/source/device/routing_module.hpp @@ -12,6 +12,7 @@ namespace sim { struct Packet; class IHasher; +class BaseHasher; class RoutingModule : public IRoutingDevice { public: From 383905b80681322c358582cc8efb1f4b4fc24d3e Mon Sep 17 00:00:00 2001 From: Artyom Peshkov Date: Sat, 24 May 2025 11:57:46 +0300 Subject: [PATCH 08/22] fix --- source/device/routing_module.cpp | 4 ++-- source/device/routing_module.hpp | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/source/device/routing_module.cpp b/source/device/routing_module.cpp index e195622c09..c66dfaf4eb 100644 --- a/source/device/routing_module.cpp +++ b/source/device/routing_module.cpp @@ -8,9 +8,9 @@ namespace sim { -RoutingModule::RoutingModule() +RoutingModule::RoutingModule(std::unique_ptr a_hasher) : m_id(IdentifierFactory::get_instance().generate_id()), - m_hasher(std::make_unique()) {} + m_hasher(std::move(a_hasher)) {} Id RoutingModule::get_id() const { return m_id; diff --git a/source/device/routing_module.hpp b/source/device/routing_module.hpp index 62cb1ecc4d..ddcf9c0325 100644 --- a/source/device/routing_module.hpp +++ b/source/device/routing_module.hpp @@ -12,10 +12,11 @@ namespace sim { struct Packet; class IHasher; +class BaseHasher; class RoutingModule : public IRoutingDevice { public: - RoutingModule(); + RoutingModule(std::unique_ptr a_hasher = std::make_unique()); ~RoutingModule() = default; Id get_id() const final; From a78dd45db599849fbfd4d30129018667a2a97135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9F=D0=B5=D1=88=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2?= <47276660+ArtyomPeshkov@users.noreply.github.com> Date: Sat, 24 May 2025 11:58:03 +0300 Subject: [PATCH 09/22] fix --- source/device/routing_module.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/device/routing_module.hpp b/source/device/routing_module.hpp index 03a9c2384e..c5b9708c01 100644 --- a/source/device/routing_module.hpp +++ b/source/device/routing_module.hpp @@ -16,7 +16,7 @@ class BaseHasher; class RoutingModule : public IRoutingDevice { public: - RoutingModule(std::unique_ptr&& a_hasher = std::make_unique()); + RoutingModule(std::unique_ptr&& a_hasher = std::move(std::make_unique())); ~RoutingModule() = default; Id get_id() const final; From d195f5f6c6a0b7623b68b318f80cd4842003a8ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9F=D0=B5=D1=88=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2?= <47276660+ArtyomPeshkov@users.noreply.github.com> Date: Sat, 24 May 2025 12:04:20 +0300 Subject: [PATCH 10/22] fix --- source/device/routing_module.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/device/routing_module.hpp b/source/device/routing_module.hpp index ddcf9c0325..b655ef404b 100644 --- a/source/device/routing_module.hpp +++ b/source/device/routing_module.hpp @@ -16,7 +16,7 @@ class BaseHasher; class RoutingModule : public IRoutingDevice { public: - RoutingModule(std::unique_ptr a_hasher = std::make_unique()); + RoutingModule(std::unique_ptr a_hasher = std::unique_ptr(new BaseHasher()))); ~RoutingModule() = default; Id get_id() const final; From 33c7cf085cab531d423a24ad7ab8fcd6c3727a1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9F=D0=B5=D1=88=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2?= <47276660+ArtyomPeshkov@users.noreply.github.com> Date: Sat, 24 May 2025 12:05:50 +0300 Subject: [PATCH 11/22] Update routing_module.hpp --- source/device/routing_module.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/device/routing_module.hpp b/source/device/routing_module.hpp index b655ef404b..83bb4a84f2 100644 --- a/source/device/routing_module.hpp +++ b/source/device/routing_module.hpp @@ -16,7 +16,7 @@ class BaseHasher; class RoutingModule : public IRoutingDevice { public: - RoutingModule(std::unique_ptr a_hasher = std::unique_ptr(new BaseHasher()))); + RoutingModule(std::unique_ptr a_hasher = std::unique_ptr(new BaseHasher())); ~RoutingModule() = default; Id get_id() const final; From 44eed9990cc753592ffdd3bb8b40422ba68d705d Mon Sep 17 00:00:00 2001 From: Artyom Peshkov Date: Sat, 24 May 2025 12:31:43 +0300 Subject: [PATCH 12/22] fix --- source/device/routing_module.cpp | 2 +- source/device/routing_module.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/device/routing_module.cpp b/source/device/routing_module.cpp index c66dfaf4eb..9390b28d6c 100644 --- a/source/device/routing_module.cpp +++ b/source/device/routing_module.cpp @@ -10,7 +10,7 @@ namespace sim { RoutingModule::RoutingModule(std::unique_ptr a_hasher) : m_id(IdentifierFactory::get_instance().generate_id()), - m_hasher(std::move(a_hasher)) {} + m_hasher(std::move(a_hasher ? std::move(a_hasher) : std::make_unique())) {} Id RoutingModule::get_id() const { return m_id; diff --git a/source/device/routing_module.hpp b/source/device/routing_module.hpp index 83bb4a84f2..a8c04988cb 100644 --- a/source/device/routing_module.hpp +++ b/source/device/routing_module.hpp @@ -16,7 +16,7 @@ class BaseHasher; class RoutingModule : public IRoutingDevice { public: - RoutingModule(std::unique_ptr a_hasher = std::unique_ptr(new BaseHasher())); + RoutingModule(std::unique_ptr a_hasher = nullptr); ~RoutingModule() = default; Id get_id() const final; From ddf912971f4621fc6121270a5ef8d26ba2da34a3 Mon Sep 17 00:00:00 2001 From: Artyom Peshkov Date: Sat, 24 May 2025 16:32:09 +0300 Subject: [PATCH 13/22] first steps --- source/express_pass/ep_event.cpp | 25 ++++ source/express_pass/ep_event.hpp | 27 ++++ source/express_pass/ep_flow.cpp | 143 ++++++++++++++++++++ source/express_pass/ep_flow.hpp | 78 +++++++++++ source/express_pass/ep_receiver.cpp | 117 +++++++++++++++++ source/express_pass/ep_receiver.hpp | 38 ++++++ source/express_pass/ep_routing_module.cpp | 130 +++++++++++++++++++ source/express_pass/ep_routing_module.hpp | 53 ++++++++ source/express_pass/ep_sender.cpp | 151 ++++++++++++++++++++++ source/express_pass/ep_sender.hpp | 42 ++++++ source/express_pass/ep_switch.cpp | 85 ++++++++++++ source/express_pass/ep_switch.hpp | 41 ++++++ source/packet.cpp | 9 ++ source/packet.hpp | 2 +- source/scheduler.cpp | 2 +- source/simulator.hpp | 2 +- 16 files changed, 942 insertions(+), 3 deletions(-) create mode 100644 source/express_pass/ep_event.cpp create mode 100644 source/express_pass/ep_event.hpp create mode 100644 source/express_pass/ep_flow.cpp create mode 100644 source/express_pass/ep_flow.hpp create mode 100644 source/express_pass/ep_receiver.cpp create mode 100644 source/express_pass/ep_receiver.hpp create mode 100644 source/express_pass/ep_routing_module.cpp create mode 100644 source/express_pass/ep_routing_module.hpp create mode 100644 source/express_pass/ep_sender.cpp create mode 100644 source/express_pass/ep_sender.hpp create mode 100644 source/express_pass/ep_switch.cpp create mode 100644 source/express_pass/ep_switch.hpp diff --git a/source/express_pass/ep_event.cpp b/source/express_pass/ep_event.cpp new file mode 100644 index 0000000000..0af6532a82 --- /dev/null +++ b/source/express_pass/ep_event.cpp @@ -0,0 +1,25 @@ +#include "event.hpp" +#include "express_pass/ep_event.hpp" + +#include "scheduler.hpp" + +namespace sim { + +SendCredit::SendCredit(Time a_time, std::weak_ptr a_flow, Size a_packet_size) : Event(a_time), m_flow(a_flow), m_packet_size(a_packet_size) {} + +void SendCredit::operator()() { + if (m_flow.expired()) { + return; + } + + Time sending_delay = m_flow.lock()->send_credit(m_time); + if (sending_delay == 0) { + return; + } + + std::unique_ptr new_event = std::make_unique( + m_time + sending_delay, m_flow, m_packet_size); + Scheduler::get_instance().add(std::move(new_event)); +} + +} // namespace sim \ No newline at end of file diff --git a/source/express_pass/ep_event.hpp b/source/express_pass/ep_event.hpp new file mode 100644 index 0000000000..ac1ee1bc11 --- /dev/null +++ b/source/express_pass/ep_event.hpp @@ -0,0 +1,27 @@ +#include "event.hpp" +#include "express_pass/ep_flow.hpp" + +namespace sim { + +class SendCredit : public Event { +public: + SendCredit(Time a_time, std::weak_ptr a_flow, Size a_packet_size); + virtual ~SendCredit() = default; + void operator()() final; + +private: + std::weak_ptr m_flow; + Size m_packet_size; +}; + +class RunFeedbackControlLoop : public Event { +public: + RunFeedbackControlLoop(Time a_time, std::weak_ptr a_flow); + virtual ~RunFeedbackControlLoop() = default; + void operator()() final; + +private: + std::weak_ptr m_flow; +}; + +} // namespace sim \ No newline at end of file diff --git a/source/express_pass/ep_flow.cpp b/source/express_pass/ep_flow.cpp new file mode 100644 index 0000000000..cdf3adf634 --- /dev/null +++ b/source/express_pass/ep_flow.cpp @@ -0,0 +1,143 @@ +#include "express_pass/ep_flow.hpp" + +#include +#include +#include + +#include "scheduler.hpp" +#include "logger/logger.hpp" +#include "express_pass/ep_event.hpp" + +namespace sim { + +EPFlow::EPFlow(std::shared_ptr a_src, std::shared_ptr a_dest, + Size a_packet_size, Time a_delay_between_packets, + std::uint32_t a_packets_to_send) + : m_src(a_src), + m_dest(a_dest), + m_sender_status(SenderStatus::CREDIT_STOP_S), + m_receiver_status(ReceiverStatus::CREDIT_STOP_R), + m_packet_size(a_packet_size), + m_delay_between_packets(a_delay_between_packets), + m_packets_to_send(a_packets_to_send), + m_id(IdentifierFactory::get_instance().generate_id()) { + auto link = m_dest.lock()->get_link_to_destination(generate_packet(PacketType::CREDIT, true)); + m_max_rate = (double)(m_packet_size + m_system_packet_size) / 10.0; // TODO: / link.get_speed(); + } + +void EPFlow::schedule_packet_generation(Time time) { + auto generate_event_ptr = + std::make_unique(time, shared_from_this(), m_packet_size); + Scheduler::get_instance().add(std::move(generate_event_ptr)); +} + +Packet EPFlow::generate_packet(PacketType type, bool from_receiver, std::uint32_t packet_num, Time RTT) { + sim::Packet packet; + packet.type = type; + if (type == PacketType::DATA) { + packet.size_byte = m_packet_size; + } else { + packet.size_byte = m_system_packet_size; + } + packet.flow = this; + packet.source_id = (from_receiver ? m_dest.lock()->get_id() : m_src.lock()->get_id()); + packet.dest_id = (from_receiver ? m_src.lock()->get_id() : m_dest.lock()->get_id()); + packet.packet_num = packet_num; + packet.RTT = RTT; + return packet; +} + +std::uint32_t EPFlow::get_next_packet_num() { + return m_current_packet_num++; +} + +void EPFlow::start(Time time) { + schedule_packet_generation(time); + + sim::Packet packet = generate_packet(PacketType::CREDIT_REQUEST, false); + m_src.lock()->send_system_packet(time, packet); + m_sender_status = SenderStatus::CREQ_SENT; +} + +Time EPFlow::send_credit(Time time) { + if (m_stopped) { + return 0; + } + + auto packet = generate_packet(PacketType::CREDIT, true, get_next_packet_num(), time); + m_dest.lock()->send_system_packet(time, packet); + int rnd_part = (std::rand() % 209) - 104; + // std::cout << get_id() << ": " << packet.packet_num << " jitter: " << rnd_part << std::endl; + + return m_max_rate + rnd_part; //m_current_rate * m_max_rate; + +} + +// feedback control launch once per RTT (scheduled by event) + +void EPFlow::update(Packet packet, DeviceType type) { + if (packet.type == PacketType::CREDIT_REQUEST && type == DeviceType::RECEIVER && m_receiver_status == ReceiverStatus::CREDIT_STOP_R) { + m_receiver_status = ReceiverStatus::CREDIT_SENDING; + auto send_credit_event_ptr = + std::make_unique(time, shared_from_this(), m_system_packet_size); + Scheduler::get_instance().add(std::move(send_credit_event_ptr)); + } + else if (packet.type == PacketType::CREDIT_STOP_P && type == DeviceType::RECEIVER && m_receiver_status == ReceiverStatus::CREDIT_SENDING) { + m_receiver_status = ReceiverStatus::CREDIT_STOP_R; + m_stopped = true; + } + else if (packet.type == PacketType::DATA && type == DeviceType::RECEIVER) { + // calculate data statistics + // check corresponding credit id and update state + LOG_INFO("Got DATA " + std::to_string(get_id())); + } else if (packet.type == PacketType::CREDIT && type == DeviceType::SENDER) { + if (m_sender_status != SenderStatus::CREQ_SENT && m_sender_status != SenderStatus::CREDIT_RECEIVING) { + LOG_ERROR("Unexpected sender status when got credit"); + return; + } + if (m_sender_status == SenderStatus::CREQ_SENT) { + m_sender_status = SenderStatus::CREDIT_RECEIVING; + } + + if (m_sending_buffer.empty()) { + m_sender_status = SenderStatus::CSTOP_SENT; + + auto packet = generate_packet(PacketType::CREDIT_STOP_P, false); + m_src.lock()->send_system_packet(packet); + } else { + m_sending_buffer.front().RTT = packet.RTT; + m_sending_buffer.front().packet_num = packet.packet_num; + put_data_to_device(); + } + } + else { + LOG_ERROR("Unexpected update state"); + } +} + + +Time EPFlow::create_new_data_packet() { + if (m_packets_to_send == 0) { + return 0; + } + --m_packets_to_send; + Packet data = generate_packet(PacketType::DATA); + LOG_INFO("Created packet: " + data.to_string()); + m_sending_buffer.push(data); + return m_delay_between_packets; +} + +Time EPFlow::put_data_to_device() { + m_src.lock()->enqueue_packet(m_sending_buffer.front()); + LOG_INFO("Put data to device: " + m_sending_buffer.front().to_string()); + m_sending_buffer.pop(); + return m_delay_between_packets; +} + +std::shared_ptr EPFlow::get_sender() const { return m_src.lock(); } + +std::shared_ptr EPFlow::get_receiver() const { return m_dest.lock(); } + +Id EPFlow::get_id() const { return m_id; } + +} // namespace sim \ No newline at end of file diff --git a/source/express_pass/ep_flow.hpp b/source/express_pass/ep_flow.hpp new file mode 100644 index 0000000000..8d5b20ef64 --- /dev/null +++ b/source/express_pass/ep_flow.hpp @@ -0,0 +1,78 @@ +#pragma once +#include + +#include "flow.hpp" +#include "packet.hpp" +#include "express_pass/ep_receiver.hpp" +#include "express_pass/ep_sender.hpp" +#include "utils/identifier_factory.hpp" + +namespace sim { + +class IReceiver; +class ISender; + +enum SenderStatus { + CREDIT_STOP_S, + CREQ_SENT, + CREDIT_RECEIVING, + CSTOP_SENT +}; + +enum ReceiverStatus { + CREDIT_STOP_R, + CREDIT_SENDING +}; + +class EPFlow : public IFlow, public std::enable_shared_from_this { +public: + EPFlow(std::shared_ptr a_src, std::shared_ptr a_dest, + Size a_packet_size, Time a_delay_between_packets, + std::uint32_t a_packets_to_send); + virtual ~EPFlow() = default; + + // Start at time + void start(Time time) final; + + Time create_new_data_packet() final; + Time put_data_to_device() final; + + // Update the internal state according to some congestion control algorithm + // Call try_to_generate upon the update + void update(Packet packet, DeviceType type) final; + + std::shared_ptr get_sender() const final; + std::shared_ptr get_receiver() const final; + + Time send_credit(Time time); + + Id get_id() const final; + +private: + void schedule_packet_generation(Time time); + Packet generate_packet(PacketType type, bool from_receiver = false, std::uint32_t packet_num = 0, Time RTT = 0); + void sender_send_stop(); + std::uint32_t get_next_packet_num(); + + std::weak_ptr m_src; + std::weak_ptr m_dest; + SenderStatus m_sender_status; + ReceiverStatus m_receiver_status; + + Size m_packet_size; + Time m_delay_between_packets; + std::uint32_t m_packets_to_send; + double m_max_rate; + + bool m_stopped = false; + int m_last_received_credit = 0; + std::uint32_t m_current_packet_num = 0; + Size m_system_packet_size = 64; + double m_current_rate = 1.0 / 8.0; + double w = 1.0 / 2.0; + + std::queue m_sending_buffer; + Id m_id; +}; + +} // namespace sim \ No newline at end of file diff --git a/source/express_pass/ep_receiver.cpp b/source/express_pass/ep_receiver.cpp new file mode 100644 index 0000000000..1f554e8ea1 --- /dev/null +++ b/source/express_pass/ep_receiver.cpp @@ -0,0 +1,117 @@ +#include "ep_receiver.hpp" + +#include + +// #include "event.hpp" +// #include "link.hpp" +// #include "logger/logger.hpp" +// #include "utils/identifier_factory.hpp" +#include "scheduler.hpp" +#include "utils/validation.hpp" + +namespace sim { + +EPReceiver::EPReceiver() + : m_router(std::make_unique()) {} + +bool EPReceiver::add_inlink(std::shared_ptr link) { + if (!is_valid_link(link)) { + return false; + } + return m_router->add_inlink(link); +} + +bool EPReceiver::add_outlink(std::shared_ptr link) { + if (!is_valid_link(link)) { + return false; + } + return m_router->add_outlink(link); +} + +bool EPReceiver::update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count) { + if (!is_valid_link(link)) { + return false; + } + return m_router->update_routing_table(dest_id, link, paths_count); +} + +std::shared_ptr EPReceiver::next_inlink() { + return m_router->next_inlink(); +}; + +std::shared_ptr EPReceiver::get_link_to_destination(Packet packet) const { + return m_router->get_link_to_destination(packet); +}; + +DeviceType EPReceiver::get_type() const { return DeviceType::RECEIVER; } + +Time EPReceiver::process() { + std::shared_ptr current_inlink = next_inlink(); + Time total_processing_time = 1; + + if (current_inlink == nullptr) { + LOG_WARN("No available inlinks for device"); + return total_processing_time; + } + + std::optional opt_packet = current_inlink->get_packet(); + if (!opt_packet.has_value()) { + LOG_WARN("No available packets from inlink for device"); + return total_processing_time; + } + + Packet packet = opt_packet.value(); + if (packet.flow == nullptr) { + LOG_ERROR("Packet flow does not exist"); + return total_processing_time; + } + + // TODO: add some receiver ID for easier packet path tracing + LOG_INFO("Processing packet from link on receiver. Packet: " + + packet.to_string() + ". Receiver id: " + std::to_string(get_id()) + ". Time: " + std::to_string(Scheduler::get_instance().get_current_time())); + + if (packet.dest_id == get_id()) { + // TODO: think about processing time + packet.flow->update(packet, get_type()); + } else { + LOG_WARN( + "Packet arrived to EPReceiver that is not its destination; using " + "routing table to send it further"); + std::shared_ptr next_link = get_link_to_destination(packet); + + if (next_link == nullptr) { + LOG_WARN("No link corresponds to destination device"); + return total_processing_time; + } + next_link->schedule_arrival(packet); + // TODO: think about redirecting time + } + + return total_processing_time; +} + +Time EPReceiver::send_system_packet(Packet packet) { + Time total_processing_time = 1; + + auto next_link = get_link_to_destination(packet); + if (next_link == nullptr) { + LOG_WARN("Link to send packet does not exist. Packet: " + packet.to_string()); + return total_processing_time; + } + + // TODO: add some sender ID for easier packet path tracing + LOG_INFO("Sent new system packet from receiver. Data packet: " + + packet.to_string() + ". Receiver id: " + std::to_string(get_id()) + ". Time: " + std::to_string(Scheduler::get_instance().get_current_time())); + + next_link->schedule_arrival(packet); + // total_processing_time += sending_data_time; + return total_processing_time; +} + +std::set> EPReceiver::get_outlinks() { + return m_router->get_outlinks(); +} + +Id EPReceiver::get_id() const { return m_router->get_id(); } + +} // namespace sim diff --git a/source/express_pass/ep_receiver.hpp b/source/express_pass/ep_receiver.hpp new file mode 100644 index 0000000000..dbccfd2913 --- /dev/null +++ b/source/express_pass/ep_receiver.hpp @@ -0,0 +1,38 @@ +#pragma once +#include + +#include "device/receiver.hpp" + +namespace sim { + +class EPReceiver : public IReceiver, + public std::enable_shared_from_this { +public: + EPReceiver(); + ~EPReceiver() = default; + + bool add_inlink(std::shared_ptr link) final; + bool add_outlink(std::shared_ptr link) final; + bool update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count = 1) final; + std::shared_ptr next_inlink() final; + std::shared_ptr get_link_to_destination(Packet packet) const final; + std::set> get_outlinks() final; + + DeviceType get_type() const final; + // Process a packet by removing it from the ingress buffer + // Send an ACK to the egress buffer + // and schedule next receive event after a delay. + // Upon receiving send an ACK to the sender. + // Packets are taken from ingress buffers on a round-robin basis. + // The iterator over ingress buffers is stored in m_next_link. + Time process() final; + Time send_system_packet(Packet packet); + + Id get_id() const final; + +private: + Time send_ack(Packet data_packet); + std::unique_ptr m_router; +}; + +} // namespace sim diff --git a/source/express_pass/ep_routing_module.cpp b/source/express_pass/ep_routing_module.cpp new file mode 100644 index 0000000000..8214a145e6 --- /dev/null +++ b/source/express_pass/ep_routing_module.cpp @@ -0,0 +1,130 @@ +// #include "routing_module.hpp" + +// #include +// #include + +// #include "link.hpp" +// #include "logger/logger.hpp" + +// namespace sim { + +// RoutingModule::RoutingModule() +// : m_id(IdentifierFactory::get_instance().generate_id()), +// m_hasher(std::make_unique()) {} + +// Id RoutingModule::get_id() const { +// return m_id; +// } + +// bool RoutingModule::add_inlink(std::shared_ptr link) { +// if (m_id != link->get_to()->get_id()) { +// LOG_WARN( +// "Link destination device is incorrect (expected current device)"); +// return false; +// } +// if (m_inlinks.contains(link)) { +// LOG_WARN("Unexpected already added inlink"); +// return false; +// } +// m_inlinks.insert(link); +// m_next_inlink = +// LoopIterator, +// std::owner_less>>::iterator>( +// m_inlinks.begin(), m_inlinks.end()); +// return true; +// } + +// bool RoutingModule::add_outlink(std::shared_ptr link) { +// if (m_id != link->get_from()->get_id()) { +// LOG_WARN("Outlink source is not our device"); +// return false; +// } +// if (m_outlinks.contains(link)) { +// LOG_WARN("Unexpected already added outlink"); +// return false; +// } +// m_outlinks.insert(link); +// return true; +// } + +// bool RoutingModule::update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count) { +// if (m_id != link->get_from()->get_id()) { +// LOG_WARN("Link source device is incorrect (expected current device)"); +// return false; +// } +// if (link == nullptr) { +// LOG_WARN("Unexpected nullptr link"); +// return false; +// } +// auto link_dest = link->get_to(); + +// // TODO: discuss storing weak_ptrs instead of shared +// m_routing_table[dest_id][link] += paths_count; +// return true; +// } + +// std::shared_ptr RoutingModule::get_link_to_destination(Packet packet) const { +// auto iterator = m_routing_table.find(packet.dest_id); +// if (iterator == m_routing_table.end()) { +// return nullptr; +// } + +// const auto& link_map = iterator->second; +// if (link_map.empty()) { +// return nullptr; +// } + +// int total_weight = 0; +// for (const auto& [link, weight] : link_map) { +// total_weight += weight; +// } + +// int random_value = m_hasher->get_hash(packet) % total_weight; + +// int cumulative_weight = 0; +// for (const auto& [link, weight] : link_map) { +// cumulative_weight += weight; +// if (random_value < cumulative_weight) { +// return link.lock(); +// } +// } + +// return nullptr; +// } + +// std::shared_ptr RoutingModule::next_inlink() { +// if (m_inlinks.empty()) { +// LOG_INFO("Inlinks storage is empty"); +// return nullptr; +// } +// auto inlink = *m_next_inlink++; +// if (inlink.expired()) { +// correctify_inlinks(); +// return next_inlink(); +// } +// return inlink.lock(); +// } + +// std::set> RoutingModule::get_outlinks() { +// correctify_outlinks(); +// std::set> shared_outlinks; +// std::transform(m_outlinks.begin(), m_outlinks.end(), +// std::inserter(shared_outlinks, shared_outlinks.begin()), +// [](auto link) { return link.lock(); }); +// return shared_outlinks; +// } + +// void RoutingModule::correctify_inlinks() { +// std::size_t erased_count = std::erase_if( +// m_inlinks, [](std::weak_ptr link) { return link.expired(); }); +// if (erased_count > 0) { +// m_next_inlink = LoopIterator(m_inlinks.begin(), m_inlinks.end()); +// } +// } + +// void RoutingModule::correctify_outlinks() { +// std::erase_if(m_outlinks, +// [](std::weak_ptr link) { return link.expired(); }); +// } + +// } // namespace sim diff --git a/source/express_pass/ep_routing_module.hpp b/source/express_pass/ep_routing_module.hpp new file mode 100644 index 0000000000..62cb1ecc4d --- /dev/null +++ b/source/express_pass/ep_routing_module.hpp @@ -0,0 +1,53 @@ +#pragma once + +#include +#include + +#include "device.hpp" +#include "types.hpp" +#include "utils/hasher.hpp" +#include "utils/loop_iterator.hpp" + +namespace sim { + +struct Packet; +class IHasher; + +class RoutingModule : public IRoutingDevice { +public: + RoutingModule(); + ~RoutingModule() = default; + + Id get_id() const final; + bool add_inlink(std::shared_ptr link) final; + bool add_outlink(std::shared_ptr link) final; + bool update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count = 1) final; + // returns next inlink and moves inlinks set iterator forward + std::shared_ptr next_inlink() final; + std::shared_ptr get_link_to_destination(Packet packet) const final; + std::set> get_outlinks() final; + + void correctify_inlinks(); + void correctify_outlinks(); + +private: + // Ordered set as we need to iterate over the ingress buffers + std::set, std::owner_less>> + m_inlinks; + + std::set, std::owner_less>> + m_outlinks; + + // A routing table: maps the final destination to a specific link + std::unordered_map> m_routing_table; + + // Iterator for the next ingress to process + LoopIterator, + std::owner_less>>::iterator> + m_next_inlink; + + Id m_id; + std::unique_ptr m_hasher; +}; + +} // namespace sim diff --git a/source/express_pass/ep_sender.cpp b/source/express_pass/ep_sender.cpp new file mode 100644 index 0000000000..f1ba736037 --- /dev/null +++ b/source/express_pass/ep_sender.cpp @@ -0,0 +1,151 @@ +#include "express_pass/ep_sender.hpp" + +#include + +#include + +// #include "event.hpp" +// #include "link.hpp" +// #include "logger/logger.hpp" +#include "scheduler.hpp" +#include "utils/validation.hpp" + +namespace sim { + +EPSender::EPSender() + : m_router(std::make_unique()) {} + +bool EPSender::add_inlink(std::shared_ptr link) { + if (!is_valid_link(link)) { + return false; + } + return m_router->add_inlink(link); +} + +bool EPSender::add_outlink(std::shared_ptr link) { + if (!is_valid_link(link)) { + return false; + } + m_router->add_outlink(link); + return true; +} + +bool EPSender::update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count) { + if (!is_valid_link(link)) { + return false; + } + m_router->update_routing_table(dest_id, link, paths_count); + return true; +} + +std::shared_ptr EPSender::next_inlink() { + return m_router->next_inlink(); +}; + +std::shared_ptr EPSender::get_link_to_destination(Packet packet) const { + return m_router->get_link_to_destination(packet); +}; + +DeviceType EPSender::get_type() const { return DeviceType::SENDER; } + +void EPSender::enqueue_packet(Packet packet) { + m_flow_buffer.push(packet); + LOG_INFO(fmt::format("Packet {} arrived to sender", packet.to_string())); +} + +Time EPSender::process() { + std::shared_ptr current_inlink = next_inlink(); + Time total_processing_time = 1; + + if (current_inlink == nullptr) { + LOG_WARN("No available inlinks for device"); + return total_processing_time; + } + + std::optional opt_packet = current_inlink->get_packet(); + if (!opt_packet.has_value()) { + LOG_WARN("No available packets from inlink for device"); + return total_processing_time; + } + + Packet packet = opt_packet.value(); + if (packet.flow == nullptr) { + LOG_ERROR("Packet flow does not exist"); + return total_processing_time; + } + + LOG_INFO("Processing packet from link on sender. Packet: " + + packet.to_string() + ". Sender id: " + std::to_string(get_id()) + ". Time: " + std::to_string(Scheduler::get_instance().get_current_time())); + + if (packet.dest_id == get_id()) { + packet.flow->update(packet, get_type()); + } else { + LOG_WARN( + "Packet arrived to EPSender that is not its destination; use routing " + "table to send it further"); + std::shared_ptr next_link = get_link_to_destination(packet); + + if (next_link == nullptr) { + LOG_WARN("No link corresponds to destination device"); + return total_processing_time; + } + next_link->schedule_arrival(packet); + } + // total_processing_time += processing_ack_time; + + return total_processing_time; +} + +Time EPSender::send_data() { + Time total_processing_time = 1; + + // TODO: wrap packet getting into some method (?) + if (m_flow_buffer.empty()) { + LOG_WARN("No packets to send"); + return total_processing_time; + } + Packet data_packet = m_flow_buffer.front(); + m_flow_buffer.pop(); + + LOG_INFO("Taken new data packet on sender. Packet: " + + data_packet.to_string() + ". Sender id: " + std::to_string(get_id()) + ". Time: " + std::to_string(Scheduler::get_instance().get_current_time())); + + auto next_link = get_link_to_destination(data_packet); + if (next_link == nullptr) { + LOG_WARN("Link to send data packet does not exist"); + return total_processing_time; + } + + LOG_INFO("Sent new data packet from sender. Data packet: " + + data_packet.to_string() + ". Sender id: " + std::to_string(get_id()) + ". Time: " + std::to_string(Scheduler::get_instance().get_current_time())); + + next_link->schedule_arrival(data_packet); + // total_processing_time += sending_data_time; + return total_processing_time; +} + +Time EPSender::send_system_packet(Packet packet) { + Time total_processing_time = 1; + + auto next_link = get_link_to_destination(packet); + if (next_link == nullptr) { + LOG_WARN("Link to send packet does not exist"); + return total_processing_time; + } + + // TODO: add some sender ID for easier packet path tracing + LOG_INFO("Sent new system packet from sender. Data packet: " + + packet.to_string() + ". Sender id: " + std::to_string(get_id()) + ". Time: " + std::to_string(Scheduler::get_instance().get_current_time())); + + next_link->schedule_arrival(packet); + // total_processing_time += sending_data_time; + return total_processing_time; +} + +std::set> EPSender::get_outlinks() { + return m_router->get_outlinks(); +} + +Id EPSender::get_id() const { return m_router->get_id(); } + +} // namespace sim diff --git a/source/express_pass/ep_sender.hpp b/source/express_pass/ep_sender.hpp new file mode 100644 index 0000000000..b5abba3191 --- /dev/null +++ b/source/express_pass/ep_sender.hpp @@ -0,0 +1,42 @@ +#pragma once +#include +#include + +#include "device/sender.hpp" + +namespace sim { + +class EPSender : public ISender, public std::enable_shared_from_this { +public: + EPSender(); + ~EPSender() = default; + + bool add_inlink(std::shared_ptr link) final; + bool add_outlink(std::shared_ptr link) final; + bool update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count = 1) final; + std::shared_ptr next_inlink() final; + std::shared_ptr get_link_to_destination(Packet packet) const final; + std::set> get_outlinks() final; + + DeviceType get_type() const final; + // Process an ACK by removing it from the ingress buffer, + // update the flow state, + // and schedule next ACK processing event after a delay. + // Send the next packet: dequeue from the flow buffer + // and move it to the egress port (link) + // ACKs are taken from ingress buffers on a round-robin basis. + // The iterator over ingress buffers is stored in m_next_link. + Time process() final; + Time send_data() final; + Time send_system_packet(Packet packet); + + void enqueue_packet(Packet packet) final; + + Id get_id() const final; + +private: + std::queue m_flow_buffer; + std::unique_ptr m_router; +}; + +} // namespace sim diff --git a/source/express_pass/ep_switch.cpp b/source/express_pass/ep_switch.cpp new file mode 100644 index 0000000000..8ce815b813 --- /dev/null +++ b/source/express_pass/ep_switch.cpp @@ -0,0 +1,85 @@ +// #include "switch.hpp" + +// #include + +// #include "link.hpp" +// #include "logger/logger.hpp" +// #include "utils/validation.hpp" + +// namespace sim { + +// Switch::Switch() +// : m_router(std::make_unique()) {} + +// bool Switch::add_inlink(std::shared_ptr link) { +// if (!is_valid_link(link)) { +// return false; +// } +// return m_router->add_inlink(link); +// } + +// bool Switch::add_outlink(std::shared_ptr link) { +// if (!is_valid_link(link)) { +// return false; +// } +// return m_router->add_outlink(link); +// } + +// bool Switch::update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count) { +// if (!is_valid_link(link)) { +// return false; +// } +// return m_router->update_routing_table(dest_id, link, paths_count); +// } + +// std::shared_ptr Switch::next_inlink() { return m_router->next_inlink(); } + +// std::shared_ptr Switch::get_link_to_destination(Packet packet) const { +// return m_router->get_link_to_destination(packet); +// } + +// DeviceType Switch::get_type() const { return DeviceType::SWITCH; } + +// Time Switch::process() { +// Time total_processing_time = 1; +// std::shared_ptr link = next_inlink(); + +// if (link == nullptr) { +// LOG_WARN("No next inlink"); +// return total_processing_time; +// } + +// std::optional optional_packet = link->get_packet(); +// if (!optional_packet.has_value()) { +// LOG_WARN("No packet in link"); +// return total_processing_time; +// } +// Packet packet = optional_packet.value(); +// if (packet.flow == nullptr) { +// LOG_WARN("No flow in packet"); +// return total_processing_time; +// } + +// std::shared_ptr next_link = get_link_to_destination(packet); + +// if (next_link == nullptr) { +// LOG_WARN("No link corresponds to destination device"); +// return total_processing_time; +// } + +// // TODO: add some switch ID for easier packet path tracing +// LOG_INFO("Processing packet from link on switch. Packet: " + +// packet.to_string()); + +// // TODO: increase total_processing_time correctly +// next_link->schedule_arrival(packet); +// return total_processing_time; +// } + +// std::set> Switch::get_outlinks() { +// return m_router->get_outlinks(); +// } + +// Id Switch::get_id() const { return m_router->get_id(); } + +// } // namespace sim diff --git a/source/express_pass/ep_switch.hpp b/source/express_pass/ep_switch.hpp new file mode 100644 index 0000000000..94e95e2b1e --- /dev/null +++ b/source/express_pass/ep_switch.hpp @@ -0,0 +1,41 @@ +// #pragma once + +// #include + +// #include "routing_module.hpp" +// #include "utils/identifier_factory.hpp" + +// namespace sim { + +// class ISwitch : public IRoutingDevice, +// public IProcessingDevice { +// public: +// virtual ~ISwitch() = default; +// }; + +// class Switch : public ISwitch, public std::enable_shared_from_this { +// public: +// Switch(); +// ~Switch() = default; + +// bool add_inlink(std::shared_ptr link) final; +// bool add_outlink(std::shared_ptr link) final; +// bool update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count = 1) final; +// std::shared_ptr next_inlink() final; +// std::shared_ptr get_link_to_destination(Packet packet) const final; +// std::set> get_outlinks() final; + +// DeviceType get_type() const final; +// // Process a packet by moving it from ingress to egress +// // and schedule next process event after a delay. +// // Packets are taken from ingress buffers on a round-robin basis. +// // The iterator over ingress buffers is stored in m_next_link. +// Time process() final; + +// Id get_id() const final; + +// private: +// std::unique_ptr m_router; +// }; + +// } // namespace sim diff --git a/source/packet.cpp b/source/packet.cpp index e51e0cc3fa..4b9aa86061 100644 --- a/source/packet.cpp +++ b/source/packet.cpp @@ -27,6 +27,15 @@ std::string Packet::to_string() const { case PacketType::DATA: oss << "DATA"; break; + case PacketType::CREDIT: + oss << "CREDIT"; + break; + case PacketType::CREDIT_REQUEST: + oss << "CREQ"; + break; + case PacketType::CREDIT_STOP_P: + oss << "CSTOP"; + break; default: oss << "UNKNOWN"; break; diff --git a/source/packet.hpp b/source/packet.hpp index be0230fb80..f2beb6ca78 100644 --- a/source/packet.hpp +++ b/source/packet.hpp @@ -9,7 +9,7 @@ namespace sim { class IFlow; -enum PacketType { ACK, DATA }; +enum PacketType { ACK, DATA, CREDIT_REQUEST, CREDIT, CREDIT_STOP_P }; struct Packet { Packet(PacketType a_type = PacketType::DATA, Size a_size_byte = 0, diff --git a/source/scheduler.cpp b/source/scheduler.cpp index be845d0fc8..7d26fe94b4 100644 --- a/source/scheduler.cpp +++ b/source/scheduler.cpp @@ -29,6 +29,6 @@ void Scheduler::clear() { EventComparator>(); } -Time Scheduler::get_current_time() { return m_current_event_local_time; }; +static Time Scheduler::get_current_time() { return m_current_event_local_time; }; } // namespace sim diff --git a/source/simulator.hpp b/source/simulator.hpp index b245dac710..13e6c18c48 100644 --- a/source/simulator.hpp +++ b/source/simulator.hpp @@ -70,7 +70,7 @@ class Simulator { Time delay_between_packets, std::uint32_t packets_to_send) { auto flow = - std::make_shared(sender, receiver, packet_size, + std::make_shared(sender, receiver, packet_size, delay_between_packets, packets_to_send); m_flows.emplace_back(flow); return flow; From 8dc72880213dc4992493e8bc805a94458217d2bf Mon Sep 17 00:00:00 2001 From: Artyom Peshkov Date: Wed, 28 May 2025 01:22:14 +0300 Subject: [PATCH 14/22] done --- source/express_pass/ep_event.cpp | 19 ++- source/express_pass/ep_event.hpp | 2 +- source/express_pass/ep_flow.cpp | 119 +++++++++++++++--- source/express_pass/ep_flow.hpp | 42 +++++-- source/express_pass/ep_link.cpp | 146 ++++++++++++++++++++++ source/express_pass/ep_link.hpp | 62 +++++++++ source/express_pass/ep_receiver.cpp | 9 +- source/express_pass/ep_receiver.hpp | 6 +- source/express_pass/ep_routing_module.hpp | 96 +++++++------- source/express_pass/ep_sender.cpp | 5 +- source/scheduler.cpp | 2 +- source/simulator.cpp | 2 + source/simulator.hpp | 20 ++- 13 files changed, 435 insertions(+), 95 deletions(-) create mode 100644 source/express_pass/ep_link.cpp create mode 100644 source/express_pass/ep_link.hpp diff --git a/source/express_pass/ep_event.cpp b/source/express_pass/ep_event.cpp index 0af6532a82..c04d8c086e 100644 --- a/source/express_pass/ep_event.cpp +++ b/source/express_pass/ep_event.cpp @@ -12,7 +12,7 @@ void SendCredit::operator()() { return; } - Time sending_delay = m_flow.lock()->send_credit(m_time); + Time sending_delay = m_flow.lock()->send_credit(); if (sending_delay == 0) { return; } @@ -22,4 +22,21 @@ void SendCredit::operator()() { Scheduler::get_instance().add(std::move(new_event)); } +RunFeedbackControlLoop::RunFeedbackControlLoop(Time a_time, std::weak_ptr a_flow) : Event(a_time), m_flow(a_flow) {} + +void RunFeedbackControlLoop::operator()() { + if (m_flow.expired()) { + return; + } + + Time rtt = m_flow.lock()->feedback_control_loop(); + if (rtt == 0) { + return; + } + + std::unique_ptr new_event = std::make_unique( + m_time + rtt, m_flow); + Scheduler::get_instance().add(std::move(new_event)); +} + } // namespace sim \ No newline at end of file diff --git a/source/express_pass/ep_event.hpp b/source/express_pass/ep_event.hpp index ac1ee1bc11..5621e01188 100644 --- a/source/express_pass/ep_event.hpp +++ b/source/express_pass/ep_event.hpp @@ -21,7 +21,7 @@ class RunFeedbackControlLoop : public Event { void operator()() final; private: - std::weak_ptr m_flow; + std::weak_ptr m_flow; }; } // namespace sim \ No newline at end of file diff --git a/source/express_pass/ep_flow.cpp b/source/express_pass/ep_flow.cpp index cdf3adf634..6a4b402fac 100644 --- a/source/express_pass/ep_flow.cpp +++ b/source/express_pass/ep_flow.cpp @@ -10,19 +10,30 @@ namespace sim { -EPFlow::EPFlow(std::shared_ptr a_src, std::shared_ptr a_dest, +EPFlow::EPFlow(std::shared_ptr a_src, std::shared_ptr a_dest, Size a_packet_size, Time a_delay_between_packets, std::uint32_t a_packets_to_send) - : m_src(a_src), - m_dest(a_dest), - m_sender_status(SenderStatus::CREDIT_STOP_S), + : m_sender_status(SenderStatus::CREDIT_STOP_S), m_receiver_status(ReceiverStatus::CREDIT_STOP_R), m_packet_size(a_packet_size), m_delay_between_packets(a_delay_between_packets), m_packets_to_send(a_packets_to_send), m_id(IdentifierFactory::get_instance().generate_id()) { + + if (auto src = std::dynamic_pointer_cast(a_src)) { + m_src = src; + } else { + throw std::invalid_argument("Sender must be of type EPSender"); + } + + if (auto dest = std::dynamic_pointer_cast(a_dest)) { + m_dest = dest; + } else { + throw std::invalid_argument("Receiver must be of type EPReceiver"); + } + auto link = m_dest.lock()->get_link_to_destination(generate_packet(PacketType::CREDIT, true)); - m_max_rate = (double)(m_packet_size + m_system_packet_size) / 10.0; // TODO: / link.get_speed(); + m_max_rate = (double)(m_packet_size * 8) / 10.0; // TODO: / link.get_speed(); } void EPFlow::schedule_packet_generation(Time time) { @@ -37,7 +48,7 @@ Packet EPFlow::generate_packet(PacketType type, bool from_receiver, std::uint32_ if (type == PacketType::DATA) { packet.size_byte = m_packet_size; } else { - packet.size_byte = m_system_packet_size; + packet.size_byte = m_system_packet_size + (rand() % 20); } packet.flow = this; packet.source_id = (from_receiver ? m_dest.lock()->get_id() : m_src.lock()->get_id()); @@ -51,36 +62,109 @@ std::uint32_t EPFlow::get_next_packet_num() { return m_current_packet_num++; } -void EPFlow::start(Time time) { - schedule_packet_generation(time); +void EPFlow::start() { + schedule_packet_generation(Scheduler::get_instance().get_current_time()); sim::Packet packet = generate_packet(PacketType::CREDIT_REQUEST, false); - m_src.lock()->send_system_packet(time, packet); + m_src.lock()->send_system_packet(packet); m_sender_status = SenderStatus::CREQ_SENT; } -Time EPFlow::send_credit(Time time) { +Time EPFlow::send_credit() { if (m_stopped) { return 0; } - auto packet = generate_packet(PacketType::CREDIT, true, get_next_packet_num(), time); - m_dest.lock()->send_system_packet(time, packet); - int rnd_part = (std::rand() % 209) - 104; - // std::cout << get_id() << ": " << packet.packet_num << " jitter: " << rnd_part << std::endl; + auto packet = generate_packet(PacketType::CREDIT, true, get_next_packet_num(), Scheduler::get_instance().get_current_time()); + m_dest.lock()->send_system_packet(packet); + m_sent_credits++; - return m_max_rate + rnd_part; //m_current_rate * m_max_rate; + std::uint32_t rate = m_max_rate / m_current_rate_coeff; + int rnd_part = (std::rand() % (int)(rate * 0.08)) - (int)(rate * 0.04); + m_accum += rate + rnd_part; + return rate + rnd_part; } + +void EPFlow::process_getting_data_packet(Packet data_packet) { + double alpha = 0.2; + m_RTT = (1 - alpha) * m_RTT + alpha * (Scheduler::get_instance().get_current_time() - data_packet.RTT); + + int distance = data_packet.packet_num - m_last_obtained_packet_num; + + if (distance < 0) { + // TODO: log error credit packet reordering or credit sequence number overflow happend. + throw "ERR"; + } + m_sent_credits += (distance + 1); + m_lost_credits += distance; + + m_last_obtained_packet_num = data_packet.packet_num + 1; + + // LOG_ERROR("Got DATA " + std::to_string(get_id()) + " Packet: " + data_packet.to_string() + " RTT: " + std::to_string(m_RTT) + " REAL RTT: " + std::to_string(Scheduler::get_instance().get_current_time() - data_packet.RTT)); +} + // feedback control launch once per RTT (scheduled by event) +Time EPFlow::feedback_control_loop() { + if (m_sent_credits == 0) { + return m_RTT; + } + + auto old_coeff = m_current_rate_coeff; + double credit_loss = (double)m_lost_credits / (double)m_sent_credits; + + if (credit_loss <= m_target_loss && m_incr_cnt <= 10) { + if (m_was_increasing) { + m_w = (m_w + m_w_max) / 2; + m_incr_cnt++; + } + m_was_increasing = true; + m_current_rate_coeff = (1 - m_w) * m_current_rate_coeff + m_w * m_max_rate_coeff * (1 + m_target_loss); + } else { + m_max_meg_incr_in_a_row = std::max(m_max_meg_incr_in_a_row, m_incr_cnt); + m_was_increasing = false; + if (credit_loss >= 1.0) { + m_current_rate_coeff = m_max_rate / (double)m_RTT; + } else { + if (m_incr_cnt > 10) { + m_current_rate_coeff /= (8.0 * (1 - credit_loss)); + } else { + m_current_rate_coeff = m_current_rate_coeff * (1 - credit_loss) * (1 + m_target_loss); + } + + + // TEST PART + // m_current_rate_coeff = m_max_rate*(m_sent_credits - m_lost_credits) + // / (double)(Scheduler::get_instance().get_current_time() - m_last_credit_rate_update) + // * (1.0 + m_target_loss); + // m_current_rate_coeff = m_current_rate_coeff * (1 - credit_loss) * (1 + m_target_loss); + } + if (m_current_rate_coeff > old_coeff) { + m_current_rate_coeff = old_coeff; + } + m_incr_cnt = 0; + m_w = std::max(m_w / 2, m_w_min); + } + + m_lost_credits = 0; + m_sent_credits = 0; + m_last_credit_rate_update = Scheduler::get_instance().get_current_time(); + + return m_RTT; +} void EPFlow::update(Packet packet, DeviceType type) { if (packet.type == PacketType::CREDIT_REQUEST && type == DeviceType::RECEIVER && m_receiver_status == ReceiverStatus::CREDIT_STOP_R) { m_receiver_status = ReceiverStatus::CREDIT_SENDING; + auto send_credit_event_ptr = - std::make_unique(time, shared_from_this(), m_system_packet_size); + std::make_unique(Scheduler::get_instance().get_current_time(), shared_from_this(), m_system_packet_size); Scheduler::get_instance().add(std::move(send_credit_event_ptr)); + + auto feedback_control_event_ptr = + std::make_unique(Scheduler::get_instance().get_current_time(), shared_from_this()); + Scheduler::get_instance().add(std::move(feedback_control_event_ptr)); } else if (packet.type == PacketType::CREDIT_STOP_P && type == DeviceType::RECEIVER && m_receiver_status == ReceiverStatus::CREDIT_SENDING) { m_receiver_status = ReceiverStatus::CREDIT_STOP_R; @@ -89,8 +173,9 @@ void EPFlow::update(Packet packet, DeviceType type) { else if (packet.type == PacketType::DATA && type == DeviceType::RECEIVER) { // calculate data statistics // check corresponding credit id and update state - LOG_INFO("Got DATA " + std::to_string(get_id())); + process_getting_data_packet(packet); } else if (packet.type == PacketType::CREDIT && type == DeviceType::SENDER) { + // LOG_ERROR("Got CREDIT " + std::to_string(get_id()) + " TIME: " + std::to_string(Scheduler::get_instance().get_current_time())); if (m_sender_status != SenderStatus::CREQ_SENT && m_sender_status != SenderStatus::CREDIT_RECEIVING) { LOG_ERROR("Unexpected sender status when got credit"); return; diff --git a/source/express_pass/ep_flow.hpp b/source/express_pass/ep_flow.hpp index 8d5b20ef64..99b7eea735 100644 --- a/source/express_pass/ep_flow.hpp +++ b/source/express_pass/ep_flow.hpp @@ -26,13 +26,15 @@ enum ReceiverStatus { class EPFlow : public IFlow, public std::enable_shared_from_this { public: - EPFlow(std::shared_ptr a_src, std::shared_ptr a_dest, + EPFlow(std::shared_ptr a_src, std::shared_ptr a_dest, Size a_packet_size, Time a_delay_between_packets, std::uint32_t a_packets_to_send); - virtual ~EPFlow() = default; + virtual ~EPFlow() { + std::cout << "Max incr: " << std::max(m_max_meg_incr_in_a_row, m_incr_cnt) << std::endl; + }; // Start at time - void start(Time time) final; + void start() final; Time create_new_data_packet() final; Time put_data_to_device() final; @@ -44,7 +46,8 @@ class EPFlow : public IFlow, public std::enable_shared_from_this { std::shared_ptr get_sender() const final; std::shared_ptr get_receiver() const final; - Time send_credit(Time time); + Time send_credit(); + Time feedback_control_loop(); Id get_id() const final; @@ -53,25 +56,42 @@ class EPFlow : public IFlow, public std::enable_shared_from_this { Packet generate_packet(PacketType type, bool from_receiver = false, std::uint32_t packet_num = 0, Time RTT = 0); void sender_send_stop(); std::uint32_t get_next_packet_num(); + void process_getting_data_packet(Packet data_packet); std::weak_ptr m_src; std::weak_ptr m_dest; SenderStatus m_sender_status; ReceiverStatus m_receiver_status; + bool m_stopped = false; + std::uint32_t m_current_packet_num = 0; + Size m_packet_size; Time m_delay_between_packets; std::uint32_t m_packets_to_send; - double m_max_rate; + Size m_system_packet_size = 84; - bool m_stopped = false; - int m_last_received_credit = 0; - std::uint32_t m_current_packet_num = 0; - Size m_system_packet_size = 64; - double m_current_rate = 1.0 / 8.0; - double w = 1.0 / 2.0; + + double m_max_rate_coeff = 1.0; + double m_current_rate_coeff = 1.0 / 4.0; + double m_max_rate; + double m_w = 1.0 / 8.0; + double m_w_max = 0.5; + double m_w_min = 0.01; + double m_target_loss = 0.1; + bool m_was_increasing = false; + int m_incr_cnt = 0; + int m_max_meg_incr_in_a_row = 0; + Time m_last_credit_rate_update = 0; + + Time m_RTT = 7500; + std::uint32_t m_last_obtained_packet_num = 0; + std::uint32_t m_last_received_credit = 0; + std::uint32_t m_sent_credits = 0; + std::uint32_t m_lost_credits = 0; std::queue m_sending_buffer; + Time m_accum; Id m_id; }; diff --git a/source/express_pass/ep_link.cpp b/source/express_pass/ep_link.cpp new file mode 100644 index 0000000000..2ac7e23af2 --- /dev/null +++ b/source/express_pass/ep_link.cpp @@ -0,0 +1,146 @@ +#include "express_pass/ep_link.hpp" + +#include "device/switch.hpp" +#include "scheduler.hpp" +#include "logger/logger.hpp" + +namespace sim { + +EPLink::EPLink(std::weak_ptr a_from, + std::weak_ptr a_to, std::uint32_t a_speed_gbps, + Time a_delay, Size a_max_src_egress_buffer_size_byte, + Size a_max_ingress_buffer_size) + : m_from(a_from), + m_to(a_to), + m_speed_gbps(a_speed_gbps), + m_src_egress_buffer_size_byte(0), + m_max_src_egress_buffer_size_byte(a_max_src_egress_buffer_size_byte), + m_last_src_egress_pass_time(0), + m_transmission_delay(a_delay), + m_id(IdentifierFactory::get_instance().generate_id()), + m_next_ingress(), + m_ingress_buffer_size_byte(0), + m_max_ingress_buffer_size_byte(a_max_ingress_buffer_size) { + if (a_from.expired() || a_to.expired()) { + LOG_WARN("Passed link to device is expired"); + } else if (a_speed_gbps == 0) { + LOG_WARN("Passed zero link speed"); + } +} + +Time EPLink::get_transmission_time(const Packet& packet) const { + if (m_speed_gbps == 0) { + LOG_WARN("Passed zero link speed"); + return 0; + } + const std::uint32_t byte_to_bit_multiplier = 8; + + Size packet_size_bit = packet.size_byte * byte_to_bit_multiplier; + std::uint32_t transmission_speed_bit_ns = m_speed_gbps; + return (packet_size_bit + transmission_speed_bit_ns - 1) / + transmission_speed_bit_ns + + m_transmission_delay; +}; + +void EPLink::schedule_arrival(Packet packet) { + if (m_to.expired()) { + LOG_WARN("Destination device pointer is expired"); + return; + } + + Time total_delay; + + // TODO: rewrite this part with limiting throughput instead of calculating sending time separately + auto src = m_from.lock(); + if (packet.type == PacketType::CREDIT) { + if (m_current_credit_queue_capacity >= m_max_credit_queue_capacity) { + // LOG_ERROR("Dropped credit: " + packet.to_string() + " Time: " + std::to_string(Scheduler::get_instance().get_current_time())); + return; + } + + m_current_credit_queue_capacity++; + total_delay = std::max(m_next_credit_can_be_sent, Scheduler::get_instance().get_current_time()); + m_next_credit_can_be_sent = total_delay + (packet.size_byte * 8 + 1538 * 8) / m_speed_gbps; + // LOG_ERROR("Next credit can be sent: " + std::to_string(m_next_credit_can_be_sent)); + } else { + + if (m_src_egress_buffer_size_byte + packet.size_byte > + m_max_src_egress_buffer_size_byte) { + LOG_ERROR("Buffer in link overflowed; packet " + packet.to_string() + + " lost"); + return; + } + + LOG_INFO("Packet arrived to link's ingress queue. Packet: " + + packet.to_string()); + Time transmission_time = get_transmission_time(packet); + + m_last_src_egress_pass_time = + std::max(m_last_src_egress_pass_time, + Scheduler::get_instance().get_current_time()) + + transmission_time; + m_src_egress_buffer_size_byte += packet.size_byte; + m_max_buffer_size = std::max(m_max_buffer_size, m_src_egress_buffer_size_byte); + total_delay = m_last_src_egress_pass_time; + } + + Scheduler::get_instance().add(std::make_unique( + Arrive(total_delay, weak_from_this(), packet))); +}; + +void EPLink::process_arrival(Packet packet) { + auto src = m_from.lock(); + if (packet.type == PacketType::CREDIT) { + m_current_credit_queue_capacity--; + } else { + if (m_ingress_buffer_size_byte + packet.size_byte > + m_max_ingress_buffer_size_byte) { + LOG_ERROR("Ingress buffer on EPLink overflow; packet" + + packet.to_string() + " lost"); + return; + } + m_ingress_buffer_size_byte += packet.size_byte; + m_max_buffer_size = std::max(m_max_buffer_size, m_ingress_buffer_size_byte); + + LOG_INFO("Packet arrived to link's egress queue. Packet: " + + packet.to_string()); + + m_src_egress_buffer_size_byte -= packet.size_byte; + } + m_next_ingress.push(packet); +}; + +std::optional EPLink::get_packet() { + if (m_next_ingress.empty()) { + LOG_INFO("Ingress packet queue is empty"); + return {}; + } + + auto packet = m_next_ingress.front(); + LOG_INFO("Taken packet from link. Packet: " + packet.to_string()); + m_next_ingress.pop(); + m_ingress_buffer_size_byte -= packet.size_byte; + return packet; +}; + +std::shared_ptr EPLink::get_from() const { + if (m_from.expired()) { + LOG_WARN("Source device pointer is expired"); + return nullptr; + } + + return m_from.lock(); +}; + +std::shared_ptr EPLink::get_to() const { + if (m_to.expired()) { + LOG_WARN("Destination device pointer is expired"); + return nullptr; + } + + return m_to.lock(); +}; + +Id EPLink::get_id() const { return m_id; } + +} // namespace sim diff --git a/source/express_pass/ep_link.hpp b/source/express_pass/ep_link.hpp new file mode 100644 index 0000000000..7d3ff446be --- /dev/null +++ b/source/express_pass/ep_link.hpp @@ -0,0 +1,62 @@ +#pragma once + +#include "link.hpp" +#include + +namespace sim { + +class EPLink : public ILink, public std::enable_shared_from_this { +public: + EPLink(std::weak_ptr a_from, + std::weak_ptr a_to, std::uint32_t a_speed_gbps = 1, + Time a_delay = 0, Size a_max_src_egress_buffer_size_byte = 32768, + Size a_max_ingress_buffer_size_byte = 32768); + ~EPLink() { + std::cout << "Max buffer: " << m_max_buffer_size << std::endl; + }; + + /** + * Update the source egress delay and schedule the arrival event + * based on the egress queueing and transmission delays. + */ + void schedule_arrival(Packet packet) final; + + /** + * Removes packet from the source egress queue. + */ + void process_arrival(Packet packet) final; + + std::optional get_packet() final; + + std::shared_ptr get_from() const final; + std::shared_ptr get_to() const final; + + Id get_id() const final; + +private: + Time get_transmission_time(const Packet& packet) const; + + std::weak_ptr m_from; + std::weak_ptr m_to; + std::uint32_t m_speed_gbps; + + Size m_src_egress_buffer_size_byte; + Size m_max_src_egress_buffer_size_byte; + Time m_last_src_egress_pass_time; + + Time m_transmission_delay; + Id m_id; + + // Queue at the ingress port of the m_next device + std::queue m_next_ingress; + Size m_ingress_buffer_size_byte; + Size m_max_ingress_buffer_size_byte; + + + std::uint32_t m_max_credit_queue_capacity = 8; + std::uint32_t m_current_credit_queue_capacity = 0; + Size m_max_buffer_size = 0; + Time m_next_credit_can_be_sent = 0; +}; + +} // namespace sim diff --git a/source/express_pass/ep_receiver.cpp b/source/express_pass/ep_receiver.cpp index 1f554e8ea1..7f206c56ca 100644 --- a/source/express_pass/ep_receiver.cpp +++ b/source/express_pass/ep_receiver.cpp @@ -1,11 +1,8 @@ #include "ep_receiver.hpp" #include +#include -// #include "event.hpp" -// #include "link.hpp" -// #include "logger/logger.hpp" -// #include "utils/identifier_factory.hpp" #include "scheduler.hpp" #include "utils/validation.hpp" @@ -47,7 +44,7 @@ DeviceType EPReceiver::get_type() const { return DeviceType::RECEIVER; } Time EPReceiver::process() { std::shared_ptr current_inlink = next_inlink(); - Time total_processing_time = 1; + Time total_processing_time = 10; if (current_inlink == nullptr) { LOG_WARN("No available inlinks for device"); @@ -73,6 +70,8 @@ Time EPReceiver::process() { if (packet.dest_id == get_id()) { // TODO: think about processing time packet.flow->update(packet, get_type()); + m_cnt++; + // std::cout << "GOT: " << ++m_cnt << " TIME: " << Scheduler::get_instance().get_current_time() << std::endl; } else { LOG_WARN( "Packet arrived to EPReceiver that is not its destination; using " diff --git a/source/express_pass/ep_receiver.hpp b/source/express_pass/ep_receiver.hpp index dbccfd2913..15e72d58b0 100644 --- a/source/express_pass/ep_receiver.hpp +++ b/source/express_pass/ep_receiver.hpp @@ -1,4 +1,5 @@ #pragma once +#include #include #include "device/receiver.hpp" @@ -9,7 +10,9 @@ class EPReceiver : public IReceiver, public std::enable_shared_from_this { public: EPReceiver(); - ~EPReceiver() = default; + ~EPReceiver() { + std::cout << "Receiver " << get_id() << " got " << m_cnt << " packets" << std::endl; + }; bool add_inlink(std::shared_ptr link) final; bool add_outlink(std::shared_ptr link) final; @@ -33,6 +36,7 @@ class EPReceiver : public IReceiver, private: Time send_ack(Packet data_packet); std::unique_ptr m_router; + int m_cnt = 0; }; } // namespace sim diff --git a/source/express_pass/ep_routing_module.hpp b/source/express_pass/ep_routing_module.hpp index 62cb1ecc4d..de9ed30e19 100644 --- a/source/express_pass/ep_routing_module.hpp +++ b/source/express_pass/ep_routing_module.hpp @@ -1,53 +1,53 @@ -#pragma once +// #pragma once -#include -#include +// #include +// #include -#include "device.hpp" -#include "types.hpp" -#include "utils/hasher.hpp" -#include "utils/loop_iterator.hpp" +// #include "device.hpp" +// #include "types.hpp" +// #include "utils/hasher.hpp" +// #include "utils/loop_iterator.hpp" -namespace sim { +// namespace sim { -struct Packet; -class IHasher; +// struct Packet; +// class IHasher; -class RoutingModule : public IRoutingDevice { -public: - RoutingModule(); - ~RoutingModule() = default; - - Id get_id() const final; - bool add_inlink(std::shared_ptr link) final; - bool add_outlink(std::shared_ptr link) final; - bool update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count = 1) final; - // returns next inlink and moves inlinks set iterator forward - std::shared_ptr next_inlink() final; - std::shared_ptr get_link_to_destination(Packet packet) const final; - std::set> get_outlinks() final; - - void correctify_inlinks(); - void correctify_outlinks(); - -private: - // Ordered set as we need to iterate over the ingress buffers - std::set, std::owner_less>> - m_inlinks; - - std::set, std::owner_less>> - m_outlinks; - - // A routing table: maps the final destination to a specific link - std::unordered_map> m_routing_table; - - // Iterator for the next ingress to process - LoopIterator, - std::owner_less>>::iterator> - m_next_inlink; - - Id m_id; - std::unique_ptr m_hasher; -}; - -} // namespace sim +// class RoutingModule : public IRoutingDevice { +// public: +// RoutingModule(); +// ~RoutingModule() = default; + +// Id get_id() const final; +// bool add_inlink(std::shared_ptr link) final; +// bool add_outlink(std::shared_ptr link) final; +// bool update_routing_table(Id dest_id, std::shared_ptr link, size_t paths_count = 1) final; +// // returns next inlink and moves inlinks set iterator forward +// std::shared_ptr next_inlink() final; +// std::shared_ptr get_link_to_destination(Packet packet) const final; +// std::set> get_outlinks() final; + +// void correctify_inlinks(); +// void correctify_outlinks(); + +// private: +// // Ordered set as we need to iterate over the ingress buffers +// std::set, std::owner_less>> +// m_inlinks; + +// std::set, std::owner_less>> +// m_outlinks; + +// // A routing table: maps the final destination to a specific link +// std::unordered_map> m_routing_table; + +// // Iterator for the next ingress to process +// LoopIterator, +// std::owner_less>>::iterator> +// m_next_inlink; + +// Id m_id; +// std::unique_ptr m_hasher; +// }; + +// } // namespace sim diff --git a/source/express_pass/ep_sender.cpp b/source/express_pass/ep_sender.cpp index f1ba736037..59ad557b91 100644 --- a/source/express_pass/ep_sender.cpp +++ b/source/express_pass/ep_sender.cpp @@ -4,9 +4,6 @@ #include -// #include "event.hpp" -// #include "link.hpp" -// #include "logger/logger.hpp" #include "scheduler.hpp" #include "utils/validation.hpp" @@ -55,7 +52,7 @@ void EPSender::enqueue_packet(Packet packet) { Time EPSender::process() { std::shared_ptr current_inlink = next_inlink(); - Time total_processing_time = 1; + Time total_processing_time = 10; if (current_inlink == nullptr) { LOG_WARN("No available inlinks for device"); diff --git a/source/scheduler.cpp b/source/scheduler.cpp index 7d26fe94b4..be845d0fc8 100644 --- a/source/scheduler.cpp +++ b/source/scheduler.cpp @@ -29,6 +29,6 @@ void Scheduler::clear() { EventComparator>(); } -static Time Scheduler::get_current_time() { return m_current_event_local_time; }; +Time Scheduler::get_current_time() { return m_current_event_local_time; }; } // namespace sim diff --git a/source/simulator.cpp b/source/simulator.cpp index 48c8095cde..dd0befbe15 100644 --- a/source/simulator.cpp +++ b/source/simulator.cpp @@ -7,6 +7,8 @@ namespace sim { SimulatorVariant create_simulator(std::string_view algorithm) { if (algorithm == "basic") { return BasicSimulator(); + } else if (algorithm == "express_pass") { + return EPSimulator(); } throw std::invalid_argument("Unknown algorithm: " + std::string(algorithm)); } diff --git a/source/simulator.hpp b/source/simulator.hpp index 8014bf13e1..57179e6846 100644 --- a/source/simulator.hpp +++ b/source/simulator.hpp @@ -15,6 +15,12 @@ #include "device/sender.hpp" #include "device/switch.hpp" #include "link.hpp" + +#include "express_pass/ep_receiver.hpp" +#include "express_pass/ep_sender.hpp" +#include "express_pass/ep_link.hpp" +#include "express_pass/ep_flow.hpp" + #include "logger/logger.hpp" #include "scheduler.hpp" #include "utils/algorithms.hpp" @@ -31,7 +37,7 @@ class Simulator { public: Simulator() = default; ~Simulator() = default; - std::shared_ptr add_sender(std::string name) { + std::shared_ptr add_sender(std::string name) { if (m_senders.contains(name)) { LOG_WARN(fmt::format( "add_sender failed: device with name {} already exists.", @@ -42,7 +48,7 @@ class Simulator { return m_senders[name]; } - std::shared_ptr add_receiver(std::string name) { + std::shared_ptr add_receiver(std::string name) { if (m_receivers.contains(name)) { LOG_WARN(fmt::format( "add_receiver failed: device with name {} already exists.", @@ -53,7 +59,7 @@ class Simulator { return m_receivers[name]; } - std::shared_ptr add_switch(std::string name) { + std::shared_ptr add_switch(std::string name) { if (m_switches.contains(name)) { LOG_WARN(fmt::format( "add_switch failed: device with name {} already exists.", @@ -64,7 +70,7 @@ class Simulator { return m_switches[name]; } - std::shared_ptr add_flow(std::shared_ptr sender, + std::shared_ptr add_flow(std::shared_ptr sender, std::shared_ptr receiver, Size packet_size, Time delay_between_packets, @@ -79,7 +85,7 @@ class Simulator { void add_link(std::shared_ptr a_from, std::shared_ptr a_to, std::uint32_t a_speed_gbps, Time a_delay, - size_t max_ingress_buffer_size = 4096) { + size_t max_ingress_buffer_size = 32768) { auto link = std::make_shared(a_from, a_to, a_speed_gbps, a_delay, max_ingress_buffer_size); m_links.emplace_back(link); @@ -157,7 +163,9 @@ class Simulator { using BasicSimulator = Simulator; -using SimulatorVariant = std::variant; +using EPSimulator = Simulator; + +using SimulatorVariant = std::variant; SimulatorVariant create_simulator(std::string_view algorithm); From 8e658c007fff7ee1ef2de7167fec6fb549a8e64c Mon Sep 17 00:00:00 2001 From: Artyom Peshkov Date: Wed, 28 May 2025 01:22:31 +0300 Subject: [PATCH 15/22] fix --- test/simulator/start_test.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/test/simulator/start_test.cpp b/test/simulator/start_test.cpp index 5f09b8bded..273ca9f6e1 100644 --- a/test/simulator/start_test.cpp +++ b/test/simulator/start_test.cpp @@ -22,8 +22,8 @@ TEST_F(Start, TrivialTopology) { constexpr Size packet_size = 1024; constexpr std::uint32_t packets_to_send = 1; - auto flow = sim.add_flow(sender, receiver, packet_size, - delay_between_packets, packets_to_send); + auto flow = std::dynamic_pointer_cast(sim.add_flow(sender, receiver, packet_size, + delay_between_packets, packets_to_send)); add_two_way_links(sim, {{sender, swtch}, {swtch, receiver}}); @@ -52,12 +52,12 @@ TEST_F(Start, ThreeToOneTopology) { constexpr std::uint32_t packets_to_send_by_flow2 = 50; constexpr std::uint32_t packets_to_send_by_flow3 = 100; - auto flow1 = sim.add_flow(sender1, receiver, packet_size, - delay_between_packets, packets_to_send_by_flow1); - auto flow2 = sim.add_flow(sender2, receiver, packet_size, - delay_between_packets, packets_to_send_by_flow2); - auto flow3 = sim.add_flow(sender3, receiver, packet_size, - delay_between_packets, packets_to_send_by_flow3); + auto flow1 = std::dynamic_pointer_cast(sim.add_flow(sender1, receiver, packet_size, + delay_between_packets, packets_to_send_by_flow1)); + auto flow2 = std::dynamic_pointer_cast(sim.add_flow(sender2, receiver, packet_size, + delay_between_packets, packets_to_send_by_flow2)); + auto flow3 = std::dynamic_pointer_cast(sim.add_flow(sender3, receiver, packet_size, + delay_between_packets, packets_to_send_by_flow3)); sim.start(stop_time); @@ -86,12 +86,12 @@ TEST_F(Start, StopTime) { constexpr std::uint32_t packets_to_send_by_flow2 = 50; constexpr std::uint32_t packets_to_send_by_flow3 = 100; - auto flow1 = sim.add_flow(sender1, receiver, packet_size, - delay_between_packets, packets_to_send_by_flow1); - auto flow2 = sim.add_flow(sender2, receiver, packet_size, - delay_between_packets, packets_to_send_by_flow2); - auto flow3 = sim.add_flow(sender3, receiver, packet_size, - delay_between_packets, packets_to_send_by_flow3); + auto flow1 = std::dynamic_pointer_cast(sim.add_flow(sender1, receiver, packet_size, + delay_between_packets, packets_to_send_by_flow1)); + auto flow2 = std::dynamic_pointer_cast(sim.add_flow(sender2, receiver, packet_size, + delay_between_packets, packets_to_send_by_flow2)); + auto flow3 = std::dynamic_pointer_cast(sim.add_flow(sender3, receiver, packet_size, + delay_between_packets, packets_to_send_by_flow3)); sim.start(stop_time); From c8663285638ec7f788c40d2615d97f366fde0bb2 Mon Sep 17 00:00:00 2001 From: Artyom Peshkov Date: Wed, 28 May 2025 01:39:12 +0300 Subject: [PATCH 16/22] fix --- main.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/main.cpp b/main.cpp index 468ddd4b34..8eca026cd3 100644 --- a/main.cpp +++ b/main.cpp @@ -1,4 +1,6 @@ #include +#include +#include #include "parser.hpp" #include "source/logger/logger.hpp" @@ -10,6 +12,7 @@ int main(const int argc, char **argv) { LOG_ERROR(fmt::format("Usage: {} ", argv[0])); return 1; } + srand(time(0)); try { sim::YamlParser parser; From 66262e1d2c087f5b405290e08a037bf73c1bb181 Mon Sep 17 00:00:00 2001 From: Artyom Peshkov Date: Thu, 5 Jun 2025 01:48:58 +0300 Subject: [PATCH 17/22] update --- .../generator/basic_ep_generator.py | 170 + .../simulation_examples/ep_simulator.yml | 1540 ++++ .../topology_examples/ep_topology.yml | 8212 +++++++++++++++++ source/device/device.hpp | 2 + source/device/receiver.cpp | 26 +- source/device/receiver.hpp | 7 +- source/device/sender.cpp | 20 +- source/device/sender.hpp | 1 + source/express_pass/ep_event.cpp | 42 + source/express_pass/ep_event.hpp | 27 + source/express_pass/ep_flow.cpp | 230 + source/express_pass/ep_flow.hpp | 98 + source/express_pass/ep_link.cpp | 152 + source/express_pass/ep_link.hpp | 65 + source/link.cpp | 2 +- source/logger/logger.cpp | 4 +- source/parser/identifiable_parser.hpp | 97 + source/simulator.cpp | 4 +- source/simulator.hpp | 8 +- test/switch/receiver_mock.cpp | 4 + test/switch/receiver_mock.hpp | 1 + 21 files changed, 10699 insertions(+), 13 deletions(-) create mode 100644 configuration_examples/generator/basic_ep_generator.py create mode 100644 configuration_examples/simulation_examples/ep_simulator.yml create mode 100644 configuration_examples/topology_examples/ep_topology.yml create mode 100644 source/express_pass/ep_event.cpp create mode 100644 source/express_pass/ep_event.hpp create mode 100644 source/express_pass/ep_flow.cpp create mode 100644 source/express_pass/ep_flow.hpp create mode 100644 source/express_pass/ep_link.cpp create mode 100644 source/express_pass/ep_link.hpp diff --git a/configuration_examples/generator/basic_ep_generator.py b/configuration_examples/generator/basic_ep_generator.py new file mode 100644 index 0000000000..e7c83ccb15 --- /dev/null +++ b/configuration_examples/generator/basic_ep_generator.py @@ -0,0 +1,170 @@ +import yaml +import argparse +import sys + +def generate_topology(num_senders, num_receivers, switch_1_name="bus1", switch_2_name="bus2", link_latency="1ns", link_throughput="10Gbps", ingress_buffer_size = "32768B", egress_buffer_size = "32768B"): + topology = { + "devices": {}, + "links": {} + } + + # Add senders + for i in range(0, num_senders): + sender_name = f"sender{i}" + topology["devices"][sender_name] = {"type": "sender"} + base_index = 2 * i + + # Add link from sender to switch + link_name = f"link{base_index}" + topology["links"][link_name] = { + "from": sender_name, + "to": switch_1_name, + "latency": link_latency, + "throughput": link_throughput, + "ingress_buffer_size": ingress_buffer_size, + "egress_buffer_size": egress_buffer_size + } + + # Add link from switch to sender + link_name = f"link{base_index + 1}" + topology["links"][link_name] = { + "from": switch_1_name, + "to": sender_name, + "latency": link_latency, + "throughput": link_throughput, + "ingress_buffer_size": ingress_buffer_size, + "egress_buffer_size": egress_buffer_size + } + + # Add receivers + for i in range(0, num_receivers): + receiver_name = f"receiver{i}" + topology["devices"][receiver_name] = {"type": "receiver"} + base_index = 2 * num_senders + 2 * i + + # Add link from switch to receiver + link_name = f"link{base_index}" + topology["links"][link_name] = { + "from": switch_2_name, + "to": receiver_name, + "latency": link_latency, + "throughput": link_throughput, + "ingress_buffer_size": ingress_buffer_size, + "egress_buffer_size": egress_buffer_size + } + + # Add link from receiver to switch + link_name = f"link{base_index + 1}" + topology["links"][link_name] = { + "from": receiver_name, + "to": switch_2_name, + "latency": link_latency, + "throughput": link_throughput, + "ingress_buffer_size": ingress_buffer_size, + "egress_buffer_size": egress_buffer_size + } + + # Add the switch + topology["devices"][switch_1_name] = {"type": "switch"} + topology["devices"][switch_2_name] = {"type": "switch"} + + base_index = 2 * num_senders + 2 * num_receivers + link_name1 = f"link{base_index}" + topology["links"][link_name1] = { + "from": switch_1_name, + "to": switch_2_name, + "latency": link_latency, + "throughput": link_throughput, + "ingress_buffer_size": ingress_buffer_size, + "egress_buffer_size": egress_buffer_size + } + link_name2 = f"link{base_index + 1}" + topology["links"][link_name2] = { + "from": switch_2_name, + "to": switch_1_name, + "latency": link_latency, + "throughput": link_throughput, + "ingress_buffer_size": ingress_buffer_size, + "egress_buffer_size": egress_buffer_size + } + + return topology + +def generate_simulation(topology_path, num_senders, num_receivers, packet_size=1538, + packet_interval=100, number_of_packets=100000, algorithm="ep", simulation_time=10000000): + """ + Generate a simulation YAML structure with flows between senders and receivers. + """ + simulation = { + "topology_config_path": topology_path, + "flows": {}, + "algorithm": algorithm, + "simulation_time": simulation_time + } + + # Create flows - each sender connects to one receiver (1:1 mapping) + # If there are more senders than receivers, extra senders will connect to last receiver + # If there are more receivers than senders, extra receivers won't have flows + flow_id = 0 + for i in range(0, num_senders): + flow_name = f"flow{flow_id}" + flow_id += 1 + simulation["flows"][flow_name] = { + "sender_id": f"sender{i}", + "receiver_id": f"receiver{i}", + "packet_size": packet_size, + "packet_interval": packet_interval, + "number_of_packets": number_of_packets + } + + return simulation + +def save_yaml(data, filename): + """Save data as YAML to a file""" + with open(filename, 'w') as f: + yaml.dump(data, f, sort_keys=False, default_flow_style=False) + +def parse_arguments(): + """Parse and validate command line arguments""" + parser = argparse.ArgumentParser(description='Generate topology and simulation YAML files.') + parser.add_argument('--senders', type=int, required=True, + help='Number of sender devices') + parser.add_argument('--receivers', type=int, required=True, + help='Number of receiver devices') + parser.add_argument('--topology', default='stress_topology.yml', + help='Output filename for topology file') + parser.add_argument('--simulation', default='ep_simulator.yml', + help='Output filename for simulation file') + parser.add_argument('--topology-path', default='../topology_examples/ep_topology.yml', + help='Path to topology file as referenced in simulation file') + parser.add_argument('--simulation-path', default='../simulation_examples/ep_simulator.yml', + help='Path to topology file as referenced in simulation file') + + args = parser.parse_args() + + # Validate inputs + if args.senders < 1: + print("Error: Number of senders must be at least 1", file=sys.stderr) + sys.exit(1) + if args.receivers < 1: + print("Error: Number of receivers must be at least 1", file=sys.stderr) + sys.exit(1) + + return args + +def main(): + # Parse command line arguments + args = parse_arguments() + + # Generate topology + topology = generate_topology(args.senders, args.receivers) + save_yaml(topology, args.topology_path) + print(f"Topology file saved as {args.topology} with {args.senders} senders and {args.receivers} receivers") + + # Generate simulation + simulation = generate_simulation(args.topology_path, args.senders, args.receivers) + save_yaml(simulation, args.simulation_path) + print(f"Simulation file saved as {args.simulation}") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/configuration_examples/simulation_examples/ep_simulator.yml b/configuration_examples/simulation_examples/ep_simulator.yml new file mode 100644 index 0000000000..36bf3747ea --- /dev/null +++ b/configuration_examples/simulation_examples/ep_simulator.yml @@ -0,0 +1,1540 @@ +topology_config_path: ../topology_examples/ep_topology.yml +flows: + flow0: + sender_id: sender0 + receiver_id: receiver0 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow1: + sender_id: sender1 + receiver_id: receiver1 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow2: + sender_id: sender2 + receiver_id: receiver2 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow3: + sender_id: sender3 + receiver_id: receiver3 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow4: + sender_id: sender4 + receiver_id: receiver4 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow5: + sender_id: sender5 + receiver_id: receiver5 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow6: + sender_id: sender6 + receiver_id: receiver6 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow7: + sender_id: sender7 + receiver_id: receiver7 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow8: + sender_id: sender8 + receiver_id: receiver8 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow9: + sender_id: sender9 + receiver_id: receiver9 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow10: + sender_id: sender10 + receiver_id: receiver10 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow11: + sender_id: sender11 + receiver_id: receiver11 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow12: + sender_id: sender12 + receiver_id: receiver12 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow13: + sender_id: sender13 + receiver_id: receiver13 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow14: + sender_id: sender14 + receiver_id: receiver14 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow15: + sender_id: sender15 + receiver_id: receiver15 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow16: + sender_id: sender16 + receiver_id: receiver16 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow17: + sender_id: sender17 + receiver_id: receiver17 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow18: + sender_id: sender18 + receiver_id: receiver18 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow19: + sender_id: sender19 + receiver_id: receiver19 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow20: + sender_id: sender20 + receiver_id: receiver20 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow21: + sender_id: sender21 + receiver_id: receiver21 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow22: + sender_id: sender22 + receiver_id: receiver22 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow23: + sender_id: sender23 + receiver_id: receiver23 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow24: + sender_id: sender24 + receiver_id: receiver24 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow25: + sender_id: sender25 + receiver_id: receiver25 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow26: + sender_id: sender26 + receiver_id: receiver26 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow27: + sender_id: sender27 + receiver_id: receiver27 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow28: + sender_id: sender28 + receiver_id: receiver28 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow29: + sender_id: sender29 + receiver_id: receiver29 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow30: + sender_id: sender30 + receiver_id: receiver30 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow31: + sender_id: sender31 + receiver_id: receiver31 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow32: + sender_id: sender32 + receiver_id: receiver32 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow33: + sender_id: sender33 + receiver_id: receiver33 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow34: + sender_id: sender34 + receiver_id: receiver34 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow35: + sender_id: sender35 + receiver_id: receiver35 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow36: + sender_id: sender36 + receiver_id: receiver36 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow37: + sender_id: sender37 + receiver_id: receiver37 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow38: + sender_id: sender38 + receiver_id: receiver38 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow39: + sender_id: sender39 + receiver_id: receiver39 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow40: + sender_id: sender40 + receiver_id: receiver40 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow41: + sender_id: sender41 + receiver_id: receiver41 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow42: + sender_id: sender42 + receiver_id: receiver42 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow43: + sender_id: sender43 + receiver_id: receiver43 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow44: + sender_id: sender44 + receiver_id: receiver44 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow45: + sender_id: sender45 + receiver_id: receiver45 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow46: + sender_id: sender46 + receiver_id: receiver46 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow47: + sender_id: sender47 + receiver_id: receiver47 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow48: + sender_id: sender48 + receiver_id: receiver48 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow49: + sender_id: sender49 + receiver_id: receiver49 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow50: + sender_id: sender50 + receiver_id: receiver50 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow51: + sender_id: sender51 + receiver_id: receiver51 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow52: + sender_id: sender52 + receiver_id: receiver52 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow53: + sender_id: sender53 + receiver_id: receiver53 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow54: + sender_id: sender54 + receiver_id: receiver54 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow55: + sender_id: sender55 + receiver_id: receiver55 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow56: + sender_id: sender56 + receiver_id: receiver56 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow57: + sender_id: sender57 + receiver_id: receiver57 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow58: + sender_id: sender58 + receiver_id: receiver58 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow59: + sender_id: sender59 + receiver_id: receiver59 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow60: + sender_id: sender60 + receiver_id: receiver60 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow61: + sender_id: sender61 + receiver_id: receiver61 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow62: + sender_id: sender62 + receiver_id: receiver62 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow63: + sender_id: sender63 + receiver_id: receiver63 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow64: + sender_id: sender64 + receiver_id: receiver64 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow65: + sender_id: sender65 + receiver_id: receiver65 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow66: + sender_id: sender66 + receiver_id: receiver66 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow67: + sender_id: sender67 + receiver_id: receiver67 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow68: + sender_id: sender68 + receiver_id: receiver68 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow69: + sender_id: sender69 + receiver_id: receiver69 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow70: + sender_id: sender70 + receiver_id: receiver70 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow71: + sender_id: sender71 + receiver_id: receiver71 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow72: + sender_id: sender72 + receiver_id: receiver72 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow73: + sender_id: sender73 + receiver_id: receiver73 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow74: + sender_id: sender74 + receiver_id: receiver74 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow75: + sender_id: sender75 + receiver_id: receiver75 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow76: + sender_id: sender76 + receiver_id: receiver76 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow77: + sender_id: sender77 + receiver_id: receiver77 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow78: + sender_id: sender78 + receiver_id: receiver78 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow79: + sender_id: sender79 + receiver_id: receiver79 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow80: + sender_id: sender80 + receiver_id: receiver80 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow81: + sender_id: sender81 + receiver_id: receiver81 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow82: + sender_id: sender82 + receiver_id: receiver82 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow83: + sender_id: sender83 + receiver_id: receiver83 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow84: + sender_id: sender84 + receiver_id: receiver84 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow85: + sender_id: sender85 + receiver_id: receiver85 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow86: + sender_id: sender86 + receiver_id: receiver86 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow87: + sender_id: sender87 + receiver_id: receiver87 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow88: + sender_id: sender88 + receiver_id: receiver88 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow89: + sender_id: sender89 + receiver_id: receiver89 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow90: + sender_id: sender90 + receiver_id: receiver90 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow91: + sender_id: sender91 + receiver_id: receiver91 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow92: + sender_id: sender92 + receiver_id: receiver92 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow93: + sender_id: sender93 + receiver_id: receiver93 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow94: + sender_id: sender94 + receiver_id: receiver94 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow95: + sender_id: sender95 + receiver_id: receiver95 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow96: + sender_id: sender96 + receiver_id: receiver96 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow97: + sender_id: sender97 + receiver_id: receiver97 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow98: + sender_id: sender98 + receiver_id: receiver98 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow99: + sender_id: sender99 + receiver_id: receiver99 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow100: + sender_id: sender100 + receiver_id: receiver100 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow101: + sender_id: sender101 + receiver_id: receiver101 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow102: + sender_id: sender102 + receiver_id: receiver102 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow103: + sender_id: sender103 + receiver_id: receiver103 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow104: + sender_id: sender104 + receiver_id: receiver104 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow105: + sender_id: sender105 + receiver_id: receiver105 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow106: + sender_id: sender106 + receiver_id: receiver106 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow107: + sender_id: sender107 + receiver_id: receiver107 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow108: + sender_id: sender108 + receiver_id: receiver108 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow109: + sender_id: sender109 + receiver_id: receiver109 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow110: + sender_id: sender110 + receiver_id: receiver110 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow111: + sender_id: sender111 + receiver_id: receiver111 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow112: + sender_id: sender112 + receiver_id: receiver112 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow113: + sender_id: sender113 + receiver_id: receiver113 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow114: + sender_id: sender114 + receiver_id: receiver114 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow115: + sender_id: sender115 + receiver_id: receiver115 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow116: + sender_id: sender116 + receiver_id: receiver116 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow117: + sender_id: sender117 + receiver_id: receiver117 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow118: + sender_id: sender118 + receiver_id: receiver118 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow119: + sender_id: sender119 + receiver_id: receiver119 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow120: + sender_id: sender120 + receiver_id: receiver120 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow121: + sender_id: sender121 + receiver_id: receiver121 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow122: + sender_id: sender122 + receiver_id: receiver122 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow123: + sender_id: sender123 + receiver_id: receiver123 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow124: + sender_id: sender124 + receiver_id: receiver124 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow125: + sender_id: sender125 + receiver_id: receiver125 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow126: + sender_id: sender126 + receiver_id: receiver126 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow127: + sender_id: sender127 + receiver_id: receiver127 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow128: + sender_id: sender128 + receiver_id: receiver128 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow129: + sender_id: sender129 + receiver_id: receiver129 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow130: + sender_id: sender130 + receiver_id: receiver130 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow131: + sender_id: sender131 + receiver_id: receiver131 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow132: + sender_id: sender132 + receiver_id: receiver132 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow133: + sender_id: sender133 + receiver_id: receiver133 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow134: + sender_id: sender134 + receiver_id: receiver134 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow135: + sender_id: sender135 + receiver_id: receiver135 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow136: + sender_id: sender136 + receiver_id: receiver136 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow137: + sender_id: sender137 + receiver_id: receiver137 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow138: + sender_id: sender138 + receiver_id: receiver138 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow139: + sender_id: sender139 + receiver_id: receiver139 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow140: + sender_id: sender140 + receiver_id: receiver140 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow141: + sender_id: sender141 + receiver_id: receiver141 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow142: + sender_id: sender142 + receiver_id: receiver142 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow143: + sender_id: sender143 + receiver_id: receiver143 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow144: + sender_id: sender144 + receiver_id: receiver144 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow145: + sender_id: sender145 + receiver_id: receiver145 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow146: + sender_id: sender146 + receiver_id: receiver146 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow147: + sender_id: sender147 + receiver_id: receiver147 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow148: + sender_id: sender148 + receiver_id: receiver148 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow149: + sender_id: sender149 + receiver_id: receiver149 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow150: + sender_id: sender150 + receiver_id: receiver150 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow151: + sender_id: sender151 + receiver_id: receiver151 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow152: + sender_id: sender152 + receiver_id: receiver152 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow153: + sender_id: sender153 + receiver_id: receiver153 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow154: + sender_id: sender154 + receiver_id: receiver154 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow155: + sender_id: sender155 + receiver_id: receiver155 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow156: + sender_id: sender156 + receiver_id: receiver156 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow157: + sender_id: sender157 + receiver_id: receiver157 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow158: + sender_id: sender158 + receiver_id: receiver158 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow159: + sender_id: sender159 + receiver_id: receiver159 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow160: + sender_id: sender160 + receiver_id: receiver160 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow161: + sender_id: sender161 + receiver_id: receiver161 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow162: + sender_id: sender162 + receiver_id: receiver162 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow163: + sender_id: sender163 + receiver_id: receiver163 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow164: + sender_id: sender164 + receiver_id: receiver164 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow165: + sender_id: sender165 + receiver_id: receiver165 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow166: + sender_id: sender166 + receiver_id: receiver166 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow167: + sender_id: sender167 + receiver_id: receiver167 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow168: + sender_id: sender168 + receiver_id: receiver168 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow169: + sender_id: sender169 + receiver_id: receiver169 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow170: + sender_id: sender170 + receiver_id: receiver170 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow171: + sender_id: sender171 + receiver_id: receiver171 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow172: + sender_id: sender172 + receiver_id: receiver172 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow173: + sender_id: sender173 + receiver_id: receiver173 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow174: + sender_id: sender174 + receiver_id: receiver174 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow175: + sender_id: sender175 + receiver_id: receiver175 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow176: + sender_id: sender176 + receiver_id: receiver176 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow177: + sender_id: sender177 + receiver_id: receiver177 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow178: + sender_id: sender178 + receiver_id: receiver178 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow179: + sender_id: sender179 + receiver_id: receiver179 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow180: + sender_id: sender180 + receiver_id: receiver180 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow181: + sender_id: sender181 + receiver_id: receiver181 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow182: + sender_id: sender182 + receiver_id: receiver182 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow183: + sender_id: sender183 + receiver_id: receiver183 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow184: + sender_id: sender184 + receiver_id: receiver184 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow185: + sender_id: sender185 + receiver_id: receiver185 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow186: + sender_id: sender186 + receiver_id: receiver186 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow187: + sender_id: sender187 + receiver_id: receiver187 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow188: + sender_id: sender188 + receiver_id: receiver188 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow189: + sender_id: sender189 + receiver_id: receiver189 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow190: + sender_id: sender190 + receiver_id: receiver190 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow191: + sender_id: sender191 + receiver_id: receiver191 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow192: + sender_id: sender192 + receiver_id: receiver192 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow193: + sender_id: sender193 + receiver_id: receiver193 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow194: + sender_id: sender194 + receiver_id: receiver194 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow195: + sender_id: sender195 + receiver_id: receiver195 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow196: + sender_id: sender196 + receiver_id: receiver196 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow197: + sender_id: sender197 + receiver_id: receiver197 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow198: + sender_id: sender198 + receiver_id: receiver198 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow199: + sender_id: sender199 + receiver_id: receiver199 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow200: + sender_id: sender200 + receiver_id: receiver200 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow201: + sender_id: sender201 + receiver_id: receiver201 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow202: + sender_id: sender202 + receiver_id: receiver202 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow203: + sender_id: sender203 + receiver_id: receiver203 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow204: + sender_id: sender204 + receiver_id: receiver204 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow205: + sender_id: sender205 + receiver_id: receiver205 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow206: + sender_id: sender206 + receiver_id: receiver206 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow207: + sender_id: sender207 + receiver_id: receiver207 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow208: + sender_id: sender208 + receiver_id: receiver208 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow209: + sender_id: sender209 + receiver_id: receiver209 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow210: + sender_id: sender210 + receiver_id: receiver210 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow211: + sender_id: sender211 + receiver_id: receiver211 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow212: + sender_id: sender212 + receiver_id: receiver212 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow213: + sender_id: sender213 + receiver_id: receiver213 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow214: + sender_id: sender214 + receiver_id: receiver214 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow215: + sender_id: sender215 + receiver_id: receiver215 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow216: + sender_id: sender216 + receiver_id: receiver216 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow217: + sender_id: sender217 + receiver_id: receiver217 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow218: + sender_id: sender218 + receiver_id: receiver218 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow219: + sender_id: sender219 + receiver_id: receiver219 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow220: + sender_id: sender220 + receiver_id: receiver220 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow221: + sender_id: sender221 + receiver_id: receiver221 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow222: + sender_id: sender222 + receiver_id: receiver222 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow223: + sender_id: sender223 + receiver_id: receiver223 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow224: + sender_id: sender224 + receiver_id: receiver224 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow225: + sender_id: sender225 + receiver_id: receiver225 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow226: + sender_id: sender226 + receiver_id: receiver226 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow227: + sender_id: sender227 + receiver_id: receiver227 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow228: + sender_id: sender228 + receiver_id: receiver228 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow229: + sender_id: sender229 + receiver_id: receiver229 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow230: + sender_id: sender230 + receiver_id: receiver230 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow231: + sender_id: sender231 + receiver_id: receiver231 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow232: + sender_id: sender232 + receiver_id: receiver232 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow233: + sender_id: sender233 + receiver_id: receiver233 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow234: + sender_id: sender234 + receiver_id: receiver234 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow235: + sender_id: sender235 + receiver_id: receiver235 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow236: + sender_id: sender236 + receiver_id: receiver236 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow237: + sender_id: sender237 + receiver_id: receiver237 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow238: + sender_id: sender238 + receiver_id: receiver238 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow239: + sender_id: sender239 + receiver_id: receiver239 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow240: + sender_id: sender240 + receiver_id: receiver240 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow241: + sender_id: sender241 + receiver_id: receiver241 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow242: + sender_id: sender242 + receiver_id: receiver242 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow243: + sender_id: sender243 + receiver_id: receiver243 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow244: + sender_id: sender244 + receiver_id: receiver244 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow245: + sender_id: sender245 + receiver_id: receiver245 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow246: + sender_id: sender246 + receiver_id: receiver246 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow247: + sender_id: sender247 + receiver_id: receiver247 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow248: + sender_id: sender248 + receiver_id: receiver248 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow249: + sender_id: sender249 + receiver_id: receiver249 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow250: + sender_id: sender250 + receiver_id: receiver250 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow251: + sender_id: sender251 + receiver_id: receiver251 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow252: + sender_id: sender252 + receiver_id: receiver252 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow253: + sender_id: sender253 + receiver_id: receiver253 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow254: + sender_id: sender254 + receiver_id: receiver254 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 + flow255: + sender_id: sender255 + receiver_id: receiver255 + packet_size: 1538 + packet_interval: 100 + number_of_packets: 100000 +algorithm: ep +simulation_time: 10000000 diff --git a/configuration_examples/topology_examples/ep_topology.yml b/configuration_examples/topology_examples/ep_topology.yml new file mode 100644 index 0000000000..360746864a --- /dev/null +++ b/configuration_examples/topology_examples/ep_topology.yml @@ -0,0 +1,8212 @@ +devices: + sender0: + type: sender + sender1: + type: sender + sender2: + type: sender + sender3: + type: sender + sender4: + type: sender + sender5: + type: sender + sender6: + type: sender + sender7: + type: sender + sender8: + type: sender + sender9: + type: sender + sender10: + type: sender + sender11: + type: sender + sender12: + type: sender + sender13: + type: sender + sender14: + type: sender + sender15: + type: sender + sender16: + type: sender + sender17: + type: sender + sender18: + type: sender + sender19: + type: sender + sender20: + type: sender + sender21: + type: sender + sender22: + type: sender + sender23: + type: sender + sender24: + type: sender + sender25: + type: sender + sender26: + type: sender + sender27: + type: sender + sender28: + type: sender + sender29: + type: sender + sender30: + type: sender + sender31: + type: sender + sender32: + type: sender + sender33: + type: sender + sender34: + type: sender + sender35: + type: sender + sender36: + type: sender + sender37: + type: sender + sender38: + type: sender + sender39: + type: sender + sender40: + type: sender + sender41: + type: sender + sender42: + type: sender + sender43: + type: sender + sender44: + type: sender + sender45: + type: sender + sender46: + type: sender + sender47: + type: sender + sender48: + type: sender + sender49: + type: sender + sender50: + type: sender + sender51: + type: sender + sender52: + type: sender + sender53: + type: sender + sender54: + type: sender + sender55: + type: sender + sender56: + type: sender + sender57: + type: sender + sender58: + type: sender + sender59: + type: sender + sender60: + type: sender + sender61: + type: sender + sender62: + type: sender + sender63: + type: sender + sender64: + type: sender + sender65: + type: sender + sender66: + type: sender + sender67: + type: sender + sender68: + type: sender + sender69: + type: sender + sender70: + type: sender + sender71: + type: sender + sender72: + type: sender + sender73: + type: sender + sender74: + type: sender + sender75: + type: sender + sender76: + type: sender + sender77: + type: sender + sender78: + type: sender + sender79: + type: sender + sender80: + type: sender + sender81: + type: sender + sender82: + type: sender + sender83: + type: sender + sender84: + type: sender + sender85: + type: sender + sender86: + type: sender + sender87: + type: sender + sender88: + type: sender + sender89: + type: sender + sender90: + type: sender + sender91: + type: sender + sender92: + type: sender + sender93: + type: sender + sender94: + type: sender + sender95: + type: sender + sender96: + type: sender + sender97: + type: sender + sender98: + type: sender + sender99: + type: sender + sender100: + type: sender + sender101: + type: sender + sender102: + type: sender + sender103: + type: sender + sender104: + type: sender + sender105: + type: sender + sender106: + type: sender + sender107: + type: sender + sender108: + type: sender + sender109: + type: sender + sender110: + type: sender + sender111: + type: sender + sender112: + type: sender + sender113: + type: sender + sender114: + type: sender + sender115: + type: sender + sender116: + type: sender + sender117: + type: sender + sender118: + type: sender + sender119: + type: sender + sender120: + type: sender + sender121: + type: sender + sender122: + type: sender + sender123: + type: sender + sender124: + type: sender + sender125: + type: sender + sender126: + type: sender + sender127: + type: sender + sender128: + type: sender + sender129: + type: sender + sender130: + type: sender + sender131: + type: sender + sender132: + type: sender + sender133: + type: sender + sender134: + type: sender + sender135: + type: sender + sender136: + type: sender + sender137: + type: sender + sender138: + type: sender + sender139: + type: sender + sender140: + type: sender + sender141: + type: sender + sender142: + type: sender + sender143: + type: sender + sender144: + type: sender + sender145: + type: sender + sender146: + type: sender + sender147: + type: sender + sender148: + type: sender + sender149: + type: sender + sender150: + type: sender + sender151: + type: sender + sender152: + type: sender + sender153: + type: sender + sender154: + type: sender + sender155: + type: sender + sender156: + type: sender + sender157: + type: sender + sender158: + type: sender + sender159: + type: sender + sender160: + type: sender + sender161: + type: sender + sender162: + type: sender + sender163: + type: sender + sender164: + type: sender + sender165: + type: sender + sender166: + type: sender + sender167: + type: sender + sender168: + type: sender + sender169: + type: sender + sender170: + type: sender + sender171: + type: sender + sender172: + type: sender + sender173: + type: sender + sender174: + type: sender + sender175: + type: sender + sender176: + type: sender + sender177: + type: sender + sender178: + type: sender + sender179: + type: sender + sender180: + type: sender + sender181: + type: sender + sender182: + type: sender + sender183: + type: sender + sender184: + type: sender + sender185: + type: sender + sender186: + type: sender + sender187: + type: sender + sender188: + type: sender + sender189: + type: sender + sender190: + type: sender + sender191: + type: sender + sender192: + type: sender + sender193: + type: sender + sender194: + type: sender + sender195: + type: sender + sender196: + type: sender + sender197: + type: sender + sender198: + type: sender + sender199: + type: sender + sender200: + type: sender + sender201: + type: sender + sender202: + type: sender + sender203: + type: sender + sender204: + type: sender + sender205: + type: sender + sender206: + type: sender + sender207: + type: sender + sender208: + type: sender + sender209: + type: sender + sender210: + type: sender + sender211: + type: sender + sender212: + type: sender + sender213: + type: sender + sender214: + type: sender + sender215: + type: sender + sender216: + type: sender + sender217: + type: sender + sender218: + type: sender + sender219: + type: sender + sender220: + type: sender + sender221: + type: sender + sender222: + type: sender + sender223: + type: sender + sender224: + type: sender + sender225: + type: sender + sender226: + type: sender + sender227: + type: sender + sender228: + type: sender + sender229: + type: sender + sender230: + type: sender + sender231: + type: sender + sender232: + type: sender + sender233: + type: sender + sender234: + type: sender + sender235: + type: sender + sender236: + type: sender + sender237: + type: sender + sender238: + type: sender + sender239: + type: sender + sender240: + type: sender + sender241: + type: sender + sender242: + type: sender + sender243: + type: sender + sender244: + type: sender + sender245: + type: sender + sender246: + type: sender + sender247: + type: sender + sender248: + type: sender + sender249: + type: sender + sender250: + type: sender + sender251: + type: sender + sender252: + type: sender + sender253: + type: sender + sender254: + type: sender + sender255: + type: sender + receiver0: + type: receiver + receiver1: + type: receiver + receiver2: + type: receiver + receiver3: + type: receiver + receiver4: + type: receiver + receiver5: + type: receiver + receiver6: + type: receiver + receiver7: + type: receiver + receiver8: + type: receiver + receiver9: + type: receiver + receiver10: + type: receiver + receiver11: + type: receiver + receiver12: + type: receiver + receiver13: + type: receiver + receiver14: + type: receiver + receiver15: + type: receiver + receiver16: + type: receiver + receiver17: + type: receiver + receiver18: + type: receiver + receiver19: + type: receiver + receiver20: + type: receiver + receiver21: + type: receiver + receiver22: + type: receiver + receiver23: + type: receiver + receiver24: + type: receiver + receiver25: + type: receiver + receiver26: + type: receiver + receiver27: + type: receiver + receiver28: + type: receiver + receiver29: + type: receiver + receiver30: + type: receiver + receiver31: + type: receiver + receiver32: + type: receiver + receiver33: + type: receiver + receiver34: + type: receiver + receiver35: + type: receiver + receiver36: + type: receiver + receiver37: + type: receiver + receiver38: + type: receiver + receiver39: + type: receiver + receiver40: + type: receiver + receiver41: + type: receiver + receiver42: + type: receiver + receiver43: + type: receiver + receiver44: + type: receiver + receiver45: + type: receiver + receiver46: + type: receiver + receiver47: + type: receiver + receiver48: + type: receiver + receiver49: + type: receiver + receiver50: + type: receiver + receiver51: + type: receiver + receiver52: + type: receiver + receiver53: + type: receiver + receiver54: + type: receiver + receiver55: + type: receiver + receiver56: + type: receiver + receiver57: + type: receiver + receiver58: + type: receiver + receiver59: + type: receiver + receiver60: + type: receiver + receiver61: + type: receiver + receiver62: + type: receiver + receiver63: + type: receiver + receiver64: + type: receiver + receiver65: + type: receiver + receiver66: + type: receiver + receiver67: + type: receiver + receiver68: + type: receiver + receiver69: + type: receiver + receiver70: + type: receiver + receiver71: + type: receiver + receiver72: + type: receiver + receiver73: + type: receiver + receiver74: + type: receiver + receiver75: + type: receiver + receiver76: + type: receiver + receiver77: + type: receiver + receiver78: + type: receiver + receiver79: + type: receiver + receiver80: + type: receiver + receiver81: + type: receiver + receiver82: + type: receiver + receiver83: + type: receiver + receiver84: + type: receiver + receiver85: + type: receiver + receiver86: + type: receiver + receiver87: + type: receiver + receiver88: + type: receiver + receiver89: + type: receiver + receiver90: + type: receiver + receiver91: + type: receiver + receiver92: + type: receiver + receiver93: + type: receiver + receiver94: + type: receiver + receiver95: + type: receiver + receiver96: + type: receiver + receiver97: + type: receiver + receiver98: + type: receiver + receiver99: + type: receiver + receiver100: + type: receiver + receiver101: + type: receiver + receiver102: + type: receiver + receiver103: + type: receiver + receiver104: + type: receiver + receiver105: + type: receiver + receiver106: + type: receiver + receiver107: + type: receiver + receiver108: + type: receiver + receiver109: + type: receiver + receiver110: + type: receiver + receiver111: + type: receiver + receiver112: + type: receiver + receiver113: + type: receiver + receiver114: + type: receiver + receiver115: + type: receiver + receiver116: + type: receiver + receiver117: + type: receiver + receiver118: + type: receiver + receiver119: + type: receiver + receiver120: + type: receiver + receiver121: + type: receiver + receiver122: + type: receiver + receiver123: + type: receiver + receiver124: + type: receiver + receiver125: + type: receiver + receiver126: + type: receiver + receiver127: + type: receiver + receiver128: + type: receiver + receiver129: + type: receiver + receiver130: + type: receiver + receiver131: + type: receiver + receiver132: + type: receiver + receiver133: + type: receiver + receiver134: + type: receiver + receiver135: + type: receiver + receiver136: + type: receiver + receiver137: + type: receiver + receiver138: + type: receiver + receiver139: + type: receiver + receiver140: + type: receiver + receiver141: + type: receiver + receiver142: + type: receiver + receiver143: + type: receiver + receiver144: + type: receiver + receiver145: + type: receiver + receiver146: + type: receiver + receiver147: + type: receiver + receiver148: + type: receiver + receiver149: + type: receiver + receiver150: + type: receiver + receiver151: + type: receiver + receiver152: + type: receiver + receiver153: + type: receiver + receiver154: + type: receiver + receiver155: + type: receiver + receiver156: + type: receiver + receiver157: + type: receiver + receiver158: + type: receiver + receiver159: + type: receiver + receiver160: + type: receiver + receiver161: + type: receiver + receiver162: + type: receiver + receiver163: + type: receiver + receiver164: + type: receiver + receiver165: + type: receiver + receiver166: + type: receiver + receiver167: + type: receiver + receiver168: + type: receiver + receiver169: + type: receiver + receiver170: + type: receiver + receiver171: + type: receiver + receiver172: + type: receiver + receiver173: + type: receiver + receiver174: + type: receiver + receiver175: + type: receiver + receiver176: + type: receiver + receiver177: + type: receiver + receiver178: + type: receiver + receiver179: + type: receiver + receiver180: + type: receiver + receiver181: + type: receiver + receiver182: + type: receiver + receiver183: + type: receiver + receiver184: + type: receiver + receiver185: + type: receiver + receiver186: + type: receiver + receiver187: + type: receiver + receiver188: + type: receiver + receiver189: + type: receiver + receiver190: + type: receiver + receiver191: + type: receiver + receiver192: + type: receiver + receiver193: + type: receiver + receiver194: + type: receiver + receiver195: + type: receiver + receiver196: + type: receiver + receiver197: + type: receiver + receiver198: + type: receiver + receiver199: + type: receiver + receiver200: + type: receiver + receiver201: + type: receiver + receiver202: + type: receiver + receiver203: + type: receiver + receiver204: + type: receiver + receiver205: + type: receiver + receiver206: + type: receiver + receiver207: + type: receiver + receiver208: + type: receiver + receiver209: + type: receiver + receiver210: + type: receiver + receiver211: + type: receiver + receiver212: + type: receiver + receiver213: + type: receiver + receiver214: + type: receiver + receiver215: + type: receiver + receiver216: + type: receiver + receiver217: + type: receiver + receiver218: + type: receiver + receiver219: + type: receiver + receiver220: + type: receiver + receiver221: + type: receiver + receiver222: + type: receiver + receiver223: + type: receiver + receiver224: + type: receiver + receiver225: + type: receiver + receiver226: + type: receiver + receiver227: + type: receiver + receiver228: + type: receiver + receiver229: + type: receiver + receiver230: + type: receiver + receiver231: + type: receiver + receiver232: + type: receiver + receiver233: + type: receiver + receiver234: + type: receiver + receiver235: + type: receiver + receiver236: + type: receiver + receiver237: + type: receiver + receiver238: + type: receiver + receiver239: + type: receiver + receiver240: + type: receiver + receiver241: + type: receiver + receiver242: + type: receiver + receiver243: + type: receiver + receiver244: + type: receiver + receiver245: + type: receiver + receiver246: + type: receiver + receiver247: + type: receiver + receiver248: + type: receiver + receiver249: + type: receiver + receiver250: + type: receiver + receiver251: + type: receiver + receiver252: + type: receiver + receiver253: + type: receiver + receiver254: + type: receiver + receiver255: + type: receiver + bus1: + type: switch + bus2: + type: switch +links: + link0: + from: sender0 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1: + from: bus1 + to: sender0 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link2: + from: sender1 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link3: + from: bus1 + to: sender1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link4: + from: sender2 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link5: + from: bus1 + to: sender2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link6: + from: sender3 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link7: + from: bus1 + to: sender3 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link8: + from: sender4 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link9: + from: bus1 + to: sender4 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link10: + from: sender5 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link11: + from: bus1 + to: sender5 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link12: + from: sender6 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link13: + from: bus1 + to: sender6 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link14: + from: sender7 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link15: + from: bus1 + to: sender7 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link16: + from: sender8 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link17: + from: bus1 + to: sender8 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link18: + from: sender9 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link19: + from: bus1 + to: sender9 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link20: + from: sender10 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link21: + from: bus1 + to: sender10 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link22: + from: sender11 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link23: + from: bus1 + to: sender11 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link24: + from: sender12 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link25: + from: bus1 + to: sender12 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link26: + from: sender13 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link27: + from: bus1 + to: sender13 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link28: + from: sender14 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link29: + from: bus1 + to: sender14 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link30: + from: sender15 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link31: + from: bus1 + to: sender15 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link32: + from: sender16 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link33: + from: bus1 + to: sender16 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link34: + from: sender17 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link35: + from: bus1 + to: sender17 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link36: + from: sender18 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link37: + from: bus1 + to: sender18 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link38: + from: sender19 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link39: + from: bus1 + to: sender19 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link40: + from: sender20 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link41: + from: bus1 + to: sender20 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link42: + from: sender21 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link43: + from: bus1 + to: sender21 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link44: + from: sender22 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link45: + from: bus1 + to: sender22 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link46: + from: sender23 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link47: + from: bus1 + to: sender23 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link48: + from: sender24 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link49: + from: bus1 + to: sender24 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link50: + from: sender25 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link51: + from: bus1 + to: sender25 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link52: + from: sender26 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link53: + from: bus1 + to: sender26 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link54: + from: sender27 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link55: + from: bus1 + to: sender27 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link56: + from: sender28 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link57: + from: bus1 + to: sender28 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link58: + from: sender29 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link59: + from: bus1 + to: sender29 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link60: + from: sender30 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link61: + from: bus1 + to: sender30 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link62: + from: sender31 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link63: + from: bus1 + to: sender31 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link64: + from: sender32 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link65: + from: bus1 + to: sender32 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link66: + from: sender33 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link67: + from: bus1 + to: sender33 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link68: + from: sender34 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link69: + from: bus1 + to: sender34 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link70: + from: sender35 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link71: + from: bus1 + to: sender35 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link72: + from: sender36 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link73: + from: bus1 + to: sender36 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link74: + from: sender37 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link75: + from: bus1 + to: sender37 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link76: + from: sender38 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link77: + from: bus1 + to: sender38 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link78: + from: sender39 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link79: + from: bus1 + to: sender39 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link80: + from: sender40 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link81: + from: bus1 + to: sender40 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link82: + from: sender41 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link83: + from: bus1 + to: sender41 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link84: + from: sender42 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link85: + from: bus1 + to: sender42 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link86: + from: sender43 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link87: + from: bus1 + to: sender43 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link88: + from: sender44 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link89: + from: bus1 + to: sender44 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link90: + from: sender45 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link91: + from: bus1 + to: sender45 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link92: + from: sender46 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link93: + from: bus1 + to: sender46 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link94: + from: sender47 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link95: + from: bus1 + to: sender47 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link96: + from: sender48 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link97: + from: bus1 + to: sender48 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link98: + from: sender49 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link99: + from: bus1 + to: sender49 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link100: + from: sender50 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link101: + from: bus1 + to: sender50 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link102: + from: sender51 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link103: + from: bus1 + to: sender51 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link104: + from: sender52 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link105: + from: bus1 + to: sender52 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link106: + from: sender53 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link107: + from: bus1 + to: sender53 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link108: + from: sender54 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link109: + from: bus1 + to: sender54 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link110: + from: sender55 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link111: + from: bus1 + to: sender55 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link112: + from: sender56 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link113: + from: bus1 + to: sender56 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link114: + from: sender57 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link115: + from: bus1 + to: sender57 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link116: + from: sender58 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link117: + from: bus1 + to: sender58 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link118: + from: sender59 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link119: + from: bus1 + to: sender59 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link120: + from: sender60 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link121: + from: bus1 + to: sender60 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link122: + from: sender61 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link123: + from: bus1 + to: sender61 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link124: + from: sender62 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link125: + from: bus1 + to: sender62 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link126: + from: sender63 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link127: + from: bus1 + to: sender63 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link128: + from: sender64 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link129: + from: bus1 + to: sender64 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link130: + from: sender65 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link131: + from: bus1 + to: sender65 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link132: + from: sender66 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link133: + from: bus1 + to: sender66 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link134: + from: sender67 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link135: + from: bus1 + to: sender67 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link136: + from: sender68 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link137: + from: bus1 + to: sender68 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link138: + from: sender69 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link139: + from: bus1 + to: sender69 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link140: + from: sender70 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link141: + from: bus1 + to: sender70 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link142: + from: sender71 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link143: + from: bus1 + to: sender71 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link144: + from: sender72 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link145: + from: bus1 + to: sender72 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link146: + from: sender73 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link147: + from: bus1 + to: sender73 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link148: + from: sender74 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link149: + from: bus1 + to: sender74 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link150: + from: sender75 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link151: + from: bus1 + to: sender75 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link152: + from: sender76 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link153: + from: bus1 + to: sender76 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link154: + from: sender77 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link155: + from: bus1 + to: sender77 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link156: + from: sender78 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link157: + from: bus1 + to: sender78 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link158: + from: sender79 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link159: + from: bus1 + to: sender79 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link160: + from: sender80 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link161: + from: bus1 + to: sender80 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link162: + from: sender81 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link163: + from: bus1 + to: sender81 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link164: + from: sender82 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link165: + from: bus1 + to: sender82 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link166: + from: sender83 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link167: + from: bus1 + to: sender83 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link168: + from: sender84 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link169: + from: bus1 + to: sender84 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link170: + from: sender85 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link171: + from: bus1 + to: sender85 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link172: + from: sender86 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link173: + from: bus1 + to: sender86 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link174: + from: sender87 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link175: + from: bus1 + to: sender87 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link176: + from: sender88 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link177: + from: bus1 + to: sender88 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link178: + from: sender89 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link179: + from: bus1 + to: sender89 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link180: + from: sender90 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link181: + from: bus1 + to: sender90 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link182: + from: sender91 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link183: + from: bus1 + to: sender91 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link184: + from: sender92 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link185: + from: bus1 + to: sender92 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link186: + from: sender93 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link187: + from: bus1 + to: sender93 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link188: + from: sender94 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link189: + from: bus1 + to: sender94 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link190: + from: sender95 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link191: + from: bus1 + to: sender95 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link192: + from: sender96 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link193: + from: bus1 + to: sender96 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link194: + from: sender97 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link195: + from: bus1 + to: sender97 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link196: + from: sender98 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link197: + from: bus1 + to: sender98 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link198: + from: sender99 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link199: + from: bus1 + to: sender99 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link200: + from: sender100 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link201: + from: bus1 + to: sender100 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link202: + from: sender101 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link203: + from: bus1 + to: sender101 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link204: + from: sender102 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link205: + from: bus1 + to: sender102 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link206: + from: sender103 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link207: + from: bus1 + to: sender103 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link208: + from: sender104 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link209: + from: bus1 + to: sender104 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link210: + from: sender105 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link211: + from: bus1 + to: sender105 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link212: + from: sender106 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link213: + from: bus1 + to: sender106 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link214: + from: sender107 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link215: + from: bus1 + to: sender107 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link216: + from: sender108 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link217: + from: bus1 + to: sender108 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link218: + from: sender109 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link219: + from: bus1 + to: sender109 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link220: + from: sender110 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link221: + from: bus1 + to: sender110 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link222: + from: sender111 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link223: + from: bus1 + to: sender111 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link224: + from: sender112 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link225: + from: bus1 + to: sender112 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link226: + from: sender113 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link227: + from: bus1 + to: sender113 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link228: + from: sender114 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link229: + from: bus1 + to: sender114 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link230: + from: sender115 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link231: + from: bus1 + to: sender115 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link232: + from: sender116 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link233: + from: bus1 + to: sender116 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link234: + from: sender117 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link235: + from: bus1 + to: sender117 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link236: + from: sender118 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link237: + from: bus1 + to: sender118 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link238: + from: sender119 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link239: + from: bus1 + to: sender119 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link240: + from: sender120 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link241: + from: bus1 + to: sender120 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link242: + from: sender121 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link243: + from: bus1 + to: sender121 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link244: + from: sender122 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link245: + from: bus1 + to: sender122 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link246: + from: sender123 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link247: + from: bus1 + to: sender123 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link248: + from: sender124 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link249: + from: bus1 + to: sender124 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link250: + from: sender125 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link251: + from: bus1 + to: sender125 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link252: + from: sender126 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link253: + from: bus1 + to: sender126 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link254: + from: sender127 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link255: + from: bus1 + to: sender127 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link256: + from: sender128 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link257: + from: bus1 + to: sender128 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link258: + from: sender129 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link259: + from: bus1 + to: sender129 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link260: + from: sender130 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link261: + from: bus1 + to: sender130 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link262: + from: sender131 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link263: + from: bus1 + to: sender131 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link264: + from: sender132 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link265: + from: bus1 + to: sender132 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link266: + from: sender133 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link267: + from: bus1 + to: sender133 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link268: + from: sender134 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link269: + from: bus1 + to: sender134 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link270: + from: sender135 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link271: + from: bus1 + to: sender135 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link272: + from: sender136 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link273: + from: bus1 + to: sender136 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link274: + from: sender137 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link275: + from: bus1 + to: sender137 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link276: + from: sender138 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link277: + from: bus1 + to: sender138 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link278: + from: sender139 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link279: + from: bus1 + to: sender139 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link280: + from: sender140 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link281: + from: bus1 + to: sender140 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link282: + from: sender141 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link283: + from: bus1 + to: sender141 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link284: + from: sender142 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link285: + from: bus1 + to: sender142 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link286: + from: sender143 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link287: + from: bus1 + to: sender143 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link288: + from: sender144 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link289: + from: bus1 + to: sender144 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link290: + from: sender145 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link291: + from: bus1 + to: sender145 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link292: + from: sender146 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link293: + from: bus1 + to: sender146 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link294: + from: sender147 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link295: + from: bus1 + to: sender147 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link296: + from: sender148 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link297: + from: bus1 + to: sender148 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link298: + from: sender149 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link299: + from: bus1 + to: sender149 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link300: + from: sender150 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link301: + from: bus1 + to: sender150 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link302: + from: sender151 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link303: + from: bus1 + to: sender151 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link304: + from: sender152 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link305: + from: bus1 + to: sender152 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link306: + from: sender153 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link307: + from: bus1 + to: sender153 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link308: + from: sender154 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link309: + from: bus1 + to: sender154 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link310: + from: sender155 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link311: + from: bus1 + to: sender155 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link312: + from: sender156 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link313: + from: bus1 + to: sender156 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link314: + from: sender157 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link315: + from: bus1 + to: sender157 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link316: + from: sender158 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link317: + from: bus1 + to: sender158 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link318: + from: sender159 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link319: + from: bus1 + to: sender159 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link320: + from: sender160 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link321: + from: bus1 + to: sender160 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link322: + from: sender161 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link323: + from: bus1 + to: sender161 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link324: + from: sender162 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link325: + from: bus1 + to: sender162 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link326: + from: sender163 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link327: + from: bus1 + to: sender163 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link328: + from: sender164 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link329: + from: bus1 + to: sender164 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link330: + from: sender165 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link331: + from: bus1 + to: sender165 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link332: + from: sender166 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link333: + from: bus1 + to: sender166 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link334: + from: sender167 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link335: + from: bus1 + to: sender167 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link336: + from: sender168 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link337: + from: bus1 + to: sender168 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link338: + from: sender169 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link339: + from: bus1 + to: sender169 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link340: + from: sender170 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link341: + from: bus1 + to: sender170 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link342: + from: sender171 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link343: + from: bus1 + to: sender171 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link344: + from: sender172 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link345: + from: bus1 + to: sender172 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link346: + from: sender173 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link347: + from: bus1 + to: sender173 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link348: + from: sender174 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link349: + from: bus1 + to: sender174 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link350: + from: sender175 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link351: + from: bus1 + to: sender175 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link352: + from: sender176 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link353: + from: bus1 + to: sender176 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link354: + from: sender177 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link355: + from: bus1 + to: sender177 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link356: + from: sender178 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link357: + from: bus1 + to: sender178 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link358: + from: sender179 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link359: + from: bus1 + to: sender179 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link360: + from: sender180 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link361: + from: bus1 + to: sender180 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link362: + from: sender181 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link363: + from: bus1 + to: sender181 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link364: + from: sender182 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link365: + from: bus1 + to: sender182 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link366: + from: sender183 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link367: + from: bus1 + to: sender183 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link368: + from: sender184 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link369: + from: bus1 + to: sender184 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link370: + from: sender185 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link371: + from: bus1 + to: sender185 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link372: + from: sender186 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link373: + from: bus1 + to: sender186 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link374: + from: sender187 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link375: + from: bus1 + to: sender187 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link376: + from: sender188 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link377: + from: bus1 + to: sender188 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link378: + from: sender189 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link379: + from: bus1 + to: sender189 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link380: + from: sender190 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link381: + from: bus1 + to: sender190 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link382: + from: sender191 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link383: + from: bus1 + to: sender191 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link384: + from: sender192 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link385: + from: bus1 + to: sender192 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link386: + from: sender193 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link387: + from: bus1 + to: sender193 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link388: + from: sender194 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link389: + from: bus1 + to: sender194 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link390: + from: sender195 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link391: + from: bus1 + to: sender195 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link392: + from: sender196 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link393: + from: bus1 + to: sender196 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link394: + from: sender197 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link395: + from: bus1 + to: sender197 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link396: + from: sender198 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link397: + from: bus1 + to: sender198 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link398: + from: sender199 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link399: + from: bus1 + to: sender199 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link400: + from: sender200 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link401: + from: bus1 + to: sender200 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link402: + from: sender201 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link403: + from: bus1 + to: sender201 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link404: + from: sender202 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link405: + from: bus1 + to: sender202 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link406: + from: sender203 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link407: + from: bus1 + to: sender203 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link408: + from: sender204 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link409: + from: bus1 + to: sender204 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link410: + from: sender205 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link411: + from: bus1 + to: sender205 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link412: + from: sender206 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link413: + from: bus1 + to: sender206 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link414: + from: sender207 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link415: + from: bus1 + to: sender207 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link416: + from: sender208 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link417: + from: bus1 + to: sender208 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link418: + from: sender209 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link419: + from: bus1 + to: sender209 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link420: + from: sender210 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link421: + from: bus1 + to: sender210 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link422: + from: sender211 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link423: + from: bus1 + to: sender211 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link424: + from: sender212 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link425: + from: bus1 + to: sender212 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link426: + from: sender213 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link427: + from: bus1 + to: sender213 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link428: + from: sender214 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link429: + from: bus1 + to: sender214 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link430: + from: sender215 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link431: + from: bus1 + to: sender215 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link432: + from: sender216 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link433: + from: bus1 + to: sender216 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link434: + from: sender217 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link435: + from: bus1 + to: sender217 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link436: + from: sender218 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link437: + from: bus1 + to: sender218 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link438: + from: sender219 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link439: + from: bus1 + to: sender219 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link440: + from: sender220 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link441: + from: bus1 + to: sender220 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link442: + from: sender221 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link443: + from: bus1 + to: sender221 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link444: + from: sender222 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link445: + from: bus1 + to: sender222 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link446: + from: sender223 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link447: + from: bus1 + to: sender223 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link448: + from: sender224 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link449: + from: bus1 + to: sender224 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link450: + from: sender225 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link451: + from: bus1 + to: sender225 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link452: + from: sender226 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link453: + from: bus1 + to: sender226 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link454: + from: sender227 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link455: + from: bus1 + to: sender227 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link456: + from: sender228 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link457: + from: bus1 + to: sender228 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link458: + from: sender229 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link459: + from: bus1 + to: sender229 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link460: + from: sender230 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link461: + from: bus1 + to: sender230 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link462: + from: sender231 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link463: + from: bus1 + to: sender231 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link464: + from: sender232 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link465: + from: bus1 + to: sender232 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link466: + from: sender233 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link467: + from: bus1 + to: sender233 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link468: + from: sender234 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link469: + from: bus1 + to: sender234 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link470: + from: sender235 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link471: + from: bus1 + to: sender235 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link472: + from: sender236 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link473: + from: bus1 + to: sender236 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link474: + from: sender237 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link475: + from: bus1 + to: sender237 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link476: + from: sender238 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link477: + from: bus1 + to: sender238 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link478: + from: sender239 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link479: + from: bus1 + to: sender239 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link480: + from: sender240 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link481: + from: bus1 + to: sender240 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link482: + from: sender241 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link483: + from: bus1 + to: sender241 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link484: + from: sender242 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link485: + from: bus1 + to: sender242 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link486: + from: sender243 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link487: + from: bus1 + to: sender243 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link488: + from: sender244 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link489: + from: bus1 + to: sender244 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link490: + from: sender245 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link491: + from: bus1 + to: sender245 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link492: + from: sender246 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link493: + from: bus1 + to: sender246 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link494: + from: sender247 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link495: + from: bus1 + to: sender247 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link496: + from: sender248 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link497: + from: bus1 + to: sender248 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link498: + from: sender249 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link499: + from: bus1 + to: sender249 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link500: + from: sender250 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link501: + from: bus1 + to: sender250 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link502: + from: sender251 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link503: + from: bus1 + to: sender251 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link504: + from: sender252 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link505: + from: bus1 + to: sender252 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link506: + from: sender253 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link507: + from: bus1 + to: sender253 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link508: + from: sender254 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link509: + from: bus1 + to: sender254 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link510: + from: sender255 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link511: + from: bus1 + to: sender255 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link512: + from: bus2 + to: receiver0 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link513: + from: receiver0 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link514: + from: bus2 + to: receiver1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link515: + from: receiver1 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link516: + from: bus2 + to: receiver2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link517: + from: receiver2 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link518: + from: bus2 + to: receiver3 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link519: + from: receiver3 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link520: + from: bus2 + to: receiver4 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link521: + from: receiver4 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link522: + from: bus2 + to: receiver5 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link523: + from: receiver5 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link524: + from: bus2 + to: receiver6 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link525: + from: receiver6 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link526: + from: bus2 + to: receiver7 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link527: + from: receiver7 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link528: + from: bus2 + to: receiver8 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link529: + from: receiver8 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link530: + from: bus2 + to: receiver9 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link531: + from: receiver9 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link532: + from: bus2 + to: receiver10 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link533: + from: receiver10 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link534: + from: bus2 + to: receiver11 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link535: + from: receiver11 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link536: + from: bus2 + to: receiver12 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link537: + from: receiver12 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link538: + from: bus2 + to: receiver13 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link539: + from: receiver13 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link540: + from: bus2 + to: receiver14 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link541: + from: receiver14 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link542: + from: bus2 + to: receiver15 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link543: + from: receiver15 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link544: + from: bus2 + to: receiver16 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link545: + from: receiver16 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link546: + from: bus2 + to: receiver17 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link547: + from: receiver17 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link548: + from: bus2 + to: receiver18 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link549: + from: receiver18 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link550: + from: bus2 + to: receiver19 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link551: + from: receiver19 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link552: + from: bus2 + to: receiver20 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link553: + from: receiver20 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link554: + from: bus2 + to: receiver21 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link555: + from: receiver21 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link556: + from: bus2 + to: receiver22 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link557: + from: receiver22 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link558: + from: bus2 + to: receiver23 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link559: + from: receiver23 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link560: + from: bus2 + to: receiver24 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link561: + from: receiver24 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link562: + from: bus2 + to: receiver25 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link563: + from: receiver25 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link564: + from: bus2 + to: receiver26 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link565: + from: receiver26 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link566: + from: bus2 + to: receiver27 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link567: + from: receiver27 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link568: + from: bus2 + to: receiver28 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link569: + from: receiver28 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link570: + from: bus2 + to: receiver29 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link571: + from: receiver29 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link572: + from: bus2 + to: receiver30 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link573: + from: receiver30 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link574: + from: bus2 + to: receiver31 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link575: + from: receiver31 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link576: + from: bus2 + to: receiver32 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link577: + from: receiver32 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link578: + from: bus2 + to: receiver33 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link579: + from: receiver33 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link580: + from: bus2 + to: receiver34 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link581: + from: receiver34 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link582: + from: bus2 + to: receiver35 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link583: + from: receiver35 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link584: + from: bus2 + to: receiver36 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link585: + from: receiver36 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link586: + from: bus2 + to: receiver37 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link587: + from: receiver37 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link588: + from: bus2 + to: receiver38 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link589: + from: receiver38 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link590: + from: bus2 + to: receiver39 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link591: + from: receiver39 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link592: + from: bus2 + to: receiver40 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link593: + from: receiver40 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link594: + from: bus2 + to: receiver41 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link595: + from: receiver41 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link596: + from: bus2 + to: receiver42 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link597: + from: receiver42 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link598: + from: bus2 + to: receiver43 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link599: + from: receiver43 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link600: + from: bus2 + to: receiver44 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link601: + from: receiver44 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link602: + from: bus2 + to: receiver45 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link603: + from: receiver45 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link604: + from: bus2 + to: receiver46 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link605: + from: receiver46 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link606: + from: bus2 + to: receiver47 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link607: + from: receiver47 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link608: + from: bus2 + to: receiver48 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link609: + from: receiver48 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link610: + from: bus2 + to: receiver49 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link611: + from: receiver49 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link612: + from: bus2 + to: receiver50 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link613: + from: receiver50 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link614: + from: bus2 + to: receiver51 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link615: + from: receiver51 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link616: + from: bus2 + to: receiver52 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link617: + from: receiver52 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link618: + from: bus2 + to: receiver53 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link619: + from: receiver53 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link620: + from: bus2 + to: receiver54 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link621: + from: receiver54 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link622: + from: bus2 + to: receiver55 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link623: + from: receiver55 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link624: + from: bus2 + to: receiver56 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link625: + from: receiver56 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link626: + from: bus2 + to: receiver57 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link627: + from: receiver57 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link628: + from: bus2 + to: receiver58 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link629: + from: receiver58 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link630: + from: bus2 + to: receiver59 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link631: + from: receiver59 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link632: + from: bus2 + to: receiver60 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link633: + from: receiver60 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link634: + from: bus2 + to: receiver61 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link635: + from: receiver61 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link636: + from: bus2 + to: receiver62 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link637: + from: receiver62 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link638: + from: bus2 + to: receiver63 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link639: + from: receiver63 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link640: + from: bus2 + to: receiver64 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link641: + from: receiver64 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link642: + from: bus2 + to: receiver65 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link643: + from: receiver65 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link644: + from: bus2 + to: receiver66 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link645: + from: receiver66 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link646: + from: bus2 + to: receiver67 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link647: + from: receiver67 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link648: + from: bus2 + to: receiver68 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link649: + from: receiver68 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link650: + from: bus2 + to: receiver69 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link651: + from: receiver69 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link652: + from: bus2 + to: receiver70 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link653: + from: receiver70 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link654: + from: bus2 + to: receiver71 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link655: + from: receiver71 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link656: + from: bus2 + to: receiver72 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link657: + from: receiver72 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link658: + from: bus2 + to: receiver73 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link659: + from: receiver73 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link660: + from: bus2 + to: receiver74 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link661: + from: receiver74 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link662: + from: bus2 + to: receiver75 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link663: + from: receiver75 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link664: + from: bus2 + to: receiver76 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link665: + from: receiver76 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link666: + from: bus2 + to: receiver77 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link667: + from: receiver77 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link668: + from: bus2 + to: receiver78 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link669: + from: receiver78 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link670: + from: bus2 + to: receiver79 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link671: + from: receiver79 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link672: + from: bus2 + to: receiver80 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link673: + from: receiver80 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link674: + from: bus2 + to: receiver81 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link675: + from: receiver81 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link676: + from: bus2 + to: receiver82 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link677: + from: receiver82 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link678: + from: bus2 + to: receiver83 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link679: + from: receiver83 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link680: + from: bus2 + to: receiver84 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link681: + from: receiver84 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link682: + from: bus2 + to: receiver85 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link683: + from: receiver85 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link684: + from: bus2 + to: receiver86 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link685: + from: receiver86 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link686: + from: bus2 + to: receiver87 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link687: + from: receiver87 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link688: + from: bus2 + to: receiver88 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link689: + from: receiver88 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link690: + from: bus2 + to: receiver89 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link691: + from: receiver89 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link692: + from: bus2 + to: receiver90 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link693: + from: receiver90 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link694: + from: bus2 + to: receiver91 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link695: + from: receiver91 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link696: + from: bus2 + to: receiver92 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link697: + from: receiver92 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link698: + from: bus2 + to: receiver93 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link699: + from: receiver93 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link700: + from: bus2 + to: receiver94 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link701: + from: receiver94 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link702: + from: bus2 + to: receiver95 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link703: + from: receiver95 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link704: + from: bus2 + to: receiver96 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link705: + from: receiver96 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link706: + from: bus2 + to: receiver97 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link707: + from: receiver97 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link708: + from: bus2 + to: receiver98 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link709: + from: receiver98 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link710: + from: bus2 + to: receiver99 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link711: + from: receiver99 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link712: + from: bus2 + to: receiver100 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link713: + from: receiver100 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link714: + from: bus2 + to: receiver101 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link715: + from: receiver101 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link716: + from: bus2 + to: receiver102 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link717: + from: receiver102 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link718: + from: bus2 + to: receiver103 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link719: + from: receiver103 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link720: + from: bus2 + to: receiver104 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link721: + from: receiver104 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link722: + from: bus2 + to: receiver105 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link723: + from: receiver105 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link724: + from: bus2 + to: receiver106 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link725: + from: receiver106 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link726: + from: bus2 + to: receiver107 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link727: + from: receiver107 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link728: + from: bus2 + to: receiver108 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link729: + from: receiver108 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link730: + from: bus2 + to: receiver109 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link731: + from: receiver109 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link732: + from: bus2 + to: receiver110 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link733: + from: receiver110 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link734: + from: bus2 + to: receiver111 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link735: + from: receiver111 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link736: + from: bus2 + to: receiver112 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link737: + from: receiver112 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link738: + from: bus2 + to: receiver113 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link739: + from: receiver113 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link740: + from: bus2 + to: receiver114 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link741: + from: receiver114 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link742: + from: bus2 + to: receiver115 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link743: + from: receiver115 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link744: + from: bus2 + to: receiver116 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link745: + from: receiver116 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link746: + from: bus2 + to: receiver117 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link747: + from: receiver117 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link748: + from: bus2 + to: receiver118 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link749: + from: receiver118 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link750: + from: bus2 + to: receiver119 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link751: + from: receiver119 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link752: + from: bus2 + to: receiver120 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link753: + from: receiver120 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link754: + from: bus2 + to: receiver121 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link755: + from: receiver121 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link756: + from: bus2 + to: receiver122 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link757: + from: receiver122 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link758: + from: bus2 + to: receiver123 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link759: + from: receiver123 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link760: + from: bus2 + to: receiver124 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link761: + from: receiver124 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link762: + from: bus2 + to: receiver125 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link763: + from: receiver125 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link764: + from: bus2 + to: receiver126 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link765: + from: receiver126 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link766: + from: bus2 + to: receiver127 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link767: + from: receiver127 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link768: + from: bus2 + to: receiver128 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link769: + from: receiver128 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link770: + from: bus2 + to: receiver129 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link771: + from: receiver129 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link772: + from: bus2 + to: receiver130 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link773: + from: receiver130 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link774: + from: bus2 + to: receiver131 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link775: + from: receiver131 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link776: + from: bus2 + to: receiver132 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link777: + from: receiver132 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link778: + from: bus2 + to: receiver133 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link779: + from: receiver133 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link780: + from: bus2 + to: receiver134 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link781: + from: receiver134 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link782: + from: bus2 + to: receiver135 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link783: + from: receiver135 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link784: + from: bus2 + to: receiver136 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link785: + from: receiver136 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link786: + from: bus2 + to: receiver137 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link787: + from: receiver137 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link788: + from: bus2 + to: receiver138 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link789: + from: receiver138 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link790: + from: bus2 + to: receiver139 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link791: + from: receiver139 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link792: + from: bus2 + to: receiver140 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link793: + from: receiver140 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link794: + from: bus2 + to: receiver141 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link795: + from: receiver141 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link796: + from: bus2 + to: receiver142 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link797: + from: receiver142 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link798: + from: bus2 + to: receiver143 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link799: + from: receiver143 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link800: + from: bus2 + to: receiver144 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link801: + from: receiver144 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link802: + from: bus2 + to: receiver145 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link803: + from: receiver145 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link804: + from: bus2 + to: receiver146 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link805: + from: receiver146 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link806: + from: bus2 + to: receiver147 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link807: + from: receiver147 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link808: + from: bus2 + to: receiver148 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link809: + from: receiver148 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link810: + from: bus2 + to: receiver149 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link811: + from: receiver149 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link812: + from: bus2 + to: receiver150 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link813: + from: receiver150 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link814: + from: bus2 + to: receiver151 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link815: + from: receiver151 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link816: + from: bus2 + to: receiver152 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link817: + from: receiver152 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link818: + from: bus2 + to: receiver153 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link819: + from: receiver153 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link820: + from: bus2 + to: receiver154 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link821: + from: receiver154 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link822: + from: bus2 + to: receiver155 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link823: + from: receiver155 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link824: + from: bus2 + to: receiver156 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link825: + from: receiver156 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link826: + from: bus2 + to: receiver157 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link827: + from: receiver157 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link828: + from: bus2 + to: receiver158 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link829: + from: receiver158 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link830: + from: bus2 + to: receiver159 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link831: + from: receiver159 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link832: + from: bus2 + to: receiver160 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link833: + from: receiver160 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link834: + from: bus2 + to: receiver161 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link835: + from: receiver161 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link836: + from: bus2 + to: receiver162 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link837: + from: receiver162 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link838: + from: bus2 + to: receiver163 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link839: + from: receiver163 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link840: + from: bus2 + to: receiver164 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link841: + from: receiver164 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link842: + from: bus2 + to: receiver165 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link843: + from: receiver165 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link844: + from: bus2 + to: receiver166 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link845: + from: receiver166 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link846: + from: bus2 + to: receiver167 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link847: + from: receiver167 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link848: + from: bus2 + to: receiver168 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link849: + from: receiver168 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link850: + from: bus2 + to: receiver169 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link851: + from: receiver169 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link852: + from: bus2 + to: receiver170 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link853: + from: receiver170 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link854: + from: bus2 + to: receiver171 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link855: + from: receiver171 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link856: + from: bus2 + to: receiver172 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link857: + from: receiver172 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link858: + from: bus2 + to: receiver173 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link859: + from: receiver173 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link860: + from: bus2 + to: receiver174 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link861: + from: receiver174 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link862: + from: bus2 + to: receiver175 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link863: + from: receiver175 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link864: + from: bus2 + to: receiver176 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link865: + from: receiver176 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link866: + from: bus2 + to: receiver177 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link867: + from: receiver177 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link868: + from: bus2 + to: receiver178 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link869: + from: receiver178 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link870: + from: bus2 + to: receiver179 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link871: + from: receiver179 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link872: + from: bus2 + to: receiver180 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link873: + from: receiver180 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link874: + from: bus2 + to: receiver181 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link875: + from: receiver181 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link876: + from: bus2 + to: receiver182 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link877: + from: receiver182 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link878: + from: bus2 + to: receiver183 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link879: + from: receiver183 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link880: + from: bus2 + to: receiver184 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link881: + from: receiver184 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link882: + from: bus2 + to: receiver185 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link883: + from: receiver185 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link884: + from: bus2 + to: receiver186 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link885: + from: receiver186 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link886: + from: bus2 + to: receiver187 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link887: + from: receiver187 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link888: + from: bus2 + to: receiver188 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link889: + from: receiver188 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link890: + from: bus2 + to: receiver189 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link891: + from: receiver189 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link892: + from: bus2 + to: receiver190 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link893: + from: receiver190 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link894: + from: bus2 + to: receiver191 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link895: + from: receiver191 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link896: + from: bus2 + to: receiver192 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link897: + from: receiver192 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link898: + from: bus2 + to: receiver193 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link899: + from: receiver193 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link900: + from: bus2 + to: receiver194 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link901: + from: receiver194 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link902: + from: bus2 + to: receiver195 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link903: + from: receiver195 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link904: + from: bus2 + to: receiver196 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link905: + from: receiver196 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link906: + from: bus2 + to: receiver197 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link907: + from: receiver197 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link908: + from: bus2 + to: receiver198 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link909: + from: receiver198 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link910: + from: bus2 + to: receiver199 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link911: + from: receiver199 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link912: + from: bus2 + to: receiver200 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link913: + from: receiver200 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link914: + from: bus2 + to: receiver201 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link915: + from: receiver201 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link916: + from: bus2 + to: receiver202 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link917: + from: receiver202 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link918: + from: bus2 + to: receiver203 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link919: + from: receiver203 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link920: + from: bus2 + to: receiver204 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link921: + from: receiver204 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link922: + from: bus2 + to: receiver205 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link923: + from: receiver205 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link924: + from: bus2 + to: receiver206 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link925: + from: receiver206 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link926: + from: bus2 + to: receiver207 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link927: + from: receiver207 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link928: + from: bus2 + to: receiver208 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link929: + from: receiver208 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link930: + from: bus2 + to: receiver209 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link931: + from: receiver209 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link932: + from: bus2 + to: receiver210 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link933: + from: receiver210 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link934: + from: bus2 + to: receiver211 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link935: + from: receiver211 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link936: + from: bus2 + to: receiver212 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link937: + from: receiver212 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link938: + from: bus2 + to: receiver213 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link939: + from: receiver213 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link940: + from: bus2 + to: receiver214 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link941: + from: receiver214 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link942: + from: bus2 + to: receiver215 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link943: + from: receiver215 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link944: + from: bus2 + to: receiver216 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link945: + from: receiver216 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link946: + from: bus2 + to: receiver217 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link947: + from: receiver217 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link948: + from: bus2 + to: receiver218 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link949: + from: receiver218 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link950: + from: bus2 + to: receiver219 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link951: + from: receiver219 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link952: + from: bus2 + to: receiver220 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link953: + from: receiver220 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link954: + from: bus2 + to: receiver221 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link955: + from: receiver221 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link956: + from: bus2 + to: receiver222 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link957: + from: receiver222 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link958: + from: bus2 + to: receiver223 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link959: + from: receiver223 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link960: + from: bus2 + to: receiver224 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link961: + from: receiver224 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link962: + from: bus2 + to: receiver225 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link963: + from: receiver225 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link964: + from: bus2 + to: receiver226 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link965: + from: receiver226 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link966: + from: bus2 + to: receiver227 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link967: + from: receiver227 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link968: + from: bus2 + to: receiver228 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link969: + from: receiver228 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link970: + from: bus2 + to: receiver229 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link971: + from: receiver229 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link972: + from: bus2 + to: receiver230 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link973: + from: receiver230 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link974: + from: bus2 + to: receiver231 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link975: + from: receiver231 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link976: + from: bus2 + to: receiver232 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link977: + from: receiver232 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link978: + from: bus2 + to: receiver233 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link979: + from: receiver233 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link980: + from: bus2 + to: receiver234 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link981: + from: receiver234 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link982: + from: bus2 + to: receiver235 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link983: + from: receiver235 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link984: + from: bus2 + to: receiver236 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link985: + from: receiver236 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link986: + from: bus2 + to: receiver237 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link987: + from: receiver237 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link988: + from: bus2 + to: receiver238 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link989: + from: receiver238 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link990: + from: bus2 + to: receiver239 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link991: + from: receiver239 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link992: + from: bus2 + to: receiver240 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link993: + from: receiver240 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link994: + from: bus2 + to: receiver241 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link995: + from: receiver241 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link996: + from: bus2 + to: receiver242 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link997: + from: receiver242 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link998: + from: bus2 + to: receiver243 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link999: + from: receiver243 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1000: + from: bus2 + to: receiver244 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1001: + from: receiver244 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1002: + from: bus2 + to: receiver245 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1003: + from: receiver245 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1004: + from: bus2 + to: receiver246 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1005: + from: receiver246 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1006: + from: bus2 + to: receiver247 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1007: + from: receiver247 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1008: + from: bus2 + to: receiver248 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1009: + from: receiver248 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1010: + from: bus2 + to: receiver249 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1011: + from: receiver249 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1012: + from: bus2 + to: receiver250 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1013: + from: receiver250 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1014: + from: bus2 + to: receiver251 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1015: + from: receiver251 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1016: + from: bus2 + to: receiver252 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1017: + from: receiver252 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1018: + from: bus2 + to: receiver253 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1019: + from: receiver253 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1020: + from: bus2 + to: receiver254 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1021: + from: receiver254 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1022: + from: bus2 + to: receiver255 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1023: + from: receiver255 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1024: + from: bus1 + to: bus2 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B + link1025: + from: bus2 + to: bus1 + latency: 1ns + throughput: 10Gbps + ingress_buffer_size: 32768B + egress_buffer_size: 32768B diff --git a/source/device/device.hpp b/source/device/device.hpp index 715bbd629f..0d70916c83 100644 --- a/source/device/device.hpp +++ b/source/device/device.hpp @@ -45,6 +45,7 @@ class IRoutingDevice : public Identifiable { class IReceiver : public IRoutingDevice, public IProcessingDevice { public: virtual ~IReceiver() = default; + virtual Time send_system_packet(Packet packet) = 0; }; class ISender : public IRoutingDevice, public IProcessingDevice { @@ -52,6 +53,7 @@ class ISender : public IRoutingDevice, public IProcessingDevice { virtual ~ISender() = default; virtual void enqueue_packet(Packet packet) = 0; virtual Time send_data() = 0; + virtual Time send_system_packet(Packet packet) = 0; }; class ISwitch : public IRoutingDevice, diff --git a/source/device/receiver.cpp b/source/device/receiver.cpp index 909d9e488f..4ea027acd8 100644 --- a/source/device/receiver.cpp +++ b/source/device/receiver.cpp @@ -75,10 +75,14 @@ Time Receiver::process() { LOG_INFO("Processing packet from link on receiver. Packet: " + data_packet.to_string()); - if (data_packet.type == DATA && data_packet.dest_id == get_id()) { + if (data_packet.dest_id == get_id()) { // TODO: think about processing time // Not sure if we want to send ack before processing or after it - total_processing_time += send_ack(data_packet); + // total_processing_time += send_ack(data_packet); + data_packet.flow->update(data_packet, get_type()); + if (data_packet.type == PacketType::DATA) { + ++m_cnt; + } } else { LOG_WARN( "Packet arrived to Receiver that is not its destination; using " @@ -101,6 +105,24 @@ Time Receiver::process() { return total_processing_time; } +Time Receiver::send_system_packet(Packet packet) { + Time total_processing_time = 1; + + auto next_link = get_link_to_destination(packet); + if (next_link == nullptr) { + LOG_WARN("Link to send packet does not exist. Packet: " + packet.to_string()); + return total_processing_time; + } + + // TODO: add some sender ID for easier packet path tracing + LOG_INFO("Sent new system packet from receiver. Data packet: " + + packet.to_string() + ". Receiver id: " + get_id() + " Time: " + std::to_string(Scheduler::get_instance().get_current_time())); + + next_link->schedule_arrival(packet); + // total_processing_time += sending_data_time; + return total_processing_time; +} + Time Receiver::send_ack(Packet data_packet) { Time processing_time = 1; Time current_time = Scheduler::get_instance().get_current_time(); diff --git a/source/device/receiver.hpp b/source/device/receiver.hpp index 176916cd1c..25a1f3c488 100644 --- a/source/device/receiver.hpp +++ b/source/device/receiver.hpp @@ -1,5 +1,6 @@ #pragma once #include +#include #include "packet.hpp" #include "event.hpp" @@ -16,7 +17,9 @@ class Receiver : public IReceiver, public std::enable_shared_from_this { public: Receiver(Id a_id); - ~Receiver() = default; + ~Receiver() { + std::cout << "Arrived to " + get_id() + ": " << m_cnt << std::endl; + }; bool add_inlink(std::shared_ptr link) final; bool add_outlink(std::shared_ptr link) final; @@ -35,6 +38,7 @@ class Receiver : public IReceiver, // Packets are taken from ingress buffers on a round-robin basis. // The iterator over ingress buffers is stored in m_next_link. Time process() final; + Time send_system_packet(Packet packet) final; Id get_id() const final; @@ -42,6 +46,7 @@ class Receiver : public IReceiver, Time send_ack(Packet data_packet); std::unique_ptr m_router; SchedulingModule m_process_scheduler; + int m_cnt = 0; }; } // namespace sim diff --git a/source/device/sender.cpp b/source/device/sender.cpp index 0dca532c79..89f578bbf7 100644 --- a/source/device/sender.cpp +++ b/source/device/sender.cpp @@ -84,7 +84,7 @@ Time Sender::process() { LOG_INFO("Processing packet from link on sender. Packet: " + packet.to_string()); - if (packet.type == PacketType::ACK && packet.dest_id == get_id()) { + if (packet.dest_id == get_id()) { packet.flow->update(packet, get_type()); } else { LOG_WARN( @@ -142,6 +142,24 @@ Time Sender::send_data() { return total_processing_time; } +Time Sender::send_system_packet(Packet packet) { + Time total_processing_time = 1; + + auto next_link = get_link_to_destination(packet); + if (next_link == nullptr) { + LOG_WARN("Link to send packet does not exist"); + return total_processing_time; + } + + // TODO: add some sender ID for easier packet path tracing + LOG_INFO("Sent new system packet from sender. Data packet: " + + packet.to_string() + ". Sender id: " + get_id() + ". Time: " + std::to_string(Scheduler::get_instance().get_current_time())); + + next_link->schedule_arrival(packet); + // total_processing_time += sending_data_time; + return total_processing_time; +} + std::set> Sender::get_outlinks() { return m_router->get_outlinks(); } diff --git a/source/device/sender.hpp b/source/device/sender.hpp index 661303a78b..10572d199e 100644 --- a/source/device/sender.hpp +++ b/source/device/sender.hpp @@ -38,6 +38,7 @@ class Sender : public ISender, // The iterator over ingress buffers is stored in m_next_link. Time process() final; Time send_data() final; + Time send_system_packet(Packet packet) final; void enqueue_packet(Packet packet) final; diff --git a/source/express_pass/ep_event.cpp b/source/express_pass/ep_event.cpp new file mode 100644 index 0000000000..c04d8c086e --- /dev/null +++ b/source/express_pass/ep_event.cpp @@ -0,0 +1,42 @@ +#include "event.hpp" +#include "express_pass/ep_event.hpp" + +#include "scheduler.hpp" + +namespace sim { + +SendCredit::SendCredit(Time a_time, std::weak_ptr a_flow, Size a_packet_size) : Event(a_time), m_flow(a_flow), m_packet_size(a_packet_size) {} + +void SendCredit::operator()() { + if (m_flow.expired()) { + return; + } + + Time sending_delay = m_flow.lock()->send_credit(); + if (sending_delay == 0) { + return; + } + + std::unique_ptr new_event = std::make_unique( + m_time + sending_delay, m_flow, m_packet_size); + Scheduler::get_instance().add(std::move(new_event)); +} + +RunFeedbackControlLoop::RunFeedbackControlLoop(Time a_time, std::weak_ptr a_flow) : Event(a_time), m_flow(a_flow) {} + +void RunFeedbackControlLoop::operator()() { + if (m_flow.expired()) { + return; + } + + Time rtt = m_flow.lock()->feedback_control_loop(); + if (rtt == 0) { + return; + } + + std::unique_ptr new_event = std::make_unique( + m_time + rtt, m_flow); + Scheduler::get_instance().add(std::move(new_event)); +} + +} // namespace sim \ No newline at end of file diff --git a/source/express_pass/ep_event.hpp b/source/express_pass/ep_event.hpp new file mode 100644 index 0000000000..5621e01188 --- /dev/null +++ b/source/express_pass/ep_event.hpp @@ -0,0 +1,27 @@ +#include "event.hpp" +#include "express_pass/ep_flow.hpp" + +namespace sim { + +class SendCredit : public Event { +public: + SendCredit(Time a_time, std::weak_ptr a_flow, Size a_packet_size); + virtual ~SendCredit() = default; + void operator()() final; + +private: + std::weak_ptr m_flow; + Size m_packet_size; +}; + +class RunFeedbackControlLoop : public Event { +public: + RunFeedbackControlLoop(Time a_time, std::weak_ptr a_flow); + virtual ~RunFeedbackControlLoop() = default; + void operator()() final; + +private: + std::weak_ptr m_flow; +}; + +} // namespace sim \ No newline at end of file diff --git a/source/express_pass/ep_flow.cpp b/source/express_pass/ep_flow.cpp new file mode 100644 index 0000000000..375caffce4 --- /dev/null +++ b/source/express_pass/ep_flow.cpp @@ -0,0 +1,230 @@ +#include "express_pass/ep_flow.hpp" + +#include +#include +#include + +#include "scheduler.hpp" +#include "logger/logger.hpp" +#include "express_pass/ep_event.hpp" + +namespace sim { + +EPFlow::EPFlow(Id a_id, std::shared_ptr a_src, std::shared_ptr a_dest, + Size a_packet_size, Time a_delay_between_packets, + std::uint32_t a_packets_to_send) + : m_id(a_id), + m_src(a_src), + m_dest(a_dest), + m_sender_status(SenderStatus::CREDIT_STOP_S), + m_receiver_status(ReceiverStatus::CREDIT_STOP_R), + m_packet_size(a_packet_size), + m_delay_between_packets(a_delay_between_packets), + m_packets_to_send(a_packets_to_send) { + + auto link = m_dest.lock()->get_link_to_destination(generate_packet(PacketType::CREDIT, true)); + m_max_rate = (double)(m_packet_size * 8) / 10.0; // TODO: / link.get_speed(); + } + +void EPFlow::schedule_packet_generation(Time time) { + auto generate_event_ptr = + std::make_unique(time, shared_from_this(), m_packet_size); + Scheduler::get_instance().add(std::move(generate_event_ptr)); +} + +Packet EPFlow::generate_packet(PacketType type, bool from_receiver, std::uint32_t packet_num, Time RTT) { + sim::Packet packet; + packet.type = type; + if (type == PacketType::DATA) { + packet.size_byte = m_packet_size; + } else { + packet.size_byte = m_system_packet_size + (rand() % 20); + } + packet.flow = this; + packet.source_id = (from_receiver ? m_dest.lock()->get_id() : m_src.lock()->get_id()); + packet.dest_id = (from_receiver ? m_src.lock()->get_id() : m_dest.lock()->get_id()); + packet.packet_num = packet_num; + packet.RTT = RTT; + return packet; +} + +std::uint32_t EPFlow::get_next_packet_num() { + return m_current_packet_num++; +} + +void EPFlow::start() { + schedule_packet_generation(Scheduler::get_instance().get_current_time()); + + sim::Packet packet = generate_packet(PacketType::CREDIT_REQUEST, false); + m_src.lock()->send_system_packet(packet); + m_sender_status = SenderStatus::CREQ_SENT; +} + +Time EPFlow::send_credit() { + if (m_stopped) { + return 0; + } + + feedback_control_loop(); + + auto packet = generate_packet(PacketType::CREDIT, true, get_next_packet_num(), Scheduler::get_instance().get_current_time()); + m_dest.lock()->send_system_packet(packet); + m_sent_credits++; + + std::uint32_t rate = m_max_rate / m_current_rate_coeff; + int rnd_part = (std::rand() % (int)(rate * 0.08)) - (int)(rate * 0.04); + m_accum += rate + rnd_part; + return rate + rnd_part; + +} + + +void EPFlow::process_getting_data_packet(Packet data_packet) { + double alpha = 0.2; + m_RTT = (1 - alpha) * m_RTT + alpha * (Scheduler::get_instance().get_current_time() - data_packet.RTT); + + int distance = data_packet.packet_num - m_last_obtained_packet_num; + + if (distance < 0) { + // TODO: log error credit packet reordering or credit sequence number overflow happend. + throw "ERR"; + } + m_sent_credits += (distance + 1); + m_lost_credits += distance; + + m_last_obtained_packet_num = data_packet.packet_num + 1; + + // LOG_ERROR("Got DATA " + std::to_string(get_id()) + " Packet: " + data_packet.to_string() + " RTT: " + std::to_string(m_RTT) + " REAL RTT: " + std::to_string(Scheduler::get_instance().get_current_time() - data_packet.RTT)); +} + +// feedback control launch once per RTT (scheduled by event) +Time EPFlow::feedback_control_loop() { + if (m_sent_credits == 0) { + return m_RTT; + } + + if (Scheduler::get_instance().get_current_time() - m_last_credit_rate_update < m_RTT) { + return m_RTT; + } + + // std::cout << "Lost: " << m_lost_credits << std::endl; + // std::cout << "Sent: " << m_sent_credits << std::endl; + + auto old_coeff = m_current_rate_coeff; + double credit_loss = (double)m_lost_credits / (double)m_sent_credits; + + if (credit_loss <= m_target_loss && m_incr_cnt <= 10) { + if (m_was_increasing) { + m_w = (m_w + m_w_max) / 2; + m_incr_cnt++; + } + m_was_increasing = true; + m_current_rate_coeff = (1 - m_w) * m_current_rate_coeff + m_w * m_max_rate_coeff * (1 + m_target_loss); + } else { + m_max_meg_incr_in_a_row = std::max(m_max_meg_incr_in_a_row, m_incr_cnt); + m_was_increasing = false; + if (credit_loss >= 1.0) { + m_current_rate_coeff = m_max_rate / (double)m_RTT; + } else { + if (m_incr_cnt > 10) { + m_current_rate_coeff /= (8.0 * (1 - credit_loss)); + } else { + m_current_rate_coeff = m_current_rate_coeff * (1 - credit_loss) * (1 + m_target_loss); + } + + + // TEST PART + // m_current_rate_coeff = m_max_rate*(m_sent_credits - m_lost_credits) + // / (double)(Scheduler::get_instance().get_current_time() - m_last_credit_rate_update) + // * (1.0 + m_target_loss); + // m_current_rate_coeff = m_current_rate_coeff * (1 - credit_loss) * (1 + m_target_loss); + } + if (m_current_rate_coeff > old_coeff) { + m_current_rate_coeff = old_coeff; + } + + m_incr_cnt = 0; + m_w = std::max(m_w / 2, m_w_min); + } + + // std::cout << "Rate: " << m_current_rate_coeff << std::endl; + + m_lost_credits = 0; + m_sent_credits = 0; + m_last_credit_rate_update = Scheduler::get_instance().get_current_time(); + + return m_RTT; +} + +void EPFlow::update(Packet packet, DeviceType type) { + if (packet.type == PacketType::CREDIT_REQUEST && type == DeviceType::RECEIVER && m_receiver_status == ReceiverStatus::CREDIT_STOP_R) { + m_receiver_status = ReceiverStatus::CREDIT_SENDING; + + auto send_credit_event_ptr = + std::make_unique(Scheduler::get_instance().get_current_time(), shared_from_this(), m_system_packet_size); + Scheduler::get_instance().add(std::move(send_credit_event_ptr)); + + // auto feedback_control_event_ptr = + // std::make_unique(Scheduler::get_instance().get_current_time(), shared_from_this()); + // Scheduler::get_instance().add(std::move(feedback_control_event_ptr)); + } + else if (packet.type == PacketType::CREDIT_STOP_P && type == DeviceType::RECEIVER && m_receiver_status == ReceiverStatus::CREDIT_SENDING) { + m_receiver_status = ReceiverStatus::CREDIT_STOP_R; + m_stopped = true; + } + else if (packet.type == PacketType::DATA && type == DeviceType::RECEIVER) { + // calculate data statistics + // check corresponding credit id and update state + process_getting_data_packet(packet); + } else if (packet.type == PacketType::CREDIT && type == DeviceType::SENDER) { + // LOG_ERROR("Got CREDIT " + std::to_string(get_id()) + " TIME: " + std::to_string(Scheduler::get_instance().get_current_time())); + if (m_sender_status != SenderStatus::CREQ_SENT && m_sender_status != SenderStatus::CREDIT_RECEIVING) { + LOG_ERROR("Unexpected sender status when got credit"); + return; + } + if (m_sender_status == SenderStatus::CREQ_SENT) { + m_sender_status = SenderStatus::CREDIT_RECEIVING; + } + + if (m_sending_buffer.empty()) { + m_sender_status = SenderStatus::CSTOP_SENT; + + auto packet = generate_packet(PacketType::CREDIT_STOP_P, false); + m_src.lock()->send_system_packet(packet); + } else { + m_sending_buffer.front().RTT = packet.RTT; + m_sending_buffer.front().packet_num = packet.packet_num; + put_data_to_device(); + } + } + else { + LOG_ERROR("Unexpected update state"); + } +} + + +Time EPFlow::create_new_data_packet() { + if (m_packets_to_send == 0) { + return 0; + } + --m_packets_to_send; + Packet data = generate_packet(PacketType::DATA); + LOG_INFO("Created packet: " + data.to_string()); + m_sending_buffer.push(data); + return m_delay_between_packets; +} + +Time EPFlow::put_data_to_device() { + m_src.lock()->enqueue_packet(m_sending_buffer.front()); + LOG_INFO("Put data to device: " + m_sending_buffer.front().to_string()); + m_sending_buffer.pop(); + return m_delay_between_packets; +} + +std::shared_ptr EPFlow::get_sender() const { return m_src.lock(); } + +std::shared_ptr EPFlow::get_receiver() const { return m_dest.lock(); } + +Id EPFlow::get_id() const { return m_id; } + +} // namespace sim \ No newline at end of file diff --git a/source/express_pass/ep_flow.hpp b/source/express_pass/ep_flow.hpp new file mode 100644 index 0000000000..a55b3d0984 --- /dev/null +++ b/source/express_pass/ep_flow.hpp @@ -0,0 +1,98 @@ +#pragma once +#include +#include + +#include "flow/flow.hpp" +#include "packet.hpp" +#include "utils/identifier_factory.hpp" + +namespace sim { + +class IReceiver; +class ISender; + +enum SenderStatus { + CREDIT_STOP_S, + CREQ_SENT, + CREDIT_RECEIVING, + CSTOP_SENT +}; + +enum ReceiverStatus { + CREDIT_STOP_R, + CREDIT_SENDING +}; + +class EPFlow : public IFlow, public std::enable_shared_from_this { +public: + EPFlow(Id a_id, std::shared_ptr a_src, std::shared_ptr a_dest, + Size a_packet_size, Time a_delay_between_packets, + std::uint32_t a_packets_to_send); + virtual ~EPFlow() { + std::cout << "Max incr: " << std::max(m_max_meg_incr_in_a_row, m_incr_cnt) << std::endl; + }; + + // Start at time + void start() final; + + Time create_new_data_packet() final; + Time put_data_to_device(); + + // Update the internal state according to some congestion control algorithm + // Call try_to_generate upon the update + void update(Packet packet, DeviceType type) final; + + std::shared_ptr get_sender() const final; + std::shared_ptr get_receiver() const final; + + Time send_credit(); + Time feedback_control_loop(); + + Id get_id() const final; + +private: + void schedule_packet_generation(Time time); + Packet generate_packet(PacketType type, bool from_receiver = false, std::uint32_t packet_num = 0, Time RTT = 0); + void sender_send_stop(); + std::uint32_t get_next_packet_num(); + void process_getting_data_packet(Packet data_packet); + + Id m_id; + std::weak_ptr m_src; + std::weak_ptr m_dest; + SenderStatus m_sender_status; + ReceiverStatus m_receiver_status; + + bool m_stopped = false; + std::uint32_t m_current_packet_num = 0; + + Size m_packet_size; + Time m_delay_between_packets; + std::uint32_t m_packets_to_send; + Size m_system_packet_size = 84; + + + double m_max_rate_coeff = 1.0; + double m_current_rate_coeff = 1.0 / 4.0; + double m_max_rate; + double m_w = 1.0 / 8.0; + double m_w_max = 0.5; + double m_w_min = 0.01; + double m_target_loss = 0.05; + bool m_was_increasing = false; + int m_incr_cnt = 0; + int m_max_meg_incr_in_a_row = 0; + Time m_last_credit_rate_update = 0; + + Time m_RTT = 9000; + std::uint32_t m_last_obtained_packet_num = 0; + std::uint32_t m_last_received_credit = 0; + std::uint32_t m_sent_credits = 0; + std::uint32_t m_lost_credits = 0; + std::uint32_t m_last_feedback_run = 0; + + std::queue m_sending_buffer; + Time m_accum; +}; + +} // namespace sim \ No newline at end of file diff --git a/source/express_pass/ep_link.cpp b/source/express_pass/ep_link.cpp new file mode 100644 index 0000000000..517b470f21 --- /dev/null +++ b/source/express_pass/ep_link.cpp @@ -0,0 +1,152 @@ +#include "express_pass/ep_link.hpp" + +#include "device/switch.hpp" +#include "scheduler.hpp" +#include "logger/logger.hpp" + +namespace sim { + +EPLink::EPLink(Id a_id, std::weak_ptr a_from, + std::weak_ptr a_to, std::uint32_t a_speed_gbps, + Time a_delay, Size a_max_src_egress_buffer_size_byte, + Size a_max_ingress_buffer_size) + : m_id(a_id), + m_from(a_from), + m_to(a_to), + m_speed_gbps(a_speed_gbps), + m_src_egress_buffer_size_byte(0), + m_max_src_egress_buffer_size_byte(a_max_src_egress_buffer_size_byte), + m_last_src_egress_pass_time(0), + m_transmission_delay(a_delay), + m_next_ingress(), + m_ingress_buffer_size_byte(0), + m_max_ingress_buffer_size_byte(a_max_ingress_buffer_size) { + if (a_from.expired() || a_to.expired()) { + LOG_WARN("Passed link to device is expired"); + } else if (a_speed_gbps == 0) { + LOG_WARN("Passed zero link speed"); + } +} + +Time EPLink::get_transmission_time(const Packet& packet) const { + if (m_speed_gbps == 0) { + LOG_WARN("Passed zero link speed"); + return 0; + } + const std::uint32_t byte_to_bit_multiplier = 8; + + Size packet_size_bit = packet.size_byte * byte_to_bit_multiplier; + std::uint32_t transmission_speed_bit_ns = m_speed_gbps; + return (packet_size_bit + transmission_speed_bit_ns - 1) / + transmission_speed_bit_ns + + m_transmission_delay; +}; + +void EPLink::schedule_arrival(Packet packet) { + if (m_to.expired()) { + LOG_WARN("Destination device pointer is expired"); + return; + } + + Time total_delay; + + // TODO: rewrite this part with limiting throughput instead of calculating sending time separately + auto src = m_from.lock(); + if (packet.type == PacketType::CREDIT) { + if (m_current_credit_queue_capacity + packet.size_byte > m_max_credit_queue_capacity) { + // LOG_ERROR("Dropped credit: " + packet.to_string() + " Time: " + std::to_string(Scheduler::get_instance().get_current_time())); + return; + } + + m_current_credit_queue_capacity += packet.size_byte; + total_delay = std::max(m_next_credit_can_be_sent, Scheduler::get_instance().get_current_time()); + m_next_credit_can_be_sent = total_delay + (packet.size_byte * 8 + 1538 * 8) / m_speed_gbps; + // LOG_ERROR("Next credit can be sent: " + std::to_string(m_next_credit_can_be_sent)); + } else { + if (m_src_egress_buffer_size_byte + packet.size_byte > + m_max_src_egress_buffer_size_byte) { + LOG_ERROR("Buffer in link overflowed; packet " + packet.to_string() + + " lost"); + return; + } + + LOG_INFO("Packet arrived to link's ingress queue. Packet: " + + packet.to_string()); + Time transmission_time = get_transmission_time(packet); + + m_last_src_egress_pass_time = + std::max(m_last_src_egress_pass_time, + Scheduler::get_instance().get_current_time()) + + transmission_time; + m_src_egress_buffer_size_byte += packet.size_byte; + m_max_buffer_size = std::max(m_max_buffer_size, m_src_egress_buffer_size_byte); + total_delay = m_last_src_egress_pass_time; + } + + m_to.lock()->notify_about_arrival( + Scheduler::get_instance().get_current_time()); + + Scheduler::get_instance().add(std::make_unique( + Arrive(total_delay, weak_from_this(), packet))); +}; + +void EPLink::process_arrival(Packet packet) { + auto src = m_from.lock(); + if (packet.type == PacketType::CREDIT) { + m_current_credit_queue_capacity -= packet.size_byte; + } else { + if (m_ingress_buffer_size_byte + packet.size_byte > + m_max_ingress_buffer_size_byte) { + LOG_ERROR("Ingress buffer on EPLink overflow; packet" + + packet.to_string() + " lost"); + return; + } + m_ingress_buffer_size_byte += packet.size_byte; + m_max_buffer_size = std::max(m_max_buffer_size, m_ingress_buffer_size_byte); + + LOG_INFO("Packet arrived to link's egress queue. Packet: " + + packet.to_string()); + + m_src_egress_buffer_size_byte -= packet.size_byte; + } + m_next_ingress.push(packet); +}; + +std::optional EPLink::get_packet() { + if (m_next_ingress.empty()) { + LOG_INFO("Ingress packet queue is empty"); + return {}; + } + + auto packet = m_next_ingress.front(); + LOG_INFO("Taken packet from link. Packet: " + packet.to_string()); + m_next_ingress.pop(); + m_ingress_buffer_size_byte -= packet.size_byte; + return packet; +}; + +std::shared_ptr EPLink::get_from() const { + if (m_from.expired()) { + LOG_WARN("Source device pointer is expired"); + return nullptr; + } + + return m_from.lock(); +}; + +std::shared_ptr EPLink::get_to() const { + if (m_to.expired()) { + LOG_WARN("Destination device pointer is expired"); + return nullptr; + } + + return m_to.lock(); +}; + +Size EPLink::get_max_src_egress_buffer_size_byte() const { + return m_max_src_egress_buffer_size_byte; +} + +Id EPLink::get_id() const { return m_id; } + +} // namespace sim diff --git a/source/express_pass/ep_link.hpp b/source/express_pass/ep_link.hpp new file mode 100644 index 0000000000..228aa794eb --- /dev/null +++ b/source/express_pass/ep_link.hpp @@ -0,0 +1,65 @@ +#pragma once + +#include "link.hpp" +#include + +namespace sim { + +class EPLink : public ILink, public std::enable_shared_from_this { +public: + EPLink(Id a_id, std::weak_ptr a_from, + std::weak_ptr a_to, std::uint32_t a_speed_gbps = 1, + Time a_delay = 0, Size a_max_src_egress_buffer_size_byte = 32768, + Size a_max_ingress_buffer_size_byte = 32768); + ~EPLink() { + // std::cout << "Max buffer: " << m_max_buffer_size << std::endl; + }; + + /** + * Update the source egress delay and schedule the arrival event + * based on the egress queueing and transmission delays. + */ + void schedule_arrival(Packet packet) final; + + /** + * Removes packet from the source egress queue. + */ + void process_arrival(Packet packet) final; + + std::optional get_packet() final; + + std::shared_ptr get_from() const final; + std::shared_ptr get_to() const final; + Size get_max_src_egress_buffer_size_byte() const final; + + Id get_id() const final; + +private: + Time get_transmission_time(const Packet& packet) const; + + Id m_id; + std::weak_ptr m_from; + std::weak_ptr m_to; + std::uint32_t m_speed_gbps; + + Size m_src_egress_buffer_size_byte; + Size m_max_src_egress_buffer_size_byte; + Time m_last_src_egress_pass_time; + + Time m_transmission_delay; + + // Queue at the ingress port of the m_next device + std::queue m_next_ingress; + Size m_ingress_buffer_size_byte; + Size m_max_ingress_buffer_size_byte; + + + std::uint32_t m_max_credit_queue_capacity = 8 * 84; + std::uint32_t m_current_credit_queue_capacity = 0; + Time m_next_credit_can_be_sent = 0; + + // Debug + Size m_max_buffer_size = 0; +}; + +} // namespace sim diff --git a/source/link.cpp b/source/link.cpp index b4a2a0cb5a..07177f44e8 100644 --- a/source/link.cpp +++ b/source/link.cpp @@ -62,7 +62,7 @@ void Link::schedule_arrival(Packet packet) { LOG_INFO("Packet arrived to link's ingress queue. Packet: " + packet.to_string()); - unsigned int transmission_time = get_transmission_time(packet); + Time transmission_time = get_transmission_time(packet); m_last_src_egress_pass_time = std::max(m_last_src_egress_pass_time, Scheduler::get_instance().get_current_time()) + diff --git a/source/logger/logger.cpp b/source/logger/logger.cpp index 27a03018ac..01c94ab5ce 100644 --- a/source/logger/logger.cpp +++ b/source/logger/logger.cpp @@ -21,11 +21,11 @@ void Logger::disable_logs() { Logger::Logger() { auto console_sink = std::make_shared(); - console_sink->set_level(spdlog::level::warn); + console_sink->set_level(spdlog::level::err); auto file_sink = std::make_shared( "logs/simulator_logs.txt", true); - file_sink->set_level(spdlog::level::trace); + file_sink->set_level(spdlog::level::err); auto logger = std::make_shared( "multi_sink", spdlog::sinks_init_list{console_sink, file_sink}); diff --git a/source/parser/identifiable_parser.hpp b/source/parser/identifiable_parser.hpp index c935ee2d01..384da9a727 100644 --- a/source/parser/identifiable_parser.hpp +++ b/source/parser/identifiable_parser.hpp @@ -130,6 +130,72 @@ Id parse_object(const YAML::Node& key_node, return id; } + +template <> +Id parse_object(const YAML::Node& key_node, + const YAML::Node& value_node) { + Id id = key_node.as(); + Id from_id = value_node["from"].as(); + Id to_id = value_node["to"].as(); + auto from_ptr = + IdentifierFactory::get_instance().get_object(from_id); + auto to_ptr = + IdentifierFactory::get_instance().get_object(to_id); + + if (from_ptr == nullptr) { + LOG_ERROR("Failed to find link's source"); + return ""; + } + + if (to_ptr == nullptr) { + LOG_ERROR("Failed to find link's destination"); + return ""; + } + + uint32_t latency = 0; + if (value_node["latency"]) { + latency = parse_latency(value_node["latency"].as()); + } else { + LOG_WARN(fmt::format( + "latency does not set for link {}; use default value {}", id, + latency)); + } + + uint32_t speed = 1; + if (value_node["throughput"]) { + speed = parse_throughput(value_node["throughput"].as()); + } else { + LOG_WARN(fmt::format( + "speed does not set for link {}; use default value {}", id, speed)); + } + + uint32_t ingress_buffer_size = 4096; + if (value_node["ingress_buffer_size"]) { + ingress_buffer_size = parse_buffer_size( + value_node["ingress_buffer_size"].as()); + } else { + LOG_WARN( + fmt::format("ingress buffer size does not set for link {}; use " + "default value {}", + id, ingress_buffer_size)); + } + + uint32_t egress_buffer_size = 4096; + if (value_node["egress_buffer_size"]) { + egress_buffer_size = parse_buffer_size( + value_node["egress_buffer_size"].as()); + } else { + LOG_WARN(fmt::format( + "egress buffer size does not set for link {}; use default value {}", + id, egress_buffer_size)); + } + + parse_object_helper(id, from_ptr, to_ptr, speed, latency, + egress_buffer_size, ingress_buffer_size); + + return id; +} + template <> Id parse_object(const YAML::Node& key_node, const YAML::Node& value_node) { @@ -192,4 +258,35 @@ Id parse_object(const YAML::Node& key_node, return id; } +template <> +Id parse_object(const YAML::Node& key_node, + const YAML::Node& value_node) { + Id id = key_node.as(); + Id sender_id = value_node["sender_id"].as(); + Id receiver_id = value_node["receiver_id"].as(); + Size packet_size = value_node["packet_size"].as(); + Time packet_interval = value_node["packet_interval"].as