OpenCores
URL https://opencores.org/ocsvn/w11/w11/trunk

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.74/] [tools/] [bin/] [dmscntanal] - Blame information for rev 38

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 34 wfjm
#!/usr/bin/perl -w
2
# $Id: dmscntanal 721 2015-12-29 17:50:50Z mueller $
3
#
4
# Copyright 2015- by Walter F.J. Mueller 
5
#
6
# This program is free software; you may redistribute and/or modify it under
7
# the terms of the GNU General Public License as published by the Free
8
# Software Foundation, either version 2, or at your option any later version.
9
#
10
# This program is distributed in the hope that it will be useful, but
11
# WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
12
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13
# for complete details.
14
#
15
#  Revision History:
16
# Date         Rev Version  Comment
17
# 2015-06-28   696   1.0    Initial version
18
#
19
 
20
use 5.14.0;                                 # require Perl 5.14 or higher
21
use strict;                                 # require strict checking
22
 
23
use Getopt::Long;
24
 
25
my %opts = ();
26
 
27
GetOptions(\%opts, "help", "raw")
28
  or die "bad options";
29
 
30
sub print_help;
31
sub read_file;
32
sub show_raw;
33
sub add_groups;
34
sub group_new;
35
 
36
my @snum2nam;
37
my %snam2num;
38
my %dat_all;
39
my %dat_km;
40
my %dat_um;
41
my $sum_all;
42
my $sum_km;
43
my $sum_um;
44
 
45
autoflush STDOUT 1 if (-p STDOUT);          # autoflush if output into pipe
46
 
47
if (exists $opts{help}) {
48
  print_help;
49
  exit 0;
50
}
51
 
52
foreach my $file (@ARGV) {
53
  read_file($file);
54
  add_groups();
55
  show_raw() if exists $opts{raw};
56
  show_frac();
57
}
58
 
59
#-------------------------------------------------------------------------------
60
 
61
sub read_file {
62
  my ($file) = @_;
63
 
64
  %dat_km   = ();
65
  %dat_um   = ();
66
  %dat_all  = ();
67
  @snum2nam = ();
68
  %snam2num = ();
69
  $sum_all = 0;
70
  $sum_km  = 0;
71
  $sum_um  = 0;
72
 
73
  open IFILE,"<$file" or die "failed to open $file";
74
 
75
  while () {
76
    chomp;
77
    next if m/^#/;
78
    if (m/^\s*([[:xdigit:]]+)
79
          \s+(\w+)
80
          \s+(\d+)
81
          \s+(\d+)
82
          \s+(\d+)/x) {
83
      my $snum = hex($1);
84
      my $snam = $2;
85
      my $all  = 1. * "$3.";
86
      my $km   = 1. * "$4.";
87
      my $um   = 1. * "$5.";
88
 
89
      $snum2nam[$snum] = $snam;
90
      $snam2num{$snam} = $snum;
91
 
92
      $dat_all{$snam} += $all;
93
      $dat_km{$snam}  += $km;
94
      $dat_um{$snam}  += $um;
95
 
96
      $sum_all += $all;
97
      $sum_km  += $km;
98
      $sum_um  += $um;
99
 
100
    } else {
101
      printf STDERR "bad line: $_\n";
102
    }
103
  }
104
 
105
  close IFILE;
106
 
107
}
108
 
109
#-------------------------------------------------------------------------------
110
 
111
sub show_raw {
112
  print "#\n";
113
  print "#sn state                      all          km         usm" .
114
        "    all%    km%   usm%\n";
115
  printf "#   sum_all            %11.0f %11.0f %11.0f  %6.2f %6.2f %6.2f\n",
116
    $sum_all, $sum_km, $sum_um,
117
      get_frac(100., $sum_all, $sum_all),
118
      get_frac(100., $sum_km,  $sum_all),
119
      get_frac(100., $sum_um,  $sum_all);
120
 
121
  for (my $snum=0; $snum
122
    my $snam = $snum2nam[$snum];
123
    next unless defined $snam;
124
    printf "%3.3x %-18s %11.0f %11.0f %11.0f  %6.2f %6.2f %6.2f\n",
125
      $snum, $snam, $dat_all{$snam}, $dat_km{$snam}, $dat_um{$snam},
126
        get_frac(100., $dat_all{$snam}, $sum_all),
127
        get_frac(100., $dat_km{$snam},  $sum_km),
128
        get_frac(100., $dat_um{$snam}, $sum_um);
129
  }
130
}
131
 
