diff options
author | Miodrag Milanovic <mmicko@gmail.com> | 2019-06-01 15:52:32 +0200 |
---|---|---|
committer | Miodrag Milanovic <mmicko@gmail.com> | 2019-06-01 15:52:32 +0200 |
commit | d5d8213871d8cb68b2e4ef9b3557879c80ff5b51 (patch) | |
tree | 03b1c06d747986941187e2b5d72cc2f93ac2702b | |
parent | ccbe2dd18d12d9d201afd5499e9e70ed8d2539de (diff) | |
download | nextpnr-d5d8213871d8cb68b2e4ef9b3557879c80ff5b51.tar.gz nextpnr-d5d8213871d8cb68b2e4ef9b3557879c80ff5b51.tar.bz2 nextpnr-d5d8213871d8cb68b2e4ef9b3557879c80ff5b51.zip |
Added support for attributes/properties types
-rw-r--r-- | common/nextpnr.h | 39 | ||||
-rw-r--r-- | common/pybindings.cc | 2 | ||||
-rw-r--r-- | ecp5/pack.cc | 2 | ||||
-rw-r--r-- | ice40/pack.cc | 2 | ||||
-rw-r--r-- | json/jsonparse.cc | 12 | ||||
-rw-r--r-- | json/jsonwrite.cc | 7 |
6 files changed, 51 insertions, 13 deletions
diff --git a/common/nextpnr.h b/common/nextpnr.h index fc49300e..02201463 100644 --- a/common/nextpnr.h +++ b/common/nextpnr.h @@ -286,6 +286,41 @@ struct PipMap PlaceStrength strength = STRENGTH_NONE; }; +struct Property +{ + bool is_string; + + std::string str; + int num; + + std::string::iterator begin() { return str.begin(); } + std::string::iterator end() { return str.end(); } + + bool isString() const { return is_string; } + + void setNumber(int val) { is_string = false; num = val; str = std::to_string(val); } + void setString(std::string val) { is_string = true; str = val; } + + const char * c_str() const { return str.c_str(); } + operator std::string () const { return str; } + + bool operator==(const std::string other) const + { + return str == other; + } + bool operator!=(const std::string other) const + { + return str != other; + } + + Property& operator=(std::string other) + { + is_string = true; + str = other; + return *this; + } +}; + struct ClockConstraint; struct NetInfo : ArchNetInfo @@ -295,7 +330,7 @@ struct NetInfo : ArchNetInfo PortRef driver; std::vector<PortRef> users; - std::unordered_map<IdString, std::string> attrs; + std::unordered_map<IdString, Property> attrs; // wire -> uphill_pip std::unordered_map<WireId, PipMap> wires; @@ -328,7 +363,7 @@ struct CellInfo : ArchCellInfo int32_t udata; std::unordered_map<IdString, PortInfo> ports; - std::unordered_map<IdString, std::string> attrs, params; + std::unordered_map<IdString, Property> attrs, params; BelId bel; PlaceStrength belStrength = STRENGTH_NONE; diff --git a/common/pybindings.cc b/common/pybindings.cc index 60f87e27..52dd9717 100644 --- a/common/pybindings.cc +++ b/common/pybindings.cc @@ -122,7 +122,7 @@ BOOST_PYTHON_MODULE(MODULE_NAME) .value("PORT_INOUT", PORT_INOUT) .export_values(); - typedef std::unordered_map<IdString, std::string> AttrMap; + typedef std::unordered_map<IdString, Property> AttrMap; typedef std::unordered_map<IdString, PortInfo> PortMap; typedef std::unordered_map<IdString, IdString> PinMap; typedef std::unordered_map<IdString, std::unique_ptr<Region>> RegionMap; diff --git a/ecp5/pack.cc b/ecp5/pack.cc index 7f00de1f..548c38d8 100644 --- a/ecp5/pack.cc +++ b/ecp5/pack.cc @@ -1896,7 +1896,7 @@ class Ecp5Packer iol->params[ctx->id("DELAY.DEL_VALUE")] = std::to_string(lookup_delay(str_or_default(ci->params, ctx->id("DEL_MODE"), "USER_DEFINED"))); if (ci->params.count(ctx->id("DEL_VALUE")) && - ci->params.at(ctx->id("DEL_VALUE")).substr(0, 5) != "DELAY") + std::string(ci->params.at(ctx->id("DEL_VALUE"))).substr(0, 5) != "DELAY") iol->params[ctx->id("DELAY.DEL_VALUE")] = ci->params.at(ctx->id("DEL_VALUE")); if (ci->ports.count(id_LOADN)) replace_port(ci, id_LOADN, iol, id_LOADN); diff --git a/ice40/pack.cc b/ice40/pack.cc index d8796ede..6c5dad39 100644 --- a/ice40/pack.cc +++ b/ice40/pack.cc @@ -1202,7 +1202,7 @@ static void pack_special(Context *ctx) ? "1" : feedback_path == "PHASE_AND_DELAY" ? "2" - : feedback_path == "EXTERNAL" ? "6" : feedback_path; + : feedback_path == "EXTERNAL" ? "6" : std::string(feedback_path); if (!std::all_of(fbp_value.begin(), fbp_value.end(), isdigit)) log_error("PLL '%s' has unsupported FEEDBACK_PATH value '%s'\n", ci->name.c_str(ctx), feedback_path.c_str()); diff --git a/json/jsonparse.cc b/json/jsonparse.cc index a78affbe..df21eb0f 100644 --- a/json/jsonparse.cc +++ b/json/jsonparse.cc @@ -309,7 +309,7 @@ bool is_blackbox(JsonNode *node) } void json_import_cell_params(Context *ctx, string &modname, CellInfo *cell, JsonNode *param_node, - std::unordered_map<IdString, std::string> *dest, int param_id) + std::unordered_map<IdString, Property> *dest, int param_id) { // JsonNode *param; @@ -319,9 +319,9 @@ void json_import_cell_params(Context *ctx, string &modname, CellInfo *cell, Json pId = ctx->id(param_node->data_dict_keys[param_id]); if (param->type == 'N') { - (*dest)[pId] = std::to_string(param->data_number); + (*dest)[pId].setNumber(param->data_number); } else if (param->type == 'S') - (*dest)[pId] = param->data_string; + (*dest)[pId].setString(param->data_string); else log_error("JSON parameter type of \"%s\' of cell \'%s\' not supported\n", pId.c_str(ctx), cell->name.c_str(ctx)); @@ -333,7 +333,7 @@ void json_import_cell_params(Context *ctx, string &modname, CellInfo *cell, Json } void json_import_net_attrib(Context *ctx, string &modname, NetInfo *net, JsonNode *param_node, - std::unordered_map<IdString, std::string> *dest, int param_id) + std::unordered_map<IdString, Property> *dest, int param_id) { // JsonNode *param; @@ -343,9 +343,9 @@ void json_import_net_attrib(Context *ctx, string &modname, NetInfo *net, JsonNod pId = ctx->id(param_node->data_dict_keys[param_id]); if (param->type == 'N') { - (*dest)[pId] = std::to_string(param->data_number); + (*dest)[pId].setNumber(param->data_number); } else if (param->type == 'S') - (*dest)[pId] = param->data_string; + (*dest)[pId].setString(param->data_string); else log_error("JSON parameter type of \"%s\' of net \'%s\' not supported\n", pId.c_str(ctx), net->name.c_str(ctx)); diff --git a/json/jsonwrite.cc b/json/jsonwrite.cc index bedb2449..8c1f914f 100644 --- a/json/jsonwrite.cc +++ b/json/jsonwrite.cc @@ -48,13 +48,16 @@ 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, std::string> ¶meters, bool for_module=false) +bool write_parameters(std::ostream &f, Context *ctx, const std::unordered_map<IdString, Property> ¶meters, bool for_module=false) { bool first = true; for (auto ¶m : parameters) { f << stringf("%s\n", first ? "" : ","); f << stringf(" %s%s: ", for_module ? "" : " ", get_name(param.first,ctx).c_str()); - f << get_string(param.second); + if (param.second.isString()) + f << get_string(param.second); + else + f << param.second.num; first = false; } return first; |