This commit is contained in:
Marcin Kościelnicki 2020-02-02 22:30:40 +01:00
parent 0cb4f508f7
commit 5db6939a8e
3 changed files with 75 additions and 3 deletions

View File

@ -921,7 +921,7 @@ struct Router2
void do_route() void do_route()
{ {
// Don't multithread if fewer than 200 nets (heuristic) // Don't multithread if fewer than 200 nets (heuristic)
if (route_queue.size() < 200 || 1) { if (route_queue.size() < 200) {
ThreadContext st; ThreadContext st;
for (size_t j = 0; j < route_queue.size(); j++) { for (size_t j = 0; j < route_queue.size(); j++) {
route_net(st, nets_by_udata[route_queue[j]], false); route_net(st, nets_by_udata[route_queue[j]], false);

View File

@ -683,6 +683,8 @@ bool Arch::getCellDelay(const CellInfo *cell, IdString fromPort, IdString toPort
return false; return false;
} else if (cell->type == id("RAMB8BWER")) { } else if (cell->type == id("RAMB8BWER")) {
return false; return false;
} else if (cell->type == id("PLL_ADV")) {
return false;
} }
log_warning("cell type '%s' arc '%s' '%s' is unsupported (instantiated as '%s')\n", cell->type.c_str(this), fromPort.c_str(this), toPort.c_str(this), cell->name.c_str(this)); log_warning("cell type '%s' arc '%s' '%s' is unsupported (instantiated as '%s')\n", cell->type.c_str(this), fromPort.c_str(this), toPort.c_str(this), cell->name.c_str(this));
return false; return false;
@ -802,6 +804,17 @@ TimingPortClass Arch::getPortTimingClass(const CellInfo *cell, IdString port, in
else else
return TMG_REGISTER_OUTPUT; return TMG_REGISTER_OUTPUT;
} }
if (cell->type == id("PLL_ADV")) {
if (port == id("CLKIN1") || port == id("CLKIN2") || port == id("CLKFBIN"))
return TMG_CLOCK_INPUT;
if (port == id("CLKOUT0") || port == id("CLKOUT1") || port == id("CLKOUT2") || port == id("CLKOUT3") || port == id("CLKOUT4") || port == id("CLKOUT5") || port == id("CLKFBOUT"))
return TMG_GEN_CLOCK;
// XXX DRP
if (cell->ports.at(port).type == PORT_IN)
return TMG_ENDPOINT;
else
return TMG_STARTPOINT;
}
// XXX // XXX
log_warning("cell type '%s' port '%s' is unsupported (instantiated as '%s')\n", cell->type.c_str(this), port.c_str(this), cell->name.c_str(this)); log_warning("cell type '%s' port '%s' is unsupported (instantiated as '%s')\n", cell->type.c_str(this), port.c_str(this), cell->name.c_str(this));
return TMG_IGNORE; return TMG_IGNORE;

View File

@ -313,7 +313,7 @@ class LeuctraPacker
if (diff) { if (diff) {
std::unique_ptr<CellInfo> iobs_cell = std::unique_ptr<CellInfo> iobs_cell =
create_leuctra_cell(ctx, ctx->id("IOB"), ci->name.str(ctx) + "$iobs"); create_leuctra_cell(ctx, ctx->id("IOB"), ci->name.str(ctx) + "$iobs");
new_cells.push_back(std::move(iobm_cell)); new_cells.push_back(std::move(iobs_cell));
iobs = new_cells.back().get(); iobs = new_cells.back().get();
if (kind == IOSTD_DIFF) { if (kind == IOSTD_DIFF) {
iobm->params[ctx->id("__MODE__")] = Property("IOBM"); iobm->params[ctx->id("__MODE__")] = Property("IOBM");
@ -842,6 +842,65 @@ class LeuctraPacker
rename_port(ctx, ci, ctx->id("I"), ctx->id("I0")); rename_port(ctx, ci, ctx->id("I"), ctx->id("I0"));
set_const_port(ctx, ci, ctx->id("S"), true, new_cells); set_const_port(ctx, ci, ctx->id("S"), true, new_cells);
ci->params[ctx->id("SINV")] = Property("S_B"); ci->params[ctx->id("SINV")] = Property("S_B");
} else if (ci->type == ctx->id("PLL_ADV")) {
for (auto port : {"RST", "REL", "CLKINSEL", "CLKBRST", "ENOUTSYNC", "MANPULF", "MANPDLF", "SKEWSTB", "SKEWRST", "SKEWCLKIN1", "SKEWCLKIN2"})
handle_invertible_port(ctx, ci, ctx->id(port), false, true, new_cells);
if (!ci->params.count(ctx->id("BANDWIDTH")))
ci->params[ctx->id("BANDWIDTH")] = Property("OPTIMIZED");
if (!ci->params.count(ctx->id("PLL_ADD_LEAKAGE")))
ci->params[ctx->id("PLL_ADD_LEAKAGE")] = Property(2, 2);
if (!ci->params.count(ctx->id("PLL_AVDD_COMP_SET")))
ci->params[ctx->id("PLL_AVDD_COMP_SET")] = Property(2, 2);
if (!ci->params.count(ctx->id("PLL_CLAMP_BYPASS")))
ci->params[ctx->id("PLL_CLAMP_BYPASS")] = Property("FALSE");
if (!ci->params.count(ctx->id("PLL_CLAMP_REF_SEL")))
ci->params[ctx->id("PLL_CLAMP_REF_SEL")] = Property(1, 3);
if (!ci->params.count(ctx->id("PLL_CLKCNTRL")))
ci->params[ctx->id("PLL_CLKCNTRL")] = Property(0, 1);
if (!ci->params.count(ctx->id("PLL_CLK_LOST_DETECT")))
ci->params[ctx->id("PLL_CLK_LOST_DETECT")] = Property("FALSE");
if (!ci->params.count(ctx->id("PLL_CP_BIAS_TRIP_SHIFT")))
ci->params[ctx->id("PLL_CP_BIAS_TRIP_SHIFT")] = Property("TRUE");
if (!ci->params.count(ctx->id("PLL_CP_REPL")))
ci->params[ctx->id("PLL_CP_REPL")] = Property(1, 4);
if (!ci->params.count(ctx->id("PLL_DVDD_COMP_SET")))
ci->params[ctx->id("PLL_DVDD_COMP_SET")] = Property(2, 2);
if (!ci->params.count(ctx->id("PLL_EN_LEAKAGE")))
ci->params[ctx->id("PLL_EN_LEAKAGE")] = Property(2, 2);
if (!ci->params.count(ctx->id("PLL_EN_VCO0")))
ci->params[ctx->id("PLL_EN_VCO0")] = Property("FALSE");
if (!ci->params.count(ctx->id("PLL_EN_VCO1")))
ci->params[ctx->id("PLL_EN_VCO1")] = Property("FALSE");
if (!ci->params.count(ctx->id("PLL_EN_VCO2")))
ci->params[ctx->id("PLL_EN_VCO2")] = Property("FALSE");
if (!ci->params.count(ctx->id("PLL_EN_VCO3")))
ci->params[ctx->id("PLL_EN_VCO3")] = Property("FALSE");
if (!ci->params.count(ctx->id("PLL_EN_VCO4")))
ci->params[ctx->id("PLL_EN_VCO4")] = Property("FALSE");
if (!ci->params.count(ctx->id("PLL_EN_VCO5")))
ci->params[ctx->id("PLL_EN_VCO5")] = Property("FALSE");
if (!ci->params.count(ctx->id("PLL_EN_VCO6")))
ci->params[ctx->id("PLL_EN_VCO6")] = Property("FALSE");
if (!ci->params.count(ctx->id("PLL_EN_VCO7")))
ci->params[ctx->id("PLL_EN_VCO7")] = Property("FALSE");
if (!ci->params.count(ctx->id("PLL_EN_VCO_DIV1")))
ci->params[ctx->id("PLL_EN_VCO_DIV1")] = Property("FALSE");
if (!ci->params.count(ctx->id("PLL_EN_VCO_DIV6")))
ci->params[ctx->id("PLL_EN_VCO_DIV6")] = Property("TRUE");
if (!ci->params.count(ctx->id("PLL_PFD_CNTRL")))
ci->params[ctx->id("PLL_PFD_CNTRL")] = Property(8, 4);
if (!ci->params.count(ctx->id("PLL_PFD_DLY")))
ci->params[ctx->id("PLL_PFD_DLY")] = Property(1, 2);
if (!ci->params.count(ctx->id("PLL_PWRD_CFG")))
ci->params[ctx->id("PLL_PWRD_CFG")] = Property("FALSE");
if (!ci->params.count(ctx->id("PLL_SEL_SLIPD")))
ci->params[ctx->id("PLL_SEL_SLIPD")] = Property("FALSE");
if (!ci->params.count(ctx->id("PLL_TEST_IN_WINDOW")))
ci->params[ctx->id("PLL_TEST_IN_WINDOW")] = Property("FALSE");
if (!ci->params.count(ctx->id("PLL_CLKFBOUT2_NOCOUNT")))
ci->params[ctx->id("PLL_CLKFBOUT2_NOCOUNT")] = Property("TRUE");
if (!ci->params.count(ctx->id("PLL_EN_CNTRL")))
ci->params[ctx->id("PLL_EN_CNTRL")] = Property::from_string("0000000000100010011110001110011000011110101000101111110010111110100001000010000000000");
} }
} }