3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-11-28 00:09:50 +00:00

memory_libmap: Add beam search for many-port memories

The existing read port assignment algorithm uses Cartesian product
expansion, which has O(options^N) complexity. For memories with many
read ports (e.g., 64 parallel reads), this causes exponential memory
usage (60GB+) and timeouts.

This commit adds a beam search algorithm that activates for >8 read
ports. It maintains only the top K (default 16) configurations at
each step, reducing complexity to O(N * options * K).

Tested with:
- 64 read ports: completes in ~1s vs OOM
- 32 read ports: completes in ~1s vs timeout
- Maintains existing behavior for ≤8 ports

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Craig Hasselbring 2025-11-19 18:31:38 -08:00
parent e83d721cb0
commit 00b3c83282
3 changed files with 189 additions and 2 deletions

View file

@ -0,0 +1,27 @@
// Test case for beam search optimization in memory_libmap
// This memory with 32 parallel read ports would cause exponential
// blowup (O(4^32) = 10^19 configurations) without beam search pruning
module memlib_beam_search (
input wire clk,
input wire we,
input wire [9:0] wr_addr,
input wire [7:0] wr_data,
input wire [9:0] base_addr,
output reg [255:0] parallel_out // 32 x 8 = 256 bits
);
reg [7:0] mem [0:1023];
integer i;
always @(posedge clk) begin
if (we)
mem[wr_addr] <= wr_data;
// 32 parallel reads - triggers beam search
for (i = 0; i < 32; i = i + 1) begin
parallel_out[i*8 +: 8] <= mem[base_addr + i];
end
end
endmodule