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:
parent
1c2d8e440b
commit
ca6c70e09b
4 changed files with 50 additions and 48 deletions
|
@ -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; };
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue