Logo AND Algorithmique Numérique Distribuée

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