Added support for attributes/properties types

This commit is contained in:
Miodrag Milanovic 2019-06-01 15:52:32 +02:00
parent ccbe2dd18d
commit d5d8213871
6 changed files with 51 additions and 13 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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());

View File

@ -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));

View File

@ -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());
if (param.second.isString())
f << get_string(param.second);
else
f << param.second.num;
first = false;
}
return first;