From aa8359c73e47ca3fed620dbab9ef7ce8d4a6732c Mon Sep 17 00:00:00 2001 From: YRabbit Date: Fri, 9 Dec 2022 12:55:22 +1000 Subject: gowin: BUGFIX: Correctly handle resets When a single primitive occupies several cells, care must be taken when manipulating the parameters of that primitive: when creating cells, each cell must receive a copy of all the parameters and not modify them unnecessarily. That is, if possible, it is better to make all parameter changes before dividing the primitive into cells. Signed-off-by: YRabbit --- gowin/pack.cc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'gowin/pack.cc') diff --git a/gowin/pack.cc b/gowin/pack.cc index c36a4757..e1119dde 100644 --- a/gowin/pack.cc +++ b/gowin/pack.cc @@ -1026,6 +1026,20 @@ static void pack_plls(Context *ctx) for (int i = 0; i < 4; ++i) { ci->setParam(ports[i][1], port_used(ci, ports[i][0]) ? pr_enable : pr_disable); } + // resets + NetInfo *net = ci->getPort(id_RESET); + ci->setParam(id_RSTEN, pr_enable); + if (!port_used(ci, id_RESET) || net->name == ctx->id("$PACKER_VCC_NET") || + net->name == ctx->id("$PACKER_GND_NET")) { + ci->setParam(id_RSTEN, pr_disable); + } + ci->setParam(id_PWDEN, pr_enable); + net = ci->getPort(id_RESET_P); + if (!port_used(ci, id_RESET_P) || net->name == ctx->id("$PACKER_VCC_NET") || + net->name == ctx->id("$PACKER_GND_NET")) { + ci->setParam(id_PWDEN, pr_disable); + } + // B half std::unique_ptr cell = create_generic_cell(ctx, id_RPLLB, ci->name.str(ctx) + "$rpllb"); reconnect_rpllb(ctx, ci, cell.get()); -- cgit v1.2.3