+int AsClusterFatTree::connectNodeToParents(sg_platf_cluster_cbarg_t cluster,
+ FatTreeNode *node) {
+ FatTreeNode* currentParentNode;
+ int connectionsNumber = 0;
+ const int level = node->level;
+ currentParentNode = this->nodes[this->getLevelPosition(level + 1)];
+ for (unsigned int i = 0 ; i < this->nodesByLevel[level] ; i++ ) {
+ if(this->areRelated(currentParentNode, node)) {
+ for (unsigned int j = 0 ; j < this->lowerLevelPortsNumber[level + 1] ; j++) {
+ this->addLink(cluster, currentParentNode, node->label[level + 1] +
+ j * this->lowerLevelNodesNumber[level + 1], node,
+ currentParentNode->label[level + 1] +
+ j * this->upperLevelNodesNumber[level + 1]);
+ }
+ connectionsNumber++;
+ }
+ }
+ return connectionsNumber;
+}
+
+
+bool AsClusterFatTree::areRelated(FatTreeNode *parent, FatTreeNode *child) {
+ if (parent->level != child->level + 1) {
+ return false;
+ }
+
+ for (unsigned int i = 0 ; i < this->levels; i++) {
+ if (parent->label[i] != child->label[i] && i != parent->level) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void AsClusterFatTree::generateSwitches() {
+ this->nodesByLevel.resize(this->levels, 0);
+ unsigned int nodesRequired = 0;
+
+ // We take care of the number of nodes by level
+ this->nodesByLevel[0] = 1;
+ for (unsigned int i = 0 ; i < this->levels ; i++) {
+ this->nodesByLevel[0] *= this->lowerLevelNodesNumber[i];
+ }