Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
simgrid_update_xml: more explicit message when no file is provided
[simgrid.git] / tools / simgrid_update_xml.pl
1 #! /usr/bin/env perl
2 eval 'exec perl -S $0 ${1+"$@"}'
3     if $running_under_some_shell;
4
5 # This script updates the simgrid XML file passed as argument (modification in place)
6 # It is built to do the conversion incrementally.
7
8 # Copyright (c) 2006-2014. The SimGrid Team.
9 # All rights reserved.
10 #
11 # This program is free software; you can redistribute it and/or modify it
12 # under the terms of the license (GNU LGPL) which comes with this package.
13
14 =encoding UTF-8
15
16 =head1 NAME
17
18 simgrid_update_xml - updates simgrid XML files to latest version
19   
20 =head1 SYNOPSIS
21
22 B<simgrid_update_xml> I<xml_file>
23   
24 =head1 DESCRIPTION
25
26 simgrid_update_xml updates the simgrid XML file passed as argument.  The file
27 is modified in place, without any kind of backup. You may want to save a copy
28 before running the script.
29
30 In SimGrid XML files, the standard version is indicated in the version
31 attribute of the platform tag. Current version is 4. Here is a list of major
32 changes in each version.
33
34 =over 4
35
36 =item B<Version 0:> Used before SimGrid 3.3
37
38 =item B<Version 1:> Introduced in SimGrid 3.3
39
40 =over 4
41
42 =item 
43
44 The version attribute of platform were added to allow file versionning.
45
46 =item
47
48 The link bandwidth changed from Mb/s to b/s; and the CPU power were changed
49 from MFlop/s to Flop/s
50
51 =back
52
53 =item B<Version 2:> Introduced in SimGrid 3.4
54
55 =over 
56
57 =item 
58
59 Several tags were renamed: 
60
61   CPU -> HOST 
62   NETWORK_LINK -> LINK
63   ROUTE_ELEMENT ->  LINK_CTN
64   PLATFORM_DESCRIPTION -> PLATFORM
65
66 =back
67
68 =item B<Version 3:> Introduced in SimGrid 3.5
69
70 =over 4
71
72 =item
73
74 The AS tag were introduced. Every plaform should now contain an englobing AS
75 tag.
76
77 =item 
78
79 Routes are now symmetric by default.
80
81 =item
82
83 Several tags were renamed (for sake of XML sanity):
84
85   LINK:CTN -> LINK_CTN
86   TRACE:CONNECT -> TRACE_CONNECT
87
88 =back
89
90 =item B<Version 4:> Introduced in SimGrid 3.13 (this is the current version)
91
92 =over 4
93
94 =item
95
96 Rename the attributes describing the amount of flop that a host / peer / cluster / cabinet can deliver per second.
97
98   <host power=...> -> <host speed=...>
99
100 =item
101
102 In <trace_connect>, attribute kind="POWER" is now kind="SPEED".
103
104 =item
105
106 The DOCTYPE points to the right URL: http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd
107
108 =item
109
110 Units are now mandatory in attributes. USE THE SCRIPT sg_xml_unit_converter.py TO CONVERT THIS
111
112      - speed. Old default: 'f' or 'flops'. Also defined: 
113         'Yf',         'Zf',         'Ef',       'Pf',        'Tf',        'Gf',        'Mf',        'kf' 
114         'yottaflops', 'zettaflops', 'exaflops', 'petaflops', 'teraflops', 'gigaflops', 'megaflops', 'kiloflops'
115         
116      - bandwidth. Old default: 'Bps' bytes per second (or 'bps' but 1 Bps = 8 bps)
117        Also defined in bytes: 'TiBps', 'GiBps', 'MiBps', 'KiBps', 'TBps', 'GBps', 'MBps', 'kBps', 'Bps'
118        And the same in bits:  'Tibps', 'Gibps', 'Mibps', 'Kibps', 'Tbps', 'Gbps', 'Mbps', 'kbps', 'bps' 
119        
120      - latency. Old default: 's' second. Also defined:
121        'w' week, 'd' day, 'h' hour, 'm' minute, 'ms' millisecond, 'us' microsecond, 'ns' nanosecond, 'ps' picosecond   
122
123
124 =back
125
126 =back
127
128 =head1 AUTHORS
129
130  The SimGrid team (simgrid-devel@lists.gforge.inria.fr)
131   
132 =head1 COPYRIGHT AND LICENSE
133
134 Copyright (c) 2006-2016. The SimGrid Team. All rights reserved.
135   
136 This program is free software; you may redistribute it and/or modify it
137 under the terms of GNU LGPL (v2.1) license.
138   
139 =cut
140
141
142 use strict;
143
144 my $fromversion=-1;
145 my $toversion=4;
146
147 my $filename = $ARGV[0] or die "Usage: simgrid_update_xml.pl file_to_convert.xml\nPlease provide an XML to convert as a parameter.\n";
148 open INPUT, "$filename" or die "Cannot open input file $filename: $!\n";
149
150 my $output_string = "<?xml version='1.0'?>\n".
151     "<!DOCTYPE platform SYSTEM \"http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd\">\n".
152     "<platform version=\"$toversion\">\n";
153
154 my($AS_opened)=0;
155
156 my $line;
157 while (defined($line = <INPUT>)) {
158     chomp $line;
159     # eat the header, whatever form it has
160     next if ($line =~ s/<\?xml[^>]*>//           && ! $line =~ /\S/); # just in case several tags are on the same line
161     next if ($line =~ s/<!DOCTYPE[^>]*>//        && ! $line =~ /\S/);
162     
163     if ($line =~ s/<platform(_description)? *>//) {
164         $fromversion = 0;
165         print "$filename was using version 0\n";
166         next if !$line =~ /\S/;
167     } elsif ($line =~ s/<platform.*version=["]*([0-9.])["]*>//) {
168         $fromversion = $1;
169         if ($fromversion == $toversion) {
170             die "Input platform file $filename is already conformant to version $fromversion. This should be a no-op.\n";
171         }
172         if ($fromversion > $toversion) {
173             die "Input platform file $filename is more recent than this script (file version: $fromversion; script version: $toversion)\n";
174         }
175         next if !$line =~ /\S/;
176         print "$filename was using version $fromversion\n";
177     }
178     
179     if ($fromversion == 0) {
180         while ($line =~ m|^(.*?)<cpu(.*?)power="([^"]*)"(.*)$|) {
181             $line = "$1TOTOTUTUTATA${2}TOTOTUTUTATA".($3*1000000)."TOTOTUTUTATA${4}";
182         }
183         while ($line =~ /^(.*?)TOTOTUTUTATA(.*?)TOTOTUTUTATA(.*?)TOTOTUTUTATA(.*)$/) {
184             $line = "$1<cpu${2}power=\"$3\"$4";
185         }
186         while ($line =~ m|^(.*?)<network_link(.*?)bandwidth="([^"]*)"(.*?)$|) {
187             $line = "$1TOTOTUTUTATA${2}TOTOTUTUTATA".($3*1000000)."TOTOTUTUTATA${4}";
188         }
189         while ($line =~ /^(.*?)TOTOTUTUTATA(.*?)TOTOTUTUTATA(.*?)TOTOTUTUTATA(.*?)$/) {
190             $line = "$1<network_link${2}bandwidth=\"$3\"$4";
191         }
192     }
193
194     if ($fromversion < 2)  {
195         # The renamings (\b=zero-width word boundary check)
196         $line =~ s/\bplatform_description\b/platform/g;
197         $line =~ s/\bname\b/id/g;
198         $line =~ s/\bcpu\b/host/g;
199         $line =~ s/\bnetwork_link\b/link/g;
200         $line =~ s/\broute_element\b/link:ctn/g;
201     }
202     
203     if ($fromversion < 3)  {
204         $line =~ s/\blink:ctn\b/link_ctn/g;
205         $line =~ s/\btrace:connect\b/trace_connect/g;
206
207         if($AS_opened && (($line=~ /<\/platform>/) || ($line=~ /<process/))) {
208             $output_string .= "</AS>\n";
209             $AS_opened = 0;
210         }
211
212         if( (!$AS_opened) && (
213                 ($line =~ /<host/)    ||
214                 ($line =~ /<link/)    ||
215                 ($line =~ /<cluster/) ||
216                 ($line =~ /<router/)
217             )) {
218             $output_string .=  " <AS  id=\"AS0\"  routing=\"Full\">\n";
219             $AS_opened=1;
220         }
221         
222         if($line=~/<route /){$line =~ s/\<route/\<route symmetrical=\"NO\"/g;}
223     }
224     if ($fromversion < 4) {
225         $line =~ s/\bpower\b/speed/g;   
226         $line =~ s/\bkind="POWER"/kind="SPEED"/g;
227     }
228         
229     $output_string .= "$line\n";
230 }
231
232 close INPUT;
233
234 if ($fromversion == -1) {
235     die "Cannot retrieve the platform version of $filename\n";
236 }
237
238 open OUTPUT, "> $filename";
239 print OUTPUT $output_string;
240 close OUTPUT;