From 0690ca7f1691a4835af7a351e907481589f6262d Mon Sep 17 00:00:00 2001 From: Joris van Zwieten Date: Thu, 30 Jul 2026 15:37:16 +0200 Subject: [PATCH] himbaechel/xilinx: do not set OUT_DIFF for TMDS_33 outputs TMDS_33 differential outputs use the Y0 current-mode driver alone (TMDS_33.OUT plus DRIVE.I_FIXED, with the Y1 pad set IN_ONLY). Vivado bitstreams for the same design do not set the tile OUT_DIFF feature for TMDS pairs, and setting it disables the driver stage entirely: on hardware the attached HDMI monitor reports no transmitter present. Emit OUT_DIFF only for non-TMDS differential outputs (e.g. LVDS_25), matching Vivado. Hardware-verified on xc7a100t (QMTech Wukong): 640x480 DVI output via an onboard HDMI connector, dead without this change, working with it. Co-Authored-By: Claude Fable 5 --- himbaechel/uarch/xilinx/fasm.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/himbaechel/uarch/xilinx/fasm.cc b/himbaechel/uarch/xilinx/fasm.cc index dc70320c..f63d4710 100644 --- a/himbaechel/uarch/xilinx/fasm.cc +++ b/himbaechel/uarch/xilinx/fasm.cc @@ -1004,7 +1004,11 @@ struct FasmBackend else inv = uarch->get_site_bel(pad_bel_site, ctx->id("IOB33S.O_ININV")); - if (inv != BelId() && ctx->getBoundBelCell(inv) != nullptr) + // TMDS_33 outputs are driven by the Y0 current-mode driver alone + // (TMDS_33.OUT + DRIVE.I_FIXED, Y1 IN_ONLY); Vivado does not set + // OUT_DIFF for them and setting it disables the driver stage + // (hardware-verified: monitor reports "no transmitter present"). + if (inv != BelId() && ctx->getBoundBelCell(inv) != nullptr && !is_tmds33) write_bit("OUT_DIFF"); if (is_stepdown && !is_sing)