cachesim
A cache simulator
|
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 */