moves mmu related code into mmu unit
This commit is contained in:
67
src/iss/mem/memory_if.cpp
Normal file
67
src/iss/mem/memory_if.cpp
Normal file
@@ -0,0 +1,67 @@
|
||||
#include "memory_if.h"
|
||||
#include <algorithm>
|
||||
|
||||
namespace iss {
|
||||
namespace mem {
|
||||
void memory_hierarchy::root(memory_elem& e) {
|
||||
hierarchy.push_front(&e);
|
||||
root_set=true;
|
||||
update_chain();
|
||||
}
|
||||
void memory_hierarchy::prepend(memory_elem& e) {
|
||||
if(root_set)
|
||||
hierarchy.insert(hierarchy.begin()+1, &e);
|
||||
else
|
||||
hierarchy.push_front(&e);
|
||||
update_chain();
|
||||
}
|
||||
void memory_hierarchy::append(memory_elem& e) {
|
||||
hierarchy.push_back(&e);
|
||||
update_chain();
|
||||
}
|
||||
void memory_hierarchy::insert_before(memory_elem&) {}
|
||||
void memory_hierarchy::insert_after(memory_elem&) {}
|
||||
void memory_hierarchy::replace_last(memory_elem& e) {
|
||||
hierarchy.pop_back();
|
||||
hierarchy.push_back(&e);
|
||||
}
|
||||
void memory_hierarchy::update_chain() {
|
||||
bool tail = false;
|
||||
for(size_t i = 0; i < hierarchy.size(); ++i) {
|
||||
hierarchy[i]->register_csrs();
|
||||
if(i)
|
||||
hierarchy[i - 1]->set_next(hierarchy[i]->get_mem_if());
|
||||
}
|
||||
}
|
||||
|
||||
void memory_hierarchy::prepend(std::unique_ptr<memory_elem>&& p) {
|
||||
prepend(*p);
|
||||
owned_elems.push_back(std::move(p));
|
||||
}
|
||||
|
||||
void memory_hierarchy::append(std::unique_ptr<memory_elem>&& p) {
|
||||
append(*p);
|
||||
owned_elems.push_back(std::move(p));
|
||||
}
|
||||
|
||||
void memory_hierarchy::insert_before(std::unique_ptr<memory_elem>&& p) {
|
||||
insert_before(*p);
|
||||
owned_elems.push_back(std::move(p));
|
||||
}
|
||||
|
||||
void memory_hierarchy::insert_after(std::unique_ptr<memory_elem>&& p) {
|
||||
insert_after(*p);
|
||||
owned_elems.push_back(std::move(p));
|
||||
}
|
||||
|
||||
void memory_hierarchy::replace_last(std::unique_ptr<memory_elem>&& p) {
|
||||
auto e = hierarchy.back();
|
||||
replace_last(*p);
|
||||
auto it = std::find_if(std::begin(owned_elems), std::end(owned_elems), [e](std::unique_ptr<memory_elem> const& p) {return p.get()==e;});
|
||||
if(it!=std::end(owned_elems))
|
||||
owned_elems.erase(it);
|
||||
owned_elems.push_back(std::move(p));
|
||||
}
|
||||
|
||||
} // namespace mem
|
||||
} // namespace iss
|
Reference in New Issue
Block a user