aboutsummaryrefslogtreecommitdiffstats
path: root/json
diff options
context:
space:
mode:
authorMiodrag Milanovic <mmicko@gmail.com>2019-06-07 11:48:15 +0200
committerMiodrag Milanovic <mmicko@gmail.com>2019-06-07 11:48:15 +0200
commit1093d7e1228272ca73114bbc4415c48d6cba76ed (patch)
tree13591f77267f0e77fff83593959c0d805c76b4e1 /json
parent3ae50f85b15437b92b0ab3e6e9c243ea0556fdfc (diff)
downloadnextpnr-1093d7e1228272ca73114bbc4415c48d6cba76ed.tar.gz
nextpnr-1093d7e1228272ca73114bbc4415c48d6cba76ed.tar.bz2
nextpnr-1093d7e1228272ca73114bbc4415c48d6cba76ed.zip
WIP saving/loading attributes
Diffstat (limited to 'json')
-rw-r--r--json/jsonparse.cc6
-rw-r--r--json/jsonwrite.cc74
2 files changed, 4 insertions, 76 deletions
diff --git a/json/jsonparse.cc b/json/jsonparse.cc
index 7d11cd03..41d54188 100644
--- a/json/jsonparse.cc
+++ b/json/jsonparse.cc
@@ -349,11 +349,6 @@ void json_import_net_attrib(Context *ctx, string &modname, NetInfo *net, JsonNod
else
log_error("JSON parameter type of \"%s\' of net \'%s\' not supported\n", pId.c_str(ctx),
net->name.c_str(ctx));
-#ifdef ARCH_ECP5
- if (param_node->data_dict_keys[param_id]== "NEXTPNR_IS_GLOBAL") {
- net->is_global = (*dest)[pId].num;
- }
-#endif
if (json_debug)
log_info(" Added parameter \'%s\'=%s to net \'%s\' "
"of module \'%s\'\n",
@@ -885,6 +880,7 @@ bool parse_json_file(std::istream &f, std::string &filename, Context *ctx)
log_info("Checksum: 0x%08x\n", ctx->checksum());
log_break();
ctx->settings.emplace(ctx->id("input/json"), filename);
+ ctx->attributesToCommonInfo();
return true;
} catch (log_execution_error_exception) {
return false;
diff --git a/json/jsonwrite.cc b/json/jsonwrite.cc
index 2aaba756..811a2eec 100644
--- a/json/jsonwrite.cc
+++ b/json/jsonwrite.cc
@@ -48,7 +48,7 @@ std::string get_name(IdString name, Context *ctx)
return get_string(name.c_str(ctx));
}
-bool write_parameters(std::ostream &f, Context *ctx, const std::unordered_map<IdString, Property> &parameters, bool for_module=false)
+void write_parameters(std::ostream &f, Context *ctx, const std::unordered_map<IdString, Property> &parameters, bool for_module=false)
{
bool first = true;
for (auto &param : parameters) {
@@ -60,72 +60,6 @@ bool write_parameters(std::ostream &f, Context *ctx, const std::unordered_map<Id
f << param.second.num;
first = false;
}
- return first;
-}
-
-void write_routing(std::ostream &f, Context *ctx, NetInfo *net, bool first)
-{
- std::string routing;
- bool first2 = true;
- for (auto &item : net->wires) {
- routing += first2 ? "" : ";";
- routing += ctx->getWireName(item.first).c_str(ctx);
- routing += ",";
- if (item.second.pip != PipId())
- routing += ctx->getPipName(item.second.pip).c_str(ctx);
- first2 = false;
- }
-
- f << stringf("%s\n", first ? "" : ",");
- f << stringf(" \"NEXTPNR_ROUTING\": ");
- f << get_string(routing);
-#ifdef ARCH_ECP5
- f << stringf(",\n");
- f << stringf(" \"NEXTPNR_IS_GLOBAL\": ");
- f << std::to_string(net->is_global ? 1:0);
-#endif
-}
-
-void write_constraints(std::ostream &f, Context *ctx, CellInfo *cell, bool first)
-{
- std::string constr;
- constr += std::to_string(cell->constr_x) + ";";
- constr += std::to_string(cell->constr_y) + ";";
- constr += std::to_string(cell->constr_z) + ";";
- constr += std::to_string(cell->constr_abs_z ? 1:0) + ";";
- constr += cell->constr_parent!=nullptr ? cell->constr_parent->name.c_str(ctx) : "";
-#ifdef ARCH_ECP5
- constr += ";";
- constr += std::to_string(cell->sliceInfo.using_dff ? 1:0) + ";";
- constr += std::to_string(cell->sliceInfo.has_l6mux ? 1:0) + ";";
- constr += std::to_string(cell->sliceInfo.is_carry ? 1:0) + ";";
- constr += std::string(cell->sliceInfo.clk_sig.c_str(ctx)) + ";";
- constr += std::string(cell->sliceInfo.lsr_sig.c_str(ctx)) + ";";
- constr += std::string(cell->sliceInfo.clkmux.c_str(ctx)) + ";";
- constr += std::string(cell->sliceInfo.lsrmux.c_str(ctx)) + ";";
- constr += std::string(cell->sliceInfo.srmode.c_str(ctx)) + ";";
- constr += std::to_string(cell->sliceInfo.sd0) + ";";
- constr += std::to_string(cell->sliceInfo.sd1) + ";";
-#endif
- f << stringf("%s\n", first ? "" : ",");
- f << stringf(" \"NEXTPNR_CONSTRAINT\": ");
- f << get_string(constr);
-
- constr = "";
- for(auto &item : cell->constr_children)
- {
- if (!constr.empty()) constr += std::string(";");
- constr += item->name.c_str(ctx);
- }
- f << stringf(",\n");
- f << stringf(" \"NEXTPNR_CONSTR_CHILDREN\": ");
- f << get_string(constr);
- if (cell->bel != BelId()) {
- f << stringf(",\n");
- f << stringf(" \"NEXTPNR_BEL\": ");
- f << get_string(ctx->getBelName(cell->bel).c_str(ctx));
- }
-
}
void write_module(std::ostream &f, Context *ctx)
@@ -154,8 +88,7 @@ void write_module(std::ostream &f, Context *ctx)
write_parameters(f, ctx, c->params);
f << stringf("\n },\n");
f << stringf(" \"attributes\": {");
- bool first3 = write_parameters(f, ctx, c->attrs);
- write_constraints(f, ctx, c.get(), first3);
+ write_parameters(f, ctx, c->attrs);
f << stringf("\n },\n");
f << stringf(" \"port_directions\": {");
bool first2 = true;
@@ -196,8 +129,7 @@ void write_module(std::ostream &f, Context *ctx)
f << stringf(" \"hide_name\": %s,\n", w->name.c_str(ctx)[0] == '$' ? "1" : "0");
f << stringf(" \"bits\": [ %d ] ,\n", pair.first.index);
f << stringf(" \"attributes\": {");
- bool first2 = write_parameters(f, ctx, w->attrs);
- write_routing(f, ctx, w.get(), first2);
+ write_parameters(f, ctx, w->attrs);
f << stringf("\n }\n");
f << stringf(" }");
first = false;