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

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_40/] [or1ksim/] [sim-config.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1358 nogj
/* sim-config.c -- Simulator configuration
2 645 markom
   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
/* Simulator configuration. Eventually this one will be a lot bigger. */
21
 
22
#include <stdlib.h>
23 805 markom
#include <limits.h>
24 1308 phoenix
#include <string.h>
25
#include <ctype.h>
26
 
27 1350 nogj
#include "config.h"
28
 
29
#ifdef HAVE_INTTYPES_H
30
#include <inttypes.h>
31
#endif
32
 
33
#include "port.h"
34
#include "arch.h"
35 645 markom
#include "sim-config.h"
36
#include "abstract.h"
37
#include "sprs.h"
38
#include "spr_defs.h"
39
#include "pic.h"
40 1344 nogj
#include "opcode/or32.h"
41 645 markom
#include "stats.h"
42
#include "icache_model.h"
43
#include "dcache_model.h"
44
 
45
#include "profiler.h"
46
#include "mprofiler.h"
47 897 markom
#include "cuc.h"
48 645 markom
 
49 1358 nogj
#include "debug.h"
50
 
51
#define WARNING(s) fprintf (stderr, "WARNING: config.%s: %s\n", cur_section->name, (s))
52 645 markom
#define MERROR(s) {fprintf (stderr, "ERROR: %s\n", s); if (runtime.sim.init) exit (1);}
53
 
54
struct config config;
55
struct runtime runtime;
56
 
57 1358 nogj
struct config_section *cur_section;
58 645 markom
 
59 1358 nogj
struct config_section *sections = NULL;
60
 
61 645 markom
void init_defconfig()
62
{
63
  int i;
64
 
65
  memset(&config, 0, sizeof(config));
66
  /* Sim */
67
  config.sim.exe_log = 0;
68 672 markom
  config.sim.exe_log_type = EXE_LOG_HARDWARE;
69
  config.sim.exe_log_start = 0;
70
  config.sim.exe_log_end = 0;
71
  config.sim.exe_log_marker = 0;
72 645 markom
  config.sim.spr_log = 0;
73
  strcpy (config.sim.exe_log_fn, "executed.log");
74
  strcpy (config.sim.spr_log_fn, "spr.log");
75 1098 markom
  config.sim.profile = 0;
76
  config.sim.mprofile = 0;
77 645 markom
 
78
  config.sim.debug = 0;
79
  config.sim.verbose = 1;
80
 
81
  strcpy (config.sim.prof_fn, "sim.profile");
82
  strcpy (config.sim.mprof_fn, "sim.mprofile");
83 823 ivang
  strcpy (config.sim.fstdout, "stdout.txt");
84 645 markom
  strcpy (runtime.sim.script_fn, "(default)");
85
  config.sim.clkcycle_ps = 4000; /* 4000 for 4ns (250MHz) */
86 805 markom
  if (config.sim.clkcycle_ps) config.sim.system_kfreq = (long)((1000000000.0 / (double)config.sim.clkcycle_ps));
87
  else config.sim.system_kfreq = INT_MAX;
88
  if (config.sim.system_kfreq <= 0) config.sim.system_kfreq = 1;
89 645 markom
 
90
  /* Memory */
91
  config.memory.type = MT_UNKNOWN;
92
  config.memory.pattern = 0;
93
  config.memory.random_seed = -1;  /* Generate new seed */
94
  for (i = 0; i < MAX_MEMORIES; i++)
95
    config.memory.table[i].ce = -1;     /* memory is disabled by default */
96
 
97
  /* IMMU & DMMU*/
98
  config.immu.enabled = 0;
99 856 markom
  config.immu.hitdelay = 1;
100
  config.immu.missdelay = 1;
101 645 markom
  config.dmmu.enabled = 0;
102 856 markom
  config.dmmu.hitdelay = 1;
103
  config.dmmu.missdelay = 1;
104 645 markom
 
105
  /* IC & DC */
106
  config.ic.enabled = 0;
107 856 markom
  config.ic.hitdelay = 1;
108
  config.ic.missdelay = 1;
109 645 markom
  config.ic.nways = 0;
110
  config.ic.nsets = 0;
111
  config.ic.ustates = 0;
112
  config.dc.enabled = 0;
113 856 markom
  config.dc.load_hitdelay = 2;
114
  config.dc.load_missdelay = 2;
115 645 markom
  config.dc.nways = 0;
116
  config.dc.nsets = 0;
117
  config.dc.ustates = 0;
118
  config.dc.store_hitdelay = 0;
119
  config.dc.store_missdelay = 0;
120 876 rherveille
 
121 645 markom
  /* CPU */
122
  config.cpu.superscalar = 0;
123
  config.sim.history = 0;
124
  config.cpu.hazards = 0;
125
  config.cpu.dependstats = 0;
126
  config.cpu.sbuf_len = 0;
127
  config.cpu.upr = SPR_UPR_UP | SPR_UPR_DCP | SPR_UPR_ICP | SPR_UPR_DMP
128
                 | SPR_UPR_IMP | SPR_UPR_OB32P | SPR_UPR_DUP | SPR_UPR_PICP
129
                 | SPR_UPR_PMP | SPR_UPR_TTP;
130 912 lampret
  config.cpu.sr = 0x00008001;
131 645 markom
 
132
  /* Debug */
133
  config.debug.enabled = 0;
134
  config.debug.gdb_enabled = 0;
135
  config.debug.server_port = 0;
136
 
137
  /* VAPI */
138
  config.vapi.enabled = 0;
139
  strcpy (config.vapi.vapi_fn, "vapi.log");
140
 
141
  /* PM */
142
  config.pm.enabled = 0;
143 897 markom
 
144
  /* CUC */
145
  strcpy (config.cuc.timings_fn, "virtex.tim");
146
  config.cuc.memory_order = MO_STRONG;
147
  config.cuc.calling_convention = 1;
148
  config.cuc.enable_bursts = 1;
149
  config.cuc.no_multicycle = 1;
150 970 simons
 
151 645 markom
  /* Configure runtime */
152
  memset(&runtime, 0, sizeof(runtime));
153
 
154
  /* Sim */
155
  runtime.sim.fexe_log = NULL;
156
  runtime.sim.fspr_log = NULL;
157
  runtime.sim.iprompt = 0;
158
  runtime.sim.fprof = NULL;
159
  runtime.sim.fmprof = NULL;
160
  runtime.sim.init = 1;
161 998 markom
  runtime.sim.fout = stdout;
162 645 markom
  runtime.sim.script_file_specified = 0;
163 883 markom
  runtime.simcmd.profile = 0;
164
  runtime.simcmd.mprofile = 0;
165 645 markom
 
166
  /* VAPI */
167
  runtime.vapi.vapi_file = NULL;
168
  runtime.vapi.enabled = 0;
169
}
170
 
171
int parse_args(int argc, char *argv[])
172
{
173
  argv++; argc--;
174
  while (argc) {
175 847 markom
    if (strcmp(*argv, "profiler") == 0) {
176
      exit (main_profiler (argc, argv));
177
    } else
178
    if (strcmp(*argv, "mprofiler") == 0) {
179
      exit (main_mprofiler (argc, argv));
180
    } else
181
    if (*argv[0] != '-') {
182 645 markom
      runtime.sim.filename = argv[0];
183
      argc--;
184
      argv++;
185
    } else
186
    if (strcmp(*argv, "-f") == 0 || strcmp(*argv, "--file") == 0) {
187
      argv++; argc--;
188
      if (argv[0]) {
189
        read_script_file(argv[0]);
190
        argv++; argc--;
191
      } else {
192
        fprintf(stderr, "Configure filename not specified!\n");
193
        return 1;
194
      }
195
    } else
196
    if (strcmp(*argv, "--nosrv") == 0) {  /* (CZ) */
197
      config.debug.gdb_enabled = 0;
198
      argv++; argc--;
199
    } else
200
    if (strcmp(*argv, "--srv") == 0) {  /* (CZ) */
201
      char *s;
202
      if(!--argc)
203
        return 1;
204
      config.debug.enabled = 1;
205 1205 phoenix
      config.debug.gdb_enabled = 1;
206 645 markom
      config.debug.server_port = strtol(*(++argv),&s,10);
207
      if(*s)
208
        return 1;
209
      argv++; argc--;
210
    } else
211
    if (strcmp(*argv, "-i") == 0) {
212
      runtime.sim.iprompt = 1;
213
      argv++; argc--;
214
    } else
215
    if (strcmp(*argv, "-v") == 0) {
216
      version();
217
      exit(0);
218
    } else
219 883 markom
    if (strcmp(*argv, "--enable-profile") == 0) {
220
      runtime.simcmd.profile = 1;
221 645 markom
      argv++; argc--;
222
    } else
223 883 markom
    if (strcmp(*argv, "--enable-mprofile") == 0) {
224
      runtime.simcmd.mprofile = 1;
225 645 markom
      argv++; argc--;
226
    } else
227
    if (strcmp(*argv, "--output-cfg") == 0) {
228
      runtime.sim.output_cfg = 1;
229
      argv++; argc--;
230 1389 nogj
    } else
231
    if (strcmp(*argv, "-d") == 0) {
232
      parse_dbchs(*(++argv));
233
      argv++; argc -= 2;
234 645 markom
    } else {
235
      fprintf(stderr, "Unknown option: %s\n", *argv);
236
      return 1;
237
    }
238
  }
239
 
240
  if (!argc)
241
    return 0;
242
 
243
  return 0;
244
}
245
 
246
void print_config()
247
{
248
  if (config.sim.verbose) {
249
    char temp[20];
250 997 markom
    PRINTF("Verbose on, ");
251 645 markom
    if (config.sim.debug)
252 997 markom
      PRINTF("simdebug on, ");
253 645 markom
    else
254 997 markom
      PRINTF("simdebug off, ");
255 645 markom
    if (runtime.sim.iprompt)
256 997 markom
      PRINTF("interactive prompt on\n");
257 645 markom
    else
258 997 markom
      PRINTF("interactive prompt off\n");
259 645 markom
 
260 997 markom
    PRINTF("Machine initialization...\n");
261 645 markom
    generate_time_pretty (temp, config.sim.clkcycle_ps);
262 997 markom
    PRINTF("Clock cycle: %s\n", temp);
263 645 markom
    if (testsprbits(SPR_UPR, SPR_UPR_DCP))
264 997 markom
      PRINTF("Data cache present.\n");
265 645 markom
    else
266 997 markom
      PRINTF("No data cache.\n");
267 645 markom
    if (testsprbits(SPR_UPR, SPR_UPR_ICP))
268 997 markom
      PRINTF("Insn cache tag present.\n");
269 645 markom
    else
270 997 markom
      PRINTF("No instruction cache.\n");
271 645 markom
    if (config.bpb.enabled)
272 997 markom
      PRINTF("BPB simulation on.\n");
273 645 markom
    else
274 997 markom
      PRINTF("BPB simulation off.\n");
275 645 markom
    if (config.bpb.btic)
276 997 markom
      PRINTF("BTIC simulation on.\n");
277 645 markom
    else
278 997 markom
      PRINTF("BTIC simulation off.\n");
279 645 markom
  }
280
}
281
 
282 1358 nogj
struct config_param {
283
  char *name;
284
  enum param_t type;
285
  void (*func)(union param_val, void *dat);
286
  struct config_param *next;
287 645 markom
};
288
 
289 1358 nogj
/* FIXME: These will be removed */
290
int current_device = -1;
291
void change_device (union param_val val, void *dat) {
292
  current_device = val.int_val;
293
}
294 645 markom
 
295 1358 nogj
void end_device (union param_val val, void *dat) {
296
  current_device = -1;
297
}
298 645 markom
 
299 1358 nogj
void base_include (union param_val val, void *dat) {
300
  read_script_file (val.str_val);
301
  cur_section = NULL;
302
}
303 645 markom
 
304 1358 nogj
/*----------------------------------------------[ Simulator configuration ]---*/
305
void sim_debug (union param_val val, void *dat) {
306
  config.sim.debug = val.int_val;
307
}
308 645 markom
 
309 1358 nogj
void sim_verbose (union param_val val, void *dat) {
310
  config.sim.verbose = val.int_val;
311
}
312 645 markom
 
313 1358 nogj
void sim_profile (union param_val val, void *dat) {
314
  config.sim.profile = val.int_val;
315
}
316 645 markom
 
317 1358 nogj
void sim_prof_fn (union param_val val, void *dat) {
318
  strcpy(config.sim.prof_fn, val.str_val);
319
}
320 876 rherveille
 
321 1358 nogj
void sim_mprofile (union param_val val, void *dat) {
322
  config.sim.mprofile = val.int_val;
323 645 markom
}
324
 
325 1358 nogj
void sim_mprof_fn (union param_val val, void *dat) {
326
  strcpy(config.sim.mprof_fn, val.str_val);
327 645 markom
}
328
 
329 1358 nogj
void sim_history (union param_val val, void *dat) {
330
  config.sim.history = val.int_val;
331 645 markom
}
332
 
333 1358 nogj
void sim_exe_log (union param_val val, void *dat) {
334
  config.sim.exe_log = val.int_val;
335 645 markom
}
336
 
337 1358 nogj
void sim_exe_log_type (union param_val val, void *dat) {
338
  if (strcmp (val.str_val, "default") == 0)
339 672 markom
    config.sim.exe_log_type = EXE_LOG_HARDWARE;
340 1358 nogj
  else if (strcmp (val.str_val, "hardware") == 0)
341 672 markom
    config.sim.exe_log_type = EXE_LOG_HARDWARE;
342 1358 nogj
  else if (strcmp (val.str_val, "simple") == 0)
343 675 markom
    config.sim.exe_log_type = EXE_LOG_SIMPLE;
344 1358 nogj
  else if (strcmp (val.str_val, "software") == 0) {
345 672 markom
    config.sim.exe_log_type = EXE_LOG_SOFTWARE;
346
  } else {
347
    char tmp[200];
348 1358 nogj
    sprintf (tmp, "invalid execute log type '%s'.\n", val.str_val);
349
    CONFIG_ERROR(tmp);
350 672 markom
  }
351
}
352
 
353 1358 nogj
void sim_exe_log_start (union param_val val, void *dat) {
354
  config.sim.exe_log_start = val.int_val;
355 645 markom
}
356
 
357 1358 nogj
void sim_exe_log_end (union param_val val, void *dat) {
358
  config.sim.exe_log_end = val.int_val;
359 645 markom
}
360
 
361 1358 nogj
void sim_exe_log_marker (union param_val val, void *dat) {
362
  config.sim.exe_log_marker = val.int_val;
363 645 markom
}
364
 
365 1358 nogj
void sim_exe_log_fn (union param_val val, void *dat) {
366
  strcpy(config.sim.exe_log_fn, val.str_val);
367 645 markom
}
368
 
369 1358 nogj
void sim_clkcycle (union param_val val, void *dat) {
370
  int len = strlen (val.str_val);
371
  int pos = len - 1;
372
  long time;
373
  if (len < 2) goto err;
374
  if (val.str_val[pos--] != 's') goto err;
375
  switch (val.str_val[pos--]) {
376
    case 'p': time = 1; break;
377
    case 'n': time = 1000; break;
378
    case 'u': time = 1000000; break;
379
    case 'm': time = 1000000000; break;
380
  default:
381
    goto err;
382
  }
383
  val.str_val[pos + 1] = 0;
384
  config.sim.clkcycle_ps = time * atol (val.str_val);
385
  return;
386
err:
387
  CONFIG_ERROR("invalid time format.");
388 645 markom
}
389
 
390 1358 nogj
void sim_stdout (union param_val val, void *dat) {
391
  strcpy(config.sim.fstdout, val.str_val);
392 645 markom
}
393
 
394 1358 nogj
void sim_spr_log (union param_val val, void *dat) {
395
  config.sim.spr_log = val.int_val;
396 645 markom
}
397
 
398 1358 nogj
void sim_spr_log_fn (union param_val val, void *dat) {
399
  strcpy(config.sim.spr_log_fn, val.str_val);
400 645 markom
}
401
 
402 1358 nogj
void reg_sim_sec (void) {
403
  struct config_section *sec = reg_config_sec("sim", NULL, NULL);
404 645 markom
 
405 1358 nogj
  reg_config_param(sec, "debug", paramt_int, sim_debug);
406
  reg_config_param(sec, "verbose", paramt_int, sim_verbose);
407
  reg_config_param(sec, "profile", paramt_int, sim_profile);
408
  reg_config_param(sec, "prof_fn", paramt_str, sim_prof_fn);
409
  reg_config_param(sec, "mprofile", paramt_int, sim_mprofile);
410
  reg_config_param(sec, "mprof_fn", paramt_str, sim_mprof_fn);
411
  reg_config_param(sec, "history", paramt_int, sim_history);
412
  reg_config_param(sec, "exe_log", paramt_int, sim_exe_log);
413
  reg_config_param(sec, "exe_log_type", paramt_word, sim_exe_log_type);
414
  reg_config_param(sec, "exe_log_start", paramt_int, sim_exe_log_start);
415
  reg_config_param(sec, "exe_log_end", paramt_int, sim_exe_log_end);
416
  reg_config_param(sec, "exe_log_marker", paramt_int, sim_exe_log_marker);
417
  reg_config_param(sec, "exe_log_fn", paramt_str, sim_exe_log_fn);
418
  reg_config_param(sec, "spr_log", paramt_int, sim_spr_log);
419
  reg_config_param(sec, "spr_log_fn", paramt_str, sim_spr_log_fn);
420
  reg_config_param(sec, "clkcycle", paramt_word, sim_clkcycle);
421
  reg_config_param(sec, "stdout", paramt_str, sim_stdout);
422 645 markom
}
423
 
424 1358 nogj
/*-------------------------------------------------[ Memory configuration ]---*/
425
void memory_random_seed(union param_val val, void *dat) {
426
  config.memory.random_seed = val.int_val;
427 645 markom
}
428
 
429 1358 nogj
void memory_pattern(union param_val val, void *dat) {
430
  config.memory.pattern = val.int_val;
431 645 markom
}
432
 
433 1358 nogj
void memory_nmemories (union param_val val, void *dat) {
434
  if (val.int_val >= 0 && val.int_val < MAX_MEMORIES)
435
    config.memory.nmemories = val.int_val;
436 645 markom
  else
437 1358 nogj
    CONFIG_ERROR("invalid number of devices.");
438 645 markom
}
439
 
440 1358 nogj
void memory_type (union param_val val, void *dat) {
441
  if (strcmp (val.str_val, "unknown") == 0)
442 645 markom
    config.memory.type = MT_UNKNOWN;
443 1358 nogj
  else if (strcmp (val.str_val, "random") == 0)
444 645 markom
    config.memory.type = MT_RANDOM;
445 1358 nogj
  else if (strcmp (val.str_val, "pattern") == 0)
446 645 markom
    config.memory.type = MT_PATTERN;
447 1358 nogj
  else if (strcmp (val.str_val, "zero") == 0) {
448 645 markom
    config.memory.type = MT_PATTERN;
449
    config.memory.pattern = 0;
450
  } else {
451
    char tmp[200];
452 1358 nogj
    sprintf (tmp, "invalid memory type '%s'.\n", val.str_val);
453
    CONFIG_ERROR(tmp);
454 645 markom
  }
455
}
456
 
457 1358 nogj
void memory_ce (union param_val val, void *dat) {
458 645 markom
  if (current_device >= 0 && current_device < config.memory.nmemories)
459 1358 nogj
    config.memory.table[current_device].ce = val.int_val;
460 645 markom
  else
461 1358 nogj
    CONFIG_ERROR("invalid device number.");
462 645 markom
}
463
 
464 1358 nogj
void memory_baseaddr (union param_val val, void *dat) {
465 645 markom
  if (current_device >= 0 && current_device < config.memory.nmemories)
466 1358 nogj
    config.memory.table[current_device].baseaddr = val.addr_val;
467 645 markom
  else
468 1358 nogj
    CONFIG_ERROR("invalid device number.");
469 645 markom
}
470
 
471 1358 nogj
void memory_size (union param_val val, void *dat) {
472 645 markom
  if (current_device >= 0 && current_device < config.memory.nmemories)
473 1358 nogj
    config.memory.table[current_device].size = val.int_val;
474 645 markom
  else
475 1358 nogj
    CONFIG_ERROR("invalid device number.");
476 645 markom
}
477
 
478 1358 nogj
void memory_name (union param_val val, void *dat) {
479 645 markom
  if (current_device >= 0 && current_device < config.memory.nmemories)
480 1358 nogj
    strcpy (config.memory.table[current_device].name, val.str_val);
481 645 markom
  else
482 1358 nogj
    CONFIG_ERROR("invalid device number.");
483 645 markom
}
484
 
485 1358 nogj
void memory_log (union param_val val, void *dat) {
486 645 markom
  if (current_device >= 0 && current_device < config.memory.nmemories)
487 1358 nogj
    strcpy (config.memory.table[current_device].log, val.str_val);
488 645 markom
  else
489 1358 nogj
    CONFIG_ERROR("invalid device number.");
490 645 markom
}
491
 
492 1358 nogj
void memory_delayr (union param_val val, void *dat) {
493 645 markom
  if (current_device >= 0 && current_device < config.memory.nmemories)
494 1358 nogj
    config.memory.table[current_device].delayr = val.int_val;
495 645 markom
  else
496 1358 nogj
    CONFIG_ERROR("invalid device number.");
497 645 markom
}
498
 
499 1358 nogj
void memory_delayw (union param_val val, void *dat) {
500 645 markom
  if (current_device >= 0 && current_device < config.memory.nmemories)
501 1358 nogj
    config.memory.table[current_device].delayw = val.int_val;
502 645 markom
  else
503 1358 nogj
    CONFIG_ERROR("invalid device number.");
504 645 markom
}
505
 
506 1358 nogj
void reg_memory_sec(void) {
507
  struct config_section *sec = reg_config_sec("memory", NULL, NULL);
508 645 markom
 
509 1358 nogj
  reg_config_param(sec, "random_seed", paramt_int, memory_random_seed);
510
  reg_config_param(sec, "pattern", paramt_int, memory_pattern);
511
  reg_config_param(sec, "type", paramt_word, memory_type);
512
  reg_config_param(sec, "nmemories", paramt_int, memory_nmemories);
513
  reg_config_param(sec, "device", paramt_int, change_device);
514
  reg_config_param(sec, "enddevice", paramt_none, end_device);
515
  reg_config_param(sec, "ce", paramt_int, memory_ce);
516
  reg_config_param(sec, "baseaddr", paramt_addr, memory_baseaddr);
517
  reg_config_param(sec, "size", paramt_int, memory_size);
518
  reg_config_param(sec, "name", paramt_str, memory_name);
519
  reg_config_param(sec, "log", paramt_str, memory_log);
520
  reg_config_param(sec, "delayr", paramt_int, memory_delayr);
521
  reg_config_param(sec, "delayw", paramt_int, memory_delayw);
522 645 markom
}
523
 
524 1358 nogj
/*----------------------------------------------------[ CPU configuration ]---*/
525
void cpu_ver (union param_val val, void *dat) {
526
  config.cpu.ver = val.int_val;
527 645 markom
}
528
 
529 1358 nogj
void cpu_rev (union param_val val, void *dat) {
530
  config.cpu.rev = val.int_val;
531 645 markom
}
532
 
533 1358 nogj
void cpu_upr (union param_val val, void *dat) {
534
  config.cpu.upr = val.int_val;
535 725 ivang
}
536
 
537 1358 nogj
void cpu_sr (union param_val val, void *dat) {
538
  config.cpu.sr = val.int_val;
539 645 markom
}
540
 
541 1358 nogj
void cpu_hazards (union param_val val, void *dat) {
542
  config.cpu.hazards = val.int_val;
543 645 markom
}
544
 
545 1358 nogj
void cpu_superscalar (union param_val val, void *dat) {
546
  config.cpu.superscalar = val.int_val;
547 645 markom
}
548
 
549 1358 nogj
void cpu_dependstats (union param_val val, void *dat) {
550
  config.cpu.dependstats = val.int_val;
551 645 markom
}
552
 
553 1358 nogj
void cpu_sbuf_len (union param_val val, void *dat) {
554
  if (val.int_val >= MAX_SBUF_LEN) {
555
    config.cpu.sbuf_len = MAX_SBUF_LEN - 1;
556
    WARNING("sbuf_len too large; truncated.");
557
  } else if (val.int_val < 0) {
558
    config.cpu.sbuf_len = 0;
559
    WARNING("sbuf_len negative; disabled.");
560
  } else
561
    config.cpu.sbuf_len = val.int_val;
562 723 ivang
}
563
 
564 1358 nogj
void reg_cpu_sec(void)
565
{
566
  struct config_section *sec = reg_config_sec("cpu", NULL, NULL);
567 723 ivang
 
568 1358 nogj
  reg_config_param(sec, "ver", paramt_int, cpu_ver);
569
  reg_config_param(sec, "rev", paramt_int, cpu_rev);
570
  reg_config_param(sec, "upr", paramt_int, cpu_upr);
571
  reg_config_param(sec, "sr", paramt_int, cpu_sr);
572
  reg_config_param(sec, "hazards", paramt_int, cpu_hazards);
573
  reg_config_param(sec, "superscalar", paramt_int, cpu_superscalar);
574
  reg_config_param(sec, "dependstats", paramt_int, cpu_dependstats);
575
  reg_config_param(sec, "sbuf_len", paramt_int, cpu_sbuf_len);
576 645 markom
}
577
 
578
int is_power2 (int x) {
579
  while (!(x & 1))
580
    x >>= 1;
581
  return x == 1;
582
}
583
 
584 1382 nogj
int log2 (int x) {
585
  int log=-1;
586
  while (x)
587
  {
588
    x >>= 1;
589
    log++;
590
  }
591
  return log;
592
}
593
 
594 1358 nogj
void reg_config_secs(void)
595
{
596
  reg_config_param(reg_config_sec("base", NULL, NULL), "include", paramt_str,
597
                   base_include);
598 645 markom
 
599 1358 nogj
  reg_sim_sec();
600
  reg_cpu_sec();
601
  reg_memory_sec();
602
  reg_mc_sec();
603
  reg_uart_sec();
604
  reg_dma_sec();
605
  reg_debug_sec();
606
  reg_vapi_sec();
607
  reg_ethernet_sec();
608
  reg_immu_sec();
609
  reg_dmmu_sec();
610
  reg_ic_sec();
611
  reg_dc_sec();
612
  reg_gpio_sec();
613
  reg_bpb_sec();
614
  reg_pm_sec();
615
  reg_vga_sec();
616
  reg_fb_sec();
617
  reg_kbd_sec();
618
  reg_ata_sec();
619
  reg_cuc_sec();
620
  reg_test_sec();
621 645 markom
}
622
 
623 1358 nogj
void reg_config_param(struct config_section *sec, const char *param,
624
                      enum param_t type,
625
                      void (*param_cb)(union param_val, void *))
626
{
627
  struct config_param *new = malloc(sizeof(struct config_param));
628 645 markom
 
629 1358 nogj
  if(!new) {
630
    fprintf(stderr, "Out-of-memory\n");
631
    exit(1);
632
  }
633 645 markom
 
634 1358 nogj
  if(!(new->name = strdup(param))) {
635
    fprintf(stderr, "Out-of-memory\n");
636
    exit(1);
637
  }
638 645 markom
 
639 1358 nogj
  new->func = param_cb;
640
  new->type = type;
641 645 markom
 
642 1358 nogj
  new->next = sec->params;
643
  sec->params = new;
644 645 markom
}
645
 
646 1358 nogj
struct config_section *reg_config_sec(const char *section,
647
                                      void *(*sec_start)(void),
648
                                      void (*sec_end)(void *))
649
{
650
  struct config_section *new = malloc(sizeof(struct config_section));
651 645 markom
 
652 1358 nogj
  if(!new) {
653
    fprintf(stderr, "Out-of-memory\n");
654
    exit(1);
655
  }
656 645 markom
 
657 1358 nogj
  if(!(new->name = strdup(section))) {
658
    fprintf(stderr, "Out-of-memory\n");
659
    exit(1);
660 645 markom
  }
661
 
662 1358 nogj
  new->next = sections;
663
  new->sec_start = sec_start;
664
  new->sec_end = sec_end;
665
  new->params = NULL;
666 645 markom
 
667 1358 nogj
  sections = new;
668 645 markom
 
669 1358 nogj
  return new;
670 645 markom
}
671
 
672 1358 nogj
static void switch_param(char *param, struct config_param *cur_param)
673
{
674
  char *end_p;
675
  union param_val val;
676 645 markom
 
677 1358 nogj
    /* Skip over an = sign if it exists */
678
  if(*param == '=') {
679
    param++;
680
    while(*param && isspace(*param)) param++;
681 645 markom
  }
682
 
683 1358 nogj
  switch (cur_param->type) {
684
  case paramt_int:
685
    val.int_val = strtol(param, NULL, 0);
686
  case paramt_addr:
687
    val.addr_val = strtoul(param, NULL, 0);
688
    break;
689
  case paramt_str:
690
    if(*param != '"') {
691
      CONFIG_ERROR("String value expected\n");
692
      return;
693
    }
694 645 markom
 
695 1358 nogj
    param++;
696
    end_p = param;
697
    while(*end_p && (*end_p != '"')) end_p++;
698
    *end_p = '\0';
699
    val.str_val = param;
700
    break;
701
  case paramt_word:
702
    end_p = param;
703
    while(*end_p && !isspace(*end_p)) end_p++;
704
    *end_p = '\0';
705
    val.str_val = param;
706
    break;
707
  case paramt_none:
708
    break;
709
  }
710 645 markom
 
711 1358 nogj
  cur_param->func(val, cur_section->dat);
712 645 markom
}
713
 
714
/* Read environment from a script file. Does not fail - assumes default configuration instead.
715
   The syntax of script file is:
716
   param = value
717
   section x
718
     data
719
     param = value
720
   end
721
 
722
   Example:
723
   section mc
724
     memory_table_file = sim.mem
725
     enable = 1
726
     POC = 0x47892344
727
   end
728
 
729
 */
730
 
731
void read_script_file (char *filename)
732
{
733
  FILE *f;
734
  char *home = getenv("HOME");
735
  char ctmp[STR_SIZE];
736
  int local = 1;
737 1358 nogj
  cur_section = NULL;
738 645 markom
 
739
  sprintf(ctmp, "%s/.or1k/%s", home, filename);
740
  if ((f = fopen (filename, "rt")) != NULL
741
      || home != NULL && !(local = 0) && (f = fopen (ctmp, "rt")) != NULL) {
742
    if (config.sim.verbose && !runtime.sim.output_cfg)
743 997 markom
      PRINTF ("Reading script file from '%s'...\n", local ? filename : ctmp);
744 645 markom
    strcpy (runtime.sim.script_fn, local ? filename : ctmp);
745
 
746
    while (!feof(f)) {
747
      char param[STR_SIZE];
748 1308 phoenix
      if (fscanf(f, "%s ", param) != 1) break;
749 1358 nogj
      /* Is this a section? */
750 645 markom
      if (strcmp (param, "section") == 0) {
751 1358 nogj
        struct config_section *cur;
752
        cur_section = NULL;
753 1308 phoenix
        if (fscanf (f, "%s\n", param) != 1) {
754 645 markom
          fprintf (stderr, "%s: ERROR: Section name required.\n", local ? filename : ctmp);
755
          exit (1);
756
        }
757 1358 nogj
        for (cur = sections; cur; cur = cur->next)
758
          if (strcmp (cur->name, param) == 0) {
759
            cur_section = cur;
760 645 markom
            break;
761
          }
762 1358 nogj
        if (!cur) {
763
          fprintf (stderr, "WARNING: config: Unknown section: %s; ignoring.", param);
764 645 markom
          /* just skip section */
765 1308 phoenix
          while (fscanf (f, "%s\n", param) != 1 && strcmp (param, "end"));
766 1358 nogj
        } else {
767
          cur->dat = NULL;
768
          if (cur->sec_start)
769
            cur->dat = cur->sec_start();
770 645 markom
        }
771
      } else if (strcmp (param, "end") == 0) {
772 1358 nogj
        if(cur_section->sec_end)
773
          cur_section->sec_end(cur_section->dat);
774
        cur_section = NULL;
775 645 markom
      } else if (strncmp (param, "/*", 2) == 0) {
776
        char c0 = 0, c1 = 0;
777
        while (c0 != '*' || c1 != '/') {
778
          c0 = c1;
779
          c1 = fgetc(f);
780
          if (feof(f)) {
781
            fprintf (stderr, "%s: ERROR: Comment reached EOF.\n", local ? filename : ctmp);
782
            exit (1);
783
          }
784
        }
785
      } else {
786 1358 nogj
        struct config_param *cur_param;
787
        char *cur_p;
788
        for (cur_param = cur_section->params; cur_param; cur_param = cur_param->next)
789
          if (strcmp (cur_param->name, param) == 0) {
790 645 markom
            break;
791
          }
792 1358 nogj
        if (!cur_param) {
793 645 markom
          char tmp[200];
794
          sprintf (tmp, "Invalid parameter: %s; ignoring.\n", param);
795
          WARNING(tmp);
796
          while (fgetc(f) != '\n' || feof(f));
797
          continue;
798
        }
799
 
800 1358 nogj
        if(cur_param->type == paramt_none)
801
          continue;
802
 
803 645 markom
        /* Parse parameter value */
804 1358 nogj
        cur_p = fgets (param, STR_SIZE, f);
805
 
806
        while(*cur_p && isspace(*cur_p)) cur_p++;
807
 
808
        switch_param(cur_p, cur_param);
809 645 markom
      }
810
    }
811
    fclose (f);
812
    runtime.sim.script_file_specified = 1;
813
  } else
814
    if (config.sim.verbose)
815
      fprintf (stderr, "WARNING: Cannot read script file from '%s',\nneither '%s'.\n", filename, ctmp);
816
}
817
 
818
/* Utility for execution of set sim command.  */
819 1353 nogj
static int set_config (int argc, char **argv)
820 645 markom
{
821 1358 nogj
  struct config_section *cur;
822
  struct config_param *cur_param;
823 1353 nogj
 
824
  if (argc < 2) return 1;
825
 
826
  PRINTF ("sec:%s\n", argv[1]);
827 1358 nogj
  cur_section = NULL;
828
  for (cur = sections; cur; cur = cur->next)
829
    if (strcmp (cur->name, argv[1]) == 0) {
830
      cur_section = cur;
831 645 markom
      break;
832
    }
833
 
834 1358 nogj
  if (!cur_section) return 1;
835 1353 nogj
 
836
  if (argc < 3) return 2;
837 645 markom
 
838 1353 nogj
  PRINTF ("item:%s\n", argv[2]);
839 645 markom
  {
840 1358 nogj
    for (cur_param = cur->params; cur_param; cur_param = cur_param->next)
841
      if (strcmp (cur_param->name, argv[2]) == 0) {
842 645 markom
        break;
843
      }
844 1358 nogj
    if (!cur_param) return 2;
845 645 markom
 
846
    /* Parse parameter value */
847 1358 nogj
    if (cur_param->type) {
848 1353 nogj
      if (argc < 4) return 3;
849
      PRINTF ("params:%s\n", argv[3]);
850
    }
851 1358 nogj
 
852
    switch_param(argv[3], cur_param);
853 645 markom
  }
854
  return 0;
855
}
856
 
857
/* Executes set sim command, displays error.  */
858 1353 nogj
void set_config_command(int argc, char **argv)
859 645 markom
{
860 1358 nogj
  struct config_section *cur;
861
  struct config_param *cur_param;
862 1353 nogj
 
863
  switch (set_config (argc, argv)) {
864 645 markom
    case 1:
865 997 markom
      PRINTF ("Invalid or missing section name.  One of valid sections must be specified:\n");
866 1358 nogj
      for (cur = sections; cur; cur = cur->next)
867
        PRINTF ("%s ", cur->name);
868 997 markom
      PRINTF ("\n");
869 645 markom
      break;
870
    case 2:
871 997 markom
      PRINTF ("Invalid or missing item name.  One of valid items must be specified:\n");
872 1358 nogj
      for (cur_param = cur_section->params; cur_param; cur_param = cur_param->next)
873
        PRINTF ("%s ", cur_param->name);
874 997 markom
      PRINTF ("\n");
875 645 markom
      break;
876
    case 3:
877 997 markom
      PRINTF ("Invalid parameters specified.\n");
878 645 markom
      break;
879
  }
880
}
881
 
882
/* Outputs C structure of current config to file */
883
void output_cfg (FILE *f)
884
{
885
  int i, comma;
886
  fprintf (f, "/* This file was automatically generated by or1ksim,\n"
887
              "   using --output-cfg switch (cfg file '%s'). */\n"
888
  "const static struct config config = {\n", runtime.sim.script_fn);
889
 
890 731 ivang
  fprintf (f, "  tick:{enabled:%i},\n", config.tick.enabled);
891 645 markom
 
892
  fprintf (f, "  memory:{pattern:%i, random_seed:%i, type:%s, nmemories:%i, table:{", config.memory.pattern, config.memory.random_seed,
893
    config.memory.type == MT_UNKNOWN ? "MT_UNKNOWN" : config.memory.type == MT_PATTERN ? "MT_PATTERN" : "MT_RANDOM", config.memory.nmemories);
894
  comma = 0;
895
  for (i = 0; i < config.memory.nmemories; i++) {
896 1308 phoenix
    fprintf (f, "%s\n    {ce:%i, baseaddr:0x%08lx, size:0x%08lx, name:\"%s\", log:\"%s\", delayr:%i, delayw:%i}",
897 645 markom
      comma ? "," :"", config.memory.table[i].ce, config.memory.table[i].baseaddr, config.memory.table[i].size, config.memory.table[i].name,
898
      config.memory.table[i].log, config.memory.table[i].delayr, config.memory.table[i].delayw);
899
    comma = 1;
900
  }
901
  fprintf (f, "}},\n");
902
 
903
  fprintf (f, "  immu:{enabled:%i, nways:%i, nsets:%i, pagesize:%i, entrysize:%i, ustates:%i, missdelay:%i, hitdelay:%i},\n",
904
    config.immu.enabled, config.immu.nways, config.immu.nsets, config.immu.pagesize, config.immu.entrysize, config.immu.ustates,
905
    config.immu.missdelay, config.immu.hitdelay);
906
 
907
  fprintf (f, "  dmmu:{enabled:%i, nways:%i, nsets:%i, pagesize:%i, entrysize:%i, ustates:%i, missdelay:%i, hitdelay:%i},\n",
908
    config.dmmu.enabled, config.dmmu.nways, config.dmmu.nsets, config.dmmu.pagesize, config.dmmu.entrysize, config.dmmu.ustates,
909
    config.dmmu.missdelay, config.dmmu.hitdelay);
910
 
911
  fprintf (f, "  ic:{enabled:%i, nways:%i, nsets:%i, blocksize:%i, ustates:%i, missdelay:%i, hitdelay:%i},\n",
912
    config.ic.enabled, config.ic.nways, config.ic.nsets, config.ic.blocksize, config.ic.ustates,
913
    config.ic.missdelay, config.ic.hitdelay);
914
 
915
  fprintf (f, "  dc:{enabled:%i, nways:%i, nsets:%i, blocksize:%i, ustates:%i,\n"
916
    "    load_missdelay:%i, load_hitdelay:%i, store_missdelay:%i, store_hitdelay:%i},\n",
917
    config.dc.enabled, config.dc.nways, config.dc.nsets, config.dc.blocksize, config.dc.ustates,
918
    config.dc.load_missdelay, config.dc.load_hitdelay, config.dc.store_missdelay, config.dc.store_hitdelay);
919
 
920
  fprintf (f, "  bpb:{enabled:%i, sbp_bnf_fwd:%i, sbp_bf_fwd:%i, btic:%i, missdelay:%i, hitdelay:%i},\n",
921
    config.bpb.enabled, config.bpb.sbp_bnf_fwd, config.bpb.sbp_bf_fwd, config.bpb.btic, config.bpb.missdelay, config.bpb.hitdelay);
922
 
923 1308 phoenix
  fprintf (f, "  cpu:{upr:0x%08lx, ver:0x%04lx, rev:0x%04lx, superscalar:%i, hazards:%i, dependstats:%i,\n"
924 732 ivang
    "    sr:0x%08x},\n",
925 645 markom
    config.cpu.upr, config.cpu.ver, config.cpu.rev, config.cpu.superscalar, config.cpu.hazards, config.cpu.dependstats,
926 732 ivang
    config.cpu.sr);
927 645 markom
 
928
  fprintf (f, "  sim:{debug:%i, verbose:%i, profile:%i, prof_fn:\"%s\", mprofile:%i, mprof_fn:\"%s\",\n",
929
    config.sim.debug, config.sim.verbose, config.sim.profile, config.sim.prof_fn, config.sim.mprofile, config.sim.mprof_fn);
930
 
931 1308 phoenix
  fprintf (f, "    history:%i, exe_log:%i, exe_log_fn:\"%s\", clkcycle_ps:%li,\n",
932 645 markom
    config.sim.history, config.sim.exe_log, config.sim.exe_log_fn, config.sim.clkcycle_ps);
933
 
934
  fprintf (f, "    spr_log:%i, spr_log_fn:\"%s\"},\n",
935
    config.sim.spr_log, config.sim.spr_log_fn);
936
 
937 1308 phoenix
  fprintf (f, "  debug:{enabled:%i, gdb_enabled:%i, server_port:%i, vapi_id:0x%08lx},\n",
938 645 markom
    config.debug.enabled, config.debug.gdb_enabled, config.debug.server_port, config.debug.vapi_id);
939
 
940
  fprintf (f, "  vapi:{enabled:%i, server_port:%i, log_enabled:%i, hide_device_id:%i, vapi_fn:\"%s\"},\n",
941
    config.vapi.enabled, config.vapi.server_port, config.vapi.log_enabled, config.vapi.hide_device_id, config.vapi.vapi_fn);
942
 
943
  fprintf (f, "  pm:{enabled:%i}\n",
944
    config.pm.enabled);
945
 
946
  fprintf (f, "};\n");
947
}

powered by: WebSVN 2.1.0

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