json: remove the 32-bit parameter special case
authorMarcin Kościelnicki <mwk@0x04.net>
Sat, 1 Feb 2020 09:21:19 +0000 (10:21 +0100)
committerMarcelina Kościelnicka <mwk@0x04.net>
Sat, 1 Feb 2020 15:16:26 +0000 (16:16 +0100)
commit00fba627118fb536686b3d30f3b81f71b513cd51
treea973c48450b6000a07bd9fde9c2dcf3e5c4e33e7
parenta1c840ca5d6e8b580e21ae48550570aa9665741a
json: remove the 32-bit parameter special case

Before, the rules for encoding parameters in JSON were as follows:

- if the parameter is not a string:

  - if it is exactly 32 bits long and there are no z or x bits, emit it
    as an int
  - otherwise, emit it as a string made of 0/1/x/z characters

- if the parameter is a string:

  - if it contains only 0/1/x/z characters, append a space at the end
    to distinguish it from a non-string
  - otherwise, emit it directly

However, this caused a problem in the json11 parser used in nextpnr:
yosys emits unsigned ints, and nextpnr parses them as signed, using
the value of INT_MIN for values that overflow the signed int range.
This caused destruction of LUT5 initialization values.  Since both
nextpnr and yosys parser can also accept 32-bit parameters in the
same encoding as other widths, let's just remove that special case.
The old behavior is still left behind a `-compat-int` flag, in case
someone relies on it.
backends/json/json.cc