Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Improve and unify the doc of <cluster>
authorMartin Quinson <martin.quinson@ens-rennes.fr>
Fri, 24 Dec 2021 23:01:03 +0000 (00:01 +0100)
committerMartin Quinson <martin.quinson@ens-rennes.fr>
Fri, 24 Dec 2021 23:53:34 +0000 (00:53 +0100)
Also, kill the parts of the doxygen doc that are now covered by the
new version.

doc/doxygen/inside_extending.doc
doc/doxygen/platform.doc
docs/source/Models.rst
docs/source/Platform_examples.rst
docs/source/Platform_routing.rst
docs/source/XML_reference.rst
docs/source/img/vivaldi.svg
examples/platforms/cluster_backbone.svg [new file with mode: 0644]
examples/platforms/cluster_crossbar.svg [new file with mode: 0644]
examples/platforms/cluster_crossbar.xml

index 7668d26..24c8e8d 100644 (file)
@@ -3,119 +3,6 @@
 
 @tableofcontents
 
-@section simgrid_dev_guide_model How to add a new model?
-The figure below shows the architecture of the SURF layer. This layer is composed
-of different kinds of models representing the different systems we want to
-model (i.e., cpu, network, storage, workstation, virtual machine).
-
-A model in SimGrid is composed of three classes: Model, Resource and Action
-(@ref SURF_interface "surf_interface.hpp").
-
-@image html surf++.png
-@image latex surf++.pdf "surf++" width=\textwidth
-
-Actually there are five kind of models: CpuModel, NetworkModel, WorkstationModel,
-WorkstationVMModel and StorageModel. For each kind of model, there is an
-interface (e.g.: @ref SURF_cpu_interface "CpuImpl.hpp") and some implementations (e.g.: cpu_cas01.hpp,
-cpu_ti.hpp).
-
-The CPU model Cas01, for instance, is initialized by the function
-    void surf_cpu_model_init_Cas01()
-
-The different network models that are offered by simgrid are stored in the array
-that is defined as follows:
-
-s_surf_model_description_t surf_network_model_description[] = {
-
-@subsection simgrid_dev_guide_model_implem How to implement a new model?
-
-If you want to create a new implementation of a kind of model you must extend
-the classes of the corresponding interfaces.
-
-For instance, if you want to add a new cup model called `Plop`, create two files
-cpu_plop.hpp and cpu_plop_cpp which contains classes CpuPlopModel, CpuPlop and
-CpuPlopAction implementing respectively the interfaces CpuModel, Cpu and
-CpuAction. You also need to define an initializing function like this:
-
-~~~~
-void surf_cpu_model_init_plop()
-{
-  xbt_assert(!surf_cpu_model_pm);
-
-  surf_cpu_model_pm = new CpuPlopModel();
-
-  simgrid::kernel::resource::on_postparse.connect(cpu_add_traces);
-
-  xbt_dynar_push(model_list, &surf_cpu_model_pm);
-}
-~~~~
-
-and add an entry in the corresponding array in surf_interface.cpp
-
-~~~~
-s_surf_model_description_t surf_cpu_model_description[] = {
-  {"Cas01",
-   "Simplistic CPU model (time=size/speed).",
-   surf_cpu_model_init_Cas01},
-  {"Plop",
-   "The new plop CPU model.",
-   surf_cpu_model_init_plop},
-  {NULL, NULL, NULL}      // this array must be NULL terminated
-};
-~~~~
-
-@subsection simgrid_dev_guide_model_kind How to add a new kind of model?
-
-If you want to create a new kind of model, you must create a new interface
-where you extend the classes Model, Resource and Action, and then create an
-implementation of this interface.
-
-
-@section simgrid_dev_guide_surf_callbacks How to use surf callbacks?
-
-Adding features to surf could also be handle by using surf callbacks (instead
-of adding new implementation model). The list of available callbacks is
-accessible there @ref SURF_callbacks. An example of using surf callbacks is the
-energy plugin. If you want to add a plugin you need to define callback function
-and to connect them to callbacks handler in an initialization function.
-
-~~~~
-static void MyNetworkLinkCreatedCallback(NetworkLinkPtr cpu){
-  // your code
-}
-
-static void MyNetworkLinkDestructedCallback(NetworkLinkPtr cpu){
-  // your code
-}
-
-static void MyNetworkCommunicationCallback(NetworkActionPtr cpu,
-                                           RoutingEdgePtr src,
-                                           RoutingEdgePtr dst){
-  // your code
-}
-
-void sg_my_network_plugin_init() {
-  networkLinkCreatedCallbacks.connect(MyNetworkLinkCreatedCallback);
-  networkLinkDestructedCallbacks.connect(MyNetworkLinkDestructedCallback);
-  networkCommunicationCallbacks.connect(MyNetworkCommunicationCallback);
-}
-~~~~
-
-Then you need to add an entry in surf_interface.cpp referring to your
-initialization function.
-
-~~~~
-s_surf_model_description_t surf_plugin_description[] = {
-                  {"Energy",
-                   "Cpu energy consumption.",
-                   sg_host_energy_plugin_init},
-                  {"MyNetworkPlugin",
-                   "My network plugin.",
-                   sg_my_network_plugin_init},
-                  {NULL, NULL, NULL}      // this array must be NULL terminated
-};
-~~~~
-
 @section simgrid_dev_guide_simcall How to add a new simcall?
 
 First of all you might want to avoid defining a new simcall if possible:
index bbe78a7..83c8aab 100644 (file)
@@ -5,105 +5,6 @@
 
 @subsection pf_res_computing Computing Resources
 
-
-@subsubsection pf_tag_cluster &lt;cluster&gt;
-
-``<cluster />`` represents a machine-cluster. It is most commonly used
-when one wants to define many hosts and a network quickly. Technically,
-``cluster`` is a meta-tag: <b>from the inner SimGrid point of
-view, a cluster is a network zone where some optimized routing is defined</b>.
-The default inner organization of the cluster is as follow:
-
-@verbatim
-                 __________
-                |          |
-                |  router  |
-    ____________|__________|_____________ backbone
-      |   |   |              |     |   |
-    l0|        l1| l2|           l97| l96 |   | l99
-      |   |   |   ........   |     |   |
-      |                                |
-    c-0.me                             c-99.me
-@endverbatim
-
-Here, a set of <b>host</b>s is defined. Each of them has a <b>link</b>
-to a central backbone (backbone is a link itself, as a link can
-be used to represent a switch, see the switch / link section
-below for more details about it). A <b>router</b> allows one to connect a
-<b>cluster</b> to the outside world. Internally,
-SimGrid treats a cluster as a network zone containing all hosts: the router is the default
-gateway for the cluster.
-
-There is an alternative organization, which is as follows:
-@verbatim
-                 __________
-                |          |
-                |  router  |
-                |__________|
-                    / | @
-                   /  |  @
-               l0 / l1|   @l2
-                 /    |    @
-                /     |     @
-            host0   host1   host2
-@endverbatim
-
-The principle is the same, except that there is no backbone. This representation
-can be obtained easily: just do not set the bb_* attributes.
-
-
-Attribute name  | Mandatory | Values | Description
---------------- | --------- | ------ | -----------
-id              | yes       | string | The identifier of the cluster. Facilitates referring to this cluster.
-prefix          | yes       | string | Each node of the cluster has to have a name. This name will be prefixed with this prefix.
-suffix          | yes       | string | Each node of the cluster will be suffixed with this suffix
-radical         | yes       | string | Regexp used to generate cluster nodes name. Syntax: "10-20" will give you 11 machines numbered from 10 to 20, "10-20;2" will give you 12 machines, one with the number 2, others numbered as before. The produced number is concatenated between prefix and suffix to form machine names.
-speed           | yes       | int    | Same as the ``speed`` attribute of the ``@<host@>`` tag.
-core            | no        | int (default: 1) | Same as the ``core`` attribute of the ``@<host@>`` tag.
-bw              | yes       | int    | Bandwidth for the links between nodes and backbone (if any). See the @ref pf_tag_link "link section" for syntax/details.
-lat             | yes       | int    | Latency for the links between nodes and backbone (if any). See <b>link</b> section for syntax/details.
-sharing_policy  | no        | string | Sharing policy for the links between nodes and backbone (if any). See <b>link</b> section for syntax/details.
-bb_bw           | no        | int    | Bandwidth for backbone (if any). See <b>link</b> section for syntax/details. If bb_bw and bb_lat (see below) attributes are omitted, no backbone is created (alternative cluster architecture <b>described before</b>).
-bb_lat          | no        | int    | Latency for backbone (if any). See <b>link</b> section for syntax/details. If bb_lat and bb_bw (see above) attributes are omitted, no backbone is created (alternative cluster architecture <b>described before</b>).
-bb_sharing_policy | no      | string | Sharing policy for the backbone (if any). See <b>link</b> section for syntax/details.
-limiter_link      | no        | int    | Bandwidth for limiter link (if any). This adds a specific link for each node, to set the maximum bandwidth reached when communicating in both directions at the same time. In theory this value should be 2*bw for splitduplex links, but in reality this might be less. This value will depend heavily on the communication model, and on the cluster's hardware, so no default value can be set, this has to be measured. More details can be obtained in <a href="https://hal.inria.fr/hal-00919507/"> "Toward Better Simulation of MPI Applications on Ethernet/TCP Networks"</a>
-loopback_bw       | no      | int    | Bandwidth for loopback (if any). See <b>link</b> section for syntax/details. If loopback_bw and loopback_lat (see below) attributes are omitted, no loopback link is created and all intra-node communication will use the main network link of the node. Loopback link is a @ref pf_sharing_policy_fatpipe "@b FATPIPE".
-loopback_lat      | no      | int    | Latency for loopback (if any). See <b>link</b> section for syntax/details. See loopback_bw for more info.
-topology          | no      | FLAT@|TORUS@|FAT_TREE@|DRAGONFLY (default: FLAT) | Network topology to use. SimGrid currently supports FLAT (with or without backbone, as described before), <a href="http://en.wikipedia.org/wiki/Torus_interconnect">TORUS </a>, FAT_TREE, and DRAGONFLY attributes for this tag.
-topo_parameters   | no      | string | Specific parameters to pass for the topology defined in the topology tag. For torus networks, comma-separated list of the number of nodes in each dimension of the torus. Please refer to the specific documentation for @ref simgrid::kernel::routing::FatTreeZone "FatTree NetZone", @ref simgrid::kernel::routing::DragonflyZone "Dragonfly NetZone".
-
-
-the router name is defined as the resulting String in the following
-java line of code:
-
-@verbatim
-router_name = prefix + clusterId + "_router" + suffix;
-@endverbatim
-
-
-#### Cluster example ####
-
-Consider the following two (and independent) uses of the ``cluster`` tag:
-
-@verbatim
-<cluster id="my_cluster_1" prefix="" suffix="" radical="0-262144"
-         speed="1e9" bw="125e6" lat="5E-5"/>
-
-<cluster id="my_cluster_2" prefix="c-" suffix=".me" radical="0-99"
-         speed="1e9" bw="125e6" lat="5E-5"
-         bb_bw="2.25e9" bb_lat="5E-4"/>
-@endverbatim
-
-The second example creates one router and 100 machines with the following names:
-@verbatim
-c-my_cluster_2_router.me
-c-0.me
-c-1.me
-c-2.me
-...
-c-99.me
-@endverbatim
-
 @subsubsection pf_cabinet &lt;cabinet&gt;
 
 @note
@@ -165,11 +66,6 @@ There are two tags at all times available to represent network entities and
 several other tags that are available only in certain contexts.
 1. ``<link>``:
 
-2. ``<router/>``: Represents an entity that a message can be routed
-    to, but that is unable to execute any code. In SimGrid, routers have also
-    no impact on the performance: Routers do not limit any bandwidth nor
-    do they increase latency. As a matter of fact, routers are (almost) ignored
-    by the simulator when the simulation has begun.
 
 3. ``<backbone/>``: This tag is only available when the containing network zone is
                     used as a cluster (i.e., mode="Cluster")
@@ -189,209 +85,10 @@ Attribute name  | Mandatory | Values | Description
 --------------- | --------- | ------ | -----------
 id              | yes       | string | Name of the link that is supposed to act as a backbone.
 
-@subsection pf_storage Storage
-
-@note
-  This is a prototype version that should evolve quickly, hence this
-  is just some doc valuable only at the time of writing.
-  This section describes the storage management under SimGrid ; nowadays
-  it's only usable with MSG. It relies basically on linux-like concepts.
-  You also may want to have a look to its corresponding section in
-  @ref msg_file ; access functions are organized as a POSIX-like
-  interface.
 
 
 @section pf_routing Routing
 
-To achieve high performance, the routing tables used within SimGrid are
-static. This means that routing between two nodes is calculated once
-and will not change during execution. The SimGrid team chose to use this
-approach as it is rare to have a real deficiency of a resource;
-most of the time, a communication fails because the links experience too much
-congestion and hence, your connection stops before the timeout or
-because the computer designated to be the destination of that message
-is not responding.
-
-We also chose to use shortest paths algorithms in order to emulate
-routing. Doing so is consistent with the reality: [RIP](https://en.wikipedia.org/wiki/Routing_Information_Protocol),
-[OSPF](https://en.wikipedia.org/wiki/Open_Shortest_Path_First), [BGP](https://en.wikipedia.org/wiki/Border_Gateway_Protocol)
-are all calculating shortest paths. They do require some time to converge, but
-eventually, when the routing tables have stabilized, your packets will follow
-the shortest paths.
-
-@subsection  pf_tag_zone &lt;zone&gt;
-
-@subsection pf_rm Routing models
-
-For each network zone, you must define explicitly which routing model will
-be used. There are 3 different categories for routing models:
-
-1. @ref pf_routing_model_shortest_path "Shortest-path" based models: SimGrid calculates shortest
-   paths and manages them. Behaves more or less like most real life
-   routing mechanisms.
-2. @ref pf_routing_model_manual "Manually-entered" route models: you have to define all routes
-   manually in the platform description file; this can become
-   tedious very quickly, as it is very verbose.
-   Consistent with some manually managed real life routing.
-3. @ref pf_routing_model_simple "Simple/fast models": those models offer fast, low memory routing
-   algorithms. You should consider to use this type of model if
-   you can make some assumptions about your network zone.
-   Routing in this case is more or less ignored.
-
-@subsubsection pf_raf The router affair
-
-Using routers becomes mandatory when using shortest-path based
-models or when using the bindings to the ns-3 packet-level
-simulator instead of the native analytical network model implemented
-in SimGrid.
-
-For graph-based shortest path algorithms, routers are mandatory, because these
-algorithms require a graph as input and so we need to have source and
-destination for each edge.
-
-Routers are naturally an important concept ns-3 since the
-way routers run the packet routing algorithms is actually simulated.
-SimGrid's analytical models however simply aggregate the routing time
-with the transfer time.
-
-So why did we incorporate routers in SimGrid? Rebuilding a graph representation
-only from the route information turns out to be a very difficult task, because
-of the missing information about how routes intersect. That is why we
-introduced routers, which are simply used to express these intersection points.
-It is important to understand that routers are only used to provide topological
-information.
-
-To express this topological information, a <b>route</b> has to be
-defined in order to declare which link is connected to a router.
-
-
-@subsubsection pf_routing_model_shortest_path Shortest-path based models
-
-The following table shows all the models that compute routes using
-shortest-paths algorithms are currently available in SimGrid. More detail on how
-to choose the best routing model is given in the Section called @"@ref pf_routing_howto_choose_wisely@".
-
-| Name                                                | Description                                                                |
-| --------------------------------------------------- | -------------------------------------------------------------------------- |
-| @ref pf_routing_model_floyd "Floyd"                 | Floyd routing data. Pre-calculates all routes once                         |
-| @ref pf_routing_model_dijkstra "Dijkstra"           | Dijkstra routing data. Calculates routes only when needed                  |
-| @ref pf_routing_model_dijkstracache "DijkstraCache" | Dijkstra routing data. Handles some cache for already calculated routes.   |
-
-All those shortest-path models are instantiated in the same way and are
-completely interchangeable. Here are some examples:
-
-@anchor pf_routing_model_floyd
-### Floyd ###
-
-Floyd example:
-@verbatim
-<zone  id="zone0"  routing="Floyd">
-
-  <cluster id="my_cluster_1" prefix="c-" suffix=""
-           radical="0-1" speed="1000000000" bw="125000000" lat="5E-5"
-           router_id="router1"/>
-
-  <zone id="zone1" routing="None">
-    <host id="host1" speed="1000000000"/>
-  </zone>
-
-  <link id="link1" bandwidth="100000" latency="0.01"/>
-
-  <zoneroute src="my_cluster_1" dst="zone1"
-    gw_src="router1"
-    gw_dst="host1">
-    <link_ctn id="link1"/>
-  </zoneroute>
-
-</zone>
-@endverbatim
-
-zoneroute given at the end gives a topological information: link1 is
-between router1 and host1.
-
-#### Example platform files ####
-
-This is an automatically generated list of example files that use the Floyd
-routing model (the path is given relative to SimGrid's source directory)
-
-@verbinclude example_filelist_routing_floyd
-
-@anchor pf_routing_model_dijkstra
-### Dijkstra ###
-
-#### Example platform files ####
-
-This is an automatically generated list of example files that use the Dijkstra
-routing model (the path is given relative to SimGrid's source directory)
-
-@verbinclude example_filelist_routing_dijkstra
-
-Dijkstra example:
-@verbatim
- <zone id="zone_2" routing="Dijkstra">
-     <host id="zone_2_host1" speed="1000000000"/>
-     <host id="zone_2_host2" speed="1000000000"/>
-     <host id="zone_2_host3" speed="1000000000"/>
-     <link id="zone_2_link1" bandwidth="1250000000" latency="5E-4"/>
-     <link id="zone_2_link2" bandwidth="1250000000" latency="5E-4"/>
-     <link id="zone_2_link3" bandwidth="1250000000" latency="5E-4"/>
-     <link id="zone_2_link4" bandwidth="1250000000" latency="5E-4"/>
-     <router id="central_router"/>
-     <router id="zone_2_gateway"/>
-     <!-- routes providing topological information -->
-     <route src="central_router" dst="zone_2_host1"><link_ctn id="zone_2_link1"/></route>
-     <route src="central_router" dst="zone_2_host2"><link_ctn id="zone_2_link2"/></route>
-     <route src="central_router" dst="zone_2_host3"><link_ctn id="zone_2_link3"/></route>
-     <route src="central_router" dst="zone_2_gateway"><link_ctn id="zone_2_link4"/></route>
-  </zone>
-@endverbatim
-
-@anchor pf_routing_model_dijkstracache
-### DijkstraCache ###
-
-DijkstraCache example:
-@verbatim
-<zone id="zone_2" routing="DijkstraCache">
-     <host id="zone_2_host1" speed="1000000000"/>
-     ...
-(platform unchanged compared to upper example)
-@endverbatim
-
-#### Example platform files ####
-
-This is an automatically generated list of example files that use the DijkstraCache
-routing model (the path is given relative to SimGrid's source directory):
-
-Editor's note: At the time of writing, no platform file used this routing model - so
-if there are no example files listed here, this is likely to be correct.
-
-@verbinclude example_filelist_routing_dijkstra_cache
-
-@subsubsection pf_routing_model_manual Manually-entered route models
-
-| Name                               | Description                                                                    |
-| ---------------------------------- | ------------------------------------------------------------------------------ |
-| @ref pf_routing_model_full "Full"  | You have to enter all necessary routers manually; that is, every single route. This may consume a lot of memory when the XML is parsed and might be tedious to write; i.e., this is only recommended (if at all) for small platforms. |
-
-@anchor pf_routing_model_full
-### Full ###
-
-Full example:
-@verbatim
-<zone  id="zone0"  routing="Full">
-   <host id="host1" speed="1000000000"/>
-   <host id="host2" speed="1000000000"/>
-   <link id="link1" bandwidth="125000000" latency="0.000100"/>
-   <route src="host1" dst="host2"><link_ctn id="link1"/></route>
- </zone>
-@endverbatim
-
-#### Example platform files ####
-
-This is an automatically generated list of example files that use the Full
-routing model (the path is given relative to SimGrid's source directory):
-
-@verbinclude example_filelist_routing_full
 
 @subsubsection pf_routing_model_simple Simple/fast models
 
@@ -436,6 +133,8 @@ routing model (the path is given relative to SimGrid's source directory):
 @verbinclude example_filelist_routing_none
 
 
+
+
 @anchor pf_routing_model_vivaldi
 ### Vivaldi ###
 
index d175a95..2c87454 100644 (file)
@@ -32,7 +32,6 @@ If host `A` sends `100kB` (a hundred kilobytes) to host `B`, one could expect
 that this communication would take `0.81` seconds to complete according to a
 simple latency-plus-size-divided-by-bandwidth model (0.01 + 8e5/1e6 = 0.81).
 However, the default TCP model of SimGrid is a bit more complex than that. It
-
 accounts for three phenomena that directly impact the simulation time even
 on such a simple example:
 
index 272889b..4a2759e 100644 (file)
@@ -57,50 +57,46 @@ the example above.
 Cluster with a Crossbar
 -----------------------
 
-A very common parallel computing platform is a homogeneous cluster in
-which hosts are interconnected via a crossbar switch with as many
-ports as hosts, so that any disjoint pairs of hosts can communicate
-concurrently at full speed. For instance:
+A very common parallel computing platform is a homogeneous cluster in which hosts are interconnected via a crossbar switch
+with as many ports as hosts, so that any disjoint pairs of hosts can communicate concurrently at full speed. Because there
+is no contention on the switch, it is modeled as if there were a direct link from each host to the outgoing router. For
+instance:
+
 
 .. literalinclude:: ../../examples/platforms/cluster_crossbar.xml
    :language: xml
    :lines: 1-3,18-
 
-One specifies a name prefix and suffix for each host, and then give an
-integer range. In the example the cluster contains 65535 hosts (!),
-named ``node-0.simgrid.org`` to ``node-65534.simgrid.org``. All hosts
-have the same power (1 Gflop/sec) and are connected to the switch via
-links with same bandwidth (125 MBytes/sec) and latency (50
+One specifies a name prefix and suffix for each host, and then give an integer range. In the example the cluster contains
+65536 hosts (!), named ``node-0.simgrid.org`` to ``node-65535.simgrid.org``. All hosts have the same power (1 Gflop/sec)
+and are connected directly to the switch via private links with same bandwidth (125 MBytes/sec) and latency (50
 microseconds).
 
-.. todo::
+The outgoing router is named ``${prefix}${cluster_id}_router${suffix}`` so in this case, this is
+``node-cluster-crossbar_router.simgrid.org``.
 
-   Add the picture.
+.. image:: ../../examples/platforms/cluster_crossbar.svg
+   :align: center
 
 Cluster with a Shared Backbone
 ------------------------------
 
-Another popular model for a parallel platform is that of a set of
-homogeneous hosts connected to a shared communication medium, a
-backbone, with some finite bandwidth capacity and on which
-communicating host pairs can experience contention. For instance:
-
+Another popular model for a parallel platform is that of a set of homogeneous hosts connected to a shared communication
+medium, a backbone, with some limited bandwidth capacity and on which communicating host pairs can experience contention.
+For instance:
 
 .. literalinclude:: ../../examples/platforms/cluster_backbone.xml
    :language: xml
    :lines: 1-3,18-
 
-The only differences with the crossbar cluster above are the ``bb_bw``
-and ``bb_lat`` attributes that specify the backbone characteristics
-(here, a 500 microseconds latency and a 2.25 GByte/sec
-bandwidth). This link is used for every communication within the
-cluster. The route from ``node-0.simgrid.org`` to ``node-1.simgrid.org``
-counts 3 links: the private link of ``node-0.simgrid.org``, the backbone
-and the private link of ``node-1.simgrid.org``.
+The main differences with the crossbar cluster above are the ``bb_bw`` and ``bb_lat`` attributes that specify the backbone
+characteristics (here, a 500 microseconds latency and a 2.25 GBytes/sec bandwidth). This link is used for every
+communication within the cluster. The route from ``node-0.simgrid.org`` to ``node-1.simgrid.org`` counts 3 links: the
+private link of ``node-0.simgrid.org``, the backbone and the private link of ``node-1.simgrid.org``. The route from
+``node-0.simgrid.org`` to the outer internet counts 2 links: the private link of ``node-0.simgrid.org`` and the backbone.
 
-.. todo::
-
-   Add the picture.
+.. image:: ../../examples/platforms/cluster_backbone.svg
+   :align: center
 
 Torus Cluster
 -------------
@@ -197,10 +193,10 @@ For example, ``3,4 ; 3,2 ; 3,1 ; 2``:
 Star Zone
 ---------
 
-In a Star topology, as the name says, nodes are organized following a star.
-It's similar to a cluster topology but you have the flexibility to set
-different route for every component in the star.
-Unfortunately, it's only available in the C++ interface.
+A Star topology can be seen as a crossbar cluster that does not interconnect hosts, but subzones. It can for example be
+used to model a cluster of complex hosts, where each host is disaggregated, with CPUs, GPUs and maybe a network on chip. It
+is similar to a cluster topology, with the flexibility to set different route for every component in the star. Because of
+its complexity, this topology is only available from the C++ interface.
 
 .. image:: img/starzone.svg
     :scale: 80%
index 93156f2..c7e45cc 100644 (file)
@@ -92,14 +92,17 @@ computed automatically at startup. Another way to describe the same platform can
 .. image:: /tuto_smpi/3hosts.png
    :align: center
 
+.. _pf_rm_cluster:
+
 Clusters
 ========
 
-TODO
+Clusters constitute a fundamental building bricks of any cyberinfrastructure. SimGrid provides several kinds of clusters:
+crossbar clusters (contention-free internal network), backbone clusters (constrained internal network), fat-trees,
+DragonFly, Torus and generic Star clusters. Each of them are created through the :ref:`pf_tag_cluster` tag, and have a
+highly optimized implementation in SimGrid source code.
 
-  - **Cluster/Fat-Tree/DragonFly/Torus**: routing is defined by the topology, automatically created.
-    These zones must be defined through the :ref:`pf_tag_cluster` tag in the XML.
-  - **Star**: star-like topology. Users describe routes from/to every host in the zone.
+The documentation of each cluster kinds is given as :ref:`platform_examples`.
 
 Vivaldi
 =======
@@ -150,6 +153,13 @@ Wi-Fi
 
 TODO
 
+ns-3
+====
+
+When using :ref:`model_ns3`, SimGrid does not uses its own platform or routing models. Your platform must be limited to one
+zone only, and any routing model will be ignored. Since ns-3 uses a shortest path algorithm on its side, all routes must be
+of length 1.
+
 .. _pf_routes:
 
 Describing routes
@@ -169,6 +179,8 @@ described in the next section actually works.
 
 TODO: bypassRoute
 
+.. _pf_route_usage:
+
 Calculating network paths
 *************************
 
index 0721840..b006d55 100644 (file)
@@ -20,48 +20,70 @@ Your platform description should follow the specification presented in the
 
 -------------------------------------------------------------------------------
 
-.. _pf_tag_disk:
+.. _pf_tag_cluster:
 
-<disk>
-------
+<cluster>
+---------
 
-SimGrid can simulate the time it takes to read or write data on disk, even if the stored data is not made persistent in
-any way by SimGrid. This means that your application will correctly be slowed down when doing simulated I/O, but there
-is no way to get the data stored this way.
+This complex tag builds a full zone, with some hosts, links, a router, and the relevant routing algorithm. There is several
+kind of specifically tailored cluster types: crossbar clusters (contention-free internal network), backbone clusters
+(constrained internal network), fat-trees, DragonFly and Torus (star clusters are similar, but can only be created from the
+C++ code). The ``topology`` attribute is used to choose the type of cluster while the ``topo_parameters`` attribute is used
+to configure the topology. Please refer to the  :ref:`examples in the documentation <platform_examples>` for all details.
 
-We decided to not model anything beyond raw access in SimGrid because we believe that there is not single way of doing so.
-We provide an example model of file system as a plugin, (sparsely) documented in :ref:`plugin_filesystem`.
+Regardless of its topology, each cluster comes with a router that can be used for inter-zone routing. Its name is defined
+as ``${prefix}${clusterId}_router${suffix}``.
 
-**Parent tags:** :ref:`pf_tag_host` |br|
-**Children tags:** :ref:`pf_tag_prop` |br|
+**Parent tags:** :ref:`pf_tag_platform`, :ref:`pf_tag_zone` |br|
+**Children tags:** none |br|
 **Attributes:**
 
-:``id``: A name of your choice (must be unique on this host).
-:``read_bw``: Read bandwidth for this disk. You must specify a unit as follows.
+:``id``: The identifier of the cluster. Facilitates referring to this cluster.
+:``prefix``: Each node of the cluster has to have a name. This name will be prefixed with this prefix.
+:``suffix``: Each node of the cluster will be suffixed with this suffix
+:``radical``: Regexp used to generate cluster nodes name.
 
-   **Units in bytes and powers of 2** (1 KiBps = 1,024 Bps):
-     Bps, KiBps, MiBps, GiBps, TiBps, PiBps, or EiBps. |br|
-   **Units in bits  and powers of 2** (1 Bps = 8 bps):
-     bps, Kibps, Mibps, Gibps, Tibps, Pibps, or Eibps. |br|
-   **Units in bytes and powers of 10**  (1 KBps = 1,000 Bps):
-     Bps, KBps, MBps, GBps, TBps, PBps, or EBps. |br|
-   **Units in bits  and powers of 10:**
-     bps, Kbps, Mbps, Gbps, Tbps, Pbps, or Ebps.
+    Syntax: "10-20" will give you 11 machines numbered from 10 to 20, "10-20;2" will give you 12 machines, one with the number 2, others numbered as before.
 
-:``write_bw``: Write bandwidth for this disk. You must specify a unit as for the read bandwidth.
+    The produced number is concatenated between prefix and suffix to form machine names.
+:``speed``: Same as the ``speed`` attribute of the :ref:`pf_tag_host` tag.
+:``core``: Same as the ``core`` attribute of the :ref:`pf_tag_host` tag.
+:``bw``: Bandwidth for the links between nodes and backbone (if any). See :ref:`pf_tag_link` for syntax/details.
+:``lat``: Latency for the links between nodes and backbone (if any). See :ref:`pf_tag_link` for syntax/details.
+:``sharing_policy``: Sharing policy for the links between nodes and backbone (if any). See :ref:`pf_tag_link` for syntax/details.
+:``bb_bw``: Bandwidth for backbone (if any). See :ref:`pf_tag_link` for syntax/details.
 
-.. code-block:: xml
+    If bb_bw and bb_lat attributes are omitted, no backbone is created (alternative cluster architecture described earlier).
+:``bb_lat``: Latency for backbone (if any). See :ref:`pf_tag_link` section for syntax/details.
 
-    <host id="alice" speed="1Gf">
-      <disk id="Disk1" read_bw="200MBps" write_bw="80MBps">
-        <!-- you can add properties for anything you want: they are not used by SimGrid -->
-        <prop id="content" value="storage/content/small_content.txt"/>
-      </disk>
-      <prop id="ram" value="100B" />
-    </host>
+    If bb_lat and bb_bw attributes are omitted, no backbone is created (alternative cluster architecture described earlier).
+:``bb_sharing_policy``: Sharing policy for the backbone (if any). See :ref:`pf_tag_link` section for syntax/details.
+:``limiter_link``: Bandwidth for limiter link (if any).
 
--------------------------------------------------------------------------------
+    This adds a specific link for each node, to set the maximum bandwidth reached when communicating in both directions at the same time.
+
+    In theory this value should be 2*bw for splitduplex links, but in reality this might be less. This value will depend heavily on the communication model, and on the cluster's hardware, so no default value can be set, this has to be measured.
+
+    More details can be obtained in `Toward Better Simulation of MPI Applications on Ethernet/TCP Networks <https://hal.inria.fr/hal-00919507/>`_
+:``loopback_bw``: Bandwidth for loopback (if any). See :ref:`pf_tag_link` section for syntax/details.
+
+    If loopback_bw and loopback_lat attributes are omitted, no loopback link is created and all intra-node communication will use the main network link of the node.
+
+    The sharing policy of a loopback link is **FATPIPE** :ref:`pf_tag_link`.
+:``loopback_lat``: Latency for loopback (if any). See loopback_bw for more info.
+:``topology``: Network topology to use.
+
+    SimGrid currently supports FLAT (with or without backbone, as described before), TORUS, FAT_TREE and DRAGONFLY attributes for this tag.
+
+    See :ref:`platform_examples` for more details.
+
+:``topo_parameters``: Specific parameters to pass for the topology defined in the topology tag.
+
+    For torus networks, comma-separated list of the number of nodes in each dimension of the torus.
+
+    Please refer to :ref:`platform_examples`.
 
+-------------------------------------------------------------------------------
 .. _pf_tag_config:
 
 <config>
@@ -97,6 +119,48 @@ name of the flag and ``value`` is what it has to be set to.
 
 -------------------------------------------------------------------------------
 
+.. _pf_tag_disk:
+
+<disk>
+------
+
+SimGrid can simulate the time it takes to read or write data on disk, even if the stored data is not made persistent in
+any way by SimGrid. This means that your application will correctly be slowed down when doing simulated I/O, but there
+is no way to get the data stored this way.
+
+We decided to not model anything beyond raw access in SimGrid because we believe that there is not single way of doing so.
+We provide an example model of file system as a plugin, (sparsely) documented in :ref:`plugin_filesystem`.
+
+**Parent tags:** :ref:`pf_tag_host` |br|
+**Children tags:** :ref:`pf_tag_prop` |br|
+**Attributes:**
+
+:``id``: A name of your choice (must be unique on this host).
+:``read_bw``: Read bandwidth for this disk. You must specify a unit as follows.
+
+   **Units in bytes and powers of 2** (1 KiBps = 1,024 Bps):
+     Bps, KiBps, MiBps, GiBps, TiBps, PiBps, or EiBps. |br|
+   **Units in bits  and powers of 2** (1 Bps = 8 bps):
+     bps, Kibps, Mibps, Gibps, Tibps, Pibps, or Eibps. |br|
+   **Units in bytes and powers of 10**  (1 KBps = 1,000 Bps):
+     Bps, KBps, MBps, GBps, TBps, PBps, or EBps. |br|
+   **Units in bits  and powers of 10:**
+     bps, Kbps, Mbps, Gbps, Tbps, Pbps, or Ebps.
+
+:``write_bw``: Write bandwidth for this disk. You must specify a unit as for the read bandwidth.
+
+.. code-block:: xml
+
+    <host id="alice" speed="1Gf">
+      <disk id="Disk1" read_bw="200MBps" write_bw="80MBps">
+        <!-- you can add properties for anything you want: they are not used by SimGrid -->
+        <prop id="content" value="storage/content/small_content.txt"/>
+      </disk>
+      <prop id="ram" value="100B" />
+    </host>
+
+-------------------------------------------------------------------------------
+
 .. _pf_tag_host:
 
 <host>
@@ -391,12 +455,12 @@ following functions:
 <route>
 -------
 
-A path between two network locations, composed of several occurrences
-of :ref:`pf_tag_link` .
+A path between two network locations, composed of several occurrences of :ref:`pf_tag_link`. It is only relevant for
+intra-:ref:`pf_tag_zone` routes. Inter-zone routes must be declared with :ref:`pf_tag_zoneRoute`. More detail can be
+found in the following sections :ref:`pf_routes` and :ref:`pf_route_usage`.
 
 **Parent tags:** :ref:`pf_tag_zone` |br|
 **Children tags:** :ref:`pf_tag_link_ctn` |br|
-**See also:** :ref:`pf_tag_zoneRoute`, :ref:`pf_routes` |br|
 **Attributes:**
 
 :``src``: Host from which this route starts. Must be the name of an existing host.
@@ -413,10 +477,9 @@ of :ref:`pf_tag_link` .
 <router>
 --------
 
-A router is similar to a :ref:`pf_tag_host`, but it cannot contain
-any actor. It is only useful to some routing algorithms. In
-particular, they are useful when you want to use the NS3 bindings to
-break the routes that are longer than 1 hop.
+A router is similar to a :ref:`pf_tag_host`, but it cannot contain any actor. It is only useful to some routing
+algorithms. In particular, they are useful when you want to use the NS3 bindings to break the routes that are longer
+than 1 hop.
 
 **Parent tags:** :ref:`pf_tag_zone` (only leaf zones, i.e., zones containing neither inner zones nor clusters) |br|
 **Attributes:**
@@ -452,159 +515,26 @@ elements such as host or peer) |br|
 <zoneRoute>
 -----------
 
-The purpose of this entity is to define a route between two zones. Recall that
-all zones form a tree, so to connect two sibling zones, you must give such a
-zoneRoute specifying the source and destination zones, along with the gateway in
-each zone (i.e., the point to reach within that zone to reach the zone), and the
-list of links to go from one zone to another.
+All information to factorize the routes between two zones; intra-zone paths must be declared with :ref:`pf_tag_route`.
+Since zones form a tree, :ref:`pf_tag_zoneRoute` is probably best used to connect sibling zones.
+
+When declaring a zoneRoute, you must give the source and destination zones, along with the gateway in each zone (i.e.,
+the point to reach within that zone to reach the declared route), and the list of links to go from one zone to another.
+More detail can be found in the following sections :ref:`pf_routes` and :ref:`pf_route_usage`.
 
 **Parent tags:** :ref:`pf_tag_zone` |br|
 **Children tags:** :ref:`pf_tag_link_ctn` |br|
-**See also:** :ref:`pf_tag_route`, :ref:`pf_routes` |br|
 **Attributes:**
 
 :``src``: Zone from which this route starts. Must be an existing zone.
 :``dst``: Zone to which this route leads. Must be an existing zone.
 :``gw_src``: Netpoint (within src zone) from which this route starts. Must be an existing host/router.
 :``gw_dst``: Netpoint (within dst zone) to which this route leads. Must be an existing host/router.
-:``symmetrical``: Whether this route is symmetrical, ie, whether we
-                 are defining the route ``dst -> src`` at the same
-                 time. Valid values: ``yes``, ``no``, ``YES``, ``NO``.
-
+:``symmetrical``: Whether this route is symmetrical, ie, whether we are defining the route ``dst -> src`` at the same
+                 time. Valid values: ``yes``, ``no``, ``YES``, ``NO``. 
 
 -------------------------------------------------------------------------------
 
-.. _pf_tag_cluster:
-
-<cluster>
----------
-
-This tag is commonly used when one wants to define many hosts and a network quickly.
-Technically, cluster is a meta-tag: **from the inner SimGrid point of
-view, a cluster is a network zone where some optimized routing is defined**.
-The default inner organization of the cluster is as follow:
-
-.. code-block:: text
-
-                 __________
-                |          |
-                |  router  |
-    ____________|__________|_____________ backbone
-      |   |   |              |     |   |
-    l0|        l1| l2|           l97| l96 |   | l99
-      |   |   |   ........   |     |   |
-      |                                |
-    c-0.me                             c-99.me
-
-
-Here, a set of **hosts** is defined. Each of them has a **link**
-to a central backbone (backbone is a link itself, as a link can
-be used to represent a switch).
-A **router** allows to connect a **cluster** to the outside world. Internally,
-SimGrid treats a cluster as a network zone containing all hosts: the router is the
-gateway for the cluster.
-
-There is an alternative organization, which is as follows:
-
-.. code-block:: text
-
-         __________
-        |          |
-        |  router  |
-        |__________|
-            / | \
-           /  |  \
-       l0 / l1|   \l2
-         /    |    \
-        /     |     \
-    host0   host1   host2
-
-The principle is the same, except that there is no backbone. This representation
-can be obtained easily: just do not set the bb_* attributes.
-
-**Parent tags:** :ref:`pf_tag_platform`, :ref:`pf_tag_zone` |br|
-**Children tags:** none |br|
-**Attributes:**
-
-:``id``: The identifier of the cluster. Facilitates referring to this cluster.
-:``prefix``: Each node of the cluster has to have a name. This name will be prefixed with this prefix.
-:``suffix``: Each node of the cluster will be suffixed with this suffix
-:``radical``: Regexp used to generate cluster nodes name.
-
-    Syntax: "10-20" will give you 11 machines numbered from 10 to 20, "10-20;2" will give you 12 machines, one with the number 2, others numbered as before.
-
-    The produced number is concatenated between prefix and suffix to form machine names.
-:``speed``: Same as the ``speed`` attribute of the :ref:`pf_tag_host` tag.
-:``core``: Same as the ``core`` attribute of the :ref:`pf_tag_host` tag.
-:``bw``: Bandwidth for the links between nodes and backbone (if any). See :ref:`pf_tag_link` for syntax/details.
-:``lat``: Latency for the links between nodes and backbone (if any). See :ref:`pf_tag_link` for syntax/details.
-:``sharing_policy``: Sharing policy for the links between nodes and backbone (if any). See :ref:`pf_tag_link` for syntax/details.
-:``bb_bw``: Bandwidth for backbone (if any). See :ref:`pf_tag_link` for syntax/details.
-
-    If bb_bw and bb_lat attributes are omitted, no backbone is created (alternative cluster architecture described earlier).
-:``bb_lat``: Latency for backbone (if any). See :ref:`pf_tag_link` section for syntax/details.
-
-    If bb_lat and bb_bw attributes are omitted, no backbone is created (alternative cluster architecture described earlier).
-:``bb_sharing_policy``: Sharing policy for the backbone (if any). See :ref:`pf_tag_link` section for syntax/details.
-:``limiter_link``: Bandwidth for limiter link (if any).
-
-    This adds a specific link for each node, to set the maximum bandwidth reached when communicating in both directions at the same time.
-
-    In theory this value should be 2*bw for splitduplex links, but in reality this might be less. This value will depend heavily on the communication model, and on the cluster's hardware, so no default value can be set, this has to be measured.
-
-    More details can be obtained in `Toward Better Simulation of MPI Applications on Ethernet/TCP Networks <https://hal.inria.fr/hal-00919507/>`_
-:``loopback_bw``: Bandwidth for loopback (if any). See :ref:`pf_tag_link` section for syntax/details.
-
-    If loopback_bw and loopback_lat attributes are omitted, no loopback link is created and all intra-node communication will use the main network link of the node.
-
-    The sharing policy of a loopback link is **FATPIPE** :ref:`pf_tag_link`.
-:``loopback_lat``: Latency for loopback (if any). See loopback_bw for more info.
-:``topology``: Network topology to use.
-
-    SimGrid currently supports FLAT (with or without backbone, as described before), TORUS, FAT_TREE and DRAGONFLY attributes for this tag.
-
-    See :ref:`platform_examples` for more details.
-
-:``topo_parameters``: Specific parameters to pass for the topology defined in the topology tag.
-
-    For torus networks, comma-separated list of the number of nodes in each dimension of the torus.
-
-    Please refer to :ref:`platform_examples`.
-
-
-Cluster example
-^^^^^^^^^^^^^^^
-
-Consider the following two (and independent) uses of the ``cluster`` tag:
-
-.. code-block:: xml
-
-    <cluster id="my_cluster_1" prefix="" suffix="" radical="0-262144"
-         speed="1e9" bw="125e6" lat="5E-5"/>
-
-    <cluster id="my_cluster_2" prefix="c-" suffix=".me" radical="0-99"
-         speed="1e9" bw="125e6" lat="5E-5"
-         bb_bw="2.25e9" bb_lat="5E-4"/>
-
-
-The second example creates one router and 100 machines with the following names:
-
-.. code-block:: text
-
-    c-my_cluster_2_router.me
-    c-0.me
-    c-1.me
-    c-2.me
-    ...
-    c-99.me
-
-.. note::
-
-    The router name is defined as the resulting string: prefix + clusterId + "_router" + suffix.
-    In this case: *my_cluster_1_router* and *my_cluster_2_router.me*.
-
--------------------------------------------------------------------------------
 
 .. _pf_tag_cabinet:
 
@@ -656,6 +586,10 @@ The following example shows how to use the cabinet tag.
 The hosts generated in the above example are named host-1.cluster, host-2.cluster1
 etc.
 
-.. |br| raw:: html
+.. TODO::
+
+   Missing tags: <host_link> <backbone> <bypassRoute> <bypassZoneRoute> <actor><argument>
 
+.. |br| raw:: html
+     
    <br />
index b0e79f4..946561f 100644 (file)
        id="text418"
        x="322.50092"
        y="-2255.2273"><tspan
-         x="322.50092 349.36172"
+         x="322.50092"
          y="-2255.2273"
          sodipodi:role="line"
          id="tspan416"
-         style="stroke-width:2.02122">+h</tspan></text><text
+         style="stroke-width:2.02122">+ z</tspan></text><text
        transform="scale(1,-1)"
        style="font-variant:normal;font-weight:normal;font-size:16.1093px;font-family:CMSSBX10;-inkscape-font-specification:CMSSBX10;writing-mode:lr-tb;fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.02122"
        id="text422"
        id="text426"
        x="381.89651"
        y="-2255.2273"><tspan
-         x="381.89651 408.73312"
+         x="381.89651"
          y="-2255.2273"
          sodipodi:role="line"
          id="tspan424"
-         style="stroke-width:2.02122">+h</tspan></text><text
+         style="stroke-width:2.02122">+ z</tspan></text><text
        transform="scale(1,-1)"
        style="font-variant:normal;font-weight:normal;font-size:16.1093px;font-family:CMSSBX10;-inkscape-font-specification:CMSSBX10;writing-mode:lr-tb;fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.02122"
        id="text430"
          id="tspan535311"
          style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18px;font-family:serif;-inkscape-font-specification:serif;stroke:none;stroke-width:0.749999px"
          x="76.447578"
-         y="-2383.0488">h</tspan></text><text
+         y="-2383.0488">z</tspan></text><text
        xml:space="preserve"
        style="font-weight:bold;font-size:18px;line-height:21.6px;font-family:serif;-inkscape-font-specification:'serif Bold';text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:#000000;stroke-width:0.749999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
        x="81.32592"
diff --git a/examples/platforms/cluster_backbone.svg b/examples/platforms/cluster_backbone.svg
new file mode 100644 (file)
index 0000000..a7cb48d
--- /dev/null
@@ -0,0 +1,454 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="29.855295mm"
+   height="29.063147mm"
+   viewBox="0 0 29.855297 29.063145"
+   version="1.1"
+   id="svg8"
+   inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
+   sodipodi:docname="cluster_backbone.svg"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:dc="http://purl.org/dc/elements/1.1/">
+  <defs
+     id="defs2">
+    <rect
+       x="90.377945"
+       y="-29.622009"
+       width="20"
+       height="15"
+       id="rect8879" />
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path1933"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         transform="matrix(0.4,0,0,0.4,4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path1191"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:path-effect
+       effect="powerstroke"
+       id="path-effect1302"
+       is_visible="true"
+       offset_points="0,0.13229166"
+       sort_points="true"
+       interpolator_type="CubicBezierJohan"
+       interpolator_beta="0.2"
+       start_linecap_type="zerowidth"
+       linejoin_type="extrp_arc"
+       miter_limit="4"
+       end_linecap_type="zerowidth"
+       lpeversion="0"
+       not_jump="false"
+       scale_width="1" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect1300"
+       is_visible="true"
+       lpeversion="0" />
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-6"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path1191-7"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path1191-2"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-5"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path1191-3"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-28"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path1191-6"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-25"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path1191-30"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-4"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path1191-8"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart-8"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path1933-4"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         transform="matrix(0.4,0,0,0.4,4,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart-8-3"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path1933-4-6"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         transform="matrix(0.4,0,0,0.4,4,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-25-0"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path1191-30-2"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.1891638"
+     inkscape:cx="-8.4507154"
+     inkscape:cy="-31.062089"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     showguides="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1023"
+     inkscape:window-x="0"
+     inkscape:window-y="33"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:pagecheckerboard="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid815"
+       originx="-9.1604202"
+       originy="-362.17001" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Calque 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-9.1604177,-56.519543)">
+    <path
+       inkscape:connector-curvature="0"
+       id="path967-0-9"
+       d="m 18.520831,70.057843 10e-7,9.260404"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path967-0-9-6"
+       d="m 21.204021,60.519662 10e-7,9.260404"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path967-0"
+       d="m 11.906248,70.057843 1e-6,9.260398"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path967-0-3"
+       d="M 30.324435,69.671791 H 10.567433"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path967-0-5"
+       d="M 29.104165,70.057843 V 79.31826"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <circle
+       r="2.6458333"
+       cy="79.177658"
+       cx="11.906251"
+       id="path834-9-5"
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#828282;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.95053;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+    <circle
+       r="2.6458333"
+       cy="79.177658"
+       cx="18.520832"
+       id="path834-2-1"
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#828282;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.95053;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+    <circle
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#828282;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.95053;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       id="path834-2-1-7"
+       cx="29.130888"
+       cy="79.473244"
+       r="2.6458333" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="51.593746"
+       y="38.307831"
+       id="text1136"><tspan
+         sodipodi:role="line"
+         id="tspan1134"
+         x="51.593746"
+         y="38.307831"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583px" /></text>
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot1060"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       transform="translate(-2.645835,29.703665)"><flowRegion
+         id="flowRegion1062"><rect
+           id="rect1064"
+           width="252.33426"
+           height="299.23923"
+           x="-46.95631"
+           y="-219.23924" /></flowRegion><flowPara
+         id="flowPara1066" /></flowRoot>
+    <text
+       xml:space="preserve"
+       transform="matrix(0.26458333,0,0,0.26458333,9.1604177,63.343237)"
+       id="text8877"
+       style="font-weight:bold;font-size:53.3333px;line-height:64.0001px;font-family:serif;-inkscape-font-specification:'serif Bold';text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8879);fill:#000000;stroke:#000000;stroke-width:0.999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000" />
+    <text
+       xml:space="preserve"
+       style="font-weight:bold;font-size:3.52777px;line-height:4.23333px;font-family:serif;-inkscape-font-specification:'serif Bold';text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
+       x="22.103201"
+       y="79.406593"
+       id="text14847"><tspan
+         sodipodi:role="line"
+         style="stroke-width:0.264583px"
+         x="22.103201"
+         y="79.406593"
+         id="tspan14849">...</tspan></text>
+    <rect
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#828282;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.95053;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       id="rect821-4"
+       width="5.2916665"
+       height="5.2916665"
+       x="18.520832"
+       y="59.474514" />
+    <text
+       xml:space="preserve"
+       style="font-size:3.52777px;line-height:4.23333px;font-family:serif;-inkscape-font-specification:serif;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
+       x="21.640411"
+       y="68.453323"
+       id="text6237"><tspan
+         sodipodi:role="line"
+         id="tspan6235"
+         style="stroke:none;stroke-width:0.264583px"
+         x="21.640411"
+         y="68.453323">Backbone</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.52777px;line-height:4.23333px;font-family:serif;-inkscape-font-specification:serif;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
+       x="29.889496"
+       y="74.204445"
+       id="text7391"><tspan
+         sodipodi:role="line"
+         id="tspan7389"
+         style="stroke:none;stroke-width:0.264583px"
+         x="29.889496"
+         y="74.204445">L<tspan
+   style="font-size:65%;baseline-shift:sub"
+   id="tspan14739">n</tspan></tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.52777px;line-height:4.23333px;font-family:serif;-inkscape-font-specification:serif;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
+       x="19.100447"
+       y="74.204445"
+       id="text7391-7"><tspan
+         sodipodi:role="line"
+         id="tspan7389-5"
+         style="stroke:none;stroke-width:0.264583px"
+         x="19.100447"
+         y="74.204445">L<tspan
+   style="font-size:65%;baseline-shift:sub"
+   id="tspan18162">2</tspan></tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.52777px;line-height:4.23333px;font-family:serif;-inkscape-font-specification:serif;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
+       x="12.289496"
+       y="74.204445"
+       id="text7391-5"><tspan
+         sodipodi:role="line"
+         id="tspan7389-6"
+         style="stroke:none;stroke-width:0.264583px"
+         x="12.289496"
+         y="74.204445">L<tspan
+   style="font-size:65%;baseline-shift:sub"
+   id="tspan20788">1</tspan></tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.52777px;line-height:4.23333px;font-family:serif;-inkscape-font-specification:serif;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
+       x="10.292629"
+       y="84.877136"
+       id="text7391-5-9"><tspan
+         sodipodi:role="line"
+         id="tspan7389-6-1"
+         style="stroke:none;stroke-width:0.264583px"
+         x="10.292629"
+         y="84.877136">H<tspan
+   style="font-size:65%;baseline-shift:sub"
+   id="tspan20788-2">1</tspan></tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.52777px;line-height:4.23333px;font-family:serif;-inkscape-font-specification:serif;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
+       x="16.739195"
+       y="84.877136"
+       id="text7391-5-9-3"><tspan
+         sodipodi:role="line"
+         id="tspan7389-6-1-6"
+         style="stroke:none;stroke-width:0.264583px"
+         x="16.739195"
+         y="84.877136">H<tspan
+   style="font-size:65%;baseline-shift:sub"
+   id="tspan20788-2-0">2</tspan></tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.52777px;line-height:4.23333px;font-family:serif;-inkscape-font-specification:serif;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
+       x="27.490547"
+       y="84.877136"
+       id="text7391-5-9-6"><tspan
+         sodipodi:role="line"
+         id="tspan7389-6-1-2"
+         style="stroke:none;stroke-width:0.264583px"
+         x="27.490547"
+         y="84.877136">H<tspan
+   style="font-size:65%;baseline-shift:sub"
+   id="tspan20788-2-6">n</tspan></tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.52777px;line-height:4.23333px;font-family:serif;-inkscape-font-specification:serif;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
+       x="14.954734"
+       y="59.091301"
+       id="text7391-5-9-6-1"><tspan
+         sodipodi:role="line"
+         id="tspan7389-6-1-2-8"
+         style="stroke:none;stroke-width:0.264583px"
+         x="14.954734"
+         y="59.091301">Router</tspan></text>
+  </g>
+</svg>
diff --git a/examples/platforms/cluster_crossbar.svg b/examples/platforms/cluster_crossbar.svg
new file mode 100644 (file)
index 0000000..1d91e48
--- /dev/null
@@ -0,0 +1,431 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="22.954163mm"
+   height="30.653582mm"
+   viewBox="0 0 22.954164 30.65358"
+   version="1.1"
+   id="svg8"
+   inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
+   sodipodi:docname="cluster_crossbar.svg"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:dc="http://purl.org/dc/elements/1.1/">
+  <defs
+     id="defs2">
+    <rect
+       x="90.377945"
+       y="-29.622009"
+       width="20"
+       height="15"
+       id="rect8879" />
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path1933"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         transform="matrix(0.4,0,0,0.4,4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path1191"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:path-effect
+       effect="powerstroke"
+       id="path-effect1302"
+       is_visible="true"
+       offset_points="0,0.13229166"
+       sort_points="true"
+       interpolator_type="CubicBezierJohan"
+       interpolator_beta="0.2"
+       start_linecap_type="zerowidth"
+       linejoin_type="extrp_arc"
+       miter_limit="4"
+       end_linecap_type="zerowidth"
+       lpeversion="0"
+       not_jump="false"
+       scale_width="1" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect1300"
+       is_visible="true"
+       lpeversion="0" />
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-6"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path1191-7"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path1191-2"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-5"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path1191-3"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-28"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path1191-6"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-25"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path1191-30"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-4"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path1191-8"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart-8"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path1933-4"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         transform="matrix(0.4,0,0,0.4,4,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart-8-3"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path1933-4-6"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         transform="matrix(0.4,0,0,0.4,4,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-25-0"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path1191-30-2"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.5859181"
+     inkscape:cx="57.426414"
+     inkscape:cy="-11.601296"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     showguides="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1023"
+     inkscape:window-x="0"
+     inkscape:window-y="33"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:pagecheckerboard="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid815"
+       originx="-9.1604204"
+       originy="-361.19916" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Calque 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-9.1604177,-55.548683)">
+    <path
+       inkscape:connector-curvature="0"
+       id="path967-0-9"
+       d="M 22.754166,63.443249 18.520832,79.318247"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path967-0"
+       d="M 22.754165,63.443247 11.906249,79.318241"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path967-0-5"
+       d="m 22.754165,63.443253 6.614584,15.874994"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       sodipodi:nodetypes="cc" />
+    <circle
+       r="2.6458333"
+       cy="79.177658"
+       cx="11.906251"
+       id="path834-9-5"
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#828282;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.95053;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+    <circle
+       r="2.6458333"
+       cy="79.177658"
+       cx="18.520832"
+       id="path834-2-1"
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#828282;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.95053;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+    <circle
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#828282;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.95053;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       id="path834-2-1-7"
+       cx="29.368748"
+       cy="79.442253"
+       r="2.6458333" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="51.593746"
+       y="38.307831"
+       id="text1136"><tspan
+         sodipodi:role="line"
+         id="tspan1134"
+         x="51.593746"
+         y="38.307831"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583px" /></text>
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot1060"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       transform="translate(-2.645835,29.703665)"><flowRegion
+         id="flowRegion1062"><rect
+           id="rect1064"
+           width="252.33426"
+           height="299.23923"
+           x="-46.95631"
+           y="-219.23924" /></flowRegion><flowPara
+         id="flowPara1066" /></flowRoot>
+    <text
+       xml:space="preserve"
+       transform="matrix(0.26458333,0,0,0.26458333,9.1604177,63.343237)"
+       id="text8877"
+       style="font-weight:bold;font-size:53.3333px;line-height:64.0001px;font-family:serif;-inkscape-font-specification:'serif Bold';text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8879);fill:#000000;stroke:#000000;stroke-width:0.999999px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000" />
+    <text
+       xml:space="preserve"
+       style="font-weight:bold;font-size:3.52777px;line-height:4.23333px;font-family:serif;-inkscape-font-specification:'serif Bold';text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
+       x="22.103201"
+       y="79.406593"
+       id="text14847"><tspan
+         sodipodi:role="line"
+         style="stroke-width:0.264583px"
+         x="22.103201"
+         y="79.406593"
+         id="tspan14849">...</tspan></text>
+    <rect
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#828282;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.95053;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       id="rect821-4"
+       width="5.2916665"
+       height="5.2916665"
+       x="20.108334"
+       y="59.2099" />
+    <text
+       xml:space="preserve"
+       style="font-size:3.52777px;line-height:4.23333px;font-family:serif;-inkscape-font-specification:serif;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
+       x="26.159363"
+       y="70.243706"
+       id="text7391"><tspan
+         sodipodi:role="line"
+         id="tspan7389"
+         style="stroke:none;stroke-width:0.264583px"
+         x="26.159363"
+         y="70.243706">L<tspan
+   style="font-size:65%;baseline-shift:sub"
+   id="tspan14739">n</tspan></tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.52777px;line-height:4.23333px;font-family:serif;-inkscape-font-specification:serif;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
+       x="20.668068"
+       y="73.314293"
+       id="text7391-7"><tspan
+         sodipodi:role="line"
+         id="tspan7389-5"
+         style="stroke:none;stroke-width:0.264583px"
+         x="20.668068"
+         y="73.314293">L<tspan
+   style="font-size:65%;baseline-shift:sub"
+   id="tspan18162">2</tspan></tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.52777px;line-height:4.23333px;font-family:serif;-inkscape-font-specification:serif;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
+       x="13.304093"
+       y="70.710693"
+       id="text7391-5"><tspan
+         sodipodi:role="line"
+         id="tspan7389-6"
+         style="stroke:none;stroke-width:0.264583px"
+         x="13.304093"
+         y="70.710693">L<tspan
+   style="font-size:65%;baseline-shift:sub"
+   id="tspan20788">1</tspan></tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.52777px;line-height:4.23333px;font-family:serif;-inkscape-font-specification:serif;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
+       x="10.347633"
+       y="85.496712"
+       id="text7391-5-9"><tspan
+         sodipodi:role="line"
+         id="tspan7389-6-1"
+         style="stroke:none;stroke-width:0.264583px"
+         x="10.347633"
+         y="85.496712">H<tspan
+   style="font-size:65%;baseline-shift:sub"
+   id="tspan20788-2">1</tspan></tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.52777px;line-height:4.23333px;font-family:serif;-inkscape-font-specification:serif;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
+       x="16.794199"
+       y="85.496712"
+       id="text7391-5-9-3"><tspan
+         sodipodi:role="line"
+         id="tspan7389-6-1-6"
+         style="stroke:none;stroke-width:0.264583px"
+         x="16.794199"
+         y="85.496712">H<tspan
+   style="font-size:65%;baseline-shift:sub"
+   id="tspan20788-2-0">2</tspan></tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.52777px;line-height:4.23333px;font-family:serif;-inkscape-font-specification:serif;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
+       x="27.545551"
+       y="85.496712"
+       id="text7391-5-9-6"><tspan
+         sodipodi:role="line"
+         id="tspan7389-6-1-2"
+         style="stroke:none;stroke-width:0.264583px"
+         x="27.545551"
+         y="85.496712">H<tspan
+   style="font-size:65%;baseline-shift:sub"
+   id="tspan20788-2-6">n</tspan></tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.52777px;line-height:4.23333px;font-family:serif;-inkscape-font-specification:serif;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#000000;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stop-color:#000000"
+       x="16.479395"
+       y="58.120441"
+       id="text7391-5-9-6-1"><tspan
+         sodipodi:role="line"
+         id="tspan7389-6-1-2-8"
+         style="stroke:none;stroke-width:0.264583px"
+         x="16.479395"
+         y="58.120441">Router</tspan></text>
+  </g>
+</svg>
index 9d79f9d..983b23b 100644 (file)
@@ -17,7 +17,7 @@
   -->
   <zone id="world" routing="Full">
     <cluster id="cluster-crossbar"
-             prefix="node-" radical="0-65536" suffix=".simgrid.org"
+             prefix="node-" radical="0-65535" suffix=".simgrid.org"
             speed="1Gf" bw="125MBps" lat="50us"/>
   </zone>
 </platform>