Created
October 13, 2017 20:07
-
-
Save evancox10/c5e6b9ebfa3a8d38d27ad8d81f4eb4cb to your computer and use it in GitHub Desktop.
Fix riscv-isa-sim/riscv/devices.cc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "devices.h" | |
void bus_t::add_device(reg_t addr, abstract_device_t* dev) | |
{ | |
// Searching devices via lower_bound/upper_bound | |
// implicitly relies on the underlying std::map | |
// container to sort the keys and provide ordered | |
// iteration over this sort, which it does. (python's | |
// SortedDict is a good analogy) | |
devices[addr] = dev; | |
} | |
bool bus_t::load(reg_t addr, size_t len, uint8_t* bytes) | |
{ | |
// Find the device with the base address closest to but | |
// less than addr (price-is-right search) | |
auto it = devices.upper_bound(addr); | |
if (devices.empty() || it == devices.begin()) { | |
// Either the bus is empty, or there weren't | |
// any items with a base address <= addr | |
return false; | |
} | |
// Found at least one item with base address <= addr | |
// The iterator points to the device after this, so | |
// go back by one item. | |
it--; | |
return it->second->load(addr - it->first, len, bytes); | |
} | |
bool bus_t::store(reg_t addr, size_t len, const uint8_t* bytes) | |
{ | |
// See comments in bus_t::load | |
auto it = devices.upper_bound(addr); | |
if (devices.empty() || it == devices.begin()) { | |
return false; | |
} | |
it--; | |
return it->second->store(addr - it->first, len, bytes); | |
} | |
std::pair<reg_t, abstract_device_t*> bus_t::find_device(reg_t addr) | |
{ | |
// See comments in bus_t::load | |
auto it = devices.upper_bound(addr); | |
if (devices.empty() || it == devices.begin()) { | |
return std::make_pair((reg_t)0, (abstract_device_t*)NULL); | |
} | |
it--; | |
return std::make_pair(it->first, it->second); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment