diff options
Diffstat (limited to '')
| -rw-r--r-- | tb/avalon.impl.hpp | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/tb/avalon.impl.hpp b/tb/avalon.impl.hpp index 3af60d0..4dee4f2 100644 --- a/tb/avalon.impl.hpp +++ b/tb/avalon.impl.hpp @@ -125,49 +125,55 @@ namespace taller::avalon } template<class Platform> - std::uint32_t interconnect<Platform>::dump(std::uint32_t addr) + bool interconnect<Platform>::dump(std::uint32_t addr, std::uint32_t &word) { std::uint32_t avl_address = addr << 2; - auto &dev = resolve_external(avl_address); - auto pos = (avl_address & ~dev.address_mask()) >> dev.word_bits(); + auto *dev = resolve_external(avl_address); + if(!dev) + { + return false; + } + + auto pos = (avl_address & ~dev->address_mask()) >> dev->word_bits(); - std::uint32_t readdata; - while(!dev.read(pos, readdata)) + while(!dev->read(pos, word)) { continue; } - return readdata; + return true; } template<class Platform> void interconnect<Platform>::patch(std::uint32_t addr, std::uint32_t writedata) { std::uint32_t avl_address = addr << 2; - auto &dev = resolve_external(avl_address); - auto pos = (avl_address & ~dev.address_mask()) >> dev.word_bits(); + auto *dev = resolve_external(avl_address); + assert(dev); + + auto pos = (avl_address & ~dev->address_mask()) >> dev->word_bits(); - while(!dev.write(pos, writedata, 0b1111)) + while(!dev->write(pos, writedata, 0b1111)) { continue; } } template<class Platform> - slave& interconnect<Platform>::resolve_external(std::uint32_t avl_address) + slave* interconnect<Platform>::resolve_external(std::uint32_t avl_address) { for(auto &binding : devices) { if((avl_address & binding.mask) == binding.base) { - return binding.dev; + return &binding.dev; } } fprintf(stderr, "[avl] attempt to access hole at 0x%08x\n", avl_address); - assert(false); + return nullptr; } } |
