Merge pull request #1770 from lnis-uofu/xt_fkey
[lib] now fabric key assistant can cross-check mismatches between reference and input fabric keys
This commit is contained in:
commit
39f6cd13d9
|
@ -34,8 +34,7 @@ static int check_input_and_ref_key_alias_match(
|
||||||
const openfpga::FabricKey& input_key, const openfpga::FabricKey& ref_key,
|
const openfpga::FabricKey& input_key, const openfpga::FabricKey& ref_key,
|
||||||
const bool& verbose) {
|
const bool& verbose) {
|
||||||
size_t num_errors = 0;
|
size_t num_errors = 0;
|
||||||
size_t num_keys_checked = 0;
|
size_t num_ref_keys_checked = 0;
|
||||||
float progress = 0.;
|
|
||||||
VTR_LOG(
|
VTR_LOG(
|
||||||
"Checking key alias matching between reference key and input keys...\n");
|
"Checking key alias matching between reference key and input keys...\n");
|
||||||
for (openfpga::FabricKeyId key_id : ref_key.keys()) {
|
for (openfpga::FabricKeyId key_id : ref_key.keys()) {
|
||||||
|
@ -43,7 +42,7 @@ static int check_input_and_ref_key_alias_match(
|
||||||
std::string curr_alias = ref_key.key_alias(key_id);
|
std::string curr_alias = ref_key.key_alias(key_id);
|
||||||
std::vector<openfpga::FabricKeyId> input_found_keys =
|
std::vector<openfpga::FabricKeyId> input_found_keys =
|
||||||
input_key.find_key_by_alias(curr_alias);
|
input_key.find_key_by_alias(curr_alias);
|
||||||
progress = static_cast<float>(num_keys_checked) /
|
float progress = static_cast<float>(num_ref_keys_checked) /
|
||||||
static_cast<float>(ref_key.num_keys()) * 100.0;
|
static_cast<float>(ref_key.num_keys()) * 100.0;
|
||||||
VTR_LOGV(verbose, "[%lu%] Checking key alias '%s'\r", size_t(progress),
|
VTR_LOGV(verbose, "[%lu%] Checking key alias '%s'\r", size_t(progress),
|
||||||
curr_alias.c_str());
|
curr_alias.c_str());
|
||||||
|
@ -61,11 +60,40 @@ static int check_input_and_ref_key_alias_match(
|
||||||
curr_alias.c_str(), size_t(key_id), input_found_keys.size());
|
curr_alias.c_str(), size_t(key_id), input_found_keys.size());
|
||||||
num_errors++;
|
num_errors++;
|
||||||
}
|
}
|
||||||
num_keys_checked++;
|
num_ref_keys_checked++;
|
||||||
}
|
}
|
||||||
VTR_LOG(
|
VTR_LOG(
|
||||||
"Checking key alias matching between reference key and input keys... %s\n",
|
"Checking key alias matching between reference key and input keys... %s\n",
|
||||||
num_errors ? "[Fail]" : "[Pass]");
|
num_errors ? "[Fail]" : "[Pass]");
|
||||||
|
/* If failed, provide a detailed diff on the key alias */
|
||||||
|
if (num_errors) {
|
||||||
|
size_t num_input_keys_checked = 0;
|
||||||
|
for (openfpga::FabricKeyId key_id : input_key.keys()) {
|
||||||
|
/* Note that this is slow. May consider to build a map first */
|
||||||
|
std::string curr_alias = input_key.key_alias(key_id);
|
||||||
|
std::vector<openfpga::FabricKeyId> ref_found_keys =
|
||||||
|
ref_key.find_key_by_alias(curr_alias);
|
||||||
|
float progress = static_cast<float>(num_input_keys_checked) /
|
||||||
|
static_cast<float>(input_key.num_keys()) * 100.0;
|
||||||
|
VTR_LOGV(verbose, "[%lu%] Checking key alias '%s'\r", size_t(progress),
|
||||||
|
curr_alias.c_str());
|
||||||
|
if (ref_found_keys.empty()) {
|
||||||
|
VTR_LOG_ERROR(
|
||||||
|
"Invalid alias '%s' in the input key (id='%lu'), which does not "
|
||||||
|
"exist in the reference key!\n",
|
||||||
|
curr_alias.c_str(), size_t(key_id));
|
||||||
|
num_errors++;
|
||||||
|
}
|
||||||
|
if (ref_found_keys.size() > 1) {
|
||||||
|
VTR_LOG_ERROR(
|
||||||
|
"Invalid alias '%s' in the reference key (id='%lu'), which have been "
|
||||||
|
"found %lu times!\n",
|
||||||
|
curr_alias.c_str(), size_t(key_id), ref_found_keys.size());
|
||||||
|
num_errors++;
|
||||||
|
}
|
||||||
|
num_input_keys_checked++;
|
||||||
|
}
|
||||||
|
}
|
||||||
return num_errors ? openfpga::CMD_EXEC_FATAL_ERROR
|
return num_errors ? openfpga::CMD_EXEC_FATAL_ERROR
|
||||||
: openfpga::CMD_EXEC_SUCCESS;
|
: openfpga::CMD_EXEC_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue