aboutsummaryrefslogtreecommitdiffstats
path: root/frontend/json/jsonparse.cc
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/json/jsonparse.cc')
-rw-r--r--frontend/json/jsonparse.cc145
1 files changed, 74 insertions, 71 deletions
diff --git a/frontend/json/jsonparse.cc b/frontend/json/jsonparse.cc
index 3d13a512..cacc57ea 100644
--- a/frontend/json/jsonparse.cc
+++ b/frontend/json/jsonparse.cc
@@ -218,16 +218,16 @@ struct JsonNode
}
};
-NetInfo *ground_net(NetInfo *net)
+NetInfo *ground_net(Context *ctx, NetInfo *net)
{
CellInfo *cell = new CellInfo;
PortInfo port_info;
PortRef port_ref;
- cell->name = string(net->name.str() + ".GND");
- cell->type = string("GND");
+ cell->name = ctx->id(net->name.str(ctx) + ".GND");
+ cell->type = ctx->id("GND");
- port_info.name = cell->name.str() + "[]";
+ port_info.name = ctx->id(cell->name.str(ctx) + "[]");
port_info.net = net;
port_info.type = PORT_OUT;
@@ -241,16 +241,16 @@ NetInfo *ground_net(NetInfo *net)
return net;
}
-NetInfo *vcc_net(NetInfo *net)
+NetInfo *vcc_net(Context *ctx, NetInfo *net)
{
CellInfo *cell = new CellInfo;
PortInfo port_info;
PortRef port_ref;
- cell->name = string(net->name.str() + ".VCC");
- cell->type = string("VCC");
+ cell->name = ctx->id(net->name.str(ctx) + ".VCC");
+ cell->type = ctx->id("VCC");
- port_info.name = cell->name.str() + "[]";
+ port_info.name = ctx->id(cell->name.str(ctx) + "[]");
port_info.net = net;
port_info.type = PORT_OUT;
@@ -264,12 +264,12 @@ NetInfo *vcc_net(NetInfo *net)
return net;
}
-NetInfo *floating_net(NetInfo *net)
+NetInfo *floating_net(Context *ctx, NetInfo *net)
{
PortInfo port_info;
PortRef port_ref;
- port_info.name = net->name.str() + ".floating";
+ port_info.name = ctx->id(net->name.str(ctx) + ".floating");
port_info.net = net;
port_info.type = PORT_OUT;
@@ -324,7 +324,7 @@ void json_import_cell_params(Context *ctx, string &modname, CellInfo *cell,
//
param = param_node->data_dict.at(param_node->data_dict_keys[param_id]);
- pId = param_node->data_dict_keys[param_id];
+ pId = ctx->id(param_node->data_dict_keys[param_id]);
if (param->type == 'N') {
(*dest)[pId] = std::to_string(param->data_number);
} else if (param->type == 'S')
@@ -332,13 +332,13 @@ void json_import_cell_params(Context *ctx, string &modname, CellInfo *cell,
else
log_error(
"JSON parameter type of \"%s\' of cell \'%s\' not supported\n",
- pId.c_str(), cell->name.c_str());
+ pId.c_str(ctx), cell->name.c_str(ctx));
if (json_debug)
log_info(" Added parameter \'%s\'=%s to cell \'%s\' "
"of module \'%s\'\n",
- pId.c_str(), cell->params[pId].c_str(), cell->name.c_str(),
- modname.c_str());
+ pId.c_str(ctx), cell->params[pId].c_str(),
+ cell->name.c_str(ctx), modname.c_str());
}
static int const_net_idx = 0;
@@ -371,7 +371,7 @@ void json_import_ports(Context *ctx, const string &modname,
PortInfo port_info;
- port_info.name = port_name;
+ port_info.name = ctx->id(port_name);
if (dir_node->data_string.compare("input") == 0)
port_info.type = PORT_IN;
else if (dir_node->data_string.compare("output") == 0)
@@ -403,11 +403,11 @@ void json_import_ports(Context *ctx, const string &modname,
//
// Create the port, but leave the net NULL
- visitor(port_info.type, port_info.name, nullptr);
+ visitor(port_info.type, port_info.name.str(ctx), nullptr);
if (json_debug)
log_info(" Port \'%s\' has no connection in \'%s\'\n",
- port_info.name.c_str(), obj_name.c_str());
+ port_info.name.c_str(ctx), obj_name.c_str());
} else
for (int index = 0; index < wire_group_node->data_array.size();
@@ -422,8 +422,8 @@ void json_import_ports(Context *ctx, const string &modname,
//
// Pick a name for this port
if (is_bus)
- this_port.name = port_info.name.str() + "[" +
- std::to_string(index) + "]";
+ this_port.name = ctx->id(port_info.name.str(ctx) + "[" +
+ std::to_string(index) + "]");
else
this_port.name = port_info.name;
this_port.type = port_info.type;
@@ -436,7 +436,7 @@ void json_import_ports(Context *ctx, const string &modname,
if (net_num < netnames.size())
net_id = netnames.at(net_num);
else
- net_id = std::to_string(net_num);
+ net_id = ctx->id(std::to_string(net_num));
if (ctx->nets.count(net_id) == 0) {
// The net doesn't exist in the design (yet)
// Create in now
@@ -448,7 +448,7 @@ void json_import_ports(Context *ctx, const string &modname,
this_net = new NetInfo;
this_net->name = net_id;
this_net->driver.cell = NULL;
- this_net->driver.port = "";
+ this_net->driver.port = IdString();
ctx->nets[net_id] = this_net;
} else {
//
@@ -459,9 +459,9 @@ void json_import_ports(Context *ctx, const string &modname,
if (json_debug)
log_info(" Reusing net \'%s\', id \'%s\', "
"with driver \'%s\'\n",
- this_net->name.c_str(), net_id.c_str(),
+ this_net->name.c_str(ctx), net_id.c_str(ctx),
(this_net->driver.cell != NULL)
- ? this_net->driver.port.c_str()
+ ? this_net->driver.port.c_str(ctx)
: "NULL");
}
@@ -472,7 +472,8 @@ void json_import_ports(Context *ctx, const string &modname,
//
// Constants always get their own new net
this_net = new NetInfo;
- this_net->name = "$const_" + std::to_string(const_net_idx++);
+ this_net->name =
+ ctx->id("$const_" + std::to_string(const_net_idx++));
const_input = (this_port.type == PORT_IN);
if (wire_node->data_string.compare(string("0")) == 0) {
@@ -480,18 +481,18 @@ void json_import_ports(Context *ctx, const string &modname,
if (json_debug)
log_info(" Generating a constant "
"zero net\n");
- this_net = ground_net(this_net);
+ this_net = ground_net(ctx, this_net);
} else if (wire_node->data_string.compare(string("1")) == 0) {
if (json_debug)
log_info(" Generating a constant "
"one net\n");
- this_net = vcc_net(this_net);
+ this_net = vcc_net(ctx, this_net);
} else if (wire_node->data_string.compare(string("x")) == 0) {
- this_net = floating_net(this_net);
+ this_net = floating_net(ctx, this_net);
log_warning(" Floating wire node value, "
"\'%s\' of port \'%s\' "
"in cell \'%s\' of module \'%s\'\n",
@@ -507,8 +508,8 @@ void json_import_ports(Context *ctx, const string &modname,
if (json_debug)
log_info(" Inserting port \'%s\' into cell \'%s\'\n",
- this_port.name.c_str(), obj_name.c_str());
- visitor(this_port.type, this_port.name, this_net);
+ this_port.name.c_str(ctx), obj_name.c_str());
+ visitor(this_port.type, this_port.name.str(ctx), this_net);
if (ctx->nets.count(this_net->name) == 0)
ctx->nets[this_net->name] = this_net;
@@ -527,18 +528,19 @@ void json_import_cell(Context *ctx, string modname,
CellInfo *cell = new CellInfo;
- cell->name = cell_name;
+ cell->name = ctx->id(cell_name);
assert(cell_type->type == 'S');
- cell->type = cell_type->data_string;
+ cell->type = ctx->id(cell_type->data_string);
// No BEL assignment here/yet
if (json_debug)
- log_info(" Processing %s $ %s\n", modname.c_str(), cell->name.c_str());
+ log_info(" Processing %s $ %s\n", modname.c_str(),
+ cell->name.c_str(ctx));
param_node = cell_node->data_dict.at("parameters");
if (param_node->type != 'D')
log_error("JSON parameter list of \'%s\' is not a data dictionary\n",
- cell->name.c_str());
+ cell->name.c_str(ctx));
//
// Loop through all parameters, adding them into the
@@ -554,7 +556,7 @@ void json_import_cell(Context *ctx, string modname,
attr_node = cell_node->data_dict.at("attributes");
if (attr_node->type != 'D')
log_error("JSON attribute list of \'%s\' is not a data dictionary\n",
- cell->name.c_str());
+ cell->name.c_str(ctx));
//
// Loop through all attributes, adding them into the
@@ -581,7 +583,7 @@ void json_import_cell(Context *ctx, string modname,
log_error("JSON port_directions node of \'%s\' "
"in module \'%s\' is not a "
"dictionary\n",
- cell->name.c_str(), modname.c_str());
+ cell->name.c_str(ctx), modname.c_str());
} else if (cell_node->data_dict.count("ports") > 0) {
pdir_node = cell_node->data_dict.at("ports");
@@ -589,7 +591,7 @@ void json_import_cell(Context *ctx, string modname,
log_error("JSON ports node of \'%s\' "
"in module \'%s\' is not a "
"dictionary\n",
- cell->name.c_str(), modname.c_str());
+ cell->name.c_str(ctx), modname.c_str());
}
JsonNode *connections = cell_node->data_dict.at("connections");
@@ -597,14 +599,14 @@ void json_import_cell(Context *ctx, string modname,
log_error("JSON connections node of \'%s\' "
"in module \'%s\' is not a "
"dictionary\n",
- cell->name.c_str(), modname.c_str());
+ cell->name.c_str(ctx), modname.c_str());
if (GetSize(pdir_node->data_dict_keys) !=
GetSize(connections->data_dict_keys))
log_error("JSON number of connections doesnt "
"match number of ports in node \'%s\' "
"of module \'%s\'\n",
- cell->name.c_str(), modname.c_str());
+ cell->name.c_str(ctx), modname.c_str());
//
// Loop through all of the ports of this logic element
@@ -620,23 +622,24 @@ void json_import_cell(Context *ctx, string modname,
dir_node = pdir_node->data_dict.at(port_name);
wire_group_node = connections->data_dict.at(port_name);
- json_import_ports(
- ctx, modname, netnames, cell->name, port_name, dir_node,
- wire_group_node,
- [cell](PortType type, const std::string &name, NetInfo *net) {
- cell->ports[name] = PortInfo{name, net, type};
- PortRef pr;
- pr.cell = cell;
- pr.port = name;
- if (net != nullptr) {
- if (type == PORT_IN || type == PORT_INOUT) {
- net->users.push_back(pr);
- } else if (type == PORT_OUT) {
- assert(net->driver.cell == nullptr);
- net->driver = pr;
- }
- }
- });
+ json_import_ports(ctx, modname, netnames, cell->name, port_name,
+ dir_node, wire_group_node,
+ [cell, ctx](PortType type, const std::string &name,
+ NetInfo *net) {
+ cell->ports[ctx->id(name)] =
+ PortInfo{ctx->id(name), net, type};
+ PortRef pr;
+ pr.cell = cell;
+ pr.port = ctx->id(name);
+ if (net != nullptr) {
+ if (type == PORT_IN || type == PORT_INOUT) {
+ net->users.push_back(pr);
+ } else if (type == PORT_OUT) {
+ assert(net->driver.cell == nullptr);
+ net->driver = pr;
+ }
+ }
+ });
}
ctx->cells[cell->name] = cell;
@@ -653,46 +656,46 @@ static void insert_iobuf(Context *ctx, NetInfo *net, PortType type,
// architecure primitive.
//
CellInfo *iobuf = new CellInfo();
- iobuf->name = name;
+ iobuf->name = ctx->id(name);
std::copy(net->attrs.begin(), net->attrs.end(),
std::inserter(iobuf->attrs, iobuf->attrs.begin()));
if (type == PORT_IN) {
log_info("processing input port %s\n", name.c_str());
- iobuf->type = "$nextpnr_ibuf";
- iobuf->ports["O"] = PortInfo{"O", net, PORT_OUT};
+ iobuf->type = ctx->id("$nextpnr_ibuf");
+ iobuf->ports[ctx->id("O")] = PortInfo{ctx->id("O"), net, PORT_OUT};
assert(net->driver.cell == nullptr);
- net->driver.port = "O";
+ net->driver.port = ctx->id("O");
net->driver.cell = iobuf;
} else if (type == PORT_OUT) {
log_info("processing output port %s\n", name.c_str());
- iobuf->type = "$nextpnr_obuf";
- iobuf->ports["I"] = PortInfo{"I", net, PORT_IN};
+ iobuf->type = ctx->id("$nextpnr_obuf");
+ iobuf->ports[ctx->id("I")] = PortInfo{ctx->id("I"), net, PORT_IN};
PortRef ref;
ref.cell = iobuf;
- ref.port = "I";
+ ref.port = ctx->id("I");
net->users.push_back(ref);
} else if (type == PORT_INOUT) {
log_info("processing inout port %s\n", name.c_str());
- iobuf->type = "$nextpnr_iobuf";
- iobuf->ports["I"] = PortInfo{"I", nullptr, PORT_IN};
+ iobuf->type = ctx->id("$nextpnr_iobuf");
+ iobuf->ports[ctx->id("I")] = PortInfo{ctx->id("I"), nullptr, PORT_IN};
if (net->driver.cell != NULL) {
// Split the input and output nets for bidir ports
NetInfo *net2 = new NetInfo();
- net2->name = "$" + net->name.str() + "$iobuf_i";
+ net2->name = ctx->id("$" + net->name.str(ctx) + "$iobuf_i");
net2->driver = net->driver;
net2->driver.cell->ports[net2->driver.port].net = net2;
net->driver.cell = nullptr;
ctx->nets[net2->name] = net2;
- iobuf->ports["I"].net = net2;
+ iobuf->ports[ctx->id("I")].net = net2;
PortRef ref;
ref.cell = iobuf;
- ref.port = "I";
+ ref.port = ctx->id("I");
net2->users.push_back(ref);
}
- iobuf->ports["O"] = PortInfo{"O", net, PORT_OUT};
+ iobuf->ports[ctx->id("O")] = PortInfo{ctx->id("O"), net, PORT_OUT};
assert(net->driver.cell == nullptr);
- net->driver.port = "O";
+ net->driver.port = ctx->id("O");
net->driver.cell = iobuf;
} else {
assert(false);
@@ -739,11 +742,11 @@ void json_import(Context *ctx, string modname, JsonNode *node)
int netid = bits->data_array.at(i)->data_number;
if (netid >= netnames.size())
netnames.resize(netid + 1);
- netnames.at(netid) =
+ netnames.at(netid) = ctx->id(
basename +
(num_bits == 1 ? "" : std::string("[") +
std::to_string(i) +
- std::string("]"));
+ std::string("]")));
}
}
}