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

Subversion Repositories igor

[/] [igor/] [trunk/] [simulator/] [memory.c] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 atypic
#include <stdio.h>
2
#include <stdlib.h>
3
#include <err.h>
4
#include <string.h>
5
#include <errno.h>
6
 
7
#include "memory.h"
8
 
9
#include "types.h"
10
#include "regs.h"
11
#include "io.h"
12
#include "object.h"
13
 
14
static reg_t *memorybuf;
15
static unsigned int memorysize;
16
static char *memoryused;
17
int verify_written_memory;
18
 
19
int
20
memory_init(unsigned int memsz, char *memfile)
21
{
22
        printf("Allocating memory: 0x%X\n", memsz);
23
        memorybuf = calloc(memsz, sizeof(reg_t));
24
        if (memorybuf == NULL)
25
                return 0;
26
        memorysize = memsz;
27
        reg_set(REG_SP, memorysize);
28
        if (memfile != NULL)
29
                memory_load_from_file(memfile);
30
        memoryused = malloc(memsz);
31
        if (memoryused == NULL)
32
                err(1, "malloc(memoryused)");
33
        memset(memoryused, '\0', memsz);
34
 
35
        return 1;
36
}
37
 
38
void
39
memory_load_from_file(char *memfile)
40
{
41
        int i;
42
        FILE *f = fopen(memfile, "r");
43
        if (f == NULL)
44
                errx(1, "could not open memory file %s: %s",
45
                     memfile, strerror(errno));
46
 
47
        i = object_read(memorybuf, memorysize, f);
48
 
49
        if (ferror(f)) {
50
                err(1, "error reading memory file %s", memfile);
51
        }
52
 
53
        printf("0x%X memory objects read from %s\n",
54
               i, memfile);
55
 
56
        fclose(f);
57
}
58
 
59
void
60
memory_write_to_file(char *memfile)
61
{
62
        memory_write_part_to_file(memfile, 0, memorysize);
63
}
64
 
65
void
66
memory_write_part_to_file(char *memfile, int start, int length)
67
{
68
        FILE *f = fopen(memfile, "w");
69
        if (f == NULL)
70
                errx(1, "could not open memory file %s for writing: %s",
71
                     memfile, strerror(errno));
72
 
73
        if (object_write(&memorybuf[start], length, f) < length)
74
                err(1, "error writing memory file %s", memfile);
75
 
76
        fclose(f);
77
}
78
 
79
 
80
void
81
memory_set(unsigned int pos, reg_t value)
82
{
83
        if ((pos & IO_AREA_MASK) == IO_AREA_MASK) {
84
                io_memory_set(pos & ~IO_AREA_MASK, value);
85
                return;
86
        }
87
        if (pos < 0 || pos >= memorysize)
88
                errx(1, "Trying to store outside of memory region: 0x%X", pos);
89
        memorybuf[pos] = value;
90
        memoryused[pos] = 1;
91
}
92
 
93
reg_t
94
memory_get(unsigned int pos)
95
{
96
        if ((pos & IO_AREA_MASK) == IO_AREA_MASK) {
97
                return io_memory_get(pos & ~IO_AREA_MASK);
98
        }
99
        if (pos < 0 || pos >= memorysize)
100
                errx(1, "Trying to load outside of memory region: 0x%X", pos);
101
        if (memoryused[pos] == 0 && verify_written_memory == 1)
102
                warnx("Reading from unwritten memory position: 0x%X", pos);
103
 
104
        return memorybuf[pos];
105
}
106
 
107
int
108
memory_size(void)
109
{
110
        return memorysize;
111
}

powered by: WebSVN 2.1.0

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