Skip to content

Commit

Permalink
Added return code to json parsing and pcf reading
Browse files Browse the repository at this point in the history
  • Loading branch information
mmicko committed Jun 21, 2018
1 parent 8fac26c commit c33a039
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 54 deletions.
33 changes: 19 additions & 14 deletions frontend/json/jsonparse.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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();
log_info("Checksum: 0x%08x\n", ctx->checksum());
log_break();
return true;
} catch (log_execution_error_exception) {
return false;
}
}

NEXTPNR_NAMESPACE_END
2 changes: 1 addition & 1 deletion frontend/json/jsonparse.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions gui/ice40/worker.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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");
}
}

Expand Down
6 changes: 4 additions & 2 deletions ice40/main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
75 changes: 41 additions & 34 deletions ice40/pcf.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}

Expand Down
2 changes: 1 addition & 1 deletion ice40/pcf.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down

0 comments on commit c33a039

Please sign in to comment.