current_routing->hierarchy_ = simgrid::surf::AsImpl::RoutingMode::base;
simgrid::surf::NetCard *netcard =
- new simgrid::surf::NetCardImpl(host->id, SURF_NETWORK_ELEMENT_HOST, current_routing);
+ new simgrid::surf::NetCardImpl(host->id, simgrid::surf::NetCard::Type::Host, current_routing);
- netcard->setId(current_routing->addComponent(netcard));
sg_host_t h = simgrid::s4u::Host::by_name_or_create(host->id);
h->pimpl_netcard = netcard;
- simgrid::surf::netcardCreatedCallbacks(netcard);
if(mount_list){
xbt_lib_set(storage_lib, host->id, ROUTING_STORAGE_HOST_LEVEL, (void *) mount_list);
unsigned int cursor;
char*str;
- if (!COORD_HOST_LEVEL)
- xbt_die ("To use host coordinates, please add --cfg=network/coordinates:yes to your command line");
+ xbt_assert(COORD_HOST_LEVEL, "To use host coordinates, please add --cfg=network/coordinates:yes to your command line");
/* Pre-parse the host coordinates -- FIXME factorize with routers by overloading the routing->parse_PU function*/
xbt_dynar_t ctn_str = xbt_str_split_str(host->coord, " ");
+ xbt_assert(xbt_dynar_length(ctn_str)==3,"Coordinates of %s must have 3 dimensions", host->id);
+
xbt_dynar_t ctn = xbt_dynar_new(sizeof(double),NULL);
xbt_dynar_foreach(ctn_str,cursor, str) {
double val = xbt_str_parse_double(str, "Invalid coordinate: %s");
xbt_dynar_push(ctn,&val);
}
- xbt_dynar_shrink(ctn, 0);
xbt_dynar_free(&ctn_str);
+ xbt_dynar_shrink(ctn, 0);
h->extension_set(COORD_HOST_LEVEL, (void *) ctn);
- XBT_DEBUG("Having set host coordinates for '%s'",host->id);
}
- simgrid::surf::Cpu *cpu = surf_cpu_model_pm->createCpu( h,
- host->speed_per_pstate,
- host->core_amount);
+ simgrid::surf::Cpu *cpu = surf_cpu_model_pm->createCpu( h, host->speed_per_pstate, host->core_amount);
if (host->state_trace)
cpu->setStateTrace(host->state_trace);
if (host->speed_trace)
sg_instr_new_host(host);
}
-/**
- * \brief Add a "router" to the network element list
- */
+/** @brief Add a "router" to the network element list */
void sg_platf_new_router(sg_platf_router_cbarg_t router)
{
simgrid::surf::AsImpl* current_routing = routing_get_current();
"Refusing to create a router named '%s': this name already describes a node.", router->id);
simgrid::surf::NetCard *netcard =
- new simgrid::surf::NetCardImpl(router->id, SURF_NETWORK_ELEMENT_ROUTER, current_routing);
- netcard->setId(current_routing->addComponent(netcard));
+ new simgrid::surf::NetCardImpl(router->id, simgrid::surf::NetCard::Type::Router, current_routing);
xbt_lib_set(as_router_lib, router->id, ROUTING_ASR_LEVEL, (void *) netcard);
XBT_DEBUG("Having set name '%s' id '%d'", router->id, netcard->id());
- simgrid::surf::netcardCreatedCallbacks(netcard);
if (router->coord && strcmp(router->coord, "")) {
unsigned int cursor;
char*str;
- if (!COORD_ASR_LEVEL)
- xbt_die ("To use host coordinates, please add --cfg=network/coordinates:yes to your command line");
+ xbt_assert(COORD_ASR_LEVEL, "To use host coordinates, please add --cfg=network/coordinates:yes to your command line");
/* Pre-parse the host coordinates */
xbt_dynar_t ctn_str = xbt_str_split_str(router->coord, " ");
+ xbt_assert(xbt_dynar_length(ctn_str)==3,"Coordinates of %s must have 3 dimensions", router->id);
xbt_dynar_t ctn = xbt_dynar_new(sizeof(double),NULL);
xbt_dynar_foreach(ctn_str,cursor, str) {
double val = xbt_str_parse_double(str, "Invalid coordinate: %s");
xbt_dynar_push(ctn,&val);
}
- xbt_dynar_shrink(ctn, 0);
xbt_dynar_free(&ctn_str);
+ xbt_dynar_shrink(ctn, 0);
xbt_lib_set(as_router_lib, router->id, COORD_ASR_LEVEL, (void *) ctn);
- XBT_DEBUG("Having set router coordinates for '%s'",router->id);
}
if (TRACE_is_enabled() && TRACE_needs_platform())
// What an inventive way of initializing the AS that I have as ancestor :-(
sg_platf_new_AS_begin(&AS);
- simgrid::surf::AsImpl *current_routing = routing_get_current();
- static_cast<AsCluster*>(current_routing)->parse_specific_arguments(cluster);
+ simgrid::surf::AsCluster *current_as = static_cast<AsCluster*>(routing_get_current());
+ current_as->parse_specific_arguments(cluster);
if(cluster->loopback_bw!=0 || cluster->loopback_lat!=0){
- ((AsCluster*)current_routing)->nb_links_per_node_++;
- ((AsCluster*)current_routing)->has_loopback_=1;
+ current_as->nb_links_per_node_++;
+ current_as->has_loopback_ = 1;
}
if(cluster->limiter_link!=0){
- ((AsCluster*)current_routing)->nb_links_per_node_++;
- ((AsCluster*)current_routing)->has_limiter_=1;
+ current_as->nb_links_per_node_++;
+ current_as->has_limiter_ = 1;
}
-
//Make all hosts
xbt_dynar_t radical_elements = xbt_str_split(cluster->radical, ",");
xbt_dynar_foreach(radical_elements, iter, groups) {
xbt_dynar_free(&host.speed_per_pstate);
XBT_DEBUG("</host>");
- XBT_DEBUG("<link\tid=\"%s\"\tbw=\"%f\"\tlat=\"%f\"/>", link_id,
- cluster->bw, cluster->lat);
-
+ XBT_DEBUG("<link\tid=\"%s\"\tbw=\"%f\"\tlat=\"%f\"/>", link_id, cluster->bw, cluster->lat);
s_surf_parsing_link_up_down_t info_lim, info_loop;
// All links are saved in a matrix;
//add a loopback link
if(cluster->loopback_bw!=0 || cluster->loopback_lat!=0){
char *tmp_link = bprintf("%s_loopback", link_id);
- XBT_DEBUG("<loopback\tid=\"%s\"\tbw=\"%f\"/>", tmp_link,
- cluster->limiter_link);
-
+ XBT_DEBUG("<loopback\tid=\"%s\"\tbw=\"%f\"/>", tmp_link, cluster->limiter_link);
memset(&link, 0, sizeof(link));
link.id = tmp_link;
link.latency = cluster->loopback_lat;
link.policy = SURF_LINK_FATPIPE;
sg_platf_new_link(&link);
- info_loop.link_up = Link::byName(tmp_link);
- info_loop.link_down = info_loop.link_up;
+ info_loop.link_up = info_loop.link_down = Link::byName(tmp_link);
free(tmp_link);
- xbt_dynar_set(current_routing->upDownLinks, rankId*(static_cast<AsCluster*>(current_routing))->nb_links_per_node_, &info_loop);
+ auto as_cluster = static_cast<AsCluster*>(current_as);
+ xbt_dynar_set(as_cluster->privateLinks_, rankId*as_cluster->nb_links_per_node_, &info_loop);
}
//add a limiter link (shared link to account for maximal bandwidth of the node)
if(cluster->limiter_link!=0){
char *tmp_link = bprintf("%s_limiter", link_id);
- XBT_DEBUG("<limiter\tid=\"%s\"\tbw=\"%f\"/>", tmp_link,
- cluster->limiter_link);
-
+ XBT_DEBUG("<limiter\tid=\"%s\"\tbw=\"%f\"/>", tmp_link, cluster->limiter_link);
memset(&link, 0, sizeof(link));
link.id = tmp_link;
link.latency = 0;
link.policy = SURF_LINK_SHARED;
sg_platf_new_link(&link);
- info_lim.link_up = Link::byName(tmp_link);
- info_lim.link_down = info_lim.link_up;
+ info_lim.link_up = info_lim.link_down = Link::byName(tmp_link);
free(tmp_link);
- auto as_cluster = static_cast<AsCluster*>(current_routing);
- xbt_dynar_set(current_routing->upDownLinks, rankId*(as_cluster)->nb_links_per_node_ + as_cluster->has_loopback_ , &info_lim);
-
+ xbt_dynar_set(current_as->privateLinks_, rankId * current_as->nb_links_per_node_ + current_as->has_loopback_ , &info_lim);
}
-
//call the cluster function that adds the others links
if (cluster->topology == SURF_CLUSTER_FAT_TREE) {
- ((AsClusterFatTree*) current_routing)->addProcessingNode(i);
+ ((AsClusterFatTree*) current_as)->addProcessingNode(i);
}
else {
- static_cast<AsCluster*>(current_routing)->create_links_for_node(cluster, i, rankId, rankId*
- static_cast<AsCluster*>(current_routing)->nb_links_per_node_
- + static_cast<AsCluster*>(current_routing)->has_loopback_
- + static_cast<AsCluster*>(current_routing)->has_limiter_ );
+ current_as->create_links_for_node(cluster, i, rankId,
+ rankId*current_as->nb_links_per_node_ + current_as->has_loopback_ + current_as->has_limiter_ );
}
xbt_free(link_id);
xbt_free(host_id);
// For fat trees, the links must be created once all nodes have been added
if(cluster->topology == SURF_CLUSTER_FAT_TREE) {
- static_cast<simgrid::surf::AsClusterFatTree*>(current_routing)->create_links();
+ static_cast<simgrid::surf::AsClusterFatTree*>(current_as)->create_links();
}
// 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
router.id = cluster->router_id;
router.coord = "";
if (!router.id || !strcmp(router.id, ""))
- router.id = newid =
- bprintf("%s%s_router%s", cluster->prefix, cluster->id,
- cluster->suffix);
+ router.id = newid = bprintf("%s%s_router%s", cluster->prefix, cluster->id, cluster->suffix);
sg_platf_new_router(&router);
- ((AsCluster*)current_routing)->router_ = (simgrid::surf::NetCard*) xbt_lib_get_or_null(as_router_lib, router.id, ROUTING_ASR_LEVEL);
+ current_as->router_ = (simgrid::surf::NetCard*) xbt_lib_get_or_null(as_router_lib, router.id, ROUTING_ASR_LEVEL);
free(newid);
//Make the backbone
if ((cluster->bb_bw != 0) || (cluster->bb_lat != 0)) {
char *link_backbone = bprintf("%s_backbone", cluster->id);
- XBT_DEBUG("<link\tid=\"%s\" bw=\"%f\" lat=\"%f\"/>", link_backbone,
- cluster->bb_bw, cluster->bb_lat);
+ XBT_DEBUG("<link\tid=\"%s\" bw=\"%f\" lat=\"%f\"/>", link_backbone, cluster->bb_bw, cluster->bb_lat);
memset(&link, 0, sizeof(link));
link.id = link_backbone;
ROUTING_STORAGE_TYPE_LEVEL,
(void *) stype);
}
-void sg_platf_new_mstorage(sg_platf_mstorage_cbarg_t mstorage)
-{
- THROW_UNIMPLEMENTED;
-}
static void mount_free(void *p)
{
}
void sg_platf_new_mount(sg_platf_mount_cbarg_t mount){
- // Verification of an existing storage
xbt_assert(xbt_lib_get_or_null(storage_lib, mount->storageId, ROUTING_STORAGE_LEVEL),
"Cannot mount non-existent disk \"%s\"", mount->storageId);
using simgrid::surf::NetCard;
using simgrid::surf::AsCluster;
- char *host_id = NULL;
- char *link_id = NULL;
- char *router_id = NULL;
+ char *host_id = bprintf("peer_%s", peer->id);
+ char *router_id = bprintf("router_%s", peer->id);
XBT_DEBUG(" ");
- host_id = bprintf("peer_%s", peer->id);
- link_id = bprintf("link_%s", peer->id);
- router_id = bprintf("router_%s", peer->id);
XBT_DEBUG("<AS id=\"%s\"\trouting=\"Cluster\">", peer->id);
s_sg_platf_AS_cbarg_t AS = SG_PLATF_AS_INITIALIZER;
host.speed_per_pstate = xbt_dynar_new(sizeof(double), NULL);
xbt_dynar_push(host.speed_per_pstate,&peer->speed);
host.pstate = 0;
- //host.power_peak = peer->power;
host.speed_trace = peer->availability_trace;
host.state_trace = peer->state_trace;
host.core_amount = 1;
link.policy = SURF_LINK_SHARED;
link.latency = peer->lat;
- char* link_up = bprintf("%s_UP",link_id);
+ char* link_up = bprintf("link_%s_UP",peer->id);
XBT_DEBUG("<link\tid=\"%s\"\tbw=\"%f\"\tlat=\"%f\"/>", link_up, peer->bw_out, peer->lat);
link.id = link_up;
link.bandwidth = peer->bw_out;
sg_platf_new_link(&link);
- char* link_down = bprintf("%s_DOWN",link_id);
+ char* link_down = bprintf("link_%s_DOWN",peer->id);
XBT_DEBUG("<link\tid=\"%s\"\tbw=\"%f\"\tlat=\"%f\"/>", link_down, peer->bw_in, peer->lat);
link.id = link_down;
link.bandwidth = peer->bw_in;
host_link.link_up = link_up;
host_link.link_down = link_down;
sg_platf_new_hostlink(&host_link);
+ free(link_up);
+ free(link_down);
XBT_DEBUG("<router id=\"%s\"/>", router_id);
s_sg_platf_router_cbarg_t router = SG_PLATF_ROUTER_INITIALIZER;
sg_platf_new_AS_end();
XBT_DEBUG(" ");
- //xbt_dynar_free(&tab_elements_num);
free(router_id);
free(host_id);
- free(link_id);
- free(link_up);
- free(link_down);
}
void sg_platf_begin() { /* Do nothing: just for symmetry of user code */ }
}
/* make a new routing component */
- simgrid::surf::NetCard *netcard = new simgrid::surf::NetCardImpl(new_as->name(), SURF_NETWORK_ELEMENT_AS, current_routing);
+ simgrid::surf::NetCard *netcard = new simgrid::surf::NetCardImpl(new_as->name(), simgrid::surf::NetCard::Type::As, current_routing);
- if (current_routing == NULL && routing_platf->root_ == NULL) {
- /* it is the first one */
+ 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),
current_routing->hierarchy_ = simgrid::surf::AsImpl::RoutingMode::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");
}
current_routing = new_as;
current_routing->netcard_ = netcard;
- simgrid::surf::netcardCreatedCallbacks(netcard);
simgrid::surf::asCreatedCallbacks(new_as);
if (TRACE_is_enabled())
sg_instr_AS_begin(AS);
}
/** @brief Add a link connecting an host to the rest of its AS (which must be cluster or vivaldi) */
-void sg_platf_new_hostlink(sg_platf_host_link_cbarg_t netcard_arg)
+void sg_platf_new_hostlink(sg_platf_host_link_cbarg_t hostlink)
{
- simgrid::surf::NetCard *netcard = sg_host_by_name(netcard_arg->id)->pimpl_netcard;
- xbt_assert(netcard, "Host '%s' not found!", netcard_arg->id);
- xbt_assert(dynamic_cast<simgrid::surf::AsCluster*>(current_routing) ||
- dynamic_cast<simgrid::surf::AsVivaldi*>(current_routing),
- "Only hosts from Cluster and Vivaldi ASes can get a host_link.");
+ simgrid::surf::NetCard *netcard = sg_host_by_name(hostlink->id)->pimpl_netcard;
+ xbt_assert(netcard, "Host '%s' not found!", hostlink->id);
+ xbt_assert(dynamic_cast<simgrid::surf::AsCluster*>(current_routing),
+ "Only hosts from Cluster and Vivaldi ASes can get an host_link.");
s_surf_parsing_link_up_down_t link_up_down;
- link_up_down.link_up = Link::byName(netcard_arg->link_up);
- link_up_down.link_down = Link::byName(netcard_arg->link_down);
+ link_up_down.link_up = Link::byName(hostlink->link_up);
+ link_up_down.link_down = Link::byName(hostlink->link_down);
- xbt_assert(link_up_down.link_up, "Link '%s' not found!",netcard_arg->link_up);
- xbt_assert(link_up_down.link_down, "Link '%s' not found!",netcard_arg->link_down);
+ xbt_assert(link_up_down.link_up, "Link '%s' not found!",hostlink->link_up);
+ xbt_assert(link_up_down.link_down, "Link '%s' not found!",hostlink->link_down);
// If dynar is is greater than netcard id and if the host_link is already defined
- if((int)xbt_dynar_length(current_routing->upDownLinks) > netcard->id() &&
- xbt_dynar_get_as(current_routing->upDownLinks, netcard->id(), void*))
- surf_parse_error("Host_link for '%s' is already defined!",netcard_arg->id);
+ auto as_cluster = static_cast<simgrid::surf::AsCluster*>(current_routing);
+ if((int)xbt_dynar_length(as_cluster->privateLinks_) > netcard->id() &&
+ xbt_dynar_get_as(as_cluster->privateLinks_, netcard->id(), void*))
+ surf_parse_error("Host_link for '%s' is already defined!",hostlink->id);
XBT_DEBUG("Push Host_link for host '%s' to position %d", netcard->name(), netcard->id());
- xbt_dynar_set_as(current_routing->upDownLinks, netcard->id(), s_surf_parsing_link_up_down_t, link_up_down);
+ xbt_dynar_set_as(as_cluster->privateLinks_, netcard->id(), s_surf_parsing_link_up_down_t, link_up_down);
}