1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/node/ synced 2025-03-09 00:00:00 +01:00

ConnectString: Make channel data type more generic

we can not only connect Aurora channels to the switch so use Node
instead as the data type

Signed-off-by: Niklas Eiling <niklas.eiling@eonerc.rwth-aachen.de>
This commit is contained in:
Niklas Eiling 2024-01-10 11:02:49 +01:00 committed by Niklas Eiling
parent 1c2d8e440b
commit ca6c70e09b
4 changed files with 50 additions and 48 deletions

View file

@ -28,12 +28,12 @@ public:
void parseString(std::string& connectString);
int portStringToInt(std::string &str) const;
void configCrossBar(std::shared_ptr<villas::fpga::ip::Dma> dma,
std::vector<std::shared_ptr<villas::fpga::ip::Node>>
&switch_channels) const;
void configCrossBar(std::shared_ptr<villas::fpga::ip::Dma> dma,
std::vector<std::shared_ptr<villas::fpga::ip::AuroraXilinx>>& aurora_channels) const;
bool isBidirectional() const { return bidirectional; };
bool isDmaLoopback() const { return dmaLoopback; };
bool isBidirectional() const { return bidirectional; };
bool isDmaLoopback() const { return dmaLoopback; };
bool isSrcStdin() const { return srcIsStdin; };
bool isDstStdout() const { return dstIsStdout; };
int getSrcAsInt() const { return srcAsInt; };

View file

@ -55,18 +55,19 @@ villasfpga_handle villasfpga_init(const char *configFile)
auto handle = new villasfpga_handle_t;
handle->card = fpga::setupFpgaCard(configFile, fpgaName);
std::vector<std::shared_ptr<fpga::ip::AuroraXilinx>> aurora_channels;
for (int i = 0; i < 4; i++) {
std::vector<std::shared_ptr<fpga::ip::Node>> switch_channels;
for (int i = 0; i < 4; i++) {
auto name = fmt::format("aurora_8b10b_ch{}", i);
auto id = fpga::ip::IpIdentifier("xilinx.com:ip:aurora_8b10b:", name);
auto aurora = std::dynamic_pointer_cast<fpga::ip::AuroraXilinx>(handle->card->lookupIp(id));
if (aurora == nullptr) {
auto aurora = std::dynamic_pointer_cast<fpga::ip::Node>(
handle->card->lookupIp(id));
if (aurora == nullptr) {
logger->error("No Aurora interface found on FPGA");
return nullptr;
}
aurora_channels.push_back(aurora);
}
switch_channels.push_back(aurora);
}
handle->dma = std::dynamic_pointer_cast<fpga::ip::Dma>
(handle->card->lookupIp(fpga::Vlnv("xilinx.com:ip:axi_dma:")));
@ -81,15 +82,16 @@ villasfpga_handle villasfpga_init(const char *configFile)
}
if (dumpAuroraChannels) {
for (auto aurora : aurora_channels)
aurora->dump();
for (auto aurora : switch_channels)
aurora->dump();
}
// Configure Crossbar switch
const fpga::ConnectString parsedConnectString(connectStr);
parsedConnectString.configCrossBar(handle->dma, aurora_channels);
parsedConnectString.configCrossBar(handle->dma,
switch_channels);
return handle;
return handle;
} catch (const RuntimeError &e) {
logger->error("Error: {}", e.what());
return nullptr;

View file

@ -110,38 +110,38 @@ int fpga::ConnectString::portStringToInt(std::string &str) const
// parses a string like "1->2" or "1<->stdout" and configures the crossbar accordingly
void fpga::ConnectString::configCrossBar(std::shared_ptr<villas::fpga::ip::Dma> dma,
std::vector<std::shared_ptr<fpga::ip::AuroraXilinx>>& aurora_channels) const
{
if (dmaLoopback) {
log->info("Configuring DMA loopback");
dma->connectLoopback();
return;
}
void fpga::ConnectString::configCrossBar(
std::shared_ptr<villas::fpga::ip::Dma> dma,
std::vector<std::shared_ptr<fpga::ip::Node>> &switch_channels) const {
if (dmaLoopback) {
log->info("Configuring DMA loopback");
dma->connectLoopback();
return;
}
log->info("Connecting {} to {}, {}directional",
(srcAsInt==-1 ? "stdin" : std::to_string(srcAsInt)),
(dstAsInt==-1 ? "stdout" : std::to_string(dstAsInt)),
(bidirectional ? "bi" : "uni"));
log->info("Connecting {} to {}, {}directional",
(srcAsInt == -1 ? "stdin" : std::to_string(srcAsInt)),
(dstAsInt == -1 ? "stdout" : std::to_string(dstAsInt)),
(bidirectional ? "bi" : "uni"));
std::shared_ptr<fpga::ip::Node> src;
std::shared_ptr<fpga::ip::Node> dest;
if (srcIsStdin) {
src = dma;
} else {
src = aurora_channels[srcAsInt];
}
std::shared_ptr<fpga::ip::Node> src;
std::shared_ptr<fpga::ip::Node> dest;
if (srcIsStdin) {
src = dma;
} else {
src = switch_channels[srcAsInt];
}
if (dstIsStdout) {
dest = dma;
} else {
dest = aurora_channels[dstAsInt];
}
if (dstIsStdout) {
dest = dma;
} else {
dest = switch_channels[dstAsInt];
}
src->connect(src->getDefaultMasterPort(), dest->getDefaultSlavePort());
if (bidirectional) {
dest->connect(dest->getDefaultMasterPort(), src->getDefaultSlavePort());
}
src->connect(src->getDefaultMasterPort(), dest->getDefaultSlavePort());
if (bidirectional) {
dest->connect(dest->getDefaultMasterPort(), src->getDefaultSlavePort());
}
}
void fpga::setupColorHandling()

View file

@ -212,18 +212,18 @@ int main(int argc, char *argv[]) {
auto card = fpga::setupFpgaCard(configFile, fpgaName);
std::vector<std::shared_ptr<fpga::ip::AuroraXilinx>> aurora_channels;
std::vector<std::shared_ptr<fpga::ip::Node>> switch_channels;
for (int i = 0; i < 4; i++) {
auto name = fmt::format("aurora_aurora_8b10b_ch{}", i);
auto id = fpga::ip::IpIdentifier("xilinx.com:ip:aurora_8b10b:", name);
auto aurora =
std::dynamic_pointer_cast<fpga::ip::AuroraXilinx>(card->lookupIp(id));
std::dynamic_pointer_cast<fpga::ip::Node>(card->lookupIp(id));
if (aurora == nullptr) {
logger->error("No Aurora interface found on FPGA");
return 1;
}
aurora_channels.push_back(aurora);
switch_channels.push_back(aurora);
}
auto dma = std::dynamic_pointer_cast<fpga::ip::Dma>(
@ -239,7 +239,7 @@ int main(int argc, char *argv[]) {
}
if (dumpAuroraChannels) {
for (auto aurora : aurora_channels)
for (auto aurora : switch_channels)
aurora->dump();
}
bool dstIsStdout = false;
@ -247,7 +247,7 @@ int main(int argc, char *argv[]) {
// Configure Crossbar switch
for (std::string str : connectStr) {
const fpga::ConnectString parsedConnectString(str);
parsedConnectString.configCrossBar(dma, aurora_channels);
parsedConnectString.configCrossBar(dma, switch_channels);
dstIsStdout = dstIsStdout || parsedConnectString.isDstStdout();
srcIsStdin = srcIsStdin || parsedConnectString.isSrcStdin();
}