#include "src/surf/xml/platf.hpp" // FIXME: move that back to the parsing area
static void parse_ns3_add_cluster(sg_platf_cluster_cbarg_t cluster)
{
- xbt_dynar_t tab_elements_num = xbt_dynar_new(sizeof(int), nullptr);
+ char* lat = bprintf("%fs", cluster->lat);
+ char* bw = bprintf("%fBps", cluster->bw);
- xbt_dynar_t radical_elements = xbt_str_split(cluster->radical, ",");
- unsigned int iter;
- const char* groups = nullptr;
- xbt_dynar_foreach(radical_elements, iter, groups) {
- xbt_dynar_t radical_ends = xbt_str_split(groups, "-");
-
- if (xbt_dynar_length(radical_ends) == 1) {
- int start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char*));
- xbt_dynar_push_as(tab_elements_num, int, start);
- char* router_id = bprintf("ns3_%s%d%s", cluster->prefix, start, cluster->suffix);
- simgrid::s4u::Host::by_name_or_create(router_id)->extension_set(NS3_EXTENSION_ID, ns3_add_host_cluster(router_id));
- XBT_DEBUG("NS3_ADD_ROUTER '%s'",router_id);
- free(router_id);
-
- } else if (xbt_dynar_length(radical_ends) == 2) {
- int start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char*));
- int end = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char*));
- for (int i = start; i <= end; i++) {
- xbt_dynar_push_as(tab_elements_num, int, i);
- char* router_id = bprintf("ns3_%s%d%s", cluster->prefix, i, cluster->suffix);
- simgrid::s4u::Host::by_name_or_create(router_id)->extension_set(NS3_EXTENSION_ID, ns3_add_host_cluster(router_id));
- XBT_DEBUG("NS3_ADD_ROUTER '%s'",router_id);
- free(router_id);
- }
-
- } else {
- XBT_DEBUG("Malformed radical");
- }
- }
+ for (int i : *cluster->radicals) {
+ char* router_id = bprintf("ns3_%s%d%s", cluster->prefix, i, cluster->suffix);
+ simgrid::s4u::Host::by_name_or_create(router_id)->extension_set(NS3_EXTENSION_ID, ns3_add_host_cluster(router_id));
+ XBT_DEBUG("NS3_ADD_ROUTER '%s'", router_id);
- //Create links
- unsigned int cpt;
- int elmts;
- char * lat = bprintf("%fs", cluster->lat);
- char * bw = bprintf("%fBps", cluster->bw);
-
- xbt_dynar_foreach(tab_elements_num,cpt,elmts) {
- char* host_id = bprintf("%s%d%s", cluster->prefix, elmts, cluster->suffix);
- char* router_id = bprintf("ns3_%s%d%s", cluster->prefix, elmts, cluster->suffix);
+ // Create private link
+ char* host_id = bprintf("%s%d%s", cluster->prefix, i, cluster->suffix);
XBT_DEBUG("Create link from '%s' to '%s'",host_id,router_id);
ns3_node_t host_src = ns3_find_host(host_id);
}
xbt_free(lat);
xbt_free(bw);
- xbt_dynar_free(&tab_elements_num);
-
//Create link backbone
lat = bprintf("%fs", cluster->bb_lat);
bw = bprintf("%fBps", cluster->bb_bw);
ns3_add_cluster(bw,lat,cluster->id);
xbt_free(lat);
+
xbt_free(bw);
}
static int surf_parse_models_setup_already_called = 0;
-/* Turn something like "1-4,6,9-11" into the vector {1,2,3,4,6,9,10,11} */
-static std::vector<int> *explodesRadical(const char*radicals){
- std::vector<int> *exploded = new std::vector<int>();
- char *groups;
- unsigned int iter;
-
- //Make all hosts
- xbt_dynar_t radical_elements = xbt_str_split(radicals, ",");
- xbt_dynar_foreach(radical_elements, iter, groups) {
-
- xbt_dynar_t radical_ends = xbt_str_split(groups, "-");
- int start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *));
- int end=0;
-
- switch (xbt_dynar_length(radical_ends)) {
- case 1:
- end = start;
- break;
- case 2:
- end = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char *));
- break;
- default:
- surf_parse_error("Malformed radical: %s", groups);
- break;
- }
-
- for (int i = start; i <= end; i++)
- exploded->push_back( i );
-
- xbt_dynar_free(&radical_ends);
- }
- xbt_dynar_free(&radical_elements);
-
- return exploded;
-}
-
-
/** The current AS in the parsing */
static simgrid::kernel::routing::AsImpl *current_routing = nullptr;
static simgrid::kernel::routing::AsImpl *routing_get_current()
current_as->hasLimiter_ = 1;
}
- std::vector<int> *radicals = explodesRadical(cluster->radical);
- for (int i : *radicals) {
+ for (int i : *cluster->radicals) {
char * host_id = bprintf("%s%d%s", cluster->prefix, i, cluster->suffix);
char * link_id = bprintf("%s_link_%d", cluster->id, i);
xbt_free(host_id);
rankId++;
}
- delete radicals;
// Add a router. It is magically used thanks to the way in which surf_routing_cluster is written,
// and it's very useful to connect clusters together
sg_platf_new_AS_seal();
simgrid::surf::on_cluster(cluster);
+ delete cluster->radicals;
}
void routing_cluster_add_backbone(simgrid::surf::Link* bb) {
simgrid::kernel::routing::AsCluster *cluster = dynamic_cast<simgrid::kernel::routing::AsCluster*>(current_routing);
void sg_platf_new_cabinet(sg_platf_cabinet_cbarg_t cabinet)
{
- std::vector<int> *radicals = explodesRadical(cabinet->radical);
-
- for (int radical : *radicals) {
+ for (int radical : *cabinet->radicals) {
char *hostname = bprintf("%s%d%s", cabinet->prefix, radical, cabinet->suffix);
s_sg_platf_host_cbarg_t host;
memset(&host, 0, sizeof(host));
free(hostname);
}
- delete(radicals);
+ delete cabinet->radicals;
}
void sg_platf_new_storage(sg_platf_storage_cbarg_t storage)
#include "simgrid/host.h"
#include "src/surf/xml/platf.hpp"
+#include <vector>
SG_BEGIN_DECL()
#include "src/surf/xml/simgrid_dtd.h"
const char* id;
const char* prefix;
const char* suffix;
- const char* radical;
+ std::vector<int>* radicals;
double speed;
int core_amount;
double bw;
const char* id;
const char* prefix;
const char* suffix;
- const char* radical;
+ std::vector<int>* radicals;
double speed;
double bw;
double lat;
return res;
}
+/* Turn something like "1-4,6,9-11" into the vector {1,2,3,4,6,9,10,11} */
+static std::vector<int>* explodesRadical(const char* radicals)
+{
+ std::vector<int>* exploded = new std::vector<int>();
+ char* groups;
+ unsigned int iter;
+
+ // Make all hosts
+ xbt_dynar_t radical_elements = xbt_str_split(radicals, ",");
+ xbt_dynar_foreach (radical_elements, iter, groups) {
+
+ xbt_dynar_t radical_ends = xbt_str_split(groups, "-");
+ int start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char*));
+ int end = 0;
+
+ switch (xbt_dynar_length(radical_ends)) {
+ case 1:
+ end = start;
+ break;
+ case 2:
+ end = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char*));
+ break;
+ default:
+ surf_parse_error("Malformed radical: %s", groups);
+ break;
+ }
+
+ for (int i = start; i <= end; i++)
+ exploded->push_back(i);
+
+ xbt_dynar_free(&radical_ends);
+ }
+ xbt_dynar_free(&radical_elements);
+
+ return exploded;
+}
+
struct unit_scale {
const char *unit;
double scale;
cluster.id = A_surfxml_cluster_id;
cluster.prefix = A_surfxml_cluster_prefix;
cluster.suffix = A_surfxml_cluster_suffix;
- cluster.radical = A_surfxml_cluster_radical;
+ cluster.radicals = explodesRadical(A_surfxml_cluster_radical);
cluster.speed = surf_parse_get_speed(A_surfxml_cluster_speed, "speed of cluster", cluster.id);
cluster.core_amount = surf_parse_get_int(A_surfxml_cluster_core);
cluster.bw = surf_parse_get_bandwidth(A_surfxml_cluster_bw, "bw of cluster", cluster.id);
cabinet.speed = surf_parse_get_speed(A_surfxml_cabinet_speed, "speed of cabinet", cabinet.id);
cabinet.bw = surf_parse_get_bandwidth(A_surfxml_cabinet_bw, "bw of cabinet", cabinet.id);
cabinet.lat = surf_parse_get_time(A_surfxml_cabinet_lat, "lat of cabinet", cabinet.id);
- cabinet.radical = A_surfxml_cabinet_radical;
+ cabinet.radicals = explodesRadical(A_surfxml_cabinet_radical);
sg_platf_new_cabinet(&cabinet);
}