aboutsummaryrefslogtreecommitdiffstats
path: root/json
diff options
context:
space:
mode:
authorMiodrag Milanovic <mmicko@gmail.com>2019-06-21 09:43:47 +0200
committerMiodrag Milanovic <mmicko@gmail.com>2019-06-21 09:43:47 +0200
commit92da4a91de0b602b0414754bd3ae05fdd70acbe7 (patch)
tree694fbffad464c0bbe158809327250125bf2a1cc7 /json
parentff257a092930492a1260cf0c1f79d76c3d098612 (diff)
downloadnextpnr-92da4a91de0b602b0414754bd3ae05fdd70acbe7.tar.gz
nextpnr-92da4a91de0b602b0414754bd3ae05fdd70acbe7.tar.bz2
nextpnr-92da4a91de0b602b0414754bd3ae05fdd70acbe7.zip
Preserve ports
Diffstat (limited to 'json')
-rw-r--r--json/jsonparse.cc8
-rw-r--r--json/jsonwrite.cc13
2 files changed, 18 insertions, 3 deletions
diff --git a/json/jsonparse.cc b/json/jsonparse.cc
index 92bbf92f..76854bf9 100644
--- a/json/jsonparse.cc
+++ b/json/jsonparse.cc
@@ -717,6 +717,12 @@ static void insert_iobuf(Context *ctx, NetInfo *net, PortType type, const string
assert(false);
}
ctx->cells[iobuf->name] = std::move(iobuf);
+
+ PortInfo pinfo;
+ pinfo.name = net->name;
+ pinfo.net = net;
+ pinfo.type = type;
+ ctx->ports[net->name] = pinfo;
}
void json_import_toplevel_port(Context *ctx, const string &modname, const std::vector<IdString> &netnames,
@@ -726,7 +732,7 @@ void json_import_toplevel_port(Context *ctx, const string &modname, const std::v
JsonNode *nets_node = node->data_dict.at("bits");
json_import_ports(
ctx, modname, netnames, "Top Level IO", portname, dir_node, nets_node,
- [ctx](PortType type, const std::string &name, NetInfo *net) { insert_iobuf(ctx, net, type, name); });
+ [ctx](PortType type, const std::string &name, NetInfo *net) { insert_iobuf(ctx, net, type, name); });
}
void json_import(Context *ctx, string modname, JsonNode *node)
diff --git a/json/jsonwrite.cc b/json/jsonwrite.cc
index ac54bc4e..552cd398 100644
--- a/json/jsonwrite.cc
+++ b/json/jsonwrite.cc
@@ -76,11 +76,20 @@ void write_module(std::ostream &f, Context *ctx)
write_parameters(f, ctx, ctx->attrs, true);
f << stringf("\n },\n");
f << stringf(" \"ports\": {");
- // TODO: Top level ports
+ bool first = true;
+ for (auto &pair : ctx->ports) {
+ auto &c = pair.second;
+ f << stringf("%s\n", first ? "" : ",");
+ f << stringf(" %s: {\n", get_name(c.name, ctx).c_str());
+ f << stringf(" \"direction\": \"%s\",\n", c.type == PORT_IN ? "input" : c.type == PORT_INOUT ? "inout" : "output");
+ f << stringf(" \"bits\": [ %d ]\n", pair.first.index);
+ f << stringf(" }");
+ first = false;
+ }
f << stringf("\n },\n");
f << stringf(" \"cells\": {");
- bool first = true;
+ first = true;
for (auto &pair : ctx->cells) {
auto &c = pair.second;
f << stringf("%s\n", first ? "" : ",");