+class FatTreeLink;
+
+/** \brief A node in a fat tree.
+ * A FatTreeNode can either be a switch or a processing node. Switches are
+ * identified by a negative ID. This class is closely related to fat
+ */
+class FatTreeNode {
+public:
+ /** Unique ID which identifies every node. */
+ int id;
+ /* Level into the tree, with 0 being the leafs.
+ */
+ unsigned int level;
+ /* \brief Position into the level, starting from 0.
+ */
+ unsigned int position;
+ /** In order to link nodes between them, each one must be assigned a label,
+ * consisting of l integers, l being the levels number of the tree. Each label
+ * is unique in the level, and the way it is generated allows the construction
+ * of a fat tree which fits the desired topology.
+ */
+ std::vector<unsigned int> label;
+
+ /** Links to the lower level, where the position in the vector corresponds to
+ * a port number.
+ */
+ std::vector<FatTreeLink*> children;
+ /** Links to the upper level, where the position in the vector corresponds to
+ * a port number.
+ */
+ std::vector<FatTreeLink*> parents;
+
+ /** Virtual link standing for the node global capacity.
+ */
+ NetworkLink* limiterLink;
+ /** If present, communications from this node to this node will pass through it
+ * instead of passing by an upper level switch.
+ */
+ NetworkLink* loopback;
+ FatTreeNode(sg_platf_cluster_cbarg_t cluster, int id, int level,
+ int position);
+};
+
+
+
+/** \brief Link in a fat tree.
+ *
+ * Represents a single, duplex link in a fat tree. This is necessary to have a tree.
+ * It is equivalent to a physical link.
+ */
+class FatTreeLink {
+public:
+ FatTreeLink(sg_platf_cluster_cbarg_t cluster, FatTreeNode *source,
+ FatTreeNode *destination);
+ /** Link going up in the tree
+ */
+ NetworkLink *upLink;
+ /** Link going down in the tree
+ */
+ NetworkLink *downLink;
+ /** Upper end of the link
+ */
+ FatTreeNode *upNode;
+ /** Lower end of the link
+ */
+ FatTreeNode *downNode;
+};