diff options
author | Miodrag Milanovic <mmicko@gmail.com> | 2019-06-03 21:01:05 +0200 |
---|---|---|
committer | Miodrag Milanovic <mmicko@gmail.com> | 2019-06-03 21:01:05 +0200 |
commit | 44d6f16b66e5f7b89e8cf5711744d6e5f6a40b4a (patch) | |
tree | 1cf8d31f6e9b59a2535e1bae8d1d5f45996b9572 | |
parent | 82ed1803c726e912730c3053179f179b90c9b694 (diff) | |
download | nextpnr-44d6f16b66e5f7b89e8cf5711744d6e5f6a40b4a.tar.gz nextpnr-44d6f16b66e5f7b89e8cf5711744d6e5f6a40b4a.tar.bz2 nextpnr-44d6f16b66e5f7b89e8cf5711744d6e5f6a40b4a.zip |
Support ecp5 read write additional cell info
-rw-r--r-- | common/command.cc | 21 | ||||
-rw-r--r-- | json/jsonwrite.cc | 13 |
2 files changed, 30 insertions, 4 deletions
diff --git a/common/command.cc b/common/command.cc index d0ef5174..d700f4ee 100644 --- a/common/command.cc +++ b/common/command.cc @@ -28,6 +28,7 @@ #endif #include <boost/algorithm/string/join.hpp> +#include <boost/algorithm/string.hpp> #include <boost/filesystem/convenience.hpp> #include <boost/program_options.hpp> #include <fstream> @@ -317,15 +318,27 @@ int CommandHandler::executeMain(std::unique_ptr<Context> ctx) auto constr_child = c->attrs.find(ctx->id("NEXTPNR_CONSTR_CHILDREN")); if (constr_main!=c->attrs.end()) { - std::vector<std::string> val = split(constr_main->second.str.c_str(),";"); + std::vector<std::string> val; + boost::split(val,constr_main->second.str,boost::is_any_of(";")); c->constr_x = std::stoi(val[0]); c->constr_y = std::stoi(val[1]); c->constr_z = std::stoi(val[2]); - c->constr_abs_z = val[3]=="1" ? true : false; + c->constr_abs_z = val[3]=="1"; c->constr_parent = nullptr; - if (val.size()==5) + if (!val[4].empty()) c->constr_parent = ctx->cells.find(ctx->id(val[4].c_str()))->second.get(); - + #ifdef ARCH_ECP5 + c->sliceInfo.using_dff = val[5]=="1"; + c->sliceInfo.has_l6mux = val[6]=="1"; + c->sliceInfo.is_carry = val[7]=="1"; + c->sliceInfo.clk_sig = ctx->id(val[8]); + c->sliceInfo.lsr_sig = ctx->id(val[9]); + c->sliceInfo.clkmux = ctx->id(val[10]); + c->sliceInfo.lsrmux = ctx->id(val[11]); + c->sliceInfo.srmode = ctx->id(val[12]); + c->sliceInfo.sd0 = std::stoi(val[13]); + c->sliceInfo.sd1 = std::stoi(val[14]); + #endif } if (constr_child!=c->attrs.end()) { diff --git a/json/jsonwrite.cc b/json/jsonwrite.cc index e62a7d2a..9f29d510 100644 --- a/json/jsonwrite.cc +++ b/json/jsonwrite.cc @@ -89,6 +89,19 @@ void write_constraints(std::ostream &f, Context *ctx, CellInfo *cell, bool first 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); |