#!/usr/bin/env perl

# Copyright (c) 2011, 2014. The SimGrid Team.
# All rights reserved.

# This program is free software; you can redistribute it and/or modify it
# under the terms of the license (GNU LGPL) which comes with this package.

use strict;
use warnings;

if($#ARGV!=0) {
    die "Usage: perl transfrom_optorsim_platform.pl <file.conf>\n";
}

my($conf_file)=$ARGV[0];

open FILE, $conf_file or die "Unable to open $conf_file";

print "<?xml version='1.0'?>\n";
print "<!DOCTYPE platform SYSTEM \"http://simgrid.gforge.inria.fr/simgrid.dtd\">\n";
print "<platform version=\"3\">\n";
print "<AS  id=\"AS0\"  routing=\"Floyd\">\n";

my $line;
my @tokens;
my $token;
my $dst = 0;
my $src = 0;
my @list_of_name;
my $num_link = 0;

my @links = ();
my @links_router = ();
my @routers = ();
my @hosts = ();
my @is_router = ();
my @routes = ();
my @routes_router = ();
my @routes_cluster = ();
my $nb_host;
while(defined($line=<FILE>))
{
	
if($line =~ /^#(.*)\)(.*)$/)
{
	print "<!--$1 $2-->\n";
	push @list_of_name, $2;
}
elsif($line =~ /^([0-9]*) ([0-9]*) ([0-9]*) (.*)$/)
{
	if($1 == "0"){
		push @is_router, 1;
		if(@list_of_name){
			push @routers, "\t\t<router id=\"$list_of_name[$src]\"/>\n";
		}
		else{
			push @routers, "\t\t<router id=\"router$src\"/>\n";
		}
	}
	else{
		push @is_router, 0;
		$nb_host = $1;
		if(@list_of_name){
			push @hosts, "\t<cluster id=\"$list_of_name[$src]\" prefix=\"$list_of_name[$src]-\" suffix=\"\"\n";
			push @hosts, "\t         radical=\"1-$nb_host\" power=\"1000000000\"    bw=\"125000000\"     lat=\"5E-5\"\n";
			push @hosts, "\t         router_id=\"$list_of_name[$src]-router\"/>\n";
		}
		else{
			push @hosts, "\t<cluster id=\"cluster$src\" prefix=\"$list_of_name[$src]-\" suffix=\"\"\n";
			push @hosts, "\t         radical=\"1-$nb_host\" power=\"1000000000\"    bw=\"125000000\"     lat=\"5E-5\"\n";
			push @hosts, "\t         router_id=\"cluster$src-router\"/>\n";
		}
	}		
	my $table = $4;
	@tokens = split(/ /,$table);
	foreach $token (@tokens) {
		if($src >= $dst){
			if($token != "0") #if there is a link between src and dst
			{	
				#Create a link				
				if($1 == "0"){ 
					push @links_router, "\t\t<link id=\"link$num_link\" bandwidth=\"$token\"/>\n";
				}
				else{
					push @links, "\t<link id=\"link$num_link\" bandwidth=\"$token\"/>\n";
				}

				#Create the route between router and router
				if($is_router[$src] && $is_router[$dst]) 
				{
					if(@list_of_name){
						push @routes_router, "\t\t<route src=\"$list_of_name[$src]\" dst=\"$list_of_name[$dst]\">\n";
					}
					else{
						push @routes_router, "\t\t<route src=\"router$src\" dst=\"router$dst\">\n";
					}
					push @routes_router, "\t\t\t<link_ctn id=\"link$num_link\"/>\n";
					push @routes_router, "\t\t</route>\n";
				}

				#Create the route between cluster and cluster
				elsif(!$is_router[$src] && !$is_router[$dst]) 
				{
					if(@list_of_name){
					push @routes_cluster, "\t\t<ASroute src=\"$list_of_name[$src]\" dst=\"$list_of_name[$dst]\"\n";
					push @routes_cluster, "\t\t	gw_src=\"$list_of_name[$src]-router\" gw_dst=\"$list_of_name[$dst]-router\">\n";
					}
					else{
					push @routes_cluster, "\t\t<ASroute src=\"cluster$src\" dst=\"cluster$dst\"\n";
					push @routes_cluster, "\t\t    gw_src=\"cluster$src-router\" dst=\"cluster$dst-router\">\n";
					}
					push @routes_cluster, "\t\t\t<link_ctn id=\"link$num_link\"/>\n";
					push @routes_cluster, "\t\t</ASroute>\n";
				}				
				else
				{
					push @routes, "\t<ASroute ";
					if(@list_of_name){
						if($is_router[$src]) 	#router
							{push @routes, "src=\"AS_intern\" gw_src=\"$list_of_name[$src]\"\n";}
						else			#cluster
							{push @routes, "src=\"$list_of_name[$src]\" gw_src=\"$list_of_name[$src]-router\"\n";}


						if($is_router[$dst]) 	#router
							{push @routes, "\t\tdst=\"AS_intern\" gw_dst=\"$list_of_name[$dst]\">\n";}
						else			#cluster
							{push @routes, "\t\tdst=\"$list_of_name[$dst]\" gw_dst=\"$list_of_name[$dst]-router\">\n";}
					}
					else{
						if($is_router[$src]) 	#router
							{push @routes, "src=\"AS_intern\" gw_src=\"router$src\"\n";}
						else			#cluster
							{push @routes, "src=\"cluster$src\" gw_src=\"cluster$src-router\"\n";}


						if($is_router[$dst]) 	#router
							{push @routes, "\t\tdst=\"AS_intern\" gw_dst=\"router$dst\">\n";}
						else			#cluster
							{push @routes, "\t\tdst=\"cluster$dst\" gw_dst=\"cluster$dst-router\">\n";}
					}
					push @routes, "\t\t<link_ctn id=\"link$num_link\"/>\n";
					push @routes, "\t</ASroute>\n";

				}

				$num_link++;	
			}
		}
		$dst++;
	}
	$src++;
	$dst = 0;
}
else
{
die;
}
	
	
}
close(FILE);

print "\t<AS  id=\"AS_intern\"  routing=\"Floyd\">\n";
print @routers;
print @links_router;
print @routes_router;
print "\t</AS>\n";
print "\n";	
print @hosts;
print @routes_cluster;
print "\n";

print @links;
print "\n";
print @routes;
print "\n";

print "</AS>\n";
print "</platform>";

print " \n";
