Fix loading json
This commit is contained in:
parent
92da4a91de
commit
87ecd49295
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user