From 14704907473f0945ca81618b64db5bef0cceb364 Mon Sep 17 00:00:00 2001 From: Daniel Krebs Date: Tue, 15 May 2018 13:15:29 +0200 Subject: [PATCH] common/memory: provide findPath() to get a path of address spaces --- fpga/include/villas/memory_manager.hpp | 3 +++ fpga/lib/common/memory_manager.cpp | 27 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/fpga/include/villas/memory_manager.hpp b/fpga/include/villas/memory_manager.hpp index 012910509..877456abe 100644 --- a/fpga/include/villas/memory_manager.hpp +++ b/fpga/include/villas/memory_manager.hpp @@ -192,6 +192,9 @@ public: AddressSpaceId findAddressSpace(const std::string& name); + std::list + findPath(AddressSpaceId fromAddrSpaceId, AddressSpaceId toAddrSpaceId); + MemoryTranslation getTranslation(AddressSpaceId fromAddrSpaceId, AddressSpaceId toAddrSpaceId); diff --git a/fpga/lib/common/memory_manager.cpp b/fpga/lib/common/memory_manager.cpp index 88da8536f..0754e0c13 100644 --- a/fpga/lib/common/memory_manager.cpp +++ b/fpga/lib/common/memory_manager.cpp @@ -73,6 +73,33 @@ MemoryManager::findAddressSpace(const std::string& name) }); } +std::list +MemoryManager::findPath(MemoryManager::AddressSpaceId fromAddrSpaceId, + MemoryManager::AddressSpaceId toAddrSpaceId) +{ + std::list path; + + auto fromAddrSpace = memoryGraph.getVertex(fromAddrSpaceId); + auto toAddrSpace = memoryGraph.getVertex(toAddrSpaceId); + + // find a path through the memory graph + MemoryGraph::Path pathGraph; + if(not memoryGraph.getPath(fromAddrSpaceId, toAddrSpaceId, pathGraph, pathCheckFunc)) { + + logger->debug("No translation found from ({}) to ({})", + *fromAddrSpace, *toAddrSpace); + + throw std::out_of_range("no translation found"); + } + + for(auto& mappingId : pathGraph) { + auto mapping = memoryGraph.getEdge(mappingId); + path.push_back(mapping->getVertexTo()); + } + + return path; +} + MemoryTranslation MemoryManager::getTranslation(MemoryManager::AddressSpaceId fromAddrSpaceId, MemoryManager::AddressSpaceId toAddrSpaceId)