Added return code to json parsing and pcf reading

This commit is contained in:
Miodrag Milanovic 2018-06-21 18:08:28 +02:00
parent 8fac26c2b7
commit c33a039ac3
6 changed files with 68 additions and 54 deletions

View File

@ -797,27 +797,32 @@ void json_import(Context *ctx, string modname, JsonNode *node)
}
}; // End Namespace JsonParser
void parse_json_file(std::istream &f, std::string &filename, Context *ctx)
bool parse_json_file(std::istream &f, std::string &filename, Context *ctx)
{
using namespace JsonParser;
try {
using namespace JsonParser;
JsonNode root(f);
JsonNode root(f);
if (root.type != 'D')
log_error("JSON root node is not a dictionary.\n");
if (root.type != 'D')
log_error("JSON root node is not a dictionary.\n");
if (root.data_dict.count("modules") != 0) {
JsonNode *modules = root.data_dict.at("modules");
if (root.data_dict.count("modules") != 0) {
JsonNode *modules = root.data_dict.at("modules");
if (modules->type != 'D')
log_error("JSON modules node is not a dictionary.\n");
if (modules->type != 'D')
log_error("JSON modules node is not a dictionary.\n");
for (auto &it : modules->data_dict)
json_import(ctx, it.first, it.second);
for (auto &it : modules->data_dict)
json_import(ctx, it.first, it.second);
}
log_info("Checksum: 0x%08x\n", ctx->checksum());
log_break();
return true;
} catch (log_execution_error_exception) {
return false;
}
log_info("Checksum: 0x%08x\n", ctx->checksum());
log_break();
}
NEXTPNR_NAMESPACE_END

View File

@ -26,7 +26,7 @@
NEXTPNR_NAMESPACE_BEGIN
extern void parse_json_file(std::istream &, std::string &, Context *);
extern bool parse_json_file(std::istream &, std::string &, Context *);
NEXTPNR_NAMESPACE_END

View File

@ -20,7 +20,8 @@ void Worker::parsejson(const std::string &filename)
std::string fn = filename;
std::ifstream f(fn);
try {
parse_json_file(f, fn, ctx);
if (!parse_json_file(f, fn, ctx))
log_error("Loading design failed.\n");
if (!pack_design(ctx))
log_error("Packing design failed.\n");
double freq = 50e6;
@ -33,7 +34,6 @@ void Worker::parsejson(const std::string &filename)
log_error("Routing design failed.\n");
Q_EMIT log("done");
} catch (log_execution_error_exception) {
Q_EMIT log("failed");
}
}

View File

@ -288,11 +288,13 @@ int main(int argc, char *argv[])
if (vm.count("json")) {
std::string filename = vm["json"].as<std::string>();
std::ifstream f(filename);
parse_json_file(f, filename, &ctx);
if (!parse_json_file(f, filename, &ctx))
log_error("Loading design failed.\n");
if (vm.count("pcf")) {
std::ifstream pcf(vm["pcf"].as<std::string>());
apply_pcf(&ctx, pcf);
if (!apply_pcf(&ctx, pcf))
log_error("Loading PCF failed.\n");
}
if (!pack_design(&ctx) && !ctx.force)

View File

@ -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;
}
}

View File

@ -27,7 +27,7 @@
NEXTPNR_NAMESPACE_BEGIN
// Apply PCF constraints to a pre-packing design
void apply_pcf(Context *ctx, std::istream &in);
bool apply_pcf(Context *ctx, std::istream &in);
NEXTPNR_NAMESPACE_END