Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / tools / perlmod / Regreport / 3.60_n2.20 / Regreport.pm
CommitLineData
86530b38
AT
1# ========== Copyright Header Begin ==========================================
2#
3# OpenSPARC T2 Processor File: Regreport.pm
4# Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
5# 4150 Network Circle, Santa Clara, California 95054, U.S.A.
6#
7# * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8#
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; version 2 of the License.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program; if not, write to the Free Software
20# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21#
22# For the avoidance of doubt, and except that if any non-GPL license
23# choice is available it will apply instead, Sun elects to use only
24# the General Public License version 2 (GPLv2) at this time for any
25# software where a choice of GPL license versions is made
26# available with the language indicating that GPLv2 or any later version
27# may be used, or where a choice of which version of the GPL is applied is
28# otherwise unspecified.
29#
30# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
31# CA 95054 USA or visit www.sun.com if you need additional information or
32# have any questions.
33#
34# ========== Copyright Header End ============================================
35package Regreport;
36
37use strict;
38use warnings;
39use IO::Handle;
40use Cwd; # to get safe current working directory
41use Cwd 'chdir'; # so $ENV{PWD} is set as well
42
43require Exporter;
44
45our @ISA = qw(Exporter);
46
47STDOUT->autoflush(1);
48STDERR->autoflush(1);
49
50#-------------------------------------------------------------------------
51# Items to export into callers namespace by default. Note: do not export
52# names by default without a very good reason. Use EXPORT_OK instead.
53# Do not simply export all your public functions/methods/constants.
54
55# This allows declaration use Regreport ':all';
56# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
57# will save memory.
58#-------------------------------------------------------------------------
59
60my @funcs = qw(regenerate chk_single_diag wait_regression regress_stat cutitup);
61my @vars = qw($wait_sec $debug $sas_only $cut_name $rsfh $clean_pass
62 $fails_only $sim);
63
64our %EXPORT_TAGS = (
65 funcs => [ @funcs ],
66 vars => [ @vars ],
67 all => [ @funcs, @vars] );
68
69our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
70
71our @EXPORT = @{ $EXPORT_TAGS{'all'} };
72
73our $VERSION = '3.60_n2.20';
74
75# Preloaded methods go here.
76
77#======================================================
78$SIG{INT}= \&cleanup;
79#======================================================
80
81our($wait_sec)= 100; # polling interval (for -regress)
82our($debug, $sas_only, $cut_name, $clean_pass, $fails_only,$sim);
83our($rsfh) = \*STDOUT; # the file handler where regress_stat dumps
84
85my $period=100;
86my(@errlines); # error lines being gathered
87my(@perf_errors); # performance error lines being gathered
88my ($diagplerr, $tsotoolerr);
89my(%stat_details, %stats); # status hash per diag
90
91my (%group_count); # # of diags in different groups
92my (%group_count_stat); # 2-D array with status per group
93
94my $start_time = time;
95
96# The status types:
97#------------------
98my(%status_short)= ('pass' => 'PASS',
99 'fail' => 'FAIL',
100 'asst' => 'ASST',
101 'diag' => 'DIAG',
102 'lcns' => 'LIC',
103 'maxc' => 'MAXC',
104 'sckt' => 'SOCKT',
105 'timo' => 'TIMEO',
106 'simx' => 'NAS',
107 'perf' => 'PERF',
108 'dream' => 'DREAM',
109 'unkn' => 'UNKN',
110 'unfi' => 'UNFIN',
111 'nomem' => 'NOMEM'
112 );
113
114my(%STATUS_NAME)= ('pass' => 'PASS',
115 'fail' => 'FAIL',
116 'asst' => 'Assertion Fired',
117 'diag' => 'Diag Problem',
118 'lcns' => 'License Problem',
119 'maxc' => 'MaxCycles Hit',
120 'sckt' => 'Socket Problem',
121 'timo' => 'Timeout',
122 'simx' => 'Simics Problem',
123 'perf' => 'Performance',
124 'dream' => 'Killed By Dream',
125 'unkn' => 'Unknown',
126 'unfi' => 'UnFinished',
127 'nomem' => 'Out of Memory'
128 );
129
130my @status_types = qw(pass fail asst maxc timo diag sckt perf simx dream lcns unkn unfi nomem);
131
132#default error pattern
133#---------------------
134my($good_trap_va) = 422000;
135my($hgood_trap_va) = 82000;
136my($bad_trap_va) = 422020;
137my($hbad_trap_va) = 82020;
138
139#--------------------------------------------------------------
140my $w=100;
141my($drawline) = ("=" x $w) . "\n";
142my($errline_num) = 0;
143my($found_wall_sec) = 0;
144my($found_sim_cyc) = 0;
145my($wall_sec) = 0;
146my($sim_cyc) = 0;
147
148my($GUNZIP) = "gzip -dc"; # gunzip
149
150my($err_lines_per_diag) = 10; # lines per diag (to report)
151
152my($animate)= 0; #0: to turn off display of diags
153
154(my($TOOLBIN)= $0)=~ s%/[^/]+$%%; #same path as this script
155
156
157my ($grp_pos_in_name) = 1;
158
159my ($log_exists);
160
161my ($outofmemory) = 0;
162my ($outofmemory_sig);
163my ($dreamback);
164my ($dreamjobid);
165
166
167my @relnames;
168
169#==================================================================
170# START of LIB
171#==================================================================
172sub chk_statuslog {
173 my($diag)= @_;
174
175 my(@templist) = ();
176 $found_wall_sec = 0;
177 $found_sim_cyc = 0;
178 $wall_sec = 0;
179 $sim_cyc = 0;
180 $errline_num = 0;
181
182 my($status) = 'unfi';
183
184#figure out diag directory
185#=========================
186 if($diag eq '.') {
187 chop($diag= `pwd`);
188 $diag=~ m%([^/]+)$%;
189 $diag= $1;
190# ... if($diag=~ /\w+:([^:]+:[^:]+):\d+/) { $diag= $1; }
191 }elsif(! -d $diag) { die "No such diag directory: $diag\n"; }
192 else{ chdir($diag); }
193
194# extract key info from prev generated file
195#==========================================
196 my($stat_file)= 'status.log';
197 my($finished)= 0;
198 if(-f $stat_file) { #status file already generated
199 open(IN, "< $stat_file") || die "Cannot open $stat_file\n";
200 $finished= 1;
201 }elsif(-f "$stat_file.gz") { #status file already generated
202 open(IN, "$GUNZIP $stat_file.gz |") || die "Cannot gunzip $stat_file\n";
203 $finished= 1;
204 }
205
206 if($finished) {
207 $status = 'unkn';
208 while(<IN>) { #print lines to stdout
209 if(/^Rundir/) { #extract status, and
210 $status= &get_status($_);
211 }
212 elsif(/^Cycles=(\d+\.?\d*), Seconds=(\d+\.?\d*)/) {
213 $sim_cyc = $1;
214 $wall_sec = $2;
215 }
216 push(@templist, $_);
217 }
218 close(IN);
219
220 if(-r 'sims.log' || -r 'sims.log.gz')
221 {
222 if(-r "sims.log") { open (F, "sims.log");}
223 elsif(-r "sims.log.gz") { open (F, "$GUNZIP sims.log.gz |");}
224
225 print STDERR " I am doing sims\n" if($debug);
226 while(<F>)
227 {
228 if (/Chronologic VCS simulator/o && ($sim eq 'vcs')){ last;}
229 elsif (/Cadence Design Systems/ && ($sim eq 'ncv')){ last;}
230 elsif(!$sas_only && /SIMICS STEP/o){ last;}
231 elsif(/Found diag under.*(verif.*\.s)/) {
232 my($tmp) = "Diag: " . "\$DV_ROOT\/" . $1 . "\n";
233 $templist[0] = $tmp;
234 }
235 elsif(/midas: fatal error|no diag/i){
236 $status = 'diag';
237 my($tmp) = "Rundir: " . $diag . ":0" . "\t\t\t Diag Problem\n";
238 $templist[0] = $tmp;
239 push(@templist, $_);
240 last;
241 }
242 elsif(/error.*performance\s+mismatch/i){
243 $status = 'perf';
244 my($tmp) = "Rundir: " . $diag . ":0" . "\t\t\t Performance Problem\n";
245 $templist[0] = $tmp;
246 push(@templist, $_);
247 last;
248 } elsif(/sas socket open timeout/i){
249 $status = 'sckt';
250 my($tmp) = "Rundir: " . $diag . ":0" . "\t\t\t Socket Open Timeout: Probably picked a socket already in use\n";
251 $templist[0] = $tmp;
252 push(@templist, $_);
253 } elsif(/no space left on device/i ){
254 $status = 'dream';
255 my($tmp) = "Rundir: " . $diag . ":0" . "\t\t\t Possible Dream, disk or SIG Problem\n";
256 $templist[0] = $tmp;
257 push(@templist, $_);
258 } elsif(/caught a sig/i ){
259 my($tmp);
260 my($tmp1) = $_;
261 &check_logfile;
262 if($outofmemory) {
263 if(&rerun_diag($diag)) {
264 # since the diag has been restarted, indicate it is unfinished
265 $status = 'unfi';
266 push(@templist, "$diag unfinished\n");
267 push(@templist, "$drawline");
268 last;
269 }else {
270 $status = 'nomem';
271 $tmp = "Rundir: " . $diag . ":0" . "\t\t\t Ran out of memory\n";
272 }
273 } else {
274 $status = 'dream';
275 $tmp = "Rundir: " . $diag . ":0" . "\t\t\t Possible Dream, disk or SIG Problem\n";
276 }
277 $templist[0] = $tmp;
278 push(@templist, $tmp1);
279 }elsif (/-max_error|exit_on_error|stop_on_error|-no-warn-mismatch|vcs_run|ncv_run/){ next;}
280 elsif(/regress_date/i){ push(@templist, $_);}
281 elsif(/regress_time/i){ push(@templist, $_);}
282 elsif(/group_name/i){ push(@templist, $_);}
283 elsif(/running on\s+(\S+)/) { $dreamback = $1; }
284 elsif(/drmjobid\s+(\S+\s+\S+)/) { $dreamjobid = $1;}
285 }
286 print "finished simsgrep\n" if($debug);
287 close(F);
288 }
289 push(@templist, $drawline);
290 }
291 else{
292 push(@templist, "$diag unfinished\n");
293 push(@templist, "$drawline");
294 }
295 $stats{$diag} = $status;
296 $stat_details{$diag} = [@templist];
297
298 # Clean up passing, if requested
299 if ($clean_pass && $status eq 'pass') {
300 opendir (DIR, ".");
301 my @delfiles = grep(!/$stat_file|^\.+$/, readdir(DIR));
302 close DIR;
303 print "Delfiles: @delfiles" if ($debug);
304 system ("rm -rf @delfiles");
305 }
306 chdir('..');
307 return ($status, $sim_cyc, $wall_sec);
308}
309
310#======================================================================
311
312sub chk_single_diag {
313 if ( !(-r 'sims.log') and !(-r 'sims.log.gz') ) {
314 print "-----> sims.log / sims.log.gz does not exist ! \n";
315 exit(0);
316 }
317 my($diag)= @_;
318
319 my(@templist);
320 $found_wall_sec = 0;
321 $found_sim_cyc = 0;
322 $wall_sec = 0;
323 $sim_cyc = 0;
324 $errline_num = 0;
325 @errlines = ();
326
327 my($status) = 'unkn';
328
329#figure out diag directory
330#=========================
331 if($diag eq '.') {
332 chop($diag= `pwd`);
333 $diag=~ m%([^/]+)$%;
334 $diag= $1;
335 }elsif(! -d $diag) { die "No such diag directory: $diag\n"; }
336 else{ chdir($diag); }
337
338 if($cut_name){
339 my @tempnamelist = split ':', $diag;
340 if(($tempnamelist[$#tempnamelist] =~ /^\d+$/) && ($#tempnamelist > 0)){
341 $#tempnamelist--;
342 }
343 $diag = join ':', @tempnamelist;
344 }
345
346# extract key info from files
347#============================
348
349 my($open_sym) = 0;
350 if(-e "symbol.tbl"){
351 open(SYM, "symbol.tbl") || die "Cannot open symbol.tbl\n";
352 $open_sym = 1;
353 } elsif(-e "symbol.tbl.gz"){
354 open(SYM, "$GUNZIP symbol.tbl.gz |") || die "Cannot gunzip symbol.tbl.gz\n";
355 $open_sym = 1;
356 }
357
358 if($open_sym){
359 while(<SYM>){
360 if(/good_trap\s+(\w+)/){
361 $good_trap_va = $1;
362 }
363 elsif(/\.HT0_GoodTrap_0x100\s+0+(\w+)/){
364 $hgood_trap_va = $1;
365 }
366 elsif(/bad_trap\s+(\w+)/){
367 $bad_trap_va = $1;
368 }
369 elsif(/\.HT0_BadTrap_0x101\s+\w+\s+0+(\w+)/){
370 $hbad_trap_va = $1;
371 }
372 }
373 if($debug){
374 print "good trap $good_trap_va \tbad trap $bad_trap_va \n";
375 print "hgood trap $hgood_trap_va \thbad trap $hbad_trap_va \n";
376 }
377 }
378
379 my($something) = 0;
380 if(-r 'midas.log' || -r 'midas.log.gz') {
381 if(-r "midas.log") { open (F, "midas.log");}
382 elsif(-r "midas.log.gz") { open (F, "$GUNZIP midas.log.gz |");}
383 &midasgrep;
384 close(F);
385 $something = 1;
386 }
387
388 $log_exists = 0;my @data;
389 if(!$sas_only)
390 {
391 if(-r 'sims.log' || -r 'sims.log.gz')
392 {
393 if(-r "sims.log") { open (F, "sims.log") or die("Unable to open file sims.log"); }
394 elsif(-r "sims.log.gz") { open (F, "$GUNZIP sims.log.gz |") or die("Unable to open file sims.log.gz"); }
395 }
396 @data=<F>;
397 close F;
398 my @d = grep { /Vera: Loading main|ERROR|SIGDIE|regreport checking|regreport clock period|Time:.*[p|f]s|CPU Time:|ncsim: CPU Usage/ } @data;
399 #my @d = grep { /Vera: Loading main|ERROR|regreport(?! will determine)|SIGDIE|GOOD End|^Time:|[cC][pP][uU] [tT]ime[ ]*[:=]|finish at simulation time [0-9]+|Firing: [0-9]+|Message:|Signature:/ } @data;
400 &sim_grep (\@d );
401 $something = 1;
402 $log_exists = 1;
403 }
404 elsif(-r 'dream.log' || -r 'dream.log.gz') {
405 if(-r "dream.log") { open (F, "dream.log");}
406 elsif(-r "dream.log.gz") { open (F, "$GUNZIP dream.log.gz |");}
407 &dreamloggrep;
408 close(F);
409 $something = 1;
410 }elsif($sas_only && (-r 'sims.log' || -r 'sims.log.gz')) {
411 if(-r "sims.log") { open (F, "sims.log");}
412 elsif(-r "sims.log.gz") { open (F, "$GUNZIP sims.log.gz |");}
413#----------------------------------------------------------------------
414# this is a little hacky but listen up:
415# for the weird situation when I am checking a single diag for sas_only run
416# regreport -1 -sas_only
417# I open sims.log but perform the dreamloggrep checks
418#----------------------------------------------------------------------
419 &dreamloggrep;
420 close(F);
421 $something = 1;
422 }
423
424 if(-r 'sas.log' || -r 'sas.log.gz') {
425 if(-r "sas.log") { open (F, " tail -1000 sas.log |");}
426 elsif(-r "sas.log.gz") { open (F, "$GUNZIP sas.log.gz | tail -1000 |");}
427 &sasgrep;
428 close(F);
429 $something = 1;
430 }
431
432 if(!$something) {
433 printf $rsfh "Rundir: %-40s %s\n", $diag.":0", $STATUS_NAME{'unkn'};
434 return ('unkn', 0, 0);
435 }
436
437
438#analyze failure
439#===============
440 my($long_stat, $i, $curr_line);
441
442 $long_stat= "$STATUS_NAME{'unkn'} (No Status)";
443 $status = 'unkn';
444 for($i = 0; $i < $errline_num; $i++)
445 {
446 $curr_line= $errlines[$i];
447 if($curr_line =~ /(\w+-MISMATCH)/) {
448 $long_stat= "$STATUS_NAME{'fail'} ($1)";
449 $status = 'fail';
450 last;
451 }elsif($curr_line=~/SIGDIE.*sas socket open timeout/) {
452 $long_stat= "$STATUS_NAME{'sckt'} (Socket)";
453 $status = 'sckt';
454 last;
455 }elsif($curr_line=~/ERROR - failing assertion/) {
456 $long_stat= "$STATUS_NAME{'asst'} (Monitor)";
457 $status = 'asst';
458 last;
459 }elsif($curr_line =~ /ERROR.*TIMEOUT/o) {
460 $long_stat= "$STATUS_NAME{'timo'} (Monitor)";
461 $status= 'timo' ;
462 last;
463 }elsif($curr_line =~ /ERROR:\s+Maximum Simulation Cycles\s+(.*?)\s+Reached/o) {
464 $long_stat= "$STATUS_NAME{'maxc'} $1";
465 $status = 'timo';
466 last;
467 }elsif($curr_line=~/ERROR/o) {
468 $long_stat= "$STATUS_NAME{'fail'} (Monitor)";
469 $status = 'fail';
470 last;
471 }elsif($curr_line =~ /SAS-MEM: ASSERT ERROR:/s) {
472 my($msg)= $'; #'
473 $msg=~ s/(.*)\n//; #$1 is the line after
474 $long_stat= "$STATUS_NAME{'fail'} (SAS-MEM:$1)"; # 'ASSERT ERROR:'
475 $status = 'fail';
476 last;
477 }elsif(($curr_line =~ /GOOD End/)||(!$log_exists && ($curr_line =~ /SAS hits GOOD TRAP -> PASS/))){
478 if(-r 'tsotool.log' || -r 'tsotool.log.gz') {
479 if(-r "tsotool.log") { open (F, "tsotool.log");}
480 elsif(-r "tsotool.log.gz") { open (F, "$GUNZIP tsotool.log.gz |");}
481 $tsotoolerr = &tsotoolgrep;
482 close(F);
483 }
484
485 if(-r 'diag_pl.log' || -r 'diag_pl.log.gz') {
486 if(-r "diag_pl.log") { open (F, "diag_pl.log");}
487 elsif(-r "diag_pl.log.gz") { open (F, "$GUNZIP diag_pl.log.gz |");}
488 $diagplerr = &diagplgrep;
489 close(F);
490 }
491
492 if($tsotoolerr){
493 $long_stat= "$STATUS_NAME{'fail'} tso_analyze failure";
494 $status = 'fail';
495 }
496 elsif($diagplerr){
497 $long_stat= "$STATUS_NAME{'perf'}";
498 $status = 'perf';
499 }
500 else{
501 $long_stat= "$STATUS_NAME{'pass'}";
502 $status = 'pass';
503 }
504 }elsif($curr_line =~ /no diag|midas.*error/i) {
505 $long_stat= $STATUS_NAME{'diag'};
506 $status = 'diag';
507 last;
508 }elsif($curr_line =~ /Caught a SIG/) {
509 &check_logfile (\@data);
510 if($outofmemory) {
511 $long_stat= "$STATUS_NAME{'nomem'} (Exceed Dream Memory Limit?)";
512 $status = 'nomem';
513 } else {
514 $long_stat= "$STATUS_NAME{'dream'} (Exceed Dream Time Limit?)";
515 $status = 'dream';
516 }
517 last;
518 }elsif($curr_line =~ /(simv|ncsim) run exited with error: (.*)/) {
519 $long_stat= "$STATUS_NAME{'unkn'} ($1)";
520 $status = 'unkn';
521 last;
522 }elsif($curr_line =~ /cannot connect|cannot bring up server connection|the command did not complete properly/io) {
523 $long_stat= $STATUS_NAME{'sckt'};
524 $status = 'sckt';
525 last;
526 }elsif($curr_line =~ /simics.*shaky/i) {
527 $long_stat= "$STATUS_NAME{'simx'}";
528 $status = 'simx';
529 last;
530 }elsif($sas_only && ($curr_line =~ /v:0x$bad_trap_va/i)){
531 $long_stat= "$STATUS_NAME{'fail'} SAS-MEM fail in sas_only mode BAD TRAP v:0x$bad_trap_va";
532 $status = 'fail';
533 last;
534 }elsif($sas_only && ($curr_line =~ /v:0x$hbad_trap_va/i)){
535 $long_stat= "$STATUS_NAME{'fail'} SAS-MEM fail in sas_only mode HBAD TRAP v:0x$bad_trap_va";
536 $status = 'fail';
537 last;
538 }elsif($sas_only && ($curr_line =~ /v:0x$good_trap_va/i)){
539 $long_stat= "$STATUS_NAME{'pass'} SAS-MEM pass in sas_only mode GOOD TRAP v:0x$good_trap_va";
540 $status = 'pass';
541 last;
542 }elsif($sas_only && ($curr_line =~ /v:0x$hgood_trap_va/i)){
543 $long_stat= "$STATUS_NAME{'pass'} SAS-MEM pass in sas_only mode HGOOD TRAP v:0x$good_trap_va";
544 $status = 'pass';
545 last;
546 }elsif($curr_line =~ /SAS hits MAX CYCLE -> FAIL/){
547 $long_stat= "$STATUS_NAME{'maxc'} SAS hits MAX CYCLE -> FAIL";
548 $status = 'maxc';
549 last;
550 }
551 }
552 foreach (@data) {
553 if (/Found diag under.*(verif.*\.s)/) {
554 printf $rsfh "Diag: %-70s\n","\$DV_ROOT\/".$1;last;
555 }
556 }
557 printf $rsfh "Rundir: %-40s %s\n", $diag.":0", $long_stat;
558 my $date=`date`;
559 print $rsfh "Time finished: $date";
560 for($i = 0; $i <= $#errlines; $i++){
561 next if ($errlines[$i] =~ /Vera: Loading main/);
562 print $rsfh $errlines[$i];
563 }
564 if(($status eq 'pass' || $status eq 'fail' || $status eq 'asst') && $found_sim_cyc && $found_wall_sec) {
565 printf $rsfh "Cycles=%.2f, Seconds=%.2f, C/S=%.2f\n", $sim_cyc, $wall_sec, $sim_cyc/$wall_sec;
566 }
567
568 if($diagplerr){
569 print $rsfh join '', @perf_errors;
570 }
571
572 STDOUT->autoflush(1);
573 ($status, $sim_cyc, $wall_sec);
574}
575
576#================================================================
577
578sub wait_regression {
579 my($ofile, $regress_dir) = @_; #output file, regression directory
580
581 my(@idle_char)= ('|', '/', '-', '\\');
582 my $spinner;
583 my($iter)= 0;
584 my($unfini) = 1;
585 my($last_unfini);
586 my($idle_time) = 0;
587 my($total_time) = 0;
588# increased the watchdog timer value from 20000 s to 86400 s (24 hrs)
589 my $watchdog=86400;
590 my $regress_timeout = $ENV{REGREPORT_TIMEOUT} || $watchdog;
591
592 STDOUT->autoflush(1);
593 STDERR->autoflush(1);
594 $animate= 0; #turn diag name printing/erasing
595 system("clear");
596 # Generate release history if diff_rel_<name>.log exists
597 create_rel_hist($regress_dir);
598 print STDERR $drawline;
599 print STDERR "\t\tSTATUS OF REGRESSION IN OPENSPARC T2\n";
600 print STDERR $drawline;
601
602 while($unfini) {
603 open(OUTFILE, "> $ofile") or die "cannot open $ofile";
604 $rsfh = \*OUTFILE;
605 print STDERR "\b" x $w;
606 ($unfini) = (regress_stat(1, $regress_dir))[2];
607 print STDERR "\b" x $w;
608 close(OUTFILE);
609
610
611 $spinner = $idle_char[$iter&3] x 3;
612 if(!$unfini){
613 open(OUTFILE, ">> $ofile") or die "cannot open $ofile";
614 print STDERR "\n$drawline";
615 chomp( my $regname = `basename $regress_dir`);
616 print STDERR "Regression $regname has completed\n";
617 if ($ofile =~ /^\//) {
618 print STDERR "Details are in $ofile\n";
619 } else {
620 print STDERR "Details are in $ENV{PWD}/$ofile\n";
621 }
622 print STDERR "Regression Directory is $regress_dir\n";
623 if ($total_time<3600) {
624 printf STDERR "Total Time Waited : %3d mins %3d secs\n",int($total_time/60),($total_time-(int($total_time/60)*60));
625 printf OUTFILE "Total Time Waited : %3d mins %3d secs\n",int($total_time/60),($total_time-(int($total_time/60)*60));
626 }
627 else {
628 printf STDERR "Total Time Waited : %3d hrs %3d mins\n",int($total_time/3600),int(($total_time-(int($total_time/3600)*3600))/60);
629 printf OUTFILE "Total Time Waited : %3d hrs %3d mins\n",int($total_time/3600),int(($total_time-(int($total_time/3600)*3600))/60);
630 }
631 if ($clean_pass &&
632 $group_count_stat{ALL}->{'pass'} == $group_count{'ALL'}) {
633 printf OUTFILE "Cleaning Run Directories ..\n";
634 printf STDERR "Cleaning Run Directories ..\n";
635 opendir (DIR, "$regress_dir");
636 foreach (grep(!/^\.+$/,readdir DIR)) {
637 system ("rm -rf $regress_dir/$_") if (-d "$regress_dir/$_");
638 }
639 close DIR;
640 }
641 print STDERR $drawline;
642 close OUTFILE;
643 return 0;
644 }
645 else{
646 my ($ih,$im,$th,$tm)=(0,0,0,0);
647 if ($idle_time<3600) { $im=int($idle_time/60); }
648 else { $ih=int($idle_time/3600); $im=int(($idle_time-($ih*3600))/60); }
649 if ($total_time<3600) { $tm=int($total_time/60); }
650 else { $th=int($total_time/3600); $tm=int(($total_time-($th*3600))/60); }
651 if(!$iter) { #making progress
652 printf STDERR "%-12s %6d diags remain; idle: %3d mins, total: %3d mins %-3s",'Just now started',$unfini,$im,$tm,$spinner; }
653 elsif ($last_unfini > $unfini){
654 $spinner = $idle_char[($iter++)&3] x 3;
655 print STDERR "\b" x $w;
656 if ($idle_time<3600 && $total_time<3600) {
657 printf STDERR "%-12s %6d diags remain; idle: %3d mins, total: %3d mins %-3s",'Steady progress',$unfini,$im,$tm,$spinner; }
658 elsif ($idle_time<3600 && $total_time>3600) {
659 printf STDERR "%-12s %6d diags remain; idle: %3d mins, total: %3d hrs %3d mins %-3s",'Steady progress',$unfini,$im,$th,$tm,$spinner; }
660 else { #($idle_time>3600 && $total_time>3600)
661 printf STDERR "%-12s %6d diags remain; idle: %3d hrs %3d mins, total: %3d hrs %3d mins %-3s",'Steady progress',$unfini,$ih,$im,$th,$tm,$spinner; }
662 $idle_time = 0;
663 }
664 else{
665 print STDERR "\b" x $w;
666 if ($idle_time<3600 && $total_time<3600) {
667 printf STDERR "%-12s %6d diags remain; idle: %3d mins, total: %3d mins %-3s",'No progress',$unfini,$im,$tm,$spinner; }
668 elsif ($idle_time<3600 && $total_time>3600) {
669 printf STDERR "%-12s %6d diags remain; idle: %3d mins, total: %3d hrs %3d mins %-3s",'No progress',$unfini,$im,$th,$tm,$spinner; }
670 else { #($idle_time>3600 && $total_time>3600)
671 printf STDERR "%-12s %6d diags remain; idle: %3d hrs %3d mins, total: %3d hrs %3d mins %-3s",'No progress',$unfini,$ih,$im,$th,$tm,$spinner; }
672 }
673 print STDERR "\n";
674 }
675 if($total_time > $regress_timeout){
676 print STDERR "\n$drawline";
677 if ($total_time<3600) {
678 print STDERR "Well, ",int($total_time/60)," mins ",($total_time-(int($total_time/60)*60)), "secs have passed, and the regression is not over yet!\n"; }
679 else {
680 print STDERR "Well, ",int($total_time/3600)," hrs ",int(($total_time-(int($total_time/3600)*3600))/60)," mins have passed, and the regression is not over yet!\n"; }
681 print STDERR "So, I am quitting now... Please, check the regression manually.\n";
682 print STDERR "Run \"%regreport -regenerate\" first, followed by \"%regreport <RUNDIR>\"!\n";
683 return ($unfini);
684 }
685 sleep($wait_sec) if($unfini);
686 $idle_time+= $wait_sec;
687 $total_time = (time - $start_time);
688 $iter++;
689 $last_unfini = $unfini;
690 }
691 return ($unfini);
692}
693
694#===================================================================
695sub regenerate {
696
697 my($list);
698 $list= `ls -1`;
699 my(@dir)= split("\n", $list);
700 my($diag);
701 my($i) =0;
702 foreach $diag (@dir) {
703 next if(! -d $diag);
704 next if($diag eq 'coverage' );
705 next if($diag eq 'tre' );
706 $i++;
707 print STDERR "$i: regenerating $diag\n";
708 next if(! -d $diag);
709 chdir($diag);
710 open(OUTFILE, "> status.log") or die "cannot open status.log";
711 $rsfh = \*OUTFILE;
712 chk_single_diag(".");
713 close(OUTFILE);
714 chdir('..');
715 }
716}
717
718#===================================================================
719#===================================================================
720
721sub regress_stat {
722 my ($dup_summary) = shift(@_);
723 my($regress_dir)= shift(@_);
724 my($status, $cyc, $sec);
725
726 my ($curr_dir);
727 chop($curr_dir= `pwd`);
728
729 if(-d $regress_dir){ chdir($regress_dir); }
730 else { print STDERR "Cannot chdir into $regress_dir\n"; }
731
732
733 chop($regress_dir= `pwd`);
734
735 my($i, $list, $specific_args); #list: specified diag dir list
736 $specific_args = "";
737 foreach $i (@_) {
738 $specific_args .= "$i* ";
739 }
740 if($specific_args){ $list= `ls -d1 $specific_args`;}
741 else{ $list= `ls -1`;}
742
743 my(@dir)= split("\n", $list);
744
745 my($index)= 0;
746 my($group, $diag_name);
747 my(%pass_fail_count, %pass_fail_cyc, %pass_fail_sec);
748
749#========================================
750# figure out the different groups
751#========================================
752
753 my($diag);
754 foreach $diag (@dir) {
755 next if(! -d $diag);
756 next if($diag eq 'coverage' );
757 next if($diag eq 'tre' );
758 my @diag_name_parts = split ':',$diag;
759 $group_count{$diag_name_parts[$grp_pos_in_name]} = 0 if(scalar(@diag_name_parts) > $grp_pos_in_name);
760 }
761
762 $group_count{'ALL'} = 0;
763 my(@group_list)= reverse sort keys %group_count;
764
765#========================================
766# initialize some variables
767#========================================
768 foreach my $status (%STATUS_NAME) {
769 foreach $group (@group_list) {
770 $group_count{$group}= 0;
771 $group_count_stat{$group}->{$status}= 0;
772 $pass_fail_count{$group}= 0;
773 $pass_fail_cyc{$group}= 0;
774 $pass_fail_sec{$group}= 0;
775 }
776 }
777
778#========================================
779# walk-thru all diag dir and collect info
780#========================================
781 foreach $diag (@dir) {
782 next if(! -d $diag);
783 next if($diag eq 'coverage' );
784 next if($diag eq 'tre' );
785 my @diag_name_parts = split ':',$diag;
786 $group = "";
787 if(scalar(@diag_name_parts) > $grp_pos_in_name){
788 $group= $diag_name_parts[$grp_pos_in_name];
789 if(defined $group_count{$group}){
790 ++ $group_count{$group};
791 }
792 else{
793 die "Something is wrong at walk-thru group is $group\n";
794 }
795 }
796 ++ $group_count{'ALL'};
797
798 if($animate) {
799 $diag_name= sprintf("%-60s %4d", $diag, ++$index);
800 print STDERR "\b" x $w;
801 print STDERR $diag_name; #print processed diag name
802 STDERR->autoflush(1);
803 }
804
805 print STDERR " I am here\n" if($debug);
806 ($status, $cyc, $sec)= &chk_statuslog($diag);
807 print STDERR " I am over ($status, $cyc, $sec)\n" if($debug);
808
809 ++ $group_count_stat{$group}->{$status} if ($group);
810 ++ $group_count_stat{ALL}->{$status};
811
812### to calcuate cycles per second
813#================================
814 if($sec!=0 && ($status eq 'pass')) {
815 if($group){
816 $pass_fail_count{$group} ++;
817 $pass_fail_cyc{$group}+= $cyc;
818 $pass_fail_sec{$group}+= $sec;
819 }
820 $pass_fail_count{ALL} ++;
821 $pass_fail_cyc{ALL}+= $cyc;
822 $pass_fail_sec{ALL}+= $sec;
823 }
824
825 if($animate) { print STDERR "\b" x $w; }
826 }
827 if($animate){ printf STDERR "%-60s %4d", "Total diags:", $group_count{'ALL'}; }
828
829#======================================
830# print summary information
831#======================================
832
833# Don't print status type if 0 ..
834
835my @active_types = qw(pass fail);
836foreach my $type (@status_types) {
837 next if (grep(/$type/, @active_types));
838 foreach (@group_list) {
839 if ($group_count_stat{$_}->{$type} >0) {
840 push (@active_types, $type);
841 last;
842 }
843 }
844}
845
846my $hide_summary = ! $dup_summary || $group_count_stat{'ALL'}->{unfi};
847print STDERR "\b" x 120;
848
849# header
850#=======
851 print $rsfh "\nSummary for $regress_dir\n";
852 print STDERR "\nSummary for $regress_dir\n" if (! $hide_summary);
853 foreach (@relnames) {
854 print $rsfh "Release : $_\n";
855 print STDERR "Release : $_\n" if (! $hide_summary);
856 s/v=/-v /;
857 my $hist = join(" ", `hist_obj $_ | tail -2`) ;
858 $hist =~ s/\n/ /g;
859 print $rsfh "History :$hist \n";
860 print STDERR "History :$hist \n" if (! $hide_summary);
861
862 }
863 print $rsfh $drawline;
864 print STDERR $drawline if (! $hide_summary);
865
866 printf $rsfh "%20.20s:", 'Group' ;
867 printf STDERR "%20.20s:", 'Group' if (! $hide_summary);
868 printf $rsfh "%5s |", "Total";
869 printf STDERR "%5s |", "Total" if (! $hide_summary);
870 foreach my $type (@active_types) {
871 printf $rsfh "%5s |", $status_short{$type};
872 printf STDERR "%5s |", $status_short{$type} if (! $hide_summary);
873 }
874 printf $rsfh "%20s |", "Cycles";
875 printf STDERR "%20s |", "Cycles" if (! $hide_summary);
876 printf $rsfh "%12s |", "Time";
877 printf STDERR "%12s |", "Time" if (! $hide_summary);
878 printf $rsfh "%6s |", "C/S";
879 printf STDERR "%6s |", "C/S" if (! $hide_summary);
880 print $rsfh "\n", '-' x $w, "\n";
881 print STDERR "\n", '-' x $w, "\n" if (! $hide_summary);
882
883
884# status counts
885#==============
886 foreach $group (@group_list) {
887 if ($group eq 'ALL') {
888 print $rsfh '-' x $w, "\n";
889 print STDERR '-' x $w, "\n" if (! $hide_summary);
890 }
891 printf $rsfh "%20.20s:", $group;
892 printf STDERR "%20.20s:", $group if (! $hide_summary);
893 printf $rsfh "%5d |", $group_count{$group};
894 printf STDERR "%5d |", $group_count{$group} if (! $hide_summary);
895 foreach my $type (@active_types) {
896 printf $rsfh "%5d |", $group_count_stat{$group}->{$type};
897 printf STDERR "%5d |", $group_count_stat{$group}->{$type}
898 if (! $hide_summary);
899 }
900 printf $rsfh "%20s |", $pass_fail_sec{$group} ?
901 sprintf("%20.2f",$pass_fail_cyc{$group}) : 'N/A' ;
902 if (! $hide_summary) {
903 printf STDERR "%20s |", $pass_fail_sec{$group} ?
904 sprintf("%20.2f",$pass_fail_cyc{$group}) : 'N/A' ;
905 }
906
907 printf $rsfh "%12s |", $pass_fail_sec{$group} ?
908 sprintf("%12.2f",$pass_fail_sec{$group}) : 'N/A' ;
909 if (! $hide_summary) {
910 printf STDERR "%12s |", $pass_fail_sec{$group} ?
911 sprintf("%12.2f",$pass_fail_sec{$group}) : 'N/A' ;
912 }
913 printf $rsfh "%6s |", $pass_fail_sec{$group} ?
914 sprintf("%6.2f",$pass_fail_cyc{$group}/$pass_fail_sec{$group}) : 'N/A' ;
915 if (! $hide_summary) {
916 printf STDERR "%6s |", $pass_fail_sec{$group} ?
917 sprintf("%6.2f",$pass_fail_cyc{$group}/$pass_fail_sec{$group}) : 'N/A' ;
918 }
919
920 print $rsfh "\n";
921 print STDERR "\n" if (! $hide_summary);
922 }
923
924 print $rsfh '=' x $w, "\n";
925 print STDERR '=' x $w, "\n" if (! $hide_summary);
926 print $rsfh "\n";
927 print STDERR "\n" if (! $hide_summary);
928
929 printf $rsfh "Total Diags : %20d\n", $group_count{ALL};
930 printf $rsfh "Total Passed : %20d\n", $group_count_stat{ALL}->{'pass'};
931 printf $rsfh "Total Unknown: %20d\n", $group_count_stat{ALL}->{'unkn'};
932 printf $rsfh "Total Unfini : %20d\n", $group_count_stat{ALL}->{'unfi'};
933 printf $rsfh "Total Fail : %20d\n", $group_count_stat{ALL}->{'fail'} +
934 $group_count_stat{ALL}->{'asst'} +
935 $group_count_stat{ALL}->{'perf'} +
936 $group_count_stat{ALL}->{'timo'} +
937 $group_count_stat{ALL}->{'maxc'} ;
938 printf $rsfh "Total Cycles : %20s\n", $pass_fail_sec{ALL} ?
939 sprintf("%20.2f", $pass_fail_cyc{ALL}) : 'N/A';
940 printf $rsfh "Total Time : %20s\n", $pass_fail_sec{ALL} ?
941 sprintf("%20.2f", $pass_fail_sec{ALL}) : 'N/A';
942 printf $rsfh "Average C/S : %20s\n", $pass_fail_sec{ALL} ?
943 sprintf("%20.2f",$pass_fail_cyc{ALL}/$pass_fail_sec{ALL}) : 'N/A';
944
945 if (!$hide_summary) {
946 printf STDERR "Total Diags : %20d\n", $group_count{ALL};
947 printf STDERR "Total Passed : %20d\n", $group_count_stat{ALL}->{'pass'};
948 printf STDERR "Total Unknown: %20d\n", $group_count_stat{ALL}->{'unkn'};
949 printf STDERR "Total Unfini : %20d\n", $group_count_stat{ALL}->{'unfi'};
950 printf STDERR "Total Fail : %20d\n", $group_count_stat{ALL}->{'fail'} +
951 $group_count_stat{ALL}->{'asst'} +
952 $group_count_stat{ALL}->{'perf'} +
953 $group_count_stat{ALL}->{'timo'} +
954 $group_count_stat{ALL}->{'maxc'} ;
955 printf STDERR "Total Cycles : %20s\n", $pass_fail_sec{ALL} ?
956 sprintf("%20.2f", $pass_fail_cyc{ALL}) : 'N/A';
957 printf STDERR "Total Time : %20s\n", $pass_fail_sec{ALL} ?
958 sprintf("%20.2f", $pass_fail_sec{ALL}) : 'N/A';
959 printf STDERR "Average C/S : %20s\n", $pass_fail_sec{ALL} ?
960 sprintf("%20.2f",$pass_fail_cyc{ALL}/$pass_fail_sec{ALL}) : 'N/A';
961 }
962
963 print $rsfh '=' x $w, "\n";
964 print STDERR '=' x $w, "\n" if (! $hide_summary);
965 print $rsfh "\n";
966 print STDERR "\n" if (! $hide_summary);
967
968
969
970
971# details
972#========
973 foreach my $group (@group_list){
974 print $rsfh $drawline;
975 if($group eq 'ALL'){
976 print $rsfh "\n\nDetails for ALL not in other groups\n";
977 }
978 else{
979 print $rsfh "\n\nDetails for $group\n";
980 }
981 print $rsfh $drawline;
982 my ($print_header);
983 foreach my $type (@status_types) {
984 next if ($fails_only && $type eq "pass");
985 $print_header = 0;
986 foreach my $diag (sort keys %stats) {
987 my @diag_name_parts = split ':',$diag;
988 if(($stats{$diag} eq $type) &&
989 (((scalar(@diag_name_parts) > $grp_pos_in_name) && ($group eq $diag_name_parts[$grp_pos_in_name])) ||
990 ((scalar(@diag_name_parts) <= $grp_pos_in_name) && ($group eq 'ALL')))
991 )
992 {
993 if(!$print_header){
994 print $rsfh "$STATUS_NAME{$type}:\n";
995 print $rsfh "===================\n";
996 $print_header = 1;
997 }
998 if(defined($diag) && defined($stat_details{$diag})) {
999 print $rsfh "Rundir: $diag\n";
1000 print $rsfh join ('',@{$stat_details{$diag}});
1001 }else{
1002 print $rsfh "\$stat_details{\$diag} is not defined for diag $diag";
1003 }
1004 print $rsfh $drawline;
1005 }
1006 }
1007 }
1008 }
1009
1010 # Added ending status here again..
1011
1012#======================================
1013# print summary information
1014#======================================
1015
1016
1017$hide_summary = ! $dup_summary || $group_count_stat{'ALL'}->{unfi};
1018print STDERR "\b" x 120;
1019
1020 print $rsfh $drawline;
1021 print STDERR $drawline if (! $hide_summary);
1022# header
1023#=======
1024 print $rsfh "\nSummary for $regress_dir\n";
1025 print STDERR "\nSummary for $regress_dir\n" if (! $hide_summary);
1026 foreach (@relnames) {
1027 print $rsfh "Release : $_\n";
1028 print STDERR "Release : $_\n" if (! $hide_summary);
1029 }
1030 print $rsfh $drawline;
1031 print STDERR $drawline if (! $hide_summary);
1032 printf $rsfh "%20.20s:", 'Group' ;
1033 printf STDERR "%20.20s:", 'Group' if (! $hide_summary);
1034 printf $rsfh "%5s |", "Total";
1035 printf STDERR "%5s |", "Total" if (! $hide_summary);
1036 foreach my $type (@active_types) {
1037 printf $rsfh "%5s |", $status_short{$type};
1038 printf STDERR "%5s |", $status_short{$type} if (! $hide_summary);
1039 }
1040 printf $rsfh "%20s |", "Cycles";
1041 printf STDERR "%20s |", "Cycles" if (! $hide_summary);
1042 printf $rsfh "%12s |", "Time";
1043 printf STDERR "%12s |", "Time" if (! $hide_summary);
1044 printf $rsfh "%6s |", "C/S";
1045 printf STDERR "%6s |", "C/S" if (! $hide_summary);
1046 print $rsfh "\n", '-' x $w, "\n";
1047 print STDERR "\n", '-' x $w, "\n" if (! $hide_summary);
1048
1049
1050# status counts
1051#==============
1052 foreach $group (@group_list) {
1053 if ($group eq 'ALL') {
1054 print $rsfh '-' x $w, "\n";
1055 print STDERR '-' x $w, "\n" if (! $hide_summary);
1056 }
1057 printf $rsfh "%20.20s:", $group;
1058 printf STDERR "%20.20s:", $group if (! $hide_summary);
1059 printf $rsfh "%5d |", $group_count{$group};
1060 printf STDERR "%5d |", $group_count{$group} if (! $hide_summary);
1061 foreach my $type (@active_types) {
1062 printf $rsfh "%5d |", $group_count_stat{$group}->{$type};
1063 printf STDERR "%5d |", $group_count_stat{$group}->{$type}
1064 if (! $hide_summary);
1065 }
1066 printf $rsfh "%20s |", $pass_fail_sec{$group} ?
1067 sprintf("%20.2f", $pass_fail_cyc{$group}) : 'N/A' ;
1068 if (! $hide_summary) {
1069 printf STDERR "%20s |", $pass_fail_sec{$group} ?
1070 sprintf("%20.2f", $pass_fail_cyc{$group}) : 'N/A' ;
1071 }
1072
1073 printf $rsfh "%12s |", $pass_fail_sec{$group} ?
1074 sprintf("%12.2f",$pass_fail_sec{$group}) : 'N/A' ;
1075 if (! $hide_summary) {
1076 printf STDERR "%12s |", $pass_fail_sec{$group} ?
1077 sprintf("%12.2f",$pass_fail_sec{$group}) : 'N/A' ;
1078 }
1079 printf $rsfh "%6s |", $pass_fail_sec{$group} ?
1080 sprintf("%6.2f",$pass_fail_cyc{$group}/$pass_fail_sec{$group}) : 'N/A' ;
1081 if (! $hide_summary) {
1082 printf STDERR "%6s |", $pass_fail_sec{$group} ?
1083 sprintf("%6.2f",$pass_fail_cyc{$group}/$pass_fail_sec{$group}) : 'N/A' ;
1084 }
1085
1086 print $rsfh "\n";
1087 print STDERR "\n" if (! $hide_summary);
1088 }
1089
1090 print $rsfh '=' x $w, "\n";
1091 print STDERR '=' x $w, "\n" if (! $hide_summary);
1092 print $rsfh "\n";
1093 print STDERR "\n" if (! $hide_summary);
1094
1095 printf $rsfh "Total Diags : %20d\n", $group_count{ALL};
1096 printf $rsfh "Total Passed : %20d\n", $group_count_stat{ALL}->{'pass'};
1097 printf $rsfh "Total Unknown: %20d\n", $group_count_stat{ALL}->{'unkn'};
1098 printf $rsfh "Total Unfini : %20d\n", $group_count_stat{ALL}->{'unfi'};
1099 printf $rsfh "Total Fail : %20d\n", $group_count_stat{ALL}->{'fail'} +
1100 $group_count_stat{ALL}->{'asst'} +
1101 $group_count_stat{ALL}->{'perf'} +
1102 $group_count_stat{ALL}->{'timo'} +
1103 $group_count_stat{ALL}->{'maxc'} ;
1104 printf $rsfh "Total Cycles : %20s\n", $pass_fail_sec{ALL} ?
1105 sprintf("%20.2f", $pass_fail_cyc{ALL}) : 'N/A';
1106 printf $rsfh "Total Time : %20s\n", $pass_fail_sec{ALL} ?
1107 sprintf("%20.2f", $pass_fail_sec{ALL}) : 'N/A';
1108 printf $rsfh "Average C/S : %20s\n", $pass_fail_sec{ALL} ?
1109 sprintf("%20.2f",$pass_fail_cyc{ALL}/$pass_fail_sec{ALL}) : 'N/A';
1110 if (!$hide_summary) {
1111 printf STDERR "Total Diags : %20d\n", $group_count{ALL};
1112 printf STDERR "Total Passed : %20d\n", $group_count_stat{ALL}->{'pass'};
1113 printf STDERR "Total Unknown: %20d\n", $group_count_stat{ALL}->{'unkn'};
1114 printf STDERR "Total Unfini : %20d\n", $group_count_stat{ALL}->{'unfi'};
1115 printf STDERR "Total Fail : %20d\n", $group_count_stat{ALL}->{'fail'} +
1116 $group_count_stat{ALL}->{'asst'} +
1117 $group_count_stat{ALL}->{'perf'} +
1118 $group_count_stat{ALL}->{'timo'} +
1119 $group_count_stat{ALL}->{'maxc'} ;
1120 printf STDERR "Total Cycles : %20s\n", $pass_fail_sec{ALL} ?
1121 sprintf("%20.2f", $pass_fail_cyc{ALL}) : 'N/A';
1122 printf STDERR "Total Time : %20s\n", $pass_fail_sec{ALL} ?
1123 sprintf("%20.2f", $pass_fail_sec{ALL}) : 'N/A';
1124 printf STDERR "Average C/S : %20s\n", $pass_fail_sec{ALL} ?
1125 sprintf("%20.2f",$pass_fail_cyc{ALL}/$pass_fail_sec{ALL}) : 'N/A';
1126 }
1127 print $rsfh "\n";
1128 print STDERR "\n" if (! $hide_summary);
1129 print $rsfh '=' x $w, "\n";
1130 print STDERR '=' x $w, "\n" if (! $hide_summary);
1131 my $ttime = time() - $start_time;
1132 my $hrs = int($ttime/3600);
1133 my $mins = int(($ttime-($hrs*3600))/60);
1134 my $secs = $ttime-($hrs*3600)-($mins*60);
1135 printf $rsfh "Time Waited : %6d hrs, %2d mins, %2d secs\n",$hrs,$mins,$secs;
1136 if (! $hide_summary) {
1137 printf STDERR "Time Waited : %6d hrs, %2d mins, %2d secs\n",$hrs,$mins,$secs;
1138 }
1139 print $rsfh '=' x $w, "\n";
1140 print STDERR '=' x $w, "\n" if (! $hide_summary);
1141 print $rsfh "\n";
1142 print STDERR "\n" if (! $hide_summary);
1143
1144 chdir ($curr_dir) || die " Something went wrong with changing directories\n";
1145 return ($group_count{'ALL'}, $group_count_stat{'ALL'}->{'pass'},
1146 $group_count_stat{'ALL'}->{'unfi'});
1147
1148}
1149#====================================================================
1150sub get_status {
1151 my($l)= @_;
1152 my($status)= 'unkn';
1153 foreach my $st (keys %STATUS_NAME) {
1154 if($l=~ /$STATUS_NAME{$st}/) {
1155 $status= $st;
1156 last;
1157 }
1158 }
1159 $status;
1160}
1161#======================================================================
1162
1163sub cleanup {
1164 my($int_type) = shift;
1165 print "\nSomebody sent me a $int_type signal\nQuitting...\n";
1166 exit 1;
1167}
1168#===================================================================
1169sub sim_grep
1170{
1171 my $zin_err=0; my $f=1;
1172 foreach(@{$_[0]})
1173 {
1174 next if (/Sims Build Cmd|Sims Build Args/);
1175 if (/Vera: Loading main \"cmp._top\"/) { $f=1; }
1176 elsif (/Vera: Loading main \"fc._top\"/) { $f=1000; }
1177 elsif (/(\d+):.*regreport clock period:\s*(\d+).*$/) {
1178 $sim_cyc= $1/($2/$f);
1179 $found_sim_cyc = 1;
1180 }
1181 elsif(/CPU Time:\s+(\d+\.\d+)/ && ($sim eq 'vcs') ) {
1182 $wall_sec= $1;
1183 $found_wall_sec = 1;
1184 }
1185 elsif (/^Time: \d+ (\w)s/ && ($sim eq 'vcs') ) {
1186 if ($1 eq 'f') { $sim_cyc/=1000;}
1187 }
1188 elsif (/ncsim: CPU Usage \- \d+\.\ds system \+ (\d+\.\d)s user \= \d+\.\ds total \(\d+\.\ds\, \d+\.\d\% cpu\)/ && ($sim eq 'ncv') ) {
1189 $wall_sec = $1;
1190 $found_wall_sec = 1;
1191 }
1192 elsif (/0-In ERROR /) {
1193 $zin_err = 1;
1194 if ($sim eq 'vcs') {
1195 $errlines[$errline_num++] = "vcs.log: ". $_; }
1196 elsif ($sim eq 'ncv') {
1197 $errlines[$errline_num++] = "ncsim.log: ". $_; }
1198 } else {
1199 if ($sim eq 'vcs') {
1200 $errlines[$errline_num++] = "vcs.log: ". $_; }
1201 elsif ($sim eq 'ncv') {
1202 $errlines[$errline_num++] = "ncsim.log: ". $_; }
1203 }
1204 }
1205 print "finished sim_grep errlines = $errline_num\n" if($debug);
1206}
1207
1208#===================================================================
1209sub sasgrep{
1210 while(<F>){
1211 if(/ERROR|SIGDIE|unknown command|pass/){
1212 $errlines[$errline_num++] = $_;}
1213 }
1214 print "finished sasgrep errlines = $errline_num\n" if($debug);
1215}
1216
1217#===================================================================
1218sub tsotoolgrep{
1219
1220 print "doing tsotool grep\n";
1221 my($tsotool_err) = 1;
1222 while(<F>){
1223 if (/fatal/io){ $tsotool_err = 1; last;}
1224 elsif(/verifying graph invariants.*ok/i){ $tsotool_err = 0;}
1225 }
1226 print "finished tsotool grep\n" if($debug);
1227
1228 return $tsotool_err;
1229}
1230
1231#===================================================================
1232sub diagplgrep{
1233 print "doing diagpl grep\n" if($debug);
1234 my($diagpl_err) = 0;
1235 @perf_errors = ();
1236 my $print1 = 0;
1237
1238 while(<F>){
1239
1240 if($print1){
1241 $print1 = 0;
1242 push @perf_errors, ($_);
1243 }
1244
1245 if(/fail/i){
1246 $diagpl_err = 1;
1247 $print1 = 1;
1248 push @perf_errors, ($_);
1249 }
1250 elsif(/error/i){
1251 $diagpl_err = 1;
1252 }
1253 }
1254 return $diagpl_err;
1255}
1256
1257#===================================================================
1258sub midasgrep{
1259 print "doing midas grep\n" if($debug);
1260 while(<F>){
1261 if(/\berror\b/io){$errlines[$errline_num++] = $_;}
1262 }
1263}
1264#===================================================================
1265sub dreamloggrep{
1266 while(<F>){
1267 if(/ncv_run|vcs_run|no-warn-mismatch/io){ next;}
1268 elsif(/no diag/io){ $errlines[$errline_num++] = $_;}
1269 elsif(/ERROR|SIGDIE/o){ $errlines[$errline_num++] = $_;}
1270 elsif(/getting shaky|pass|reaching max cycles/io){
1271 $errlines[$errline_num++] = $_;}
1272
1273 elsif(/missing terminating|no diag found/io){ $errlines[$errline_num++] = $_;}
1274 elsif(/Caught a SIG/io){ $errlines[$errline_num++] = $_;}
1275 elsif($sas_only && /v:0x$good_trap_va/i){
1276 $errlines[$errline_num++] = $_;
1277 last;
1278 }
1279 elsif($sas_only && /v:0x$hgood_trap_va/i){
1280 $errlines[$errline_num++] = $_;
1281 last;
1282 }
1283 elsif($sas_only && /v:0x$bad_trap_va/i){
1284 $errlines[$errline_num++] = $_;
1285 last;
1286 }
1287 elsif($sas_only && /v:0x$hbad_trap_va/i){
1288 $errlines[$errline_num++] = $_;
1289 last;
1290 }
1291 elsif(/SAS hits MAX CYCLE -> FAIL/){ $errlines[$errline_num++] = $_;}
1292 }
1293 print "finished dreamlog errlines = $errline_num\n" if($debug);
1294}
1295
1296#=======================================================================
1297sub create_rel_hist {
1298 my $regress_dir = shift(@_);
1299
1300 # Look for diff_rel*.log files
1301 opendir(REGDIR, $regress_dir);
1302 my @diffiles = grep(/diff_rel.*\.log/, readdir(REGDIR));
1303 closedir (REGDIR);
1304 foreach (@diffiles) {
1305 next if (-z "$regress_dir/$_");
1306 chomp(my $fullrelname = `head -1 $regress_dir/$_`);
1307 my ($suffix) = m/diff_rel(.*)\.log/o;
1308 # Pick up local release ..
1309 $fullrelname =~ s/S.*\|\s+(:\/rel\/\S+\s+v=\S+).*/$1/;
1310 $fullrelname =~ s/\[/@/o; $fullrelname =~ s/local\(|\)|\]//go;
1311 if (! grep(/$fullrelname/, @relnames)) {push (@relnames, $fullrelname);}
1312 my ($relname, $ver) = $fullrelname =~ m/@(\w+)\s+v=(\w+:\d+\.\d+)/o;
1313 if (! -e "$regress_dir/hist_rel$suffix.log") {
1314 system("hist_obj -limit 5 :/rel/\@$relname > $regress_dir/hist_rel$suffix.log");
1315 }
1316 }
1317}
1318#=======================================================================
1319sub cutitup{
1320
1321 my @initial_list = ();
1322 if(! -e 'regreport.log'){
1323 print "Could not cut up regreport.log\n";
1324 exit 0;
1325 }
1326 else{
1327 print STDERR "cutitup (cut it up) function activated... \n";
1328 open(F, " regreport.log");
1329 my $details_on = 0;
1330 while(<F>){
1331 if(/Details for ALL not in other groups/){
1332 next;
1333 }elsif(/Details for\s(\w+)/){
1334 print STDERR "creating regreport.$1.log\n";
1335 if(!$details_on){ $details_on = 1; }
1336 else{ close(CGF); }
1337 open(CGF, "> regreport.$1.log") or die " Cannot open regreport.$1.log\n";
1338 print CGF join ('',@initial_list);
1339 print CGF $_;
1340 } elsif(!$details_on){
1341 push @initial_list, $_;
1342 }
1343 elsif($details_on){
1344 print CGF $_;
1345 }
1346 }
1347 if($details_on){ close(CGF); }
1348 close(F);
1349 }
1350}
1351#=======================================================================
1352sub check_logfile
1353{
1354 $outofmemory = 0;
1355
1356 foreach(@{$_[0]})
1357 {
1358 if((/License installation error.\s+\$HOME_0IN does not contain a valid license installation./) ||
1359 (/vera_io_printf malloc failed/) ||
1360 (/Out of memory/) ||
1361 (/Fatal: Out of memory/) ||
1362 (/Fatal!\s+not enough memory\s+\[F0\]/)) { # one way that Axis fails
1363 $outofmemory = 1;
1364 $outofmemory_sig = $_;
1365 last;
1366 }
1367 }
1368 close(L);
1369 print "finished check_logfile outofmemory = $outofmemory\n" if($debug);
1370
1371}
1372
1373#=======================================================================
1374#=======================================================================
1375
1376sub rerun_diag {
1377 my($diag)= @_;
1378 my($rerun_status) = 0;
1379 if(-d 'first_run') {
1380 print STDERR "Not rerunning diag $diag because it has already been rerun once.\n";
1381 } else {
1382 # check that the diag didn't exceed the amt of memory it requested
1383 my($drmhost,$drmjobnum) = split(" ",$dreamjobid);
1384 my $drmcmd = "drmstat -h $drmhost -c -vvv $drmjobnum";
1385 open(DRMUSR, "$drmcmd |") || die "Cannot open output of: $drmcmd\n";
1386 my $freeram = 0;
1387 my $virtsize = 1;
1388
1389 while (<DRMUSR>) {
1390 if (/freeram\s+(\d+)/) {
1391 $freeram = $1; # in megabytes
1392 } elsif (/Virtual Size:\s+(\d+)K/) {
1393 $virtsize = $1 >> 10;# in kilobytes, convert to megabytes
1394 }
1395 }
1396 close(DRMUSR);
1397
1398 if( $freeram < $virtsize ) {
1399 printf STDERR "Not rerunning diag $diag because it used more ram (%d meg) than it requested (%d meg)\n", $freeram, $virtsize;
1400 } else {
1401
1402 print STDERR "\nRerunning diag $diag because it ran out of memory.\n";
1403
1404 # make first_run directory and copy log files into it.
1405 my $status = &my_system('/bin/mkdir first_run && /bin/cp *.log first_run/ && /bin/rm -f status.log');
1406 if ($status) {
1407 print STDERR "ERROR: Problem creating first_run directory or copying/removing log files : status=$status\n";
1408 }
1409
1410 # disable the Dream back which has run out of memory, but if it has not been disabled
1411 $drmcmd = "drmback -q $dreamback";
1412 open(DRMUSR, "$drmcmd |") || die "Cannot open output of: $drmcmd\n";
1413 my $drmback_is_disabled = 0;
1414 my $lineno = 0;
1415 while (<DRMUSR>) {
1416 $lineno++;
1417 if (($lineno==1) || ($lineno==2)) {
1418 next;
1419 } elsif (/$dreamback/) {
1420 $drmback_is_disabled = 1;
1421 }
1422 }
1423 close(DRMUSR);
1424 if ($drmback_is_disabled == 0 ) {
1425 $drmcmd = "drmdisable -b $dreamback -c 'drmjobid $dreamjobid died due to lack of memory'";
1426 $status = &my_system("$drmcmd");
1427 if ($status) {
1428 print STDERR "ERROR: Problem disabling dream back : status=$status\n";
1429 }
1430 }
1431
1432 # re-submit the failed diag
1433 $status = &my_system('sims -rerun -overwrite -indrm');
1434 if ($status) {
1435 print STDERR "ERROR: Problem rerunning job : status=$status\n";
1436 }
1437
1438 # send the email
1439 my $mailto = $ENV{USER};
1440 $mailto .= " email_address";
1441
1442 my $subject = "Dream job $dreamjobid died on $dreamback due to lack of memory";
1443
1444 my $mailfile = "regreport.mail";
1445 open( RMAIL, ">$mailfile");
1446 printf RMAIL "$ENV{USER},\n";
1447 printf RMAIL "Your dream job $dreamjobid running on $dreamback died due to lack of memory,\n";
1448 printf RMAIL "with signature: $outofmemory_sig\n";
1449 printf RMAIL "It was using $virtsize meg, less than the requested $freeram meg of memory.\n";
1450 printf RMAIL "It was running in directory: $ENV{PWD}\n";
1451 printf RMAIL "When your regression/regreport completes, the dream back will *not*\n";
1452 printf RMAIL "be automaticly re-enabled. Please re-enable it yourself with\n";
1453 printf RMAIL "the command: drmback -n $dreamback\n\n";
1454
1455 printf RMAIL "running: /bin/rsh $dreamback '/bin/tail /var/adm/messages; /usr/dist/exe/top -b -o size'\n";
1456 open( RSH, "/bin/rsh $dreamback '/bin/tail /var/adm/messages; /usr/dist/exe/top -b -o size' |");
1457 while (<RSH>) {
1458 print RMAIL "$_";
1459 }
1460 close(RSH);
1461 close(RMAIL);
1462 $status = &my_system ("/bin/mailx -s \"$subject\" $mailto < $mailfile ");
1463 if ($status) {
1464 print STDERR "ERROR: Problem sending email : status=$status\n";
1465 }
1466 my_system("rm $mailfile");
1467
1468 $rerun_status = 1;
1469 }
1470 }
1471 return $rerun_status; # Return the status
1472}
1473
1474###############################################################################
1475#
1476# my_system() - This is a substition function for the built-in Perl
1477# system() function call. It's needed because Perl's system()
1478# function masks out SIGINT and SIGQUIT. What that means is
1479# there is no way to stop the Perl script once it gets
1480# started because the SIGINT/SIGQUIT are ignored.
1481#
1482###############################################################################
1483sub my_system {
1484 print STDERR "my_system: cmd = @_\n" if ($debug);
1485 my $pid;
1486 if ($pid = fork) {
1487 waitpid ($pid, 0);
1488 } else {
1489 unless (exec @_) {
1490 print STDERR "ERROR: Unable to execute command $_[0].\n";
1491 exit 1;
1492 }
1493 }
1494
1495 return ($? >> 8); # Return the status
1496}
1497
1498#=======================================================================
1499
15001;
1501__END__
1502# Below is stub documentation for your module. You'd better edit it!
1503
1504=head1 NAME
1505
1506Regreport
1507
1508=head1 SYNOPSIS
1509
1510use Regreport;
1511
1512Regreport - looks for *.log files in a directory and reports status.
1513Performs the above in all the directories of a regression
1514directory.
1515
1516=head1 ABSTRACT
1517
1518This is a general module for Niagara regression status reporting.
1519
1520=head1 DESCRIPTION
1521
1522Not updated yet.
1523
1524regreport processes the command line
1525arguments and looks for the following:
1526 <options> [<directory> [<list>]]
1527
1528<options>:
1529 -1: print report for the specified or
1530 current-directory diag;
1531 -regress <file>: in regression mode,
1532 writes summary status for finished
1533 diags to <directory>/<file> until all diags
1534 are finished. NOTE: if some diag does not produce
1535 status, regreport will wait forever.
1536
1537 -ver print version number and exit.
1538
1539 -sas_only - vcs/ncverilog will not run, only sas will run.
1540
1541 -[no]cut_name - cuts the last number from sss:sss:ssss:ddd formatted name.
1542
1543 -regenerate - will regenerate the status.log files in the diag directories.
1544
1545 <directory> [<list>]:
1546 print report for all diags under <directory>. <list> is
1547 0 or more of simulation 'group' names, such as 'sparc0', 'cmp', 'cmp1',
1548 'cmp8', etc. When nothing specified, all groups are included.
1549-------------------
1550chk_single_diag is an exported function which takes a directory name as
1551an argument and expect a vcs/ncverilog simulation run there. It analyzes the results
1552and reports.
1553-------------------
1554
1555=head2 EXPORT
1556
1557chk_single_diag and others
1558
1559=head1 SEE ALSO
1560
1561=head1 AUTHOR
1562
1563
1564=head1 COPYRIGHT AND LICENSE
1565
1566
1567
1568=cut