+/**
+ * \brief Make a new routing component to the platform
+ *
+ * Add a new autonomous system to the platform. Any elements (such as host,
+ * router or sub-AS) added after this call and before the corresponding call
+ * to sg_platf_new_AS_close() will be added to this AS.
+ *
+ * Once this function was called, the configuration concerning the used
+ * models cannot be changed anymore.
+ *
+ * @param AS_id name of this autonomous system. Must be unique in the platform
+ * @param wanted_routing_type one of Full, Floyd, Dijkstra or similar. Full list in the variable routing_models, in src/surf/surf_routing.c
+ */
+void routing_AS_begin(sg_platf_AS_cbarg_t AS)
+{
+ XBT_DEBUG("routing_AS_begin");
+
+ xbt_assert(nullptr == xbt_lib_get_or_null(as_router_lib, AS->id, ROUTING_ASR_LEVEL),
+ "Refusing to create a second AS called \"%s\".", AS->id);
+
+ _sg_cfg_init_status = 2; /* HACK: direct access to the global controlling the level of configuration to prevent
+ * any further config now that we created some real content */
+
+
+ /* search the routing model */
+ simgrid::surf::AsImpl *new_as = NULL;
+ switch(AS->routing){
+ case A_surfxml_AS_routing_Cluster: new_as = new simgrid::surf::AsCluster(AS->id); break;
+ case A_surfxml_AS_routing_ClusterTorus: new_as = new simgrid::surf::AsClusterTorus(AS->id); break;
+ case A_surfxml_AS_routing_ClusterFatTree: new_as = new simgrid::surf::AsClusterFatTree(AS->id); break;
+ case A_surfxml_AS_routing_Dijkstra: new_as = new simgrid::surf::AsDijkstra(AS->id, 0); break;
+ case A_surfxml_AS_routing_DijkstraCache: new_as = new simgrid::surf::AsDijkstra(AS->id, 1); break;
+ case A_surfxml_AS_routing_Floyd: new_as = new simgrid::surf::AsFloyd(AS->id); break;
+ case A_surfxml_AS_routing_Full: new_as = new simgrid::surf::AsFull(AS->id); break;
+ case A_surfxml_AS_routing_None: new_as = new simgrid::surf::AsNone(AS->id); break;
+ case A_surfxml_AS_routing_Vivaldi: new_as = new simgrid::surf::AsVivaldi(AS->id); break;
+ default: xbt_die("Not a valid model!"); break;
+ }
+
+ /* make a new routing component */
+ simgrid::surf::NetCard *netcard = new simgrid::surf::NetCardImpl(new_as->name(), SURF_NETWORK_ELEMENT_AS, current_routing);
+
+ if (current_routing == NULL && routing_platf->root_ == NULL) {
+ /* it is the first one */
+ routing_platf->root_ = new_as;
+ netcard->setId(-1);
+ } else if (current_routing != NULL && routing_platf->root_ != NULL) {
+
+ xbt_assert(!xbt_dict_get_or_null(current_routing->children(), AS->id),
+ "The AS \"%s\" already exists", AS->id);
+ /* it is a part of the tree */
+ new_as->father_ = current_routing;
+ /* set the father behavior */
+ if (current_routing->hierarchy_ == simgrid::surf::AsImpl::ROUTING_NULL)
+ current_routing->hierarchy_ = simgrid::surf::AsImpl::ROUTING_RECURSIVE;
+ /* add to the sons dictionary */
+ xbt_dict_set(current_routing->children(), AS->id, (void *) new_as, NULL);
+ /* add to the father element list */
+ netcard->setId(current_routing->addComponent(netcard));
+ } else {
+ THROWF(arg_error, 0, "All defined components must belong to a AS");
+ }
+
+ xbt_lib_set(as_router_lib, netcard->name(), ROUTING_ASR_LEVEL, (void *) netcard);
+ XBT_DEBUG("Having set name '%s' id '%d'", new_as->name(), netcard->id());
+
+ /* set the new current component of the tree */
+ current_routing = new_as;
+ current_routing->netcard_ = netcard;
+
+ simgrid::surf::netcardCreatedCallbacks(netcard);
+ simgrid::surf::asCreatedCallbacks(new_as);
+}
+