X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/790548512bc97315d97b03d2d418b167d903e895..dc4066f005c4827b8169f71ea0c500b6dc311721:/src/surf/surfxml_parse.c diff --git a/src/surf/surfxml_parse.c b/src/surf/surfxml_parse.c index 02fd37b0ed..ba782bbc1a 100644 --- a/src/surf/surfxml_parse.c +++ b/src/surf/surfxml_parse.c @@ -4,6 +4,8 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ +#include +#include #include /* va_arg */ #include "xbt/misc.h" @@ -12,6 +14,7 @@ #include "xbt/dict.h" #include "surf/surfxml_parse.h" #include "surf/surf_private.h" +#include "surf/random_mgr.h" #include "simgrid/sg_config.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_parse, surf, @@ -61,102 +64,104 @@ int surf_parse_get_int(const char *string) { return res; } -double surf_parse_get_time(const char *string) { +struct unit_scale { + const char *unit; + double scale; +}; + +/* Note: field `unit' for the last element of parametre `units' should be + * NULL. */ +static double surf_parse_get_value_with_unit(const char *string, + const struct unit_scale *units) +{ char* ptr; - double res = strtod(string, &ptr); + double res; + int i; + errno = 0; + res = strtod(string, &ptr); + if (errno == ERANGE) + surf_parse_error("value out of range: %s", string); if (ptr == string) - surf_parse_error("This is not a time: %s", string); - else if (strcmp(ptr, "ps") == 0) - res *= 1E-12; - else if (strcmp(ptr, "ns") == 0) - res *= 1E-9; - else if (strcmp(ptr, "us") == 0) - res *= 1E-6; - else if (strcmp(ptr, "ms") == 0) - res *= 1E-3; - else if (strcmp(ptr, "s") == 0) - res *= 1; - else if (strcmp(ptr, "m") == 0) - res *= 60; - else if (strcmp(ptr, "h") == 0) - res *= 3600; - else if (strcmp(ptr, "d") == 0) - res *= 86400; - else if (strcmp(ptr, "w") == 0) - res *= 604800; + surf_parse_error("cannot parse number: %s", string); + for (i = 0; units[i].unit != NULL && strcmp(ptr, units[i].unit) != 0; i++) { + } + if (units[i].unit != NULL) + res *= units[i].scale; + else + surf_parse_error("unknown unit: %s", ptr); return res; } -double surf_parse_get_bandwidth(const char *string) { - char* ptr; - double res = strtod(string, &ptr); - if (ptr == string) - surf_parse_error("This is not a bandwidth: %s", string); - else if (strcmp(ptr, "KBps") == 0) - res *= 1E3; - else if (strcmp(ptr, "MBps") == 0) - res *= 1E6; - else if (strcmp(ptr, "GBps") == 0) - res *= 1E9; - else if (strcmp(ptr, "TBps") == 0) - res *= 1E12; - else if (strcmp(ptr, "Bps") == 0) - res *= 1; - else if (strcmp(ptr, "kbps") == 0) - res *= 0.125 * 1E3; - else if (strcmp(ptr, "mbps") == 0) - res *= 0.125 * 1E6; - else if (strcmp(ptr, "gbps") == 0) - res *= 0.125 * 1E9; - else if (strcmp(ptr, "tbps") == 0) - res *= 0.125 * 1E12; - else if (strcmp(ptr, "bps") == 0) - res *= 0.125; - return res; +double surf_parse_get_time(const char *string) +{ + const struct unit_scale units[] = { + { "w", 7 * 24 * 60 * 60 }, + { "d", 24 * 60 * 60 }, + { "h", 60 * 60 }, + { "m", 60 }, + { "s", 1.0 }, + { "", 1.0 }, /* default unit is seconds */ + { "ms", 1e-3 }, + { "us", 1e-6 }, + { "ns", 1e-9 }, + { "ps", 1e-12 }, + { NULL, 0 } + }; + return surf_parse_get_value_with_unit(string, units); } -double surf_parse_get_power(const char *string) { - char* ptr; - double res = strtod(string, &ptr); - if (ptr == string) - surf_parse_error("This is not a power: %s", string); - else if (strcmp(ptr, "kiloflops") == 0) - res *= 1E3; - else if (strcmp(ptr, "megaflops") == 0) - res *= 1E6; - else if (strcmp(ptr, "gigaflops") == 0) - res *= 1E9; - else if (strcmp(ptr, "teraflops") == 0) - res *= 1E12; - else if (strcmp(ptr, "petaflops") == 0) - res *= 1E15; - else if (strcmp(ptr, "exaflops") == 0) - res *= 1E18; - else if (strcmp(ptr, "zettaflops") == 0) - res *= 1E21; - else if (strcmp(ptr, "yottaflops") == 0) - res *= 1E24; - else if (strcmp(ptr, "flops") == 0) - res *= 1; - else if (strcmp(ptr, "kf") == 0) - res *= 1E3; - else if (strcmp(ptr, "mf") == 0) - res *= 1E6; - else if (strcmp(ptr, "gf") == 0) - res *= 1E9; - else if (strcmp(ptr, "tf") == 0) - res *= 1E12; - else if (strcmp(ptr, "pf") == 0) - res *= 1E15; - else if (strcmp(ptr, "ef") == 0) - res *= 1E18; - else if (strcmp(ptr, "zf") == 0) - res *= 1E21; - else if (strcmp(ptr, "yf") == 0) - res *= 1E24; - else if (strcmp(ptr, "f") == 0) - res *= 1; - return res; +double surf_parse_get_bandwidth(const char *string) +{ + const struct unit_scale units[] = { + { "TiBps", pow(1024, 4) }, + { "GiBps", pow(1024, 3) }, + { "MiBps", pow(1024, 2) }, + { "KiBps", 1024 }, + { "TBps", 1e12 }, + { "GBps", 1e9 }, + { "MBps", 1e6 }, + { "kBps", 1e3 }, + { "Bps", 1.0 }, + { "", 1.0 }, /* default unit is bytes per second */ + { "Tibps", 0.125 * pow(1024, 4) }, + { "Gibps", 0.125 * pow(1024, 3) }, + { "Mibps", 0.125 * pow(1024, 2) }, + { "Kibps", 0.125 * 1024 }, + { "Tbps", 0.125 * 1e12 }, + { "Gbps", 0.125 * 1e9 }, + { "Mbps", 0.125 * 1e6 }, + { "kbps", 0.125 * 1e3 }, + { "bps", 0.125 }, + { NULL, 0 } + }; + return surf_parse_get_value_with_unit(string, units); +} + +double surf_parse_get_power(const char *string) +{ + const struct unit_scale units[] = { + { "yottaflops", 1e24 }, + { "Yf", 1e24 }, + { "zettaflops", 1e21 }, + { "Zf", 1e21 }, + { "exaflops", 1e18 }, + { "Ef", 1e18 }, + { "petaflops", 1e15 }, + { "Pf", 1e15 }, + { "teraflops", 1e12 }, + { "Tf", 1e12 }, + { "gigaflops", 1e9 }, + { "Gf", 1e9 }, + { "megaflops", 1e6 }, + { "Mf", 1e6 }, + { "kiloflops", 1e3 }, + { "kf", 1e3 }, + { "flops", 1.0 }, + { "f", 1.0 }, + { "", 1.0 }, /* default unit is flops */ + { NULL, 0 } + }; + return surf_parse_get_value_with_unit(string, units); } /* @@ -431,9 +436,11 @@ void STag_surfxml_router(void){ sg_platf_new_router(&router); } -void STag_surfxml_cluster(void){ +void ETag_surfxml_cluster(void){ s_sg_platf_cluster_cbarg_t cluster; memset(&cluster,0,sizeof(cluster)); + cluster.properties = current_property_set; + cluster.id = A_surfxml_cluster_id; cluster.prefix = A_surfxml_cluster_prefix; cluster.suffix = A_surfxml_cluster_suffix; @@ -485,6 +492,12 @@ void STag_surfxml_cluster(void){ cluster.availability_trace = A_surfxml_cluster_availability___file; cluster.state_trace = A_surfxml_cluster_state___file; sg_platf_new_cluster(&cluster); + + current_property_set = NULL; +} + +void STag_surfxml_cluster(void){ + xbt_assert(current_property_set == NULL, "Someone forgot to reset the property set to NULL in its closing tag (or XML malformed)"); } void STag_surfxml_cabinet(void){ @@ -673,17 +686,8 @@ void ETag_surfxml_ASroute(void){ ASroute.src = A_surfxml_ASroute_src; ASroute.dst = A_surfxml_ASroute_dst; - if (!strcmp(current_routing->model_desc->name,"RuleBased")) { - // DIRTY PERL HACK AHEAD: with the rulebased routing, the {src,dst}_gateway fields - // store the provided name instead of the entity directly (model_rulebased_parse_ASroute knows) - // - // This is because the user will provide something like "^AS_(.*)$" instead of the proper name of a given entity - ASroute.gw_src = (sg_routing_edge_t) A_surfxml_ASroute_gw___src; - ASroute.gw_dst = (sg_routing_edge_t) A_surfxml_ASroute_gw___dst; - } else { - ASroute.gw_src = sg_routing_edge_by_name_or_null(A_surfxml_ASroute_gw___src); - ASroute.gw_dst = sg_routing_edge_by_name_or_null(A_surfxml_ASroute_gw___dst); - } + ASroute.gw_src = sg_routing_edge_by_name_or_null(A_surfxml_ASroute_gw___src); + ASroute.gw_dst = sg_routing_edge_by_name_or_null(A_surfxml_ASroute_gw___dst); ASroute.link_list = parsed_link_list; @@ -725,17 +729,8 @@ void ETag_surfxml_bypassASroute(void){ ASroute.link_list = parsed_link_list; ASroute.symmetrical = FALSE; - if (!strcmp(current_routing->model_desc->name,"RuleBased")) { - // DIRTY PERL HACK AHEAD: with the rulebased routing, the {src,dst}_gateway fields - // store the provided name instead of the entity directly (model_rulebased_parse_ASroute knows) - // - // This is because the user will provide something like "^AS_(.*)$" instead of the proper name of a given entity - ASroute.gw_src = (sg_routing_edge_t) A_surfxml_bypassASroute_gw___src; - ASroute.gw_dst = (sg_routing_edge_t) A_surfxml_bypassASroute_gw___dst; - } else { - ASroute.gw_src = sg_routing_edge_by_name_or_null(A_surfxml_bypassASroute_gw___src); - ASroute.gw_dst = sg_routing_edge_by_name_or_null(A_surfxml_bypassASroute_gw___dst); - } + ASroute.gw_src = sg_routing_edge_by_name_or_null(A_surfxml_bypassASroute_gw___src); + ASroute.gw_dst = sg_routing_edge_by_name_or_null(A_surfxml_bypassASroute_gw___dst); sg_platf_new_bypassASroute(&ASroute); parsed_link_list = NULL; @@ -902,7 +897,6 @@ void ETag_surfxml_trace___connect(void){} void STag_surfxml_trace(void){} void ETag_surfxml_router(void){} void ETag_surfxml_host___link(void){} -void ETag_surfxml_cluster(void){} void ETag_surfxml_cabinet(void){} void ETag_surfxml_peer(void){} void STag_surfxml_backbone(void){}