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

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_61/] [or1ksim/] [sim-config.c] - Diff between revs 361 and 394

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 361 Rev 394
/* config.c -- Simulator configuration
/* config.c -- Simulator configuration
   Copyright (C) 1999 Damjan Lampret, lampret@opencores.org
   Copyright (C) 1999 Damjan Lampret, lampret@opencores.org
 
 
This file is part of OpenRISC 1000 Architectural Simulator.
This file is part of OpenRISC 1000 Architectural Simulator.
 
 
This program is free software; you can redistribute it and/or modify
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
(at your option) any later version.
 
 
This program is distributed in the hope that it will be useful,
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
GNU General Public License for more details.
 
 
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
 
 
/* Simulator configuration. Eventually this one will be a lot bigger. */
/* Simulator configuration. Eventually this one will be a lot bigger. */
 
 
#include <stdlib.h>
#include <stdlib.h>
#include "sim-config.h"
#include "sim-config.h"
#include "abstract.h"
#include "abstract.h"
#include "spr_defs.h"
#include "spr_defs.h"
#include "pic.h"
#include "pic.h"
 
 
#define WARNING(s) fprintf (stderr, "WARNING: config.%s: %s\n", sections[section], s)
#define WARNING(s) fprintf (stderr, "WARNING: config.%s: %s\n", sections[section], s)
#define ERROR(s) {fprintf (stderr, "ERROR: %s\n", s); if (runtime.sim.init) exit (1);}
#define ERROR(s) {fprintf (stderr, "ERROR: %s\n", s); if (runtime.sim.init) exit (1);}
 
 
struct config config;
struct config config;
struct runtime runtime;
struct runtime runtime;
 
 
int section = 0;
int section = 0;
extern struct section {
extern struct section {
  char *name;
  char *name;
  int flags;
  int flags;
} sections[];
} sections[];
 
 
void init_defconfig()
void init_defconfig()
{
{
  unsigned long val;
  unsigned long val;
 
 
  memset(&config, 0, sizeof(config));
  memset(&config, 0, sizeof(config));
  memset(&runtime, 0, sizeof(runtime));
  memset(&runtime, 0, sizeof(runtime));
  /* Sim */
  /* Sim */
  config.sim.exe_log = 0;
  config.sim.exe_log = 0;
  runtime.sim.fexe_log = NULL;
  runtime.sim.fexe_log = NULL;
  strcpy (config.sim.exe_log_fn, "executed.log");
  strcpy (config.sim.exe_log_fn, "executed.log");
 
 
  config.sim.debug = 0;
  config.sim.debug = 0;
  config.sim.verbose = 1;
  config.sim.verbose = 1;
  config.sim.iprompt = 0;
  config.sim.iprompt = 0;
 
 
  config.sim.profile = 0;
  config.sim.profile = 0;
  runtime.sim.fprof = NULL;
  runtime.sim.fprof = NULL;
  strcpy (config.sim.prof_fn, "sim.profile");
  strcpy (config.sim.prof_fn, "sim.profile");
  runtime.sim.init = 1;
  runtime.sim.init = 1;
  runtime.sim.script_file_specified = 0;
  runtime.sim.script_file_specified = 0;
 
 
  /* Memory */
  /* Memory */
  config.memory.type = MT_PATTERN;
  config.memory.type = MT_PATTERN;
  config.memory.pattern = 0;
  config.memory.pattern = 0;
  config.memory.random_seed = -1;  /* Generate new seed */
  config.memory.random_seed = -1;  /* Generate new seed */
  strcpy(config.memory.memory_table_file, "simmem.cfg");
  strcpy(config.memory.memory_table_file, "simmem.cfg");
 
 
  /* Memory Controller */
  /* Memory Controller */
  config.mc.enabled = 0;
  config.mc.enabled = 0;
 
 
  /* Uarts */
  /* Uarts */
  config.nuarts = 0;
  config.nuarts = 0;
  config.uarts_enabled = 0;
  config.uarts_enabled = 0;
 
 
  /* DMAs */
  /* DMAs */
  config.ndmas = 0;
  config.ndmas = 0;
  config.dmas_enabled = 0;
  config.dmas_enabled = 0;
 
 
  /* CPU */
  /* CPU */
  config.cpu.superscalar = 0;
  config.cpu.superscalar = 0;
  config.cpu.history = 0;
  config.sim.history = 0;
  config.cpu.hazards = 0;
  config.cpu.hazards = 0;
  config.cpu.dependstats = 0;
  config.cpu.dependstats = 0;
  config.cpu.dependency = 0;
 
  config.cpu.slp = 0;
  config.cpu.slp = 0;
  config.cpu.upr = SPR_UPR_UP | SPR_UPR_DCP | SPR_UPR_ICP | SPR_UPR_DMP
  config.cpu.upr = SPR_UPR_UP | SPR_UPR_DCP | SPR_UPR_ICP | SPR_UPR_DMP
                 | SPR_UPR_IMP | SPR_UPR_OB32P | SPR_UPR_DUP | SPR_UPR_PICP
                 | SPR_UPR_IMP | SPR_UPR_OB32P | SPR_UPR_DUP | SPR_UPR_PICP
                 | SPR_UPR_PMP | SPR_UPR_TTP;
                 | SPR_UPR_PMP | SPR_UPR_TTP;
 
 
  /* Debug */
  /* Debug */
  config.debug.enabled = 0;
  config.debug.enabled = 0;
  config.debug.gdb_enabled = 0;
  config.debug.gdb_enabled = 0;
  config.debug.server_port = 0;
  config.debug.server_port = 0;
 
 
  /* VAPI */
  /* VAPI */
  config.vapi.enabled = 0;
  config.vapi.enabled = 0;
  strcpy (config.vapi.vapi_fn, "vapi.log");
  strcpy (config.vapi.vapi_fn, "vapi.log");
  runtime.vapi.vapi_file = NULL;
  runtime.vapi.vapi_file = NULL;
 
 
  /* Ethernet */
  /* Ethernet */
  config.ethernets_enabled = 0;
  config.ethernets_enabled = 0;
 
 
  /* Tick timer */
  /* Tick timer */
  config.tick.enabled = 0;
  config.tick.enabled = 0;
 
 
  /* Old */
  /* Old */
  config.dc.tagtype = PHYSICAL/*VIRTUAL*/;
  config.dc.tagtype = PHYSICAL/*VIRTUAL*/;
  config.ic.tagtype = PHYSICAL/*VIRTUAL*/;
  config.ic.tagtype = PHYSICAL/*VIRTUAL*/;
  config.clkcycle_ns = 4; /* 4 for 4ns (250MHz) */
  config.clkcycle_ns = 4; /* 4 for 4ns (250MHz) */
}
}
 
 
int parse_args(int argc, char *argv[])
int parse_args(int argc, char *argv[])
{
{
  unsigned long val;
  unsigned long val;
 
 
  argv++; argc--;
  argv++; argc--;
  while (argc) {
  while (argc) {
    if (argc && (*argv[0] != '-')) {
    if (argc && (*argv[0] != '-')) {
      runtime.sim.filename = argv[0];
      runtime.sim.filename = argv[0];
      argc--;
      argc--;
      argv++;
      argv++;
    } else
    } else
    if (strcmp(*argv, "-f") == 0 || strcmp(*argv, "--file") == 0) {
    if (strcmp(*argv, "-f") == 0 || strcmp(*argv, "--file") == 0) {
      argv++; argc--;
      argv++; argc--;
      read_script_file(argv[0]);
      read_script_file(argv[0]);
      argv++; argc--;
      argv++; argc--;
    } else
    } else
    if (strcmp(*argv, "--nosrv") == 0) {  /* (CZ) */
    if (strcmp(*argv, "--nosrv") == 0) {  /* (CZ) */
      config.debug.gdb_enabled = 0;
      config.debug.gdb_enabled = 0;
      argv++; argc--;
      argv++; argc--;
    } else
    } else
    if (strcmp(*argv, "--srv") == 0) {  /* (CZ) */
    if (strcmp(*argv, "--srv") == 0) {  /* (CZ) */
      char *s;
      char *s;
      if(!--argc)
      if(!--argc)
        return 1;
        return 1;
      config.debug.enabled = 1;
      config.debug.enabled = 1;
      config.debug.gdb_enabled = 0;
      config.debug.gdb_enabled = 0;
      config.debug.server_port = strtol(*(++argv),&s,10);
      config.debug.server_port = strtol(*(++argv),&s,10);
      if(*s)
      if(*s)
        return 1;
        return 1;
      argv++; argc--;
      argv++; argc--;
    } else
    } else
    if (strcmp(*argv, "-i") == 0) {
    if (strcmp(*argv, "-i") == 0) {
      config.sim.iprompt = 1;
      config.sim.iprompt = 1;
      argv++; argc--;
      argv++; argc--;
    } else
    } else
    if (strcmp(*argv, "-v") == 0) {
    if (strcmp(*argv, "-v") == 0) {
      version();
      version();
      exit(0);
      exit(0);
    } else
    } else
    if (strcmp(*argv, "--profile") == 0) {
    if (strcmp(*argv, "--profile") == 0) {
      config.sim.profile = 1;
      config.sim.profile = 1;
      argv++; argc--;
      argv++; argc--;
    } else {
    } else {
      printf("Unknown option: %s\n", *argv);
      printf("Unknown option: %s\n", *argv);
      return 1;
      return 1;
    }
    }
  }
  }
 
 
  if (!argc)
  if (!argc)
    return 0;
    return 0;
 
 
  return 0;
  return 0;
}
}
 
 
#define CNV(x) ((isblank(x) || (x) == 0) ? ' ' : (x))
#define CNV(x) ((isblank(x) || (x) == 0) ? ' ' : (x))
 
 
/* Substitute for less powerful fscanf */
/* Substitute for less powerful fscanf */
int fscanf_ex (FILE *f, char *fmt, void *buf, char *str) {
int fscanf_ex (FILE *f, char *fmt, void *buf, char *str) {
  char tmp[STR_SIZE];
  char tmp[STR_SIZE];
  char ch;
  char ch;
  int i = 0;
  int i = 0;
  while (*fmt) {
  while (*fmt) {
    switch (*fmt) {
    switch (*fmt) {
      case '%':
      case '%':
        while(*fmt != 0 && !isalpha (*fmt))
        while(*fmt != 0 && !isalpha (*fmt))
          tmp[i++] = *(fmt++);
          tmp[i++] = *(fmt++);
        tmp[i++] = *(fmt++);
        tmp[i++] = *(fmt++);
        if (tmp[i - 1] == 's') {
        if (tmp[i - 1] == 's') {
          char *cbuf = (char *)buf;
          char *cbuf = (char *)buf;
          i = 0;
          i = 0;
          while (ch = (f ? fgetc (f) : *str++), isblank(ch))
          while (ch = (f ? fgetc (f) : *str++), isblank(ch))
            if (f ? feof (f) : *str) return 1;
            if (f ? feof (f) : *str) return 1;
          if (f)
          if (f)
            ungetc (ch, f);
            ungetc (ch, f);
          else
          else
            str--;
            str--;
          while ((*(cbuf++) = ch = (f ? fgetc (f) : *str++), CNV(ch) ) != *fmt) {
          while ((*(cbuf++) = ch = (f ? fgetc (f) : *str++), CNV(ch) ) != *fmt) {
            if ((f ? feof (f) : *str)) return 1;
            if ((f ? feof (f) : *str)) return 1;
            if (++i >= STR_SIZE) {
            if (++i >= STR_SIZE) {
              fprintf (stderr, "ERROR: string too long.\n");
              fprintf (stderr, "ERROR: string too long.\n");
              return 1;
              return 1;
            }
            }
          }
          }
          *(--cbuf) = 0;
          *(--cbuf) = 0;
          fmt++;
          fmt++;
        } else {
        } else {
          tmp[i++] = 0;
          tmp[i++] = 0;
          if (f)
          if (f)
            fscanf (f, tmp, buf);
            fscanf (f, tmp, buf);
          else
          else
            sscanf (str, tmp, buf);
            sscanf (str, tmp, buf);
        }
        }
        break;
        break;
      default:
      default:
        while ((ch = (f ? fgetc (f) : *str++)) != *fmt) {
        while ((ch = (f ? fgetc (f) : *str++)) != *fmt) {
          if (!isblank (ch)) {
          if (!isblank (ch)) {
            char tmp[200];
            char tmp[200];
            sprintf (tmp, "unexpected char '%c' (expecting '%c')\n", ch, *fmt);
            sprintf (tmp, "unexpected char '%c' (expecting '%c')\n", ch, *fmt);
            WARNING(tmp);
            WARNING(tmp);
          }
          }
          if ((f ? feof (f) : *str)) return 1;
          if ((f ? feof (f) : *str)) return 1;
        }
        }
        fmt++;
        fmt++;
        break;
        break;
    }
    }
  }
  }
  return 0;
  return 0;
}
}
 
 
void print_config()
void print_config()
{
{
  if (config.sim.verbose) {
  if (config.sim.verbose) {
    printf("Verbose on, ");
    printf("Verbose on, ");
    if (config.sim.debug)
    if (config.sim.debug)
      printf("simdebug on, ");
      printf("simdebug on, ");
    else
    else
      printf("simdebug off, ");
      printf("simdebug off, ");
    if (config.sim.iprompt)
    if (config.sim.iprompt)
      printf("interactive prompt on\n");
      printf("interactive prompt on\n");
    else
    else
      printf("interactive prompt off\n");
      printf("interactive prompt off\n");
 
 
    printf("Machine initialization...\n");
    printf("Machine initialization...\n");
    printf("Clock cycle: %d ns\n", config.clkcycle_ns);
    printf("Clock cycle: %d ns\n", config.clkcycle_ns);
    if (testsprbits(SPR_UPR, SPR_UPR_DCP))
    if (testsprbits(SPR_UPR, SPR_UPR_DCP))
      printf("Data cache tag: %s\n", config.dc.tagtype == VIRTUAL ? "virtual" : "physical");
      printf("Data cache tag: %s\n", config.dc.tagtype == VIRTUAL ? "virtual" : "physical");
    else
    else
      printf("No data cache.\n");
      printf("No data cache.\n");
    if (testsprbits(SPR_UPR, SPR_UPR_ICP))
    if (testsprbits(SPR_UPR, SPR_UPR_ICP))
      printf("Insn cache tag: %s\n", config.ic.tagtype == VIRTUAL ? "virtual" : "physical");
      printf("Insn cache tag: %s\n", config.ic.tagtype == VIRTUAL ? "virtual" : "physical");
    else
    else
      printf("No instruction cache.\n");
      printf("No instruction cache.\n");
    if (config.cpu.bpb)
    if (config.cpu.bpb)
      printf("BPB simulation on.\n");
      printf("BPB simulation on.\n");
    else
    else
      printf("BPB simulation off.\n");
      printf("BPB simulation off.\n");
    if (config.cpu.btic)
    if (config.cpu.btic)
      printf("BTIC simulation on.\n");
      printf("BTIC simulation on.\n");
    else
    else
      printf("BTIC simulation off.\n");
      printf("BTIC simulation off.\n");
  }
  }
}
}
 
 
void change_device ();
void change_device ();
void end_device ();
void end_device ();
void uart_baseaddr ();
void uart_baseaddr ();
void uart_rxfile ();
void uart_rxfile ();
void uart_txfile ();
void uart_txfile ();
void uart_jitter ();
void uart_jitter ();
void uart_irq ();
void uart_irq ();
void uart_16550 ();
void uart_16550 ();
void uart_vapi_id ();
void uart_vapi_id ();
void dma_baseaddr ();
void dma_baseaddr ();
void dma_irq ();
void dma_irq ();
void dma_vapi_id ();
void dma_vapi_id ();
void memory_type ();
void memory_type ();
void eth_baseaddr ();
void eth_baseaddr ();
void eth_dma ();
void eth_dma ();
void eth_rx_channel ();
void eth_rx_channel ();
void eth_tx_channel ();
void eth_tx_channel ();
void eth_rxfile ();
void eth_rxfile ();
void eth_txfile ();
void eth_txfile ();
void eth_vapi_id ();
void eth_vapi_id ();
 
 
unsigned long tempL;
unsigned long tempL;
unsigned long tempUL;
unsigned long tempUL;
char tempS[STR_SIZE];
char tempS[STR_SIZE];
 
 
#define CPF_SUBSECTION 1
#define CPF_SUBSECTION 1
#define CPF_SUBFIELD   2
#define CPF_SUBFIELD   2
 
 
struct section sections[] = {
struct section sections[] = {
  {"?",      0},  /* 0  */
  {"?",      0},  /* 0  */
  {"mc",     0},
  {"mc",     0},
  {"uart",   0},
  {"uart",   0},
  {"dma",    0},
  {"dma",    0},
  {"memory", 0},
  {"memory", 0},
  {"cpu",    0},
  {"cpu",    0},
  {"sim",    0},
  {"sim",    0},
  {"debug",  0},
  {"debug",  0},
  {"VAPI",   0},
  {"VAPI",   0},
  {"ethernet",0},
  {"ethernet",0},
  {"tick",   0}   /* 10 */
  {"tick",   0}   /* 10 */
};
};
 
 
/* *INDENT-OFF* */
/* *INDENT-OFF* */
 
 
/* Parameter definitions */
/* Parameter definitions */
struct config_params {
struct config_params {
  int section;
  int section;
  int attr;
  int attr;
  char *name;
  char *name;
  char *type;
  char *type;
  void (*func)();
  void (*func)();
  void *addr;
  void *addr;
} config_params[] = {
} config_params[] = {
{1, 0, "enabled",            "=%i",         NULL,          (void *)(&config.mc.enabled)},
{1, 0, "enabled",            "=%i",         NULL,          (void *)(&config.mc.enabled)},
{1, 0, "baseaddr",           "=0x%x",       NULL,          (void *)(&config.mc.baseaddr)},
{1, 0, "baseaddr",           "=0x%x",       NULL,          (void *)(&config.mc.baseaddr)},
{1, 0, "POC",                "=0x%x",       NULL,          (void *)(&config.mc.POC)},
{1, 0, "POC",                "=0x%x",       NULL,          (void *)(&config.mc.POC)},
 
 
{2, 0, "enabled",            "=%i",         NULL,          (void *)(&config.uarts_enabled)},
{2, 0, "enabled",            "=%i",         NULL,          (void *)(&config.uarts_enabled)},
{2, 0, "nuarts",             "=%i",         NULL,          (void *)(&config.nuarts)},
{2, 0, "nuarts",             "=%i",         NULL,          (void *)(&config.nuarts)},
{2, 0, "device",             "%i",          change_device, (void *)(&tempL)},
{2, 0, "device",             "%i",          change_device, (void *)(&tempL)},
{2, 0, "enddevice",          "",            end_device,    NULL},
{2, 0, "enddevice",          "",            end_device,    NULL},
{2, 0, "baseaddr",           "=0x%x",       uart_baseaddr, (void *)(&tempUL)},
{2, 0, "baseaddr",           "=0x%x",       uart_baseaddr, (void *)(&tempUL)},
{2, 0, "irq",                "=%i",         uart_irq,      (void *)(&tempL)},
{2, 0, "irq",                "=%i",         uart_irq,      (void *)(&tempL)},
{2, 0, "16550",              "=%i",         uart_16550,    (void *)(&tempL)},
{2, 0, "16550",              "=%i",         uart_16550,    (void *)(&tempL)},
{2, 0, "jitter",             "=%i",         uart_jitter,   (void *)(&tempL)},
{2, 0, "jitter",             "=%i",         uart_jitter,   (void *)(&tempL)},
{2, 0, "rxfile",             "=\"%s\"",     uart_rxfile,   (void *)(&tempS[0])},
{2, 0, "rxfile",             "=\"%s\"",     uart_rxfile,   (void *)(&tempS[0])},
{2, 0, "txfile",             "=\"%s\"",     uart_txfile,   (void *)(&tempS[0])},
{2, 0, "txfile",             "=\"%s\"",     uart_txfile,   (void *)(&tempS[0])},
{2, 0, "vapi_id",            "=0x%x",       uart_vapi_id,  (void *)(&tempUL)},
{2, 0, "vapi_id",            "=0x%x",       uart_vapi_id,  (void *)(&tempUL)},
 
 
{3, 0, "enabled",            "=%i",         NULL,          (void *)(&config.dmas_enabled)},
{3, 0, "enabled",            "=%i",         NULL,          (void *)(&config.dmas_enabled)},
{3, 0, "ndmas",              "=%i",         NULL,          (void *)(&config.ndmas)},
{3, 0, "ndmas",              "=%i",         NULL,          (void *)(&config.ndmas)},
{3, 0, "device",             "%i",          change_device, (void *)(&tempL)},
{3, 0, "device",             "%i",          change_device, (void *)(&tempL)},
{3, 0, "enddevice",          "",            end_device,    NULL},
{3, 0, "enddevice",          "",            end_device,    NULL},
{3, 0, "baseaddr",           "=0x%x",       dma_baseaddr,  (void *)(&tempUL)},
{3, 0, "baseaddr",           "=0x%x",       dma_baseaddr,  (void *)(&tempUL)},
{3, 0, "irq",                "=%i",         dma_baseaddr,  (void *)(&tempL)},
{3, 0, "irq",                "=%i",         dma_baseaddr,  (void *)(&tempL)},
{3, 0, "vapi_id",            "=0x%x",       dma_vapi_id,   (void *)(&tempUL)},
{3, 0, "vapi_id",            "=0x%x",       dma_vapi_id,   (void *)(&tempUL)},
 
 
{4, 0, "memory_table_file",  "=\"%s\"",     NULL,          (void *)(&config.memory.memory_table_file[0])},
{4, 0, "memory_table_file",  "=\"%s\"",     NULL,          (void *)(&config.memory.memory_table_file[0])},
{4, 0, "random_seed",        "=%i",         NULL,          (void *)(&config.memory.random_seed)},
{4, 0, "random_seed",        "=%i",         NULL,          (void *)(&config.memory.random_seed)},
{4, 0, "pattern",            "=%i",         NULL,          (void *)(&config.memory.pattern)},
{4, 0, "pattern",            "=%i",         NULL,          (void *)(&config.memory.pattern)},
{4, 0, "type",               "=%s ",        memory_type,   (void *)(&tempS[0])},
{4, 0, "type",               "=%s ",        memory_type,   (void *)(&tempS[0])},
 
 
{5, 0, "ver",                "=0x%x",       NULL,          (void *)(&config.cpu.ver)},
{5, 0, "ver",                "=0x%x",       NULL,          (void *)(&config.cpu.ver)},
{5, 0, "rev",                "=0x%x",       NULL,          (void *)(&config.cpu.rev)},
{5, 0, "rev",                "=0x%x",       NULL,          (void *)(&config.cpu.rev)},
{5, 0, "upr",                "=0x%x",       NULL,          (void *)(&config.cpu.upr)},
{5, 0, "upr",                "=0x%x",       NULL,          (void *)(&config.cpu.upr)},
{5, 0, "hazards",            "=%i",         NULL,          (void *)(&config.cpu.hazards)},
{5, 0, "hazards",            "=%i",         NULL,          (void *)(&config.cpu.hazards)},
{5, 0, "history",            "=%i",         NULL,          (void *)(&config.cpu.history)},
 
{5, 0, "superscalar",        "=%i",         NULL,          (void *)(&config.cpu.superscalar)},
{5, 0, "superscalar",        "=%i",         NULL,          (void *)(&config.cpu.superscalar)},
{5, 0, "dependstats",        "=%i",         NULL,          (void *)(&config.cpu.dependstats)},
{5, 0, "dependstats",        "=%i",         NULL,          (void *)(&config.cpu.dependstats)},
{5, 0, "dependency",         "=%i",         NULL,          (void *)(&config.cpu.dependency)},
 
{5, 0, "slp",                "=%i",         NULL,          (void *)(&config.cpu.slp)},
{5, 0, "slp",                "=%i",         NULL,          (void *)(&config.cpu.slp)},
{5, 0, "bpb",                "=%i",         NULL,          (void *)(&config.cpu.bpb)},
{5, 0, "bpb",                "=%i",         NULL,          (void *)(&config.cpu.bpb)},
{5, 0, "btic",               "=%i",         NULL,          (void *)(&config.cpu.btic)},
{5, 0, "btic",               "=%i",         NULL,          (void *)(&config.cpu.btic)},
 
 
{6, 0, "debug",              "=%i",         NULL,          (void *)(&config.sim.debug)},
{6, 0, "debug",              "=%i",         NULL,          (void *)(&config.sim.debug)},
{6, 0, "iprompt",            "=%i",         NULL,          (void *)(&config.sim.iprompt)},
{6, 0, "iprompt",            "=%i",         NULL,          (void *)(&config.sim.iprompt)},
{6, 0, "verbose",            "=%i",         NULL,          (void *)(&config.sim.verbose)},
{6, 0, "verbose",            "=%i",         NULL,          (void *)(&config.sim.verbose)},
{6, 0, "profile",            "=%i",         NULL,          (void *)(&config.sim.profile)},
{6, 0, "profile",            "=%i",         NULL,          (void *)(&config.sim.profile)},
{6, 0, "prof_fn",            "=\"%s\"",     NULL,          (void *)(&config.sim.prof_fn[0])},
{6, 0, "prof_fn",            "=\"%s\"",     NULL,          (void *)(&config.sim.prof_fn[0])},
 
{6, 0, "history",            "=%i",         NULL,          (void *)(&config.sim.history)},
{6, 0, "exe_log",            "=%i",         NULL,          (void *)(&config.sim.exe_log)},
{6, 0, "exe_log",            "=%i",         NULL,          (void *)(&config.sim.exe_log)},
{6, 0, "exe_log_fn",         "=\"%s\"",     NULL,          (void *)(&config.sim.exe_log_fn[0])},
{6, 0, "exe_log_fn",         "=\"%s\"",     NULL,          (void *)(&config.sim.exe_log_fn[0])},
 
 
{7, 0, "enabled",            "=%i",         NULL,          (void *)(&config.debug.enabled)},
{7, 0, "enabled",            "=%i",         NULL,          (void *)(&config.debug.enabled)},
{7, 0, "gdb_enabled",        "=%i",         NULL,          (void *)(&config.debug.gdb_enabled)},
{7, 0, "gdb_enabled",        "=%i",         NULL,          (void *)(&config.debug.gdb_enabled)},
{7, 0, "server_port",        "=%i",         NULL,          (void *)(&config.debug.server_port)},
{7, 0, "server_port",        "=%i",         NULL,          (void *)(&config.debug.server_port)},
 
 
{8, 0, "enabled",            "=%i",         NULL,          (void *)(&config.vapi.enabled)},
{8, 0, "enabled",            "=%i",         NULL,          (void *)(&config.vapi.enabled)},
{8, 0, "server_port",        "=%i",         NULL,          (void *)(&config.vapi.server_port)},
{8, 0, "server_port",        "=%i",         NULL,          (void *)(&config.vapi.server_port)},
{8, 0, "log_enabled",        "=%i",         NULL,          (void *)(&config.vapi.log_enabled)},
{8, 0, "log_enabled",        "=%i",         NULL,          (void *)(&config.vapi.log_enabled)},
{8, 0, "vapi_log_fn",        "=\"%s\"",     NULL,          (void *)(&config.vapi.vapi_fn[0])},
{8, 0, "vapi_log_fn",        "=\"%s\"",     NULL,          (void *)(&config.vapi.vapi_fn[0])},
 
 
{9, 0, "enabled",            "=%i",         NULL,          (void *)(&config.ethernets_enabled)},
{9, 0, "enabled",            "=%i",         NULL,          (void *)(&config.ethernets_enabled)},
{9, 0, "nethernets",         "=%i",         NULL,          (void *)(&config.nethernets)},
{9, 0, "nethernets",         "=%i",         NULL,          (void *)(&config.nethernets)},
{9, 0, "device",             "%i",          change_device, (void *)(&tempL)},
{9, 0, "device",             "%i",          change_device, (void *)(&tempL)},
{9, 0, "enddevice",          "",            end_device,    NULL},
{9, 0, "enddevice",          "",            end_device,    NULL},
{9, 0, "baseaddr",           "=0x%x",       eth_baseaddr,  (void *)(&tempUL)},
{9, 0, "baseaddr",           "=0x%x",       eth_baseaddr,  (void *)(&tempUL)},
{9, 0, "dma",                "=%i",         eth_dma,       (void *)(&tempL)},
{9, 0, "dma",                "=%i",         eth_dma,       (void *)(&tempL)},
{9, 0, "rx_channel",         "=%i",         eth_rx_channel,(void *)(&tempL)},
{9, 0, "rx_channel",         "=%i",         eth_rx_channel,(void *)(&tempL)},
{9, 0, "tx_channel",         "=%i",         eth_tx_channel,(void *)(&tempL)},
{9, 0, "tx_channel",         "=%i",         eth_tx_channel,(void *)(&tempL)},
{9, 0, "rxfile",             "=\"%s\"",     eth_rxfile,    (void *)(&tempS[0])},
{9, 0, "rxfile",             "=\"%s\"",     eth_rxfile,    (void *)(&tempS[0])},
{9, 0, "txfile",             "=\"%s\"",     eth_txfile,    (void *)(&tempS[0])},
{9, 0, "txfile",             "=\"%s\"",     eth_txfile,    (void *)(&tempS[0])},
{9, 0, "vapi_id",            "=0x%x",       eth_vapi_id,   (void *)(&tempUL)},
{9, 0, "vapi_id",            "=0x%x",       eth_vapi_id,   (void *)(&tempUL)},
 
 
{10,0, "enabled",            "=%i",         NULL,          (void *)(&config.tick.enabled)},
{10,0, "enabled",            "=%i",         NULL,          (void *)(&config.tick.enabled)},
{10,0, "irq",                "=%i",         NULL,          (void *)(&config.tick.irq)},
{10,0, "irq",                "=%i",         NULL,          (void *)(&config.tick.irq)},
};
};
 
 
/* *INDENT-ON* */
/* *INDENT-ON* */
 
 
int current_device = -1;
int current_device = -1;
void change_device () {
void change_device () {
  current_device = tempL;
  current_device = tempL;
}
}
 
 
void end_device () {
void end_device () {
  current_device = -1;
  current_device = -1;
}
}
 
 
void uart_baseaddr () {
void uart_baseaddr () {
  if (current_device >= 0 && current_device < config.nuarts)
  if (current_device >= 0 && current_device < config.nuarts)
    config.uarts[current_device].baseaddr = tempUL;
    config.uarts[current_device].baseaddr = tempUL;
  else
  else
    ERROR("invalid device number.");
    ERROR("invalid device number.");
}
}
 
 
void uart_jitter () {
void uart_jitter () {
  if (current_device >= 0 && current_device < config.nuarts)
  if (current_device >= 0 && current_device < config.nuarts)
    config.uarts[current_device].jitter = tempL;
    config.uarts[current_device].jitter = tempL;
  else
  else
    ERROR("invalid device number.");
    ERROR("invalid device number.");
}
}
 
 
void uart_irq () {
void uart_irq () {
  if (current_device >= 0 && current_device < config.nuarts)
  if (current_device >= 0 && current_device < config.nuarts)
    config.uarts[current_device].irq = tempL;
    config.uarts[current_device].irq = tempL;
  else
  else
    ERROR("invalid device number.");
    ERROR("invalid device number.");
}
}
 
 
void uart_16550 () {
void uart_16550 () {
  if (current_device >= 0 && current_device < config.nuarts)
  if (current_device >= 0 && current_device < config.nuarts)
    config.uarts[current_device].uart16550 = tempL;
    config.uarts[current_device].uart16550 = tempL;
  else
  else
    ERROR("invalid device number.");
    ERROR("invalid device number.");
}
}
 
 
void uart_rxfile () {
void uart_rxfile () {
  if (current_device >= 0 && current_device < config.nuarts)
  if (current_device >= 0 && current_device < config.nuarts)
    strcpy (config.uarts[current_device].rxfile, tempS);
    strcpy (config.uarts[current_device].rxfile, tempS);
  else
  else
    ERROR("invalid device number.");
    ERROR("invalid device number.");
}
}
 
 
void uart_txfile () {
void uart_txfile () {
  if (current_device >= 0 && current_device < config.nuarts)
  if (current_device >= 0 && current_device < config.nuarts)
    strcpy (config.uarts[current_device].txfile, tempS);
    strcpy (config.uarts[current_device].txfile, tempS);
  else
  else
    ERROR("invalid device number.");
    ERROR("invalid device number.");
}
}
 
 
void uart_vapi_id () {
void uart_vapi_id () {
  if (current_device >= 0 && current_device < config.nuarts)
  if (current_device >= 0 && current_device < config.nuarts)
    config.uarts[current_device].vapi_id = tempUL;
    config.uarts[current_device].vapi_id = tempUL;
  else
  else
    ERROR("invalid device number.");
    ERROR("invalid device number.");
}
}
 
 
void dma_baseaddr () {
void dma_baseaddr () {
  if (current_device >= 0 && current_device < config.ndmas)
  if (current_device >= 0 && current_device < config.ndmas)
    config.dmas[current_device].baseaddr = tempUL;
    config.dmas[current_device].baseaddr = tempUL;
  else
  else
    ERROR("invalid device number.");
    ERROR("invalid device number.");
}
}
 
 
void dma_irq () {
void dma_irq () {
  if (current_device >= 0 && current_device < config.ndmas)
  if (current_device >= 0 && current_device < config.ndmas)
    config.dmas[current_device].irq = tempL;
    config.dmas[current_device].irq = tempL;
  else
  else
    ERROR("invalid device number.");
    ERROR("invalid device number.");
}
}
 
 
void dma_vapi_id () {
void dma_vapi_id () {
  if (current_device >= 0 && current_device < config.ndmas)
  if (current_device >= 0 && current_device < config.ndmas)
    config.dmas[current_device].vapi_id = tempUL;
    config.dmas[current_device].vapi_id = tempUL;
  else
  else
    ERROR("invalid device number.");
    ERROR("invalid device number.");
}
}
 
 
void memory_type () {
void memory_type () {
  if (strcmp (tempS, "unknown") == 0)
  if (strcmp (tempS, "unknown") == 0)
    config.memory.type = MT_UNKNOWN;
    config.memory.type = MT_UNKNOWN;
  else if (strcmp (tempS, "random") == 0)
  else if (strcmp (tempS, "random") == 0)
    config.memory.type = MT_RANDOM;
    config.memory.type = MT_RANDOM;
  else if (strcmp (tempS, "pattern") == 0)
  else if (strcmp (tempS, "pattern") == 0)
    config.memory.type = MT_PATTERN;
    config.memory.type = MT_PATTERN;
  else if (strcmp (tempS, "zero") == 0) {
  else if (strcmp (tempS, "zero") == 0) {
    config.memory.type = MT_PATTERN;
    config.memory.type = MT_PATTERN;
    config.memory.pattern = 0;
    config.memory.pattern = 0;
  } else {
  } else {
    char tmp[200];
    char tmp[200];
    sprintf (tmp, "invalid memory type '%s'.\n", tempS);
    sprintf (tmp, "invalid memory type '%s'.\n", tempS);
    ERROR(tmp);
    ERROR(tmp);
  }
  }
}
}
 
 
void eth_baseaddr () {
void eth_baseaddr () {
  if (current_device >= 0 && current_device < config.nethernets)
  if (current_device >= 0 && current_device < config.nethernets)
    config.ethernets[current_device].baseaddr = tempUL;
    config.ethernets[current_device].baseaddr = tempUL;
  else
  else
    ERROR("invalid device number.");
    ERROR("invalid device number.");
}
}
 
 
void eth_dma () {
void eth_dma () {
  if (current_device >= 0 && current_device < config.nethernets)
  if (current_device >= 0 && current_device < config.nethernets)
    config.ethernets[current_device].dma = tempL;
    config.ethernets[current_device].dma = tempL;
  else
  else
    ERROR("invalid device number.");
    ERROR("invalid device number.");
}
}
 
 
void eth_rx_channel () {
void eth_rx_channel () {
  if (current_device >= 0 && current_device < config.nethernets)
  if (current_device >= 0 && current_device < config.nethernets)
    config.ethernets[current_device].rx_channel = tempL;
    config.ethernets[current_device].rx_channel = tempL;
  else
  else
    ERROR("invalid device number.");
    ERROR("invalid device number.");
}
}
 
 
void eth_tx_channel () {
void eth_tx_channel () {
  if (current_device >= 0 && current_device < config.nethernets)
  if (current_device >= 0 && current_device < config.nethernets)
    config.ethernets[current_device].rx_channel = tempL;
    config.ethernets[current_device].rx_channel = tempL;
  else
  else
    ERROR("invalid device number.");
    ERROR("invalid device number.");
}
}
 
 
void eth_rxfile () {
void eth_rxfile () {
  if (current_device >= 0 && current_device < config.nethernets)
  if (current_device >= 0 && current_device < config.nethernets)
    strcpy (config.ethernets[current_device].rxfile, tempS);
    strcpy (config.ethernets[current_device].rxfile, tempS);
  else
  else
    ERROR("invalid device number.");
    ERROR("invalid device number.");
}
}
 
 
void eth_txfile () {
void eth_txfile () {
  if (current_device >= 0 && current_device < config.nethernets)
  if (current_device >= 0 && current_device < config.nethernets)
    strcpy (config.ethernets[current_device].txfile, tempS);
    strcpy (config.ethernets[current_device].txfile, tempS);
  else
  else
    ERROR("invalid device number.");
    ERROR("invalid device number.");
}
}
 
 
void eth_vapi_id () {
void eth_vapi_id () {
  if (current_device >= 0 && current_device < config.nethernets)
  if (current_device >= 0 && current_device < config.nethernets)
    config.ethernets[current_device].vapi_id = tempUL;
    config.ethernets[current_device].vapi_id = tempUL;
  else
  else
    ERROR("nvalid device number.");
    ERROR("nvalid device number.");
}
}
 
 
 
 
 
 
/* Read environment from a script file. Does not fail - assumes defaukt configuration instead.
/* Read environment from a script file. Does not fail - assumes defaukt configuration instead.
   The syntax of script file is:
   The syntax of script file is:
   param = value
   param = value
   section x
   section x
     data
     data
     param = value
     param = value
   end
   end
 
 
   Example:
   Example:
   section mc
   section mc
     memory_table_file = sim.mem
     memory_table_file = sim.mem
     enable = 1
     enable = 1
     POC = 0x47892344
     POC = 0x47892344
   end
   end
 
 
 */
 */
 
 