132
#-------------------------------------------------------------------------------
133
 
134
sub show_frac {
135
  print "#\n";
136
  print "#   Ratio                       all       km      usm\n";
137
  print_frac('%','cycles busy',           'g_sum_exec',   'g_sum');
138
  print_frac('%','cycles cpmem',          'g_cp_mem',     'g_sum');
139
  print_frac('%','cycles wextra',         'g_all_wextra', 'g_sum_exec');
140
  print_frac('%','cycles jsr+rts',        'g_op_jsrrts',  'g_sum_exec');
141
  print_frac('%','cycles int+rti',        'g_intrti',     'g_sum_exec');
142
  print_frac('%','ifetch/idecode',        's_ifetch',     's_idecode');
143
  print_frac('%','flow cntl/idecode',     'g_flow',       's_idecode');
144
  print_frac('%','  br/idecode',          's_op_br',      's_idecode');
145
  print_frac('%','  sob/idecode',         's_op_sob',     's_idecode');
146
  print_frac('%','  jmp/idecode',         's_opa_jmp',    's_idecode');
147
  print_frac('%','  jsr/idecode',         's_opa_jsr',    's_idecode');
148
  print_frac('%','  rts/idecode',         's_op_rts',     's_idecode');
149
  print_frac(' ','cycles/idecode (cpi)',  'g_sum_exec',   's_idecode');
150
  print_frac(' ','  fetdec/idecode',      'g_ifetdec',    's_idecode');
151
  print_frac(' ','  srcr/idecode',        'g_srcr',       's_idecode');
152
  print_frac(' ','  dstr/idecode',        'g_dstr',       's_idecode');
153
  print_frac(' ','  dstw/idecode',        'g_dstw',       's_idecode');
154
  print_frac(' ','  dsta/idecode',        'g_dsta',       's_idecode');
155
  print_frac(' ','ifetch_w/ifetch',       's_ifetch_w',   's_ifetch');
156
  print_frac(' ','wextra/idecode',        'g_all_wextra', 's_idecode');
157
}
158
 
159
#-------------------------------------------------------------------------------
160
 
161
sub print_frac {
162
  my ($pre,$text,$nom,$denom) = @_;
163
 
164
  die "print_frac: bad key '$nom'"    unless defined $snam2num{$nom};
165
  die "print_frac: bad key '$denom'"  unless defined $snam2num{$denom};
166
 
167
  my $fact = ($pre eq '%') ? 100. : 1.;
168
  printf "    %-22s  %7.2f%s %7.2f%s %7.2f%s\n",
169
    $text,
170
    get_frac($fact, $dat_all{$nom}, $dat_all{$denom}), $pre,
171
    get_frac($fact, $dat_km{$nom},  $dat_km{$denom}),  $pre,
172
    get_frac($fact, $dat_um{$nom},  $dat_um{$denom}),  $pre;
173
}
174
 
175
#-------------------------------------------------------------------------------
176
 
177
sub get_frac {
178
  my ($fact,$nom,$denom) = @_;
179
  $denom = 1. unless $denom > 0.;
180
  return $fact*($nom/$denom);
181
}
182
 
183
#-------------------------------------------------------------------------------
184
 
