Mostly functional cache_access

This commit is contained in:
Adam Goldsmith 2016-04-28 01:43:56 -04:00
parent 27b90ae3ed
commit 9997f58137

39
csim.c
View File

@ -52,6 +52,7 @@ void free_cache(linked_line** cache, long num_sets);
void free_set(linked_line* line); void free_set(linked_line* line);
void print_cache(linked_line** cache, long num_sets); void print_cache(linked_line** cache, long num_sets);
void print_set(linked_line* line); void print_set(linked_line* line);
char cache_access(linked_line** cache, long address, int set_bits, int block_bits, long num_lines);
linked_line* find_line(linked_line* set_head, long tag); linked_line* find_line(linked_line* set_head, long tag);
void increment_result_counters(char result, results* score); void increment_result_counters(char result, results* score);
@ -131,6 +132,12 @@ int main(int argc, char* argv[])
printf("%c %ld\n", op, address); printf("%c %ld\n", op, address);
print_cache(cache, set_indices); print_cache(cache, set_indices);
char r = cache_access(cache, address, set_index_bits, block_bits, num_lines);
increment_result_counters(r, &score);
if (op == 'M') { //Access again if modifying
r = cache_access(cache, address, set_index_bits, block_bits, num_lines);
increment_result_counters(r, &score);
}
} }
printSummary(score.hits, score.misses, score.evictions); printSummary(score.hits, score.misses, score.evictions);
@ -215,6 +222,38 @@ void print_set(linked_line* line)
} }
} }
char cache_access(linked_line** cache, long address, int set_bits, int block_bits, long num_lines)
{
char out;
long tag = address >> set_bits >> block_bits;
long set = (address >> block_bits) & ((1 << set_bits) - 1);
linked_line* set_head = cache[set];
linked_line* line = find_line(set_head, tag);
if (!line->validity) out = 'M';
else if (line->tag == tag) out = 'H';
else out = 'E';
if (line != set_head) {
line->newer = NULL;
set_head->newer = line;
line->older = set_head;
if (line->older) {
line->older->newer = line->newer;
if (line->older->older == line)
line->older->older = NULL;
}
if (line->newer)
line->newer->older = line->older;
cache[set] = line;
}
line->tag = tag;
line->validity = 1;
return out;
}
/** /**
@returns the first line with a matching tag, the first invalid line, @returns the first line with a matching tag, the first invalid line,
or the first line without an older (i.e. the end of the set or the first line without an older (i.e. the end of the set