mirror of https://github.com/YosysHQ/nextpnr.git
handle PLL special inputs
This commit is contained in:
parent
ca287d07a0
commit
0708a7f545
|
|
@ -127,6 +127,9 @@ CellInfo *GateMatePacker::create_cell_ptr(IdString type, IdString name)
|
||||||
add_port(id_I, PORT_IN);
|
add_port(id_I, PORT_IN);
|
||||||
} else if (type.in(id_PLL)) {
|
} else if (type.in(id_PLL)) {
|
||||||
add_port(id_CLK_REF, PORT_IN);
|
add_port(id_CLK_REF, PORT_IN);
|
||||||
|
add_port(id_USR_CLK_REF, PORT_IN);
|
||||||
|
add_port(id_USR_SEL_A_B, PORT_IN);
|
||||||
|
add_port(id_CLK_FEEDBACK, PORT_IN);
|
||||||
add_port(id_CLK0, PORT_OUT);
|
add_port(id_CLK0, PORT_OUT);
|
||||||
add_port(id_CLK90, PORT_OUT);
|
add_port(id_CLK90, PORT_OUT);
|
||||||
add_port(id_CLK180, PORT_OUT);
|
add_port(id_CLK180, PORT_OUT);
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,7 @@ struct GateMatePacker
|
||||||
void dff_update_params();
|
void dff_update_params();
|
||||||
void disconnect_if_gnd(CellInfo *cell, IdString input);
|
void disconnect_if_gnd(CellInfo *cell, IdString input);
|
||||||
void pll_out(CellInfo *cell, IdString origPort, Loc fixed);
|
void pll_out(CellInfo *cell, IdString origPort, Loc fixed);
|
||||||
|
void rewire_ram_o(CellInfo *first, IdString port, CellInfo *second);
|
||||||
|
|
||||||
void disconnect_not_used();
|
void disconnect_not_used();
|
||||||
void optimize_lut();
|
void optimize_lut();
|
||||||
|
|
|
||||||
|
|
@ -646,6 +646,36 @@ void GateMatePacker::pack_pll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GateMatePacker::rewire_ram_o(CellInfo *first, IdString port, CellInfo *second)
|
||||||
|
{
|
||||||
|
NetInfo *net = first->getPort(port);
|
||||||
|
if (net && net->driver.cell) {
|
||||||
|
net = net->driver.cell->getPort(id_I);
|
||||||
|
if (net && net->driver.cell) {
|
||||||
|
uint8_t val = int_or_default(net->driver.cell->params, id_INIT_L00, 0);
|
||||||
|
switch (val) {
|
||||||
|
case LUT_ZERO:
|
||||||
|
net = net_PACKER_GND;
|
||||||
|
break;
|
||||||
|
case LUT_ONE:
|
||||||
|
net = net_PACKER_VCC;
|
||||||
|
break;
|
||||||
|
case LUT_D0:
|
||||||
|
net = net->driver.cell->getPort(id_IN1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
log_error("Unsupported config, rewire from '%s' port '%s'\n", first->name.c_str(ctx), port.c_str(ctx));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
second->connectPort(port, net);
|
||||||
|
} else {
|
||||||
|
log_error("Missing cell, rewire from '%s' port '%s'\n", first->name.c_str(ctx), port.c_str(ctx));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log_error("Missing cell, rewire from '%s' port '%s'\n", first->name.c_str(ctx), port.c_str(ctx));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void GateMatePacker::copy_clocks()
|
void GateMatePacker::copy_clocks()
|
||||||
{
|
{
|
||||||
if (uarch->dies == 1)
|
if (uarch->dies == 1)
|
||||||
|
|
@ -729,6 +759,15 @@ void GateMatePacker::copy_clocks()
|
||||||
pll_new->connectPorts(id_CLK180, uarch->glbout[new_die], ctx->idf("CLK180_%d", i));
|
pll_new->connectPorts(id_CLK180, uarch->glbout[new_die], ctx->idf("CLK180_%d", i));
|
||||||
if (pll->getPort(id_CLK270))
|
if (pll->getPort(id_CLK270))
|
||||||
pll_new->connectPorts(id_CLK270, uarch->glbout[new_die], ctx->idf("CLK270_%d", i));
|
pll_new->connectPorts(id_CLK270, uarch->glbout[new_die], ctx->idf("CLK270_%d", i));
|
||||||
|
if (pll->getPort(id_USR_LOCKED_STDY_RST))
|
||||||
|
rewire_ram_o(pll, id_USR_LOCKED_STDY_RST, pll_new);
|
||||||
|
if (pll->getPort(id_USR_CLK_REF))
|
||||||
|
rewire_ram_o(pll, id_USR_CLK_REF, pll_new);
|
||||||
|
if (pll->getPort(id_USR_SEL_A_B))
|
||||||
|
rewire_ram_o(pll, id_USR_SEL_A_B, pll_new);
|
||||||
|
move_ram_o_fixed(pll_new, id_USR_LOCKED_STDY_RST, new_loc);
|
||||||
|
move_ram_o_fixed(pll_new, id_USR_CLK_REF, new_loc);
|
||||||
|
move_ram_o_fixed(pll_new, id_USR_SEL_A_B, new_loc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Copy GLBOUT inputs
|
// Copy GLBOUT inputs
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue