summaryrefslogtreecommitdiff
path: root/src/storage/dram.cc
diff options
context:
space:
mode:
authorSiddarth Suresh <155843085+SiddarthSuresh98@users.noreply.github.com>2025-03-22 11:00:14 -0400
committerGitHub <noreply@github.com>2025-03-22 11:00:14 -0400
commitb73f7fbe952494e245c44fdd4b6123bac1b4ec97 (patch)
tree9386aa3ccd2302fceb9750858d74ab56f156b4e2 /src/storage/dram.cc
parent45d63d831637ba9c4fb8cd8070dc7d2705fd3348 (diff)
parent544e764cd5a774c5d653771923b3ae8a28a618f7 (diff)
Merge pull request #29 from bdunahu/bdunahu
Small cleanups to up a lot of implementation details
Diffstat (limited to 'src/storage/dram.cc')
-rw-r--r--src/storage/dram.cc129
1 files changed, 40 insertions, 89 deletions
diff --git a/src/storage/dram.cc b/src/storage/dram.cc
index 20db47e..2c24b4b 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)
+Response Dram::write_line(
+ Accessor accessor, std::array<signed int, LINE_SIZE> data_line, int address)
{
- address = wrap_address(address);
- int line = address / LINE_SIZE;
- int word = address % LINE_SIZE;
-
- this->data->at(line).at(word) = data;
+ return process(accessor, address, [&](int line, int word) {
+ (void)word;
+ this->data->at(line) = data_line;
+ });
}
-void Dram::do_write_line(
- std::array<signed int, LINE_SIZE> data_line, int address)
+Response Dram::write_word(Accessor accessor, signed int data, int address)
{
- address = wrap_address(address);
- int line = address / LINE_SIZE;
- this->data->at(line) = data_line;
+ return process(accessor, address, [&](int line, int word) {
+ this->data->at(line).at(word) = data;
+ });
}
-void Dram::do_read(std::array<signed int, LINE_SIZE> &data_line, int address)
+// TODO requires testing
+Response Dram::read_line(
+ Accessor accessor,
+ int address,
+ std::array<signed int, LINE_SIZE> &data_line)
{
- address = wrap_address(address);
- int line = address / LINE_SIZE;
- data_line = this->data->at(line);
+ return process(accessor, address, [&](int line, int word) {
+ (void)word;
+ data_line = this->data->at(line);
+ });
}
-void Dram::do_read_word(signed int &data, int address)
+Response Dram::read_word(Accessor accessor, int address, signed int &data)
{
- address = wrap_address(address);
- int line = address / LINE_SIZE;
- int word = address % LINE_SIZE;
- data = this->data->at(line).at(word);
+ return process(accessor, address, [&](int line, int word) {
+ data = this->data->at(line).at(word);
+ });
}
-Response Dram::write_line(
- Accessor accessor, std::array<signed int, LINE_SIZE> data_line, int address)
+Response Dram::process(
+ Accessor accessor,
+ int address,
+ std::function<void(int line, int word)> request_handler)
{
- 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);
+ request_handler(line, word);
}
return r;
}
-Response Dram::write_word(Accessor accessor, signed int data, int address)
+Response Dram::is_access_cleared(Accessor accessor)
{
- Response r = WAIT;
-
- if (accessor == SIDE) {
- this->do_write(data, address);
+ Response r;
+ r = WAIT;
+ /* Do this first--then process the first cycle immediately. */
+ if (accessor == SIDE)
r = OK;
- } else {
- /* Do this first--then process the first cycle immediately. */
+ else {
if (this->requester == IDLE)
this->requester = accessor;
-
- if (this->requester == accessor) {
- if (this->wait_time == 0) {
- this->do_write(data, address);
+ if (this->requester == accessor)
+ if (this->wait_time == 0)
r = OK;
- }
- }
}
-
- return r;
-}
-
-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;
- }
- }
-
- 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;
- }
- }
-
return r;
}