Fix loading json

This commit is contained in:
Miodrag Milanovic 2019-06-21 11:31:59 +02:00
parent 92da4a91de
commit 87ecd49295

View File

@ -661,62 +661,64 @@ static void insert_iobuf(Context *ctx, NetInfo *net, PortType type, const string
// During packing, this generic IO buffer will be converted to an // During packing, this generic IO buffer will be converted to an
// architecure primitive. // architecure primitive.
// //
std::unique_ptr<CellInfo> iobuf = std::unique_ptr<CellInfo>(new CellInfo()); if (ctx->settings.find(ctx->id("synth"))==ctx->settings.end()) {
iobuf->name = ctx->id(name); std::unique_ptr<CellInfo> iobuf = std::unique_ptr<CellInfo>(new CellInfo());
std::copy(net->attrs.begin(), net->attrs.end(), std::inserter(iobuf->attrs, iobuf->attrs.begin())); iobuf->name = ctx->id(name);
if (type == PORT_IN) { std::copy(net->attrs.begin(), net->attrs.end(), std::inserter(iobuf->attrs, iobuf->attrs.begin()));
if (ctx->verbose) if (type == PORT_IN) {
log_info("processing input port %s\n", name.c_str()); if (ctx->verbose)
iobuf->type = ctx->id("$nextpnr_ibuf"); log_info("processing input port %s\n", name.c_str());
iobuf->ports[ctx->id("O")] = PortInfo{ctx->id("O"), net, PORT_OUT}; iobuf->type = ctx->id("$nextpnr_ibuf");
// Special case: input, etc, directly drives inout iobuf->ports[ctx->id("O")] = PortInfo{ctx->id("O"), net, PORT_OUT};
if (net->driver.cell != nullptr) { // Special case: input, etc, directly drives inout
if (net->driver.cell->type != ctx->id("$nextpnr_iobuf")) if (net->driver.cell != nullptr) {
log_error("Top-level input '%s' also driven by %s.%s.\n", name.c_str(), if (net->driver.cell->type != ctx->id("$nextpnr_iobuf"))
net->driver.cell->name.c_str(ctx), net->driver.port.c_str(ctx)); log_error("Top-level input '%s' also driven by %s.%s.\n", name.c_str(),
net = net->driver.cell->ports.at(ctx->id("I")).net; net->driver.cell->name.c_str(ctx), net->driver.port.c_str(ctx));
} net = net->driver.cell->ports.at(ctx->id("I")).net;
assert(net->driver.cell == nullptr); }
net->driver.port = ctx->id("O"); assert(net->driver.cell == nullptr);
net->driver.cell = iobuf.get(); net->driver.port = ctx->id("O");
} else if (type == PORT_OUT) { net->driver.cell = iobuf.get();
if (ctx->verbose) } else if (type == PORT_OUT) {
log_info("processing output port %s\n", name.c_str()); if (ctx->verbose)
iobuf->type = ctx->id("$nextpnr_obuf"); log_info("processing output port %s\n", name.c_str());
iobuf->ports[ctx->id("I")] = PortInfo{ctx->id("I"), net, PORT_IN}; iobuf->type = ctx->id("$nextpnr_obuf");
PortRef ref; iobuf->ports[ctx->id("I")] = PortInfo{ctx->id("I"), net, PORT_IN};
ref.cell = iobuf.get(); PortRef ref;
ref.port = ctx->id("I"); ref.cell = iobuf.get();
net->users.push_back(ref); ref.port = ctx->id("I");
} else if (type == PORT_INOUT) { net->users.push_back(ref);
if (ctx->verbose) } else if (type == PORT_INOUT) {
log_info("processing inout port %s\n", name.c_str()); if (ctx->verbose)
iobuf->type = ctx->id("$nextpnr_iobuf"); log_info("processing inout port %s\n", name.c_str());
iobuf->ports[ctx->id("I")] = PortInfo{ctx->id("I"), nullptr, PORT_IN}; iobuf->type = ctx->id("$nextpnr_iobuf");
iobuf->ports[ctx->id("I")] = PortInfo{ctx->id("I"), nullptr, PORT_IN};
// Split the input and output nets for bidir ports // Split the input and output nets for bidir ports
std::unique_ptr<NetInfo> net2 = std::unique_ptr<NetInfo>(new NetInfo()); std::unique_ptr<NetInfo> net2 = std::unique_ptr<NetInfo>(new NetInfo());
net2->name = ctx->id("$" + net->name.str(ctx) + "$iobuf_i"); net2->name = ctx->id("$" + net->name.str(ctx) + "$iobuf_i");
net2->driver = net->driver; net2->driver = net->driver;
if (net->driver.cell != nullptr) { if (net->driver.cell != nullptr) {
net2->driver.cell->ports[net2->driver.port].net = net2.get(); net2->driver.cell->ports[net2->driver.port].net = net2.get();
net->driver.cell = nullptr; net->driver.cell = nullptr;
} }
iobuf->ports[ctx->id("I")].net = net2.get(); iobuf->ports[ctx->id("I")].net = net2.get();
PortRef ref; PortRef ref;
ref.cell = iobuf.get(); ref.cell = iobuf.get();
ref.port = ctx->id("I"); ref.port = ctx->id("I");
net2->users.push_back(ref); net2->users.push_back(ref);
ctx->nets[net2->name] = std::move(net2); ctx->nets[net2->name] = std::move(net2);
iobuf->ports[ctx->id("O")] = PortInfo{ctx->id("O"), net, PORT_OUT}; iobuf->ports[ctx->id("O")] = PortInfo{ctx->id("O"), net, PORT_OUT};
assert(net->driver.cell == nullptr); assert(net->driver.cell == nullptr);
net->driver.port = ctx->id("O"); net->driver.port = ctx->id("O");
net->driver.cell = iobuf.get(); net->driver.cell = iobuf.get();
} else { } else {
assert(false); assert(false);
}
ctx->cells[iobuf->name] = std::move(iobuf);
} }
ctx->cells[iobuf->name] = std::move(iobuf);
PortInfo pinfo; PortInfo pinfo;
pinfo.name = net->name; pinfo.name = net->name;