diff --git a/himbaechel/uarch/gowin/cst.cc b/himbaechel/uarch/gowin/cst.cc index 00b7fafd..2e2cac44 100644 --- a/himbaechel/uarch/gowin/cst.cc +++ b/himbaechel/uarch/gowin/cst.cc @@ -168,7 +168,7 @@ struct GowinCstReader } adc_ios.insert(ctx->idf("%d/X%dY%d", std::stoi(match[1]), col - 1, row - 1)); } break; - case clock: { // CLOCK name BUFG|S=# + case clock: { // CLOCK_LOC name BUFG|S=# std::string which_clock = match[2]; std::string lw = match[4]; int lw_idx = -1; diff --git a/himbaechel/uarch/gowin/globals.cc b/himbaechel/uarch/gowin/globals.cc index 64c230d1..553ca22e 100644 --- a/himbaechel/uarch/gowin/globals.cc +++ b/himbaechel/uarch/gowin/globals.cc @@ -82,13 +82,15 @@ struct GowinGlobalRouter bool res; if (src == src_wire && (src_type == id_PLL_O || (!src_is_outpin))) { bool dst_is_spine = dst_name.str(ctx).rfind("SPINE", 0) == 0; - res = src_valid && (dst_is_spine || dst_type == id_PLL_O); + bool src_is_gate = gwu.wire_is_clock_gate(src); + res = (src_valid && (dst_is_spine || dst_type == id_PLL_O)) || (src_is_gate && dst_valid); } else { res = (src_valid && dst_valid) || (src_valid && is_local(dst_type)) || (is_local(src_type) && dst_valid); } if (ctx->debug && false /*&& res*/) { - log_info("%s <- %s [%s <- %s]\n", ctx->nameOfWire(ctx->getPipDstWire(pip)), - ctx->nameOfWire(ctx->getPipSrcWire(pip)), dst_type.c_str(ctx), src_type.c_str(ctx)); + log_info("%s <- %s [%s <- %s] src:%s\n", ctx->nameOfWire(ctx->getPipDstWire(pip)), + ctx->nameOfWire(ctx->getPipSrcWire(pip)), dst_type.c_str(ctx), src_type.c_str(ctx), + ctx->nameOfWire(src_wire)); log_info(" res:%d, src_valid:%d, dst_valid:%d, src local:%d, dst local:%d, dst gate:%d\n", res, src_valid, dst_valid, is_local(src_type), is_local(dst_type), gwu.wire_is_clock_gate(dst)); }