cachesim
A cache simulator
memory.c
Go to the documentation of this file.
00001 /* -*- mode:c; coding: utf-8 -*- */
00002 
00003 #include "memory.h"
00004 
00005 #include <stdlib.h>
00006 
00010 enum
00011 {
00012     MAX_MEM_SIZE = 1 * GiB, 
00013     MAX_READ_TIME = 100000, 
00014     MAX_WRITE_TIME = MAX_READ_TIME, 
00015     MAX_WIDTH = 1024 
00016 };
00017 
00018 struct Memory;
00019 typedef struct Memory Memory;
00020 
00025 struct Memory
00026 {
00027     AbstractMemory b; 
00028     MemoryCell *mem; 
00029     int memory_size; 
00030     int memory_read_time; 
00031     int memory_write_time; 
00032     int memory_width; 
00033 };
00034 
00040 static AbstractMemory *
00041 memory_free(AbstractMemory *a)
00042 {
00043     // FIXME: реализовать
00044     return NULL;
00045 }
00046 
00054 static void
00055 memory_read(AbstractMemory *a, memaddr_t addr, int size, MemoryCell *dst)
00056 {
00057     Memory *m = (Memory*) a;
00058 
00059     // учитываем время, требуемое на выполнение операции чтения
00060     statistics_add_counter(m->b.info, (size + m->memory_width - 1) / m->memory_width * m->memory_read_time);
00061     // выполняем копирование данных
00062     for (; size; ++addr, --size, ++dst) {
00063         *dst = m->mem[addr];
00064     }
00065 }
00066 
00074 static void
00075 memory_write(AbstractMemory *a, memaddr_t addr, int size, const MemoryCell *src)
00076 {
00077     // FIXME: реализовать
00078 }
00079 
00090 static void
00091 memory_reveal(AbstractMemory *a, memaddr_t addr, int size, const MemoryCell *src)
00092 {
00093     Memory *m = (Memory*) a;
00094 
00095     for (; size; ++addr, --size, ++src) {
00096         m->mem[addr] = *src;
00097     }
00098 }
00099 
00100 static void
00101 memory_flush(AbstractMemory *m)
00102 {
00103 }
00104 
00105 static AbstractMemoryOps memory_ops =
00106 {
00107     memory_free,
00108     memory_read,
00109     memory_write,
00110     memory_reveal,
00111     memory_flush,
00112 };
00113 
00121 AbstractMemory *
00122 memory_create(ConfigFile *cfg, const char *var_prefix, StatisticsInfo *info)
00123 {
00124     char buf[1024];
00125     Memory *m = calloc(1, sizeof(*m));
00126     int r;
00127 
00128     // заполняем базовые поля
00129     m->b.ops = &memory_ops;
00130     m->b.info = info;
00131 
00132     // считываем и проверяем параметр memory_size
00133     r = config_file_get_int(cfg, make_param_name(buf, sizeof(buf), var_prefix, "memory_size"), &m->memory_size);
00134     if (!r) {
00135         error_undefined("memory_create", buf);
00136     } else if (r < 0 || m->memory_size <= 0 || m->memory_size > MAX_MEM_SIZE || m->memory_size % KiB != 0) {
00137         error_invalid("memory_create", buf);
00138     }
00139 
00140     // FIXME: реализовать чтение параметров memory_read_time, memory_write_time, memory_width
00141 
00142     // создаем массив ячеек
00143     m->mem = (MemoryCell*) calloc(m->memory_size, sizeof(m->mem[0]));
00144 
00145     // возвращяем указатель, преобразованный к указателю на базовую структуру
00146     return (AbstractMemory*) m;
00147 }
00148 
00149 /*
00150  * Local variables:
00151  *  c-basic-offset: 4
00152  * End:
00153  */