aboutsummaryrefslogtreecommitdiffstats
path: root/ice40/pcf.cc
diff options
context:
space:
mode:
authorMiodrag Milanovic <mmicko@gmail.com>2018-06-21 18:08:28 +0200
committerMiodrag Milanovic <mmicko@gmail.com>2018-06-21 18:08:28 +0200
commitc33a039ac388bfcb5e068a04a7cb1b05ebec7d7f (patch)
treefaa50278ae2e700246453b85afbff10c91c411cc /ice40/pcf.cc
parent8fac26c2b795865098b1ba16152cd1c510133f29 (diff)
downloadnextpnr-c33a039ac388bfcb5e068a04a7cb1b05ebec7d7f.tar.gz
nextpnr-c33a039ac388bfcb5e068a04a7cb1b05ebec7d7f.tar.bz2
nextpnr-c33a039ac388bfcb5e068a04a7cb1b05ebec7d7f.zip
Added return code to json parsing and pcf reading
Diffstat (limited to 'ice40/pcf.cc')
-rw-r--r--ice40/pcf.cc75
1 files changed, 41 insertions, 34 deletions
diff --git a/ice40/pcf.cc b/ice40/pcf.cc
index 756aba4a..87d27ff1 100644
--- a/ice40/pcf.cc
+++ b/ice40/pcf.cc
@@ -27,44 +27,51 @@ NEXTPNR_NAMESPACE_BEGIN
// Read a w
// Apply PCF constraints to a pre-packing design
-void apply_pcf(Context *ctx, std::istream &in)
+bool apply_pcf(Context *ctx, std::istream &in)
{
- if (!in)
- log_error("failed to open PCF file");
- std::string line;
- while (std::getline(in, line)) {
- size_t cstart = line.find("#");
- if (cstart != std::string::npos)
- line = line.substr(0, cstart);
- std::stringstream ss(line);
- std::vector<std::string> words;
- std::string tmp;
- while (ss >> tmp)
- words.push_back(tmp);
- if (words.size() == 0)
- continue;
- std::string cmd = words.at(0);
- if (cmd == "set_io") {
- size_t args_end = 1;
- while (args_end < words.size() && words.at(args_end).at(0) == '-')
- args_end++;
- std::string cell = words.at(args_end);
- std::string pin = words.at(args_end + 1);
- auto fnd_cell = ctx->cells.find(cell);
- if (fnd_cell == ctx->cells.end()) {
- log_warning("unmatched pcf constraint %s\n", cell.c_str());
+ try {
+ if (!in)
+ log_error("failed to open PCF file");
+ std::string line;
+ while (std::getline(in, line)) {
+ size_t cstart = line.find("#");
+ if (cstart != std::string::npos)
+ line = line.substr(0, cstart);
+ std::stringstream ss(line);
+ std::vector<std::string> words;
+ std::string tmp;
+ while (ss >> tmp)
+ words.push_back(tmp);
+ if (words.size() == 0)
+ continue;
+ std::string cmd = words.at(0);
+ if (cmd == "set_io") {
+ size_t args_end = 1;
+ while (args_end < words.size() &&
+ words.at(args_end).at(0) == '-')
+ args_end++;
+ std::string cell = words.at(args_end);
+ std::string pin = words.at(args_end + 1);
+ auto fnd_cell = ctx->cells.find(cell);
+ if (fnd_cell == ctx->cells.end()) {
+ log_warning("unmatched pcf constraint %s\n", cell.c_str());
+ } else {
+ BelId pin_bel = ctx->getPackagePinBel(pin);
+ if (pin_bel == BelId())
+ log_error("package does not have a pin named %s\n",
+ pin.c_str());
+ fnd_cell->second->attrs["BEL"] =
+ ctx->getBelName(pin_bel).str();
+ log_info("constrained '%s' to bel '%s'\n", cell.c_str(),
+ fnd_cell->second->attrs["BEL"].c_str());
+ }
} else {
- BelId pin_bel = ctx->getPackagePinBel(pin);
- if (pin_bel == BelId())
- log_error("package does not have a pin named %s\n",
- pin.c_str());
- fnd_cell->second->attrs["BEL"] = ctx->getBelName(pin_bel).str();
- log_info("constrained '%s' to bel '%s'\n", cell.c_str(),
- fnd_cell->second->attrs["BEL"].c_str());
+ log_error("unsupported pcf command '%s'\n", cmd.c_str());
}
- } else {
- log_error("unsupported pcf command '%s'\n", cmd.c_str());
}
+ return true;
+ } catch (log_execution_error_exception) {
+ return false;
}
}