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

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_47/] [or1ksim/] [cpu/] [common/] [stats.c] - Blame information for rev 532

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 cvs
/* stats.c -- Various statistics about instruction scheduling etc.
2
   Copyright (C) 1999 Damjan Lampret, lampret@opencores.org
3
 
4
This file is part of OpenRISC 1000 Architectural Simulator.
5
 
6
This program is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2 of the License, or
9
(at your option) any later version.
10
 
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
GNU General Public License for more details.
15
 
16
You should have received a copy of the GNU General Public License
17
along with this program; if not, write to the Free Software
18
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19
 
20
#include <stdio.h>
21
#include <ctype.h>
22
#include <string.h>
23
 
24
#include "abstract.h"
25
#include "stats.h"
26 102 lampret
#include "sim-config.h"
27 518 markom
#include "sprs.h"
28 102 lampret
#include "spr_defs.h"
29 30 lampret
 
30 2 cvs
const char func_unit_str[30][30] = { "unknown", "arith", "shift", "compare",
31 532 markom
  "branch", "jump", "load", "store", "movimm", "move", "extend", "nop" };
32 2 cvs
 
33 532 markom
struct dstats_entry dstats[DSTATS_LEN]; /* dependency stats */
34
struct sstats_entry sstats[SSTATS_LEN]; /* single stats */
35
struct fstats_entry fstats[FSTATS_LEN]; /* functional units stats */
36
struct mstats_entry mstats;   /* misc units stats */
37
struct cachestats_entry ic_stats; /* instruction cache stats */
38
struct cachestats_entry dc_stats; /* data cache stats */
39
struct immustats_entry immu_stats;  /* insn mmu stats */
40
struct dmmustats_entry dmmu_stats;  /* data mmu stats */
41
struct raw_stats raw_stats;   /* RAW hazard stats */
42 2 cvs
 
43
/* Dependency */
44
 
45
int check_depend()
46 532 markom
{
47 479 markom
  debug(5,"check_depend\n");
48 138 markom
  return depend_operands(&icomplet[0], &iqueue[0]);
49 2 cvs
}
50
 
51
void addsstats(char *item, int cnt_dynamic, int cnt_static)
52
{
53 532 markom
  int i = 0;
54
 
55
  while(strcmp(sstats[i].insn, item) && (sstats[i].cnt_static > 0) &&
56
        (sstats[i].cnt_static > 0) && (i < SSTATS_LEN))
57
    i++;
58 2 cvs
 
59 532 markom
  if (i >= SSTATS_LEN - 1) return;
60
 
61
  if (strcmp(sstats[i].insn, item) == 0) {
62
    sstats[i].cnt_dynamic += cnt_dynamic;
63
    sstats[i].cnt_static += cnt_static;
64
  }
65
  else {
66
    strcpy(sstats[i].insn, item);
67
    sstats[i].cnt_dynamic = cnt_dynamic;
68
    sstats[i].cnt_static = cnt_static;
69
  }
70 2 cvs
}
71
 
72
void adddstats(char *item1, char *item2, int cnt_dynamic, int depend)
73
{
74 532 markom
  int i = 0;
75
 
76
  debug(3,"adddstats start\n");
77 2 cvs
 
78 532 markom
  while((strcmp(dstats[i].insn1, item1) || strcmp(dstats[i].insn2, item2)) &&
79
        (strlen(dstats[i].insn1)) &&
80
        (i < DSTATS_LEN))
81
    i++;
82 2 cvs
 
83 532 markom
  if (i >= DSTATS_LEN - 1) return;
84
 
85
  if ((strcmp(dstats[i].insn1, item1) == 0) &&
86
      (strcmp(dstats[i].insn2, item2) == 0)) {
87
    dstats[i].cnt_dynamic += cnt_dynamic;
88
    dstats[i].depend += depend;
89
  }
90
  else {
91
    strcpy(dstats[i].insn1, item1);
92
    strcpy(dstats[i].insn2, item2);
93
    dstats[i].cnt_dynamic = cnt_dynamic;
94
    dstats[i].depend = depend;
95
  }
96 2 cvs
}
97
 
98
void addfstats(enum insn_type item1, enum insn_type item2, int cnt_dynamic, int depend)
99
{
100 532 markom
  int i = 0;
101
 
102
  while(((fstats[i].insn1 != item1) || (fstats[i].insn2 != item2)) &&
103
        (fstats[i].insn1 != it_unknown) &&
104
        (i < FSTATS_LEN))
105
    i++;
106 2 cvs
 
107 532 markom
  if (i >= FSTATS_LEN - 1) return;
108
 
109
  if ((fstats[i].insn1 == item1) &&
110
      (fstats[i].insn2 == item2)) {
111
    fstats[i].cnt_dynamic += cnt_dynamic;
112
    fstats[i].depend += depend;
113
  }
114
  else {
115
    fstats[i].insn1 = item1;
116
    fstats[i].insn2 = item2;
117
    fstats[i].cnt_dynamic = cnt_dynamic;
118
    fstats[i].depend = depend;
119
  }
120 2 cvs
}
121
 
