diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/storage/cache.cc | 38 | ||||
| -rw-r--r-- | src/storage/dram.cc | 38 | 
2 files changed, 38 insertions, 38 deletions
| diff --git a/src/storage/cache.cc b/src/storage/cache.cc index a4ae4ca..8acdf08 100644 --- a/src/storage/cache.cc +++ b/src/storage/cache.cc @@ -27,27 +27,20 @@ Cache::~Cache()  Response Cache::write_word(Accessor accessor, signed int data, int address)  { -	Response r = this->is_access_cleared(accessor, address); -	if (r == OK) { -		int tag, index, offset; -		get_bit_fields(address, &tag, &index, &offset); +	return process(accessor, address, [&](int index, int offset) {  		this->data->at(index).at(offset) = data;  		this->meta[index].at(1) = 1; -	} -	return r; +	});  }  Response Cache::write_line(  	Accessor accessor, std::array<signed int, LINE_SIZE> data_line, int address)  { -	Response r = this->is_access_cleared(accessor, address); -	if (r == OK) { -		int tag, index, offset; -		get_bit_fields(address, &tag, &index, &offset); +	return process(accessor, address, [&](int index, int offset) { +		(void)offset;  		this->data->at(index) = data_line;  		this->meta[index].at(1) = 1; -	} -	return r; +	});  }  // TODO: tests for multi level cache @@ -56,22 +49,29 @@ Response Cache::read_line(  	int address,  	std::array<signed int, LINE_SIZE> &data_line)  { -	Response r = this->is_access_cleared(accessor, address); -	if (r == OK) { -		int tag, index, offset; -		get_bit_fields(address, &tag, &index, &offset); +	return process(accessor, address, [&](int index, int offset) { +		(void)offset;  		data_line = this->data->at(index); -	} -	return r; +	});  }  Response Cache::read_word(Accessor accessor, int address, signed int &data)  { +	return process(accessor, address, [&](int index, int offset) { +		data = this->data->at(index).at(offset); +	}); +} + +Response Cache::process( +	Accessor accessor, +	int address, +	std::function<void(int index, int offset)> request_handler) +{  	Response r = this->is_access_cleared(accessor, address);  	if (r == OK) {  		int tag, index, offset;  		get_bit_fields(address, &tag, &index, &offset); -		data = this->data->at(index).at(offset); +		request_handler(index, offset);  	}  	return r;  } diff --git a/src/storage/dram.cc b/src/storage/dram.cc index 779e392..2c24b4b 100644 --- a/src/storage/dram.cc +++ b/src/storage/dram.cc @@ -24,24 +24,17 @@ Dram::~Dram() { delete this->data; }  Response Dram::write_line(  	Accessor accessor, std::array<signed int, LINE_SIZE> data_line, int address)  { -	Response r = this->is_access_cleared(accessor); -	if (r == OK) { -		int line, word; -		get_memory_index(address, line, word); +	return process(accessor, address, [&](int line, int word) { +		(void)word;  		this->data->at(line) = data_line; -	} -	return r; +	});  }  Response Dram::write_word(Accessor accessor, signed int data, int address)  { -	Response r = this->is_access_cleared(accessor); -	if (r == OK) { -		int line, word; -		get_memory_index(address, line, word); +	return process(accessor, address, [&](int line, int word) {  		this->data->at(line).at(word) = data; -	} -	return r; +	});  }  // TODO requires testing @@ -50,22 +43,29 @@ Response Dram::read_line(  	int address,  	std::array<signed int, LINE_SIZE> &data_line)  { -	Response r = this->is_access_cleared(accessor); -	if (r == OK) { -		int line, word; -		get_memory_index(address, line, word); +	return process(accessor, address, [&](int line, int word) { +		(void)word;  		data_line = this->data->at(line); -	} -	return r; +	});  }  Response Dram::read_word(Accessor accessor, int address, signed int &data)  { +	return process(accessor, address, [&](int line, int word) { +		data = this->data->at(line).at(word); +	}); +} + +Response Dram::process( +	Accessor accessor, +	int address, +	std::function<void(int line, int word)> request_handler) +{  	Response r = this->is_access_cleared(accessor);  	if (r == OK) {  		int line, word;  		get_memory_index(address, line, word); -		data = this->data->at(line).at(word); +		request_handler(line, word);  	}  	return r;  } | 
