Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Get rid of "local" keyword for sh.
[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-2019. 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 versioning.
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 platform 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
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.
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 =item B<Version 4.1:> Introduced in SimGrid 3.16 (this is the current version).
127
128 =over 4
129
130 =item
131
132 Rename a few tags, but in a backward-compatible manner: the old names are still accepted.
133
134   AS            -> zone
135   ASroute       -> zoneRoute
136   bypassAsRoute -> bypassZoneRoute
137   process       -> actor
138
139 =back
140
141 =item Other backward-compatible changes (old syntax is still accepted) for which we did not bump the DTD version:
142
143 =over 4
144
145 =item
146
147 Rename the FULLDUPLEX sharing into SPLITDUPLEX.
148
149 =item
150
151 In <host> and <peer>, rename the 'availability_file' atribute into 'speed_file'.
152
153 =back
154
155 =back
156
157 =head1 AUTHORS
158
159  The SimGrid team (simgrid-devel@lists.gforge.inria.fr)
160
161 =head1 COPYRIGHT AND LICENSE
162
163 Copyright (c) 2006-2019. The SimGrid Team. All rights reserved.
164
165 This program is free software; you may redistribute it and/or modify it
166 under the terms of GNU LGPL (v2.1) license.
167
168 =cut
169
170
171 use strict;
172
173 my $fromversion=-1;
174 my $toversion=4.1;
175
176 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";
177 open INPUT, "$filename" or die "Cannot open input file $filename: $!\n";
178
179 my $output_string = "<?xml version='1.0'?>\n".
180     "<!DOCTYPE platform SYSTEM \"https://simgrid.org/simgrid.dtd\">\n".
181     "<platform version=\"$toversion\">\n";
182
183 my($AS_opened)=0;
184
185 my $line;
186 while (defined($line = <INPUT>)) {
187     chomp $line;
188     # eat the header, whatever form it has
189     next if ($line =~ s/<\?xml[^>]*>//           && ! $line =~ /\S/); # just in case several tags are on the same line
190     next if ($line =~ s/<!DOCTYPE[^>]*>//        && ! $line =~ /\S/);
191
192     if ($line =~ s/<platform(_description)? *>//) {
193         $fromversion = 0;
194         print "$filename was using version 0\n";
195         next if !$line =~ /\S/;
196     } elsif ($line =~ s/<platform.*version=["']*([0-9.]*)["']*>//) {
197         $fromversion = $1;
198         if ($fromversion == $toversion) {
199             warn "Input platform file $filename is already conformant to version $fromversion. This should be a no-op.\n";
200         }
201         if ($fromversion > $toversion) {
202             die "Input platform file $filename is more recent than this script (file version: $fromversion; script version: $toversion)\n";
203         }
204         next if !$line =~ /\S/;
205         print "$filename was using version $fromversion\n";
206     }
207
208     if ($fromversion == 0) {
209         while ($line =~ m|^(.*?)<cpu(.*?)power="([^"]*)"(.*)$|) {
210             $line = "$1TOTOTUTUTATA${2}TOTOTUTUTATA".($3*1000000)."TOTOTUTUTATA${4}";
211         }
212         while ($line =~ /^(.*?)TOTOTUTUTATA(.*?)TOTOTUTUTATA(.*?)TOTOTUTUTATA(.*)$/) {
213             $line = "$1<cpu${2}power=\"$3\"$4";
214         }
215         while ($line =~ m|^(.*?)<network_link(.*?)bandwidth="([^"]*)"(.*?)$|) {
216             $line = "$1TOTOTUTUTATA${2}TOTOTUTUTATA".($3*1000000)."TOTOTUTUTATA${4}";
217         }
218         while ($line =~ /^(.*?)TOTOTUTUTATA(.*?)TOTOTUTUTATA(.*?)TOTOTUTUTATA(.*?)$/) {
219             $line = "$1<network_link${2}bandwidth=\"$3\"$4";
220         }
221     }
222
223     if ($fromversion < 2)  {
224         # The renamings (\b=zero-width word boundary check)
225         $line =~ s/\bplatform_description\b/platform/g;
226         $line =~ s/\bname\b/id/g;
227         $line =~ s/\bcpu\b/host/g;
228         $line =~ s/\bnetwork_link\b/link/g;
229         $line =~ s/\broute_element\b/link:ctn/g;
230     }
231
232     if ($fromversion < 3)  {
233         $line =~ s/\blink:ctn\b/link_ctn/g;
234         $line =~ s/\btrace:connect\b/trace_connect/g;
235
236         if($AS_opened && (($line=~ /<\/platform>/) || ($line=~ /<process/))) {
237             $output_string .= "</AS>\n";
238             $AS_opened = 0;
239         }
240
241         if( (!$AS_opened) && (
242                 ($line =~ /<host/)    ||
243                 ($line =~ /<link/)    ||
244                 ($line =~ /<cluster/) ||
245                 ($line =~ /<router/)
246             )) {
247             $output_string .=  " <AS  id=\"AS0\"  routing=\"Full\">\n";
248             $AS_opened=1;
249         }
250         
251         if($line=~/<route /){$line =~ s/\<route/\<route symmetrical=\"NO\"/g;}
252     }
253     if ($fromversion < 4) {
254         $line =~ s/\bpower\b/speed/g;   
255         $line =~ s/\bkind="POWER"/kind="SPEED"/g;
256     }
257     if ($fromversion < 4.1) {
258         $line =~ s/\bAS\b/zone/g;
259         $line =~ s/\bASroute\b/zoneRoute/g;
260         $line =~ s/\bbypassAsRoute\b/bypassZoneRoute/g;
261         $line =~ s/\bprocess\b/actor/g;
262     }
263     $line =~ s/\bFULLDUPLEX\b/SPLITDUPLEX/g;
264     $line =~ s/\bavailability_file\b/speed_file/g;
265         
266     $output_string .= "$line\n";
267 }
268
269 close INPUT;
270
271 if ($fromversion == -1) {
272     die "Cannot retrieve the platform version of $filename\n";
273 }
274
275 open OUTPUT, "> $filename";
276 print OUTPUT $output_string;
277 close OUTPUT;