in SDAccel/userspace/src/awssak_debug.cpp [144:225]
int xcldev::device::readLAPCheckers(int aVerbose) {
xclDebugCheckersResults debugResults = {0};
//if (getuid() && geteuid()) {
// std::cout << "ERROR: Reading LAPC requires root privileges" << std::endl;
// return -EACCES;
//}
std::vector<std::string> lapcSlotNames;
std::vector< std::pair<std::string, std::string> > cuNameportNames;
unsigned int numSlots = getIPCountAddrNames (LAPC, nullptr, &lapcSlotNames);
if (numSlots == 0) {
std::cout << "ERROR: LAPC IP does not exist on the platform" << std::endl;
return 0;
}
std::pair<size_t, size_t> widths = getCUNamePortName(lapcSlotNames, cuNameportNames);
xclDebugReadIPStatus(m_handle, XCL_DEBUG_READ_TYPE_LAPC, &debugResults);
bool violations_found = false;
bool invalid_codes = false;
std::cout << "Light Weight AXI Protocol Checkers codes \n";
int col1 = std::max(widths.first, strlen("CU Name")) + 4;
int col2 = std::max(widths.second, strlen("AXI Portname"));
for (unsigned int i = 0; i<debugResults.NumSlots; ++i) {
if (!xclAXICheckerCodes::isValidAXICheckerCodes(debugResults.OverallStatus[i],
debugResults.SnapshotStatus[i], debugResults.CumulativeStatus[i])) {
std::cout << "CU Name: " << cuNameportNames[i].first << " AXI Port: " << cuNameportNames[i].second << "\n";
std::cout << " Invalid codes read, skip decoding\n";
invalid_codes = true;
}
else if (debugResults.OverallStatus[i]) {
std::cout << "CU Name: " << cuNameportNames[i].first << " AXI Port: " << cuNameportNames[i].second << "\n";
std::cout << " First violation: \n";
std::cout << " " << xclAXICheckerCodes::decodeAXICheckerCodes(debugResults.SnapshotStatus[i]);
//snapshot reflects first violation, cumulative has all violations
unsigned int tCummStatus[4];
std::transform(debugResults.CumulativeStatus[i], debugResults.CumulativeStatus[i]+4, debugResults.SnapshotStatus[i], tCummStatus, std::bit_xor<unsigned int>());
std::cout << " Other violations: \n";
std::string tstr = xclAXICheckerCodes::decodeAXICheckerCodes(tCummStatus);
if (tstr == "") {
std::cout << " None";
}
else {
std::cout << " " << tstr;
}
violations_found = true;
}
}
if (!violations_found && !invalid_codes) {
std::cout << "No AXI violations found \n";
}
if (violations_found && aVerbose && !invalid_codes) {
std::cout << "\n";
std::cout << std::left
<< std::setw(col1) << "CU Name"
<< " " << std::setw(col2) << "AXI Portname"
<< " " << std::setw(16) << "Overall Status"
<< " " << std::setw(16) << "Snapshot[0]"
<< " " << std::setw(16) << "Snapshot[1]"
<< " " << std::setw(16) << "Snapshot[2]"
<< " " << std::setw(16) << "Snapshot[3]"
<< " " << std::setw(16) << "Cumulative[0]"
<< " " << std::setw(16) << "Cumulative[1]"
<< " " << std::setw(16) << "Cumulative[2]"
<< " " << std::setw(16) << "Cumulative[3]"
<< std::endl;
for (unsigned int i = 0; i<debugResults.NumSlots; ++i) {
std::cout << std::left
<< std::setw(col1) << cuNameportNames[i].first
<< " " << std::setw(col2) << cuNameportNames[i].second
<< " " << std::setw(16) << std::hex << debugResults.OverallStatus[i]
<< " " << std::setw(16) << std::hex << debugResults.SnapshotStatus[i][0]
<< " " << std::setw(16) << std::hex << debugResults.SnapshotStatus[i][1]
<< " " << std::setw(16) << std::hex << debugResults.SnapshotStatus[i][2]
<< " " << std::setw(16) << std::hex << debugResults.SnapshotStatus[i][3]
<< " " << std::setw(16) << std::hex << debugResults.CumulativeStatus[i][0]
<< " " << std::setw(16) << std::hex << debugResults.CumulativeStatus[i][1]
<< " " << std::setw(16) << std::hex << debugResults.CumulativeStatus[i][2]
<< " " << std::setw(16) << std::hex << debugResults.CumulativeStatus[i][3]
<< std::dec << std::endl;
}
}
return 0;
}