122
void initstats()
123
{
124 532 markom
  memset(sstats, 0, sizeof(sstats));
125
  memset(dstats, 0, sizeof(dstats));
126
  memset(fstats, 0, sizeof(fstats));
127
  memset(&mstats, 0, sizeof(mstats));
128
  memset(&ic_stats, 0, sizeof(ic_stats));
129
  memset(&dc_stats, 0, sizeof(dc_stats));
130
  memset(&raw_stats, 0, sizeof(raw_stats));
131 2 cvs
}
132
 
133 102 lampret
void printistats(int which)
134 2 cvs
{
135 532 markom
  int i, all = 0, dependall = 0;
136 102 lampret
 
137 532 markom
  if (!config.cpu.dependstats) {
138
    printf("Hazard analysis disabled. Enable it to see analysis results.\n");
139
    return;
140
  }
141
 
142
  for(i = 0; i < SSTATS_LEN; i++)
143
    all += sstats[i].cnt_static;
144 2 cvs
 
145 532 markom
  for(i = 0; i < SSTATS_LEN; i++)
146
    if (sstats[i].cnt_static && (which == 1))
147
      printf(" %s\t\tused %6dx (%2d%%)\n", sstats[i].insn, sstats[i].cnt_static, (sstats[i].cnt_static * 100)/all);
148
 
149
  printf("SUM: %d instructions (static, single stats)\n", all);
150
 
151
  all = 0;
152
 
153
  for(i = 0; i < SSTATS_LEN; i++)
154
    all += sstats[i].cnt_dynamic;
155 2 cvs
 
156 532 markom
  for(i = 0; i < SSTATS_LEN; i++)
157
    if (sstats[i].cnt_dynamic && (which == 2))
158
      printf(" %s\t\tused %6dx (%2d%%)\n", sstats[i].insn, sstats[i].cnt_dynamic, (sstats[i].cnt_dynamic * 100)/all);
159 2 cvs
 
160 532 markom
  printf("SUM: %d instructions (dynamic, single stats)\n", all);
161 2 cvs
 
162 532 markom
  all = 0;
163
  dependall = 0;
164
  for(i = 0; i < DSTATS_LEN; i++) {
165
    all += dstats[i].cnt_dynamic;
166
    dependall += dstats[i].depend;
167
  }
168 2 cvs
 
169 532 markom
  for(i = 0; i < DSTATS_LEN; i++)
170
    if (dstats[i].cnt_dynamic && (which == 3)) {
171
      printf(" %s, %s ", dstats[i].insn1, dstats[i].insn2);
172
      printf("\t\t\t%6dx (%2d%%)", dstats[i].cnt_dynamic, (dstats[i].cnt_dynamic * 100)/all);
173
      printf("   depend: %3d%%\n", (dstats[i].depend * 100) / dstats[i].cnt_dynamic);
174
    }
175 2 cvs
 
176 532 markom
  printf("SUM: %d instructions (dynamic, dependency stats)  depend: %d%%\n", all, (dependall * 100) / all);
177 2 cvs
 
178 532 markom
  all = 0;
179
  dependall = 0;
180
  for(i = 0; i < FSTATS_LEN; i++) {
181
    all += fstats[i].cnt_dynamic;
182
    dependall += fstats[i].depend;
183
  }
184 2 cvs
 
185 532 markom
  for(i = 0; i < FSTATS_LEN; i++)
186
    if (fstats[i].cnt_dynamic && (which == 4)) {
187
      printf(" %s,", func_unit_str[fstats[i].insn1]);
188
      printf(" %s", func_unit_str[fstats[i].insn2]);
189
      printf("\t\t\t%6dx (%2d%%)", fstats[i].cnt_dynamic, (fstats[i].cnt_dynamic * 100)/all);
190
      printf("   depend: %3d%%\n", (fstats[i].depend * 100) / fstats[i].cnt_dynamic);
191
    }
192 2 cvs
 
193 532 markom
  for(i = 0; (i < RAW_RANGE) && (which == 5); i++)
194
    printf(" Register set and reused in %d. cycle: %d cases\n", i, raw_stats.range[i]);
195 6 lampret
 
196 532 markom
  printf("SUM: %d instructions (dynamic, functional units stats)  depend: %d%%\n", all, (dependall * 100) / SD(all));
197
  printf("Byte ADD: %d instructions\n", mstats.byteadd);
198 102 lampret
 
199
}
200
 