void read_script_file (char *filename)
void read_script_file (char *filename)
{
{
  FILE *f;
  FILE *f;
  unsigned long memory_needed = 0;
  unsigned long memory_needed = 0;
  char *home = getenv("HOME");
  char *home = getenv("HOME");
  char ctmp[STR_SIZE];
  char ctmp[STR_SIZE];
  int local = 1;
  int local = 1;
  section = 0;
  section = 0;
 
 
  sprintf(ctmp, "%s/.or1k/%s", home, filename);
  sprintf(ctmp, "%s/.or1k/%s", home, filename);
  if ((f = fopen (filename, "rt")) != NULL
  if ((f = fopen (filename, "rt")) != NULL
      || home != NULL && !(local = 0) && (f = fopen (ctmp, "rt")) != NULL) {
      || home != NULL && !(local = 0) && (f = fopen (ctmp, "rt")) != NULL) {
    unsigned long start, length;
    unsigned long start, length;
    char type[STR_SIZE];
    char type[STR_SIZE];
    int nparam;
    int nparam;
    int rd, wd;
    int rd, wd;
    if (config.sim.verbose)
    if (config.sim.verbose)
      printf ("Reading script file from '%s':\n", local ? filename : ctmp);
      printf ("Reading script file from '%s':\n", local ? filename : ctmp);
    while (!feof(f)) {
    while (!feof(f)) {
      char param[STR_SIZE];
      char param[STR_SIZE];
      if (fscanf(f, "%s ", &param) != 1) break;
      if (fscanf(f, "%s ", &param) != 1) break;
      /* Is this a sections? */
      /* Is this a sections? */
      if (strcmp (param, "section") == 0) {
      if (strcmp (param, "section") == 0) {
        int i;
        int i;
        section = 0;
        section = 0;
        if (fscanf (f, "%s\n", &param) != 1) {
        if (fscanf (f, "%s\n", &param) != 1) {
          fprintf (stderr, "%s: ERROR: Section name required.\n", local ? filename : ctmp);
          fprintf (stderr, "%s: ERROR: Section name required.\n", local ? filename : ctmp);
          exit (1);
          exit (1);
        }
        }
        for (i = 1; i < sizeof(sections) / sizeof(struct section); i++)
        for (i = 1; i < sizeof(sections) / sizeof(struct section); i++)
          if (strcmp (sections[i].name, param) == 0) {
          if (strcmp (sections[i].name, param) == 0) {
            section = i;
            section = i;
            break;
            break;
          }
          }
        if (!section) {
        if (!section) {
          char tmp[200];
          char tmp[200];
          sprintf (tmp, "Unknown section: %s; ignoring.", param);
          sprintf (tmp, "Unknown section: %s; ignoring.", param);
          WARNING(tmp);
          WARNING(tmp);
          /* just skip section */
          /* just skip section */
          while (fscanf (f, "%s\n", &param) != 1 && strcmp (param, "end"));
          while (fscanf (f, "%s\n", &param) != 1 && strcmp (param, "end"));
        }
        }
      } else if (strcmp (param, "end") == 0) {
      } else if (strcmp (param, "end") == 0) {
        section = 0;
        section = 0;
      } else if (strncmp (param, "/*", 2) == 0) {
      } else if (strncmp (param, "/*", 2) == 0) {
        char c0 = 0, c1 = 0;
        char c0 = 0, c1 = 0;
        while (c0 != '*' || c1 != '/') {
        while (c0 != '*' || c1 != '/') {
          c0 = c1;
          c0 = c1;
          c1 = fgetc(f);
          c1 = fgetc(f);
          if (feof(f)) {
          if (feof(f)) {
            fprintf (stderr, "%s: ERROR: Comment reached EOF.\n", local ? filename : ctmp);
            fprintf (stderr, "%s: ERROR: Comment reached EOF.\n", local ? filename : ctmp);
            exit (1);
            exit (1);
          }
          }
        }
        }
      } else {
      } else {
        int i, found = -1;
        int i, found = -1;
        for (i = 0; i < sizeof(config_params)/sizeof(struct config_params); i++)
        for (i = 0; i < sizeof(config_params)/sizeof(struct config_params); i++)
          if (config_params[i].section == section && strcmp (config_params[i].name, param) == 0) {
          if (config_params[i].section == section && strcmp (config_params[i].name, param) == 0) {
            found = i;
            found = i;
            break;
            break;
          }
          }
        if (found < 0) {
        if (found < 0) {
          char tmp[200];
          char tmp[200];
          sprintf (tmp, "Invalid parameter: %s; ignoring.\n", param);
          sprintf (tmp, "Invalid parameter: %s; ignoring.\n", param);
          WARNING(tmp);
          WARNING(tmp);
          while (fgetc(f) != '\n' || feof(f));
          while (fgetc(f) != '\n' || feof(f));
          continue;
          continue;
        }
        }
 
 
        /* Parse parameter value */
        /* Parse parameter value */
        {
        {
          if (config_params[found].type[0])
          if (config_params[found].type[0])
            if(fscanf_ex (f, config_params[found].type, config_params[found].addr, 0))
            if(fscanf_ex (f, config_params[found].type, config_params[found].addr, 0))
              exit (1);
              exit (1);
        }
        }
        if (config_params[found].func)
        if (config_params[found].func)
          config_params[found].func();
          config_params[found].func();
      }
      }
    }
    }
    fclose (f);
    fclose (f);
  } else
  } else
    if (config.sim.verbose)
    if (config.sim.verbose)
      fprintf (stderr, "WARNING: Cannot read script file from '%s',\nneither '%s'; assuming standard configuration.\n", filename, ctmp);
      fprintf (stderr, "WARNING: Cannot read script file from '%s',\nneither '%s'; assuming standard configuration.\n", filename, ctmp);
 
 
  /* Initialize memory table.  */
  /* Initialize memory table.  */
  sim_read_memory_table (config.memory.memory_table_file);
  sim_read_memory_table (config.memory.memory_table_file);
  runtime.sim.script_file_specified = 1;
  runtime.sim.script_file_specified = 1;
}
}
 
 
/* Utility for execution of set sim command.  */
/* Utility for execution of set sim command.  */
static int set_config (char *s)
static int set_config (char *s)
{
{
  char *sec, *item, *params;
  char *sec, *item, *params;
  int noparams = 0, i, noitem = 0;
  int noparams = 0, i, noitem = 0;
  while (*s && isblank (*s)) s++;
  while (*s && isblank (*s)) s++;
  sec = s;
  sec = s;
  printf ("s:%s\n", s);
  printf ("s:%s\n", s);
  while (*s && *s != ' ') s++;
  while (*s && *s != ' ') s++;
  if (!(*s)) noitem = 1;
  if (!(*s)) noitem = 1;
  *s = 0;
  *s = 0;
  printf ("sec:%s\n", sec);
  printf ("sec:%s\n", sec);
  section = 0;
  section = 0;
  for (i = 1; i < sizeof(sections) / sizeof(struct section); i++)
  for (i = 1; i < sizeof(sections) / sizeof(struct section); i++)
    if (strcmp (sections[i].name, sec) == 0) {
    if (strcmp (sections[i].name, sec) == 0) {
      section = i;
      section = i;
      break;
      break;
    }
    }
 
 
  if (!section) return 1;
  if (!section) return 1;
  if (noitem) return 2;
  if (noitem) return 2;
 
 
  item = ++s;
  item = ++s;
 
 
  while (*s && *s != ' ') s++;
  while (*s && *s != ' ') s++;
  if (!(*s)) {
  if (!(*s)) {
    noparams = 1;
    noparams = 1;
    params = "";
    params = "";
  } else
  } else
    params = s + 1;
    params = s + 1;
  *s = 0;
  *s = 0;
  printf ("item:%s\n", item);
  printf ("item:%s\n", item);
  printf ("params:%s\n", params);
  printf ("params:%s\n", params);
  {
  {
    int i, found = -1;
    int i, found = -1;
    for (i = 0; i < sizeof(config_params)/sizeof(struct config_params); i++)
    for (i = 0; i < sizeof(config_params)/sizeof(struct config_params); i++)
      if (config_params[i].section == section && strcmp (config_params[i].name, item) == 0) {
      if (config_params[i].section == section && strcmp (config_params[i].name, item) == 0) {
        found = i;
        found = i;
        break;
        break;
      }
      }
    if (found < 0) return 2;
    if (found < 0) return 2;
 
 
    /* Parse parameter value */
    /* Parse parameter value */
    if (config_params[found].type[0])
    if (config_params[found].type[0])
      if(fscanf_ex (0, config_params[found].type, config_params[found].addr, params))
      if(fscanf_ex (0, config_params[found].type, config_params[found].addr, params))
        return 3;
        return 3;
    if (config_params[found].func)
    if (config_params[found].func)
      config_params[found].func();
      config_params[found].func();
  }
  }
  return 0;
  return 0;
}
}
 
 
/* Executes set sim command, displays error.  */
/* Executes set sim command, displays error.  */
void set_config_command(char *s)
void set_config_command(char *s)
{
{
  int i;
  int i;
  switch (set_config (s)) {
  switch (set_config (s)) {
    case 1:
    case 1:
      printf ("Invalid or missing section name.  One of valid sections must be specified:\n");
      printf ("Invalid or missing section name.  One of valid sections must be specified:\n");
      for (i = 1; i < sizeof(sections) / sizeof(struct section); i++)
      for (i = 1; i < sizeof(sections) / sizeof(struct section); i++)
        printf ("%s ", sections[i].name);
        printf ("%s ", sections[i].name);
      printf ("\n");
      printf ("\n");
      break;
      break;
    case 2:
    case 2:
      printf ("Invalid or missing item name.  One of valid items must be specified:\n");
      printf ("Invalid or missing item name.  One of valid items must be specified:\n");
      for (i = 0; i < sizeof(config_params)/sizeof(struct config_params); i++)
      for (i = 0; i < sizeof(config_params)/sizeof(struct config_params); i++)
        if (config_params[i].section == section)
        if (config_params[i].section == section)
          printf ("%s ", config_params[i].name);
          printf ("%s ", config_params[i].name);
      printf ("\n");
      printf ("\n");
      break;
      break;
    case 3:
    case 3:
      printf ("Invalid parameters specified.\n");
      printf ("Invalid parameters specified.\n");
      break;
      break;
  }
  }
}
}
 
 

powered by: WebSVN 2.1.0

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