Added return code to json parsing and pcf reading
This commit is contained in:
parent
8fac26c2b7
commit
c33a039ac3
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
75
ice40/pcf.cc
75
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user