From a6b89b0727c1d77c4d50d0850b8f21f35966f653 Mon Sep 17 00:00:00 2001 From: ShiboSoftwareDev Date: Tue, 4 Aug 2026 13:30:30 +0200 Subject: [PATCH] fix: duplicate congested ports per distinct net --- lib/DuplicateCongestedPortSolver.ts | 19 +++++++++++++------ .../duplicate-congested-port-solver.test.ts | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/lib/DuplicateCongestedPortSolver.ts b/lib/DuplicateCongestedPortSolver.ts index e9f0f08..72cb74b 100644 --- a/lib/DuplicateCongestedPortSolver.ts +++ b/lib/DuplicateCongestedPortSolver.ts @@ -326,7 +326,7 @@ export class DuplicateCongestedPortSolver extends BaseSolver { const { topology, problem } = loadSerializedHyperGraph( this.serializedHyperGraph, ) - const portUseCounts = new Map() + const portNetIds = new Map>() for (let routeId = 0; routeId < problem.routeCount; routeId++) { const routeProblem = createSingleRouteProblem(problem, routeId) @@ -347,14 +347,21 @@ export class DuplicateCongestedPortSolver extends BaseSolver { for (const portId of getUsedPortIdsForSolvedRoute(routeSolver)) { const serializedPortId = getSerializedPortId(topology, portId) - portUseCounts.set( - serializedPortId, - (portUseCounts.get(serializedPortId) ?? 0) + 1, - ) + let netIds = portNetIds.get(serializedPortId) + if (!netIds) { + netIds = new Set() + portNetIds.set(serializedPortId, netIds) + } + netIds.add(problem.routeNet[routeId]!) } } - return portUseCounts + return new Map( + [...portNetIds].map(([serializedPortId, netIds]) => [ + serializedPortId, + netIds.size, + ]), + ) } private duplicateCongestedPorts( diff --git a/tests/solver/duplicate-congested-port-solver.test.ts b/tests/solver/duplicate-congested-port-solver.test.ts index ec2c1e5..4b21465 100644 --- a/tests/solver/duplicate-congested-port-solver.test.ts +++ b/tests/solver/duplicate-congested-port-solver.test.ts @@ -198,3 +198,19 @@ test("duplicate congested port solver duplicates independently reused ports in l .every((region) => region.pointIds.includes("shared-choke::dup1")), ).toBe(true) }) + +test("duplicate congested port solver shares a port between routes on the same net", () => { + const fixture = createDuplicatePortFixture() + fixture.connections![1]!.mutuallyConnectedNetworkId = "net-a" + const solver = new DuplicateCongestedPortSolver(fixture) + + solver.solve() + + expect(solver.solved).toBe(true) + expect(solver.failed).toBe(false) + expect(solver.report.portUseCounts["shared-choke"]).toBe(1) + expect(solver.report.duplicatedPorts).not.toContainEqual( + expect.objectContaining({ sourcePortId: "shared-choke" }), + ) + expect(solver.getOutput().ports).toHaveLength(fixture.ports.length) +})