#!/opt/bin/perl
#  /usr/bin/perl
#
for (;$ARGV[0];shift @ARGV)
{ $pltId = $ARGV[0];
  $pltId =~ s+.*/++g;				# strip directory names
  $tabId = $pltId;
  if (!($pltId =~ s/time/plt/))			# substitute "time"
  { $pltId = $pltId.".plt";			# or append ".plt"
  }
  if (!($tabId =~ s/time/tab/))			# substitute "time"
  { $tabId = $tabId.".tab";			# or append ".tab"
  }

    print "-I-  processing: $ARGV[0]\n";	# shell output
  if (-e $pltId || -e $tabId)
  { print "-W- overwriting: $pltId $tabId\n";
  } else
  { print "        writing: $pltId $tabId\n";
  }

  open (inFile,  "<", $ARGV[0]) || die("-E- can't open input:  $!");
  open (pltFile, ">", $pltId)   || die("-E- can't open output: $!");
  open (tabFile, ">", $tabId)   || die("-E- can't open output: $!");

  print pltFile "# $pltId\t\t -- $ARGV[0]\n";
  print pltFile "# -- gnuplot: plot '<file>'  using 4:1:2:3 with errorbars\n";
  print pltFile "###########################################################\n";

  print tabFile "% $tabId\t\t -- $ARGV[0]\n";
  print tabFile "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
  print tabFile "\\begin{tabular}[t]{|r\@{,}l|r\@{,}l|r\@{,}l|}\n";
  print tabFile "\\hline\n";

  $plotX = 0;
  $cnt   = 0;
  while(<inFile>)
  { switch:
    { /vhdlp/ && do
      {	($anaLine) = /^"(.*)"/;
	last switch;
      };
      /vhdle/ && do
      { printout();
	($simLine) = /^"(.*)"/;
	print pltFile "# $anaLine\n";
	print pltFile "# $simLine\n";
	print pltFile
		"###########################################################\n";
	$cnt = 0;
	$max = 0;
	$min = 1.0e20;
	$avr = 0;
	last switch;
      };
      (($hr, $mn, $sec, $ms) =
	/Elaboration Elapsed Time: (\d+)h:(\d+)m:(\d+)s:(\d+)ms/) && do
      {	$ldSec = $sec + ($mn * 60) + ($hr * 3600);
	$ldMs  = $ms;
	last switch;
      };
      (($hr, $mn, $sec, $ms) =
	/Simulation Elapsed Time: (\d+)h:(\d+)m:(\d+)s:(\d+)ms/) && do
      {	$simSec = $sec + ($mn * 60) + ($hr * 3600);
	print pltFile "# $simSec.$ms\t+ $ldSec.$ldMs (load)\n";
	$cnt++;
	$sum = $simSec + $ldSec + (($ldMs + $ms) / 1000);
	$max = ($sum > $max)?$sum:$max;
	$min = ($sum < $min)?$sum:$min;
	$avr += $sum;
	last switch;
      };
    }
  }
  printout();

  print tabFile "\\hline\n";
  print tabFile "\\end{tabular}\n";
  close inFile;
  close pltFile;
  close datFile;
}

sub printout()
{ if ($cnt > 0)
  { $plotX++;
    print pltFile
	"# ---------------------------------------------------------\n";
    print pltFile $avr / $cnt, " $min $max $plotX\n";
    print pltFile
	"###########################################################\n";

    ($x, $y) = round($avr/$cnt);
    print tabFile "\t$x&$y";
    ($x, $y) = round($min);
    print tabFile "\t& $x&$y";
    ($x, $y) = round($max);
    print tabFile "\t& $x&$y\\\\\n";
    print tabFile "% $anaLine\n";
    print tabFile "% $simLine\n";
  }
}

sub round ($)
{ my $inVal = shift;
  if ($inVal =~ /\./)
  { ($x,$y) = /(\d+)(\d)/ for $inVal*1000;
    if ($y >= 5)
    { $x++;
    }
    ($x, $y, $z) = /(\d+)(\d)(\d)/ for $x;
    if ($z == 0)
    { return ($x,$y);
    } else
    { return ($x,$y.$z);
    }
#   $x = $x/100;
#   if ($x =~ /\./)
#   { ($x,$y) = /(\d+)\.(\d*)/ for $x;
#     return ($x, $y);
#   } else
#   { return ($x, "0");
#   }
  } else
  { return ($inVal, "0");
  }
}