201
void printotherstats(int which)
202
{
203 532 markom
  int i, all = 0, dependall = 0;
204
 
205
  if (config.cpu.bpb) {
206
    printf("bnf: %d (%d%%) taken,", mstats.beqz.taken, (mstats.beqz.taken * 100) / SD(mstats.beqz.taken + mstats.beqz.nottaken));
207
    printf(" %d (%d%%) not taken,", mstats.beqz.nottaken, (mstats.beqz.nottaken * 100) / SD(mstats.beqz.taken + mstats.beqz.nottaken));
208
    printf(" %d (%d%%) forward,", mstats.beqz.forward, (mstats.beqz.forward * 100) / SD(mstats.beqz.forward + mstats.beqz.backward));
209
    printf(" %d (%d%%) backward\n", mstats.beqz.backward, (mstats.beqz.backward * 100) / SD(mstats.beqz.forward + mstats.beqz.backward));
210
    printf("bf: %d (%d%%) taken,", mstats.bnez.taken, (mstats.bnez.taken * 100) / SD(mstats.bnez.taken + mstats.bnez.nottaken));
211
    printf(" %d (%d%%) not taken,", mstats.bnez.nottaken, (mstats.bnez.nottaken * 100) / SD(mstats.bnez.taken + mstats.bnez.nottaken));
212
    printf(" %d (%d%%) forward,", mstats.bnez.forward, (mstats.bnez.forward * 100) / SD(mstats.bnez.forward + mstats.bnez.backward));
213
    printf(" %d (%d%%) backward\n", mstats.bnez.backward, (mstats.bnez.backward * 100) / SD(mstats.bnez.forward + mstats.bnez.backward));
214
    printf("StaticBP bnf: correct %d%% (forward)\n", (mstats.sbp_bnf.correct * 100) / SD(mstats.sbp_bnf.all));
215
    printf("StaticBP bf: correct %d%% (backward)\n", (mstats.sbp_bf.correct * 100) / SD(mstats.sbp_bf.all));
216
    printf("BPB: hit %d (correct %d%%), miss %d\n", mstats.bpb.hit, (mstats.bpb.correct * 100) / SD(mstats.bpb.hit), mstats.bpb.miss);
217
  } else
218
    printf("BPB simulation disabled. Enable it to see BPB analysis\n");
219 102 lampret
 
220 532 markom
  if (config.cpu.btic) {
221
    printf("BTIC: hit %d(%d%%), miss %d\n", mstats.btic.hit, (mstats.btic.hit * 100) / SD(mstats.btic.hit + mstats.btic.miss), mstats.btic.miss);
222
  } else
223
    printf("BTIC simulation disabled. Enabled it to see BTIC analysis\n");
224
 
225
  if (testsprbits(SPR_UPR, SPR_UPR_ICP)) {
226
    printf("IC read:  hit %d(%d%%), miss %d\n", ic_stats.readhit, (ic_stats.readhit * 100) / SD(ic_stats.readhit + ic_stats.readmiss), ic_stats.readmiss);
227
  } else
228
    printf("No ICache. Set UPR[ICP]\n");
229
 
230
  if (testsprbits(SPR_UPR, SPR_UPR_DCP)) {
231
    printf("DC read:  hit %d(%d%%), miss %d\n", dc_stats.readhit, (dc_stats.readhit * 100) / SD(dc_stats.readhit + dc_stats.readmiss), dc_stats.readmiss);
232
    printf("DC write: hit %d(%d%%), miss %d\n", dc_stats.writehit, (dc_stats.writehit * 100) / SD(dc_stats.writehit + dc_stats.writemiss), dc_stats.writemiss);
233
  } else
234
    printf("No DCache. Set UPR[DCP]\n");
235 102 lampret
 
236 532 markom
  if (testsprbits(SPR_UPR, SPR_UPR_IMP)) {
237
    printf("IMMU read:  hit %d(%d%%), miss %d\n", immu_stats.fetch_tlbhit, (immu_stats.fetch_tlbhit * 100) / SD(immu_stats.fetch_tlbhit + immu_stats.fetch_tlbmiss), immu_stats.fetch_tlbmiss);
238
  } else
239
    printf("No IMMU. Set UPR[IMP]\n");
240 102 lampret
 
241 532 markom
  if (testsprbits(SPR_UPR, SPR_UPR_DMP)) {
242
    printf("DMMU read:  hit %d(%d%%), miss %d\n", dmmu_stats.loads_tlbhit, (dmmu_stats.loads_tlbhit * 100) / SD(dmmu_stats.loads_tlbhit + dmmu_stats.loads_tlbmiss), dmmu_stats.loads_tlbmiss);
243
  } else
244
    printf("No DMMU. Set UPR[DMP]\n");
245 102 lampret
}
246
 
247
void printstats(int which)
248
{
249 532 markom
  printistats(which);
250
  if (which == 5)
251
    printotherstats(which);
252 102 lampret
}

powered by: WebSVN 2.1.0

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