Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Replace surf by surf++ and make it compile
[simgrid.git] / teshsuite / simdag / platforms / flatifier.c
index de0bd15..e2bd77c 100644 (file)
 #include "xbt/log.h"
 #include "xbt/dict.h"
 #include "xbt/ex.h"
+#include "xbt/xbt_os_time.h"
 #include "surf/surf.h"
 #include "surf/surf_private.h"
 
+static const char link_ctn_v2[] =  "link:ctn";
+static const char link_ctn_v3[] = "link_ctn";
+
 XBT_LOG_NEW_DEFAULT_CATEGORY(flatifier,
                              "Logging specific to this platform parsing tool");
 
@@ -43,11 +47,50 @@ static int name_compare_links(const void *n1, const void *n2)
   return strcmp(name1, name2);
 }
 
+static int parse_cmdline(int *timings, int *downgrade, char **platformFile, int argc, char **argv)
+{
+  int wrong_option = 0;
+  int i;
+  for (i = 1; i < argc; i++) {
+    if (strlen(argv[i]) > 1 && argv[i][0] == '-' && argv[i][1] == '-') {
+      if (!strcmp(argv[i], "--timings")) {
+        *timings = 1;
+      } else {
+        if (!strcmp(argv[i], "--downgrade")) {
+          *downgrade = 1;
+        } else {
+          wrong_option = 1;
+          break;
+        }
+      }
+    } else {
+      *platformFile = argv[i];
+    }
+  }
+  return wrong_option;
+}
+
+static void create_environment(xbt_os_timer_t parse_time, const char *platformFile)
+{
+  xbt_ex_t e;
+  TRY {
+    xbt_os_cputimer_start(parse_time);
+    SD_create_environment(platformFile);
+    xbt_os_cputimer_stop(parse_time);
+  }
+  CATCH(e) {
+    xbt_die("Error while loading %s: %s", platformFile, e.msg);
+  }
+}
+
 int main(int argc, char **argv)
 {
   char *platformFile = NULL;
   int totalHosts, totalLinks;
   int timings=0;
+  int downgrade = 0;
+  int version = 3;
+  const char *link_ctn = link_ctn_v3;
   unsigned int i;
   xbt_dict_t props = NULL;
   xbt_dict_cursor_t cursor = NULL;
@@ -56,7 +99,6 @@ int main(int argc, char **argv)
   char *src,*dst,*key,*data;
   sg_routing_edge_t value1;
   sg_routing_edge_t value2;
-  xbt_ex_t e;
 
   const SD_workstation_t *hosts;
   const SD_link_t *links;
@@ -66,30 +108,28 @@ int main(int argc, char **argv)
 
   SD_init(&argc, argv);
 
-  platformFile = argv[1];
-  if (!strcmp(platformFile,"--timings")) {
-     platformFile=argv[2];
-     timings=1;
+  if (parse_cmdline(&timings, &downgrade, &platformFile, argc, argv) || !platformFile) {
+    xbt_die("Invalid command line arguments: expected [--timings|--downgrade] platformFile");
   }
-      
-  XBT_DEBUG("%s", platformFile);
-  TRY {
-    xbt_os_timer_start(parse_time);
-    SD_create_environment(platformFile);
-    xbt_os_timer_stop(parse_time);
-  }
-  CATCH(e) {
-    xbt_die("Error while loading %s: %s",platformFile,e.msg);
+  XBT_DEBUG("%d,%d,%s", timings, downgrade, platformFile);
+
+  if (downgrade) {
+    version = 2;
+    link_ctn = link_ctn_v2;
   }
 
+  create_environment(parse_time, platformFile);
+
   if (timings) {
     XBT_INFO("Parsing time: %fs (%d hosts, %d links)",
           xbt_os_timer_elapsed(parse_time),SD_workstation_get_number(),SD_link_get_number());
   } else {
     printf("<?xml version='1.0'?>\n");
     printf("<!DOCTYPE platform SYSTEM \"http://simgrid.gforge.inria.fr/simgrid.dtd\">\n");
-    printf("<platform version=\"3\">\n");
-    printf("<AS id=\"AS0\" routing=\"Full\">\n");
+    printf("<platform version=\"%d\">\n", version);
+    if (!downgrade)
+      printf("<AS id=\"AS0\" routing=\"Full\">\n");
 
     // Hosts
     totalHosts = SD_workstation_get_number();
@@ -115,8 +155,8 @@ int main(int argc, char **argv)
 
     // Routers
     xbt_lib_foreach(as_router_lib, cursor_src, key, value1) {
-      if(((sg_routing_edge_t)xbt_lib_get_or_null(as_router_lib, key,
-          ROUTING_ASR_LEVEL))->rc_type == SURF_NETWORK_ELEMENT_ROUTER)
+      if(surf_routing_edge_get_rc_type(xbt_lib_get_or_null(as_router_lib, key,
+          ROUTING_ASR_LEVEL)) == SURF_NETWORK_ELEMENT_ROUTER)
       {
         printf("  <router id=\"%s\"/>\n",key);
       }
@@ -158,8 +198,8 @@ int main(int argc, char **argv)
         {
           void *link = xbt_dynar_get_as(route,i,void *);
 
-          char *link_name = xbt_strdup(((surf_resource_t)link)->name);
-          printf("<link_ctn id=\"%s\"/>",link_name);
+          char *link_name = xbt_strdup(surf_resource_name(link));
+          printf("<%s id=\"%s\"/>",link_ctn,link_name);
           free(link_name);
         }
         printf("\n  </route>\n");
@@ -177,8 +217,8 @@ int main(int argc, char **argv)
           {
             void *link = xbt_dynar_get_as(route,i,void *);
 
-            char *link_name = xbt_strdup(((surf_resource_t)link)->name);
-            printf("<link_ctn id=\"%s\"/>",link_name);
+            char *link_name = xbt_strdup(surf_resource_name(link));
+            printf("<%s id=\"%s\"/>",link_ctn,link_name);
             free(link_name);
           }
           printf("\n  </route>\n");
@@ -203,8 +243,8 @@ int main(int argc, char **argv)
             {
               void *link = xbt_dynar_get_as(route,i,void *);
 
-              char *link_name = xbt_strdup(((surf_resource_t)link)->name);
-              printf("<link_ctn id=\"%s\"/>",link_name);
+              char *link_name = xbt_strdup(surf_resource_name(link));
+              printf("<%s id=\"%s\"/>",link_ctn,link_name);
               free(link_name);
             }
             printf("\n  </route>\n");
@@ -221,8 +261,8 @@ int main(int argc, char **argv)
           {
             void *link = xbt_dynar_get_as(route,i,void *);
 
-            char *link_name = xbt_strdup(((surf_resource_t)link)->name);
-            printf("<link_ctn id=\"%s\"/>",link_name);
+            char *link_name = xbt_strdup(surf_resource_name(link));
+            printf("<%s id=\"%s\"/>",link_ctn,link_name);
             free(link_name);
           }
           printf("\n  </route>\n");
@@ -230,10 +270,12 @@ int main(int argc, char **argv)
       }
     }
 
-    printf("</AS>\n");
+    if (!downgrade)
+      printf("</AS>\n");
     printf("</platform>\n");
   }
   SD_exit();
+  xbt_os_timer_free(parse_time);
 
   return 0;
 }