From 4ab735c690ad781aface11ddac0f4b4c712cfc77 Mon Sep 17 00:00:00 2001 From: YRabbit Date: Wed, 17 Sep 2025 15:50:41 +1000 Subject: [PATCH] Gowin. Optimize ALU. (#1556) By replacing the operation of adding the input to itself with a specially formed LUT, we free up two PIPs. Signed-off-by: YRabbit --- himbaechel/uarch/gowin/pack.cc | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/himbaechel/uarch/gowin/pack.cc b/himbaechel/uarch/gowin/pack.cc index 0d4cc98c..d2e3c96d 100644 --- a/himbaechel/uarch/gowin/pack.cc +++ b/himbaechel/uarch/gowin/pack.cc @@ -1894,15 +1894,11 @@ struct GowinPacker return cin_ci; } // CIN from logic - cin_ci->addInput(id_I0); - cin_ci->connectPort(id_I0, ctx->nets.at(ctx->id("$PACKER_GND")).get()); - cin_ci->addInput(id_I1); - cin_ci->addInput(id_I3); - cin_ci->connectPort(id_I1, cin_net); - cin_ci->connectPort(id_I3, cin_net); cin_ci->addInput(id_I2); cin_ci->connectPort(id_I2, ctx->nets.at(ctx->id("$PACKER_VCC")).get()); - cin_ci->setParam(id_ALU_MODE, std::string("0")); // ADD + cin_ci->addInput(id_I0); + cin_ci->connectPort(id_I0, cin_net); + cin_ci->setParam(id_RAW_ALU_LUT, 0x505a); // 0101_0000_0101_1010 -> ignore I1 and I3, out carry = I0 cin_ci->setParam(id_CIN_NETTYPE, Property("LOGIC")); return cin_ci; }