##=== TEST.micro.report - Report for the MICRO'03 paper --------*- perl -*-===##
#
# This file defines a report to be generated for the micro paper.
#
# This report should be generated with the following command:
#    gmake ENABLE_OPTIMIZED=1 TEST=micro RUNTIMELIMIT=120 LARGE_PROBLEM_SIZE=1 CFLAGS=-O3
#
##===----------------------------------------------------------------------===##

# Sort by name
$SortCol = 4;

## Sort in descending order
$SortReverse = 1;
$SortNumeric = 1;

# Helper function
sub Ratio {
  my ($Cols, $Col) = @_;
  if ($Cols->[$Col-1] ne "*" and
      $Cols->[$Col-1] != "0") {
    return 0 if ($Cols->[$Col-2] eq "*");
    return $Cols->[$Col-2]/$Cols->[$Col-1];
  } else {
    return "n/a";
  }
}
sub InvRatio {
  my ($Cols, $Col) = @_;
  if ($Cols->[$Col-2] ne "*" and
      $Cols->[$Col-2] != "0") {
    return $Cols->[$Col-1]/$Cols->[$Col-2];
  } else {
    return "n/a";
  }
}

sub LLVMRatio {
  my ($Cols, $Col) = @_;
  if ($Cols->[5] ne "*") {
    return $Cols->[5]*1733333333/$Cols->[10];
  } else {
    return "n/a";
  }
}

sub FormatSize {
  my $Size = shift;
  return "*" if ($Size eq "*");
  if ($Size > 10*1024*1024) {
    return (int $Size*10 / (1024*1024))/10 . "MB";
  } elsif ($Size > 10*1024) {
    return sprintf("%2.1f", $Size / 1024) . "KB";
  } else {
    return $Size . "B";
  }
}

sub FormatSizeKB {
  my $Size = shift;
  return "*" if ($Size eq "*");
  return sprintf("%2.1f", $Size / 1024);
}

sub FormatRatio {
  return sprintf("%0.2f", shift);
}
sub FormatRatio2 {
  return sprintf("%0.3f", shift);
}

# FormatTime - Convert a time from 1m23.45 into 83.45
sub FormatTime {
  my $Time = shift;
  if ($Time =~ m/([0-9]+)[m:]([0-9.]+)/) {
    $Time = sprintf("%7.3f", $1*60.0+$2);
  }
  return $Time;
}


@LatexColumns = (1, 15, 12,    # LOC, LLC Size, BytecodeSize
                 10, 9, 11,     # #LLVM Insts, # MachineInsts, Ratio
                 5, 4, 6);     # JIT Time, Nat Run Time, Ratio

# Specify how to format columns nicely for printing...
%LatexColumnFormat = (
                       6 => \&FormatRatio2,
                      11 => \&FormatRatio,
                      12 => \&FormatSizeKB,
                      15 => \&FormatSizeKB,
                     );

# For latex output, limit benchmarks and rename as appropriate
@LatexRowMapOrder = (
            'treeadd'    => 'Olden-treeadd',
            'bisort'     => 'Olden-bisort',
            'mst'        => 'Olden-mst',
            'perimeter'  => 'Olden-perimeter',
            'health'     => 'Olden-health',
            'tsp'        => 'Olden-tsp',
            'power'      => 'Olden-power',
            'em3d'       => 'Olden-em3d',
            'voronoi'    => 'Olden-voronoi',
            'bh'         => 'Olden-bh',
            '-' => '-',
            'anagram'    => 'ptrdist-anagram',
            'ks'         => 'ptrdist-ks',
            'ft'         => 'ptrdist-ft',
            'yacr2'      => 'ptrdist-yacr2',
            'bc'         => 'ptrdist-bc',
            '-' => '-',
            '179.art'    => '179.art',
            '183.equake' => '183.equake',
            '181.mcf'    => '181.mcf',
            '256.bzip2'  => '256.bzip2',
            '164.gzip'   => '164.gzip',
            '197.parser' => '197.parser',
            '188.ammp'   => '188.ammp',
            '175.vpr'    => '175.vpr',
            '300.twolf'  => '300.twolf',
            '186.crafty' => '186.crafty',
            '255.vortex' => '255.vortex',
            '254.gap'    => '254.gap',
#            '-' => '-',
#            'sgefa'      => 'sgefa',
#            'sim'        => 'sim',
#            'burg'       => 'burg',
#            'fhourstones' => 'fhourstones',
#            'optimizer-eval' => 'optimizer-eval',
#            'flops' => 'flops',
#            'llu' => 'llubenchmark'
           );


# These are the columns for the report.  The first entry is the header for the
# column, the second is the regex to use to match the value.  Empty list create
# seperators, and closures may be put in for custom processing.
(
# Name
 ["Name:" , '\'.*/([^\']+)\' Program'],
 ["LOC:"  , 'LOC: *([0-9]+)'],
 [],
# Times
 ["Total"  , 'JIT TIME: real\s*([.0-9m:]+)', \&FormatTime],
 ["NatTotal", 'NAT TIME: real\s*([.0-9m:]+)', \&FormatTime],
 ["CodeGen", 'Total Execution Time: ([0-9.]+)'],
 ["CodeGenRatio", \&InvRatio],
 [],
# Sizes
 ["MCSize"   , '([0-9]+).*Number of bytes of machine code compiled'],
 ["#MCInsts" , '([0-9]+).*Number of machine instructions emitted'],
 ["LLVMInsts", '([0-9]+).*Number of instructions'],
 ["mc/LLVM ratio", \&Ratio],
 ["BytcdSize", '([0-9]+).*Number of bytecode bytes written'],
 [],
 ["Cycle/LLVM", \&LLVMRatio],
 ["LLC Size", 'LLC SIZE: *([0-9]+)'],
# Number of transformations
 []
);
