Commit Graph

4854 Commits

Author SHA1 Message Date
Miodrag Milanović 764b5402e8
gatemate: Initial SERDES support (#1476)
* Initial SERDES support

* use static array for default values

* Split pack into multiple files

* Pre-place BUFG and related cells
2025-05-06 15:56:26 +02:00
Dave Anderson 182b77a2e8
ecp5: fix frequency constraint on bypassed PLL outputs (#1475)
Each PLL output in ECP5 can be bypassed, which turns it into a wire
that passes through ICLK unmodified. When an outputs mux is set to
REFCLK, disregard other PLL configuration and copy the input constraint
over unchanged.
2025-05-06 15:55:38 +02:00
Benjamins Stürz 18c7b4070a Only add subdirectory tests, if BUILD_TESTS=ON 2025-05-03 04:56:32 +01:00
Miodrag Milanovic 900249033f gatemate: fix ccf default values and handling 2025-04-24 11:08:04 +02:00
Miodrag Milanović bc25b042e9
gatemate: implemented remaining PLL features (#1474)
* gatemate: implemented remaining PLL features

* gatemate: allow longer carry chains
2025-04-24 09:51:00 +02:00
Miodrag Milanovic c84f20934f gatemate: make build work as for other uarch 2025-04-22 19:28:58 +02:00
Miodrag Milanović d6483adb4d
Gatemate FPGA initial support (#1473)
* Initial code for GateMate

* Initial work on forming bitstream

* Add CCF parsing

* Use CCF to set IO location

* Propagate errors

* Restructure code

* Add support for reading from config

* Start adding infrastructure for reading bitstream

* Fix script

* GPIO initial work

* Add IN1->RAM_O2 propagation

* Fixed typo

* Cleanup

* More parameter checks

* Add LVDS support

* Cleanup

* Keep just used connections for now

* Naive lut tree CPE pack

* Naive pack CC_DFF

* pack DFF fixes

* Handle MUX flags

* Fix DFF pack

* Prevent pass trough issues

* Cleanup

* Use device wrapper class

* Update due to API changes

* Use pin  connection aliases

* Start work on BUFG support

* Fix CC_L2T5 pack

* Add CPE input inverters

* Constrain routes to have correct inversion state

* Add clock inversion pip

* Added MX2 and MX4 support

* Fix script

* BUFG support

* debug print if route found with wrong polarity

* Some CC_DFF improvements

* Create reproducible chip database

* Simplify inversion of special signals

* Few more DFF features

* Add forgotten virtual port renames

* Handle muxes with constant inputs

* Allow inversion for muxes

* cleanup

* DFF input can be constant

* init DFF only when needed

* cleanup

* Add basic PLL support

* Add some timings

* Add USR_RSTN support

* Display few more primitives

* Use pass trough signals to validate architecture data

* Use extra tile information from chip database

* Updates needed for a build system changes

* Implement SB_DRIVE support

* Properly named configuration bits

* autogenerated constids.inc

* small fix

* Initial code for CPE halfs

* Some cleanup

* make sure FFs are compatible

* reverted due to db change

* Merge DFF where applicable

* memory allocation issue

* fix

* better MX2

* ram_i handling

* Cleanup MX4

* Support latches

* compare L_D flag as well

* Move virtual pips

* Naive addf pack

* carry chains grouping

* Keep chip database reproducible

* split addf vectors

* Block CPEs when GPIO is used

* Prepare placement code

* RAM_I/RAM_O rewrite

* fix ram_i/o index

* Display RAM and add new primitives

* PLL wip code

* CC_PLL_ADV packing

* PLL handling cleanup

* Add PLL comments

* Keep only high fan-out BUFG

* Add skeleton for tests

* Utilize move_ram_o

* GPIO wip

* GPIO wip

* PLL fixes

* cleanup

* FF_OBF support

* Handle FF_IBF

* Make SLEW FAST if not defined as in latest p_r

* Make sure FF_OBF only driving GPIO

* Moved pll calc into separate file

* IDDR handling and started ODDR

* Route DDR input for CC_ODDR

* Notify error in case ODDR or IDDR are used but not with I/O pin

* cleanup for CC_USR_RSTN

* Extract proper RAM location  for bitstream

* Code cleanup

* Allow auto place of pads

* Use clock source flag

* Configure GPIO clock signals

* Handle conflicting clk

* Use BUGF in proper order

* Connected CLK, works without but good for debugging

* CC_CFG_CTRL placement

* Group RAM data 40 bytes per row

* Write BRAM content

* RAM wip

* Use relative constraints from chipdb

* fix broken build

* Memory wip

* Handle custom clock for memories

* Support FIFO

* optimize move_ram_io

* Fix SR signal handling acorrding to findings

* set placer beta

* Pre place what we can

* Revert "debug print if route found with wrong polarity"

This reverts commit cf9ded2f18.

* Revert "Constrain routes to have correct inversion state"

This reverts commit 795c284d48.

* Remove virtual pips

* Implement post processing inversion

* ADDF add ability to route additional CO

* Merge two ADDFs in one CPE

* Added TODO

* clangformat

* Cleanup

* Add serdes handling in config file

* Cleanup

* Cleanup

* Cleanup

* Fix in PLL handling

* Fixed ADDF edge case

* No need for this

* Fix latch

* Sanity checks

* Support CC_BRAM_20K merge

* Start creating testing environment

* LVDS fixes

* Add connection helper

* Cleanup

* Fix tabs

* Formatting fix

* Remove optimization tests for now

* remove read_bitstream

* removed .c_str()

* Removed config parsing

* using snake_case

* Use bool_or_default where applicable

* refactored bitstream write code

* Add allow-unconstrained option

* Update DFF related messages

* Add clock constraint propagation

---------

Co-authored-by: Lofty <dan.ravensloft@gmail.com>
2025-04-22 16:41:01 +02:00
Miodrag Milanović 7a3a43e150
placer1: add sanity check for try_swap_chain (#1472) 2025-04-13 19:11:11 +02:00
YRabbit a5cff55520
Gowin. BUGFIX Use a separate net for segment gates (#1470)
* Gowin. BUGFIX Use a separate net for segment gates

We use a temporary separate small network (typically 2 - 3 sinks) for
routing from the segment network source to the segment gate. This fixes
the rare but unpleasant case of self-intersection when a route to a gate
is routed using PIPs after the gate, this is no longer allowed when
using a separate small network.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>

* Gowin. Fix style.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>

---------

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2025-03-31 11:36:48 +02:00
YRabbit 0c01cb9e41
Gowin. Fix non-DCS networks. (#1467)
Prohibits the use of Dynamic Clock Selection PIPs for networks where no
DCS is present.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2025-03-20 09:07:37 +01:00
Lofty 06992bda0a
rust: add getBels() binding (#1460) 2025-03-19 10:02:34 +01:00
YRabbit c84879e4d5
Gowin. Implement the DLLDLY primitive. (#1464)
DLLDLY is the clock delay primitive that adjust the input clock
according to the DLLSTEP signal and outputs the delayed clock.

These primitives are associated with clock pins and are "tapped" between
the output of this IBUF and the clock networks, leaving the possibility
to connect to the original unshifted signal as well, although the latter
is not very practical because it is no longer possible to use fast
wires.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2025-03-19 08:41:35 +01:00
YRabbit 864c1e471d
Gowin. Add a router for segments. (#1456)
Gowin chips have an interesting mechanism - wires that run vertically
through several rows (at least 10) in each column of the chip. In each
row a particular wire has branches to the left and right, covering on
average 4 neighboring cells in the row. For lack of a better term, I
further call such a wire a segment.

So a segment can provide a direct connection in a local rectangle. There
are no special restrictions on the sinks, so segment networks can be
used for ClockEnable, LocalSetReset, as well as for LUT and DFF inputs.

The sources are not so simple - the sources can be the upper or lower
end of the segment, which in theory can lead to unfortunate consequences
if the signal is applied from both ends.

The matter is complicated by the fact that there are default
connections, i.e. in the absence of any set fuse the segment input is
still connected to something (VCC for example) and to disable the unused
end of the segment you need to set a special combination of fuses.

Taking into account which end of which segment is used is one of the
tasks of this router. In addition, segment ends can physically coincide
with PLL, DSP and BSRAM inputs, which can also lead to unexpected
effects. Some of these things are tracked when generating the base, some
in this router, some when packing in gowin_pack.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2025-03-18 12:02:49 +01:00
YRabbit d8988e1682
Gowin. Add HCLK wires to PLL. (#1462)
Adds the ability to use high-speed clock lines (together with CLKDIV2
type frequency dividers operating on them) as sieve signals for the
CLKIN and CLKFB inputs of the rPLL and PLLVR primitives (these cover the
full range of supported Gowin chips).

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2025-03-12 09:32:38 +01:00
Lofty 0492c55efd
ci: test that BUILD_RUST=ON builds (#1459) 2025-03-03 14:44:33 +01:00
Lofty 661f76d51a
Add arch API function for pip inversion (#1457) 2025-02-27 12:21:15 +01:00
gatecat 0c458f14f2 generic: Enable viaduct example test in CI
Signed-off-by: gatecat <gatecat@ds0.me>
2025-02-25 15:28:46 +00:00
gatecat e751eaca47 generic: Fix archcheck crash
Signed-off-by: gatecat <gatecat@ds0.me>
2025-02-25 15:28:46 +00:00
YRabbit f3a5024de2
Gowin: Remove nextpnr-gowin (#1318)
Boards with Gowin chips are supported in the Himbaechel architecture
with much greater correctness and a wider range of primitives.

In fact, at the moment the advice “use himbaechel-gowin” immediately
solves a
significant part of the issues opened by users.

Of course, you need to wait for amendments to oss-cad-suite, at least
https://github.com/YosysHQ/oss-cad-suite-build/pull/109

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2025-02-14 00:08:12 +00:00
Miodrag Milanović 1ed03ae9be
gowin: Add deprecation message for nextpnr-gowin (#1455) 2025-02-13 20:31:53 +01:00
Miodrag Milanovic 6caa6e4e85 CMake: add_custom_target does not require EXCLUDE_FROM_ALL 2025-02-11 17:23:12 +00:00
Gabriel Somlo e4115e85f7 Prevent chipdb array type narrowing conversion issues
When -Wnarrowing is enabled, compilation of generated
chipdb*.bin.cc files produces a large number of messages:

  "narrowing conversion of ... from ‘int’ to ‘const char’ [-Wnarrowing]"

Explicitly using uint8_t instead of char when referencing
embedded chipdb arrays resolves these issues.

Suggested-by: Catherine <whitequark@whitequark.org>
Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>
2025-02-01 05:28:29 +00:00
Catherine 77187613e3
kernel: look up ports when applying clock constraints. (#1448)
prjunnamed does not emit a net alias for toplevel ports. This works
fine for constraining IOs but breaks clock constraints. This commit
expands clock constraint application code to look up net aliases first,
ports second.
2025-01-31 08:30:39 +00:00
Catherine b64bf018ea
frontend: don't connect a const net to ports connected to `x`. (#1447)
prjunnamed normalizes ports that are not present in the primitive
to be all-x. On iCE40, this can cause a false placement conflict
between `SB_IO` cells where one's clock input is `x` and another's is
some other net.
2025-01-31 08:29:58 +00:00
YRabbit 81ccada239
Gowin. Add I3C io buffer. (#1445)
* Gowin. Add I3C io buffer.

A buffer is added that can operate as a normal IOBUF in PUSH-PULL mode
or switch to open-drain IOBUF mode.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>

* Gowin. Turn a variable into a set of flags

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>

---------

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2025-01-29 14:02:21 +01:00
YRabbit a76c5b5a0f Gowin. Typo fix.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2025-01-29 08:47:41 +01:00
YRabbit b95a3ca567 Gowin. Implement MIPI IO.
Adds output (MIPI_OBUF and MIPI_OBUF_A) and input (MIPI_IBUF) primitives
to allow the use of “real” MIPI (not emulation) ports capable of
operating in both HS and LP modes.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2025-01-29 08:47:41 +01:00
Catherine cf9c74575b CMake: exclude *-bba and *-chipdb targets from `make all`.
Due to the way CMake-generated Makefiles evaluate dependencies, this
calls the `.bba` generation custom command twice, which then fails as
they both use the same `.bba.new` file as an output and one of them
moves it first.

This broke builds using `make -j` but not builds using
`make -j nextpnr-himbaechel-example`.
2025-01-29 06:58:27 +01:00
Catherine 922c3a1b7f
Update README to mention checking out submodules. 2025-01-28 03:07:57 +00:00
Miodrag Milanovic 8c968092a7 Update README to represent most recent changes in build system 2025-01-28 02:51:47 +00:00
gatecat ede78f3730 ecp5: Fix constant and inverted CEMUX
Signed-off-by: gatecat <gatecat@ds0.me>
2025-01-27 11:46:25 +01:00
Gabriel Somlo 0c060512c1 Fix undefined type error in 3rdparty/json11/json11.cpp
Under certain conditions (e.g., building on Fedora 42
using gcc-15.0.1), compilation fails with the following
error:

    "error: ‘uint8_t’ does not name a type"

Explicitly include <cstdint> to prevent that situation.

Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>
2025-01-23 14:42:14 +01:00
Miodrag Milanovic d673d04ff3 CMake: fix windows BBA resource embedding 2025-01-23 11:15:34 +00:00
Miodrag Milanović e12093201a
CMake: Add include guards when IMPORT_BBA_FILES is used (#1438) 2025-01-23 10:54:37 +01:00
Catherine 1623243d50 CMake: disallow in-tree builds.
In-tree builds pollute the source directory and make version control
more difficult to use effectively.
2025-01-23 07:57:41 +00:00
Catherine 90d746f79e CMake: add support for exporting and importing .bba files.
This is useful for certain cross-compilation workloads, and to cache
rarely changing build products.

To use this functionality, build e.g. as follows:

    cmake . -B build-export -DEXPORT_BBA_FILES=../bba-files -DARCH=all
    cmake --build build-export -t nextpnr-all-bba

    cmake . -B build-import -DIMPORT_BBA_FILES=../bba-files -DARCH=all
    cmake --build build-import
2025-01-23 07:49:12 +00:00
Catherine fac934bd2d 3rdparty: upgrade pybind11 to v2.12.1. 2025-01-22 21:48:55 +00:00
Catherine 6855b558ac CMake: use imported target for pybind11 (in the GUI).
See commit 43b2f385.
2025-01-22 21:48:40 +00:00
Catherine 17943a51cb CMake: remove `-DSERIALIZE_CHIPDBS=` option.
The impetus for this commit is the fact that it causes rare but
build-breaking race conditions when used with `make -jN` with `N > 1`.
These race conditions are difficult to track down or fix because of
the very rudmentary debugging tools provided by `make` and opaque
semantics of CMake's Makefile generator. They break the build by
running two `.bba` generation processes, then one of them renaming
the `.bba.new` file once it's done, leaving the other one to fail.

After reflection (as the author of this code path) and discussion with
community members who use it, I've concluded that this isn't the right
approach.
1. In practice, on targets where `-DSERIALIZE_CHIPDBS=` matters, you
   also care about other build steps, like linking nextpnr, which
   are not serializable this way. So you use a workaround anyway, like
   `make`ing individual targets instead.
2. The way to serialize the build with Make is the `-j1` option. Trying
   to work around `-jN` to make it work like `-j1` is inherently error
   prone. While there is some utility in not serializing C++ compilation
   this utility could be more easily achieved by providing a single
   target that builds all chipdbs, running `make <chipdb-target> -j1`,
   then running `make -jN` for the rest of the build.
2025-01-21 17:13:03 +00:00
Catherine dbba1328bf Allow splitting nextpnr-himbaechel per microarchitecture.
This is added primarily for YoWASP.
2025-01-21 17:13:03 +00:00
Catherine cd7f7c12f1 CMake: refactor architecture-specific build system parts.
Two user-visible changes were made:
* `-DUSE_RUST` is replaced with `-DBUILD_RUST`, by analogy with
  `-DBUILD_PYTHON`
* `-DCOVERAGE` was removed as it doesn't work with either modern GCC
  or Clang
2025-01-21 17:13:03 +00:00
Catherine bb2336ad73 Fix `#embed` support in bbasm and use it when available.
This removes the atomic rename for bbasm outputs because it embeds
the resulting paths into the `.cc` files in embed mode. In any case
the write should be fast enough to not be a big risk for interrupted
builds.

This was tested with Clang 19 only (gcc hasn't had a release that
supports `#embed` yet).
2025-01-21 17:13:03 +00:00
Catherine dcfb7d8c33 CMake: align Himbaechel targets with non-Himbaechel ones.
Primarily, this commit makes both of them use the `BBAsm` functions
to build and compile `.bba` files.

In addition, Himbaechel targets are now aligned with the rest in
how they are configured: instead of having all uarches enabled with
all of the devices disabled (the opposite of the rest of nextpnr),
uarches must be enabled explicitly but they come with all devices
enabled (except for Xilinx, which does not have a list of devices).
2025-01-21 17:13:03 +00:00
Catherine f5776a6d64 CMake: eliminate `family.cmake`/`CMakeLists.txt` split.
While it served a purpose (granting the ability to build `.bba` files
separately from the rest of nextpnr), it made things excessively
convoluted, especially around paths.

This commit removes the ability to pre-generate chip databases. As far
as I know, I was the primary user of that feature. It can be added back
if there is demand for it.

In exchange the per-family `CMakeLists.txt` files are now much easier
to understand.
2025-01-21 17:13:03 +00:00
Catherine a951faa16d CMake: extract bbasm compilation into a function.
This fully preserves existing functionality, although the `embed` mode
is untested and seems broken.
2025-01-21 17:13:03 +00:00
Catherine 43b2f38520 CMake: use imported target for pybind11.
This accounts for the use of either the system or the vendored pybind11.

Fixes #1428.
2025-01-21 15:05:57 +00:00
Miodrag Milanović 284fb3e874
Updating CI to work with ubuntu-latest (#1426)
* Fix build using ubuntu-latest

* Update to latest icestorm
2025-01-20 14:58:51 +00:00
Catherine 155adc3f5d CMake: rationalize and refactor build system.
The two main changes, done together in this commit, are:
* Eliminating most instances of `aux_source_directory()`, replacing
  them with explicit file listings; and
* Moving these file listings into respective subdirectories by
  representing respective nextpnr components as interface libraries.

In addition, the GUI CMake script tree was simplified since it had
a lot of unused/redundant code.

The `aux_source_directory()` command is not recommended for use by
CMake itself because it misses dependency changes when adding/removing
files, and consequently causes build failures requiring a clean rebuild.

This commit does not touch anything related to architectures/families,
which are very complex and redundant all on their own.
2025-01-16 11:36:44 +01:00
Catherine d214308f5f CMake: reformat for consistency.
Normalize keywords to:

    if (...)
    elseif (...)
    else()
    endif()

    foreach (...)
    endforeach()

    other(...)

Normalize whitespace to 4 spaces.
2025-01-16 11:36:44 +01:00
Catherine c48157aa4b googletest: fix -Werror=maybe-uninitialized failure. 2025-01-16 11:36:44 +01:00