From 311a1a711d71d90b9da578b26efeb48a641e92d2 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Wed, 18 Jun 2025 09:56:54 +0200 Subject: [PATCH] gatemate: do not use special serdes pins for auto placement --- himbaechel/uarch/gatemate/gatemate.cc | 4 ++-- himbaechel/uarch/gatemate/pack_io.cc | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/himbaechel/uarch/gatemate/gatemate.cc b/himbaechel/uarch/gatemate/gatemate.cc index 963995f0..c5bdefa1 100644 --- a/himbaechel/uarch/gatemate/gatemate.cc +++ b/himbaechel/uarch/gatemate/gatemate.cc @@ -51,13 +51,13 @@ void GateMateImpl::init(Context *ctx) HimbaechelAPI::init(ctx); for (const auto &pad : ctx->package_info->pads) { available_pads.emplace(IdString(pad.package_pin)); - available_pads.emplace(ctx->id("SER_CLK")); - available_pads.emplace(ctx->id("SER_CLK_N")); BelId bel = ctx->getBelByName(IdStringList::concat(IdString(pad.tile), IdString(pad.bel))); bel_to_pad.emplace(bel, &pad); locations.emplace(std::make_pair(IdString(pad.package_pin), tile_extra_data(bel.tile)->die), ctx->getBelLocation(bel)); } + available_pads.emplace(ctx->id("SER_CLK")); + available_pads.emplace(ctx->id("SER_CLK_N")); for (auto bel : ctx->getBels()) { auto *ptr = bel_extra_data(bel); std::map pins; diff --git a/himbaechel/uarch/gatemate/pack_io.cc b/himbaechel/uarch/gatemate/pack_io.cc index bd56cdc3..dbf99840 100644 --- a/himbaechel/uarch/gatemate/pack_io.cc +++ b/himbaechel/uarch/gatemate/pack_io.cc @@ -276,9 +276,21 @@ void GateMatePacker::pack_io() ci.type = map_types[ci.type]; if (loc.empty() || loc == "UNPLACED") { - if (uarch->available_pads.empty()) + // Skip SER_CLK and SER_CLK_N if found in available_pads + auto it = uarch->available_pads.begin(); + while (it != uarch->available_pads.end()) { + std::string pad_name = it->str(ctx); + if (pad_name == "SER_CLK" || pad_name == "SER_CLK_N") { + ++it; + continue; + } + break; + } + + if (it == uarch->available_pads.end()) log_error("No more pads available.\n"); - IdString id = *(uarch->available_pads.begin()); + + IdString id = *it; uarch->available_pads.erase(id); loc = id.c_str(ctx); }