summaryrefslogtreecommitdiff
path: root/src/storage/dram.cc
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-03-21 16:06:07 -0400
committerbd <bdunahu@operationnull.com>2025-03-21 16:06:07 -0400
commit75f78c215131499165101a499197313ba77ea230 (patch)
tree178eefa29cd9ac5ba88efd989364e1bbf591189e /src/storage/dram.cc
parent7e01ac0891452dfda93c2dcfd0817a4d43871c4b (diff)
Small cleanups to up a lot of inplementation details
Diffstat (limited to 'src/storage/dram.cc')
-rw-r--r--src/storage/dram.cc123
1 files changed, 37 insertions, 86 deletions
diff --git a/src/storage/dram.cc b/src/storage/dram.cc
index 20db47e..779e392 100644
--- a/src/storage/dram.cc
+++ b/src/storage/dram.cc
@@ -21,118 +21,69 @@ Dram::Dram(int delay)
Dram::~Dram() { delete this->data; }
-void Dram::do_write(signed int data, int address)
-{
- address = wrap_address(address);
- int line = address / LINE_SIZE;
- int word = address % LINE_SIZE;
-
- this->data->at(line).at(word) = data;
-}
-
-void Dram::do_write_line(
- std::array<signed int, LINE_SIZE> data_line, int address)
-{
- address = wrap_address(address);
- int line = address / LINE_SIZE;
- this->data->at(line) = data_line;
-}
-
-void Dram::do_read(std::array<signed int, LINE_SIZE> &data_line, int address)
-{
- address = wrap_address(address);
- int line = address / LINE_SIZE;
- data_line = this->data->at(line);
-}
-
-void Dram::do_read_word(signed int &data, int address)
-{
- address = wrap_address(address);
- int line = address / LINE_SIZE;
- int word = address % LINE_SIZE;
- data = this->data->at(line).at(word);
-}
-
Response Dram::write_line(
Accessor accessor, std::array<signed int, LINE_SIZE> data_line, int address)
{
- Response r = WAIT;
-
- if (accessor == SIDE) {
- this->do_write_line(data_line, address);
- r = OK;
- } else {
- /* Do this first--then process the first cycle immediately. */
- if (this->requester == IDLE)
- this->requester = accessor;
-
- if (this->requester == accessor) {
- if (this->wait_time == 0) {
- this->do_write_line(data_line, address);
- r = OK;
- }
- }
+ Response r = this->is_access_cleared(accessor);
+ if (r == OK) {
+ int line, word;
+ get_memory_index(address, line, word);
+ this->data->at(line) = data_line;
}
return r;
}
Response Dram::write_word(Accessor accessor, signed int data, int address)
{
- Response r = WAIT;
-
- if (accessor == SIDE) {
- this->do_write(data, address);
- r = OK;
- } else {
- /* Do this first--then process the first cycle immediately. */
- if (this->requester == IDLE)
- this->requester = accessor;
-
- if (this->requester == accessor) {
- if (this->wait_time == 0) {
- this->do_write(data, address);
- r = OK;
- }
- }
+ Response r = this->is_access_cleared(accessor);
+ if (r == OK) {
+ int line, word;
+ get_memory_index(address, line, word);
+ this->data->at(line).at(word) = data;
}
-
return r;
}
+// TODO requires testing
Response Dram::read_line(
Accessor accessor,
int address,
std::array<signed int, LINE_SIZE> &data_line)
{
- Response r = WAIT;
-
- if (this->requester == IDLE)
- this->requester = accessor;
-
- if (this->requester == accessor) {
- if (this->wait_time == 0) {
- this->do_read(data_line, address);
- r = OK;
- }
+ Response r = this->is_access_cleared(accessor);
+ if (r == OK) {
+ int line, word;
+ get_memory_index(address, line, word);
+ data_line = this->data->at(line);
}
-
return r;
}
Response Dram::read_word(Accessor accessor, int address, signed int &data)
{
- Response r = WAIT;
-
- if (this->requester == IDLE)
- this->requester = accessor;
-
- if (this->requester == accessor) {
- if (this->wait_time == 0) {
- this->do_read_word(data, address);
- r = OK;
- }
+ 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);
}
+ return r;
+}
+Response Dram::is_access_cleared(Accessor accessor)
+{
+ Response r;
+ r = WAIT;
+ /* Do this first--then process the first cycle immediately. */
+ if (accessor == SIDE)
+ r = OK;
+ else {
+ if (this->requester == IDLE)
+ this->requester = accessor;
+ if (this->requester == accessor)
+ if (this->wait_time == 0)
+ r = OK;
+ }
return r;
}