YoWASP / nextpnr

Unofficial nextpnr WebAssembly packages
https://yowasp.org
ISC License
15 stars 3 forks source link

All errors become WASM traps #2

Open DavidPowell opened 4 years ago

DavidPowell commented 4 years ago

Thanks for all the hard work making this package available.

I installed only one package with the command pip install yowasp-nextpnr-ice40-8k, on Windows 10 x64, Anaconda Python 3.7 (same result for 3.8). It installs yowasp_nextpnr_ice40_8k-0.0.post2625.dev9-py3-none-any.whl

I then run yowasp-nextpnr-ice40. It prints out the full list of command line options, then prints out the following error message:

  File "<my home>\miniconda3\lib\runpy.py", line 193, in _run_module_as_main                                                                 
    "__main__", mod_spec)                                                                                                                          
  File "<my home>\miniconda3\lib\runpy.py", line 85, in _run_code                                                                            
    exec(code, run_globals)                                                                                                                        
  File "<my home>\Miniconda3\Scripts\yowasp-nextpnr-ice40.exe\__main__.py", line 7, in <module>                                              
  File "<my home>\miniconda3\lib\site-packages\yowasp_nextpnr_ice40\bin\__init__.py", line 61, in run_nextpnr_ice40                          
    sys.exit(_run_wasm_app("nextpnr-ice40.wasm", argv))                                                                                            
  File "<my home>\miniconda3\lib\site-packages\yowasp_nextpnr_ice40\bin\__init__.py", line 34, in _run_wasm_app                              
    app.exports["_start"]()                                                                                                                        
  File "<my home>\miniconda3\lib\site-packages\wasmtime\_func.py", line 115, in __call__                                                     
    raise Trap.__from_ptr__(trap)                                                                                                                  
wasmtime._trap.Trap: wasm trap: unreachable                                                                                                        
wasm backtrace:                                                                                                                                    
  0: 0x168303 - <unknown>!<wasm function 2901>                                                                                                     
  1: 0x161621 - <unknown>!<wasm function 2823>                                                                                                     
  2: 0x16164e - <unknown>!<wasm function 2824>                                                                                                     
  3: 0x15192 - <unknown>!<wasm function 243>                                                                                                       
  4: 0x14cb5 - <unknown>!<wasm function 234>                                                                                                       
  5: 0xa2b9e - <unknown>!<wasm function 945>                                                                                                       
  6: 0xd4aa6 - <unknown>!<wasm function 1051>                                                                                                      
  7: 0xbd4a - <unknown>!<wasm function 62>                                                                                                         
  8: 0xd5ce1 - <unknown>!<wasm function 1054>                                                                                                      
  9: 0x16871d - <unknown>!<wasm function 2908>                                                                                                     
  10: 0x1687a5 - <unknown>!<wasm function 2910>                                                                                                    
  11: 0x168308 - <unknown>!<wasm function 2902>                                                                                                    
  12: 0x1768 - <unknown>!<wasm function 21>

where <my home> represents my windows home folder.

If I run pip install yowasp-nextpnr-ice40-all, then the error no longer occurs.

whitequark commented 4 years ago

What's the yowasp-nextpnr-ice40 command line you use?

whitequark commented 4 years ago

Ah, sorry, I didn't your comment carefully. That's expected behavior at the moment. Until WASM has support for C++ exceptions, all errors will end up in WASM traps.

DavidPowell commented 4 years ago

The original error is easily worked around, however it seems that yosys/nextpnr often generate C++ exceptions. For example, I ran nmigen's 01_blinky.py example (which required changing "led" to "user_led") and it failed when writing the blif file. Is this expected behaviour?

whitequark commented 4 years ago

Yep. Until WASM gets first-class exceptions I'm afraid that's what's going to happen. I tried to get it a bit better where possible, but the amount of hacks I'm willing to add (and the upstream is willing to accept) is limited...

DavidPowell commented 4 years ago

A note for anyone else finding that WASM traps are constantly generated.

In my previous comment, it seemed that C++ exceptions were generated very frequently, and I found that yowasp-nextpnr was unusable from nmigen. This was due to installing nmigen from pip (right now the pip version is ~5 months old).

Once I updated to the git version of nmigen, and now that YoWASP/yosys#1 is fixed, nmigen's blinky example now runs and uploads fine, rather than crashing during the writing of the blif file.

whitequark commented 4 years ago

Ah, interesting! I indeed have not tested with nmigen 0.2. Nmigen 0.3 is going to be released soon, so that should not be a problem anymore after that.

whitequark commented 3 years ago

This will be fixed when https://github.com/WebAssembly/wasi-sdk/pull/198 is merged and exception handling support lands in wasmtime.