- int getLevelPosition(const unsigned int level);
- void generateLabels();
- void generateSwitches();
- int connectNodeToParents(FatTreeNode* node);
- bool areRelated(FatTreeNode* parent, FatTreeNode* child);
- bool isInSubTree(FatTreeNode* root, FatTreeNode* node);
+ int get_level_position(const unsigned int level);
+ void generate_switches(const s4u::ClusterCallbacks& set_callbacks);
+ void generate_labels();
+ int connect_node_to_parents(FatTreeNode* node);
+ bool are_related(FatTreeNode* parent, FatTreeNode* child) const;
+ bool is_in_sub_tree(FatTreeNode* root, FatTreeNode* node) const;
+
+ void do_seal() override;
+
+public:
+ using ClusterZone::ClusterZone;
+ FatTreeZone(const FatTreeZone&) = delete;
+ FatTreeZone& operator=(const FatTreeZone&) = delete;
+ ~FatTreeZone() override;
+ void get_local_route(NetPoint* src, NetPoint* dst, Route* into, double* latency) override;
+
+ /**
+ * @brief Parse the topology parameters from string format
+ *
+ * @param topo_parameters String with topology, e.g. "2;4,4;1,2;1,2"
+ */
+ static s4u::FatTreeParams parse_topo_parameters(const std::string& topo_parameters);
+ /** @brief Checks topology parameters */
+ static void check_topology(unsigned int n_levels, const std::vector<unsigned int>& down_links,
+ const std::vector<unsigned int>& up_links, const std::vector<unsigned int>& link_count);
+ /** @brief Set FatTree topology */
+ void set_topology(unsigned int n_levels, const std::vector<unsigned int>& down_links,
+ const std::vector<unsigned int>& up_links, const std::vector<unsigned int>& link_count);
+ void add_processing_node(int id, resource::LinkImpl* limiter, resource::LinkImpl* loopback);
+ /**
+ * @brief Build upper levels (switchs) in Fat-Tree
+ *
+ * Suppose that set_topology and add_processing_node have already been called
+ */
+ void build_upper_levels(const s4u::ClusterCallbacks& set_callbacks);
+ void generate_dot_file(const std::string& filename = "fat_tree.dot") const;