aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/nextpnr.h39
-rw-r--r--common/pybindings.cc2
-rw-r--r--ecp5/pack.cc2
-rw-r--r--ice40/pack.cc2
-rw-r--r--json/jsonparse.cc12
-rw-r--r--json/jsonwrite.cc7
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> &parameters, bool for_module=false)
+bool 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) {
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;