icestorm/icepack
The6P4C 578037dedf icepack: Fix Windows-only stack overflow in CRAM pbm generation (fixes #241)
On Windows, attempting to generate a netpbm image of the CRAM with
`icepack -b` causes the tool to crash after writing only the netpbm
header due to a stack overflow. The bug did not appear on Linux.

This was traced to a large stack-allocated variable length array
(`tile_type`) inside `FpgaConfig::write_cram_pbm`. For an 8k ice40 with
4 banks, `cram_width = 872` and `cram_height = 272` the `tile_type`
array ends up at `4 * 872 * 272 * sizeof(uint32_t) =` 3794944 bytes, or
about 3.6 MiB.

The fix replaces the large stack VLA with an array of 4 (bank) 2D C++
vectors, moving the large amount of data to the heap. Even though the
fix is not in a Windows-specific code path (and hence applies to all
platforms), I think it's wise to eliminate such a large stack allocation
entirely.

The fix has been tested working on both Windows and an Ubuntu WSL
install.
2019-12-08 23:52:05 +10:00
..
.gitignore Added/improved support for mxe-based win32 cross builds 2016-02-14 13:47:27 +01:00
Makefile Fix up build system to work with emscripten 2017-11-15 03:13:35 -08:00
icepack.cc icepack: Fix Windows-only stack overflow in CRAM pbm generation (fixes #241) 2019-12-08 23:52:05 +10:00