- static int uniqueId = 0;
- LinkCreationArgs linkTemplate;
- linkTemplate.bandwidth = cluster->bw;
- linkTemplate.latency = cluster->lat;
- linkTemplate.policy = cluster->sharing_policy; // sthg to do with that ?
- linkTemplate.id =
- "link_from_" + std::to_string(downNode->id) + "_" + std::to_string(upNode->id) + "_" + std::to_string(uniqueId);
- sg_platf_new_link(&linkTemplate);
-
- if (cluster->sharing_policy == SURF_LINK_SPLITDUPLEX) {
- std::string tmpID = std::string(linkTemplate.id) + "_UP";
- this->up_link_ = resource::LinkImpl::byName(tmpID); // check link?
- tmpID = std::string(linkTemplate.id) + "_DOWN";
- this->down_link_ = resource::LinkImpl::byName(tmpID); // check link ?
- } else {
- this->up_link_ = resource::LinkImpl::byName(linkTemplate.id);
- this->down_link_ = this->up_link_;
- }
- uniqueId++;
-}
+ /* initial checks */
+ if (bandwidth <= 0)
+ throw std::invalid_argument("FatTreeZone: incorrect bandwidth for internode communication, bw=" +
+ std::to_string(bandwidth));
+ if (latency < 0)
+ throw std::invalid_argument("FatTreeZone: incorrect latency for internode communication, lat=" +
+ std::to_string(latency));
+
+ /* creating zone */
+ auto* zone = new kernel::routing::FatTreeZone(name);
+ zone->set_topology(params.levels, params.down, params.up, params.number);
+ if (parent)
+ zone->set_parent(parent->get_impl());
+ zone->set_link_characteristics(bandwidth, latency, sharing_policy);
+
+ /* populating it */
+ unsigned int tot_elements = std::accumulate(params.down.begin(), params.down.end(), 1, std::multiplies<>());
+ for (unsigned int i = 0; i < tot_elements; i++) {
+ kernel::routing::NetPoint* netpoint;
+ Link* limiter;
+ Link* loopback;
+ /* coordinates are based on 2 indexes: number of levels and id */
+ zone->fill_leaf_from_cb(i, {params.levels + 1, tot_elements}, set_callbacks, &netpoint, &loopback, &limiter);
+ zone->add_processing_node(i, limiter ? limiter->get_impl() : nullptr, loopback ? loopback->get_impl() : nullptr);
+ }
+ zone->build_upper_levels(set_callbacks);
+
+ return zone->get_iface();