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

Subversion Repositories sxp

[/] [sxp/] [trunk/] [csim/] [memory/] [memory.cc] - Rev 59

Compare with Previous | Blame | View Log

#include <iostream.h>
#include <fstream.h>
#include <stdio.h>
#include <stdlib.h>
 
class memory 
{
  public:
    memory(unsigned number);
    void write_mem (unsigned addr, unsigned data, bool data_vld);
    unsigned read_mem (unsigned addr);
    bool valid_mem (unsigned addr);
    bool load_data (char file_name[256]);
    void print_mem ();
    ~memory();
  protected:
    bool *valid;
    unsigned *mem; 
    unsigned size;
};
 
memory::memory(unsigned number)
{ 
  cout << "Begin Memory Init, size = " << number << "\n";
  size = number;
  valid = new bool[number];   
  mem = new unsigned[number];
 
  for (unsigned i=0;i<number;i += 1) 
    valid[i] = false;
  cout << "End Memory Init\n";
  return;
}
 
void memory::write_mem (unsigned addr, unsigned data, bool data_vld)
{
  if(addr >= size) {
    cout << "Invalid write address, addr = " << addr << ", max = " << size-1 << ".\n";
    // throw an exception
    return;
  }
  else {
    valid[addr] = data_vld;
    mem[addr] = data;
  }
  return;
}
 
unsigned memory::read_mem (unsigned addr)
{
  if(addr >= size) {
    cout << "Invalid read address, addr = " << addr << ", max = " << size-1 << ".\n";
    // throw an exception
    return (0);
  }
  else 
    if (valid[addr] == false) {
      return (0);
      // generate exception
    }
    else
      return (mem[addr]);
}  
 
bool memory::valid_mem (unsigned addr)
{
  if(addr >= size) 
    return (false);
  else { 
    return (valid[addr]);
  }
}  
 
bool memory::load_data (char file_name[256])
{
  FILE *f;
  unsigned faddr;
  unsigned data;
  char rline[81];
  char xline[81];
  faddr = 0;
  f = fopen(file_name,"r");
  while (!feof(f)){
    fgets (rline,20,f);
    sprintf (xline,"0x%s",rline); 
    sscanf(xline,"%x",&data);
    write_mem(faddr,data,true);
    faddr += 1;
  }
  fclose(f);
  return (true);
}
 
void memory::print_mem()
{
  for (unsigned i=0;i<size;i+=1) 
    if (valid_mem(i)) 
      printf("memory location %.8x = %.8x\n",i,read_mem(i));
}
 
memory::~memory()
{
  delete [] mem;
  delete [] valid;
}
 
/*
 *  $Id: memory.cc,v 1.1 2001-10-27 23:58:29 samg Exp $ 
 *  Program  : memory.cc 
 *  Author   : Sam Gladstone
 *  Function : memory behavioral class for SXP processor 
 *  $Log: not supported by cvs2svn $
 */
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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