#! /usr/bin/perl -w
############################################################
## Copyright: 2011 Integrated Sytems Laboratory, ETH Zurich
## http://www.iis.ee.ethz.ch/~sha3
############################################################
use strict;
# v0.5 - kgf@ee.ethz.ch - Mon Sep 19 12:52:33 CEST 2011
# - blake has saved another cycle + added a small note to
# the HTML file about the most recent run..
# v0.4 - kgf@ee.ethz.ch - Fri Sep 16 12:50:35 CEST 2011
# - changed the latency for blake
# v0.3 - kgf@ee.ethz.ch - Fri Sep 9 18:27:28 CEST 2011
# - added a sort to the ls, so that we have numerical sort..
# well sort of..
# v0.2 - kgf@ee.ethz.ch - Tue Sep 6 07:46:30 CEST 2011
# - improvements
# v0.1 - kgf@ee.ethz.ch - Mon Sep 5 08:42:52 CEST 2011
# - read all the reports and print some summaries
my $GATE=1.44;
my $SCALE=1.05; # scaling for the GNUPLOTS
my $cond = "wc";
my @TIMINGS=`ls reports/*_${cond}_timing.rep|sort -n -t_ -k3 `;
my %TIME;
my %AREA;
my %THROUGHPUT;
my $DEBUG= ($#ARGV > -1)? 1 : 0;
my %LATENCY = (
"ethz_sha2" => 67,
"ethz_blake" => 57,
"ethz_groestl" => 81,
"ethz_jh" => 42,
"ethz_keccak" => 24,
"ethz_skein" => 92,
"gmu_sha2" => 65,
"gmu_blake" => 29,
"gmu_groestl" => 21,
"gmu_jh" => 43,
"gmu_keccak" => 24,
"gmu_skein" => 19
);
# where to generate the files
my $GNUPLOT="./reports/gnuplot";
my $PNG="../../results/atplot";
my $HTML="../../results/";
my %CONDITIONS = (
"wc" => "Worst case - 1.08V 125C",
"bc" => "Best case - 1.32V 0C",
"tc" => "Typical case - 1.20V 25C"
);
unless ($ENV{PWD}=~/(ethz|gmu)_(blake|skein|sha2|jh|keccak|groestl)\/synopsys$/){
die "Current directory is [$ENV{PWD}] not in synopsys\n";
}
## get the last constraint that has been used
my $current_cons=0;
open (S, "< scripts/design_settings.tcl") or die "Can not open scripts/design_settings.tcl\n";
while(S){
next unless (/^\s*set CLOCKLIST\s*\{([^}]+)\}/);
my @cons=split(' ',$1);
$current_cons = "$cons[$#cons]\n";
}
close(S);
my $flavor= $1;
my $alg = $2;
my $date=`date`;
chomp($date);
## create the html file
my $htmlfile=$HTML."${flavor}_${alg}_results.html";
open (H, "> $htmlfile") or die "Can not open HTML file $htmlfile\n";
print H <<"BUGU";
HTML
TITLESynthesis results for $alg ($flavor version)/TITLE
BODY
CENTER
H3
Synthesis results for
/H3
H1
$flavor $alg
/H1
ILast run for $current_cons ns clock constraint/IBR
IMG SRC="atplot_${flavor}_${alg}.png"
/CENTER
HR
BUGU
foreach my $tim (@TIMINGS){
chomp ($tim);
$tim=~/${flavor}_${alg}_(\d+(?:\.\d+)?)_(wc|tc|bc)_timing/;
my $target= $1;
$cond = $2;
print H "H3Clock Constraint $target ns/H3\nBArea:/B\nUL\n";
my $area=0;
my $ffs=0;
my $afile="./reports/${flavor}_${alg}_${target}_${cond}_area.rpt";
open (A, "<$afile") or die "Can not open $afile for reading\n";
while (A){
next unless (/(Noncombinational|Total cell) area/);
my @sp = split;
if (/^Total/){
$area = $sp[3];
}
else {
$ffs = $sp[2];
}
print if $DEBUG;
}
printf(H " LI Total area : %6.3f kGate equivalents\n", $area/ (1000*$GATE));
printf(H " LI Total FF area : %6.3f kGate equivalents (%4.1f%%)\n", $ffs/ (1000*$GATE), 100*($ffs/$area));
$AREA{$target}=$area;
close (A);
print H "/UL\nBTiming:/B (I$CONDITIONS{$cond}/I)\nUL\n";
open (T, "<$tim") or die "Can not open $tim for reading\n";
my %R;
my $type ="none";
my $maxtime = 0;
while (T){
next unless (/(TIMING|slack)/);
if (/^(IN2REG|IN2OUT|REG2REG|REG2OUT)/){
$type = $1;
printf(H "LI %s timing : ",lc($type));
}
else{
my @sp=split;
my $time= $target - ($sp[2]);
printf(H "%6.4f ns\n",$time);
$maxtime=$time if ($maxtime lt $time);
$R{$type} = $time;
}
}
printf("%s(%s) - %s - crit.path %6.3f ns - area %6.3f kGE ( %4.1f%% FFs)\n",
$alg,$flavor, $target, $maxtime, $area/(1000*$GATE), 100* ($ffs/$area));
foreach my $r (keys %R){
print " $r timing ($R{$r}) ns \n" if $DEBUG;
}
# print "max timing = $maxtime\n";
$TIME{$target} = $maxtime;
my $bpc = ($alg eq "keccak") ? 1088 : 512 ; # bits per block
my $throughput = $bpc / ($maxtime * $LATENCY{"${flavor}_${alg}"});
$THROUGHPUT{$target} = $throughput;
printf(H "/UL\nBThroughput : %6.3f Gbps/B (I%d bits per %d cycles a %6.3f ns/I)BR\n",
$throughput, $bpc, $LATENCY{"${flavor}_${alg}"}, $maxtime);
printf(H "/UL\nThroughput per area: %6.3f kbits/s/gate equivalentBRHR\n",
(1000*$throughput)/ ($area/(1000*$GATE)));
print '-' x 75, "\n" if $DEBUG;
close(T);
}
chomp($current_cons);
print "Last synthesis run for $current_cons ns\n";
# now let us generate a GNUPLOT picture
my $g1= $GNUPLOT."_${flavor}_${alg}_at.dat";
open (G, "> $g1") or die "can not open $g1\n";
# defaults so that the min max comparison works
my $mina=99999.0;
my $mint=99.0;
my $maxa=0.0;
my $maxt=0.0;
foreach my $t (sort {$a =$b} keys %TIME){
my $gates= $AREA{$t}/(1000*$GATE); # calculate in gates
printf(G "%f %6.3f %6.3f\n",$gates, $TIME{$t}, $THROUGHPUT{$t});
$mina = $gates if ($mina > $gates);
$maxa = $gates if ($maxa < $gates);
$mint = $TIME{$t} if ($mint > $TIME{$t});
$maxt = $TIME{$t} if ($maxt < $TIME{$t});
# print "$AREA{$t} $gates : $mina - $maxa , $TIME{$t} : $mint - $maxt\n" ;
}
close (G);
$mina = int($mina / $SCALE);
$maxa = int($maxa * $SCALE);
$mint = int($mint);
$maxt = int(($maxt+1) );
my $g2 = $GNUPLOT."_${flavor}_${alg}_at.gnuplot";
open (G, "> $g2") or die "can not open $g2\n";
print G<<"BUGU";
set title "$alg ($flavor) - $CONDITIONS{$cond} Synthesis Results - UMC65LL"
set ylabel "Area [kGate eq]"
set xlabel "Critical Path [ns]"
set grid
set terminal png
set out "${PNG}_${flavor}_${alg}.png"
plot [$mint:$maxt][$mina:$maxa] "${GNUPLOT}_${flavor}_${alg}_at.dat" using 2:1 with steps notitle lt 0 lw 2, "${GNUPLOT}_${flavor}_${alg}_at.dat" using 2:1 with points notitle lt 1 pointtype 3 pointsize 2
set terminal post eps color
set out "${PNG}_${flavor}_${alg}.eps"
replot
BUGU
close(G);
# execute gnuplot
my $result=`gnuplot $g2`;
#unlink ($g1,$g2);
print H<<"BUGU";
FONT SIZE=-2
CENTER
Shabziger ResultsBR
BGMU:/B
[A HREF="gmu_sha2_results.html"SHA2/A]
[A HREF="gmu_blake_results.html"Blake/A]
[A HREF="gmu_groestl_results.html"Groestl/A]
[A HREF="gmu_jh_results.html"JH/A]
[A HREF="gmu_keccak_results.html"Keccak/A]
[A HREF="gmu_skein_results.html"Skein/A]BR
BETHZ:/B
[A HREF="ethz_sha2_results.html"SHA2/A]
[A HREF="ethz_blake_results.html"Blake/A]
[A HREF="ethz_groestl_results.html"Groestl/A]
[A HREF="ethz_jh_results.html"JH/A]
[A HREF="ethz_keccak_results.html"Keccak/A]
[A HREF="ethz_skein_results.html"Skein/A]BR
/CENTER
BR
Generated automatically on $date by eval_syn_results.pl/FONT
/HTML
BUGU
close(H);