#! /usr/bin/perl
use Getopt::Std;
my %options;
getopts ( 'vVqh', \%options );

if ( defined $options{'h'} )
{
    print STDERR <<EOUSAGE;
Arguments:
    curve {hm,zm,rmj,sa,ta}
    frequency {1200,1800,2600}
    config {threads+sockets, like 8s, 2d, etc)
    size {10,11,12}
Flags:
    -v Print column headers on stderr, (which number is what)
    -V Print intermediate integrals as they are being calculated
    -q Omit the columns with configuration details
    -h This text
EOUSAGE
    exit ( 1 );
}

defined $ARGV[0] and
defined $ARGV[1] and
defined $ARGV[2] and
defined $ARGV[3] or die "Args: curve freq threads+sockets size";
($curve,$freq,$thrsock,$size) = ($ARGV[0],$ARGV[1],$ARGV[2],$ARGV[3]);

$thread = $thrsock;
$thread =~ s/[sd]//g;
$socket = $thrsock;
$socket =~ s/[\d]+//g;

unless ( $freq eq 'od' ) { $freq .= "MHz"; }

$filename = "results/${curve}_${freq}_${thread}${socket}_${size}.log";

unless ( open ( IN, "<$filename" ) ) { die "Could not open file $filename"; }
$first = <IN>;
chomp $first;
print STDERR $first, "...";
while ( <IN> ) { push @lines, $_; }
print STDERR pop @lines, "!\n";
close ( IN );

foreach $line (@lines)
{
    my %attr;
    @parts = split ( /=?[\s]+/, $line );
    for ( $i=0; $i<8; $i++ ) { $attr{$parts[2*$i]} = $parts[2*$i+1]; }
    push @alines, \%attr;
}
$t_prev = 0;

# Take the first sample point to start with
$a = pop @alines;
($pp0_0_prev, $pp0_1_prev, $pck0_prev, $pck1_prev, $dram0_prev, $dram1_prev) =
    (
        ${$a}{'pp0_0'}, ${$a}{'pck_0'}, ${$a}{'pp0_1'}, ${$a}{'pck_1'}, ${$a}{'dram_0'}, ${$a}{'dram_1'} 
    );

# Integrals start from zero
($spp0_0, $spp0_1, $spck0, $spck1, $sdram0, $sdram1) = (0, 0, 0, 0, 0, 0);

foreach $a ( @alines ) {
    $t = ${$a}{'t'};
    $dt = $t - $t_prev;
    $t_prev = $t;

    ($pp0_0, $pck0, $pp0_1, $pck1, $dram0, $dram1) = (
        ${$a}{'pp0_0'}, ${$a}{'pck_0'}, ${$a}{'pp0_1'}, ${$a}{'pck_1'}, ${$a}{'dram_0'}, ${$a}{'dram_1'} 
    );
    ($app0_0, $apck0, $app0_1, $apck1, $adram0, $adram1) = (
            0.5 * ($pp0_0+$pp0_0_prev) * $dt,
            0.5 * ($pck0+$pck0_prev) * $dt,
            0.5 * ($pp0_1+$pp0_1_prev) * $dt,
            0.5 * ($pck1+$pck1_prev) * $dt,
            0.5 * ($dram0+$dram0_prev) * $dt,
            0.5 * ($dram1+$dram1_prev) * $dt,
    );
    if ( defined $options{'V'} )
    {
        printf "%.4f %.4f %.4f %.4f %.4f %.4f %.4f\n",
            $dt, $app0_0, $apck0, $app0_1, $apck1, $dram0, $dram1;
    }
    ($spp0_0, $spp0_1, $spck0, $spck1, $sdram0, $sdram1) =
        ($spp0_0+$app0_0, $spp0_1+$app0_1, $spck0+$apck0, $spck1+$apck1, $sdram0+$adram0, $sdram1+$adram1); 
    ($pp0_0_prev, $pck0_prev, $pp0_1_prev, $pck1_prev, $dram0_prev, $dram1_prev ) =
        ($pp0_0, $pck0, $pp0_1, $pck1, $dram0, $dram1);

}

if ( defined $options{'v'} or defined $options{'V'} )
{
    unless (defined $options{'q'})
    {
        print STDERR "curve\tfreq\tthrd\tsock\tsize\t"
    }
    print STDERR "t\tdram\tpp0_0\tpck0";
    if ( $socket eq 'd' ) { print STDERR "\tpp0_1\tpck1"; }
    print STDERR "\n";
}

$curve =~ s/hm/HO/;
$curve =~ s/rmj/RM/;
$curve =~ s/zm/ZO/;
$curve =~ s/sa/SA/;
$curve =~ s/ta/TA/;
$freq  =~ s/od/TBT/;

unless ( defined $options{'q'} ) {
    print "${curve}\t${freq}\t$thread\t$socket\t$size\t";
}

printf "%.4f\t%.4f\t%.4f\t%.4f", $t, $sdram0+$sdram1, $spp0_0, $spck0;
if ( $socket eq 'd' ) { printf "\t%.4f\t%.4f", $spp0_1, $spck1; }
print "\n";