185
sub add_groups {
186
  group_new(0x100, 'g_sum');
187
  $dat_all{g_sum} = $sum_all;
188
  $dat_km{g_sum}  = $sum_km;
189
  $dat_um{g_sum}  = $sum_um;
190
 
191
  group_new(0x110, 'g_cp',
192
            's_cp_regread',
193
            's_cp_rps',
194
            's_cp_memr_w',
195
            's_cp_memw_w');
196
 
197
  group_new(0x111, 'g_cp_mem',
198
            's_idle',
199
            's_cp_memr_w',
200
            's_cp_memw_w',
201
            '-',
202
            's_int_ext');
203
 
204
  group_new(0x112, 'g_ifetdec',
205
            's_ifetch',
206
            's_ifetch_w',
207
            's_idecode');
208
 
209
  group_new(0x113, 'g_srcr',
210
            's_srcr_def',
211
            's_srcr_def_w',
212
            's_srcr_inc',
213
            's_srcr_inc_w',
214
            's_srcr_dec',
215
            's_srcr_dec1',
216
            's_srcr_ind',
217
            's_srcr_ind1_w',
218
            's_srcr_ind2',
219
            's_srcr_ind2_w');
220
 
221
  group_new(0x114, 'g_dstr',
222
            's_dstr_def',
223
            's_dstr_def_w',
224
            's_dstr_inc',
225
            's_dstr_inc_w',
226
            's_dstr_dec',
227
            's_dstr_dec1',
228
            's_dstr_ind',
229
            's_dstr_ind1_w',
230
            's_dstr_ind2',
231
            's_dstr_ind2_w');
232
 
233
  group_new(0x115, 'g_dstw',
234
            's_dstw_def',
235
            's_dstw_def_w',
236
            's_dstw_inc',
237
            's_dstw_inc_w',
238
            's_dstw_incdef_w',
239
            's_dstw_dec',
240
            's_dstw_dec1',
241
            's_dstw_ind',
242
            's_dstw_ind_w',
243
            's_dstw_def246');
244
 
245
  group_new(0x116, 'g_dsta',
246
            's_dsta_inc',
247
            's_dsta_incdef_w',
248
            's_dsta_dec',
249
            's_dsta_dec1',
250
            's_dsta_ind',
251
            's_dsta_ind_w');
252
 
253
  group_new(0x120, 'g_op_rts',
254
            's_op_rts',
255
            's_op_rts_pop',
256
            's_op_rts_pop_w');
257
 
258
  group_new(0x121, 'g_op_sob',
259
            's_op_sob',
260
            's_op_sob1');
261
 
262
  group_new(0x122, 'g_op_gen',
263
            's_opg_gen',
264
            's_opg_gen_rmw_w');
265
 
266
  group_new(0x123, 'g_op_mul',
267
            's_opg_mul',
268
            's_opg_mul1');
269
 
270
  group_new(0x124, 'g_op_div',
271
            's_opg_div',
272
            's_opg_div_cn',
273
            's_opg_div_cr',
274
            's_opg_div_sq',
275
            's_opg_div_sr',
276
            's_opg_div_quit');
277
 
278
  group_new(0x125, 'g_op_ash',
279
            's_opg_ash',
280
            's_opg_ash_cn');
281
 
282
  group_new(0x126, 'g_op_ashc',
283
            's_opg_ashc',
284
            's_opg_ashc_cn',
285
            's_opg_ashc_wl');
286
 
287
  group_new(0x127, 'g_op_jsr',
288
            's_opa_jsr',
289
            's_opa_jsr1',
290
            's_opa_jsr_push',
291
            's_opa_jsr_push_w',
292
            's_opa_jsr2');
293
 
294
  group_new(0x128, 'g_op_mtp',
295
            's_opa_mtp',
296
            's_opa_mtp_pop_w',
297
            's_opa_mtp_reg',
298
            's_opa_mtp_mem',
299
            's_opa_mtp_mem_w');
300
 
301
  group_new(0x129, 'g_op_mfp',
302
            's_opa_mfp_reg',
303
            's_opa_mfp_mem',
304
            's_opa_mfp_mem_w',
305
            's_opa_mfp_dec',
306
            's_opa_mfp_push',
307
            's_opa_mfp_push_w');
308
 
309
  group_new(0x12a, 'g_int',
310
            's_int_ext',
311
            's_int_getpc',
312
            's_int_getpc_w',
313
            's_int_getps',
314
            's_int_getps_w',
315
            's_int_getsp',
316
            's_int_decsp',
317
            's_int_pushps',
318
            's_int_pushps_w',
319
            's_int_pushpc',
320
            's_int_pushpc_w');
321
 
322
  group_new(0x12b, 'g_rti',
323
            's_rti_getpc',
324
            's_rti_getpc_w',
325
            's_rti_getps',
326
            's_rti_getps_w',
327
            's_rti_newpc');
328
 
329
  group_new(0x130, 'g_op_jsrrts',
330
            'g_op_jsr',
331
            'g_op_rts');
332
 
333
  group_new(0x131, 'g_flow',
334
            's_op_br',
335
            's_op_sob',
336
            's_opa_jmp',
337
            's_opa_jsr',
338
            's_op_rts');
339
 
340
  group_new(0x13a, 'g_intrti',
341
            'g_int',
342
            'g_rti');
343
 
344
  group_new(0x101, 'g_sum_noidle',
345
            'g_sum',
346
            '-',
347
            'g_cp_mem',
348
            's_op_wait');
349
 
350
  group_new(0x102, 'g_sum_exec',
351
            'g_sum_noidle',
352
            '-',
353
            'g_int',
354
            'g_rti');
355
 
356
  group_new(0x140, 'g_ifetch_wextra',
357
            's_ifetch_w',
358
            '-',
359
            's_ifetch');
360
 
361
  group_new(0x141, 'g_srcr_wextra',
362
            's_srcr_def_w',
363
            's_srcr_inc_w',
364
            's_srcr_ind1_w',
365
            's_srcr_ind2_w',
366
            '-',
367
            's_srcr_def',
368
            's_srcr_inc',
369
            's_srcr_ind',
370
            's_srcr_ind2');
371
 
372
  group_new(0x142, 'g_dstr_wextra',
373
            's_dstr_def_w',
374
            's_dstr_inc_w',
375
            's_dstr_ind1_w',
376
            's_dstr_ind2_w',
377
            '-',
378
            's_dstr_def',
379
            's_dstr_inc',
380
            's_dstr_ind',
381
            's_dstr_ind2');
382
 
383
  group_new(0x143, 'g_dstw_wextra',
384
            's_dstw_def_w',
385
            's_dstw_inc_w',
386
            's_dstw_incdef_w',
387
            's_dstw_ind_w',
388
            '-',
389
            's_dstw_def',
390
            's_dstw_inc',
391
            's_dstw_ind',
392
            's_dstw_def246');
393
 
394
  group_new(0x144, 'g_dsta_wextra',
395
            's_dsta_incdef_w',
396
            's_dsta_ind_w',
397
            '-',
398
            's_dsta_inc',
399
            's_dsta_ind');
400
 
401
  group_new(0x145, 'g_op_rts_wextra',
402
            's_op_rts_pop_w',
403
            '-',
404
            's_op_rts_pop');
405
 
406
  group_new(0x146, 'g_op_jsr_wextra',
407
            's_opa_jsr_push_w',
408
            '-',
409
            's_opa_jsr_push');
410
 
411
  group_new(0x147, 'g_op_mtp_wextra',
412
            's_opa_mtp_pop_w',
413
            's_opa_mtp_mem_w',
414
            '-',
415
            's_opa_mtp',
416
            's_opa_mtp_mem');
417
 
418
  group_new(0x148, 'g_op_mfp_wextra',
419
            's_opa_mfp_mem_w',
420
            's_opa_mfp_push_w',
421
            '-',
422
            's_opa_mfp_mem',
423
            's_opa_mfp_push');
424
 
425
  group_new(0x149, 'g_int_wextra',
426
            's_int_getpc_w',
427
            's_int_getps_w',
428
            's_int_pushps_w',
429
            's_int_pushpc_w',
430
            '-',
431
            's_int_getpc',
432
            's_int_getps',
433
            's_int_pushps',
434
            's_int_pushpc');
435
 
436
  group_new(0x14a, 'g_rti_wextra',
437
            's_rti_getpc_w',
438
            's_rti_getps_w',
439
            '-',
440
            's_rti_getpc',
441
            's_rti_getps');
442
 
443
  group_new(0x14f, 'g_all_wextra',
444
            'g_ifetch_wextra',
445
            'g_srcr_wextra',
446
            'g_dstr_wextra',
447
            'g_dstw_wextra',
448
            'g_dsta_wextra',
449
            'g_op_rts_wextra',
450
            'g_op_jsr_wextra',
451
            'g_op_mtp_wextra',
452
            'g_op_mfp_wextra',
453
            'g_int_wextra',
454
            'g_rti_wextra');
455
}
456
 
457
#-------------------------------------------------------------------------------
458
 
459
sub group_new {
460
  my $snum = shift @_;
461
  my $snam = shift @_;
462
 
463
  die "group_new: bad snum '$snum'" if defined $snum2nam[$snum];
464
  die "group_new: bad snam '$snam'" if defined $snam2num{$snam};
465
 
466
  $snum2nam[$snum] = $snam;
467
  $snam2num{$snam} = $snum;
468
  $dat_all{$snam} = 0;
469
  $dat_km{$snam}  = 0;
470
  $dat_um{$snam}  = 0;
471
  my $sign = 1.;
472
 
473
  foreach my $val (@_) {
474
    if ($val eq '+') { $sign =  1.; next;}
475
    if ($val eq '-') { $sign = -1.; next;}
476
    die "bad action '$val'" unless defined $snam2num{$val};
477
    $dat_all{$snam} += $sign * $dat_all{$val};
478
    $dat_km{$snam}  += $sign * $dat_km{$val};
479
    $dat_um{$snam}  += $sign * $dat_um{$val};
480
  }
481
}
482
 
483
#-------------------------------------------------------------------------------
484
 
485
sub print_help {
486
  print "usage: dmscntanal file\n";
487
  print "  --help           this message\n";
488
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.