Compare commits

..

2995 Commits

Author SHA1 Message Date
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
Catherine
574f504787 Find all components of Python at the same time.
This is explicitly recommended by the FindPython module documentation
and is required to avoid failed builds on some systems. See:
https://cmake.org/cmake/help/latest/module/FindPython.html
2025-01-13 03:29:43 +00:00
Catherine
ab7a372491
himbaechel: allow subsetting uarches. (#1416)
E.g. selecting only Gowin instead of the default shrinks the resulting
binary by ~30%.
2025-01-12 08:13:08 +01:00
YRabbit
92694d7db7
Gowin. BUGFIX. Do not create missing wires. (#1418)
Erroneously created wires for specific IOs on the underside of some
chips.

Fixes https://github.com/YosysHQ/nextpnr/issues/1417

Also cosmetic edits.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2025-01-12 08:12:06 +01:00
Catherine
5fe680390f
Various fixes for clang/libc++ build (#1415)
* Gowin: add header includes required on libstdc++.

* kernel: fix incorrect printf-style format.

* himbaechel: add missing `override` qualifiers.

* Gowin: remove unnecessary `std::move`.

These calls inhibit RVO, a stronger optimization than moving an object.
2025-01-12 08:11:33 +01:00
myrtle
55bd760808
ice40: Don't constrain multiple potentially-incompatible FFs to same tile (#1413)
Signed-off-by: gatecat <gatecat@ds0.me>
2025-01-02 11:08:42 +01:00
YRabbit
c565e364bc
Gowin. Add the ability to place registers in IOB (#1403)
* Gowin. Add the ability to place registers in IOB

IO blocks have registers: for input, for output and for OutputEnable
signal - IREG, OREG and TREG respectively.

Each of the registers has one implicit non-switched wire, which one
depends on the type of register (IREG has a Q wire, OREG has a D wire).
Although the registers can be activated independently of each other they
share the CLK, ClockEnable and LocalSetReset wires and this places
restrictions on the possible combinations of register types in a single
IO.

Register placement in IO blocks is enabled by specifying the command
line keys --vopt ireg_in_iob, --vopt oreg_in_iob, or --vopt ioreg_in_iob.

It should be noted that specifying these keys leads to attempts to place
registers in IO blocks, but no errors are generated in case of failure.

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

* Gowin. Registers in IO

Check for unconnected ports.

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

* Gowin. IO regs. Verbose warnings.

If an attempt to place an FF in an IO block fails, issue a warning
detailing the reason for the failure, whether it is a register type
conflict, a network requirement violation, or a control signal conflict.

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

* Gowin. BUGFIX. Fix FFs compatibility.

Flipflops with a fixed ClockEnable input cannot coexist with flipflops
with a variable one.

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

* Gowin. FFs in IO.  Changing diagnostic messages.

Placement modes are still specified by the command line keys
ireg_in_iob/oreg_in_iob/ioreg_in_iob, but also introduces more granular
control in the form of attributes at I/O ports:

  (* NOIOBFF *) - registers are never placed in this IO,

  (* IOBFF *) - registers must be placed in this IO, in case of failure
  a warning (not an error) with the reason for nonplacement is issued,

  _attribute_absence_ - no diagnostics will be issued: managed to place - good, failed - not bad either.

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

* Gowin. Registers in IO.

Change the logic for handling command line keys and attributes -
attributes allow routines to be placed in IO regardless of global mode.

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

* Gowin. Registers in IO. Fix style.

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

---------

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2025-01-01 13:11:57 +01:00
Aritz Erkiaga
0345b6e803
Fix gowin ALU SUB mode ports (#1407) 2025-01-01 13:05:54 +01:00
YRabbit
3d350c21c5
Gowin. BUGFIX. Global clock routing. (#1410)
Adds additional restrictions on the first PIP after the clock source -
only connections to SPINEs are allowed. This allowed to correct the
behaviour of DQCEs since the latter can only disable/enable SPINEs.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-12-31 10:31:03 +01:00
Tarik Graba
f01465f628
Add attributes to the hierarchical cells (#1405)
* Adds attributes to the hierarchical cells

* python: add binding for hierarchical cells attributes

* frontend/base: import hierarchical cells attributes
2024-12-17 11:30:39 +01:00
Miodrag Milanović
d810aac867
Add GroupId related calls to Himbaechel API (#1399)
* Add GroupId related calls to Himbaechel API

* Example uarch using new API features

* Update drawGroup to propagate only GroupId
2024-12-05 13:59:33 +01:00
Miodrag Milanović
5a807110de
Adding NanoXplore NG-Ultra support (#1397)
* ng-ultra: new architecture

* Implementation as in D2 deliverable

* Support for nxdesignsuite-24.0.0.0-20240429T102300

* Save memory by directly outputing json

* Add support for bidirectional IOs

* cleanup

* Create BFRs properly

* Add IOM insertion

* Cleanup

* Block certain pips depending of DDFR mode

* Add LUT bypass to improve routability

* Add bypass for CSC mode of GCK

* Fix IOM case

* Initial memory support

* Better RF/XRF handling

* fix

* RF placement and legalization

* Disconnect non available ports for NX_RAM

* cleanup

* Add RFB/RAM context support for latest release

* Remove ports that must not be used

* Proper port used only on RFB

* Add structure for clock sinks

* Use cell type where applicable

* Add clock sinks for other cell types

* Validation check fixes

* Commented too restrictive placement

* Added more crossbar wire type

* Hande IO termination input

* Fail early due to NX tools limitation for now

* Validations and fixes for RAM I/Os

* Fix for latest version of tools

* Use ctx->idf where applicable

* warn if RAM ports are not actually used

* Fix IOM packing

* Fix CY packing

* Change how constants are handled on CY

* Post placement optimization for CY

* Address comments for PR

* pack and export  GCK, WFG and PLL

* Cover more global routing cases

* Constraing to location if provided

* Place at LOC

* Pack and export DSP

* wip

* wip

* notes

* wip

* wip

* Validate DSPs

* DSP cascading

* Check mandatory parameters for DSP

* existing gck

* wip

* export all the rest for bitstream

* CDC packing

* add more sinks

* place FIFO

* map rest of FIFO ports

* enable pll by default

* cleanup

* Initial XLUT support

* Fix statistics

* Properly duplicate GCKs

* RRSTO and WRSTO are not used on XFIFO

* Fix for latest version of JSON format

* Implement GCK limitations

* cleanup

* cleanup

* Add more signals and use lowskew name

* cleanup code a bit

* Fix wfb

* detect cascaded GCKs

* Handle DFR

* Route dfr clock properly

* Cleanup

* Cleanup bitstream code

* Review issues addressed

* Move helper routines

* Expose private members for unit tests

* cleanup

* remove scale factor

* make all location helper arrays static

* Addressed review comments

* Support post-routing CSC and SCC

* Support NX_BFF

* Place CSS and SCC only on allowed locations

* Support latest Impulse

* ng_ultra: Expand bounding box further for left-edge IO

Signed-off-by: gatecat <gatecat@ds0.me>

* Export all IO parameters in bitstream

* Handle new CSV order or parameters and additional validation

* Add some more undocumented values for CSV

* Support for old and new CSV formats

* Initial DDFR support

* Display warning message once per file

* Address review issues

* Fix crash on memory access

* Make boundbox fit NG-Ultra internal design

* Update attributes after dff rewrite

* Implement basic NG-Ultra LUT-DFF unit tests

* Always use first seen xbar input

Signed-off-by: gatecat <gatecat@ds0.me>

* Simplified crossbar pip detection

* Change order to prevent issues with some unconnected constants

* Pack LUT and multiple DFF in stripe

* Place DFF chains

* Improve large DFF chains

* Rename to pack_dff_chains

* Better use XLUTs when possible

* pack output DFF together with XLUT

* option to disable XLUT optimiziations

* Make more optimizations optional

* fix to use pre-increment

* GCK for lowskew signals

* Bugfix for nets that are not part of lowskew network

* Fix bitstream export for PLL cell

* Remove separate route lowskew

* Allow WFG mode 2

* Merge inverter into GCK

* Add CSC per TILE when needed

* Improve reusage of existing cell for CSC

* Take preferred CSC

* Cleanup

* When in place CSC size not important

* Cleanup

* Reset and Load restriction

* make csc optimisation optional

* Proper count for IO resources

* Detect when there is no next cell for DSP chain

* Do not incorporate loops in XLUT

* Check if output exists

* Update copyright for delivery

* Make building NG-Ultra chip database optional, follow filename convention

* Ported drawing code to new API

* Update expandBoundingBox for NG-Ultra

* Copyright and license update

* Add README information

* cleanup and constids

* Using ctx->idf where applicable

* remove if_using_basecluster

* refactor extra data usage

* refactor to use create_cell_ptr only

* optimized getCSC

* optimize critical path a bit

* clangformat

* disable clangformat where applicable

---------

Signed-off-by: gatecat <gatecat@ds0.me>
Co-authored-by: Lofty <dan.ravensloft@gmail.com>
Co-authored-by: gatecat <gatecat@ds0.me>
2024-12-04 09:00:05 +01:00
YRabbit
5eaa1b3f1f
Gowin. Add IODELAY. (#1398)
* Gowin. Add IODELAY.

Input/Output delay (IODELAY) is programmable delay uint in IO block.

This delay line is enabled before/after the IO pad and allows the signal
to be delayed statically or dynamically during 0-127 stages each lasting
from 18 to 30 picoseconds depending on the chip family.

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

* Gowin. Replacing assertions with log_error.

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

---------

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-11-30 09:24:59 +01:00
YRabbit
2b8a235776
Gowin. Add Input Edge Monitor (#1396)
Add sampling part to IO blocks (input only). This edge detector will
allow to dynamically adjust DDR decoding window in the future.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-11-27 09:57:34 +01:00
Miodrag Milanović
0e69425794
Add expandBoundingBox method to API (#1395)
* Add expandBoundingBox method to API

* Update API documentation
2024-11-26 10:13:41 +01:00
Miodrag Milanović
55035465aa
Himbaechel GUI (#1295)
* Extend Himbaechel API with gfx drawing methods

* Add bel drawing in example uarch

* changed API and added tile wire id in db

* extend API so we can distinguish CLK wires

* added bit more wires

* less horrid way of handling gfx ids

* loop wire range

* removed not needed brackets

* bump database version to 5

* Removed not used GfxFlags
2024-11-21 15:13:22 +01:00
YRabbit
9c2d96f86e
Gowin. FFs placement. (#1386)
* Gowin. FFs placement.

* Allow clusters to be created from FFs and LUTs;

* Immediately create pass-through LUTs from free LUTs adjacent to FF - at the same time ensure alternating use of LUT inputs;

* In case of constant networks, such pass-through LUTs are disconnected from networks altogether;

* Allow FF to be placed directly into SSRAM slides - this is useful when using synchronous reading.

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

* Gowin. Fix aux name creation

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

* Gowin. Use I3 for pass-trough LUTs

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

---------

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-10-22 12:49:44 +02:00
myrtle
f36a6571c1
cmake: Use upstream BoostConfig.cmake instead of cmake's own (#1387)
Signed-off-by: gatecat <gatecat@ds0.me>
2024-10-22 10:35:54 +02:00
Meinhard Kissich
cf42baa43b
Fix RNG seed initialization (#1383) 2024-10-09 18:25:02 +02:00
gatecat
7c459805f6 himbaechel: Bump DB version for package extra_data addition
Signed-off-by: gatecat <gatecat@ds0.me>
2024-10-09 15:21:10 +02:00
Pepijn de Vos
028be1462a
apicula: add support for magic sip pins (#1370)
* apicula: add support for magic sip pins

* fix nullptr check

* DDR fix by xiwang

* WIP support for setting the iostd

* add iostd
2024-10-09 15:16:36 +02:00
Meinhard Kissich
d27993f019
Placer: Fix static legalise radius (#1382) 2024-10-08 15:20:33 +02:00
Rowan Goemans
0e5b1348e6
timing_log: Handle potentially missing net when reporting crit path (#1381) 2024-10-04 08:07:55 +02:00
myrtle
854549a5ab
ice40: Fix missing clock pin types (#1380)
Signed-off-by: gatecat <gatecat@ds0.me>
2024-10-04 08:07:13 +02:00
myrtle
75d2ce6a92
heap: Fix ripup criterea (#1378)
Signed-off-by: gatecat <gatecat@ds0.me>
2024-10-02 22:36:57 +02:00
YRabbit
65cf6d8da7
Gowin. Fix the port check for connectivity. (#1376)
* Gowin. Fix the port check for connectivity.

What happens is that it's not enough to check for a network, we also
need to make sure that the network is functional: has src and sinks.

And the style edits - they get automatically when I make sure to run
clang-format10.

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

* Gowin. Fix the port check for connectivity.

What happens is that it's not enough to check for a network, we also
need to make sure that the network is functional: has src and sinks

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

---------

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-10-02 22:36:36 +02:00
Lofty
268b32c341 router2: additional heatmap data 2024-10-02 16:29:55 +02:00
Adrien Prost-Boucle
b3b2392893 clang-format on basectx.h 2024-10-01 15:24:40 +02:00
Adrien Prost-Boucle
7f33329fe1 Himbaechel Xilinx : XDC commands : Also search nets with lowercase for better interoperability with other synthesis tools and RTL languages 2024-10-01 15:24:40 +02:00
Adrien Prost-Boucle
3d00b97e0a Himbaechel Xilinx : Support get_nets with braces around net name in XDC commands 2024-10-01 15:24:40 +02:00
Adrien Prost-Boucle
a9cc7f453d Himbaechel Xilinx : Support multiple nets per command 2024-10-01 15:24:40 +02:00
Adrien Prost-Boucle
ff9ba9e090 Himbaechel Xilinx : More warning messages about unsupported things in XDC file 2024-10-01 15:24:40 +02:00
Adrien Prost-Boucle
cc04882b17 BaseCtx : Fix crash in getNetByAlias() 2024-10-01 15:24:40 +02:00
gatecat
9b51c6e337 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2024-09-30 14:51:33 +02:00
gatecat
fcdaf3f86c Remove fpga_interchange
Signed-off-by: gatecat <gatecat@ds0.me>
2024-09-30 13:10:30 +02:00
gatecat
1967db170d xilinx: Support for complex IOLOGIC
Signed-off-by: gatecat <gatecat@ds0.me>
2024-09-27 17:37:46 +02:00
gatecat
24fc33c014 xilinx: Basic I/ODDR support
Signed-off-by: gatecat <gatecat@ds0.me>
2024-09-27 17:09:15 +02:00
gatecat
d3c0f945da xilinx: Fix BRAM placement, clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2024-09-27 16:24:47 +02:00
gatecat
38e5faca85 xilinx: Fix workaround for unsupported xdc construct
Signed-off-by: gatecat <gatecat@ds0.me>
2024-09-27 16:07:38 +02:00
gatecat
e4dfd4e622 xilinx: Support single-port LUTRAM variants
Signed-off-by: gatecat <gatecat@ds0.me>
2024-09-26 18:11:01 +02:00
gatecat
7516b8950a xilinx: Few more stub timings
Signed-off-by: gatecat <gatecat@ds0.me>
2024-09-26 17:30:36 +02:00
gatecat
118ecbc6b3 xilinx: Remove unnecessary assert
Signed-off-by: gatecat <gatecat@ds0.me>
2024-09-26 15:58:16 +02:00
gatecat
c90d872e35 xilinx: Filter out another missing pip type
Signed-off-by: gatecat <gatecat@ds0.me>
2024-09-26 15:56:20 +02:00
Adrien Prost-Boucle
437fb70ed3 Himbaechel xilinx : Fix packing of cascaded DSP 2024-09-24 12:06:56 +02:00
Adrien Prost-Boucle
cd51a0c2fc Placer : Emit non-fatal error messages before ending the program 2024-09-24 12:06:56 +02:00
Adrien Prost-Boucle
9da05b6001 Himbaechel xilinx : DSP packing : Emit a non-fatal error message 2024-09-24 12:06:56 +02:00
Adrien Prost-Boucle
2031a067a0 Himbaechel xilinx : More flexibility about types of DSP parameters 2024-09-24 12:06:56 +02:00
Adrien Prost-Boucle
81bf92a855 Himbaechel xilinx : DSP packing : Disable clustering 2024-09-24 12:06:56 +02:00
Adrien Prost-Boucle
8a0e062520 Himbaechel xilinx : DSP packing : Improve code efficiency 2024-09-24 12:06:56 +02:00
Adrien Prost-Boucle
a08229d6b6 Placer : Clearer messages in warnings and errors 2024-09-24 12:06:56 +02:00
Adrien Prost-Boucle
9bea22ed1e Himbaechel xilinx : DSP packing : Fix identification of cascaded ports and share identification code 2024-09-24 12:06:56 +02:00
Adrien Prost-Boucle
ad9a54cc69 Himbaechel xilinx : More cascaded input ports for which routing is skipped 2024-09-24 12:06:56 +02:00
Adrien Prost-Boucle
04f5f80766 Himbaechel xilinx : Add safety check in DSP packing for 7-series 2024-09-24 12:06:56 +02:00
Adrien Prost-Boucle
db0c99199e Himbaechel xilinx : Add support of DSP packing for 7-series 2024-09-24 12:06:56 +02:00
Rowan Goemans
bbdf7aacb0 timing_log: warn on min time violation when timing fail is allowed 2024-09-24 08:57:21 +02:00
Rowan Goemans
0af42f1218 common: Use NPNR_ASSERT_FALSE for unreachable case 2024-09-24 08:57:21 +02:00
Rowan Goemans
93e233dad9 timing: Fix hold slack not matching reported path delay 2024-09-24 08:57:21 +02:00
Rowan Goemans
098dcaedec timing: remove the articial clock delay inflation 2024-09-24 08:57:21 +02:00
Rowan Goemans
0fce4b8f4e timing: lower clock_delay_fact to 1 to check if CI passes 2024-09-24 08:57:21 +02:00
Rowan Goemans
25d64b2105 timing_log: Fix logging indendation to match master
timing: Disable clock_skew analysis by default
2024-09-24 08:57:21 +02:00
Rowan Goemans
5488cd994b router: Enable clock skew analysis during routing 2024-09-24 08:57:21 +02:00
Rowan Goemans
8ee2c5612c timing: Add safe zero check function for delay_t 2024-09-24 08:57:21 +02:00
Rowan Goemans
a7f79fd681 timing: minor cleanup and stupid mistake fixups 2024-09-24 08:57:21 +02:00
Rowan Goemans
bca6f6394a timing: Fix slack calculations
timing: Fix max_delay_by_domain_pair function
timing: Fix hold time check
2024-09-24 08:57:21 +02:00
Rowan Goemans
eb0bf9ea9c report: Handle new segment types
timing_log: Use common segment type strings
2024-09-24 08:57:21 +02:00
Rowan Goemans
3b7fec8c4f report: Handle new segment types 2024-09-24 08:57:21 +02:00
Rowan Goemans
4488d42368 log: Remove bad usage of [[no_return]] 2024-09-24 08:57:21 +02:00
Rowan Goemans
8e12dfc693 timing: cleanup clock2clock reporting
timing: Add clock2clock delay as seperate
        timing line item.
2024-09-24 08:57:21 +02:00
Rowan Goemans
86106cb49a timing: integrate c2c delays and cleanup code 2024-09-24 08:57:21 +02:00
Rowan Goemans
fc3b2de8da timing: Add clock skew to arrival and required time 2024-09-24 08:57:21 +02:00
Rowan Goemans
60ee682d58 timing: Make hold violations an error 2024-09-24 08:57:21 +02:00
Rowan Goemans
82ea65d984 timing: Report min delay violated in timing logger 2024-09-24 08:57:21 +02:00
Rowan Goemans
7aeed52c06 common: Add some convenience functions for development 2024-09-24 08:57:21 +02:00
Rowan Goemans
c25da06d03 timing: Start identification of min_delay violations 2024-09-24 08:57:21 +02:00
Rowan Goemans
44665a9c4d timing: Allow critical path traversal for shortest paths 2024-09-24 08:57:21 +02:00
Rowan Goemans
2d542eb63a timing: Add hold time to bound of critical path report 2024-09-24 08:57:21 +02:00
gatecat
4b63b1115e Bump tests submodule
Signed-off-by: gatecat <gatecat@ds0.me>
2024-09-20 13:44:45 +02:00
Jonas Thörnblad
6ca64526bb Fix handling of RNG seed
* Fix truncation of output seed value from 64 bits to 32 bits (int
  instead of uint64) when written to json file.

* Fix input seed value conversion when --seed option is used.

* Remove input seed value scrambling (use of rngseed()) when --seed
  or --randomize-seed option is used since the output seed value will
  be the scrambled value and not the seed that was actually supplied
  or generated.
2024-09-18 16:29:32 +02:00
Rowan Goemans
2627d4e0ad
ecp5: Allow disabling of global promotion (#1367) 2024-09-12 20:16:17 +02:00
YRabbit
50bd8d09b0
Gowin. Implement the EMCU primitive. (#1366)
* Gowin. Implement the EMCU primitive.

Add support for the GW1NSR-4C's embedded Cortex-M3 processor. Since it
uses flash in its own way, we disable additional flash processing for
this case.

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

* Gowin. Fix merge.

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

---------

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-09-12 08:53:39 +01:00
YRabbit
ff7b8535bc
Gowin. Add DHCEN primitive. (#1349)
* Gowin. Add DHCEN primitive.

This primitive allows you to dynamically turn off and turn on the
networks of high-speed clocks.

This is done tracking the routes to the sinks and if the route passes
through a special HCLK MUX (this may be the input MUX or the output MUX,
as well as the interbank MUX), then the control signal of this MUX is
used.

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

* Gowin. Change the DHCEN binding

Use the entire PIP instead of a wire - avoids normalisation and may also
be useful in the future when calculating clock stuff.

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

---------

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-09-11 10:18:26 +01:00
Rowan Goemans
8d0f52fbf9
timing: Move towards DelayPairs for timing reporting (#1359) 2024-09-11 07:23:46 +01:00
YRabbit
4d1de4532a
Gowin. BUGFIX. Create all Clock Pips. (#1358)
Some Clocks PIPS were not created due to a check for the presence of a
delay class, now all wires are attributed to the class so that there is
no longer any need for this check.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-09-05 21:39:26 +01:00
YRabbit
4cf7afedf7
Gowin. Implement the UserFlash primitive (#1357)
* Gowin. Implement the UserFlash primitive

Some Gowin chips have embedded flash memory accessible from the fabric.
Here we add primitives that allow access to this memory.

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

* Gowin. Fix cell creation

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

---------

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-09-04 11:55:35 +01:00
Christian Fibich
2dc712130c
allow LFD2NX devices to be specified with --device (#1353) 2024-08-21 12:36:23 +02:00
YRabbit
32e2d9223c Gowin. BUGFIX. Timing
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-08-21 11:27:59 +01:00
YRabbit
01737a400c Gowin. Add clock wires delays.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-08-21 10:58:55 +01:00
Lofty
ccdc2f6f13 himbaechel/gowin: add timing information 2024-08-21 10:58:55 +01:00
Adrien Prost-Boucle
fa55e93848 Himbaechel xilinx : Fix regex to parse Zynq device names 2024-08-19 21:06:45 +01:00
Rowan Goemans
0d5d32951c
SDC parsing support (#1348)
* kernel: Add SDC file parser

* kernel: Add sdc as valid option

* kernel/sdc: Add error on EOF when fetching strings

* kernel/sdc: WIP command parsing for set_false_path

* kernel/sdc: Fully parse set_false_path

* kernel/sdc: Handle review comments
2024-08-12 17:45:27 +02:00
Rowan Goemans
f199c3e576
Update shell.nix (#1347) 2024-08-12 16:29:26 +02:00
Saviour Owolabi
e9e7dce23d
Himbaechel Gowin: HCLK Support (#1340)
* Himbaechel Gowin: Add support for CLKDIV and CLKDIV2

* Himbaechel Gowin: Add support for CLKDIV and CLKDIV2

* Gowin Himbaechel: HCLK Bug fixes and corrections
2024-08-03 15:57:22 +02:00
YRabbit
11d335c7ce Gowin. Fix GW2A-18(c) DCS and DQCE
We filter out PIPs from these chips that bypass DCS.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-08-02 14:12:16 +02:00
YRabbit
10a5a44b81 Gowin. Implement clock management primitives.
DQCE and DCS primitives are added.

DQCE allows the internal logic to enable or disable the clock network in
the quadrant. When clock network is disabled, all logic drivern by this
clock is no longer toggled, thus reducing the total power consumtion of
the device.

DCS allows you to select one of four sources for two clock wires (6 and 7).
Wires 6 and 7 have not been used up to this point.

Since "hardware" primitives operate strictly in their own quadrants,
user-specified primitives are converted into one or more "hardware"
primitives as needed.

Also:
  - minor edits to make the most of helper functions like connectPorts()
  - when creating bases, the corresponding constants are assigned to the
    VCC and GND wires, but for now huge nodes are used because, for an
    unknown reason, the constants mechanism makes large examples
    inoperable. So for now we remain on the nodes.

Compatible with older Apicula databases.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-08-02 14:12:16 +02:00
YRabbit
f17caa2379 Gowin. BUGFIX. Fix placement checks
It was not taken into account that there are only 6 ALUs per cell. As a
result, on complex designs where ALUs and LUT-based memory are involved
and there are many LUTs (like in the RISCV emulator), there were
sometimes false positives about placement conflicts.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-07-29 11:31:59 +01:00
YRabbit
eb099a9244 Gowin. Bugfix.
The statement in the Gowin documentation that in the reading mode
"READ_MODE=0" the output register is not used and the OCE signal is
ignored is not confirmed by practice - if the OCE was left unconnected
or connected to the constant network, then a change in output data was
observed even with CE=0, as well as the absence of such at CE=1.

Synchronizing CE and OCE helps and the memory works properly in complex
systems such as RISC-V emulation and i8080 emulation (with 32K RAM and
16K BSRAM based ROM), but there is no theoretical basis for this fix, so
it is a hack.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-07-09 14:18:35 +02:00
YRabbit
1871afe9b9 Gowin. Taking into account the features of ROM
For pROM(X9) primitives in images generated by Gowin IDE, there is an
interesting recommunication of inputs depending on the data bit depth.
For example, in some cases, a high logical level may be applied to the
Write Enable input, which, let’s say, is not entirely usual for Read
Only memory.

Here we will do similar manipulations.

In addition, several minor bug fixes are included:

 - Fixed bit numbering for non-X9 series primitives.
 - Fixed decoder generation for BLKSEL - do not assume unused inputs are
   connected to GND.
 - Use default values for BSRAM parameters - don't assume their
   mandatory presence.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-07-09 14:18:35 +02:00
Miodrag Milanovic
cecd6b3f4d Document context related calls in HimbaechelAPI 2024-07-08 16:45:24 +02:00
Miodrag Milanovic
6b5b21e165 Enable user to override setupArchContext in Himbaechel arch 2024-07-08 16:45:24 +02:00
YRabbit
7dd4a8c1d5 Gowin. Implement power saving primitive
As the board on the GW1N-1 chip becomes a rarity, its replacement is the
Tangnano1k board with the GW1NZ-1 chip. This chip has a unique mechanism
for turning off power to important things such as OSC, PLL, etc.

Here we introduce a primitive that allows energy saving to be controlled
dynamically.

We also bring the names of some functions to uniformity.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-07-08 16:44:49 +02:00
TG
ba293437e0 ice40: Fix Python bindings for pip iterators 2024-07-03 15:09:27 +02:00
YRabbit
0639681b73 Gowin. Fix BSRAM block selection.
In the images generated by Gowin IDE, the signals for dynamic BSRAM
block selection (BLKSEL[2:0]) are not always connected directly to the
ports - some chips add LUT2, LUT3 or LUT4 to turn these signals into
Clock Enable.  Apparently there are chips with an error in the operation
of these ports.

Here we make such a decoder instead of using ports directly.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-07-03 15:09:13 +02:00
YRabbit
2e8280a949 Gowin. Fix pipeline mode in BSRAM.
It seems that the internal registers on the BSRAM output pins in
READ_MODE=1'b1 (pipeline) mode do not function properly because in the
images generated by Gowin IDE an external register is added to each pin,
and the BSRAM itself switches to READ_MODE=1'b0 (bypass) mode .

This is observed on Tangnano9k and Tangnano20k boards.

Here we repeat this fix.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-06-25 11:14:02 +02:00
YRabbit
8f87918230 Gowin. Add fix for Single Port BSRAM
Add description of BSRAM harness

In some cases, Gowin IDE adds a number of LUTs and DFFs to the BSRAM. Here we are trying to add similar elements.

More details with pictures: https://github.com/YosysHQ/apicula/blob/master/doc/bsram-fix.md

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-06-25 11:14:02 +02:00
gatecat
a29a17f8f2 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2024-06-18 13:54:12 +02:00
gatecat
c89037db49 static: Speedup with parallel wirelength gradient computation
Signed-off-by: gatecat <gatecat@ds0.me>
2024-06-18 13:53:42 +02:00
gatecat
945cf48c6c static: Various convergence improvements for ECP5
Signed-off-by: gatecat <gatecat@ds0.me>
2024-06-18 11:05:59 +02:00
gatecat
61cc5259d9 prefine: Add shared lock around bel availability checks
Signed-off-by: gatecat <gatecat@ds0.me>
2024-06-12 16:11:18 +02:00
gatecat
b7f91e57a0 Update cached Yosys in CI
Signed-off-by: gatecat <gatecat@ds0.me>
2024-05-17 06:31:43 +02:00
gatecat
59a29e5f42 nexus: Use a toposort when preplacing clock primitives
Signed-off-by: gatecat <gatecat@ds0.me>
2024-05-17 06:31:43 +02:00
gatecat
423f1b7159 static: Make bin stamping more consistent
Signed-off-by: gatecat <gatecat@ds0.me>
2024-05-08 09:53:28 +02:00
gmanricks
09703c7f35 update import to boost 2024-05-06 11:22:56 +02:00
gmanricks
eb0554319f use boost for windows path 2024-05-06 11:22:56 +02:00
gmanricks
f99346ba61 fix for windows path 2024-05-06 11:22:56 +02:00
Miodrag Milanovic
0dc4bcb203 Format utlilisation for larger FPGA as well 2024-05-06 11:22:33 +02:00
gatecat
3f2451f8d7 static: Guard density CSV dumps behind a flag
Signed-off-by: gatecat <gatecat@ds0.me>
2024-05-03 09:50:40 +02:00
gatecat
89e3b7d23d static: Fix float overflow issue
Co-authored-by: Lofty <dan.ravensloft@gmail.com>
Signed-off-by: gatecat <gatecat@ds0.me>
2024-05-03 09:39:24 +02:00
gatecat
7a00e76cb1 static: Exclude dark nodes from steplength
Signed-off-by: gatecat <gatecat@ds0.me>
2024-05-03 09:36:09 +02:00
Patrick Dähne
f085950383 Fixed header files for boost 1.85.0 2024-04-30 12:13:11 +02:00
Miodrag Milanovic
edcafcf085 Ignore compile artifacts in rust directory 2024-04-19 11:55:49 +02:00
YRabbit
4d5c48ad83 Gowin. Fix DSP MULT36X36
When multiplying 36 bits by 36 bits using four 18x18 multipliers, the
sign bits of the higher 18-bit parts of the multipliers were correctly
switched, but what was incorrect was leaving the sign bits of the lower
parts of the multipliers uninitialized. They now connect to VSS.

Addresses https://github.com/YosysHQ/apicula/issues/242

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-04-19 11:55:39 +02:00
YRabbit
d3b53d8e1a Gowin. PLL Pads. Fix the condition.
Do not search for pads if the signal source for the PLL is something
other than the IO pin - these are guaranteed to already be placed and
have a bound Bel.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-04-09 10:15:42 +02:00
YRabbit
6b7723e4c1 Gowin. Add PLL pads.
If the CLKIN input of the PLL is connected to a special pin, then it
makes sense to try to place the PLL so that it uses a direct implicit
non-switched connection to this pin.

The transfer of information about pins for various purposes has been
implemented (clock input signal, feedback, etc), but so far only CLKIN
is used.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-04-09 10:15:42 +02:00
Miodrag Milanovic
9bb46b98b4 update ci build script 2024-04-05 12:25:52 +02:00
Miodrag Milanovic
1f25f2067a Make example more like other arch 2024-04-05 12:25:52 +02:00
Miodrag Milanovic
ac725465a9 gui: fix warning on closing application 2024-04-05 12:25:52 +02:00
Miodrag Milanovic
75af8ccfd2 gui: user more reliable locking 2024-04-05 12:25:52 +02:00
Miodrag Milanovic
465cbfaf19 Add share to .gitignore 2024-04-05 12:25:52 +02:00
Jason Thorpe
7f9f75c0d3 Tweak the FreeBSD version of proc_self_dirname() to work on NetBSD and use it.
Resolves issue #1298.
2024-03-27 22:02:16 +00:00
Andrew Bell
b4da57598e One more warning. 2024-03-22 09:50:11 +00:00
Andrew Bell
693058abb7 Eliminate gcc13 warnings. 2024-03-22 09:50:11 +00:00
YRabbit
5ecb669a41 gowin: BUGFIX fix typo
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-03-22 09:49:01 +00:00
YRabbit
210e0fa33b gowin: Add support for DSP primitives.
For the following primitives:
  - PADD9
  - PADD18
  - MULT9X9
  - MULT18X18
  - MULT36X36
  - MULTALU18X18
  - MULTALU36X18
  - MULTADDALU18X18
  - ALU54D
packing and processing of fixed wires between macro and between DSP
blocks is implemented.
Clusters of DSP and macro blocks are processed using custom placement of
cluster elements.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-03-22 09:47:10 +00:00
YRabbit
ff96fc5af1 gowin: Himbaechel. Fix IDES16/OSER16
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-03-13 14:22:43 +01:00
YRabbit
4e8436a1fc gowin: Himbaechel. Allow to combine IOLOGIC.
Corrects the situation when it is impossible to use IOBUF with two
IOLOGIC elements at the same time - input and output.

Addresses https://github.com/YosysHQ/nextpnr/issues/1275

This is done by dividing one IOLOGIC Bel into two - input IOLOGIC and
output IOLOGIC plus checking for compatibility of the cells located
there.

At the moment, this check is simple and allows only the combination of
DDR and DDRC primitives.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-03-13 14:22:43 +01:00
YRabbit
4981ebb698 gowin: Himbaechel. Improve the global router
A small improvement - do not waste time analyzing already processed
networks in the previous step (and possibly steps).

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-03-13 14:22:11 +01:00
gatecat
05ed9308d6 ecp5: Improve router performance on slower speed grades
Signed-off-by: gatecat <gatecat@ds0.me>
2024-02-21 08:14:51 +01:00
gatecat
aa26ba7ea1 static: Improve singleton handling
Signed-off-by: gatecat <gatecat@ds0.me>
2024-02-20 10:25:35 +01:00
gatecat
255633c9f3 static: First pass at timing-driven placement
Signed-off-by: gatecat <gatecat@ds0.me>
2024-02-12 09:09:13 +01:00
YRabbit
cc273c1257 gowin: Himbaechel. Handle SDP OCE
Semi-dual port BSRAM (in Gowin terminology) has the same feature as
Single Port - the CE and OCE signals must be synchronized.

Such a sin has not yet been noticed for Dual Port.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-02-09 08:04:08 +01:00
YRabbit
833cb86b51 gowin: Himbaechel. Edit message text.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-02-09 08:03:56 +01:00
YRabbit
4eeb56c0e0 gowin: Himbaechel. Improve global router.
* Don't stop at the first bad "arc", but use the global network to the
  maximum.
* Report partial/full use of global wires for the network.
* In case of complete routing failure, releasing the source - this is
  actually a BUGFIX.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-02-09 08:03:56 +01:00
YRabbit
b05cb86291 gowin: Himbaechel. Global router BUGFIX.
Ignore networks without users.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-01-29 13:18:24 +01:00
Miodrag Milanovic
a65ddff8ba Update workflows 2024-01-29 10:37:55 +01:00
YRabbit
325985e055 gowin: Himbaechel. SPX9 BSRAM BUGFIX.
This type setting is not needed here - the packer distinguishes memory
features by the X9 attribute, which will be correct anyway.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-01-27 15:05:58 +01:00
gatecat
e7192cd375 static: Fix ifdefs
Signed-off-by: gatecat <gatecat@ds0.me>
2024-01-26 17:57:22 +01:00
gatecat
9dcd0eff16 static: Add a basic threadpool
Signed-off-by: gatecat <gatecat@ds0.me>
2024-01-25 08:24:41 +01:00
YRabbit
73b7de74a5 gowin: Himbaechel. Fix the style.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-01-23 14:00:29 +01:00
YRabbit
91b0c4f90a gowin: Himbaechel. Deal with SP BSRAM ports.
The OCE signal in the SP(X)9B primitive is intended to control the
built-in output register. The documentation states that this port is
invalid when READ_MODE=0 is used. However, it has been experimentally
established that you cannot simply apply VCC or GND to it and forget it
- the discrepancy between the signal on this port and the signal on the
CE port leads to both skipping data reading and unnecessary reading
after CE has switched to 0.
Here we force these ports to be connected to the network, except in the
case where the user controls the OCE signal using non-constant signals.

Also:
  * All PIPs for clock spines are made inaccessible to the common router
    - in general, using these routes for signals that have not been
    processed by a special globals router is fraught with effects that
    are difficult to detect.
  * The INV primitive has been added purely to speed up development -
    this primitive is not generated by Yosys, but is almost always
    present in vendor output files.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2024-01-23 14:00:29 +01:00
Pepijn de Vos
97f5c3ca2c Add documentation for Himbaechel Gowin uarch 2024-01-23 12:17:01 +01:00
gatecat
8968c84ce6 Increase the set of PnR-excluded cells
Signed-off-by: gatecat <gatecat@ds0.me>
2024-01-23 12:16:14 +01:00
gatecat
4220ce1007 gui: Remove const on max_elems_
Signed-off-by: gatecat <gatecat@ds0.me>
2024-01-18 15:34:40 +01:00
Lofty
a0e360fd9f rust: convert netinfo_driver to Option 2024-01-18 14:07:23 +01:00
Lofty
14a09061a5 rust: rework portref_cell 2024-01-18 14:07:23 +01:00
Lofty
dfd651a132 rust: fix some calls that got wrongly replaced 2024-01-18 14:07:23 +01:00
Lofty
d0e01661a5 rust: fix build error 2024-01-18 14:07:23 +01:00
Lofty
6e4e81429c rust: nets isn't send/sync 2024-01-18 14:07:23 +01:00
Lofty
c8e1cbc5f2 rust: transform pointers to references where possible 2024-01-18 14:07:23 +01:00
Lofty
c5fc34f11a rust: slight cleanup 2024-01-18 14:07:23 +01:00
Lofty
f12e76479c rust: add mutex for arch manipulation 2024-01-18 14:07:23 +01:00
gatecat
2afb1f632e clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2024-01-12 10:09:28 +01:00
gatecat
d00fdc8f7a frontend: Ignore $scopeinfo
Signed-off-by: gatecat <gatecat@ds0.me>
2024-01-11 15:48:53 +01:00
Lofty
257fbe549d readme: update build prerequisites 2024-01-05 20:12:05 +00:00
Lofty
d557e3e35f hashlib: constify const_iterators 2024-01-04 17:32:56 +01:00
Lofty
2c8ad5fa1d Fix a renamed Qt item 2024-01-04 17:32:56 +01:00
Lofty
d867019dcb upgrade to C++17 2024-01-04 17:32:56 +01:00
gatecat
5013392841 Add trivially copyable invariant for ID types
Signed-off-by: gatecat <gatecat@ds0.me>
2024-01-04 17:04:28 +01:00
dragonmux
6a9ad61051 rust: Fixed an unused parameter warning 2024-01-04 10:39:45 +01:00
dragonmux
cb269b46d6 rust: Made the wrap helper inline and fixed an accidental copy error 2024-01-04 10:39:45 +01:00
dragonmux
3e46fbc655 rust: Reworked the unwrap helpers by effectively hiding the crime of memcpy()'ing into a non-POD type from the compiler
There is still the possibility that this can explode horribly, but the result should be the same codegen and fixes the warning

This also makes the helpers `inline` so they'll usually be compiled out for a nice speed boost
2024-01-04 10:39:45 +01:00
dragonmux
cfeb588d32 rust: Reworked npnr_context_get_pips_leak() using std::accumulate() and fixed an accidental copy problem 2024-01-04 10:39:45 +01:00
dragonmux
7d0c4eaf1b rust: Reworked npnr_context_get_wires_leak() using std::accumulate() and fixed an accidental copy problem 2024-01-04 10:39:45 +01:00
dragonmux
e9c69ac00c gui: Fixed unused parameters and spurious ; warnings in one of the headers 2024-01-04 10:39:45 +01:00
dragonmux
cb4db2d368 ice40: Fixed unused parameters and spurious ; warnings in some of the headers 2024-01-04 10:39:45 +01:00
dragonmux
7fd80c5a92 common/kernel: Fixed unused parameters and spurious ; warnings in some of the headers 2024-01-04 10:39:45 +01:00
Lofty
50d43742ce rust: silence warnings 2024-01-03 14:51:33 +01:00
gatecat
e12ab86c75 rust: Fix segfault
Signed-off-by: gatecat <gatecat@ds0.me>
2024-01-03 13:42:18 +01:00
Lofty
1bbcc5f2c4 (broken) third round of review fixes 2024-01-03 13:42:18 +01:00
Lofty
49d505831d second round of review fixes 2024-01-03 13:42:18 +01:00
Lofty
1dbd81067a first round of review fixes 2024-01-03 13:42:18 +01:00
Lofty
d2297b1ba0 Add Rust FFI bindings 2024-01-03 13:42:18 +01:00
gatecat
4a4025192a run clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2023-12-26 09:54:34 +01:00
Miodrag Milanovic
41914876ef .gitignore for nextpnr-himbaechel 2023-12-23 11:09:26 +01:00
gatecat
56587859d3 nexus: Improve error reporting for illegal carry chains
Signed-off-by: gatecat <gatecat@ds0.me>
2023-12-22 15:40:29 +01:00
gatecat
535709a9a9 placer1: Fix various bitrot
Signed-off-by: gatecat <gatecat@ds0.me>
2023-12-13 11:37:30 +01:00
Lofty
d1083fd348 static/ice40: bug fixes for ultraplus 2023-12-13 11:37:20 +01:00
Miodrag Milanovic
b4ca68c8ef Add ability to override Cluster methods in Himbaechel 2023-12-11 13:53:52 +01:00
gatecat
6d9322457e static: Reduce stddev of initial solution
Signed-off-by: gatecat <gatecat@ds0.me>
2023-11-26 16:51:47 +01:00
YRabbit
c13b34f20e gowin: Himbaechel. Add BSRAM for all chips.
The following primitives are implemented for the GW1N-1, GW2A-18,
    GW2AR-18C, GW1NSR-4C, GW1NR-9C, GW1NR-9 and GW1N-4 chips:

    * pROM     - read only memory - (bitwidth: 1, 2, 4, 8, 16, 32).
    * pROMX9   - read only memory - (bitwidth: 9, 18, 36).
    * SDPB     - semidual port    - (bitwidth: 1, 2, 4, 8, 16, 32).
    * SDPX9B   - semidual port    - (bitwidth: 9, 18, 36).
    * DPB      - dual port        - (bitwidth: 16).
    * DPX9B    - dual port        - (bitwidth: 18).
    * SP       - single port      - (bitwidth: 1, 2, 4, 8, 16, 32).
    * SPX9     - single port      - (bitwidth: 9, 18, 36).

    For GW1NSR-4C and GW1NR-9 chips, SP/SPX9 primitives with data widths
    of 32/36 bits are implemented using a pair of 16-bit wide
    primitives.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-11-26 13:08:09 +01:00
YRabbit
90d4863dd4 gowin: Himbaechel. Add GW1NZ-1 BSRAM.
The following primitives are implemented for the GW1NZ-1 chip:

* pROM     - read only memory - (bitwidth: 1, 2, 4, 8, 16, 32).
* pROMX9   - read only memory - (bitwidth: 9, 18, 36).
* SDPB     - semidual port    - (bitwidth: 1, 2, 4, 8, 16, 32).
* SDPX9B   - semidual port    - (bitwidth: 9, 18, 36).
* DPB      - dual port        - (bitwidth: 16).
* DPX9B    - dual port        - (bitwidth: 18).
* SP       - single port      - (bitwidth: 1, 2, 4, 8, 16, 32).
* SPX9     - single port      - (bitwidth: 9, 18, 36).

Also:
 - The creation of databases for GW1NS-2 has been removed - this was not
   planned to be supported in Himbaechel from the very beginning and
   even examples were not created in apicula for this chip due to the
   lack of boards with it on sale.
 - It is temporarily prohibited to connect DFFs and LUTs into clusters
   because for some reason this prevents the creation of images on lower
   chips (placer cannot find the placement), although without these
   clusters the images are quite working. Requires further research.
 - Added creation of ALU with mode 0 - addition. Such an element is not
   generated by Yosys, but it is a favorite vendor element and its
   support here greatly simplifies the compilation of vendor netlists.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-11-26 13:08:09 +01:00
YRabbit
f2c280feda gowin: Himbaechel. Initial BSRAM support
Only pROM/pROMX9 for now

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-11-26 13:08:09 +01:00
Miodrag Milanovic
e3f4578b3b CRLF -> LF eol 2023-11-23 09:22:07 +01:00
Miodrag Milanovic
ec60542ffd create wiremap for himbaechel arch 2023-11-23 09:22:07 +01:00
Miodrag Milanovic
1ec8e411d7 set render bound box, so grid is displayed 2023-11-23 08:21:26 +01:00
Miodrag Milanovic
0b8a93eed5 fix compile warning 2023-11-23 08:21:26 +01:00
gatecat
de3d5be8f0 python: Remove deprecated use of Py_SetProgramName
Signed-off-by: gatecat <gatecat@ds0.me>
2023-11-23 06:49:15 +01:00
Balint Cristian
7814f44883 Fix abstract class implementation for fpga_interchange
Signed-off-by: Balint Cristian <cristian.balint@gmail.com>
2023-11-23 06:49:01 +01:00
gatecat
6683fd4ada himbaechel: Fix when more then 32k unique node shapes
Signed-off-by: gatecat <gatecat@ds0.me>
2023-11-22 17:11:27 +01:00
gatecat
55635cf2cd Update README
Signed-off-by: gatecat <gatecat@ds0.me>
2023-11-17 09:14:19 +01:00
gatecat
e2a887ef0d himbaechel: Switch default back to router1 for now
Signed-off-by: gatecat <gatecat@ds0.me>
2023-11-17 09:09:59 +01:00
gatecat
5bfe0dd1b1 himbaechel: Adding a xilinx uarch for xc7 with prjxray
Signed-off-by: gatecat <gatecat@ds0.me>
2023-11-14 17:12:09 +01:00
laanwj
a32ad13a86 ecp5: Don't segfault while packing FFs when DI port of TRELLIS_FF unconnected
Currently a segfault happens when the DI port is not specified. Leaving
it unconnected is probably incorrect, but it shouldn't crash the placer.
Fix by adding a check.
2023-11-14 11:55:51 +01:00
uis
a4d2244300 Fix printf formats 2023-11-13 13:59:51 +01:00
YRabbit
0106c3d299 gowin: Himbaechel. Diff io BUGFIX.
Fixed incorrect use of attributes instead of parameters.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-11-13 13:59:28 +01:00
Lofty
506d5f9422 machxo2: less pessimistic delay prediction 2023-11-09 06:48:50 +01:00
gatecat
4c6003ac0b router2: Don't use estimates for constant nets
Signed-off-by: gatecat <gatecat@ds0.me>
2023-11-07 15:55:22 +01:00
gatecat
7b0e082000 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2023-11-07 09:02:35 +01:00
gatecat
cf647463e4 himbaechel: Add support for new constants API
Signed-off-by: gatecat <gatecat@ds0.me>
2023-11-07 09:00:03 +01:00
gatecat
fe52840054 archapi: Add new API for global constant routing
Signed-off-by: gatecat <gatecat@ds0.me>
2023-11-07 09:00:03 +01:00
Lofty
e3c44dd20a ice40: add IO group to static 2023-11-07 08:18:35 +01:00
Lofty
214cc4315e static: density multiplier should be a vector 2023-11-07 08:18:35 +01:00
Lofty
d6f54fd9df ice40: add static placer support 2023-10-29 08:46:33 +01:00
gatecat
d40c6e850d himbaechel: Generation speedup and improvements
Signed-off-by: gatecat <gatecat@ds0.me>
2023-10-29 07:46:45 +01:00
gatecat
74d7ebc71f clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2023-10-28 17:10:42 +02:00
Justin Rajewski
6bae89b8b7 Undid accidental formatting 2023-10-26 21:21:14 +02:00
Justin Rajewski
7cac0249a1 Fixes for building on windows 2023-10-26 21:21:14 +02:00
Justin Rajewski
95f0a19391 Fixes for building on windows 2023-10-26 21:21:14 +02:00
Justin Rajewski
1238b69d74 Fixes for building on windows 2023-10-26 21:21:14 +02:00
gatecat
4a7e58a938 static/ecp5: zero bel area for RAMW because it's a zero-area cell
Signed-off-by: gatecat <gatecat@ds0.me>
2023-10-14 09:40:41 +02:00
Miodrag Milanovic
5a2eff2120 compile fix 2023-10-09 09:00:27 +02:00
gatecat
0eb9a9ad02 placer_static: Initial prototype
Signed-off-by: gatecat <gatecat@ds0.me>
2023-10-02 14:56:40 +02:00
Miodrag Milanovic
95e7598cc6 Fix timing lookup for DP8KC 2023-10-02 14:49:17 +02:00
Miodrag Milanovic
e4cb7ea337 proper clock calc due after funcion change 2023-10-02 14:49:17 +02:00
Miodrag Milanovic
f0325730a8 made higher estimate and use proper speed 2023-10-02 14:49:17 +02:00
Miodrag Milanovic
c2e7d3d611 remove commented sections 2023-10-02 14:49:17 +02:00
Miodrag Milanovic
1811c71438 update trellis version 2023-10-02 14:49:17 +02:00
Miodrag Milanovic
1a92c83c3a properly assign latest fuzzed data 2023-10-02 14:49:17 +02:00
Miodrag Milanovic
ed7064b210 select proper signal 2023-10-02 14:49:17 +02:00
Miodrag Milanovic
72546a2186 made delay_t int type 2023-10-02 14:49:17 +02:00
Miodrag Milanovic
657d2898cf import proper data where possible 2023-10-02 14:49:17 +02:00
Miodrag Milanovic
c2b75b355f use timing data 2023-10-02 14:49:17 +02:00
Miodrag Milanovic
40313eacf0 fix import 2023-10-02 14:49:17 +02:00
Miodrag Milanovic
1edb449601 optimization/cleanup 2023-10-02 14:49:17 +02:00
Miodrag Milanovic
58cb8a830a Load timing data 2023-10-02 14:49:17 +02:00
rowanG077
e8602fb56d std::numeric_limits<delay_t>::lowest() -> ::min() 2023-09-28 16:27:15 +02:00
Wanda
c07ca64ebe hashlib: Improve pool hash function. 2023-09-27 17:08:29 +02:00
rowanG077
3f2e550f51 tmg: Fix logging of slack histogram 2023-09-25 13:20:40 +02:00
rowanG077
38d2a4b844 tmg: Fix argument order in run method
Router 2 expects "update_route_delays" to be the first argument to `tmg.run`.
2023-09-25 13:20:40 +02:00
YRabbit
8e84006ee7 gowin: Himbaechel. Specify the chip variant.
For GW2A-18 and GW1N-9 you need to specify the family in addition to partno.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-09-16 10:10:51 +02:00
YRabbit
682c91476f gowin: Himbaechel. Fix install path
Use himbaechel/gowin instead of himbaechel/gowin/gowin.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-09-16 09:38:10 +02:00
YRabbit
f5996ff4a1 gowin: Himbaechel. Support DragonFlyBSD
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-09-16 07:38:57 +02:00
YRabbit
8a54e5ec1c gowin: Himbaechel. Support DragonFlyBSD
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-09-16 07:38:57 +02:00
YRabbit
165e89f49a gowin: Himbaechel. Support DragonFlyBSD
We add support right here so that later I don’t have to make patches to the ports.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-09-16 07:38:57 +02:00
gatecat
565927dfcc himbaechel: Add discovery of uarch and chipdb
Signed-off-by: gatecat <gatecat@ds0.me>
2023-09-15 08:23:43 +02:00
gatecat
3cac90a30a himbaechel: Fix for Python 3.9
Signed-off-by: gatecat <gatecat@ds0.me>
2023-09-13 14:35:58 +02:00
gatecat
3e1e783873 himbaechel: Initial timing support
Signed-off-by: gatecat <gatecat@ds0.me>
2023-09-08 09:55:49 +02:00
YRabbit
890d7f7617 gowin: Himbaechel. Use a more appropriate function
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-09-08 09:15:35 +02:00
YRabbit
78ee20b5da gowin: Himbaechel. Extend clock router
Now the clock router can place a buffer into the specified network,
which divides the network into two parts: from the source to the buffer,
routing occurs through any available PIPs, and after the buffer to the
sink, only through a dedicated global clock network.

This is made specifically for the Tangnano20k where the external
oscillator is soldered to a regular non-clock pin. But it can be used
for other purposes, you just need to remember that the recipient must be
a CLK input or output pin.

The port/network to set the buffer to is specified in the .CST file:

CLOCK_LOC "name" BUFG;

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-09-08 09:15:35 +02:00
gatecat
f9825c3130 ice40: only set/clear negclk bit if IO clock actually used
Signed-off-by: gatecat <gatecat@ds0.me>
2023-09-08 09:15:27 +02:00
Catherine
eef5243fba himbaechel/gowin: recognize -DAPYCULA_INSTALL_PREFIX=.../virtualenv.
This option can be empty, in which case the virtualenv is left
exactly as it was in the build environment.
2023-09-07 10:47:54 +02:00
Catherine
732b329e7d himbaechel/gowin: recognize -DHIMBAECHEL_GOWIN_DEVICES=all. 2023-09-07 10:47:54 +02:00
gatecat
9994ba1d19 json: Fix handling of offsets in backend
Signed-off-by: gatecat <gatecat@ds0.me>
2023-09-07 08:00:05 +02:00
gatecat
79c6840fef ecp5: Improve packer robustness to FF dangling M input
Signed-off-by: gatecat <gatecat@ds0.me>
2023-09-02 11:38:20 +02:00
gatecat
a9a9251e42 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2023-08-31 10:30:19 +02:00
YRabbit
98b09c369f gowin: Himbaechel. Fix the device selection
Slightly change the Gowin device selection mechanism for database generation.
By default, nothing is generated as before.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 10:09:04 +02:00
YRabbit
3e0b9826b5 gowin: Himbaechel. Fix problems.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
aca14cc420 gowin: Himbaechel. Install bases
Install the Himbaechel gowin chipdb .bin files to
/usr/local/nextpnr/himbaehel/gowin

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
6513299126 gowin: Himbaechel. Handling of disabled units
Using  extra cell functions to mark disabled units using the PLL example.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
f42805984c gowin: Himbaechel. Improve CMake thing a little
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
fdd45d12fd gowin: Himbaechel. Add rough CMake stuff
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
1b926b2703 gowin: Himbaechel. Fix IO for GW1NZ-1
In these chips, the midline IOs are still simple, but are no longer just
IOBUF - that is, unlike the GW1N-1 IBUF and OBUF are not obtained by
applying a signal to the OEN input.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
84a27c3ebf gowin: Himbaechel. Improve error messages
OSER16/IDES16 placement issue reports now indicate which location is
having trouble.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
09b7cad7f1 gowin: Himbaechel. Refactor.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
e85bb1c28c gowin: Himbaechel. Fix DESER and PLL
- OSER4 can be located in neighboring IOs;
- PLLVR also needs to rename the inputs.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
4d0afdfd60 gowin: Himbaechel. Add the GW1N-4 simple IOs
And also fix the clock router to allow (with a warning) non-dedicated
routing in case of false detection of clock wires.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
0994e11b73 gowin: Himbaechel. Add OSER16 and IDES16
Information about what function (main or auxiliary) the cell performs in
these primitives is transmitted through the tile's extra data. And this
also allows us to remove the calculation of the coordinates of the
auxiliary cell on the go.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
a823543932 gowin: Himbaechel. Unify the creation of tail types
A single mechanism for creating a new type of tile if special functions
are found in the chip database that depend on the coordinates of the
tile.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
87ae77fbc6 gowin: Himbaechel. Add IDES primitives
As well as the implementation of all OSC primitives.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
3a073540c2 gowin: Himbaechel. Add OSER10 and OVIDEO
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
dfb701b5ab gowin: Himbaechel. Add OSER8
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
5e9a96d358 gowin: Himbaechel. Add SERDES and differential IO
- experiment with notifyBelChange as an auxiliary cells reservation mechanism;
- since HCLK pips depend on the coordinates, and not on the tile type,
  the tile type is copied if necessary;
- information about supported types of differential IO primitives has
  been added to the extra information of the chip;

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
01044cc910 gowin: Himbaechel. Add redundant checks
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
03c413a27a gowin: Himbaechel. Add simplified IO
Add processing IO located on the sides of some chips. These are IOBUF,
which are converted into IBUF and OBUF not by fuses, but by signaling to
OE.

Also added the creation of a Global Set / Reset for all chips, instead
of a list of tile types, information from the apicula database is used,
and minor fixes.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
df13104384 gowin: Himbaechel. Add extra chip data
To implement unusual IOs that have a dynamically changing configuration
 it is convenient to store the switching method in the additional chip
 data.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
49f8620ac9 gowin: Himbaechel. Implement PLLs
- The global router is modified to work out the routing of PLL outputs and inputs;
- Added API function to change wire type after its creation - there was
  a need to unify all wires included in the node at the stage of node
  creation, when all wires have already been created.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
6eeac1cabf gowin: Himbaechel. Use pin functions info
Use information about pin functions in the clock router.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
b2ec06dfe8 gowin: Himbaechel. Implement the GSR primitive
On GW2A chips, the global set/reset is in its own cell.
Also corrections to ALU generation.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
6cac19c055 gowin: Himbaechel. Add constraint file processing.
- minor fixes for pinout saving;
- CST parser taken from generic-based apicula;
- $nextpnr IOB detachment is copied here because it is necessary to copy
  attributes from deleted bels.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
3d3039e25c gowin: Himbaechel. Add bundle data generation.
The pin data is only being populated so far, but not used.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
2930d80627 gowin: Himbaechel. Add a clock router.
Shamelessly adapted gatecat's router.
Very early version, not yet puzzled with recognizing clock sources and
controlling the type of wires involved.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
c4b3268e90 gowin: Himbaechel. Add the LUTRAM
- RAM16SDP1, RAM16SDP2 and RAM16SDP4 support;
    - Reading in these primitives is asynchronous, but we have taken
      measures so that DFF Bels remain unoccupied and they can be used
      to implement synchronous reading.
    - misc fixes.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
c9b23a01db gowin: Himbaechel. Add ALU.
- Added support for ALU running in "2" ADDSUB mode, the mode that yosys generates for gowin;
- Supports specifying an arbitrary input carry as well as passing the output carry to logic;
- A small restructuring of the source files.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
c82654d003 gowin: Himbaechel. Add a wideluts
- MUX2_LUT5, MUX2_LUT6, MUX2_LUT7 and MUX2_LUT8 support;
- storing a common class of files in extra_data;
- misc fixes.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
f7fbe0db04 gowin: Himbaechel, fix style
Run clang-format

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
e4d2e1bd85 gowin: add support for all DFF types
Himbaechel-gowin has learned how to place DFFs of all types by tracking
the compatibility of CLK, CE and LSR inputs, as well as placing mutually
compatible flip-flops in adjacent slices.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
ae89430075 gowin: add global VCC and VSS networks
- VSS and VCC sources in each cell are used;
- constant LUT inputs are disabled;
- putting the class declaration into a header file.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
fb5f764b85 gowin: Add himbaechel arch
- wires, nodes and whites are generated from bases - apicula;
- roting of SN and EW bidirectional wires is supported;
- supports "wrapping" the wires at the edges of the chip;
- LUT1-4 and two types of DFF(R) are supported;
- simple IO is supported.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
24e1734999 generate bba
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-08-31 08:28:09 +02:00
YRabbit
bc7cd4f20e wip start 2023-08-31 08:28:09 +02:00
Miodrag Milanovic
b9592093b5 Update examples to synth_lattice 2023-08-30 16:27:17 +02:00
Miodrag Milanovic
5497a37de1 VLO,VHI support for ECP5 2023-08-29 10:05:30 +02:00
Miodrag Milanovic
688f1ba983 widelut support for xo2/xo3/xo3d 2023-08-29 10:04:58 +02:00
gatecat
e08471dfaf router2: Improve robustness when critical nets conflict
Signed-off-by: gatecat <gatecat@ds0.me>
2023-08-24 09:20:44 +02:00
gatecat
977180524a nexus: More DPHY clock ports that require general routing hop
Signed-off-by: gatecat <gatecat@ds0.me>
2023-08-23 11:42:39 +02:00
gatecat
a01e2c9068 nexus: Be robust to parameters shorter than expected
Signed-off-by: gatecat <gatecat@ds0.me>
2023-08-23 11:42:39 +02:00
rowanG077
053dfc98f0 use std::numeric_limits instead of macros 2023-08-18 09:15:37 +02:00
rowanG077
1fdd683344 Do not use C++20 struct initilisation 2023-08-18 09:15:37 +02:00
rowanG077
240f89081f Add back error/warning for combinational loops 2023-08-18 09:15:37 +02:00
rowanG077
d2a489d5e9 Remove old timing analyser 2023-08-18 09:15:37 +02:00
rowanG077
b0820eeaaa Formatting and display async path in json report 2023-08-18 09:15:37 +02:00
rowanG077
cfd3a52a3c tmg: add timing_report 2023-08-18 09:15:37 +02:00
rowanG077
596873c302 tmg: Add net_timings, crit path and slack hist 2023-08-18 09:15:37 +02:00
rowanG077
8b51674a6b Add critical path report to modern timing engine 2023-08-18 09:15:37 +02:00
rowanG077
d9f009b570 Split timing into old and new code 2023-08-18 09:15:37 +02:00
gatecat
88714c54ec ecp5: Fix TQFP144 package import
Signed-off-by: gatecat <gatecat@ds0.me>
2023-08-17 16:28:35 +02:00
Miodrag Milanovic
053d89570f Use type name directly 2023-08-17 11:18:45 +02:00
Miodrag Milanovic
adacaf65f4 additional new constants 2023-08-17 11:18:45 +02:00
Miodrag Milanovic
83f65169a3 different oscilator for XO3D 2023-08-17 11:18:45 +02:00
Aki Van Ness
679b662a2b Added a code of conduct, which was taken from the YosysHQ/yosys repo 2023-08-08 16:52:08 +02:00
gatecat
54b2045726 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2023-06-20 10:58:18 +02:00
rowanG077
914999673c Rip out budgets 2023-06-20 10:57:10 +02:00
YRabbit
77afaf23a5 gowin: use the correct version of apicula 2023-06-20 10:48:48 +02:00
YRabbit
1260f2f7d7 gowin: Add support for GW2A series chips
* Limited to Tangprimer 20k or GW2A-LV18PG256C8/I7 chip.
* Clock lines are disabled.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-06-20 10:48:48 +02:00
Lofty
cbd6496d35 router2: fix 8935c186 (again) 2023-06-19 13:47:23 +02:00
Meinhard Kissich
6c0b4443d5 Removes unnecessary argument 2023-06-16 16:46:09 +02:00
Meinhard Kissich
bbe9ea9d65 gowin: fixes default networks 2023-06-16 16:46:09 +02:00
Lofty
787fac7649 router2: fix 8935c186 2023-06-14 03:40:48 +01:00
Lofty
71a6b99633 router2: revisit nodes with lower delay 2023-06-13 08:24:01 +01:00
Lofty
8935c1867f router2: revisit nodes with lower cost 2023-06-13 08:24:01 +01:00
rowanG077
863ad4cee8 Add .cache used by clangd to gitignore 2023-06-12 14:11:36 +02:00
rowanG077
68a2b2710f Add nix shell 2023-06-12 14:11:36 +02:00
rowanG077
8a79a3522c build: Flatten include dirs when building comp db 2023-06-12 14:11:36 +02:00
rowanG077
cb4846a58d build: push INSTALL_PREFIX from env to cmake var 2023-06-12 14:11:36 +02:00
Rowan Goemans
0f947ee693
Timing: Fix combinational paths through all ports (#1175)
Fixes https://github.com/YosysHQ/nextpnr/issues/1174
2023-06-12 10:25:01 +02:00
Rowan Goemans
5b958c4d80
Analyse async paths in TimingAnalyser (#1171) 2023-06-09 08:01:47 +02:00
Lofty
119b47acf3 mistral: add 8x40-bit M10K addressing mode 2023-05-31 00:49:27 +01:00
Lofty
c5666c47fe mistral: fix corner cases related to 13x1-bit M10Ks 2023-05-29 20:02:41 +01:00
Lofty
e5a5de53c1 mistral: fallback to guess if simulator has no waveform 2023-05-25 18:35:52 +01:00
Lofty
5936464967
router2: add alternate weight option (#1162) 2023-05-25 10:47:10 +02:00
Lofty
7912a61ce3
mistral: rework delay estimate (#1161) 2023-05-22 13:01:20 +02:00
gatecat
7dafd4da58 mistral: Fix uninitialised comb_out for plain LUTs
Signed-off-by: gatecat <gatecat@ds0.me>
2023-05-22 09:44:38 +02:00
Meinhard Kissich
f03da6568b
Fix segfault when clocking a FF from a ring oscillator (#1160)
* fix segfault when clocking a FF from a ring osc

* Change std::set to pool

Co-authored-by: Lofty <dan.ravensloft@gmail.com>

---------

Co-authored-by: Meinhard Kissich <meinhard.kissich@tugraz.at>
Co-authored-by: Lofty <dan.ravensloft@gmail.com>
2023-05-22 09:39:05 +02:00
gatecat
1d3e5151ba clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2023-05-19 09:00:31 +02:00
YRabbit
354b7daf12
gowin: implement differential IO primitives (#1159)
* gowin: implement differential IO primitives

Adds missing TLVDS_IBUF/IOBUF/TBUF primitives, as well as all kinds of
LVDS emulation primitives.

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

* gowin: fix build

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

* gowin: support as differential not only pins A and B

The GW1N-1 and GW1NZ-1 chips have cells with pins up to I, we provide
support for such pins.

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

---------

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-05-19 08:59:19 +02:00
Lofty
7a827b1c78 mistral: improve timing calculation 2023-05-17 20:38:03 +02:00
gatecat
ea925f39fb archapi: Add getArcDelayOverride
Signed-off-by: gatecat <gatecat@ds0.me>
2023-05-17 09:54:14 +01:00
gatecat
98121308e0 mistral: Don't allow route-through LUTs in carry-mode ALMs
Signed-off-by: gatecat <gatecat@ds0.me>
2023-05-17 10:31:52 +02:00
gatecat
bc7b8b63ed mistral: Add a basic global clock router
Signed-off-by: gatecat <gatecat@ds0.me>
2023-05-16 18:17:06 +02:00
Nathaniel Quillin
ca2e328a5f rename c++20 keyword s/requires/requires_range.
See https://en.cppreference.com/w/cpp/language/requires for more details.
2023-05-16 12:43:40 +02:00
gatecat
57b923a603 himbächel: Initial implementation
Signed-off-by: gatecat <gatecat@ds0.me>
2023-05-13 08:26:41 +02:00
gatecat
e3529d3356 machxo2: Global placement and clock routing from nexus
Signed-off-by: gatecat <gatecat@ds0.me>
2023-05-08 10:38:16 +02:00
Miodrag Milanovic
91771895b6 Removed not tested/used code 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
0067bcc615 use latest trellis and add arch tests 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
10595726c1 fix warning 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
e012f7b4f8 update prjtrellis version 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
8fd4735292 handle some SYSCONFIG 2023-05-04 14:23:08 +02:00
gatecat
655aee1f9d Fix invalid accesses during certain IO packing cases 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
582cd526ac display freq with two digits after decimal point 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
909917cb61 Add clock constraints for new primitives 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
90a6578c53 handle VLO and VHI 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
a2d08dc79e Made PDPW8KC to work 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
01c631870e pio and iologic missing constants 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
d7c2eb3fae Fix warning 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
8c19e6f83a clangformat 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
7ac3d0d901 basic support for few small primitives 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
2a35f0292a add constants for new primitives 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
c6f1f124f2 removed commented and not used code 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
3281ca6717 Add missing muxes for BRAM 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
437b57a510 Added getBelGlobalBuf 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
8c38e7ba61 Working BRAM 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
3a7770dca2 Add missing bel pins 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
19176ab597 Made PLL to work 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
1b3283fb7c Add constants for new bels 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
a79c2f3209 Add additional pic tiles 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
4b3ae70ca8 support DCC and use spine data 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
c04c961949 Import spine data 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
9121880c5f added a comment for constraining FF location 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
5e3fe3a4dc do not support FF on slice C when there is dpram 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
55518011e3 ramw and dram changes according to @gatecat 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
6ec3423405 LSRONMUX disable if not used by FF 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
510d92e01b cleanup FF and made DPRAM work in simple case 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
b6bb0cd5b8 Update CMakeList for machxo2 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
80c461bddd add write_bitstream to pybindings 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
05a191a014 Added LPF support 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
a0ba9afcba CCU2D is auto tied low 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
aacb36bf15 Use CCU2D cell 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
a00f810093 fix 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
6f85053b03 more like ecp5 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
3624fe90b2 one step closer 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
6508a0c267 This should not be here 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
153144022f More of making it inline 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
ca3d32e5ac make source more inline with ecp5 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
62ace58204 add missing bind and lutperm 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
7f8518d938 Import lutperm data 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
442142a47a typo fixes 2023-05-04 14:23:08 +02:00
Lofty
398b2ab569 bitstream emission update 2023-05-04 14:23:08 +02:00
Lofty
235a575267 port ecp5 split slice to machxo2 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
b033b915a6 Add bitgen for the rest of XO2 and XO3 2023-05-04 14:23:08 +02:00
Lofty
89c71bc8ac bitstream fixes for xo3 2023-05-04 14:23:08 +02:00
Miodrag Milanovic
80705e9bbb Support enabling XO3 and XO3D 2023-05-04 14:23:08 +02:00
YRabbit
051bdb12b3 gowin: fix style
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-04-20 08:35:50 +02:00
YRabbit
729757d55e gowin: fix style
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-04-20 08:35:50 +02:00
YRabbit
fdc2769259 gowin: add a common mechanism for placing ports
If the port is in a different cell than the primitive, then use the alias mechanism.
Considerably compact code for OSC as an example.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-04-20 08:35:50 +02:00
YRabbit
71192dc7a3 gowin: Remove inherited code for ODDR(c)
Implement ODDR(c) as part of IOLOGIC and remove all old code associated
with those primitives.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-04-14 09:23:00 +02:00
gatecat
b0a78de78f fabulous: Support for configurable LUT size
Signed-off-by: gatecat <gatecat@ds0.me>
2023-04-13 13:29:52 +02:00
YRabbit
62b8baa959 gowin: Fix style
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-04-12 14:35:17 +02:00
YRabbit
fddacb3dc1 gowin: implement IDES16 and OSER16 primitives
These are very cumbersome primitives that take up two cells and
consequently 4 IOLOGIC bels.
The primitives are implemented for the chips that contain them and are
supported by apicula GW1NSR-4C, GW1NR-9 and GW1NR-9C.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-04-12 14:35:17 +02:00
gatecat
7557d33dc6 ecp5: Fix invalid accesses during certain IO packing cases
Signed-off-by: gatecat <gatecat@ds0.me>
2023-04-12 06:56:59 +02:00
gatecat
6455b5dd26 viaduct: Add support for GUIs
Signed-off-by: gatecat <gatecat@ds0.me>
2023-04-11 19:11:54 +02:00
YRabbit
9bcefe46a8 gowin: Add implementation of IDDR and IDDRC primitives
Simple deserialization primitives are implemented for all supported boards.

Compatible with older apicula bases.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-04-06 08:41:54 +02:00
gatecat
23f2877dde fabulous: Fix bel names for pass bels in v2 format
Signed-off-by: gatecat <gatecat@ds0.me>
2023-04-05 15:45:18 +02:00
YRabbit
20b7f760d9 gowin: Add support for IDES primitives
* placement of IDES4, IVIDEO, IDES8 and IDES10 primitives is supported;
* primitives are implemented for the GW1N-1, GW1NZ-1, GW1NSR-4C,
  GW1NR-9, GW1NR-9C chips;
* tricks required for IOLOGIC to work on one side of the -9 and -9C
  chips are taken into account;

Compatible with old apicula bases.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-04-04 10:00:08 +02:00
YRabbit
b36e8a3013 gowin: bugfix
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-03-23 12:37:53 +01:00
YRabbit
c52906e8bc gowin: Rename questionable ports
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-03-23 12:37:53 +01:00
YRabbit
38eb1f05ff gowin: Change the way errors are processed
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-03-23 12:37:53 +01:00
YRabbit
95ace0fade gowin: Add support for OSER primitives
* placement of OSER4, OVIDEO, OSER8 and SER10 primitives is supported;
* primitives are implemented for the GW1N-1, GW1NZ-1, GW1NSR-4C,
  GW1NR-9, GW1NR-9C chips;
* the initial support for special HCLK clock wires is implemented to the
  extent necessary for OSER primitives to function;
* output to both regular IO and TLVDS_OBUF is supported;
* tricks required for IOLOGIC to work on one side of the -9 and -9C
  chips are taken into account;
* various edits, such as using idf() instead of the local buffer.

Compatible with old apicula bases.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-03-23 12:37:53 +01:00
gatecat
b3c33bd0ab ice40: Fix BRAM NegClk bitstream logic
Signed-off-by: gatecat <gatecat@ds0.me>
2023-03-20 18:54:57 +01:00
Miodrag Milanovic
d7e450b7b6 Update prjtrellis 2023-03-20 09:53:35 +01:00
Miodrag Milanovic
35eeaa7cc5 Add ramaining PIO tiles 2023-03-20 09:53:35 +01:00
Miodrag Milanovic
3f4c8d15d9 Use unified io location data 2023-03-20 09:53:35 +01:00
Miodrag Milanovic
0ce72e1a31 Use TRELLIS primitives 2023-03-20 09:53:35 +01:00
Miodrag Milanovic
ad5f6fccaa Use RelSlice, make more in line with ecp5 arch 2023-03-20 09:53:35 +01:00
gatecat
e4fcd3740d cmake: Make HeAP placer always-enabled
Signed-off-by: gatecat <gatecat@ds0.me>
2023-03-17 10:38:11 +01:00
gatecat
4111cc25d6 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2023-03-17 09:31:38 +01:00
Miodrag Milanovic
656bfdb819 Update prjtrellis to latest 2023-03-16 15:19:48 +01:00
Miodrag Milanovic
d337ab93e6 Update to latest prjtrellis 2023-03-16 13:37:23 +01:00
Miodrag Milanovic
11a90aff83 Fix out of tree builds and place h in generated 2023-03-16 13:37:23 +01:00
Miodrag Milanovic
f008d7c4d8 Let top tiles be on top 2023-03-16 13:37:23 +01:00
Miodrag Milanovic
6eb5f2a77e Enable wires and add dummy wire type for now 2023-03-16 13:37:23 +01:00
Miodrag Milanovic
1f115ddd32 Basic GUI part selection 2023-03-16 13:37:23 +01:00
Miodrag Milanovic
26798038fe Fix examples 2023-03-16 13:37:23 +01:00
Miodrag Milanovic
7ad9914e51 Extend chipdb with metadata 2023-03-16 13:37:23 +01:00
Miodrag Milanovic
d5b5f7e4b2 add new field handling in chip config format 2023-03-16 13:37:23 +01:00
Miodrag Milanovic
4396a646a7 Add simple BEL graphics 2023-03-16 13:37:23 +01:00
Miodrag Milanovic
26f23e3121 Make small GUI changes 2023-03-16 13:37:23 +01:00
Miodrag Milanovic
18ad718e53 Expand list of possible devices 2023-03-16 13:37:23 +01:00
Miodrag Milanovic
12911a7470 Remove anoying warning from cmake 2023-03-16 13:37:23 +01:00
gatecat
ff14547601 ecp5: Update GUI rendering to match arch changes
Signed-off-by: gatecat <gatecat@ds0.me>
2023-03-16 13:13:57 +01:00
gatecat
39b6584274 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2023-03-16 11:27:08 +01:00
gatecat
132a98a91d router1: Add error when dest port has no wire
Signed-off-by: gatecat <gatecat@ds0.me>
2023-03-06 14:15:48 +01:00
gatecat
2f509734df fabulous: Misc improvements
Signed-off-by: gatecat <gatecat@ds0.me>
2023-02-28 21:39:25 +01:00
gatecat
cdd7bb676f fabulous: Support for complex flops in PnR
Signed-off-by: gatecat <gatecat@ds0.me>
2023-02-28 21:39:25 +01:00
gatecat
1dcc2f777d ice40: Add python binding for write_bitstream
Signed-off-by: gatecat <gatecat@ds0.me>
2023-02-28 18:46:35 +01:00
gatecat
5d0aa77861 fabulous: Add timing model for carries
Signed-off-by: gatecat <gatecat@ds0.me>
2023-02-27 08:42:56 +01:00
gatecat
26fcf349ad fabulous: LUT permutation support
Signed-off-by: gatecat <gatecat@ds0.me>
2023-02-27 08:42:56 +01:00
gatecat
14050f991b fabulous: Global constant wires scheme
Signed-off-by: gatecat <gatecat@ds0.me>
2023-02-23 10:05:55 +01:00
Catherine
1809e18c7b CMake: detect platform support for threads 2023-02-23 10:05:44 +01:00
Catherine
ebbaf8c08d common: disable parallel refinement only without threads.
Previously it was always disabled on WebAssembly builds.
2023-02-23 09:45:19 +01:00
Catherine
8f0731edc9 common: update deprecated use of boost::filesystem::basename. 2023-02-23 09:44:46 +01:00
Catherine
088c822e28 CMake: check if warning flag is supported before use.
Clang 11 is failing on -Wno-format-truncation.
2023-02-23 09:44:29 +01:00
Catherine
e94479ccd5
Merge pull request #1108 from whitequark/fix-includes
common: add missing includes for libc++
2023-02-23 04:13:10 +00:00
Catherine
4b4f4a7da1 common: add missing includes for libc++. 2023-02-23 02:32:19 +00:00
myrtle
0c4e0d4312
Merge pull request #1106 from YosysHQ/gatecat/fab_carry
fabulous: Add support for packing carry chains
2023-02-21 15:47:17 +01:00
gatecat
0ed964247e fabulous: Add support for packing carry chains
Signed-off-by: gatecat <gatecat@ds0.me>
2023-02-21 14:41:48 +01:00
myrtle
03b6fb3ddb
Merge pull request #1103 from rodgert/master
Include <cstdint> in common/kernel/hashlib.h
2023-02-21 11:50:43 +01:00
myrtle
19fec70aa3
Merge pull request #1105 from YosysHQ/gatecat/nexus-io-error
nexus: Check IO-bank compatibility
2023-02-21 11:50:34 +01:00
gatecat
61021a22ee nexus: Check IO-bank compatibility
Signed-off-by: gatecat <gatecat@ds0.me>
2023-02-21 11:18:35 +01:00
Thomas W Rodgers
825d646196 Include <cstdint> in common/kernel/hashlib.h
The definitions for uint32_t, uint64_t report as undefined when
compiling under GCC13. They were previously found by transitive
includes, but this is not guaranteed to work, and GCC13 forced
the issue.
2023-02-18 10:26:01 -08:00
gatecat
16bcc51ffb fabulous: Further tweak magic numbers
Signed-off-by: gatecat <gatecat@ds0.me>
2023-02-16 15:53:15 +01:00
myrtle
2275ff78e2
Merge pull request #1102 from rowanG077/print-random-seed
common: Print out generated seed value
2023-02-16 12:55:28 +01:00
myrtle
c65762b5c2
Merge pull request #1101 from YosysHQ/gatecat/fab-fake-timings
fabulous: Add fake timings
2023-02-16 12:18:00 +01:00
rowanG077
32e818204e common: Print out generated seed value 2023-02-16 12:02:00 +01:00
gatecat
06b675b345 fabulous: Add fake timings
Signed-off-by: gatecat <gatecat@ds0.me>
2023-02-16 11:56:58 +01:00
myrtle
78dabb7b8f
Merge pull request #1092 from rowanG077/werror
common: Implement Werror flag
2023-02-14 15:03:57 +01:00
Catherine
57693bcb7f
Update links to IceStorm in README
Fixes #1099.
2023-02-14 05:47:16 +00:00
myrtle
dd9426606a
Merge pull request #1098 from YosysHQ/lofty/fix-machxo2-pybindings
machxo2: Fix Python bindings for pip iterators
2023-02-13 14:07:51 +01:00
Lofty
52b02f7377 machxo2: Fix Python bindings for pip iterators 2023-02-13 12:49:00 +00:00
rowanG077
3608c3eb02 common: Implement Werror flag 2023-02-13 10:52:05 +01:00
myrtle
b5125aac31
Merge pull request #1090 from rowanG077/ecp5-propagate-dcsc-clk-ct
ecp5: Propagate clock constraints through DCSC
2023-02-13 10:25:07 +01:00
myrtle
ba3801e010
Merge pull request #1097 from YosysHQ/gatecat/fab-bram-fix
fabulous: Improve names for BRAM bels
2023-02-10 13:41:36 +01:00
gatecat
eb70e95079 fabulous: Improve names for BRAM bels
Signed-off-by: gatecat <gatecat@ds0.me>
2023-02-10 13:23:31 +01:00
myrtle
1226fad4f6
Merge pull request #1096 from YosysHQ/gatecat/ecp5-ioce-fix
ecp5: Handle the case where both CE are the same constant
2023-02-10 07:29:10 +01:00
gatecat
a8a88d4813 ecp5: Handle the case where both CE are the same constant
Signed-off-by: gatecat <gatecat@ds0.me>
2023-02-09 11:12:15 +01:00
myrtle
a93f49eb04
Merge pull request #1094 from uis246/master
gowin: Add bels for new types of oscillators
2023-02-07 09:20:59 +01:00
uis
69fe654f02 gowin: Add bels for new types of oscillator 2023-02-06 21:45:55 +00:00
rowanG077
9e8f8b7b45 streamline constant_net detection 2023-02-06 17:05:28 +01:00
rowanG077
d2bf44ba45 ecp5: DSCS clock propagation if modesel is 0 constant 2023-02-06 16:27:45 +01:00
myrtle
48b0025732
Merge pull request #1087 from yrabbit/gw1nr-9
gowin: Add PLL support for the GW1NR-9 chip
2023-02-02 08:30:56 +00:00
YRabbit
2edc77836d Merge branch 'master' into gw1nr-9 2023-02-02 07:35:38 +10:00
rowanG077
a38ee0786a ecp5: Propagate clock constraints through DSCS 2023-02-01 19:12:10 +01:00
myrtle
f328130c0a
Merge pull request #1089 from smunaut/icegate
ice40: Add support for PLL ICEGATE function
2023-02-01 14:34:29 +00:00
Sylvain Munaut
582410629b ice40: Don't assert on unknown extra_config bits if they are 0
Bits are 0 by default anyway, so if they are unknown (because icestorm
is too od) but we want them at 0 ... it's not much of an issue.

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2023-02-01 15:14:18 +01:00
Sylvain Munaut
49ae495344 ice40: Add support for PLL ICEGATE function
Technically you can enable it independently on CORE and GLOBAL
output, but this is not exposed in the classic primitive, so
we do the same as icecube2 and enable/disable it for both output
path depending on the argument

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2023-02-01 11:41:35 +01:00
myrtle
235e0d28e9
Merge pull request #1088 from rowanG077/ecp5-singleton-lpf
ecp5: LOCATE in LPF works on singleton vector
2023-01-31 22:29:11 +00:00
rowanG077
803c57d052 ecp5: LOCATE in LPF works on singleton vector 2023-01-31 21:05:32 +01:00
YRabbit
5d5ea57e21 gowin: Add PLL support for the GW1NS-2C chip
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-01-31 18:46:38 +10:00
YRabbit
aac36ecf3f gowin: Add PLL support for GW1NR-4 chips
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-01-31 08:58:33 +10:00
myrtle
bfa3e047ce
Merge pull request #1086 from smunaut/out_z
ice40: Improve `output` handling vs pull-ups and undriven
2023-01-30 22:06:58 +00:00
YRabbit
2829a7d70a gowin: Proper use of the C++ mechanisms
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-01-30 18:59:09 +10:00
YRabbit
6a1212a1e1 gowin: Add PLL support for the GW1NR-9 chip
And also unified the fixing of PLL to bels: the point is that PLL being
at a certain location has the possibility to use a direct implicit wire
to the clock source, but once we decide to use this direct wire, the PLL
can no longer be moved.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-01-30 12:49:57 +10:00
Sylvain Munaut
f50d4c1ed1 ice40: Support for undriven / unconnected output ports
If a port specified as output (and thus had a $nextpnr_obuf inserted)
is undriven (const `z` or const `x`), we make sure to not enable
the output driver. Also enable pull-ups if it was requested by the user.

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2023-01-29 22:35:19 +01:00
Sylvain Munaut
0cf5006e3b ice40: Rework pull-up attribute copy to SB_IO blocks
We try to copy the attribute only when there is a chance for
the output driver to not be active.

Note that this can _also_ happen when a port is specified as
output but has a TBUF, which the previous code wasn't handling.

We could copy the attribute "all-the-time" but this would
mean if a user specified a `-pullup yes` in the PCF for a
permanently driven output pin, we'd be burning power for
nothing.

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2023-01-29 22:35:19 +01:00
myrtle
f80b871dd5
Merge pull request #1084 from YosysHQ/gatecat/ecp5-ioff-fix
ecp5: Improve IOFF CE handling robustness
2023-01-27 11:20:45 +01:00
myrtle
d661d117af
Merge pull request #1085 from yrabbit/gw1nr-9c-pll
gowin: Add PLL support for the GW1NR-9C chip
2023-01-27 11:20:35 +01:00
YRabbit
2d45d57b32 gowin: Add PLL support for the GW1NR-9C chip
This chip is used in the Tangnano9k board.

  * all parameters of the rPLL primitive are supported;
  * all PLL outputs are treated as clock sources and optimized routing
    is applied to them;
  * primitive rPLL on different chips has a completely different
    structure: for example in GW1N-1 it takes two cells, and in GW1NR-9C
    as many as four, despite this unification was carried out and
    different chips are processed by the same functions, but this led to
    the fact that you can not use the PLL chip GW1N-1 with the old
    apicula bases - will issue a warning and refuse to encode primitive.
    In other cases compatibility is supported.
  * Cosmetic change: the usage report shows the rPLL names without any
    service bels.
  * I use ctx->idf() on occasion, it's not a total redesign.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-01-26 20:26:05 +10:00
gatecat
9b5e5f124c clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2023-01-25 10:29:32 +01:00
gatecat
c8cb063656 ecp5: Improve IOFF CE handling robustness
Signed-off-by: gatecat <gatecat@ds0.me>
2023-01-25 09:26:12 +01:00
myrtle
b9ed39bc1c
Merge pull request #1081 from danc86/eigen-cmake-imported-target
use eigen as an IMPORTED target in CMake
2023-01-24 16:33:54 +01:00
Dan Callaghan
4c7e805f18 use eigen as an IMPORTED target in CMake
Eigen considers the EIGEN3_INCLUDE_DIRS and EIGEN3_DEFINITIONS variables
to be deprecated and they will no longer be exported in the next release
after 3.4.0:
f2984cd077

Use the IMPORTED target instead, which seems to be the preferred way of
consuming third-party CMake libraries.
2023-01-24 13:11:50 +11:00
myrtle
985c688bf6
Merge pull request #1080 from YosysHQ/gatecat/missing-includes
Add missing <set> includes
2023-01-23 08:51:31 +01:00
gatecat
7845b66512 Add missing <set> includes
Signed-off-by: gatecat <gatecat@ds0.me>
2023-01-20 09:04:41 +01:00
myrtle
06eaffc57c
Merge pull request #1077 from yrabbit/gw1nsr-4c_0
gowin: add a PLL primitive for the GW1NS-4 series
2023-01-19 06:44:46 +01:00
YRabbit
cc45f5ec48 gowin: improve error message
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-01-19 07:12:39 +10:00
YRabbit
ba4d7b1e9a gowin: to use the FB network detection function
The chip used in tangnano4k does not have such pins, but we call the
function anyway in the expectation of other chips.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-01-19 06:31:55 +10:00
myrtle
dc2dac1f9e
Merge pull request #1078 from YosysHQ/gatecat/route-delay-quad
context: Add getNetinfoRouteDelayQuad
2023-01-18 17:19:20 +01:00
gatecat
6079326633 context: Add getNetinfoRouteDelayQuad
Signed-off-by: gatecat <gatecat@ds0.me>
2023-01-18 16:28:33 +01:00
YRabbit
b22eebac30 gowin: add a PLL primitive for the GW1NS-4 series
* both instances of the new PLLVR type are supported;
  * primitive placement is optimized for the use of dedicated PLL clock
    pins;
  * all 4 outputs of each primitive can use the clock nets (only 5 lines
    in total at the same time so far).

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-01-18 19:18:02 +10:00
myrtle
a46afc6ff8
Merge pull request #1076 from adamgreig/ecp5-dsp-remap
ECP5: Add DSP signal remapping
2023-01-04 20:01:05 +01:00
Adam Greig
8d8c244e00
Add remapping of DSP clk/ce/rst signals in a block.
Each DSP block contains two slices, and each slice contains multiple
MULT18X18D and ALU54B units. Each unit configures each register to use
any of CLK0/1/2/3, CE0/1/2/3, and RST0/1/2/3 ports, and the ports are
connected per unit (so for example, two MULTs in the same block could
connect their CLK0s to different external signals). However, the
hardware only has one actual port per block, so it's required that
all CLK0 signals within a block are the same.

Because the packer is in general allowed to combine two unrelated units
into one block, it may end up combining units that use different signals
for the same port, which would eventually have caused a router failure.

This commit adds validity checks which ensure only unique signals are
used per block, and adds remapping so that conflicting signals are
automatically reassigned when possible and required.
2023-01-04 18:34:30 +00:00
Adam Greig
174848b4b3
Include ALU54B in cell types with wire location overrides 2023-01-04 13:48:39 +00:00
gatecat
f89b959b5f clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2023-01-02 09:33:11 +01:00
myrtle
5cea801a2f
Merge pull request #1075 from YosysHQ/gatecat/ecp5-lpf-errors
ecp5: Improve error handling for missing end-"
2023-01-02 09:25:14 +01:00
gatecat
d210a5aded ecp5: Improve error handling for missing end-"
Signed-off-by: gatecat <gatecat@ds0.me>
2023-01-02 08:39:00 +01:00
myrtle
3338227ef7
Merge pull request #1073 from yrabbit/doc
doc: fix the list format
2023-01-01 10:21:40 +01:00
YRabbit
7c4f44c783 doc: fix the list format
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2023-01-01 10:26:28 +10:00
myrtle
eaf2bc8bdd
Merge pull request #1071 from yrabbit/to-float
gowin: bugfix and improved clock router
2022-12-30 11:58:39 +01:00
YRabbit
b8ab3116b2 gowin: improve clock wire routing
The dedicated router for clock wires now understands not only the IO
pins but also the rPLL outputs as clock sources.

This simple router sets an optimal route, so it is now the default
router. It can be disabled with the --disable-globals command line flag
if desired, but this is not recommended due to possible clock skew.

Still for GW1N-4C there is no good router for clock wires as there
external quartz resonator is connected via PLL.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-12-30 11:55:39 +10:00
YRabbit
8424dc79d2 gowin: correct the delay calculation
And do a full enumeration when searching for a delay because it is not
yet clear whether the orderliness of the vector is guaranteed.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-12-29 11:17:45 +10:00
myrtle
0004cd54db
Merge pull request #1069 from yrabbit/mistype
doc: fix a mistype
2022-12-27 15:32:09 +01:00
YRabbit
2e5c799566 doc: fix a mistype
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-12-23 17:14:26 +10:00
myrtle
76fea8268c
Merge pull request #1068 from YosysHQ/cleanup_and_sync
Cleanup and sync
2022-12-22 21:19:21 +01:00
Miodrag Milanovic
64f7306b24 initialize netShareWeight 2022-12-22 20:16:13 +01:00
Miodrag Milanovic
4af8964069 propagate netShareWeight 2022-12-22 16:11:10 +01:00
Miodrag Milanovic
bd628ce591 Remove deprecated functions 2022-12-22 15:26:39 +01:00
myrtle
a80d63b268
Merge pull request #1066 from arjenroodselaar/place_timeout
Timeout when legal placement can't be found for cell
2022-12-21 07:10:09 +00:00
myrtle
b101f0092c
Merge pull request #1067 from yrabbit/wasm
gowin: fix build for wasm
2022-12-21 07:09:27 +00:00
YRabbit
d6cbe4b7f8 gowin: fix build for wasm
A large number of global variables are not suitable for WASM, so
completely disable the graphics part where the main array of them is
used.  For other architectures GUI is still possible.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-12-21 16:13:08 +10:00
Arjen Roodselaar
be1f700b0b Set divisor instead of absolute value 2022-12-20 13:10:37 -08:00
Arjen Roodselaar
923458a2c9 Allow setting cell placement timeout 2022-12-20 11:15:06 -08:00
Arjen Roodselaar
d5299f144f Add --no-placer-timeout flag to override timeout during refinement 2022-12-19 22:58:52 -08:00
Arjen Roodselaar
2712cbf6e4 Increase timeout 2022-12-19 14:00:19 -08:00
myrtle
3ea3a931ca
Merge pull request #1065 from YosysHQ/gatecat/heap-chains-fix
heap: encourage more spreading of heterogenous chains
2022-12-19 08:44:26 +00:00
Arjen Roodselaar
6e0311efca Timeout when legal placement can't be found for cell 2022-12-17 16:07:57 -08:00
myrtle
78926b31db
Merge pull request #1064 from YosysHQ/gatecat/ecp5-main-fix
ecp5: Only write bitstream if --textcfg passed
2022-12-17 12:22:36 +00:00
gatecat
ccb573298c heap: encourage more spreading of heterogenous chains
Signed-off-by: gatecat <gatecat@ds0.me>
2022-12-17 10:50:20 +00:00
gatecat
bc18d18a95 ecp5: Only write bitstream if --textcfg passed
Signed-off-by: gatecat <gatecat@ds0.me>
2022-12-17 10:37:15 +00:00
myrtle
16ffd02a9d
Merge pull request #1061 from yrabbit/fix-clock-gui
gowin: not crush on unknown clock tap's sources
2022-12-14 08:00:02 +01:00
YRabbit
bc3d9f3108 gowin: not crush on unknown clock tap's sources
As preparation for possible changes to the clock wiring system.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-12-14 15:35:55 +10:00
myrtle
b5d30c7387
Merge pull request #1060 from yrabbit/pll-inputs
gowin: BUGFIX: Correctly handle resets
2022-12-09 09:27:58 +01:00
YRabbit
aa8359c73e gowin: BUGFIX: Correctly handle resets
When a single primitive occupies several cells, care must be taken when
manipulating the parameters of that primitive: when creating cells, each
cell must receive a copy of all the parameters and not modify them
unnecessarily.  That is, if possible, it is better to make all parameter
changes before dividing the primitive into cells.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-12-09 12:55:22 +10:00
myrtle
0eb53d59d8
Merge pull request #1059 from YosysHQ/gatecat/validity-errors
Add new option for verbose validity errors, use for ice40
2022-12-07 16:19:55 +01:00
Sean Anderson
df99b4ff6c ice40: Add debugs to isBelLocationValid for SB_IO
When there is a constraint conflict while placing IOs, the user gets an
error message such as

ERROR: Bel 'X0/Y27/io1' of type 'SB_IO' is not valid for cell 'my_pin' of type 'SB_IO'

While this identifies the problematic cell, it does not explain why
there is a problem. Add some verbose messages to allow users to
determine where the problem is. This can result in something like

Info: Net '$PACKER_VCC_NET' for cell 'my_pin' conflicts with net 'ce' for 'ce_pin'

which provides something actionable.

Signed-off-by: Sean Anderson <seanga2@gmail.com>
2022-12-07 10:32:38 +01:00
gatecat
603b60da8d api: add explain_invalid option to isBelLocationValid
Signed-off-by: gatecat <gatecat@ds0.me>
2022-12-07 10:27:58 +01:00
myrtle
519011533a
Merge pull request #1058 from YosysHQ/gatecat/bounds-refactor
refactor: rename ArcBounds -> BoundingBox and use this in HeAP
2022-12-07 10:26:17 +01:00
gatecat
d1afd6c0f1 heap: Remove custom bounding-box type
Signed-off-by: gatecat <gatecat@ds0.me>
2022-12-07 10:02:16 +01:00
gatecat
e260ac33ab refactor: ArcBounds -> BoundingBox
Signed-off-by: gatecat <gatecat@ds0.me>
2022-12-07 10:00:53 +01:00
myrtle
a342b96bb0
Merge pull request #1055 from yrabbit/pll-pins
gowin: add PLL pins processing
2022-12-06 21:20:59 +01:00
YRabbit
150a482b77 gowin: change the way networks are handled
Until a comprehensive clock router is developed, the order in which
private cases are handled is important.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-12-06 23:07:01 +10:00
myrtle
cd3b76e3f7
Merge pull request #1056 from YosysHQ/gatecat/generic-fix-consts
viaduct: Fix constant connectivity
2022-12-06 12:27:03 +01:00
gatecat
3a61bb4119 viaduct: Fix constant connectivity
Signed-off-by: gatecat <gatecat@ds0.me>
2022-12-06 10:04:59 +01:00
YRabbit
e6a8d0f4fc Merge branch 'master' into pll-pins 2022-12-04 21:33:36 +10:00
myrtle
db25c5c889
Merge pull request #1054 from YosysHQ/gatecat/api-add-const
api: Make NetInfo* of checkPipAvailForNet const
2022-12-04 12:27:53 +01:00
YRabbit
2e68962a02 gowin: add PLL pins processing
Uses the information of the special input pins for the PLL in the
current chip. If such pins are involved, no routing is performed and
information about the use of implicit wires is passed to the packer.

The RESET and RESET_P inputs are now also disabled if they are connected
to VSS/VCC.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-12-04 15:06:44 +10:00
gatecat
91454515f4 Unbreak CI
Signed-off-by: gatecat <gatecat@ds0.me>
2022-12-02 14:26:13 +01:00
gatecat
c62a947a28 api: Make NetInfo* of checkPipAvailForNet const
Signed-off-by: gatecat <gatecat@ds0.me>
2022-12-02 14:20:39 +01:00
myrtle
f07d9a1835
Merge pull request #1048 from yrabbit/chipdb-cfg
gowin: add information about pin configurations
2022-12-02 09:58:46 +01:00
YRabbit
b0791a01c9 gowin: update the apicula version
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-12-02 08:49:56 +10:00
YRabbit
7638146782 Merge branch 'master' into chipdb-cfg 2022-12-02 08:28:51 +10:00
myrtle
719f89806a
Merge pull request #1053 from YosysHQ/gatecat/pbfix
ecp5: Fix Python bindings for pip iterators
2022-11-28 09:45:11 +01:00
gatecat
6ee3daf06a ecp5: Fix Python bindings for pip iterators
Signed-off-by: gatecat <gatecat@ds0.me>
2022-11-28 09:00:41 +01:00
YRabbit
ec53ae0c3b gowin: add information about pin configurations
Includes information on additional pin functions such as RPLL_C_IN, GCLKC_3, SCLK and others.
This allows a decision to be made about special network routing of such pins

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-11-25 20:49:26 +10:00
myrtle
c61d490bd4
Merge pull request #1045 from yrabbit/unused-ports
gowin: mark the PLL ports that are not in use
2022-11-20 13:55:01 +01:00
YRabbit
378ca60a2f gowin: mark the PLL ports that are not in use
Unused ports are deactivated by special fuse combinations, rather than
being left dangling in the air.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-11-20 22:04:09 +10:00
myrtle
c8406b71fe
Merge pull request #1042 from yrabbit/add-z1
gowin: add support for a more common chip
2022-11-12 11:17:06 +01:00
YRabbit
d4642d918c gowin: add support for a more common chip
The GW1N-1 and GW1NZ-1 have a similar PLL, but the board with the former
chip is already very hard to buy, so let's experiment with a more
affordable chip.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-11-12 10:12:43 +10:00
myrtle
1aa9cda77a
Merge pull request #1040 from yrabbit/pll-stage0
gowin: add initial PLL support
2022-11-11 10:28:19 +01:00
YRabbit
9013b2de50 gowin: use ctx->idf() a bit
Replacing snprintf() with ctx->idf() in PLL commit, but not yet a
complete overhaul.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-11-11 09:19:16 +10:00
myrtle
79cb2f9e20
Merge pull request #1041 from YosysHQ/gatecat/fix-copy-warning
Fix "implicit copy constructor for 'Property' is deprecated"
2022-11-10 15:40:50 +01:00
gatecat
8a69bd0735 Fix "implicit copy constructor for 'Property' is deprecated"
Signed-off-by: gatecat <gatecat@ds0.me>
2022-11-10 10:57:41 +01:00
gatecat
6930ab3acd fabulous: Tweak delay estimate
Signed-off-by: gatecat <gatecat@ds0.me>
2022-11-10 10:55:37 +01:00
YRabbit
a84ded4793 gowin: add initial PLL support
The rPLL primitive for the simplest chip (GW1N-1) in the family is
processed. All parameters of the primitive are passed on to gowin_pack,
and general-purpose wires are used for routing outputs of the primitive.

Compatible with older versions of apicula, but in this case will refuse
to place the new primitive.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-11-10 19:14:41 +10:00
Miodrag Milanović
ac17c36bec
Merge pull request #1037 from YosysHQ/fix_python_ver
Fix python version in CI
2022-10-24 09:45:57 +02:00
Miodrag Milanovic
4ffa47d897 Fix python version in CI 2022-10-24 09:42:16 +02:00
Miodrag Milanovic
010b2e5ecf Update CI script 2022-10-24 09:28:34 +02:00
gatecat
445d32497d run clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2022-10-17 12:35:02 +02:00
myrtle
bd082132ce
Merge pull request #1034 from lushaylabs/support-windows-crlf
Support windows line endings in constraints for nextpnr-gowin
2022-10-17 12:33:33 +02:00
myrtle
c2dbaa2b11
Merge pull request #1035 from tyler274/patch-1
Correct Not Equal operator implementation in ice40
2022-10-17 10:43:34 +02:00
Tyler
613d84fb72
Correct Not Equal operator implementation in ice40
I noticed this during my work reimplementing nextpnr, and it seems to be dead and wrong, or at least dead. Either way I think this is what was intended unless anyone can correct me.
2022-10-17 01:19:51 -07:00
Lushay Labs
a7acda95f0
support windows line endings 2022-10-09 23:47:09 +03:00
myrtle
0d1ea9e6ed
Merge pull request #1032 from davidlattimore/registered-output-xform
nexus: Transform registered output parameters
2022-10-05 11:07:42 +02:00
David Lattimore
1602774d27 nexus: Transform registered output parameters
Dual ported:
OUTREG_A -> OUT_REGMODE_A
OUTREG_B -> OUT_REGMODE_B

Pseudo dual ported:
OUTREG -> OUT_REGMODE_B

Single ported:
OUTREG -> OUT_REGMODE_A
2022-10-05 14:40:49 +11:00
myrtle
41709dac8f
Merge pull request #1031 from YosysHQ/gatecat/fab-next
fabulous: Add support for the CLB muxes
2022-09-30 16:13:32 +02:00
gatecat
3826a31ad3 fabulous: Pack, validity check and FASM support for muxes
Signed-off-by: gatecat <gatecat@ds0.me>
2022-09-30 13:27:51 +02:00
gatecat
124c0fc812 fabulous: Add split MUX bels
Signed-off-by: gatecat <gatecat@ds0.me>
2022-09-30 12:03:16 +02:00
myrtle
c44b034fc3
Merge pull request #1030 from YosysHQ/gatecat/ice40-dsp25_10-fix
ice40: Fix handling of carry out route-thru via 25,14
2022-09-26 11:48:48 +02:00
gatecat
a16d184956 ice40: Fix handling of carry out route-thru via 25,14
Signed-off-by: gatecat <gatecat@ds0.me>
2022-09-26 09:33:38 +02:00
myrtle
f0f9070adb
Merge pull request #1029 from airskywater/airskywater-patch-1
Fix runtime segmentation fault
2022-09-24 10:30:30 +02:00
airskywater
9572f6f032
Modify code to meet the code style preferences 2022-09-24 14:46:35 +08:00
airskywater
c702e15a3f
Add more sanity check for pointers 2022-09-24 12:03:44 +08:00
airskywater
78f67ae5bc
fix runtime segmentation fault
disable null pointer dereference!
2022-09-24 11:35:40 +08:00
myrtle
f4e6bbd383
Merge pull request #1019 from antmicro/support-clock-relations
Support cross-domain clock relations in timing analyser
2022-09-20 15:55:43 +02:00
Maciej Kurc
9000c41c4b Added the --ignore-rel-clk option to control timing checks for cross-domain paths, formatted code
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2022-09-20 14:40:40 +02:00
myrtle
136ab81cbd
Merge pull request #1028 from YosysHQ/gatecat/router2-reserve-src
router2: Reserve source wire, too; ice40 fixes
2022-09-20 14:37:55 +02:00
gatecat
a920ffcf70 ice40: implement checkPipAvailForNet
Signed-off-by: gatecat <gatecat@ds0.me>
2022-09-20 14:15:10 +02:00
gatecat
415c097df8 router2: Reserve source wire, too
Signed-off-by: gatecat <gatecat@ds0.me>
2022-09-20 13:42:51 +02:00
gatecat
376cedd558 fabulous: fix, but disable, IO configuration
Signed-off-by: gatecat <gatecat@ds0.me>
2022-09-16 09:32:15 +02:00
myrtle
a3a641f449
Merge pull request #1026 from YosysHQ/gatecat/ecp5-bitstream-refactor
ecp5: Split bitstream generation into more functions
2022-09-16 09:16:35 +02:00
myrtle
d58e85f297
Merge pull request #1023 from YosysHQ/gatecat/ice40up-bram-pol
ice40: Fix UltraPlus BRAM clock polarity
2022-09-16 06:38:04 +02:00
myrtle
e5da8be4f8
Merge pull request #1025 from YosysHQ/gatecat/nexus-dev-fixes
nexus: Add ES2 device names and --list-devices
2022-09-15 18:03:57 +02:00
gatecat
9e272810d8 ecp5: Split bitstream generation into more functions
Signed-off-by: gatecat <gatecat@ds0.me>
2022-09-15 13:28:43 +02:00
gatecat
7ca3ba3835 nexus: Add ES2 device names and --list-devices
Signed-off-by: gatecat <gatecat@ds0.me>
2022-09-15 12:27:36 +02:00
myrtle
79aad0988a
Merge pull request #1015 from YosysHQ/gatecat/fabulous-viaduct
fabulous: Add a viaduct uarch
2022-09-15 09:07:56 +02:00
myrtle
3983d4fe53
Merge pull request #1024 from YosysHQ/gatecat/pybind11-bump
3rdparty: Bump vendored pybind11 version for py3.11 support
2022-09-15 09:06:35 +02:00
gatecat
a72f898ff4 3rdparty: Bump vendored pybind11 version for py3.11 support
Signed-off-by: gatecat <gatecat@ds0.me>
2022-09-14 09:28:47 +02:00
gatecat
0a8c411692 ice40: Fix UltraPlus BRAM clock polarity
Signed-off-by: gatecat <gatecat@ds0.me>
2022-09-14 09:24:49 +02:00
gatecat
f423055390 fabulous: Add a viaduct uarch
Signed-off-by: gatecat <gatecat@ds0.me>
2022-09-09 14:48:57 +02:00
Maciej Kurc
1f1bae3e23 Code cleanup
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2022-08-31 16:19:15 +02:00
Maciej Kurc
60a6e8b070 Added timing check for cross-domain paths for related clocks
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2022-08-31 14:15:33 +02:00
Maciej Kurc
9a61ad9234 Augmented TimingAnalyser class with detection of clock to clock relations
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2022-08-30 17:30:58 +02:00
Maciej Kurc
8b6be09809 Fixed port timing classes of DCC ports in the Nexus architecture
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2022-08-30 17:30:13 +02:00
myrtle
f1349e114f
Merge pull request #1018 from yrabbit/bf-0
gowin: BUGFIX. Really memorize the chip
2022-08-25 11:14:50 +02:00
YRabbit
e0539f0ed7 gowin: BUGFIX. Really memorize the chip
When it really needed to distinguish between the chips, this
unforgivable error was discovered :)

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-08-25 11:52:29 +10:00
myrtle
0f4166fedb
Merge pull request #1017 from YosysHQ/routerfix
Router fix
2022-08-22 13:31:11 +02:00
Miodrag Milanovic
a00b997cf1 add missing overrides 2022-08-22 12:35:24 +02:00
Miodrag Milanovic
1aa797b820 Fix parameter order 2022-08-22 12:32:50 +02:00
myrtle
ccf4367209
Merge pull request #1016 from atsampson/python3
Use CMake's Python3 rather than PythonInterp in subdirs
2022-08-21 20:53:10 +02:00
Adam Sampson
19160f10ae Use CMake's Python3 rather than PythonInterp in subdirs 2022-08-21 17:48:01 +01:00
gatecat
05167fcb8b pybindings: Mark CellInfo::bel as readonly
bel bindings should be updated with bindBel/unbindBel during placement, or setting the BEL attribute for constraints before placement.

Fixes #522

Signed-off-by: gatecat <gatecat@ds0.me>
2022-08-18 15:09:41 +02:00
myrtle
5c93d71c2a
Merge pull request #1014 from LAK132/master
Replace deprecated method of finding Python 3
2022-08-18 14:33:26 +02:00
LAK132
ae8966040b Replace deprecated method of finding Python 3 2022-08-17 01:07:14 +09:30
myrtle
b9b16eaa53
Merge pull request #1013 from YosysHQ/gatecat/viaduct-args
viaduct: Allow passing command line options to uarch with -o
2022-08-15 12:41:09 +02:00
gatecat
47da562600 viaduct: Allow passing command line options to uarch with -o
Signed-off-by: gatecat <gatecat@ds0.me>
2022-08-15 12:15:00 +02:00
myrtle
b653e39991
Merge pull request #1012 from YosysHQ/gatecat/refactor-id-in
refactor: Use IdString::in instead of || chains
2022-08-11 07:26:20 +01:00
gatecat
c60fb94b6c refactor: Use IdString::in instead of || chains
Signed-off-by: gatecat <gatecat@ds0.me>
2022-08-10 18:58:22 +01:00
myrtle
a20d21bd13
Merge pull request #1011 from YosysHQ/gatecat/nexus-lram-tmg
nexus: Add timing data for LRAM
2022-08-10 18:26:56 +01:00
gatecat
f7354d092d nexus: Add timing data for LRAM
Signed-off-by: gatecat <gatecat@ds0.me>
2022-08-10 15:47:22 +01:00
myrtle
66722096ed
Merge pull request #1010 from YosysHQ/gatecat/idf
refactor: id(stringf(...)) to new idf(...) helper
2022-08-10 11:25:34 +01:00
gatecat
77c82b0fbf refactor: id(stringf(...)) to new idf(...) helper
Signed-off-by: gatecat <gatecat@ds0.me>
2022-08-10 10:57:46 +01:00
myrtle
06ce27ed38
Merge pull request #1008 from YosysHQ/gatecat/generic-addbelpin
generic: addBelPin with direction as an arg
2022-08-04 11:48:46 +02:00
gatecat
37f0886cb9 generic: addBelPin with direction as an arg
Signed-off-by: gatecat <gatecat@ds0.me>
2022-08-04 10:55:19 +02:00
myrtle
1b54fa2a1c
Merge pull request #1004 from yrabbit/fix-muxes
gowin: Remove incomprehensible names of the muxes
2022-07-21 11:34:51 +01:00
YRabbit
0285d47138 Merge branch 'master' into fix-muxes 2022-07-20 21:14:20 +10:00
YRabbit
ce2335bc00 gowin: fix compilation
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-07-19 20:20:26 +10:00
myrtle
dfea954754
Merge pull request #1005 from YosysHQ/gatecat/nexus-ram-fixes
nexus: Fix CSDECODE parsing
2022-07-19 10:33:15 +01:00
gatecat
ad502bf64b nexus: Fix CSDECODE parsing
Signed-off-by: gatecat <gatecat@ds0.me>
2022-07-19 09:58:00 +01:00
YRabbit
6969782a4b gowin: Remove incomprehensible names of the muxes
There is no need to multiply item names, it is a rudiment of my very
first addition to nextpnr.

Fully compatible with older versions of Apicula.

Note: the cosmetic changes in lines with RAM are not my initiative, but
the result of applying clang-format.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-07-19 18:51:25 +10:00
myrtle
5667113f8a
Merge pull request #998 from yrabbit/clock-wip
gowin: add a separate router for the clocks
2022-07-18 08:39:05 +01:00
YRabbit
ecddac7b18 Merge branch 'master' into clock-wip 2022-07-10 08:05:25 +10:00
myrtle
664cec54b9
Merge pull request #999 from YosysHQ/gatecat/pseudocell-api
netlist: Add PseudoCell API
2022-07-08 15:03:07 +02:00
gatecat
09e388f453 netlist: Add PseudoCell API
When implementing concepts such as partition pins or deliberately split
nets, there's a need for something that looks like a cell (starts/ends
routing with pins on nets, has timing data) but isn't mapped to a fixed
bel in the architecture, but instead can have pin mappings defined at
runtime.

The PseudoCell allows this by providing an alternate, virtual-function
based API for such cells. When a cell has `pseudo_cell` used, instead of
calling functions such as getBelPinWire, getBelLocation or getCellDelay
in the Arch API; such data is provided by the cell itself, fully
flexible at runtime regardless of arch, via methods on the PseudoCell
implementation.
2022-07-08 14:30:57 +02:00
YRabbit
1ebfe67daf gowin: Remove unnecessary functions
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-07-05 20:02:12 +10:00
YRabbit
3364a3b674 Merge branch 'master' into clock-wip 2022-07-05 19:43:24 +10:00
myrtle
86396c41d6
Merge pull request #995 from pepijndevos/shadowram
Gowin: WIP shadowram
2022-07-05 09:29:04 +02:00
myrtle
cc1d78a3d4
Merge pull request #1001 from YosysHQ/gatecat/generic-shared-pyb
generic: Use arch_pybindings_shared
2022-07-05 09:25:11 +02:00
myrtle
7e64c326e0
Merge pull request #1002 from gsomlo/gls-pybind11-unbundle
Enable building against unbundled pybind11
2022-07-05 09:25:03 +02:00
Gabriel Somlo
9914f56137 Enable building against unbundled pybind11
Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>
2022-07-04 14:54:59 -04:00
gatecat
e1ba379fb7 generic: Use arch_pybindings_shared
Signed-off-by: gatecat <gatecat@ds0.me>
2022-07-04 18:39:00 +02:00
YRabbit
5d915a550b gowin: fix compilation
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-07-04 11:23:21 +10:00
YRabbit
3172a38dae gowin: Let the placer know about global networks
Refactor in order to detect networks that will be routed in a special
mode earlier. This makes it possible to mark the source of such networks
as a global buffer, thereby removing their influence on element
placement.

In addition, timing classes are set for some cells.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-07-04 10:32:39 +10:00
YRabbit
6d85de43ee Merge branch 'master' into clock-wip 2022-07-04 08:15:21 +10:00
Pepijn de Vos
6f56ad298c use DFF RAM mode 2022-07-02 20:44:59 +02:00
Pepijn de Vos
0641ff47d9 Merge branch 'master' into shadowram 2022-07-02 13:29:44 +02:00
myrtle
b4337d99fd
Merge pull request #1000 from YosysHQ/gatecat/fix-empty-ports
ice40: Fix accidental creation of empty ports
2022-06-26 08:50:49 +01:00
gatecat
6122f172e3 ice40: Fix accidental creation of empty ports
Signed-off-by: gatecat <gatecat@ds0.me>
2022-06-25 15:56:16 +01:00
YRabbit
63f2acd42a gowin: process the CLK ports of the ODDR[C] primitives
Also removed the useless references.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-06-24 08:20:06 +10:00
myrtle
f11225360b
Merge pull request #997 from Chandler-Kluser/master
Update README.md
2022-06-23 07:16:28 +01:00
YRabbit
590b9050ff gowin: add a separate router for the clocks
A simple router that takes advantage of the fact that in each cell with
DFFs their CLK inputs can directly connect to the global clock network.

Networks with a large number of such sinks are sought and then each
network is assigned to the available independent global clock networks.

There are limited possibilities for routing mixed networks, that is,
when the sinks are not only CLKs: in this case an attempt is made to use
wires such as SN10/20 and EW10/20, that is, one short transition can be
added between the global clock network and the sink.

* At this time, networks with a source other than the I/O pin are not
  supported. This is typical for Tangnano4k and runber boards.

* Router is disabled by default, you need to specify option
  --enable-globals to activate

* No new chip bases are required. This may change in the distant future.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-06-23 11:42:58 +10:00
Chandler Klüser
b502499a1e Update README.md 2022-06-22 21:03:04 -03:00
gatecat
b950f5cb6d Disable broken and failing interchange CI
Signed-off-by: gatecat <gatecat@ds0.me>
2022-06-21 12:35:13 +01:00
Pepijn de Vos
b7992ec772 hook up CE maybe 2022-06-16 11:38:23 +02:00
gatecat
8d063d38b1 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2022-06-12 07:59:36 +01:00
gatecat
eac864ebdc ecp5: Bind write_bitstream to Python
Signed-off-by: gatecat <gatecat@ds0.me>
2022-06-09 20:05:20 +01:00
myrtle
aeece7d278
Merge pull request #996 from yrabbit/sn
gowin: Use local aliases
2022-06-09 06:51:45 +01:00
YRabbit
bd0af4052c gowin: Use local aliases
In the Gowin chips, the tiles are connected to each other by a one-hop
wire, among others. There are 4 one-hop wires, of which 2 are shared
between north/south and east/west, have three names: e.g. SN10 and N110
and S110.

But only one of them, the first, occurs as a sink for PIP, that is, you
can not get a route that would pass through the S110 for example.

This commit corrects the names to SN?0 and EW?0 at the wire creation
stage to avoid dead wires.

In addition, the SN?0 and EW?0 are among the few sinks for global clock
wires and now there is the possibility of a more optimal clock routing.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-06-09 08:20:29 +10:00
myrtle
2da7caf657
Merge pull request #993 from yrabbit/lw-wip-1
gowin: Add support for long wires
2022-06-07 13:09:09 +01:00
Pepijn de Vos
de1bee9352 lutram actually PnRs 2022-06-06 14:35:33 +02:00
Pepijn de Vos
490dddf636 WIP shadowram 2022-06-05 16:59:06 +02:00
YRabbit
db696af2fe gowin: Add support for long wires
Gowin chips have a highly sophisticated system of long wires that are
wired to each cell and allow the clock or logic to spread quickly.

This commit implements some of the capabilities of the long wire system
for quadrants, leaving out the fine-tuning of them for each column.

To make use of the long wire system, the specified wire is cut at the
driver and a special cell is placed between the driver and the rest of
the wire.

* VCC and GND can not use long wires because they are in every cell and
  there is no point in using a net
* Long wire numbers can be specified manually or assigned automatically.
* The route from the driver to the port of the new cell can be quite
  long, this will have to be solved somehow.
* It might make sense to add a mechanism for automatically finding
  candidates for long wires.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-05-27 22:44:21 +10:00
myrtle
997af6d720
Merge pull request #992 from antmicro/mdudek/nexus_write_dcc
Change write_dcc to work with tilegroups from prjoxide
2022-05-27 10:13:15 +01:00
Maciej Dudek
8c4e3e91cc Change write_dcc to work with tilegroups from prjoxide
Signed-off-by: Maciej Dudek <mdudek@antmicro.com>
2022-05-27 10:58:39 +02:00
myrtle
48f9daf867
Merge pull request #990 from YosysHQ/gatecat/fix-988
Don't assert on mixed domain paths in report
2022-05-22 14:31:55 +01:00
gatecat
447b5b905c Don't assert on mixed domain paths in report
Signed-off-by: gatecat <gatecat@ds0.me>
2022-05-22 13:56:36 +01:00
myrtle
e900494394
Merge pull request #989 from YosysHQ/lofty/cmake-bump
Bump minimum CMake to 3.13
2022-05-21 19:26:30 +01:00
Lofty
ae67c98f11 Bump minimum CMake to 3.13 2022-05-21 18:26:36 +01:00
myrtle
4ecbf6c6e9
Merge pull request #985 from antmicro/interchange-lut-constants
[interchange] Tying unused LUT inputs according to architecture
2022-05-13 09:09:50 +01:00
Maciej Kurc
d75c45c63f Added fallback to VCC as the preferred constant if the architecture does not specify one.
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2022-05-12 11:55:16 +02:00
Maciej Kurc
7c7a4f0959 Added tying unused LUT pins to preferred constant instead of Vcc
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2022-05-11 16:31:34 +02:00
Maciej Kurc
aafe1a176c Generalized representation of unused LUT pins connections
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2022-05-11 16:31:30 +02:00
myrtle
41936fefac
Merge pull request #984 from yrabbit/assert
common: Correct a minor typo in the message
2022-05-10 13:17:22 +01:00
YRabbit
1aa693732c common: Correct a minor typo in the message
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-05-10 21:19:02 +10:00
myrtle
769a1f263a
Merge pull request #982 from YosysHQ/gatecat/ice40-gb-constr-fix
ice40: Fix propagation of constraints through SB_GB
2022-05-08 13:37:53 +01:00
gatecat
27966f101f ice40: Fix propagation of constraints through SB_GB
Signed-off-by: gatecat <gatecat@ds0.me>
2022-05-08 12:44:03 +01:00
gatecat
a494982646
Merge pull request #981 from yrabbit/lw-cst-0
gowin: Add initial syntax support for long wires
2022-05-03 17:52:02 +01:00
YRabbit
15413de359 gowin: Add initial syntax support for long wires
Only the recognition of the directive in the .CST file and elementary
checks are added, but not the long-wire mechanism itself.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-05-02 20:40:33 +10:00
gatecat
f0d4e4fbc3 generic: Add some extra helpers for viaduct uarches
Signed-off-by: gatecat <gatecat@ds0.me>
2022-05-02 11:02:09 +01:00
gatecat
20cfafa109 generic: Add missing uarch guard
Signed-off-by: gatecat <gatecat@ds0.me>
2022-04-27 14:18:42 +01:00
gatecat
a35c80cc10 ecp5: Tweak delay prediction
Signed-off-by: gatecat <gatecat@ds0.me>
2022-04-20 11:29:08 +01:00
gatecat
b8f9f2daa2
Merge pull request #977 from YosysHQ/gatecat/prefine-tileswap
prefine: Do full-tile swaps, too
2022-04-19 19:09:29 +01:00
gatecat
19cade3b3b prefine: Do full-tile swaps, too
Signed-off-by: gatecat <gatecat@ds0.me>
2022-04-19 18:37:16 +01:00
gatecat
d76a6093ae
Merge pull request #976 from YosysHQ/gatecat/dp-rework
Move general parallel detail place code out of parallel_refine
2022-04-17 20:33:15 +01:00
gatecat
61b3e2e1ff Move general parallel detail place code out of parallel_refine
Signed-off-by: gatecat <gatecat@ds0.me>
2022-04-17 20:10:49 +01:00
gatecat
895aa01e39
Merge pull request #975 from YosysHQ/gatecat/ice40-carry-i3-fix
ice40: Avoid chain finder from mixing up chains by only allowing I3 c…
2022-04-12 14:27:36 +01:00
gatecat
d3ba259db2 ice40: Avoid chain finder from mixing up chains by only allowing I3 chaining at end
Signed-off-by: gatecat <gatecat@ds0.me>
2022-04-11 18:46:44 +01:00
gatecat
9067d954f4
Merge pull request #974 from YosysHQ/gatecat/ci-restructure
ci: Restructure and move entirely to GH actions from Cirrus
2022-04-08 19:51:46 +01:00
gatecat
92a58a2631 ci: Restructure and move entirely to GH actions from Cirrus
Signed-off-by: gatecat <gatecat@ds0.me>
2022-04-08 18:42:39 +01:00
gatecat
57681e69ce
Merge pull request #973 from YosysHQ/gatecat/folder-tidy
Split up common into kernel,place,route
2022-04-08 14:32:33 +01:00
gatecat
49f178ed94 Split up common into kernel,place,route
Signed-off-by: gatecat <gatecat@ds0.me>
2022-04-08 13:42:54 +01:00
gatecat
e42e22575f
Merge pull request #972 from YosysHQ/gatecat/ecp5-split-slice-v2
ecp5: Split the SLICE bel into separate LUT/FF/RAMW bels
2022-04-07 18:43:25 +01:00
gatecat
efb58711b0 ecp5: Split the SLICE bel into separate LUT/FF/RAMW bels 2022-04-07 18:02:36 +01:00
gatecat
d5ec421d98
Merge pull request #971 from modwizcode/fix-tbb-macos
cmake: properly include TBB libraries.
2022-04-06 10:40:20 +01:00
Irides
03074cdbc2 cmake: properly include TBB libraries. 2022-04-05 10:12:44 -05:00
gatecat
c4e47ba1a8 generic: Allow bel pins without wires
Signed-off-by: gatecat <gatecat@ds0.me>
2022-04-04 19:49:44 +01:00
gatecat
fcf2bf6a95
Merge pull request #970 from yrabbit/nr9-wip
gowin: handle the GW1N-9 feature.
2022-04-03 11:40:50 +01:00
YRabbit
85e8570a73 gowin: handle the GW1N-9 feature.
This chip has a different default state for one type of I/O buffer ---
you have to explicitly switch it to the normal state by feeding VCC/VSS
to certain inputs.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-04-03 10:05:27 +10:00
gatecat
2ed68a21db clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2022-03-31 10:49:00 +01:00
gatecat
219310b203
Merge pull request #969 from YosysHQ/gatecat/ice40-wirename-fix
ice40: Fix wirenames containing / which is the list separator
2022-03-31 06:45:54 +01:00
gatecat
336124b879 ice40: Fix wirenames containing / which is the list separator
Signed-off-by: gatecat <gatecat@ds0.me>
2022-03-30 20:57:00 +01:00
gatecat
e96ec9a102
Merge pull request #968 from tpambor/gowin-osc-fix
gowin: Fix z-index of oscillator
2022-03-30 18:57:54 +01:00
Tim Pambor
601b32948b gowin: Fix z-index of oscillator 2022-03-30 17:35:54 +02:00
gatecat
5850cb6336
Merge pull request #952 from antmicro/mdudek/nexus_pll
Nexus: Fixed OSCA parameters, add pll default parameters
2022-03-30 15:39:10 +01:00
Maciej Dudek
b9e76d1bcd Rename parse_lattice_param to parse_lattice_param_from_cell
Add new definition for parse_lattice_param

Now parse_lattice_param is design to parse Property rather than search for it in cell.
This functionalty was move to parse_lattice_param_from_cell.

Signed-off-by: Maciej Dudek <mdudek@antmicro.com>
2022-03-30 14:59:47 +02:00
gatecat
84c5b578d4
Merge pull request #966 from YosysHQ/gatecat/ice40-opt
ice40: Merge driving LUT<=2s into carry-only LCs
2022-03-29 15:20:45 +01:00
gatecat
6f6b502f7a
Merge pull request #960 from YosysHQ/gatecat/viaduct-docs
First pass viaduct docs
2022-03-29 14:06:23 +01:00
gatecat
bd81dcc8f9
Merge pull request #965 from tpambor/gowin-osc
gowin: Add bels for oscillator
2022-03-29 13:57:40 +01:00
gatecat
5a9ddc0675 ice40: Merge driving LUT<=2s into carry-only LCs
Signed-off-by: gatecat <gatecat@ds0.me>
2022-03-29 13:37:14 +01:00
Tim Pambor
12b38bab6d gowin: Add bels for oscillator 2022-03-27 22:15:12 +02:00
gatecat
3ed53153ca
Merge pull request #963 from yrabbit/oddr-quirk
gowin: Consider the peculiarity of GW1NR-9C
2022-03-26 17:07:15 +00:00
YRabbit
be8d3fd74d gowin: Consider the peculiarity of GW1BR-9C
The GW1NR-9C chip ODDR implementation differs from all other supported
chips by two suspicious inputs.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-03-26 20:56:30 +10:00
gatecat
374ac6d162
Merge pull request #961 from YosysHQ/ice40/pll-debug
ice40: Improve error reporting for PLL conflicts
2022-03-25 18:42:41 +00:00
gatecat
07c8506372 ice40: Improve error reporting for PLL conflicts
Signed-off-by: gatecat <gatecat@ds0.me>
2022-03-25 15:55:07 +00:00
YRabbit
69b4461f55
gowin: Name the constants (#958)
Place arbitrary constants side by side to avoid conflicts.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-03-21 20:15:29 +00:00
gatecat
b234828125 docs: Initial reference for the Viaduct 'uarch' API
Signed-off-by: gatecat <gatecat@ds0.me>
2022-03-21 20:12:58 +00:00
Pepijn de Vos
bb923c7732
Gowin: use global VCC and VSS nets (#956)
* use global VCC and VSS nets

* derp

* remove init parameter
2022-03-19 18:44:08 +00:00
gatecat
774d3944b3 parallel_refine: Fix compile error with some configs
Signed-off-by: gatecat <gatecat@ds0.me>
2022-03-19 18:43:31 +00:00
gatecat
7703cf61d0
Merge pull request #955 from YosysHQ/gatecat/mistral-updates-2
mistral: Updated CLK mux select name
2022-03-18 19:44:35 +00:00
gatecat
5e9236f9d4 mistral: Updated CLK mux select name
Signed-off-by: gatecat <gatecat@ds0.me>
2022-03-18 18:54:40 +00:00
gatecat
051228c49a
Merge pull request #953 from YosysHQ/gatecat/mistral-updates
mistral: Update to latest upstream
2022-03-18 17:52:47 +00:00
Maciej Dudek
49cc4ca30b Nexus: Fixed OSCA parameters, add pll default parameters
Signed-off-by: Maciej Dudek <mdudek@antmicro.com>
2022-03-18 17:26:06 +01:00
gatecat
8e9d0a6e09
Merge pull request #954 from YosysHQ/gatecat/rapidwright-update
ci: Fixes for latest RapidWright
2022-03-17 20:57:56 +00:00
gatecat
29654c52be ci: Fixes for latest RapidWright
Signed-off-by: gatecat <gatecat@ds0.me>
2022-03-17 20:01:44 +00:00
gatecat
14d53dfec8 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2022-03-17 19:24:05 +00:00
gatecat
d8244bb62d mistral: Update to latest upstream
Signed-off-by: gatecat <gatecat@ds0.me>
2022-03-17 19:19:38 +00:00
gatecat
2635bab2f1 ecp5: Fix double-counting of FFs in report
Signed-off-by: gatecat <gatecat@ds0.me>
2022-03-16 15:44:45 +00:00
gatecat
c278a29a38
Merge pull request #950 from yrabbit/start
gowin: don't crash if no arguments are set
2022-03-16 14:41:18 +00:00
gatecat
c9fd41c529
Merge pull request #948 from antmicro/dcs_support
nexus: DCS support
2022-03-16 09:40:17 +00:00
Maciej Kurc
237391c1b8 nexus: Corrected auto frequency constraint for LF output of OSCA
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2022-03-16 09:20:15 +01:00
Maciej Kurc
43861c0ee2 nexus: Added support for the DCS Bel
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2022-03-16 09:20:15 +01:00
gatecat
74783c0c09
Merge pull request #949 from yrabbit/thousands
BUGFIX: disable the thousands separator
2022-03-16 07:02:35 +00:00
YRabbit
c898587b87 gowin: don't crash if no arguments are set
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-03-16 15:47:13 +10:00
YRabbit
e3b9c971f9 BUGFIX: disable the thousands separator
The wire numbers are very large and it is undesirable to use a thousand
separator there. This is a side effect of enabling locale.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-03-16 15:05:27 +10:00
gatecat
2df9d3537b
Merge pull request #943 from yrabbit/locale
gowin: support for locales other than en_US and C
2022-03-15 20:44:03 +00:00
YRabbit
53ddbbaa85 Set the locale as early as possible
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-03-16 05:39:55 +10:00
gatecat
e327050bd1
Merge pull request #944 from Riesi/master
ice40: fix crash when packing LUTs with no output
2022-03-15 18:59:45 +00:00
gatecat
81b48b414b
Merge pull request #947 from antmicro/dcc_enhancements
nexus: DCC support fixups
2022-03-15 18:54:18 +00:00
YRabbit
ad00f3fdeb gowin: test locale workaround
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-03-15 21:52:32 +10:00
Maciej Kurc
1cc71c7846 nexus: Added FASM feature emission for DCC and port timing class info
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2022-03-15 10:43:31 +01:00
gatecat
6ed625be8e
Merge pull request #945 from yrabbit/wip-oddr
gowin: add support for ODDR primitive
2022-03-15 07:42:00 +00:00
YRabbit
badef293eb gowin: add support for ODDR primitive
Compatible with older versions of apicula bases.
Also small fixes and as the number of virtual Bels grows it is necessary
to assign them Z coordinate in a centralized way to avoid conflicts and
for this purpose introduced the BelZ enum.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-03-15 11:02:37 +10:00
Stefan Riesenberger
e9ce55bfd0 ice40: fix crash when packing LUTs with no output 2022-03-14 12:43:19 +01:00
YRabbit
25d7e3ae8b gowin: support for locales other than en_US and C
Specifically, those locales where the fractional part separator in
floating point numbers is not a dot.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-03-14 21:41:57 +10:00
gatecat
b852df3260
Merge pull request #942 from yrabbit/bugfix-1
gowin: BUGFIX temporarily disable the budget
2022-03-14 07:53:48 +00:00
YRabbit
4736acb3d5 fix identation
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-03-14 17:42:50 +10:00
YRabbit
e0f55e6d69 gowin: BUGFIX temporarily disable the budget
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-03-14 14:23:20 +10:00
gatecat
c0fd0374ad
Merge pull request #938 from Ravenslofty/mistral-m10kinit
mistral: M10K initialisation support
2022-03-12 20:40:38 +00:00
gatecat
851007b4a1
Merge pull request #940 from VioletEternity/truncated-config-words
ecp5: accept lowercase characters in hex strings
2022-03-12 20:36:31 +00:00
Lofty
883f274802 mistral: M10K initialisation support 2022-03-12 17:08:20 +00:00
gatecat
233ea62c13
Merge pull request #941 from yrabbit/gsr
gowin: Add the Global Set/Reset primitive
2022-03-12 15:43:26 +00:00
YRabbit
4a2aa6deb4 gowin: Add the Global Set/Reset primitive
GSR is added automatically if it was not instantiated by the user explicitly.

Compatible with old apicula bases, the functionality does not work, but
the crash does not happen --- just a warning.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-03-12 23:05:42 +10:00
Maya
9f53bd4278 ecp5: accept lowercase characters in hex strings. 2022-03-11 23:34:45 +00:00
Maya
2a3d0c1d29 ecp5: verify hex strings contain only valid characters. 2022-03-11 23:31:23 +00:00
gatecat
20e595e211
Merge pull request #939 from antmicro/fix-global-router
[fpga_interchange] FIX: Don't hold reference to current visit in route_global_arc
2022-03-11 15:45:25 +00:00
Krzysztof Boronski
8c0dbdb218 interchange: Don't hold reference to visit in global routing
Signed-off-by: Krzysztof Boronski <kboronski@antmicro.com>
2022-03-11 07:53:42 -06:00
gatecat
1911a9523c
Merge pull request #886 from Ravenslofty/mistral-m10k
mistral: M10K support
2022-03-09 18:03:59 +00:00
Lofty
3e688a3ac9 mistral: fixes and debug info 2022-03-09 17:13:54 +00:00
Lofty
9be65cd67c mistral: some more M10K fixes 2022-03-09 17:13:54 +00:00
gatecat
da65afc83b mistral: M10K pack fixes
Signed-off-by: gatecat <gatecat@ds0.me>
2022-03-09 17:13:54 +00:00
Lofty
78474a5dec mistral: preliminary bitstream info 2022-03-09 17:13:54 +00:00
Lofty
34b7cdb533 mistral: move M10K code to pack 2022-03-09 17:13:54 +00:00
Lofty
33e031a284 mistral: M10K cell function 2022-03-09 17:13:54 +00:00
Lofty
af6735bdf4 mistral: add M10K bel 2022-03-09 17:13:54 +00:00
gatecat
df7e26c1aa clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2022-03-09 17:12:59 +00:00
gatecat
5ff701d45e
Merge pull request #937 from antmicro/mdudek/nexus_implicit_DCC_cascading
nexus: DCCs cannot be cascaded
2022-03-09 14:29:17 +00:00
Maciej Dudek
191be632e2 nexus: DCCs cannot be cascaded
This commit solves implicit cascading when clock signal drives DCC and logic

Signed-off-by: Maciej Dudek <mdudek@antmicro.com>
2022-03-09 14:13:29 +01:00
gatecat
1af997a074
Merge pull request #936 from whitequark/wasm-no-parallel-refine
Add missing part of PR #933
2022-03-08 18:47:00 +00:00
Catherine
626eccdb89 Add missing part of commit aee35768. 2022-03-08 17:24:29 +00:00
gatecat
81e970867d
Merge pull request #933 from whitequark/wasm-no-parallel-refine
Disable parallel refinement on WebAssembly
2022-03-05 20:00:38 +00:00
Catherine
aee35768f4 Disable parallel refinement on WebAssembly. 2022-03-05 16:32:44 +00:00
gatecat
285325ad5b
Merge pull request #932 from antmicro/remove-hardcoded-values-from-lut-mapping-cache
interchange: lut map cache: remove hardcoded values
2022-03-04 18:17:08 +00:00
gatecat
2c8062bdb3
Merge pull request #931 from yrabbit/bugfix-0
gowin: BUGFIX gui crash
2022-03-04 16:06:41 +00:00
Alessandro Comodi
b5d6fc8ed7 interchange: lut map cache: remove hardcoded values
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2022-03-04 16:53:24 +01:00
YRabbit
c93a3f35ac gowin: BUGFIX gui crash
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-03-04 16:19:16 +10:00
gatecat
2c6ca4836f
Merge pull request #929 from gatecat/gatecat/parallel_refine
parallel_refine: New, parallelised placement refinement pass
2022-03-03 21:53:26 +00:00
gatecat
cc9f99a80c parallel_refine: New, parallelised placement refinement pass 2022-03-03 18:37:53 +00:00
gatecat
0a70b9c992
Merge pull request #925 from YosysHQ/gatecat/netlist-iv
Switch to potentially-sparse net users array
2022-03-01 16:38:48 +00:00
gatecat
d8bea3ccfc
Merge pull request #927 from YosysHQ/gatecat/ecp5-pdpw-fix
ecp5: Fix PDPW16K clock param renaming
2022-02-28 14:17:38 +00:00
gatecat
9b3e687eda ecp5: Fix PDPW16K clock param renaming
Signed-off-by: gatecat <gatecat@ds0.me>
2022-02-28 13:10:00 +00:00
gatecat
86699b42f6 Switch to potentially-sparse net users array
This uses a new data structure for net.users that allows gaps, so
removing a port from a net is no longer an O(n) operation on the number
of users the net has.

Signed-off-by: gatecat <gatecat@ds0.me>
2022-02-27 13:47:05 +00:00
gatecat
434a9737bb Add indexed_store container type
Signed-off-by: gatecat <gatecat@ds0.me>
2022-02-26 15:11:33 +00:00
gatecat
0b4f1e2b51
Merge pull request #924 from Ravenslofty/okami
okami: new Viaduct arch
2022-02-25 12:48:56 +00:00
Lofty
fbb02e2860 okami: new Viaduct arch 2022-02-24 20:38:56 +00:00
gatecat
33ca747b1f
Merge pull request #923 from yrabbit/partnumber-re
gowin: recognize partnumbers of GW1NZ-1
2022-02-24 11:13:39 +00:00
YRabbit
3894a36ddb gowin: recognize partnumbers of GW1NZ-1
The model should be recognized by the partnumber, --family is needed
only if the same partnumbers belong to different models.
This is done in order to automatically generate parameters for calling
nextpnr from Gowin files without problems: there also only partnumber is
used and only in some cases the model is specified with the -name
parameter and GW1NZ-1 is not such a case.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-02-24 13:35:22 +10:00
gatecat
440d7e394e
Merge pull request #922 from yrabbit/wip-0-lvds
gowin: Add support for true differential output
2022-02-23 11:58:39 +00:00
YRabbit
ad49b7c78d gowin: Add support for true differential output
The new primitive appears as an amalgamation of two existing OBUF
primitives.  Compatible with older versions of apicula, although, of
course, using TLVDS_OBUF with old databases will not bring the desired
result, but no crash.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-02-23 15:53:04 +10:00
gatecat
4666ea7051
Merge pull request #921 from YosysHQ/gatecat/concat-overrides
Add IdStringList::concat overrides taking IdString
2022-02-20 19:33:16 +00:00
gatecat
4812f9707a
Merge pull request #913 from chiplet/gw1nz-1
gowin: Add GW1NZ-1 support
2022-02-20 18:27:36 +00:00
gatecat
75c45dbef1 Add IdStringList::concat overrides taking IdString
Signed-off-by: gatecat <gatecat@ds0.me>
2022-02-20 18:26:17 +00:00
gatecat
347ba3afb3
Merge pull request #919 from YosysHQ/gatecat/netlist-iii
refactor: New member functions to replace design_utils
2022-02-18 12:07:49 +00:00
gatecat
6a32aca4ac refactor: New member functions to replace design_utils
Signed-off-by: gatecat <gatecat@ds0.me>
2022-02-18 11:13:18 +00:00
gatecat
61d1db16be
Merge pull request #918 from YosysHQ/gatecat/netlist-ii
Refactor pt2, barnacle cleanup
2022-02-16 18:13:22 +00:00
gatecat
76683a1e3c refactor: Use constids instead of id("..")
Signed-off-by: gatecat <gatecat@ds0.me>
2022-02-16 17:09:54 +00:00
gatecat
9ef0bc3d3a refactor: Use cell member functions to add ports
Signed-off-by: gatecat <gatecat@ds0.me>
2022-02-16 16:45:45 +00:00
gatecat
25c47e5b7e
Merge pull request #917 from YosysHQ/gatecat/netlist-i
refactor: New NetInfo and CellInfo constructors
2022-02-16 16:15:26 +00:00
gatecat
30fd86ce69 refactor: New NetInfo and CellInfo constructors 2022-02-16 15:10:57 +00:00
gatecat
02e6d2dbca mistral: Fix 'not handled in switch' compiler warning
Signed-off-by: gatecat <gatecat@ds0.me>
2022-02-16 13:39:57 +00:00
gatecat
f3ee0d51a9 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2022-02-16 13:32:53 +00:00
Verneri Hirvonen
bdea5a1f6f gowin: bump apycula version 2022-02-16 10:25:18 +02:00
gatecat
a9228095ee
Merge pull request #914 from ept221/doc_update
Fixed formatting typo in archapi.md
2022-02-16 07:13:20 +00:00
Ezra Thomas
05c41ae224
Fixed formatting typo in archapi.md 2022-02-15 22:29:39 -05:00
Verneri Hirvonen
e90f5b72f7 gowin: Add GW1NZ-1 2022-02-15 14:12:16 +02:00
gatecat
6047112753
Merge pull request #912 from danc86/nexus-osca-7percent
nexus: reduce OSCA worst case to 7%
2022-02-10 11:21:18 +00:00
Dan Callaghan
5c30093360 nexus: reduce OSCA worst case to 7%
The current version of Crosslink-NX Family Data Sheet lists the high
frequency oscillator maximum frequency as 481.5MHz (that is, 7% higher
than its nominal 450MHz):

https://www.latticesemi.com/-/media/LatticeSemi/Documents/DataSheets/CrossLink/FPGA-DS-02049-1-2-1-CrossLink-NX-Family.ashx?document_id=52780

Older documents listed a wider frequency range but ±7% is the range for
production parts.
2022-02-10 15:48:06 +11:00
gatecat
74c99f9195
Merge pull request #908 from YosysHQ/gatecat/generic-fanout-block
viaduct: Allow constraining only cascades without fanout
2022-02-06 14:19:26 +00:00
gatecat
dad0ef4ab7
Merge pull request #909 from pepijndevos/mygw1n9c
Add support for GW1N-9C and --family argument
2022-02-06 14:19:02 +00:00
Pepijn de Vos
cd97ef6536 add GW1N-9C db 2022-02-06 12:02:06 +01:00
Icenowy Zheng
230de1e68a gowin: add an option to manually specify family
In the vendor IDE, there's a device family named GW1N-9C (which seems to
mean C revision of GW1N-9), in which the model numbers are all the same
with GW1N-9.

Add an option to nextpnr-gowin to allow manually specified family for
this situation.

Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
2022-02-06 12:01:51 +01:00
gatecat
e5bfff6e9f viaduct: Allow constraining only cascades without fanout
Signed-off-by: gatecat <gatecat@ds0.me>
2022-02-04 20:49:32 +00:00
gatecat
4b72f02255
Merge pull request #907 from YosysHQ/gatecat/generic-pips-py-fix
generic: Add missing Pip vector binding
2022-02-04 20:48:41 +00:00
gatecat
5ef5c33e9e generic: Add missing Pip vector binding
Signed-off-by: gatecat <gatecat@ds0.me>
2022-02-04 15:54:41 +00:00
gatecat
69625564ca
Merge pull request #906 from yrabbit/gowin-gui-noc
gowin: Speed up the GUI
2022-02-04 15:47:30 +00:00
gatecat
d13a4f4c7a
Merge pull request #904 from yrabbit/diff-locations
gowin: Add a DS location recognition
2022-02-04 15:46:59 +00:00
YRabbit
0675b98437 gowin: Speed up the GUI
By mistake, an empty decal gets filled with graphical elements.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-02-04 14:24:22 +10:00
YRabbit
1152c9f2f8 gowin: Remove leftover debugging
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-02-04 09:18:08 +10:00
YRabbit
eb5d3b3197 Merge branch 'master' into diff-locations 2022-02-04 09:03:36 +10:00
gatecat
5007cd3603
Merge pull request #905 from YosysHQ/gatecat/nexus-disable-dcsroute
nexus: Hotfix to disable unimplemented DCS routethru
2022-02-03 21:40:30 +00:00
gatecat
84399caebe run clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2022-02-03 15:28:46 +00:00
gatecat
a78719ecc1
Merge pull request #901 from yrabbit/gowin-gui-noc
gowin: Add GUI.
2022-02-03 15:27:08 +00:00
gatecat
d446a29987 nexus: Hotfix to disable unimplemented DCS routethru
Signed-off-by: gatecat <gatecat@ds0.me>
2022-02-03 14:59:25 +00:00
YRabbit
604260a0d7 gowin: Add a DS location recognition
For differential signals it is necessary to set the position of two pins
at once: P and N.
This commit adds that capability and also adds another style of location
setting --- with the pin letter in square brackets used in vendor tools.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-02-03 11:26:45 +10:00
YRabbit
368299d143 gowin: Rearrange the GUI constants
All internal constants for describing the graphics have been moved
to the .cc file.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-02-03 06:24:40 +10:00
YRabbit
7ba1466333 Merge branch 'master' into gowin-gui-noc 2022-02-02 19:05:36 +10:00
gatecat
6fceac95c0
Merge pull request #902 from antmicro/nexus-osc-tolerance-2
Honor nexus OSCA frequency tolerance (corrected)
2022-02-02 08:49:31 +00:00
Maciej Kurc
3042f9e792 Fixed correction of Nexus OSCA frequency constraints
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2022-02-02 09:24:28 +01:00
YRabbit
370e98a248 Merge branch 'master' into gowin-gui-noc 2022-02-02 07:24:00 +10:00
gatecat
c306ef12bc
Merge pull request #897 from antmicro/nexus-improve-estimate
nexus: arch: add option to adjust the estimation delay multiplication factor
2022-02-01 11:20:26 +00:00
Alessandro Comodi
676e56e5d4 nexus: add option to modify the mult factor of the estimate delay
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2022-02-01 11:18:17 +01:00
YRabbit
22e4081c73 gowin: Add GUI.
* Items such as LUT, DFF, MUX, ALU, IOB are displayed;
* Local wires, 1-2-4-8 wires are displayed;
* The clock spines, taps and branches are displayed with some caveats.

For now, you can not create a project in the GUI because of possible
conflict with another PR (about GW1NR-9C support), but you can specify
the board in the command line and load .JSON and .CST in the GUI.

Although ALUs are displayed, but the CIN and COUT wires are not. This is
still an unsolved problem.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-01-29 14:45:17 +10:00
gatecat
e069b3bc6a
Merge pull request #900 from antmicro/nexus-osc-tolerance
Honor nexus OSCA frequency tolerance
2022-01-28 19:19:33 +00:00
Maciej Kurc
e51e82d6a9 Added honoring OSCA output frequency tolerance during constraints generation
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2022-01-28 13:51:10 +01:00
gatecat
1301feb4ad
Merge pull request #899 from antmicro/nexus-dsp-packing
Fix for Nexus DSP packing
2022-01-25 12:30:39 +00:00
Maciej Kurc
18f71ace8c Removed the need for MULT36_CORE bel for implementing the MULTADDSUB9X9WIDE macro
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2022-01-25 12:08:52 +01:00
gatecat
fbeef2b8c2
Merge pull request #895 from galibert/master
Sync with the current state of mistral
2022-01-19 13:22:40 +00:00
Olivier Galibert
27d38de612 Mistral: Use log_error, remove leftover debugging printf. 2022-01-19 08:42:29 +01:00
Olivier Galibert
91a0eb9367 Mistral: fix gpio OE, add hmc bypass support 2022-01-18 22:37:35 +01:00
Olivier Galibert
b5fc788153 Sync with the current state of mistral 2022-01-18 15:12:45 +01:00
gatecat
58a1b473b8
Merge pull request #873 from YosysHQ/gatecat/ice40-carry-lut
ice40: Pack LUT at start of carry chain if there is 1 candidate
2022-01-16 19:59:56 +00:00
gatecat
2ab08a872d
Merge pull request #894 from antmicro/integer-hashing
Better hashing function for integer pairs
2022-01-11 16:33:19 +00:00
Maciej Kurc
ae7c2261be Switched integer pair hashing function from DJB2 to Cantor
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2022-01-11 15:28:13 +01:00
gatecat
3d24583b91
Merge pull request #893 from YosysHQ/gatecat/viaduct
Viaduct API for a hybrid between generic and full-custom arch
2022-01-07 16:16:47 +00:00
gatecat
e88bd34c02 Viaduct API for a hybrid between generic and full-custom arch
Signed-off-by: gatecat <gatecat@ds0.me>
2022-01-04 20:19:29 +00:00
gatecat
089ca8258e
Merge pull request #892 from yrabbit/off-by-one
gowin: Fix last MUX2_LUT8
2022-01-03 12:47:44 +00:00
YRabbit
045ce3f148 gowin: Fix last MUX8
In fact, there is also an input/output column.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2022-01-03 17:48:31 +10:00
gatecat
3266c51d85
Merge pull request #890 from YosysHQ/gatecat/ssoarray-move
SSOArray: Implement move and assignment operators
2021-12-31 06:57:25 +00:00
gatecat
69a4e3e544 SSOArray: Implement move and assignment operators
Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-30 21:32:24 +00:00
gatecat
d65c629fb0
Merge pull request #889 from YosysHQ/gatecat/generic-refactor
generic: Refactor for faster performance
2021-12-30 13:12:20 +00:00
gatecat
59874188a6 generic: Refactor for faster performance
This won't affect Python-built arches significantly; but will be useful
for the future 'viaduct' functionality where generic routing graphs can
be built on the C++ side; too.

Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-30 11:54:08 +00:00
gatecat
c272d28e57 docs: Fix typo
Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-29 21:43:33 +00:00
gatecat
fdeb86809f
Merge pull request #877 from pepijndevos/patch-3
Add support for GW1NS-4 series devices
2021-12-26 19:14:05 +00:00
Pepijn de Vos
5b6961edd0
update release that actually includes GW1NS-4 chipdb 2021-12-26 17:52:00 +01:00
gatecat
4dbf1c1ca4
Merge pull request #888 from yrabbit/dim-xy
gowin: Initializing the grid dimensions
2021-12-26 07:39:18 +00:00
YRabbit
e6b7879542 gowin: Initializing the grid dimensions
gridDimX and gridDimY are not initialized explicitly, which leads to
effects when the design is reloaded, say, from the GUI.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-12-26 12:05:35 +10:00
gatecat
643b697178
Merge pull request #884 from yrabbit/simplified-io-pr
gowin: Add simplified IO cells processing
2021-12-24 19:28:41 +00:00
Pepijn de Vos
fa1ef15e47 build on release of apycula with gw1ns-4 support 2021-12-24 17:17:25 +01:00
Pepijn de Vos
b53a921e42 Add support for GW1NS-4 series devices 2021-12-24 17:17:25 +01:00
gatecat
de63b5b09a
Merge pull request #887 from YosysHQ/gatecat/mistral-bit-update
mistral: Update to latest enum name
2021-12-22 14:06:33 +00:00
gatecat
2c43ac992f mistral: Update to latest enum name
Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-22 13:21:18 +00:00
gatecat
d2e193f257
Merge pull request #885 from antmicro/nexus-slewrate
nexus: handle SLEWRATE in pdc
2021-12-21 15:08:32 +00:00
Karol Gugala
500fa6f442 nexus: handle SLEWRATE in pdc 2021-12-20 15:09:03 +01:00
YRabbit
5a76b3cb4d gowin: Add simplified IO cells processing
Some models have I/O cells that are IOBUFs, and other types (IBUFs and
OBUFs) are obtained by feeding 1 or 0 to the OEN input.  This is done
with general-purpose routing so it's best to do it here to avoid
conflicts.

For this purpose, in the new bases, these special cells are of type IOBS
(IOB Simplified).

The proposed changes are compatible with bases of previous versions of
Apycula and do not require changing .CST constraint files.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-12-20 15:48:38 +10:00
gatecat
62a3e09385
Merge pull request #883 from YosysHQ/gatecat/new-predictdelay
archapi: Use arbitrary rather than actual placement in predictDelay [breaking change]
2021-12-19 18:46:10 +00:00
gatecat
ddb084e9a8 archapi: Use arbitrary rather than actual placement in predictDelay
This makes predictDelay be based on an arbitrary belpin pair rather
than a arc of a net based on cell placement. This way 'what-if'
decisions can be evaluated without actually changing placement;
potentially useful for parallel placement.

A new helper predictArcDelay behaves like the old predictDelay to
minimise the impact on existing passes; only arches need be updated.

Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-19 17:15:15 +00:00
gatecat
56d5507333
Merge pull request #882 from YosysHQ/gatecat/router1-tmg-ripup
router1: Experimental timing-driven ripup support
2021-12-18 21:49:48 +00:00
gatecat
4a3847765c
Merge pull request #881 from uis246/regex
Tidy gowin modification regex
2021-12-18 21:38:52 +00:00
gatecat
f670de7b52 router1: Experimental timing-driven ripup support
Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-18 20:58:44 +00:00
uis
9b2d6c5a67 Clean gowin modification regex 2021-12-18 22:44:08 +03:00
gatecat
673faea230
Merge pull request #880 from YosysHQ/gatecat/router1-heuristic
router1: Improve timing heuristic
2021-12-18 19:18:21 +00:00
gatecat
53ce8f3736 router1: Improve timing heuristic
Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-18 14:30:48 +00:00
gatecat
f80f56d69f
Merge pull request #879 from YosysHQ/gatecat/nexus-867
nexus: router1 speedup based on #867
2021-12-18 13:25:13 +00:00
gatecat
cc603a612b
Merge pull request #878 from YosysHQ/gatecat/fix-876
frontend: Consider net aliases when uniquifying name
2021-12-17 15:51:45 +00:00
gatecat
a306860144 nexus: router1 speedup based on #867
Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-17 15:06:19 +00:00
gatecat
4451a562ef frontend: Consider net aliases when uniquifying name
Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-17 14:51:19 +00:00
gatecat
a120577773
Merge pull request #858 from cr1901/machxo2
MachXO2 Checkpoint 2
2021-12-17 07:11:31 +00:00
William D. Jones
064b6d808e clangformat. 2021-12-16 17:09:29 -05:00
William D. Jones
78ce9971ff README.md: Add machxo2 arch to list of (experimental) supported devices. 2021-12-16 16:59:38 -05:00
William D. Jones
4d75792257 machxo2: Remove no-iobs option. It was always enabled and should remain an implementation detail. 2021-12-16 16:59:38 -05:00
William D. Jones
be3788fa30 machxo2: Remove -noiopad option when generating miters for post-pnr verification. 2021-12-16 16:59:38 -05:00
William D. Jones
365a871908 machxo2: Add packing logic to forbid designs lacking FACADE_IO top-level ports. 2021-12-16 16:59:38 -05:00
William D. Jones
d2ac6dffbc machxo2: Correct which PIO wires get adjusted when writing text bitstream. Add verbose logging for adjustments. 2021-12-16 16:59:37 -05:00
gatecat
d04cfd5f0f
Merge pull request #874 from yrabbit/models
gowin: Recognize models correctly
2021-12-15 07:00:49 +00:00
YRabbit
120ed0c42d gowin: Recognize models correctly
For example, clearly distinguish between
    GW1N-4
    GW1NR-4
    GW1NS-4
    GW1NSR-4
    GW1NSR-4

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-12-15 07:56:34 +10:00
gatecat
762125d3cf
Merge pull request #872 from YosysHQ/gatecat/py-loc-api
python: Bind getBelLocation/getPipLocation
2021-12-14 20:09:57 +00:00
gatecat
a946ed0206 ice40: Pack LUT at start of carry chain if there is 1 candidate
Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-14 19:27:20 +00:00
gatecat
a120ae1fa7 python: Bind getBelLocation/getPipLocation
Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-14 18:47:35 +00:00
gatecat
256134d615
Merge pull request #870 from YosysHQ/gatecat/ecp5-lutperm
ecp5: LUT permutation support
2021-12-14 09:03:50 +00:00
gatecat
73a7406211
Merge pull request #871 from yrabbit/english
gowin: Fix spelling of messages
2021-12-14 08:54:09 +00:00
YRabbit
fdf26e698f gowin: Fix spelling of messages
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-12-14 14:09:27 +10:00
gatecat
f36188f2e1 ecp5: LUT permutation support
Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-13 20:22:06 +00:00
gatecat
8720d79f21
Merge pull request #868 from mkj/mkj/chipdb-16bit
ecp5: Reduce some chipdb fields from 32 to 16 bit
2021-12-13 15:02:38 +00:00
Matt Johnston
90b0e90bbe ecp5: Reduce some chipdb fields sizes
This reduces the final binary size by ~7 MB for 85k
2021-12-13 11:48:50 +08:00
gatecat
a933f82845 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-12 18:49:37 +00:00
gatecat
0dafcc44ff router2: Improve reservation debug logging
Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-12 18:49:14 +00:00
gatecat
c76e1be397
Merge pull request #867 from mkj/mkj/routerspeed2
Improvements to ecp5 router speed
2021-12-12 15:37:36 +00:00
gatecat
cb362c2256
Merge pull request #869 from YosysHQ/gatecat/mistral-route-fix
mistral: DATAIN and DATAOUT of GPIO have swapped
2021-12-12 14:59:34 +00:00
Matt Johnston
fc5b34254f ecp5: Keep "visited" local
Otherwise it keeps growing boundless and slows down small arcs
2021-12-12 22:09:11 +08:00
Matt Johnston
80dd442412 ecp5: Use a vector rather than dict
This improves router1 performance vs the default dict
Using it for wire2net, pip2net, wire_fanout
2021-12-12 22:09:11 +08:00
gatecat
61597e14a7 mistral: Bump CI version
Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-12 13:55:06 +00:00
gatecat
78905c3ecf mistral: DATAIN and DATAOUT of GPIO have swapped
Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-12 13:03:28 +00:00
gatecat
1c8d4d6460 Merge branch 'master' of github.com:YosysHQ/nextpnr 2021-12-12 13:02:58 +00:00
gatecat
35feb7ebba clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-12 13:02:39 +00:00
gatecat
21fc372a9d
Merge pull request #865 from yrabbit/ALU-head-at-zero
gowin: BUGFIX. Place the ALU head in sliсe 0 only
2021-12-12 13:00:38 +00:00
gatecat
3c8af04ca5 router2: Error instead of hang in case of reservation conflicts
Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-12 13:00:04 +00:00
YRabbit
ecf3027a4d
Merge branch 'YosysHQ:master' into ALU-head-at-zero 2021-12-12 07:43:14 +10:00
gatecat
62fcf944f9
Merge pull request #866 from YosysHQ/gatecat/mistral-include-tools
mistral: Add 'tools' dir to include path
2021-12-11 20:05:48 +00:00
gatecat
df061b1a9c mistral: Add 'tools' dir to include path
Signed-off-by: gatecat <gatecat@ds0.me>
2021-12-11 19:07:30 +00:00
YRabbit
e0ab7bf6c1 gowin: BUGFIX. Place the ALU head in sliсe 0 only
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-12-11 19:10:02 +10:00
gatecat
fd2d4a8f99
Merge pull request #863 from antmicro/pack_lutff
nexus: LUT and FF clustering
2021-11-24 17:16:38 +00:00
Maciej Kurc
41accf84ce Added checking if all FFs added to an existing cluster have matching configuration
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-11-23 15:16:26 +01:00
Maciej Kurc
238da79e52 Fixed potential issues with carry-chain cluster expansion, added a parameter controlling the ratio of FFs that got glued to carry-chain clusters.
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-11-22 13:13:28 +01:00
Maciej Kurc
5bc97c94ae Added appending FFs to other existing LUT cluster types (carry, widefn)
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-11-22 10:23:24 +01:00
Maciej Kurc
086bcf0615 Added an option to control LUT and FF packing
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-11-22 10:23:24 +01:00
Maciej Kurc
d97f93ee88 Added clustering free LUTs and FFs
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-11-22 10:23:24 +01:00
gatecat
f5cc959c4e
Merge pull request #862 from DX-MON/master
common: Improved the random seed initialisation for the context
2021-11-19 21:45:07 +00:00
dx-mon
b3edf81f6c
common: Improved the random seed initialisation for the context 2021-11-19 09:39:10 -05:00
gatecat
b7207b0885
Merge pull request #859 from yrabbit/gowin-packages
gowin: Add partnumbers and packages to the chipdb
2021-11-07 08:12:12 +00:00
YRabbit
deb14762aa gowin: Check the chipdb version
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-11-07 09:05:34 +10:00
YRabbit
2a27085ecb gowin: use latest Apycula release
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-11-07 07:33:47 +10:00
YRabbit
19911ae3a7 Merge branch 'master' into gowin-packages 2021-11-06 22:17:31 +10:00
gatecat
1615b0a500
Merge pull request #857 from YosysHQ/gatecat/ecp5-ff-iodel
ecp5: Fix packing of IOFF with IODELAYs
2021-11-05 23:04:29 +00:00
gatecat
ce030a474c ecp5: Fix packing of IOFF with IODELAYs
Signed-off-by: gatecat <gatecat@ds0.me>
2021-11-05 15:16:43 +00:00
YRabbit
74b4f69728 gowin: Use speed from chip base.
Another simplification of the input regular expression, now
the speed is taken from the base.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-11-05 17:02:45 +10:00
YRabbit
0e8a2999bd gowin: Add partnumbers and packages to the chipdb
Instead of parsing the partnumber with a regular expression,
a simple table is used. This is done because the structure
of the partnumber changes as new features appear (e.g., ES instead of C6/I5)

This commit does not yet disable the very first regular expression check.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-11-04 18:55:00 +10:00
gatecat
06d58e6eed
Merge pull request #855 from galibert/master
mistral: Sync with yet another reorganization
2021-10-28 11:06:32 +01:00
Olivier Galibert
d51c559ab8 mistral: Sync with yet another reorganization 2021-10-28 11:00:44 +02:00
gatecat
80a14592a0
Merge pull request #852 from yrabbit/pr-gowin-alu
gowin: Add ALU support.
2021-10-22 16:08:35 +01:00
YRabbit
e9f3946d58 gowin: Explicitly initialize the y in the cluster
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-10-22 23:27:36 +10:00
YRabbit
f52fd6a272 gowin: Add ALU support.
- Both the mode used by yosys and all Gowin primitive modes are supported.
  - The ALU always starts with a zero slice.
  - The maximum length of the ALU chain is limited to one line of the chip.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-10-22 14:41:18 +10:00
gatecat
013f3e0b39 interchange: Bump prjoxide version
Signed-off-by: gatecat <gatecat@ds0.me>
2021-10-20 13:50:33 +01:00
gatecat
840aee7e0e
Merge pull request #851 from galibert/master
mistral: Use the iterators
2021-10-19 22:06:18 +01:00
Olivier Galibert
a0f1522167 Normalize formatting 2021-10-19 22:36:25 +02:00
Olivier Galibert
8d330f1dc7 mistral: Use the iterators 2021-10-19 22:25:55 +02:00
gatecat
3b99db294f
Merge pull request #848 from galibert/master
mistral: Support the new routes-to-bin intermediate tool generation
2021-10-17 19:02:25 +01:00
Olivier Galibert
d90de7f696 Sync mistral version in CI 2021-10-17 19:12:26 +02:00
gatecat
6bd1ab41b7
Merge pull request #849 from galibert/cyclonev-oscillator
mistral: Add internal oscillator support
2021-10-17 15:42:30 +01:00
Olivier Galibert
f88c119461 mistral: Add internal oscillator support 2021-10-17 14:26:24 +02:00
Olivier Galibert
60833abd3b mistral: Support the new routes-to-bin intermediate tool generation 2021-10-17 11:26:06 +02:00
gatecat
c71a20e805
Merge pull request #847 from galibert/master
mistral: Add support for cyclonev_hps_interface_mpu_general_purpose
2021-10-15 14:01:04 +01:00
Olivier Galibert
bfd61411e7 cyclonev_hps_interface_mpu_general_purpose: Use a id_ identifier 2021-10-15 12:05:24 +02:00
Olivier Galibert
206bb07506 mistral: Add support for cyclonev_hps_interface_mpu_general_purpose 2021-10-14 17:04:32 +02:00
gatecat
4e1f2d7deb
Merge pull request #845 from YosysHQ/gatecat/mlab-cluster-fix
mistral: Fix MLAB clustering
2021-10-11 21:07:41 +01:00
gatecat
15c10796bd mistral: Fix MLAB clustering
Signed-off-by: gatecat <gatecat@ds0.me>
2021-10-11 20:12:56 +01:00
gatecat
dd2c5942a4 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2021-10-11 19:35:23 +01:00
gatecat
349cbdf9da
Merge pull request #843 from Ravenslofty/lofty/mistral-basic-timing
mistral: very basic timing info
2021-10-11 14:35:28 +01:00
Lofty
0a0c9393c1 mistral: very basic timing info 2021-10-10 23:56:58 +01:00
gatecat
9963f76583
Merge pull request #844 from pepijndevos/patch-2
Gowin: more clearly mark dummy pips
2021-10-10 20:27:21 +01:00
Pepijn de Vos
603f44e947
Gowin: more clearly mark dummy pips 2021-10-10 18:11:02 +02:00
gatecat
e546cd00de
Merge pull request #842 from yrabbit/delays
gowin: Replace the zero delays with reasonable values.
2021-10-09 21:52:18 +01:00
gatecat
8ad74edd66 router2: Disable criticality sorting towards end of routing
Signed-off-by: gatecat <gatecat@ds0.me>
2021-10-09 20:56:45 +01:00
YRabbit
95217e7dd2 Merge branch 'master' into delays 2021-10-09 20:33:48 +10:00
YRabbit
bfe9cd548a gowin: Replace the zero delays with reasonable values.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-10-09 20:26:18 +10:00
gatecat
520aec3ef4
Merge pull request #841 from Ravenslofty/lofty/mistral-cleanup
mistral: clean up bel init slightly
2021-10-08 18:00:13 +01:00
Lofty
4c8a8003d3 mistral: clean up bel init slightly 2021-10-08 15:21:21 +01:00
gatecat
b749ef5f56 hashlib: Support for std::array keys
Signed-off-by: gatecat <gatecat@ds0.me>
2021-10-07 17:05:16 +01:00
gatecat
74e7beb5e1
Merge pull request #839 from yrabbit/wide-luts
gowin: add support for wide LUTs.
2021-10-07 13:08:01 +01:00
YRabbit
c72ea15472 gowin: add support for wide LUTs.
* A hardwired MUX within each logical cell is used.
  * The delay is equal 0.
  * No user placement constraints.
  * The output route contains dummy PIPs. They are ignored by gowin_pack, but it may be worth removing them.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-10-07 18:38:33 +10:00
gatecat
4f17a1711a
Merge pull request #837 from YosysHQ/gatecat/mistral-mlab-2
mistral: Adding support for MLABs as memory
2021-10-05 13:59:36 +01:00
gatecat
f5f7ef6864 mistral: Adding support for MLABs as memory
Signed-off-by: gatecat <gatecat@ds0.me>
2021-10-05 12:40:47 +01:00
gatecat
9c32e2d852
Merge pull request #836 from YosysHQ/gatecat/mistral-mlab
mistral: Add bel pins for MLAB write port
2021-10-03 18:49:42 +01:00
gatecat
fe31fba623 mistral: Add bel pins for MLAB write port
Signed-off-by: gatecat <gatecat@ds0.me>
2021-10-03 15:18:41 +01:00
gatecat
4d97e29999
Merge pull request #834 from YosysHQ/gatecat/cygwin
Fix Cygwin build
2021-10-01 17:11:59 +01:00
gatecat
211b6b6b06 Fix Cygwin build
Signed-off-by: gatecat <gatecat@ds0.me>
2021-10-01 12:40:56 +01:00
gatecat
5ae9eeba18
Merge pull request #833 from antmicro/interchange-fix-uninitialized-memory-bug
interchange: fix uninitialized memory bug in cluster placement
2021-10-01 12:38:05 +01:00
Alessandro Comodi
a3ba83fce3 interchange: fix uninitialized memory bug in cluster placement
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-10-01 11:53:56 +02:00
gatecat
7550b60069
Merge pull request #828 from YosysHQ/gatecat/interchange-warn-fix
interchange: Enable Werror on CI and fix some compile warnings
2021-09-30 11:05:32 +01:00
gatecat
bd137a8b50
Merge pull request #810 from antmicro/write-timing-report
Timing report in JSON format
2021-09-29 15:10:28 +01:00
Maciej Kurc
1db3a87c62 Code formatting
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-09-29 14:59:09 +02:00
Maciej Kurc
76f5874ffc Brought back printout of critical path source file references, added clk-to-q, source and setup segment types
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-09-29 10:16:45 +02:00
gatecat
8b3e6711bc
Merge pull request #830 from yrabbit/mistype
Fix mistype.
2021-09-29 06:40:30 +01:00
YRabbit
ddc368f0dd Fix mistype.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-09-29 14:21:06 +10:00
Maciej Kurc
1ed692aca9 Shifted moving of data containers after printing
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-09-28 18:01:30 +02:00
Maciej Kurc
9018782eaa Added a commandline option controlled writeout of per-net timing details
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-09-28 17:42:51 +02:00
Maciej Kurc
a9df3b425f Added description of the JSON report structure.
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-09-28 17:42:51 +02:00
Maciej Kurc
6deff56e83 Moved timing result report storage to the context, added its writeout to the current utilization and fmax report
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-09-28 17:42:51 +02:00
Maciej Kurc
c6dc1f535a Added reporting critical paths in JSON format
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-09-28 17:42:51 +02:00
Maciej Kurc
d8571b6c00 Decoupled critical path report generation from its printing
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-09-28 17:42:51 +02:00
Maciej Kurc
12adbb81b1 Switched to JSON format for timing analysis report
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-09-28 17:42:51 +02:00
Maciej Kurc
99ae5ef38e Added writing a CSV report with timing analysis of each net branch
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-09-28 17:42:51 +02:00
gatecat
19afb07370 interchange: Fix compile warnings
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-28 10:11:09 +01:00
gatecat
d89afc2aa6 ci: Enable -Werror for interchange arch
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-28 09:42:25 +01:00
gatecat
9d8d3bdbc4
Merge pull request #827 from YosysHQ/gatecat/idstring-in
idstring: Add 'in' function from Yosys
2021-09-27 22:03:11 +01:00
gatecat
0b0baf3446 idstring: Add 'in' function
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-27 19:18:40 +01:00
gatecat
535b2490c4
Merge pull request #812 from antmicro/MacroCells
Convert macros to clusters for better placement
2021-09-27 17:50:55 +01:00
Maciej Dudek
ea489f6d93 Fix small isses and code formatting
Signed-off-by: Maciej Dudek <mdudek@antmicro.com>
2021-09-27 16:16:33 +02:00
gatecat
9782a46a9b ci: Bump prjoxide version
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-24 19:21:44 +01:00
gatecat
d44b6acaa9
Merge pull request #826 from YosysHQ/gatecat/nexus-lutperm
nexus: Add LUT permutation support
2021-09-24 19:20:36 +01:00
gatecat
718ee441a0 nexus: Add resource cost overrides
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-24 19:19:26 +01:00
gatecat
ab6990f908 router2: Allow overriding resource costs
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-24 19:11:37 +01:00
gatecat
502fcff765 nexus: LUT permutation support
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-24 15:26:16 +01:00
Maciej Dudek
439ae9609b Break up macro_cluster_placement into smaller functions
Signed-off-by: Maciej Dudek <mdudek@antmicro.com>
2021-09-24 11:07:37 +02:00
Maciej Dudek
2de1ecfabe Update python-fpga-interchange to v0.0.20
Signed-off-by: Maciej Dudek <mdudek@antmicro.com>
2021-09-23 17:52:47 +02:00
Maciej Dudek
44def159cc Fix AC-3 algorithm
Signed-off-by: Maciej Dudek <mdudek@antmicro.com>
2021-09-23 17:15:09 +02:00
Maciej Dudek
b12119d8e8 Improve macro cluster placement
Signed-off-by: Maciej Dudek <mdudek@antmicro.com>
2021-09-23 15:43:23 +02:00
Maciej Dudek
94acf7a797 Change Cluster placement algorithm
Use physical placement from device DB
It should reduce runtime

Signed-off-by: Maciej Dudek <mdudek@antmicro.com>
2021-09-23 15:43:23 +02:00
Maciej Dudek
3cd459912a Adding MacroCell placement
Signed-off-by: Maciej Dudek <mdudek@antmicro.com>
2021-09-23 15:43:23 +02:00
Maciej Dudek
fdcfe8cd81 Adding support for MacroCells 2021-09-23 15:43:23 +02:00
gatecat
d9a71083e1
Merge pull request #825 from antmicro/chain_swap_fix
Fix chain swap
2021-09-23 14:10:46 +01:00
gatecat
24f13ec942
Merge pull request #822 from YosysHQ/gatecat/nexus-split-vcc
nexus: Support for split Vcc routing
2021-09-23 13:04:04 +01:00
gatecat
a886904540
Merge pull request #824 from YosysHQ/gatecat/py-sigint
python: Restore SIGINT handler while running a Python script
2021-09-23 13:03:51 +01:00
Maciej Dudek
8c97cbe341 Fix chain swap
Issue was due to dest_bels being not cleared between clusters unbindes, causing
newly bind bels to be unbinded and having their old bel value changed to new bel value.
Then when swap failed 2 cells were being bind to a single bel.

I tested leaving dest_bels in the function scope and moving it to the loop scope.
Code with dest_bels in the loop scope was faster than leaving it in the function scope,
and checking if the cell is in the processed cluster.

Signed-off-by: Maciej Dudek <mdudek@antmicro.com>
2021-09-23 13:58:22 +02:00
gatecat
b2e9ce46f1
Merge pull request #823 from YosysHQ/gatecat/nexus-r1-tweaks
nexus: Tweaks for router1 performance
2021-09-22 22:04:56 +01:00
gatecat
562d02196c python: Restore SIGINT handler while running a Python script
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-22 22:01:58 +01:00
gatecat
41c07126ec
Merge pull request #821 from YosysHQ/gatecat/dsp-fix
nexus: Fix DSP macro placement
2021-09-22 16:57:49 +01:00
gatecat
f395ad3e27 nexus: Support for split Vcc routing
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-22 15:00:59 +01:00
gatecat
fed682ee5f nexus: Tweaks for router1 performance
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-22 14:55:10 +01:00
gatecat
4d90850676 placer1: Remove redundant relative constraint check
Macros with potentially inconsistent spacing are now permissible.

Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-22 13:14:45 +01:00
gatecat
53e94653f3 nexus: Fix DSP macro placement
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-22 13:12:21 +01:00
gatecat
035452d938
Merge pull request #815 from antmicro/nexus-fix-siologic-handling
nexus: Fixed an improved SIOLOGIC handling
2021-09-20 13:15:39 +01:00
Maciej Kurc
80e2f8a791 Added support for syn_useioff for enabling tri-state control FF integration into IOLOGIC.
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-09-20 11:35:36 +02:00
gatecat
e926cddca2 placer1: Fix cluster swap cost updates
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-18 11:11:24 +01:00
gatecat
4730a4f339 timing: Always use max delay for required time
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-18 11:04:39 +01:00
gatecat
287a860283 timing: Fix slack for unconstrained clocks
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-18 10:43:19 +01:00
gatecat
d17b5faf76
Merge pull request #817 from YosysHQ/gatecat/chain-swap
placer1: Allow swapping chains with other chains
2021-09-18 09:25:32 +01:00
gatecat
f119f56e63 placer1: Allow swapping chains with other chains
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-17 21:51:18 +01:00
Maciej Kurc
8ffd30cb2d Use correct names for IDDRX1_ODDRX1 FASM features
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-09-17 15:52:56 +02:00
Maciej Kurc
ef9eee6b15 Added automatic inference and integration of FFs driving T pin into IOLOGIC
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-09-17 13:49:35 +02:00
Maciej Kurc
6948d41616 Added handling of the case when tri-state control net bypasses SIOLOGIC bel
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-09-17 13:49:35 +02:00
gatecat
7c82a04df5
Merge pull request #813 from YosysHQ/gatecat/py-on-fail
command: Allow running Python on failure for state introspection
2021-09-17 09:29:38 +01:00
gatecat
1e4f706ace command: Allow running Python on failure for state introspection
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-16 20:56:32 +01:00
gatecat
67bd349e8f
Merge pull request #806 from yrabbit/extend-placement
gowin: Add constraints on primitive placement.
2021-09-08 19:01:34 +01:00
gatecat
95845b47b5
Merge pull request #808 from acomodi/fix-xdc
interchange: xdc: add more not_implemented commands
2021-09-08 15:56:41 +01:00
Alessandro Comodi
258b46125f interchange: xdc: add more not_implemented commands
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-09-08 15:15:58 +02:00
YRabbit
544d6073bc Merge branch 'master' into extend-placement 2021-09-08 09:31:42 +10:00
gatecat
675a96fc5a
Merge pull request #807 from acomodi/fix-xdc
interchange: xdc: add common not_implemented function
2021-09-07 17:01:37 +01:00
Alessandro Comodi
46fc902bcf interchange: xdc: add common not_implemented function
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-09-07 16:47:37 +02:00
YRabbit
9368671ca9 Merge branch 'master' into extend-placement 2021-09-07 09:18:28 +10:00
gatecat
d4a14a0d04 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-06 13:29:52 +01:00
gatecat
d08fb255a2 router2: Fix uninitialised values
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-06 13:29:23 +01:00
YRabbit
d6fdd6c7ce Merge branch 'combine-dff' into extend-placement 2021-09-04 17:39:09 +10:00
YRabbit
e4701f2da1 Merge branch 'master' into extend-placement 2021-09-04 16:29:21 +10:00
gatecat
fd6366f027 nexus: Fix getBelGlobalBuf
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-02 17:23:11 +01:00
gatecat
01b51fb715 router2: Fix explored count
Signed-off-by: gatecat <gatecat@ds0.me>
2021-09-02 17:08:54 +01:00
YRabbit
e82d49e13a Merge branch 'master' into combine-dff 2021-09-02 18:19:30 +10:00
gatecat
0c40bed425
Merge pull request #790 from acomodi/place-only-same-cluster-in-site
interchange: place only cells belonging to the same clusters in the same site
2021-08-31 12:37:04 +01:00
Alessandro Comodi
e0950408d5 interchange: clusters: fix other cluster allowance checks in same site
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-08-31 12:44:36 +02:00
Alessandro Comodi
2df931f7db interchange: entirely disable cache when binding site routing
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-08-31 12:08:46 +02:00
Alessandro Comodi
85cf6562b6 gh: interchange: bump python-interchange tag
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-08-31 11:54:22 +02:00
YRabbit
f3899696a7 gowin: Place DFFs of different types in the slice.
Allow the registers of the same type or pairs shown below to be
placed in the same slide:

|--------|--------|
| DFFS   | DFFR   |
| DFFSE  | DFFRE  |
| DFFP   | DFFC   |
| DFFPE  | DFFCE  |
| DFFNS  | DFFNR  |
| DFFNSE | DFFNRE |
| DFFNP  | DFFNC  |
| DFFNPE | DFFNCE |

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-08-31 07:53:15 +10:00
YRabbit
23a5e91858 gowin: Add constraints on primitive placement.
Added support for the INS_LOC instruction in the constraints file
(.CST), which is used to specify object placement.
Expanded treatment of IO_LOC/IO_PORT constraints, which now can
be applied to both ports and IO buffers.
Port constraints have priority.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-08-31 07:36:11 +10:00
Alessandro Comodi
78bf5796db interchange: disallow placing cells on sites with clusters
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-08-27 13:47:10 +02:00
gatecat
0e83db47a0 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2021-08-26 14:58:43 +01:00
gatecat
7f8e467acd
Merge pull request #805 from YosysHQ/gatecat/py-portref-byvalue
python: Wrap PortRef by value
2021-08-26 14:57:46 +01:00
gatecat
b85fe12234 python: Wrap PortRef by value
Signed-off-by: gatecat <gatecat@ds0.me>
2021-08-26 13:23:16 +01:00
gatecat
6fc41692d6
Merge pull request #710 from Ravenslofty/mistral-mlab-as-lab
mistral: Use MLABs as if they're LABs (for now)
2021-08-24 18:25:44 +01:00
gatecat
0367719eea mistral: Permute MLAB init bits correctly 2021-08-24 15:39:45 +01:00
gatecat
e15f0db408 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2021-08-24 12:48:08 +01:00
gatecat
86393c8c8e
Merge pull request #801 from yrabbit/TRBL-style
gowin: Add the IO[TRBL]style placement recognition
2021-08-23 21:58:08 +01:00
gatecat
42166f2e3e
Merge pull request #802 from YosysHQ/gatecat/python-rt-dly
python: Allow querying route delays
2021-08-23 21:56:42 +01:00
gatecat
de311e052f python: Allow querying route delays
Signed-off-by: gatecat <gatecat@ds0.me>
2021-08-23 20:51:53 +01:00
YRabbit
e4196f32d3 gowin: Add the IO[TRBL]style placement recognition
Specifying pin placement with this notation (e.g. IOR4B) allows
to use the same constraint file without changes for different
packages and even different families.
The vendor router also understands this notation.

Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-08-23 16:19:02 +10:00
gatecat
897a2fccb6
Merge pull request #798 from kleinai/extref-loc
Make EXTREFB handling more robust
2021-08-19 16:36:18 +01:00
gatecat
6ae9b47155
Merge pull request #800 from smunaut/fix_py_portrefvector
pybindings: Fix mapping for PortRefVector
2021-08-19 12:36:32 +01:00
Sylvain Munaut
df67783dd3 pybindings: Fix mapping for PortRefVector
This is used by net.users for instance.

Removed by mistake in 4ac00af6fa

Fixes #799

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2021-08-19 12:01:49 +02:00
Aidan Klein
e6006805ce Make EXTREFB handling more robust
Avoids a segfault if an EXTREFB does not connect directly to its associated DCUA.
Also adds location constraints specifically for EXTREFB.
2021-08-18 20:49:55 -04:00
Lofty
b88e86f366 mistral: Use MLABs as if they're LABs (for now)
Signed-off-by: Lofty <dan.ravensloft@gmail.com>
2021-08-17 16:02:49 +01:00
gatecat
b37d133c43
Merge pull request #794 from YosysHQ/gatecat/router2p5
router2: Improved bidir routing and timing-driven ripup option
2021-08-16 14:08:20 +01:00
gatecat
f207068ee2 router2: Add experimental timing-driven ripup option
Signed-off-by: gatecat <gatecat@ds0.me>
2021-08-15 16:22:03 +01:00
gatecat
42522c492c router2: Alternative congestion cost schedule
Signed-off-by: gatecat <gatecat@ds0.me>
2021-08-15 16:22:03 +01:00
gatecat
2a856db72c router2: Adding some criticality heuristics
Signed-off-by: gatecat <gatecat@ds0.me>
2021-08-15 16:22:03 +01:00
gatecat
64f6b8bc67 router2: Improved bidir routing and data structures
Signed-off-by: gatecat <gatecat@ds0.me>
2021-08-15 16:22:03 +01:00
gatecat
4d54b62e63
Merge pull request #795 from YosysHQ/gatecat/mistral-include-fix
mistral: Include mistral generated files in include dirs
2021-08-15 16:20:51 +01:00
gatecat
f7be385230 mistral: Include mistral generated files in include dirs
Signed-off-by: gatecat <gatecat@ds0.me>
2021-08-15 15:13:31 +01:00
gatecat
e7db15d6a4 mistral: Fix pip binding check
Signed-off-by: gatecat <gatecat@ds0.me>
2021-08-14 20:23:05 +01:00
gatecat
a66cd0200b clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2021-08-14 20:22:54 +01:00
gatecat
b0a4f1b86e
Merge pull request #793 from gregdavill/ecp5_diff_od
ecp5: Enable OPENDRAIN on differential outputs
2021-08-14 13:48:55 +01:00
Greg Davill
200c57f475 ecp5: Enable OPENDRAIN on differential outputs 2021-08-14 19:26:58 +09:30
gatecat
dd63764331
Merge pull request #791 from yrabbit/wip
gowin: Add support for IOBUF and TBUF I/O modes. Change the constraint parser.
2021-08-06 10:14:59 +01:00
YRabbit
3f959c7421 gowin: Change the constraint parser to support multiple options per line. Add support for IOBUF and TBUF I/O modes.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-08-06 17:43:20 +10:00
gatecat
0c1ee5fad1
Merge pull request #789 from YosysHQ/gatecat/ecp5-pdp-outreg
ecp5: Copy REGMODE in PDP mode to both A and B ports
2021-08-03 13:05:01 +01:00
gatecat
5482b9a0c6 ecp5: Copy REGMODE in PDP mode to both A and B ports
Signed-off-by: gatecat <gatecat@ds0.me>
2021-08-02 20:58:45 +01:00
gatecat
ef1fbfc651
Merge pull request #787 from YosysHQ/gatecat/report
Add JSON utilisation and timing report
2021-07-30 14:29:55 +01:00
gatecat
8466985bc7
Merge pull request #788 from YosysHQ/gatecat/router2-ice40
router2: Mark the destination as visited during backwards routing
2021-07-30 11:10:21 +01:00
gatecat
b5a31d2e4e router2: Mark dest as visited during backwards routing
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-30 09:14:46 +01:00
gatecat
42f48b6dc0 router2: Improve debugability of pip conflicts
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-29 13:04:59 +01:00
gatecat
d2007a386c common: Add JSON timing and utilisation report
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-29 12:53:23 +01:00
gatecat
4ac00af6fa basectx: Add a field to store timing results
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-29 12:52:13 +01:00
gatecat
0991003de9
Merge pull request #785 from YosysHQ/gatecat/nexus2glb2fabric
nexus: Fix routeing of global clocks that also drive fabric
2021-07-29 09:17:37 +01:00
gatecat
504199e70e nexus: Fix routeing of global clocks that also drive fabric
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-28 15:35:19 +01:00
gatecat
39a7381928
Merge pull request #784 from YosysHQ/gatecat/nexus-ddr
nexus: Basic IDDRX1/ODDRX1 support
2021-07-28 15:34:31 +01:00
gatecat
efd3252d08
Merge pull request #783 from YosysHQ/gatecat/router2-crit-update
router2: Update route delays even when routes are congested
2021-07-28 13:57:14 +01:00
gatecat
5686fdcf1c nexus: Basic packer and FASM support for I/ODDR
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-28 13:27:02 +01:00
gatecat
d0acb1b239 nexus: Add IOLOGIC pins data
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-28 12:42:58 +01:00
gatecat
ce92cdf8e4 router2: Update route delays even when routes are congested
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-28 12:15:36 +01:00
gatecat
14c676ab49 timing: Allow overriding of route delays
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-28 11:20:28 +01:00
gatecat
eb6817c259
Merge pull request #780 from YosysHQ/gatecat/fix-io-inv
interchange: Search backwards for IO macro placements, too
2021-07-26 16:58:00 +01:00
gatecat
0b36616940
Merge pull request #779 from YosysHQ/gatecat/ic-import-fix
interchange: Don't attempt to import instances as modules
2021-07-26 16:57:49 +01:00
gatecat
b4602ae5bf interchange: Search backwards for IO macro placements, too
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-26 16:01:53 +01:00
gatecat
c74f0d3239 interchange: Don't attempt to import instances as modules
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-26 15:36:20 +01:00
gatecat
6be26fbde7
Merge pull request #775 from YosysHQ/gatecat/fix-io-checks
interchange: Check IO validity after all are placed
2021-07-26 12:35:29 +01:00
gatecat
ef3be26a69
Merge pull request #777 from YosysHQ/gatecat/gui-fixes
gui: Add about box and fix some small typos
2021-07-25 13:07:47 +01:00
gatecat
bbb1ea26b6 gui: Fix some typos
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-25 12:11:03 +01:00
gatecat
0e3b25468c gui: Implement about dialog
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-25 12:06:51 +01:00
gatecat
f61fa73b77 interchange: Check IO validity after all are placed
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-23 17:09:39 +01:00
gatecat
5212e38512
Merge pull request #757 from antmicro/lut-mapping-cache
interchange: Add caching of site LUT mapping solution
2021-07-22 14:09:40 +01:00
Maciej Kurc
580a45485a Added an option to disable the LUT mapping cache
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-07-22 14:07:35 +02:00
Maciej Kurc
8fc16a57c9 Added more code comments, formatted the code
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-07-22 12:59:10 +02:00
gatecat
8733cce5fa
Merge pull request #772 from antmicro/xdc_parse
[Interchange] Add dummy function to parse creat_clock in XDC files
2021-07-21 18:53:15 +01:00
Maciej Dudek
0e838c3cea Add dummy function to parse creat_clock in XDC files
Signed-off-by: Maciej Dudek <mdudek@antmicro.com>
2021-07-21 18:43:11 +02:00
gatecat
391248e031
Merge pull request #768 from YosysHQ/gatecat/fix-gui-error
gui: Improve Fatal Error message
2021-07-21 11:42:54 +01:00
gatecat
86a91ccf1b clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-21 10:57:48 +01:00
gatecat
1a5bb7b8ab
Merge pull request #770 from YosysHQ/gatecat/empty-idstringlist
Fix definition of an empty IdStringList
2021-07-20 18:25:49 +01:00
gatecat
ef08c4a91d
Merge pull request #771 from YosysHQ/gatecat/ice40-ip-no-busaddr74
ice40: Use default value when IP is missing BUS_ADDR74 parameter
2021-07-20 18:25:39 +01:00
gatecat
8f722a0d35 ice40: Use default value when IP is missing BUS_ADDR74 parameter
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-20 16:08:26 +01:00
gatecat
08bbe173ce Fix definition of an empty IdStringList
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-20 15:51:04 +01:00
gatecat
41eecd7ce2 gui: Improve Fatal Error message
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-20 15:01:34 +01:00
gatecat
f3be638ea9
Merge pull request #767 from YosysHQ/gatecat/ic-pref-const
interchange: Fix preferred constant handling when canInvert
2021-07-20 12:04:12 +01:00
gatecat
ffd97945ba interchange: Fix preferred constant handling when canInvert
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-20 10:42:04 +01:00
gatecat
c6aa51a2de
Merge pull request #766 from pepijndevos/python
Remove python path from gowin target
2021-07-17 20:37:04 +01:00
Pepijn de Vos
916ae180ac remove generic leftover in gowin 2021-07-17 17:36:54 +02:00
Pepijn de Vos
811f5b4d18 remove generic leftover in gowin 2021-07-17 17:35:49 +02:00
Maciej Kurc
ccf2bb123c Added computing and reporting LUT mapping cache size
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-07-16 15:53:00 +02:00
Maciej Kurc
c95aa86a8e Fixed assertion typos
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-07-16 15:16:31 +02:00
Maciej Kurc
857961a6bb Migrated C arrays to std::array containers.
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-07-16 14:55:45 +02:00
Maciej Kurc
0336f55b16 LUT mapping ceche optimizations 2
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-07-16 13:55:19 +02:00
Maciej Kurc
044c9ba2d4 LUT mapping cache optimizations 1
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-07-16 13:28:40 +02:00
Maciej Kurc
d52516756c Working site LUT mapping cache
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
2021-07-16 12:51:28 +02:00
gatecat
2c4599612c
Merge pull request #764 from acomodi/fix-pseudo-pips
interchange: disallow pseudo-pip on same nets if tile has luts
2021-07-15 17:39:13 +01:00
Alessandro Comodi
7edfcc3bfa interchange: disallow pseudo-pip on same nets if tile has luts
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-07-15 16:06:00 +02:00
gatecat
084e15f9cf
Merge pull request #762 from antmicro/testarch_timing
[interchange] Update chipdb and python-fpga-interchange versions
2021-07-14 17:44:50 +01:00
Maciej Dudek
9190bda27d [interchange] Update chipdb and python-fpga-interchange versions
Signed-off-by: Maciej Dudek <mdudek@antmicro.com>
2021-07-14 17:19:30 +02:00
gatecat
034467ff61
Merge pull request #761 from acomodi/interchange-constrs
interchange: add user placement constraints handling
2021-07-12 20:04:48 +01:00
Alessandro Comodi
7abfeb11c3 interchange: xdc and place constr: address review comments
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-07-12 17:17:57 +02:00
Alessandro Comodi
3de0be7c06 interchange: xdc: add get_cells command
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-07-12 16:45:11 +02:00
Alessandro Comodi
d9668df818 interchange: add constraints constraints application routine
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-07-12 16:45:08 +02:00
gatecat
24b7084feb
Merge pull request #760 from YosysHQ/gatecat/xcup-ibufds
interchange: Support for UltraScale+ differential input buffers
2021-07-12 13:00:44 +01:00
gatecat
f03abe14d1 interchange: Skip IO ports in dedicated routing check
These have already been dealt with in arch_pack_io

Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-12 11:43:18 +01:00
gatecat
8604b03008 interchange: Debug IO port validity check failures
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-12 11:40:23 +01:00
gatecat
96a5885051 interchange: Place DIFFINBUF and IBUFCTRL for UltraScale+ IBUFDS
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-12 11:30:21 +01:00
gatecat
a63e7b3db8
Merge pull request #759 from pepijndevos/gw1ndb
GW1NR is not a seperate family, but GW1NS is
2021-07-11 14:00:52 +01:00
Pepijn de Vos
c89c14b6bf GW1NR is not a seperate family, but GW1NS is 2021-07-11 14:12:34 +02:00
gatecat
eecc6147df
Merge pull request #758 from YosysHQ/gatecat/hist-oob
timing: Fix out-of-bounds histogram bins in all cases
2021-07-11 08:10:57 +01:00
gatecat
76070a7647 timing: Fix out-of-bounds histogram bins in all cases
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-10 23:44:21 +01:00
gatecat
8531658019 Merge branch 'master' of github.com:YosysHQ/nextpnr 2021-07-10 23:24:38 +01:00
gatecat
d290766101 ice40: Fix order of values in error
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-10 23:23:19 +01:00
gatecat
478456e6e9
Merge pull request #755 from yrabbit/io_port
Pin modes parser
2021-07-08 17:22:10 +01:00
gatecat
7b62c7fa50
Merge pull request #756 from acomodi/fix-clustering-runtime
interchange: reduce run-time to check dedicated interconnect
2021-07-08 16:58:44 +01:00
Alessandro Comodi
b64642fc99 interchange: bump python-interchange version
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-07-08 16:51:23 +02:00
Alessandro Comodi
fbd291deaf interchange: update chipdb version
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-07-08 16:51:23 +02:00
Alessandro Comodi
dc0819b01a interchange: reduce run-time to check dedicated interconnect
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-07-08 16:51:23 +02:00
gatecat
6829e4c197 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-08 15:42:36 +01:00
YRabbit
881fd97c5a Fix the boolean.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-07-08 07:09:30 +10:00
YRabbit
d613626ab9 Fix formating
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-07-07 22:53:49 +10:00
YRabbit
5d8b27710d Fix boolean value.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-07-07 22:02:43 +10:00
YRabbit
5f018df4e4 Merge branch 'master' into io_port 2021-07-07 08:36:45 +10:00
YRabbit
fd7734f000 Wip parser
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-07-07 08:36:05 +10:00
gatecat
c696e88573
Merge pull request #751 from trabucayre/gw1ns-2
add support for GW1NS-2 family
2021-07-06 15:17:41 +01:00
gatecat
bf542f07b0
Merge pull request #754 from YosysHQ/gatecat/ecp5-dcs
ecp5: Add DCSC support
2021-07-06 14:06:31 +01:00
Gwenhael Goavec-Merou
027d54e771 .cirrus/Dockerfile.ubuntu20.04: update apycula to 0.0.1a9 2021-07-06 14:34:33 +02:00
gatecat
5b2db015a9
Merge pull request #752 from YosysHQ/gatecat/du-mem-error
design_utils: Fix memory error
2021-07-06 12:43:48 +01:00
gatecat
81c549549d ecp5: Add DCSC support
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-06 11:45:37 +01:00
gatecat
c0bb2fb76a
Merge pull request #750 from YosysHQ/gatecat/io-improve
IO improvements for OBUFTDS
2021-07-06 11:43:24 +01:00
gatecat
3d0facf119 design_utils: Fix memory error
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-06 11:35:27 +01:00
Gwenhael Goavec-Merou
96263058c3 add support for GW1NS-2 family
Signed-off-by: Gwenhael Goavec-Merou <gwenhael.goavec-merou@trabucayre.com>
2021-07-06 11:40:41 +02:00
gatecat
31abefc8e4 interchange: Allow pseudo pip wires to overlap with bound site wires on the same net
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-06 10:38:08 +01:00
gatecat
6fe071ad1d router2: Dump pre-bound routes when routing fails in debug mode
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-06 10:21:31 +01:00
gatecat
f64d06fa02 interchange: Improve search for PAD-attached bels
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-06 10:13:50 +01:00
Alessandro Comodi
6edc11de4d interchange: tests: add obuftds test
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-07-06 09:57:26 +01:00
YRabbit
baa68fa4c1 Parser
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-07-05 08:31:01 +10:00
YRabbit
1aae331ddc Merge branch 'master' into io_port 2021-07-03 10:09:38 +10:00
YRabbit
5c5982c50a Fix parser. Comments and IO_PORT
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-07-03 08:23:25 +10:00
gatecat
8a9fb81036
Merge pull request #748 from acomodi/fix-phys-net-writing
interchange: phys: skip only nets writing on disconnected out ports
2021-07-02 18:34:46 +01:00
Alessandro Comodi
888a2462af interchange: phys: skip only nets writing on disconnected out ports
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-07-02 16:12:53 +02:00
YRabbit
9443267717 Syntax
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-07-02 14:58:17 +10:00
YRabbit
a65f0e57b9 Add IO_PORT parsing
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
2021-07-02 14:00:20 +10:00
gatecat
fe38e70dc1
Merge pull request #747 from cr1901/machxo2
MachXO2 Checkpoint 1
2021-07-01 20:17:02 +01:00
gatecat
55c663f7ac
Merge pull request #746 from YosysHQ/gatecat/ic-can-invert-const
interchange: Handle canInvert PIPs when processing preferred constants
2021-07-01 15:28:24 +01:00
gatecat
344cfe6216
Merge pull request #745 from YosysHQ/gatecat/ic-node-source
interchange: Handle case where routing source is a node
2021-07-01 15:28:16 +01:00
William D. Jones
41d09f7187 machxo2: Fix packing for directly-connected DFFs. 2021-07-01 09:59:53 -04:00
William D. Jones
e625876949 machxo2: Add VHDL primitives, demo, and script. 2021-07-01 09:36:03 -04:00
William D. Jones
45c33e9dcf machxo2: Add a special case for pips whose config bits are in multiple
tiles.
2021-07-01 09:36:02 -04:00
William D. Jones
ec239c8c35 machxo2: Hardcode a rule for emitting U_/D_ or G_ prefixes in ASCII output. 2021-07-01 09:36:01 -04:00
William D. Jones
b1f25d4b33 machxo2: Set Pip and Wire delays to reasonable fake values mirroring
estimateDelay.
2021-07-01 09:36:00 -04:00
gatecat
74ffe2c543 interchange: Handle canInvert PIPs when processing preferred constants
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-01 13:47:02 +01:00
gatecat
f17643bc08 interchange: Handle case where routing source is a node
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-01 13:19:10 +01:00
gatecat
86bc708299 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-01 13:18:34 +01:00
gatecat
ddff2e2e5e
Merge pull request #744 from YosysHQ/gatecat/const-in-macro
interchange: Fix handling of constants in macros
2021-07-01 13:12:38 +01:00
gatecat
79ab283890
Merge pull request #743 from YosysHQ/gatecat/site-rsv-ports
interchange: Reserve site ports only reachable from dedicated routing
2021-07-01 13:12:29 +01:00
gatecat
8b4e880827
Merge pull request #742 from acomodi/interchange-do-not-output-zero-user-nets
interchange: phys: do not output nets which have no users
2021-07-01 13:12:19 +01:00
gatecat
006a40a353 interchange: Fix handling of constants in macros
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-01 11:45:23 +01:00
Alessandro Comodi
dd7cfccbae interchange: phys: do not output nets which have no users
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-07-01 12:36:05 +02:00
gatecat
523ffbaa37 interchange: Reserve site ports only reachable from dedicated routing
Signed-off-by: gatecat <gatecat@ds0.me>
2021-07-01 11:28:12 +01:00
gatecat
2124da44d8
Merge pull request #741 from acomodi/fix-ded-interc
interchange: fix dedicated interconnect exploration
2021-06-30 20:09:52 +01:00
Alessandro Comodi
cfbd1dfa4d interchange: fix dedicated interconnect exploration
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-06-30 20:04:23 +02:00
gatecat
152c41c3ac
Merge pull request #739 from YosysHQ/gatecat/usp-io-macro
interchange: Place entire IO macro based on routeability
2021-06-30 13:00:12 +01:00
gatecat
b3882f8324 interchange: Fix dedicated interconnect check when site is the same
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-30 11:48:51 +01:00
gatecat
ef18590043 interchange: Place IO macro content based on routing
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-30 11:37:30 +01:00
gatecat
91b998bb11
Merge pull request #738 from YosysHQ/json_load_reinit
Preserve ArchArgs and reinit Context when applicable in GUI, fixes  #737
2021-06-30 09:59:38 +01:00
Miodrag Milanovic
5c6b8a5f04 Preserve ArchArgs and reinit Context when applicable in GUI 2021-06-30 10:10:18 +02:00
Miodrag Milanovic
6c23fe202c loading json should be disabled in this place 2021-06-30 09:46:25 +02:00
gatecat
2476f116bb interchange: Track the macros that cells have been expanded from
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-29 14:48:47 +01:00
gatecat
78c965141f
Merge pull request #736 from YosysHQ/gatecat/pp-multi-output
interchange: Allow site wires driven by more than one bel
2021-06-28 16:27:04 +01:00
gatecat
7115dd3393
Merge pull request #735 from YosysHQ/gatecat/ic-disconn-belpin
interchange: Handle disconnected bel pins in dedicated interconnect
2021-06-28 16:26:53 +01:00
gatecat
65a4bce9ad interchange: Allow site wires driven by more than one bel
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-28 14:55:56 +01:00
gatecat
980a7013d2 interchange: Handle disconnected bel pins in dedicated interconnect
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-28 14:45:27 +01:00
gatecat
454617f0cb
Merge pull request #734 from acomodi/remove-rw-patch
ci: remove RapidWright patching
2021-06-24 08:27:47 +01:00
Alessandro Comodi
721e760f1a ci: remove RapidWright patching
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-06-24 08:23:59 +02:00
gatecat
c73d4cf6dd
Merge pull request #733 from acomodi/interchange-move-macro-before-io
interchange: arch: move macro expansion step before ios packing
2021-06-18 19:09:18 +01:00
Alessandro Comodi
0344fdcf8d interchange: arch: move macro expansion step before ios packing
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-06-18 16:42:05 +02:00
gatecat
0f9a88b2cd
Merge pull request #731 from YosysHQ/gatecat/timing-mem-error
sta: Fix a memory error introduced by using dict instead of unordered_map
2021-06-17 18:32:43 +01:00
gatecat
889c295baf sta: Fix a memory error introduced by the dict move
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-17 12:06:26 +01:00
gatecat
167867ff7c
Merge pull request #730 from YosysHQ/gatecat/dcc-routehtru
nexus: Fix some 17k reliability issues
2021-06-17 08:53:54 +01:00
gatecat
3d528adfdc nexus: Disable center DCC-thrus on 17k device
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-16 13:52:10 +01:00
gatecat
84fc2877c6 nexus: Fix FASM gen for DCC-thru
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-16 13:23:42 +01:00
gatecat
ded32f3390
Merge pull request #728 from YosysHQ/gatecat/nexus-ram
interchange/nexus: Add RAM techmap rule and a RAM test
2021-06-15 17:39:23 +01:00
gatecat
9df05c4f98 interchange: Bump versions
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-15 16:32:02 +01:00
gatecat
b77119e1a3
Merge pull request #729 from acomodi/interchange-fix-phys-net-writer
interchange: fix phys net writer
2021-06-15 15:45:09 +01:00
Alessandro Comodi
f9054190fd interchange: fix phys net writer
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-06-15 14:07:20 +02:00
gatecat
3e8f08895b nexus: Add modified version of RAM test
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-15 11:07:40 +01:00
gatecat
f42ad6b90c nexus: Add PDPSC16K->PDPSC16K_MODE to remap rules
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-15 09:21:53 +01:00
gatecat
f4bfc2af5b
Merge pull request #727 from YosysHQ/gatecat/ic-undriven
interchange: Cope with undriven nets in more places
2021-06-14 11:57:56 +01:00
gatecat
377f56c151 interchange: Cope with undriven nets in more places
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-14 10:58:42 +01:00
gatecat
ee65e6f32d
Merge pull request #724 from YosysHQ/gatecat/update-names
Update deadnames and emails
2021-06-12 14:07:47 +01:00
gatecat
c1d35c1bce
Merge pull request #726 from YosysHQ/gatecat/mem-errors
HeAP: Fix memory error introduced by switch to dict
2021-06-12 14:02:07 +01:00
gatecat
c401ca3d1e Bump tests submodule
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-12 13:22:38 +01:00
gatecat
1941d1aa81 Update URLs
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-12 13:22:38 +01:00
gatecat
2ffb081442 Fixing old emails and names in copyrights
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-12 13:22:38 +01:00
gatecat
f9d3b99e63 HeAP: Fix memory error introduced by switch to dict
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-12 13:07:11 +01:00
gatecat
1c7efdc02c
Merge pull request #720 from acomodi/interchange-clusters
interchange: enable clusters support
2021-06-11 11:36:42 +01:00
Alessandro Comodi
aa1784c5d9 interchange: ci: add RW patch for missing cell bel maps
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-06-11 11:49:59 +02:00
Alessandro Comodi
b65dbd5c9e interchange: clusters: always get cell bel map and add asserts
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-06-11 11:19:01 +02:00
Alessandro Comodi
af520f0f92 interchange: ci: update python-interchange tag
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-06-11 11:19:01 +02:00
Alessandro Comodi
64b45848d7 interchange: run clang formatter
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-06-11 11:19:01 +02:00
Alessandro Comodi
d72c10cb6c interchange: clusters: adjust comments
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-06-11 11:19:01 +02:00
Alessandro Comodi
e8191dc061 interchange: increase chipinfo version
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-06-11 11:19:01 +02:00
Alessandro Comodi
490ca794c5 interchange: tests: counter: emit carries for xc7
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-06-11 11:19:01 +02:00
Alessandro Comodi
104536b7aa interchange: add support for generating BEL clusters
Clustering greatly helps the placer to identify and pack together
specific cells at the same site (e.g. LUT+FF), or cells that are chained through
dedicated interconnections (e.g. CARRY CHAINS)

Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-06-11 11:19:01 +02:00
gatecat
7278d3c0ed Merge branch 'test_framework' 2021-06-11 08:44:39 +01:00
Tomasz Michalak
3cc58b3918 fpga_interchange: Add site router tests
Signed-off-by: Tomasz Michalak <tmichalak@antmicro.com>
2021-06-11 08:43:30 +01:00
Tomasz Michalak
ba502e6e9f tests: fpga_interchange: Update module to use site router test framework
Signed-off-by: Tomasz Michalak <tmichalak@antmicro.com>
2021-06-11 08:43:28 +01:00
gatecat
e9d5b75d1d ecp5: Add missing clock edge assignments
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-10 13:10:29 +01:00
gatecat
13c037cc08 nexus: Fix LRAM x coord 2021-06-10 10:10:26 +01:00
gatecat
5e18bb1735
Merge pull request #723 from YosysHQ/gatecat/fix-722
gui: Don't destroy context when loading JSON
2021-06-08 13:08:49 +01:00
gatecat
8fa3088057 ecp5: Don't attempt to promote undriven nets to globals
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-07 21:20:40 +01:00
gatecat
875004d300 gui: Don't destroy context when loading JSON
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-07 21:07:17 +01:00
gatecat
d946cfd265 mistral: Fix include path in GUI cmake, too
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-07 15:19:24 +01:00
gatecat
4e85203a13
Merge pull request #721 from YosysHQ/gatecat/mistral-cmake
Updates for latest libmistral
2021-06-05 13:57:04 +01:00
gatecat
bcc5158eab ci: Bump mistral version
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-05 13:01:49 +01:00
gatecat
6fbc9e8159 mistral: Remove mistral root argument
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-04 19:25:34 +01:00
gatecat
47f24a7024 mistral: Build libmistral as a cmake subdir
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-04 19:25:18 +01:00
gatecat
a3d8b4f9d1
Merge pull request #718 from YosysHQ/gatecat/hashlib
Moving from unordered_{map, set} to hashlib
2021-06-03 09:04:34 +01:00
gatecat
dcbb322447 Remove redundant code after hashlib move
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-02 15:05:20 +01:00
gatecat
897e2c2fdc Use hashlib in frontend, where possible
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-02 15:05:20 +01:00
gatecat
eca1a4cee4 Use hashlib in most remaining code
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-02 15:05:20 +01:00
gatecat
b8a68f5f35 Using hashlib in timing
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-02 15:05:20 +01:00
gatecat
ecc19c2c08 Using hashlib in arches
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-02 15:05:19 +01:00
gatecat
f4fed62c05 Use hashlib in routers
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-02 15:04:53 +01:00
gatecat
dfe0ce599a Bump tests submodule
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-02 15:04:53 +01:00
gatecat
43b8dde923 Use hashlib in placers
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-02 15:04:49 +01:00
gatecat
579b98c596 Use hashlib for core netlist structures
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-02 14:27:56 +01:00
gatecat
ff72454f83 Add hash() member functions
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-02 14:27:56 +01:00
gatecat
76ef768864 common: Import hashlib from Yosys
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-02 14:27:56 +01:00
gatecat
589ca8ded5
Merge pull request #719 from YosysHQ/gatecat/mistral-llvm
mistral: Fix nextpnr build with LLVM
2021-06-02 11:56:45 +01:00
gatecat
cbedf52342 mistral: Fix nextpnr build with LLVM
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-02 10:44:03 +01:00
gatecat
2bef7b5f7b clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-01 17:10:40 +01:00
gatecat
e5c8214f2c
Merge pull request #717 from YosysHQ/gatecat/timing-memory-fix
timing: Fix use of uninitialised value
2021-06-01 12:23:57 +01:00
gatecat
665ab09d20
Merge pull request #715 from YosysHQ/gatecat/ic-lifcl40
interchange: Add LIFCL-40 EVN tests
2021-06-01 11:45:34 +01:00
gatecat
315a5733d2 timing: Fix use of uninitialised value
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-01 11:40:55 +01:00
gatecat
0426ba4e87 interchange: Add LIFCL-40 EVN tests
Signed-off-by: gatecat <gatecat@ds0.me>
2021-06-01 09:52:40 +01:00
Miodrag Milanovic
24ae205f20 Fixed warnings in QtPropertyBrowser component 2021-05-31 16:48:25 +02:00
Miodrag Milanovic
473723b24a Fix hidpi, fixes #167, fixes #275, fixes #425 2021-05-31 16:20:43 +02:00
gatecat
bf67845df6
Merge pull request #714 from YosysHQ/gatecat/mistral-dis-compress
mistral: Make RBF compression optional
2021-05-30 16:18:07 +01:00
gatecat
eb2265a2bf mistral: Make RBF compression optional
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-30 15:50:12 +01:00
gatecat
e2b838a10a
Merge pull request #713 from YosysHQ/gatecat/version-bump
interchange: Bump versions
2021-05-27 11:59:51 +01:00
gatecat
ba69b35501 interchange: Bump versions
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-27 11:21:34 +01:00
gatecat
e19d44ee20
Merge pull request #686 from YosysHQ/gatecat/interchange-macro
interchange: Add macro expansion
2021-05-21 11:05:57 +01:00
gatecat
ff48ad83be interchange: Bump versions
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-21 10:00:35 +01:00
gatecat
bae83857a3 interchange: Add macro parameter mapping
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-21 10:00:35 +01:00
gatecat
64f5b1d031 interchange: Don't error out on missing cell ports
This is required for LUTRAM support, as the upper address bits of
RAMD64E etc are missing for shallower primitives.

Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-21 10:00:35 +01:00
gatecat
a146dbdb03 interchange: Add LUTRAM test
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-21 10:00:35 +01:00
gatecat
2759480cb5 interchange: Preliminary implementation of macro expansion
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-21 10:00:35 +01:00
gatecat
237b27e50b interchange: Add macro param map rules to chipdb
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-21 10:00:35 +01:00
gatecat
012b60c9ca interchange: Add macro data to chipdb
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-21 10:00:35 +01:00
gatecat
81818fd38c
Merge pull request #712 from YosysHQ/gatecat/rr-heatmap
router2: Add heatmap by routing resource type
2021-05-21 09:59:19 +01:00
gatecat
54b8364cea
Merge pull request #711 from acomodi/interchange-site-to-pseudo-pips
interchange: phys: add site instance idstr for pseudo tile PIPs
2021-05-20 19:45:27 +01:00
Alessandro Comodi
9dce00a4e7 gh-actions: interchange: use commit sha as cache key
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-05-20 19:57:03 +02:00
Alessandro Comodi
6e22a9ea97 bump interchange schema
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-05-20 19:24:53 +02:00
gatecat
1595c07260 router2: Add heatmap by routing resource type
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-20 14:54:23 +01:00
Alessandro Comodi
84359f39c5 interchange: phys: add site instance idstr for pseudo tile PIPs
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-05-19 18:48:54 +02:00
gatecat
5a41d2070c Run clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-16 16:25:05 +01:00
gatecat
179ae683cc
Merge pull request #708 from Ravenslofty/mistral-getchipname
mistral: add getChipName
2021-05-15 22:59:46 +01:00
Lofty
b81ba2d6c2 mistral: add getChipName
Signed-off-by: Lofty <dan.ravensloft@gmail.com>
2021-05-15 22:50:56 +01:00
gatecat
47b4e42b1c
Merge pull request #707 from gatecat/cyclonev
mistral: Initial Cyclone V support
2021-05-15 22:37:19 +01:00
gatecat
3eeb2b20eb Update README
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 21:51:56 +01:00
gatecat
9d7f90dd89 mistral: Add MISTRAL_CLKBUF cell type
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 21:28:48 +01:00
gatecat
6cef569155 ci: Use GH only for Mistral and fpga-interchange
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 15:53:25 +01:00
gatecat
3bb94192d5 mistral: Tidying up
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
b1e1492dac mistral: Make router2 the default
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
f318898474 router2: Hacky workaround for slow Cyclone V convergence
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
7fbfd98b8a mistral: Speed up bel binding and checking
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
34677d3883 mistral: Workaround for weird SCLR issue
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
9221acc9e2 mistral: Fix ENA and ACLR bitstream generation
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
4d32c4f2fc mistral: Disable global buffers that are currently broken
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
511e46c40f router2: Reduce verbosity when debugging
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
e1aaf715c6 mistral: Compensate for EF_SEL mirroring in validity check
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
87ebada258 mistral: Fix EF_SEL and BTO_DIS
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
8bc9732d49 mistral: PKREG bits appear to be mirrored within a half?
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
757a10c247 mistral: Debugging flipflops
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
dce847b2f3 mistral: Trim SDATA if SLOAD is low
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
b29fa1d24c mistral: FF&CLKBUF fixes, part 1
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
66b3a192f8 mistral: First pass at FF and CLKBUF bitgen
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
b2f45b1aab mistral: Account for TD input count limit
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
bd525d3548 msitral: Fix pip iterator Python bindings
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
8c7fa8e6c9 mistral: Implement PIP locations, too
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
6ad329c540 mistral: Implement bounding boxes for router2
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
e688ee0e89 mistral: Debugging carry chain issues
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
3313d5267a mistral: Adding FF control set reservation
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
09a867310b mistral: Carry fixes
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
3d1bb4f1b2 mistral: Carry debugging
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
2f2fde7e6c mistral: Write arith mode to bitstream (not yet functional)
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
d39e67da7e mistral: First pass at carry packing
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
7574eab2b6 mistral: FF validity checking fixes
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
18e05ec852 mistral: Fix constant trimming
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
bacba274a2 mistral: Write LUT inits
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
d1f635242d mistral: Add some IO configuration
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
dea4c6f53f mistral: Setting some more boilerplate bits
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
27eb3be7da mistral: Add stub RBF generation
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
ad5e5f80ca mistral: Rename clock buffer primitive
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
a581526528 mistral: Python and GUI stub
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
386b5b901c mistral: Implement some misc. things
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
c5d983066d mistral: Some preps for generating bitstreams
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
2612853238 mistral: Adding a function for computing ALM LUT masks
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
5d191f8297 mistral: Add IO packing
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
96f16c8635 mistral: Add a basic QSF parser
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
595b354184 mistral: Add some packing logic based on nexus
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
3fc5396063 mistral: Working on FF validity checking
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
1b729d90d0 mistral: Add the 'pin style' stuff based on Nexus
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
d38ff14264 mistral: Working on ALM input assignment
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
e5e2f7bc62 mistral: Add stub pack/place/route functions
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
879ac39e53 mistral: Renamed arch from cyclonev
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
2938682295 cyclonev: Rebase update
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
9eb0bc482e cyclonev: More validity checking thoughts
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
a6ea72fd84 cyclonev: Add validity check and IO bels
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
fbdcfa9c42 cyclonev: First (untested) pass at ALM validity checking
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
1cd22b81da cyclonev: More preparations for validity checking
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
9bd7ef5f5f cyclonev: Preparations for validity checking
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
24af19b58d cyclonev: Fix some archcheck fails
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
431c4cec9f cyclonev: Rework bels
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
86ce6abf6a cyclonev: Outline LAB structure
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
c671961c18 cyclonev: Outline functions for creating bels/wires/pips
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
b1d3eb07c3 archcheck: Use old connectivity check for CycloneV
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
8677d59b92 cyclonev: Add routing graph
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
5d1b8bf744 cyclonev: Add names and archcheck fixes
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
af0bffbae9 cyclonev: Add some range types
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
c3cb9aa3f6 cyclonev: Add enough stubs that it links
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
9901a5fafc cyclonev: Add wire and pip types
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
7e57196cf9 cyclonev: Add some useful constids
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
gatecat
0533818cee cyclonev: Update in line with nextpnr changes
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-15 14:54:33 +01:00
Dan Ravensloft
9f2cbe1762 build bel list in constructor 2021-05-15 14:54:33 +01:00
Dan Ravensloft
170d6cffdd current progress 2021-05-15 14:54:33 +01:00
Dan Ravensloft
fcdf1e0bfd bind/unbind bel 2021-05-15 14:54:33 +01:00
Dan Ravensloft
189164e7c8 Resolve feedback 2021-05-15 14:54:33 +01:00
Dan Ravensloft
b8f58d558c couple of functions implemented 2021-05-15 14:54:31 +01:00
Dan Ravensloft
6ffbb9ed87 cyclonev: basic platform 2021-05-15 14:52:19 +01:00
gatecat
1b5767928d
Merge pull request #706 from acomodi/fix-illegal-site-thru
interchange: pseudo pips: fix illegal tile pseudo PIPs
2021-05-14 12:34:32 +01:00
Alessandro Comodi
428b56570d interchange: pseudo pips: fix illegal tile pseudo PIPs
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-05-14 12:17:53 +02:00
gatecat
21d594a150
Merge pull request #700 from acomodi/fix-illegal-site-thru
interchange: arch: do not allow site pips within sites
2021-05-13 11:02:15 +01:00
Alessandro Comodi
8c468acff8 interchange: site router: add valid pips list to check during routing
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-05-13 11:00:42 +02:00
Alessandro Comodi
fd93697a2d interchange: arch: do not allow site pips within sites
During general routing, the only site pips that can be allowed are those
which connect a site wire to the routing interface.

This might be too restrictive when dealing with architectures that
require more than one site PIPs to route from a driver within a site to the routing
interface (which is something that should be allowed in the
interchange).

Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-05-12 18:28:22 +02:00
gatecat
ced31aa917
Merge pull request #704 from YosysHQ/router2_stats
router2: Add some boundness statistics
2021-05-12 14:11:14 +01:00
gatecat
ee60e9c71c router2: Add some boundness statistics
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-12 12:18:58 +01:00
gatecat
ea45971dcc Update README
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-11 15:40:30 +01:00
gatecat
7e3bb72049
Merge pull request #702 from YosysHQ/gatecat/interchange-fix-bb
interchange: Fix bounding box computation
2021-05-11 13:59:09 +01:00
gatecat
e9fdbf618c router2: Fix a typo
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-11 13:02:23 +01:00
gatecat
7a1a95a2d6 interchange: Fix bounding box computation
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-11 13:02:23 +01:00
gatecat
744e91dda8
Merge pull request #701 from YosysHQ/gatecat/finer-debug
command: Allow debug output for just placer or router
2021-05-11 12:21:39 +01:00
gatecat
b3b79122e1 command: Allow debug output for just placer or router
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-11 11:35:43 +01:00
gatecat
466de95312
Merge pull request #695 from acomodi/fix-illegal-site-thru
interchange: fix site-thru pip legality
2021-05-10 16:05:34 +01:00
Alessandro Comodi
45618faf36 interchange: site router: fix log messages
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-05-10 14:20:54 +02:00
Alessandro Comodi
beff2b912c interchange: site router: fix illegal site thru paths
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-05-10 14:05:46 +02:00
gatecat
432b9d8bde
Merge pull request #694 from YosysHQ/gatecat/interchange-glbroute
interchange: Initial global routing implementation
2021-05-07 11:24:08 +01:00
gatecat
51949d95c3 interchange: Bump version
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-07 10:28:59 +01:00
gatecat
9a1cad85fe interchange: Adding a basic global buffer placer
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-07 10:28:59 +01:00
gatecat
9b3fb00908 interchange: Initial global routing implementation
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-07 10:28:56 +01:00
gatecat
b8c8200683 interchange: Add more global cell info
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-07 10:25:18 +01:00
gatecat
3144e83950
Merge pull request #697 from YosysHQ/gatecat/router2-dynamic-bb-expand
router2: Dynamicly expand bounding box based on congestion
2021-05-06 22:05:04 +01:00
gatecat
65c611da02 router2: Reserve wires in more complex cases
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-06 21:20:09 +01:00
gatecat
62613cb266 router2: Dynamicly expand bounding box based on congestion
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-06 19:04:24 +01:00
gatecat
ae8a910339 Revert "nexus: Enable placeAllAtOnce"
This reverts commit 0abe425675.
2021-05-06 15:51:54 +01:00
gatecat
c322cda3f8
Merge pull request #688 from YosysHQ/gatecat/new-cluster-api
New cluster API
2021-05-06 13:58:08 +01:00
gatecat
0d6be6f474 Add stub cluster API impl for remaining arches
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-06 13:12:52 +01:00
gatecat
c6fa1a179a nexus: Use new cluster API
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-06 12:25:32 +01:00
gatecat
1bf202adcd base_arch: Fix typo in getClusterPlacement
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-06 12:23:28 +01:00
gatecat
c82df9e40d ecp5: Use new cluster API
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-06 11:59:58 +01:00
gatecat
14863bc04e Update placers to use new cluster APIs
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-06 11:47:07 +01:00
gatecat
6a3eacddd6 Add default base implementation of cluster API
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-06 11:47:06 +01:00
gatecat
e1717bd771 Add BaseClusterInfo for base implementation
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-06 11:47:06 +01:00
gatecat
b62dcc4bcc arch_api: Outline of new cluster API
Signed-off-by: gatecat <gatecat@ds0.me>
2021-05-06 11:47:06 +01:00
gatecat
ed17091e6a
Merge pull request #692 from davidcorrigan714/patch-1
Fix variable name in bits.h for MSVC builds
2021-05-01 10:25:00 +01:00
David Corrigan
f5c2547952
Update bits.h
Fixed the variable name for windows MSVC builds.
2021-04-30 21:42:25 -05:00
gatecat
4bdf4582f0 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-30 18:38:30 +01:00
gatecat
3dd8986322
Merge pull request #664 from YosysHQ/gatecat/nexus-counter
interchange/nexus: Add counter example
2021-04-30 14:53:30 +01:00
gatecat
49caad0b7b interchange/nexus: Add counter example
Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-30 14:15:37 +01:00
gatecat
0461cc8c3a
Merge pull request #690 from YosysHQ/gatecat/interchange-wire-types
interchange: Add wire types
2021-04-30 13:29:21 +01:00
gatecat
5225550b5b interchange: Bump versions
Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-30 11:42:43 +01:00
gatecat
dcb09ec8de interchange: Implement getWireType
Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-30 11:07:31 +01:00
gatecat
ecf24201ec interchange: Add wire types to chipdb
Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-30 11:07:14 +01:00
gatecat
d718ccaa78
Merge pull request #689 from adamgreig/ecp5-alu
ECP5 ALU54B placement support
2021-04-29 10:50:28 +01:00
Adam Greig
d3a6cf3ae7
Only set CIBOUT_BYP on MULTs that are not feeding an ALU. 2021-04-29 02:23:45 +01:00
Adam Greig
b6c608e038
Add check_alu to Ecp5Packer
Checks that every ALU54B is correctly connected to two MULT18X18Ds:

* SIGNEDIA and SIGNEDIB connected to SIGNEDP
* MA and MB connected to P
* A and B connected to {ROA, ROB}

Diamond enforces these requirements; the connections are fixed
in any event so no other connection is possible.
2021-04-29 02:23:44 +01:00
Adam Greig
d4c688297c
Add relative constraints to position MULT18X18D near connected ALU54B. 2021-04-29 02:23:43 +01:00
Adam Greig
9538954cc6
Add ALU54B.REG_OPCODEOP1_1_CLK parameter support 2021-04-29 02:23:42 +01:00
gatecat
b7bf7c11a8
Merge pull request #685 from YosysHQ/gatecat/nexus-routing
nexus: Enable placeAllAtOnce
2021-04-25 12:46:14 +01:00
gatecat
0abe425675 nexus: Enable placeAllAtOnce
Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-25 11:53:21 +01:00
gatecat
3fd1ee7757
Merge pull request #683 from antmicro/interchange-allow-loc-keyword
interchange: allow LOC keyword in XDC files
2021-04-20 14:12:14 +01:00
Jan Kowalewski
d1548ed317 interchange: allow LOC keyword in XDC files
Signed-off-by: Jan Kowalewski <jkowalewski@antmicro.com>
2021-04-20 14:35:15 +02:00
gatecat
95698827b8
Merge pull request #682 from YosysHQ/gatecat/default-cellpins
interchange: Handle missing/disconnected cell pins
2021-04-20 11:33:51 +01:00
gatecat
0e6955a08d interchange: Bump versions
Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-20 10:42:33 +01:00
gatecat
18459a9e4c interchange: Handle disconnected/missing cell pins
Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-19 10:46:35 +01:00
gatecat
872b3aa63d interchange: Add default cell connections to chipdb
Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-19 10:16:26 +01:00
gatecat
6fbefb8f13
Merge pull request #681 from YosysHQ/gatecat/more-pybindings
Add Python bindings for placement tests
2021-04-15 11:16:31 +01:00
gatecat
1631cdffb8
Merge pull request #680 from YosysHQ/gatecat/fix-util
Fix utilisation report when bel buckets are used
2021-04-15 10:14:19 +01:00
gatecat
d4aac6586c Add Python bindings for placement tests
Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-15 10:00:45 +01:00
gatecat
d14db5c98f Fix utilisation report when bel buckets are used
Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-15 09:24:27 +01:00
gatecat
8f5185c381
Merge pull request #678 from acomodi/initial-fasm-generation
interchange: add FASM generation target and clean-up tests
2021-04-14 14:28:01 +01:00
Alessandro Comodi
ea9e12b6ae gh-actions: increase python-fpga-interchange tag version
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-04-14 14:36:47 +02:00
Alessandro Comodi
dfc9c3df8c interchange: add FASM generation target and clean-up tests
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-04-14 14:36:07 +02:00
gatecat
b26088f940
Merge pull request #679 from YosysHQ/gatecat/disable-absl
Hash table changes
2021-04-14 12:19:10 +01:00
gatecat
b0f57d234f ci: Re-enable abseil for interchange CI
Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-14 10:30:53 +01:00
gatecat
4e346ecfba Hash table refactoring
Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-14 10:30:19 +01:00
gatecat
2912860c97
Merge pull request #677 from YosysHQ/gatecat/ppip-no-input
interchange: Allow pseudo-cells with no input pins
2021-04-13 11:49:48 +01:00
gatecat
06e54f08e6 interchange: Allow pseudo-cells with no input pins
These are used for the LUT-as-GND-driver pseudo-pips in the Nexus arch,
which will probably be required for UltraScale too.

Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-13 10:58:41 +01:00
gatecat
423da76ff2
Merge pull request #676 from YosysHQ/gatecat/fix-sta-crash
timing: Fix domain init when loops are present
2021-04-13 10:34:14 +01:00
gatecat
ece10c3e04 timing: Fix domain init when loops are present
Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-13 09:23:08 +01:00
gatecat
5cd2a7f9c2
Merge pull request #674 from adamgreig/heap-spreader-fix
HeAP: Skip high-strength cells in both cell loops
2021-04-12 14:16:22 +01:00
gatecat
dc6453b720
Merge pull request #673 from YosysHQ/gatecat/fix-fast-bels-ref
fast_bels: Don't return pointer that might become invalid
2021-04-12 13:54:11 +01:00
Adam Greig
2fdf41ac01
HeAP: Skip high-strength cells in both cell loops.
Previously only the first loop skipped cells with high belStrength,
but they can't be processed by the second loop either, so skip them
there too.
2021-04-12 13:42:20 +01:00
gatecat
fc15105643 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-12 10:26:39 +01:00
gatecat
5b35329abb fast_bels: Don't return pointer that might become invalid
Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-12 10:23:41 +01:00
gatecat
b5731cee02
Merge pull request #668 from YosysHQ/gatecat/cell-bel-name-vcc
interchange: Disambiguate cell and bel pins when creating Vcc ties
2021-04-09 14:33:12 +01:00
gatecat
9cc09207fc
Merge pull request #669 from YosysHQ/gatecat/prjoxide-pin
interchange: Pin prjoxide commit in CI
2021-04-09 11:37:54 +01:00
gatecat
7acef00443 interchange: Pin prjoxide commit
Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-09 11:17:25 +01:00
gatecat
93e34b8754 interchange: Disambiguate cell and bel pins when creating Vcc ties
The pins created for tieing to Vcc were being named after the bel pin,
relying on the fact that Xilinx names cell and bel pins differently for
LUTs. This isn't true for Nexus devices which uses the same names for
both, and was causing a failure as a result.

This uses a "PHYS_" prefix that's highly unlikely to appear in a cell
pin name to disambiguate.

Signed-off-by: gatecat <gatecat@ds0.me>
2021-04-09 10:26:32 +01:00
Miodrag Milanović
581682a08e
Merge pull request #667 from YosysHQ/fix_qt
Add same fix as in issue #373
2021-04-08 13:40:44 +02:00
Miodrag Milanovic
157cc1b60c Add same fix as in issue #373 2021-04-08 12:33:34 +02:00
gatecat
883ece6034
Merge pull request #665 from cr1901/optional-lto
Add CMake option to enable IPO (enabled by default).
2021-04-07 12:21:23 +01:00
William D. Jones
2cb2985539 Add CMake option to enable IPO (enabled by default). 2021-04-07 06:25:29 -04:00
gatecat
31eda82b3f
Merge pull request #659 from litghost/pseudo_pip_fixes
[interchange] Pseudo pip fixes
2021-04-06 20:08:37 +01:00
gatecat
8501098c16
Merge pull request #663 from litghost/fix_router2_without_bb
Fix bug in router2 where router may give up too early.
2021-04-06 19:35:55 +01:00
Keith Rothman
ae2f7551c1 [interchange] Provide estimateDelay when USE_LOOKAHEAD is not defined.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-04-06 10:42:05 -07:00
Keith Rothman
c43ad2fab6 Don't fail-fast for GH actions to allow for easier CI debugging.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-04-06 10:42:05 -07:00
Keith Rothman
3200026e1f [interchange] Remove requirement to have wire_lut.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-04-06 10:42:05 -07:00
Keith Rothman
c2a6f6ce62 [interchange] Fix invalid use of local variables due to refactoring.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-04-06 10:42:05 -07:00
Keith Rothman
8773c645ca [interchange] Prevent site router from generating incorrect LUTs.
The previous logic tied LUT input pins to VCC if a wire was unplacable.
This missed a case where the net was present to the input of the LUT,
but a wire was still not legal.  This case is now prevented by tying the
output of the LUT to an unused net.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-04-06 10:42:05 -07:00
Keith Rothman
c11ad31393 [interchange] Scale edge cost of pseudo pips.
Previous pseudo pips were the same cost as regular pips, but this is
definitely too fast, and meant that the router was prefering them.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-04-06 10:42:05 -07:00
Keith Rothman
9b82ded77b [interchange] Fix missing inline methods in site_arch.impl.h
getBelPinWire and getBelPinType are marked as always inline, but were
not defined in a header.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-04-06 10:42:05 -07:00
Keith Rothman
90aa1d3b7e [interchange] Disallow site edges during general routing.
This prevents the general router from routing through sites, which is
not legal in FPGA interchange.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-04-06 10:42:05 -07:00
Keith Rothman
0d41fff3a7 [interchange] Add crude pseudo pip model.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-04-06 10:42:05 -07:00
Keith Rothman
a519341112 Fix bug in router2 where router may give up too early.
Was introduced in #612.  The logic before was intended to prevent the
router from terminating early when not using a bounding box, but the fix
in #612 simply removed that, meaning that the router might terminate
early incorrectly.  The solution here is to only use the toexplore
hysteric once a solution is found.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-04-06 10:22:47 -07:00
gatecat
ff449ca997
Merge pull request #661 from litghost/document_site_router
[interchange] Add some documentation for the site router.
2021-04-06 09:20:03 +01:00
gatecat
cf6833b9cd
Merge pull request #662 from litghost/fix_cirrus_ci
Increase vCPU to 5 because of cirrus resource limit change.
2021-04-06 09:18:30 +01:00
gatecat
8e0d8df791
Merge pull request #657 from acomodi/interchange-counter-multi-board
interchange: counter: testing on multiple boards
2021-04-06 08:12:02 +01:00
Keith Rothman
d399d3ae1b Increase vCPU to 5 because of cirrus resource limit change.
Cirrus CI now requires that RAM (in GiB) be less than 4*vCPU.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-04-05 16:12:47 -07:00
Keith Rothman
4301e4705b [interchange] Add some documentation for the site router.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-04-05 15:15:48 -07:00
gatecat
bb6079133c
Merge pull request #658 from litghost/increment_chipdb
[interchange] Update to v6 of FPGA interchange chipdb.
2021-04-02 09:46:21 +01:00
Keith Rothman
3a85088d66 [interchange] Update interchange CI for new chipdb change.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-04-01 15:59:48 -07:00
Keith Rothman
009d3b64b6 [interchange] Update to v6 of FPGA interchange chipdb.
Changes:
 - Adds LUT output pin to LutBelPOD.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-04-01 15:24:06 -07:00
Alessandro Comodi
366f8782cb interchange: counter: testing on multiple boards
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-04-01 10:23:07 +02:00
gatecat
ec98fee1ee
Merge pull request #646 from YosysHQ/gatecat/nexus-cmake
fpga_interchange: Add CMake support for Nexus/prjoxide
2021-03-31 15:14:51 +01:00
gatecat
3678eff5dc interchange: Fix nexus cmake review comments
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-31 10:11:09 +01:00
gatecat
edecc06fcf
Merge pull request #656 from litghost/fix_dedicated_interconnect_bug
Fix bug where DedicateInterconnect incorrectly allows some placements.
2021-03-30 22:36:51 +01:00
Keith Rothman
8675945b26 Fix bug where DedicateInterconnect incorrectly allows some placement.
This occurs when the driver pin and sink pin are part of the same site,
but not reachable with site routing only.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-30 13:24:39 -07:00
gatecat
4dc45ffdc8
Merge pull request #653 from litghost/fix_site_pip_check
[interchange] Fix site pip check for drivers.
2021-03-30 18:50:16 +01:00
Keith Rothman
7e47af1085 [interchange] Fix site pip check for drivers.
Previous code allowed router to entire sites with no sinks.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-30 10:04:18 -07:00
gatecat
9259763599 ci: Build prjoxide only for LIFCL
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-30 16:55:03 +01:00
gatecat
a003aae7c2 interchange: Split xc7 and nexus chipdb cmake
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-30 16:31:51 +01:00
gatecat
ecfaae7f9e interchange: Add Nexus LUT test
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-30 16:31:51 +01:00
gatecat
b6b8959397 interchange: Add Nexus to CI
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-30 16:31:51 +01:00
gatecat
3cb5e81d50 interchange: Add CMake support for Nexus/prjoxide
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-30 16:31:51 +01:00
gatecat
7a9082e698
Merge pull request #655 from YosysHQ/gatecat/alt-placer-fix
interchange: Fix illegal placements
2021-03-30 16:20:41 +01:00
gatecat
8863b962fd interchange: Fix illegal placements
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-30 15:28:19 +01:00
gatecat
99298d0aba nexus: Fix some IO FASM gen
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-30 12:04:01 +01:00
gatecat
7ae3f636ef nexus: Fix LIFCL-17 LRAM FASM
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-30 11:56:07 +01:00
gatecat
a6a92f6b6b nexus: Fix default IO config
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-29 21:35:44 +01:00
gatecat
0b1e089547
Merge pull request #651 from YosysHQ/gatecat/nexus-vcco
nexus: Fix bank Vcco FASM
2021-03-29 21:32:35 +01:00
gatecat
df339f4f3c nexus: Default HF_OSC_EN to ENABLED
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-29 21:25:14 +01:00
gatecat
d2579282a6 nexus: Fix bank Vcco FASM
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-29 20:38:50 +01:00
gatecat
692d7dc26d
Merge pull request #645 from litghost/add_counter_and_ram
FPGA interchange: Add counter and ram tests
2021-03-29 18:23:16 +01:00
gatecat
4419c36db5
Merge pull request #649 from acomodi/add-archcheck-to-all-tests
interchange: add archcheck tests to all-device-test target
2021-03-26 18:39:18 +00:00
Alessandro Comodi
d0bc033ab8 gh-actions: better yosys caching based on version
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-26 15:11:03 +01:00
Alessandro Comodi
b5ba3ee9ee interchange: add archcheck tests to all-device-test target
This increases parallelism and should make the FPGA interchange CI
faster

Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-26 15:11:03 +01:00
gatecat
0e9a1abc7e
Merge pull request #650 from YosysHQ/gatecat/nexus-17k-fixes
nexus: Fix FASM gen for LIFCL-17
2021-03-26 14:04:40 +00:00
gatecat
0f425aff5a nexus: Fix FASM gen for LIFCL-17
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-26 13:06:03 +00:00
Keith Rothman
f33d02dca9 Update README with latest develpment progress.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-25 17:56:15 -07:00
Keith Rothman
55c9d43c70 interchange: Fix bug in site router where a bad solution isn't remove.
This resulted in valid site routing solutions being missed.  Underlying
bug was an off-by-one error when unwinding a failed solution.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-25 17:56:14 -07:00
Keith Rothman
c8dccd3e7b Implement debugging tools for site router.
- Finishes implementation of SiteArch::nameOfPip and SiteArch::nameOfWire
 - Adds "explain_bel_status", which should be an exhaustive diagnostic
   of the status of a BEL placement.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-25 17:56:11 -07:00
Keith Rothman
cc4f2b4516 Add some FIXME's around VCC assumption in LUT logic.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-25 17:20:13 -07:00
Keith Rothman
bbe1881293 Add targets to generate YAML outputs for DeviceResource files.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-25 17:20:13 -07:00
Keith Rothman
91ca5f110b Re-work LUT mapping logic to only put VCC pins when required.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-25 17:20:13 -07:00
Keith Rothman
5dda3a14ff Fixup some of the re-mapping logic.
- Add IDEMPOTENT_CHECK define to perform some expected idempotent
   operations more than once to verify they work as expected.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-25 17:20:13 -07:00
Keith Rothman
77bc2f9130 Add initial handling of local site inverters and constant signals.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-25 17:20:09 -07:00
Keith Rothman
5e96740451 [FPGA interchange] Small fix to get_net_type.
If get_net_type was called before the driver was placed, it could return
the wrong value.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-25 17:14:53 -07:00
Keith Rothman
22fb2c1548 Enable counter tests and add RAM tests.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-25 17:14:53 -07:00
gatecat
7b1df27c1a
Merge pull request #648 from YosysHQ/gatecat/nexus-get_pins
nexus: Add support for get_pins PDC command
2021-03-25 17:36:21 +00:00
gatecat
c388cebf7f nexus: Add support for get_pins PDC command
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-25 16:39:24 +00:00
gatecat
f233bee970
Merge pull request #628 from acomodi/add-interchange-devices
fpga_interchange: add more devices
2021-03-25 16:03:22 +00:00
Alessandro Comodi
c4cb86efe9 gh-actions: use ccache and build tools before running tests
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-25 16:24:52 +01:00
Alessandro Comodi
9f28fa4e75 gh-actions: interchange: multiple jobs, one for each device
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-24 15:37:03 +01:00
Alessandro Comodi
1a774a0526 interchange: examples: remove unused makefiles
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-24 15:37:02 +01:00
Alessandro Comodi
b6d2a59fc2 interchange: devices: bel_bucket_seeds -> device_config
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-23 21:06:01 +01:00
Alessandro Comodi
15e945aa1c interchange: added boards and group testing across multiple boards
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-23 21:05:58 +01:00
Alessandro Comodi
2956a0ca03 gh-actions: remove multi-process arch generation
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-23 20:36:23 +01:00
Alessandro Comodi
4812092cdb fpga_interchange: add test data for new architectures
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-23 20:36:23 +01:00
Alessandro Comodi
658dadaa70 fpga_interchange: use higher java heap space
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-23 20:36:23 +01:00
Alessandro Comodi
336d31cbcf fpga_interchange: add more devices
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-23 20:36:23 +01:00
gatecat
3cc50a5744
Merge pull request #644 from litghost/add_global_buffers
[FPGA interchange] Add support for global buffers from chipdb.
2021-03-23 17:33:55 +00:00
gatecat
323da87dec
Merge pull request #643 from litghost/id_constants
[FPGA interchange] Convert some string constants to IdString.
2021-03-23 17:33:40 +00:00
gatecat
2300d81c3c
Merge pull request #640 from litghost/inversion_logic
Initial inverter logic for FPGA interchange
2021-03-23 16:59:35 +00:00
gatecat
8c85e648df
Merge pull request #639 from litghost/parameter_iteration
Update parameter processing based on new DeviceResources metadata
2021-03-23 16:51:28 +00:00
Keith Rothman
720f64ea60 [FPGA interchange] Add support for global buffers from chipdb.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-23 09:41:45 -07:00
Keith Rothman
0dd93035e4 [FPGA interchange] Convert some string constants to IdString.
Also add some optional diagnostic prints for cell -> BEL pin mapping.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-23 09:38:37 -07:00
gatecat
b7bf2c706f
Merge pull request #642 from YosysHQ/gatecat/missing-cell-pin
interchange: Add nice error for missing cell pins
2021-03-23 16:34:10 +00:00
Keith Rothman
831b94cdac Initial version of inverter logic.
For now just implements some inspection capabilities, and the site
router (for now) avoids inverted paths.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-23 09:03:07 -07:00
Keith Rothman
ae71206e1f Update FPGA interchange chipdb to v4 with inverter data.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-23 09:01:45 -07:00
Keith Rothman
8a50b02b9b Use new parameter definition data in FPGA interchange processing.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-23 09:01:43 -07:00
Keith Rothman
af1fba9f52 Update latest version of FPGA interchange schema.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-23 09:00:58 -07:00
gatecat
4d8dcab1d3
Merge pull request #641 from litghost/initial_lookahead
Initial lookahead for FPGA interchange.
2021-03-23 16:00:17 +00:00
gatecat
79400756f5 interchange: Add nice error for missing cell pins
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-23 15:40:34 +00:00
Keith Rothman
8d1eb0a195 Initial lookahead for FPGA interchange.
Currently the lookahead is disabled by default because of the time to
compute and RAM usage.  However it does appear to work reasonably well
in testing.  Further effort is required to lower RAM usage after initial
computation, and explore trade-off for cheaper time to compute.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-23 08:16:50 -07:00
gatecat
9ef412c2cc
Merge pull request #638 from litghost/fixup_physical_netlist_writer
Correct some bugs in writing of physical netlist w.r.t. site sources.
2021-03-22 18:32:26 +00:00
gatecat
a3ed97c0db
Merge pull request #637 from litghost/refine_site_router
Refine site router
2021-03-22 18:32:04 +00:00
gatecat
e8d36bf5bd
Merge pull request #634 from litghost/add_get_bel_pin_type
Add getBelPinType to Python interface.
2021-03-22 18:31:48 +00:00
gatecat
f6ae068cb2
Merge pull request #632 from litghost/add_check_pip_for_net
Add "checkPipAvailForNet" to Arch API.
2021-03-22 18:31:32 +00:00
Keith Rothman
32f2ec86c4 Rework FPGA interchange site router.
The new site router should be robust to most situations, and isn't
significantly slower with the use of caching.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-22 09:54:49 -07:00
Keith Rothman
0f4014615c Add missing dependencies to CMake targets.
- Add additional targets useful for various situations.
 - Have counter test use common remap.v file.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-22 09:47:33 -07:00
Keith Rothman
06bcde6243 Correct some bugs in writing of physical netlist w.r.t. site sources.
Local site sources should have their driving BEL pin included in the net
so that the site wire is driven by an output BEL pin.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-22 09:46:43 -07:00
Keith Rothman
4cd74bba2c Add getBelPinType to Python interface.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-22 09:25:45 -07:00
Keith Rothman
e7d81913a4 Add "checkPipAvailForNet" to Arch API.
This is important for distiguishing valid pseudo pips in the FPGA
interchange arch. This also avoids a double or triple lookup of
pip->net map.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-22 09:17:55 -07:00
gatecat
53ed6979a9
Merge pull request #636 from litghost/add_pseudo_pip_data
Add pseudo pip data
2021-03-22 15:24:36 +00:00
Keith Rothman
694f9ec3a5 Increment required python-fpga-interchange version.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-22 09:33:12 +00:00
Keith Rothman
db12a83ced Add pseudo pip data to chipdb (with schema bump).
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-22 09:33:12 +00:00
gatecat
68ca923bfe
Merge pull request #635 from litghost/refactor_headers
Refactor header structures in FPGA interchange Arch.
2021-03-22 09:30:38 +00:00
Keith Rothman
22c6754bcd Update tests to include Tcl header order fix.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-19 21:36:17 -07:00
Keith Rothman
2cd5bacca0 Refactor header structures in FPGA interchange Arch.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-19 21:36:06 -07:00
gatecat
f52b522964
Merge pull request #633 from YosysHQ/gatecat/optional-ipo
cmake: Use IPO only if supported
2021-03-19 10:38:12 +00:00
gatecat
bac2a8ba02 cmake: Use IPO only if supported
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-19 09:40:27 +00:00
gatecat
aa8b12db6f
Merge pull request #631 from litghost/fixup_gui_dependencies
Update root CMake with some additional features
2021-03-18 22:02:37 +00:00
gatecat
bc3fe7d014
Merge pull request #630 from litghost/run_clangformat
Run "make clangformat" to fix up master.
2021-03-18 21:38:02 +00:00
Keith Rothman
76c6e1248c Add option to link against "libprofiler".
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-18 14:02:07 -07:00
Keith Rothman
d5021e7ed5 Add IPO support for nextpnr, and have it enabled by default.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-18 14:01:40 -07:00
Keith Rothman
f4dc67879e Fixup GUI link dependencies on headers from libraries.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-18 14:00:19 -07:00
Keith Rothman
a3dd5b33bc Run "make clangformat". to fix up master.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-18 13:30:37 -07:00
gatecat
b8678e778e
Merge pull request #629 from litghost/move_hash_selection_to_header
Moving hash map/set type selection to header.
2021-03-18 08:14:16 +00:00
Keith Rothman
965ba00e0f Moving hash map/set type selection to header.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-17 16:54:29 -07:00
gatecat
5feea4497f
Merge pull request #619 from acomodi/add-cmake-infra-fpga-interchange
Add CMake infrastructure for fpga interchange
2021-03-17 14:05:49 +00:00
Alessandro Comodi
01a95faf21 fpga_interchange: temporarily disable failing test
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-17 10:32:35 +01:00
Alessandro Comodi
f6583f7ecc fpga_interchange: minor fixes and comments addition
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-16 22:59:20 +01:00
Alessandro Comodi
c1e668f823 fpga_interchange: address review comments
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-16 22:02:06 +01:00
Alessandro Comodi
f9e9fadbc8 github-actions: use capnp v0.8.0
This also updates the note in the README for the FPGA interchange

Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-16 16:57:07 +01:00
Alessandro Comodi
83544cdf6a github-actions: pin python-fpga-interchange to tag
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-16 16:34:27 +01:00
Alessandro Comodi
c68dfb09c4 github-actions: add basic CI to test FPGA interchange
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-16 15:39:02 +01:00
Alessandro Comodi
f63a9a48a4 fpga_interchange: re-add README with updated instructions
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-16 15:39:02 +01:00
Alessandro Comodi
f52b5b39ed fpga_interchange: tests: add techmap optional source file
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-16 15:39:02 +01:00
Alessandro Comodi
3f3cabea2d fpga_interchange: add bbasm step and archcheck
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-16 15:39:02 +01:00
Alessandro Comodi
0b62e540a3 fpga_interchange: address review comments
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-16 15:39:02 +01:00
Alessandro Comodi
bd2da27e4e fpga_interchange: tests: added comment and fixed XDC
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-16 15:39:02 +01:00
Alessandro Comodi
e5cc03965e fpga_interchange: chipdb: use generic patching function
Also moved the RapidWright invocation script path under a CMake variable

Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-16 15:39:02 +01:00
Alessandro Comodi
490fdb0a1c fpga_interchange: cmake: generate only one device family
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-16 15:39:01 +01:00
Alessandro Comodi
77ffdd7fd4 fpga_interchange: tests: add cmake functions
Also move all tests in a tests directory

Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-16 15:39:01 +01:00
Alessandro Comodi
6a08b0d733 bump fpga_interchange_schema
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-16 15:39:01 +01:00
Alessandro Comodi
d77d0ff34a fpga_intrchange: add cmake infrastructure to generate chipdbs
Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
2021-03-16 15:39:01 +01:00
gatecat
701587241f
Merge pull request #626 from YosysHQ/missing-includes
Add missing includes to fix WASI build
2021-03-16 09:43:35 +00:00
whitequark
e1cd98ba15 Add missing includes to fix WASI build. 2021-03-16 05:52:41 +00:00
gatecat
bf5f0fc58f
Merge pull request #625 from litghost/use_namespace_macro
Use NEXTPNR_NAMESPACE macro's now that headers are seperated.
2021-03-15 21:08:28 +00:00
Keith Rothman
351ca3b5ea Use NEXTPNR_NAMESPACE macro's now that headers are seperated.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-15 18:49:12 +00:00
gatecat
a8e35062c6
Merge pull request #621 from litghost/fix_header_nightmare
Split nextpnr.h to allow for linear inclusion.
2021-03-15 17:00:52 +00:00
gatecat
3cf4a33666
Merge pull request #624 from YosysHQ/gatecat/fix-623
opt-timing: Skip undriven nets
2021-03-15 17:00:03 +00:00
gatecat
3c71911c26 opt-timing: Skip undriven nets
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-15 16:08:47 +00:00
Keith Rothman
fe4608386e Split nextpnr.h to allow for linear inclusion.
"nextpnr.h" is no longer the god header.  Important improvements:

 - Functions in log.h can be used without including
   BaseCtx/Arch/Context. This means that log_X functions can be called
   without included "nextpnr.h"

 - NPNR_ASSERT can be used without including "nextpnr.h" by including
   "nextpnr_assertions.h".  This allows NPNR_ASSERT to be used safely in
   any header file.

 - Types defined in "archdefs.h" are now available without including
   BaseCtx/Arch/Context.  This means that utility classes that will be
   used inside of BaseCtx/Arch/Context can be defined safely in a
   self-contained header.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-15 09:05:23 -07:00
gatecat
035b797ec2
Merge pull request #620 from litghost/handle_partial_routed
Add support for partially routed nets from the placer in router2.
2021-03-12 22:25:24 +00:00
Keith Rothman
a342ae56e0 Add support for partially routed nets from the placer in router2.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-12 09:53:15 -08:00
gatecat
bffaad477a
Merge pull request #618 from YosysHQ/no-absl-on-wasi
Don't include Abseil if it is not used
2021-03-12 11:23:10 +00:00
whitequark
bdf13ddcfb CMake: Don't include Abseil if it is not used. 2021-03-12 03:00:58 +00:00
gatecat
cc367d7e67
Merge pull request #615 from litghost/add_lookahead_diag_to_router2
Add diagnostic prints to debug lookahead performance.
2021-03-10 18:24:11 +00:00
Keith Rothman
7168cf8657 Add diagnostic prints to debug lookahead performance.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-10 09:12:50 -08:00
gatecat
7f0c23dff3
Merge pull request #617 from YosysHQ/no-absl-on-wasi
Only depend on Abseil in threaded builds.
2021-03-10 10:03:24 +00:00
whitequark
979e7b8709 Only depend on Abseil in threaded builds.
Abseil has a hard dependency on threads (not just in the build system
but in many places in the base libraries), so there is no way to use
it on WASI at the moment.
2021-03-10 06:18:42 +00:00
gatecat
d1f44fe91a
Merge pull request #607 from litghost/add_absl_flat_hash_map
Add absl::flat_hash_map.
2021-03-09 08:48:25 +00:00
gatecat
326b34887c
Merge pull request #609 from YosysHQ/gatecat/sta-v2
Use new timing engine for criticality
2021-03-09 08:48:12 +00:00
gatecat
0f17e80eef
Merge pull request #613 from YosysHQ/gatecat/nexus-dphy
Add basic support for Nexus DPHY hard IP
2021-03-08 21:11:13 +00:00
gatecat
08c7f97b1e nexus: Support for hard DPHY
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-08 15:59:18 +00:00
gatecat
91064c7ec8 nexus: Add pin definitions for DPHY
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-08 15:59:18 +00:00
gatecat
e1534e1dec
Merge pull request #612 from YosysHQ/gatecat/router2-bb-fix
router2: Fix vast perf drop when leaving bounding box
2021-03-08 15:58:56 +00:00
gatecat
da88d3d825 router2: Fix vast perf drop when leaving bounding box
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-08 15:06:30 +00:00
gatecat
55fa8b7745 nexus: Fix copypasta
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-08 14:40:13 +00:00
gatecat
f0e30abf62 nexus: Fail gracefully when seeing special pins
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-05 12:15:58 +00:00
gatecat
8a4bf3a780 timing: Integration tweaks
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-05 10:04:35 +00:00
gatecat
98d1c5a411 timing: Skip route delays for unplaced/nullptr cells
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-04 11:34:20 +00:00
gatecat
1ff2023f32 timing: Replace all users of criticality with new engine
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-04 11:29:11 +00:00
gatecat
5f6aaa2475 timing: Use new engine in SA except for budget-based mode
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-04 10:29:36 +00:00
gatecat
ebc2527368 timing: Use new engine for HeAP
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-04 10:29:36 +00:00
gatecat
bbf5a7d461 timing: Add support for critical path printing
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-04 10:29:36 +00:00
gatecat
e681e0f14c timing: Slack and criticality computation
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-04 10:29:36 +00:00
gatecat
296e6d10c2 timing: Produce plausible Fmax figure
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-04 10:29:36 +00:00
gatecat
541376f8cc timing: Add Fmax printing for debugging
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-04 10:29:36 +00:00
gatecat
16e7bba87b timing: Add backwards path walking
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-04 10:29:36 +00:00
gatecat
0528ceead1 timing: Add forward path walking
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-04 10:29:36 +00:00
gatecat
9c8d1bd6e3 timing: Compute domain pairs
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-04 10:29:36 +00:00
gatecat
534e69fbff timing: Add port-domain tracking
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-04 10:29:36 +00:00
gatecat
7a546b1554 timing: Add topological sort from Yosys
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-04 10:29:36 +00:00
gatecat
d0772ce1e3 timing: Import cell delays to our own structures
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-04 10:29:36 +00:00
gatecat
fac6a6c068 timing: Data structures for STA rewrite
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-04 10:29:36 +00:00
gatecat
1aab019f1e
Merge pull request #608 from YosysHQ/gatecat/lifcl-17
Fix global normalisation for LIFCL-17
2021-03-03 15:19:17 +00:00
gatecat
685cc23b94 nexus: Fix global handling for LIFCL-17
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-03 13:46:05 +00:00
gatecat
fba71bd182 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2021-03-03 10:39:47 +00:00
gatecat
6e38e236f8
Merge pull request #604 from litghost/add_counter_test
Add counter test for FPGA interchange
2021-03-03 07:06:07 +00:00
gatecat
27fbee5233
Merge pull request #605 from litghost/add_placement_sanity_check
Add placement sanity check in placer_heap.
2021-03-02 08:27:12 +00:00
Keith Rothman
392156c250 Correct spelling of RAII and add missing check in unlock_early.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-01 13:11:04 -08:00
Keith Rothman
0afa0da19f Add absl::flat_hash_map.
This lowers the CPU cost of using the flat wire map in router2, and should
use less memory as well.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-01 09:55:54 -08:00
Keith Rothman
99a2262d61 Use scope in router1/2 and placer1.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-03-01 09:43:39 -08:00
gatecat
6ff02248a3
Merge pull request #606 from pepijndevos/gowin_fixes
Gowin DFF fixes
2021-02-28 18:20:11 +00:00
Pepijn de Vos
354d497a57 only one type of dff per slice 2021-02-28 17:48:05 +01:00
gatecat
6689bfe923
Merge pull request #603 from litghost/fix_trival_bad_swap
Prevent trival misplacements in placer1.
2021-02-26 20:06:02 +00:00
Keith Rothman
77a5a60a66 Fix latent bug with context locking in placer HeAP.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-26 11:40:58 -08:00
Keith Rothman
7878561970 Add placement sanity check in placer_heap.
Also check return of placer1_refine.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-26 11:27:43 -08:00
Keith Rothman
71b92cb813 Update FPGA interchange README.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-26 11:01:22 -08:00
Keith Rothman
78748a67be For now just return false in the site router.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-26 11:01:22 -08:00
Keith Rothman
cfa449c3f3 Initial LUT rotation logic.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-26 11:01:22 -08:00
Keith Rothman
9cbfd0b967 Add counter test.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-26 11:01:22 -08:00
Keith Rothman
c65ba121e0 Prevent trival misplacements in placer1.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-26 10:59:48 -08:00
gatecat
396af7470b
Merge pull request #602 from YosysHQ/gatecat/remove-unused-constr
Remove unused advanced timing constraint API
2021-02-26 11:03:21 +00:00
gatecat
b64f45a8ba Remove unused advanced timing constraint API
This API was simply an attractive nuisance as no code was ever developed
to actually process timing constraints (other than clock constraints
which use a different API).

While I do want to consider basic false path support, among other
things, in the near future; I plan for this to use a new API that
doesn't add complexity to the BaseCtx/Context monstrosity and that is
easier to use on the timing analysis side.

Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-26 10:07:00 +00:00
gatecat
89928a0e6b
Merge pull request #599 from litghost/allow_router2_to_use_preroutes
Allow router2 to use routed but not fixed arcs.
2021-02-26 09:44:03 +00:00
gatecat
49fae99063
Merge pull request #601 from YosysHQ/no-default-Werror
cmake: Don't enable any -Werror flags without opt-in
2021-02-26 08:06:07 +00:00
whitequark
a0af4d8768
cmake: Don't enable any -Werror flags without opt-in. 2021-02-26 00:33:05 +00:00
Keith Rothman
c64a910151 Allow router2 to use routed but not fixed arcs.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-25 15:55:29 -08:00
gatecat
de107da5b3
Merge pull request #598 from YosysHQ/gatecat/compiler-flags
Tighten up compiler flags
2021-02-25 16:16:37 +00:00
gatecat
23413a4d12 Fix compiler warnings introduced by -Wextra
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-25 15:15:25 +00:00
gatecat
17183fff05 cmake: Enable -Wextra, and -Werror in some cases
-Werror is not enabled by default, except on CI and for a few specific common traps, to avoid the inevitable breakages when new compiler versions add new diagnostics.

Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-25 11:05:26 +00:00
gatecat
ab8dfcfba4
Merge pull request #591 from litghost/add_constant_network
Add constant network support to FPGA interchange arch
2021-02-25 10:22:45 +00:00
gatecat
e2cdaa653c
Merge pull request #597 from litghost/add_dynamic_bitarray
Add dynamic bitarray to common library.
2021-02-24 18:22:16 +00:00
Keith Rothman
e0a4af09ed Bump tests submodule.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-24 09:09:23 -08:00
Keith Rothman
6d193ffd8b Fix some bugs found in review.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-24 09:09:06 -08:00
gatecat
4026082470 docs/archapi: Typo fixes
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-24 15:28:33 +00:00
Keith Rothman
3650294e51 Add dynamic bitarray to common library.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-23 15:43:47 -08:00
gatecat
19ae97afd1
Merge pull request #595 from litghost/const_cell_info
Change CellInfo in getBelPinsForCellPin to be const.
2021-02-23 22:55:09 +00:00
gatecat
5de1978632
Merge pull request #596 from litghost/make_clang_format
Run "make clangformat" to fix formatting in new Bits library.
2021-02-23 22:49:35 +00:00
Keith Rothman
a30043c8da Fix assorted bugs in FPGA interchange.
Fixes:
 - Only use map constant pins during routing, and not during placement.
 - Unmapped cell ports have no BEL pins.
 - Fix SiteRouter congestion not taking into account initial expansion.
 - Fix psuedo-site pip output.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-23 14:09:28 -08:00
Keith Rothman
184665652e Finish dedicated interconnect implementation.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-23 14:09:28 -08:00
Keith Rothman
5574455d2a Working FF example now that constant merging is done.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-23 14:09:28 -08:00
Keith Rothman
2fc353d559 Add initial logic for handling dedicated interconnect situations.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-23 14:09:28 -08:00
Keith Rothman
cd8297f54d Move RapidWright git URI back to upstream.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-23 14:09:28 -08:00
Keith Rothman
5c6e231412 Remove some signedness warnings.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-23 14:09:28 -08:00
Keith Rothman
46b38f8a40 Fix reference copy.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-23 14:09:27 -08:00
Keith Rothman
3ccb164f2a Run "make clangformat".
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-23 14:09:27 -08:00
Keith Rothman
15459cae91 Initial working constant network support!
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-23 14:09:27 -08:00
Keith Rothman
cf554f9338 Add constant network test case.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-23 14:09:27 -08:00
Keith Rothman
3e5a23ed5b Add tests to confirm constant routing import.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-23 14:09:27 -08:00
Keith Rothman
761d9d9229 Correct some bugs in the create_bba Makefile.
Also add debug_test target to debug archcheck.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-23 14:09:27 -08:00
Keith Rothman
40df4f4f65 Add initial constant network support to FPGA interchange arch.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-23 14:09:27 -08:00
Keith Rothman
0758f68020 Update archapi.md with latest signature.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-23 14:08:59 -08:00
Keith Rothman
423a10bc31 Change CellInfo in getBelPinsForCellPin to be const.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-23 14:08:54 -08:00
Keith Rothman
bf458cbc5a Run "make clangformat" to fix new Bits library.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-23 13:55:05 -08:00
gatecat
85af066d4f
Merge pull request #594 from YosysHQ/gatecat/heap-tidying
Tidying up HeAP
2021-02-23 21:53:00 +00:00
gatecat
162793aa87 Refactor some common code to CellInfo methods
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-23 13:11:10 +00:00
gatecat
72b7a2e107 HeAP: Document legalise_placement_strict better
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-23 13:11:10 +00:00
gatecat
20f0ba9526 nexus: Fix getPipDelay returning negative after refactor
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-23 12:21:55 +00:00
gatecat
3b45174375 pyconsole: Avoid lockup when reading from stdin
Create an empty temporary file for stdin; so reads fail rather than
locking up (otherwise doing help() would be enough to completely lock up
the GUI).

Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-22 10:48:21 +00:00
gatecat
c0a7cff304 Demote the 'no clocks' warning to info and make clearer
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-20 20:15:52 +00:00
gatecat
6672f17d0a
Merge pull request #592 from YosysHQ/gatecat/rework-delay
Replace DelayInfo with DelayPair and DelayQuad
2021-02-20 10:51:57 +00:00
gatecat
e571c707b5 Update generic.md
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-20 10:51:30 +00:00
gatecat
130c5cc768 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-19 13:52:06 +00:00
gatecat
8ab36b4a05 python: Bindings for DelayPair and DelayQuad
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-19 13:41:40 +00:00
gatecat
7922b3bfc4 Replace DelayInfo with DelayPair/DelayQuad
This replaces the arch-specific DelayInfo structure with new DelayPair
(min/max only) and DelayQuad (min/max for both rise and fall) structures
that form part of common code.

This further reduces the amount of arch-specific code; and also provides
useful data structures for timing analysis which will need to delay
with pairs/quads of delays as it is improved.

While there may be a small performance cost to arches that didn't
separate the rise/fall cases (arches that aren't currently separating
the min/max cases just need to be fixed...) in DelayInfo, my expectation
is that inlining will mean this doesn't make much difference.

Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-19 11:31:33 +00:00
gatecat
8376db94a7 Add DelayPair and DelayQuad structures
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-19 10:58:16 +00:00
gatecat
5dcb59b13d
Merge pull request #576 from litghost/add_cell_bel_pin_mapping
Complete FPGA interchange Arch to the point where it can route a wire
2021-02-19 08:41:58 +00:00
Keith Rothman
c21e23b3eb Fix sign mismatch.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-18 14:08:22 -08:00
Keith Rothman
e138a6c56d Do some spell checking on site_router.cc
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-18 13:34:06 -08:00
Keith Rothman
4766e889c0 Add some utility methods for site instance access.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-18 13:26:52 -08:00
Keith Rothman
532954847a Update README's with latest instructions and features.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-18 13:01:42 -08:00
gatecat
b4a97efe4d
Merge pull request #588 from YosysHQ/gatecat/gowin-fixes
Gowin regression fixes
2021-02-18 11:05:04 +00:00
gatecat
cbff1e1371
Merge pull request #590 from cbalint13/master
Expose ice40 arch placer-heap internal parameters.
2021-02-18 10:47:39 +00:00
Balint Cristian
456688a49d Expose ice40 arch placer-heap internal parameters. 2021-02-18 00:06:23 +02:00
Keith Rothman
7ecfd98b2d Update tests library to include Bits unit test.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-17 12:03:35 -08:00
Keith Rothman
8ef5411f70 Add utility targets for getting plain text outputs.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-17 12:03:17 -08:00
Keith Rothman
b3dcc9d507 Add IOSTANDARD to ports.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-17 12:03:17 -08:00
Keith Rothman
5833c90210 Emit fixed attributes to output physical netlist.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-17 12:03:17 -08:00
Keith Rothman
8f668f06ca Use Bits library for bit instrisics.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-17 12:03:17 -08:00
Keith Rothman
558a753d3d Refactor "get only from iterator" to a utility.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-17 12:03:17 -08:00
Keith Rothman
9e0ca72827 Keep all build artifacts under create_bba/build.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-17 12:03:16 -08:00
Keith Rothman
f9bd692f75 Change how package pin IO sites are selected.
The first site type that matches is now selected, under the premise that
the early site types are more general.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-17 12:03:16 -08:00
Keith Rothman
cc687b3b72 Change makefiles to build a FPGA interchange BBA.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-17 12:03:16 -08:00
Keith Rothman
5a7f83c705 Add examples invoking FPGA interchange nextpnr.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-17 12:03:16 -08:00
Keith Rothman
7c1544f4d8 Continue fixes.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-17 12:03:16 -08:00
Keith Rothman
6f1c835221 Disable traversal limit when reading logical netlist.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-17 12:03:16 -08:00
Keith Rothman
c385321248 Add initial site router.
This site router likely cannot handle the full problem space.  It may
need to be replaced with a more generalize approach as testing
continues.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-17 12:03:16 -08:00
Keith Rothman
a7421399f7 Working on standing up initial constraints system.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-17 12:03:16 -08:00
gatecat
f6dc2dd198 Bump tests submodule to include bits tests
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-17 20:02:33 +00:00
gatecat
782747cc0c
Merge pull request #589 from litghost/add_bits_library
Add a Bits utility library.
2021-02-17 20:01:24 +00:00
Keith Rothman
e189666a2d Add a Bits utility library.
This library captures use of __builtin_popcount and __builtin_ctz on
GCC/clang and hopefully handles the MSVC case.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-17 11:00:39 -08:00
gatecat
a8c55728e2 gowin: Fix archcheck errors and add to CI
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-17 16:03:03 +00:00
gatecat
18113ff43d gowin: Use base bel bucket/cell type methods
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-17 15:58:00 +00:00
gatecat
09535a95ca gowin: Fix IdStrings being overwritten by wireToGlobal
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-17 15:57:31 +00:00
gatecat
cb957795a3 Update docs/archapi.md
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-17 11:25:53 +00:00
gatecat
d83259828e
Merge pull request #587 from YosysHQ/gatecat/generic-vcc
generic: Don't generate Vcc if not needed
2021-02-17 11:17:25 +00:00
gatecat
399c24c805 clangformat
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-17 10:45:23 +00:00
gatecat
6b4bd0993f generic: Don't generate Vcc if not needed
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-17 10:24:06 +00:00
gatecat
da1ecf0813
Merge pull request #586 from litghost/add_cell_bel_mapping_only
Add Cell -> BEL Pin maps to FPGA interchange arch.
2021-02-17 10:16:45 +00:00
gatecat
a77ceec5cf
Merge pull request #585 from YosysHQ/gatecat/remove-ivbfc
Remove isValidBelForCell
2021-02-17 08:50:31 +00:00
Keith Rothman
26a187e5eb Require --package when arch BBA contains multiple packages.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-16 14:00:01 -08:00
Keith Rothman
bb4fa7af5b [FPGA Interchange] Add Cell -> BEL Pin maps.
This also expands the FPGA interchange Arch BBA to include placement
constraints, but doesn't implement them yet.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-16 09:37:19 -08:00
gatecat
a74d1a8b32 Bump test submodule
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-16 13:35:01 +00:00
gatecat
c7c13cd95f Remove isValidBelForCell
This Arch API dates from when we were first working out how to
implement placement validity checking, and in practice is little used by
the core parts of placer1/HeAP and the Arch implementation involves a
lot of duplication with isBelLocationValid.

In the short term; placement validity checking is better served by the
combination of checkBelAvail and isValidBelForCellType before placement;
followed by isBelLocationValid after placement (potentially after
moving/swapping multiple cells).

Longer term, removing this API makes things a bit cleaner for a new
validity checking API.

Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-16 13:31:36 +00:00
gatecat
815b57b9e1
Merge pull request #583 from litghost/add_fpga_interchange_front_and_backend
Add FPGA interchange front and backend
2021-02-16 09:48:40 +00:00
Keith Rothman
1be70320b9 Pull in fix for out of source builds.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-15 09:54:58 -08:00
Keith Rothman
2c7ee44046 Move CMake logic into fpga-interchange-schema.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-15 09:54:58 -08:00
Keith Rothman
6b04fd1524 Small fixes from review.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-15 09:54:58 -08:00
Keith Rothman
e60dda57f3 Add libcapnp-dev for FPGA interchange compilation support.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-15 09:54:58 -08:00
Keith Rothman
664407089b Add FPGA interchange frontend and backend.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-15 09:54:58 -08:00
Keith Rothman
5e11e29ba2 Add interchange schema 3rdparty.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-15 09:54:58 -08:00
gatecat
9fc02041fe
Merge pull request #584 from YosysHQ/gatecat/generic-belpin
Add bel pin mapping control to nextpnr-generic
2021-02-15 16:19:25 +00:00
gatecat
f0b2a91bda generic: Update docs
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-15 10:37:06 +00:00
gatecat
a8a5153873 generic: Add bel pin mapping test
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-15 10:22:29 +00:00
gatecat
a002ccfbc1 generic: Add APIs for controlling cell->bel pin mapping
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-15 09:58:56 +00:00
gatecat
065f46daeb
Merge pull request #578 from YosysHQ/machxo2-rebase
machxo2, rebased and updated
2021-02-15 09:39:56 +00:00
gatecat
1b6cdce925
Merge pull request #575 from YosysHQ/gatecat/belpin-2
Support for cell pin to bel pin mappings
2021-02-15 09:38:22 +00:00
gatecat
f1ccc0e205
Merge pull request #582 from litghost/add_xdc_parser
Add XDC parser to FPGA interchange
2021-02-12 22:40:41 +00:00
Keith Rothman
033cc6731b Add FPGA interchange tests to CI.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-12 13:48:50 -08:00
Keith Rothman
5312945757 Update tests to include XDC unit test.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-12 10:31:05 -08:00
Keith Rothman
82ab3c1aad Run "make clangformat".
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-12 10:31:05 -08:00
Keith Rothman
8a860857ea Remove capnp and libz for XDC parser PR.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-12 10:31:05 -08:00
Keith Rothman
c96d0f225c Refactor XDC parser into a little class for testing purposes.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-12 10:31:04 -08:00
Keith Rothman
d987bd2997 Add unknown handles to convert [0] to "[0]".
Tcl reads something like "set port [get_ports x[0]]" as "invoke proc 0
with zero arguments", rather than just "[0]".  To prevent exposing
non-Tcl users this, "[<number>]" just return themselves.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-12 10:31:04 -08:00
Keith Rothman
a0bd313139 Add FPGA interchange XDC parser.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-12 10:31:04 -08:00
gatecat
cede682585
Merge pull request #579 from litghost/add_control_for_split_io
Add control to whether GenericFrontend splits IO ports.
2021-02-12 18:22:06 +00:00
Keith Rothman
e28dedbbe3 Update docs.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-12 08:07:09 -08:00
gatecat
9c9a02628d ci: Bump prjtrellis version
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-12 11:51:21 +00:00
gatecat
d3688982ac Fix bad rebase
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-12 11:16:59 +00:00
gatecat
6de733b38c machxo2: Misc tidying up
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-12 10:43:15 +00:00
gatecat
33eca9a3d2 machxo2: Python bindings and stub GUI
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-12 10:40:03 +00:00
gatecat
8f5133d811 machxo2: Use snake_case for non-ArchAPI functions
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-12 10:36:59 +00:00
gatecat
b539363cd0 machxo2: Use IdStringLists in earnest
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-12 10:36:59 +00:00
gatecat
3f7618283d machxo2: Update with Arch API changes
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-12 10:36:59 +00:00
William D. Jones
32433db7ae machxo2: Prepare README.md for first PR. 2021-02-12 10:36:59 +00:00
William D. Jones
3dbd5b0932 machxo2: Add prefix parameter to simtest.sh. Remove show command from
simtest.sh. Update README.md.
2021-02-12 10:36:59 +00:00
William D. Jones
730e543ca6 machxo2: Add prefix parameter to simple.sh. Update README.md. 2021-02-12 10:36:59 +00:00
William D. Jones
0b0faa2f1c machxo2: Fill in more about mitertest.sh in README.md and clean up a bit. 2021-02-12 10:36:59 +00:00
William D. Jones
73c851d8e0 machxo2: Add two new examples: blinky_ext and aforementioned UART. 2021-02-12 10:36:59 +00:00
William D. Jones
74b5e846a5 machxo2: auto-top does not work for smt miter either. 2021-02-12 10:36:59 +00:00
William D. Jones
77bb3e73cd machxo2: Fix unhelpful comment in mitertest.sh. 2021-02-12 10:36:59 +00:00
William D. Jones
2b54e87548 machxo2: Verilog examples using OSCH cannot be simulated in mitertest.sh. Remove show from mitertest.sh. 2021-02-12 10:36:59 +00:00
William D. Jones
a3a38b0536 machxo2: Add prefix parameter to mitertest.sh. All Verilog files top modules named "top". 2021-02-12 10:36:59 +00:00
William D. Jones
0aa472fb3a machxo2: Add prefix paramter to demo.sh. 2021-02-12 10:36:59 +00:00
mtnrbq
b9eb443e54 Add demo with RGB LED 2021-02-12 10:36:59 +00:00
William D. Jones
4948e8d914 machxo2: Fix packing when FF is driven by a constant; UART test core working on silicon, fails post-synth sim. 2021-02-12 10:36:59 +00:00
William D. Jones
086bca18b8 machxo2: Add packing logic to handle FFs fed with constant value; UART test core routes. 2021-02-12 10:36:59 +00:00
William D. Jones
3ab300a28e machxo2: Add additional packing phase to pack remaining FFs. 2021-02-12 10:36:59 +00:00
William D. Jones
f18df5ed59 machxo2: Don't write out config bits for cells without location info. 2021-02-12 10:36:59 +00:00
William D. Jones
da1b15d6f5 machxo2: Special-case left and right I/O wire names in ASCII generation. 2021-02-12 10:36:59 +00:00
William D. Jones
8629d7b692 machxo2: Add quickstart README.md. 2021-02-12 10:36:59 +00:00
William D. Jones
07bc6bac53 machxo2: Fail CMake configuration is BUILD_PYTHON is ON (not supported for now). 2021-02-12 10:36:59 +00:00
William D. Jones
c9487293e9 machxo2: Fix REGMODE identifier (per slice, not per-FF). 2021-02-12 10:36:59 +00:00
William D. Jones
d0b822c036 machxo2: Add demo.sh TinyFPGA Ax example. 2021-02-12 10:36:59 +00:00
William D. Jones
0250aaaddd machxo2: clang format. 2021-02-12 10:36:59 +00:00
William D. Jones
2c9d4ba9ae machxo2: Fix reversed interpretation of REG_SD config bits. 2021-02-12 10:36:59 +00:00
William D. Jones
0d00c10e2f machxo2: Add bitstream generation for OSCH. 2021-02-12 10:36:59 +00:00
William D. Jones
884e7d9a98 machxo2: Add basic bitstream generation for PIC tiles and I/O. 2021-02-12 10:36:59 +00:00
William D. Jones
d485dc6ef6 machxo2: Add REGMODE to bitstream output. 2021-02-12 10:36:59 +00:00
William D. Jones
5415194b39 machxo2: Checkpoint commit for slice bitstream generation. 2021-02-12 10:36:59 +00:00
William D. Jones
cf2db7a4c4 machxo2: Write out pips to bitstream. 2021-02-12 10:36:59 +00:00
William D. Jones
56656b2b24 machxo2: Emit empty bitstream file. 2021-02-12 10:36:59 +00:00
William D. Jones
695fb7e569 machxo2: Add/fix copyright banners. 2021-02-12 10:36:59 +00:00
William D. Jones
75f33e0c55 machxo2: Add stub bitstream writer plus support files. 2021-02-12 10:36:59 +00:00
William D. Jones
e1f72318e0 machxo2: Tweak A-star parameters for acceptable performance. 2021-02-12 10:36:59 +00:00
William D. Jones
447b3a060c machxo2: Fix getWireName. 2021-02-12 10:36:59 +00:00
William D. Jones
385917059b machxo2: Fix typos where absolute positions were treated as relative. 2021-02-12 10:36:59 +00:00
William D. Jones
722d1f2542 machxo2: Finish implementing Wire API functions. nextpnr segfaults on example with constraints. 2021-02-12 10:36:59 +00:00
William D. Jones
861c12e6eb machxo2: Finish implementing Pip API functions. 2021-02-12 10:36:59 +00:00
William D. Jones
0adde4aede machxo2: Implement 4 more Wire/Pip API functions. 2021-02-12 10:36:59 +00:00
William D. Jones
19a9554bda machxo2: Add stub getAttrs API functions. 2021-02-12 10:36:59 +00:00
William D. Jones
9a9054188c machxo2: Implement getByName/getName for Wires and Pips. 2021-02-12 10:36:59 +00:00
William D. Jones
e4a6fd3571 machxo2: Convert facade_import to use pybind API from pytrellis. 2021-02-12 10:36:59 +00:00
William D. Jones
31ea8f8719 machxo2: Use attrmvcp in yosys to implement LOC constraint and only check for LOC on FACADE_IO. 2021-02-12 10:36:59 +00:00
William D. Jones
9c37aef499 machxo2: Detect LOC attributes during packing to implement rudimentary user constraints. 2021-02-12 10:36:59 +00:00
gatecat
8417470276 machxo2: Add clang-format exception to machxo2 binary blob C sources. 2021-02-12 10:36:59 +00:00
William D. Jones
0e63178fe1 machxo2: clang format. 2021-02-12 10:36:59 +00:00
William D. Jones
91ad064249 machxo2: Import remaining iterators from ECP5. 2021-02-12 10:36:59 +00:00
William D. Jones
a7917c9c63 machxo2: Implement WireId/PipId, complete Bel part of API. 2021-02-12 10:36:59 +00:00
William D. Jones
bbc683dd75 machxo2: Implement all of Bel API except getBelPinWire. 2021-02-12 10:36:59 +00:00
William D. Jones
138519d820 machxo2: Fix place phase segfault. Placement suceeds with warning of no clock. 2021-02-12 10:36:59 +00:00
William D. Jones
8a94a3451f machxo2: Stub valid BEL functions with comment. Place phase segfaults. 2021-02-12 10:36:59 +00:00
William D. Jones
5f748272fc machxo2: Implement bel_to_cell and API functions using it. 2021-02-12 10:36:59 +00:00
William D. Jones
682de724a8 machxo2: Implement 2 Bel API functions. 2021-02-12 10:36:59 +00:00
William D. Jones
3e6be4bbfd machxo2: Implement General Methods. 2021-02-12 10:36:59 +00:00
William D. Jones
094233a4ab machxo2: Implement getBelLocation to stop std::out_of_range in place phase. 2021-02-12 10:36:59 +00:00
William D. Jones
52b424c385 machxo2: Convert uint_t to int_t in packed structs. 2021-02-12 10:36:59 +00:00
William D. Jones
dc07054ee8 machxo2: Implement functions to get device utilization (throws std::out_of_range during place phase). 2021-02-12 10:36:59 +00:00
William D. Jones
ec4a9685ab machxo2: Initialize Arch context with device type and package. 2021-02-12 10:36:59 +00:00
William D. Jones
6f6aaa4a97 machxo2: Add binary blob struct definitions. 2021-02-12 10:36:59 +00:00
William D. Jones
a3a3a91b72 machxo2: Clean up packing pass a bit. 2021-02-12 10:36:59 +00:00
William D. Jones
c5292e0db5 machxo2: Finalize (hopefully) facade_import for prototype. 2021-02-12 10:36:59 +00:00
William D. Jones
3d287adbcf machxo2: Add package/IO info to facade_import. 2021-02-12 10:36:59 +00:00
William D. Jones
b739513894 machxo2: Import constids and BELs into facade_import. 2021-02-12 10:36:59 +00:00
William D. Jones
dfedef5772 machxo2: Add pip and wire info into facade_import. 2021-02-12 10:36:59 +00:00
William D. Jones
e0b14ba98e machxo2: Begin populating binary blob via facade_import. 2021-02-12 10:36:59 +00:00
William D. Jones
6ce2edc2f1 machxo2: Add SMT mode to mitertest.sh 2021-02-12 10:36:59 +00:00
William D. Jones
4f042eac53 machxo2: Rework examples to test pack, place, and route phases. 2021-02-12 10:36:59 +00:00
William D. Jones
5838662b2f machxo2: Make sure REGSET FF parameter is set in FACADE_SLICE. Init blinky ctr to 0 for miter circuit. 2021-02-12 10:36:59 +00:00
William D. Jones
da6204442f machxo2: Add LUT and FF packing functions. 2021-02-12 10:36:59 +00:00
William D. Jones
f2a240550e machxo2: Always remove nextpnr_iobufs for now- assume manually instantiated primitives. 2021-02-12 10:36:59 +00:00
William D. Jones
42214b226f machxo2: Add constant packing implementation, fix bugs in create_machxo2_cell. 2021-02-12 10:36:59 +00:00
William D. Jones
3424badeff machxo2: Create basic cells for packing. 2021-02-12 10:36:59 +00:00
William D. Jones
5c30f95c42 machxo2: Add initial set of constids for packing. 2021-02-12 10:36:59 +00:00
William D. Jones
1cde40792f machxo2: Improve examples directory. 2021-02-12 10:36:59 +00:00
William D. Jones
ade94efbff machxo2: synth directory (simulation, techmaps, synth script) is now provided by yosys. 2021-02-12 10:36:59 +00:00
William D. Jones
59efba2fc0 machxo2: Stub out cells functions. 2021-02-12 10:36:59 +00:00
William D. Jones
88b7dfce58 machxo2: Stub out arch API functions and members. 2021-02-12 10:36:59 +00:00
William D. Jones
e5576448ea machxo2: Remove HeAP placer for now, fix typos. 2021-02-12 10:36:59 +00:00
William D. Jones
512daf2c89 machxo2: Remove generic packing. 2021-02-12 10:36:59 +00:00
William D. Jones
9704f422dc machxo2: Start creating MachXO2CommandHandler. 2021-02-12 10:36:59 +00:00
William D. Jones
98214865be machxo2: Remove generic API functions from Arch. 2021-02-12 10:36:59 +00:00
William D. Jones
78880e1fdf machxo2: Remove pybindings unneeded files from examples and update README.md and scripts accordingly. Delete resources directory. 2021-02-12 10:36:59 +00:00
William D. Jones
539651609c Update machxo2 backend with minimal build system changes so nextpnr compiles again. 2021-02-12 10:36:59 +00:00
William D. Jones
c38762f91f Update machxo2 backend with build system changes. 2021-02-12 10:36:59 +00:00
William D. Jones
81d6bc3614 Create sub import of facade DB for 1200 device.
Signed-off-by: William D. Jones <thor0505@comcast.net>
2021-02-12 10:36:59 +00:00
gatecat
510969ab97 Create machxo2 backend (renamed from generic).
Signed-off-by: William D. Jones <thor0505@comcast.net>
2021-02-12 10:36:59 +00:00
gatecat
c956cae824 Make BaseArch getDecalGraphics return an empty range
Fix assertion failure when opening the GUI on an arch without any
decals.

Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-12 10:35:51 +00:00
gatecat
ad7bb51030
Merge pull request #580 from litghost/add_design_loaded_state_variable
Add design_loaded state variable.
2021-02-12 09:54:15 +00:00
gatecat
5dfbe703ae
Merge pull request #581 from litghost/add_isbelhidden
Add getBelHidden and add some missing "override" statements.
2021-02-12 09:53:50 +00:00
Keith Rothman
99e397000c Add getBelHidden and add some missing "override" statements.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-11 14:58:02 -08:00
Keith Rothman
96293ab25e Add design_loaded state variable.
This is to decouple the command line flag "--json" and enable other
frontend's.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-11 13:43:23 -08:00
Keith Rothman
73710416b4 Add control to whether GenericFrontend splits IO ports.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-11 13:33:55 -08:00
gatecat
7c7d69e1d2 router2: Support for multiple bel pins per cell pin
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-10 15:14:44 +00:00
gatecat
7dafc64f78 router1: Support for multiple bel pins per cell pin
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-10 14:46:03 +00:00
gatecat
535723f414 Start making use of getBelPinsForCellPin API
This replaces getNetinfoSinkWire with 3 new functions for different use
cases.

At the moment all existing code has been moved to getNetinfoSinkWire
with phys_idx=0 so the build doesn't break; but this won't yet function
properly with more than one sink. But it provides a base on which to
work on refactoring the routers to support this case.

Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-10 14:18:12 +00:00
gatecat
85bb108ba4 Add getBelPinsForCellPin to Arch API
This is a basic implementation, without considering "M of N"
arrangements (e.g. for LUT permuation where you only want to route to 1
out of 4/6 sinks) or using a type other than IdString to identify bel
pins.

But this is also enough to start working out where in nextpnr will break
due to removing the 1:1 cell:bel pin cardinality, as a next step.

Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-10 11:54:54 +00:00
gatecat
e376f950fe
Merge pull request #574 from YosysHQ/gatecat/belpin-1
Remove the unused CellInfo::pins field
2021-02-10 11:27:11 +00:00
gatecat
6bd3dba1e3 Remove the unused CellInfo::pins field
No arches ever actually used this to implement a Cell->Bel pin mapping,
and in practice if any did try they would inevitably hit bitrot.

This field had limited use in practice as it is necessary to also
support cases where one cell pin maps to more than one bel pin. Removing
this old field is the first step towards developing a new API for this.

Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-10 10:42:26 +00:00
gatecat
f67d474edc
Merge pull request #573 from YosysHQ/gatecat/basearchranges
Add BaseArchRanges for default ArchRanges types
2021-02-09 11:30:23 +00:00
gatecat
11db5a2f1d Add BaseArchRanges for default ArchRanges types
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-09 10:39:14 +00:00
gatecat
1febb80a1e Add nextpnr-gowin binary to gitignore
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-09 10:36:03 +00:00
gatecat
bcf81f0e71
Merge pull request #568 from YosysHQ/dave/arch-override
Create a new BaseArch that formally specifies the Arch API and provides some base implementations
2021-02-08 17:56:08 +00:00
gatecat
2932dc3985 Make BaseCtx destructor virtual
Signed-off-by: gatecat <gatecat@ds0.me>
2021-02-08 17:03:22 +00:00
D. Shah
f501ba0c77 Update prjoxide URL
Signed-off-by: D. Shah <gatecat@ds0.me>
2021-02-08 13:04:49 +00:00
David Shah
23edefa0b5
Merge pull request #572 from YosysHQ/dave/more-ssize
Use RelSlice::ssize instead of cast-to-int throughout
2021-02-08 12:05:58 +00:00
D. Shah
0d444bfc6e Use RelSlice::ssize instead of cast-to-int throughout
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-08 11:24:00 +00:00
D. Shah
697c4fd08b Update docs with API changes
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-08 11:08:45 +00:00
D. Shah
9deb9e6e85 interchange: Base on ArchAPI
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-08 10:41:03 +00:00
D. Shah
efca63862c Use 'T' postfix to disambiguate LHS and RHS of using
Arches might otherwise have range types named ambigiously with the entry
in ArchRanges.

Signed-off-by: D. Shah <dave@ds0.me>
2021-02-08 10:29:50 +00:00
D. Shah
3e631fe2f4 Add archArgs and archArgsToId to Arch API
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-05 19:19:17 +00:00
D. Shah
6575bfac3e gowin: Switch to BaseArch
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-05 19:19:17 +00:00
D. Shah
c7ef7e1902 generic: Base upon ArchAPI
As generic is often picked as our 'odd-one-out' we also use it as an
example of an Arch that does not build upon BaseArch.

Signed-off-by: D. Shah <dave@ds0.me>
2021-02-05 19:19:17 +00:00
D. Shah
f5d2e245e1 nexus: Switch to BaseArch
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-05 19:19:17 +00:00
D. Shah
59c3db46ca ice40: Switch to BaseArch
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-05 19:19:17 +00:00
D. Shah
a8a27299ae Add pure-virtual ArchAPI interface
This splits out the pure-virtual definition of the architecture API into
ArchAPI; leaving BaseArch to only provide default implementations (which
can now be completely opted out of by deriving from ArchAPI instead of
BaseArch).

Signed-off-by: D. Shah <dave@ds0.me>
2021-02-05 19:19:17 +00:00
D. Shah
b4227f586c Rename ArchBase to BaseArch for consistency with BaseCtx
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-05 19:19:17 +00:00
D. Shah
297cd026b9 Add default implementation of bel bucket functions
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-05 19:19:17 +00:00
D. Shah
ed8e3c83d9 Add default implementation of some range-returning functions
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-05 19:19:17 +00:00
D. Shah
6d794abf49 Add a few more functions to ArchBase
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-05 19:19:17 +00:00
D. Shah
d4363b7ee5 ecp5: Use common wire/pip binding
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-05 19:19:17 +00:00
D. Shah
b866601b63 Fix now-illegal use of reinterpret_cast
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-05 19:19:17 +00:00
D. Shah
ba5568d501 nextpnr: Example of shared wire/bel/pip binding code
Currently not actually being tested

Signed-off-by: D. Shah <dave@ds0.me>
2021-02-05 19:19:17 +00:00
D. Shah
cfa9a9daec nextpnr: Use templates to specify range types
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-05 19:19:17 +00:00
D. Shah
8f76af40db nextpnr: Add base virtual functions for non-range Arch API
This makes the Arch API clearer and also allows a base implementation of
functions to reduce the amount of complexity to get a basic Arch up and
running.

Currently this only implements these for functions that don't return a
range. Range-returning functions will require more work in order due to
the current 'duck typing' approach (probably a struct that contains the
range types combined with templating.)

Signed-off-by: D. Shah <dave@ds0.me>
2021-02-05 19:19:17 +00:00
David Shah
8b4163b77c
Merge pull request #567 from litghost/initial_fpga_interchange
Initial FPGA interchange arch
2021-02-05 19:15:29 +00:00
Keith Rothman
a0ee42833b Add RelSlice::ssize and use it when comparing with signed ints.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-05 10:12:13 -08:00
Keith Rothman
9557047e5e Move all string data into BBA file.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-05 09:22:55 -08:00
David Shah
b0f9b7834e
Merge pull request #570 from litghost/make_id_string_list_explicit
Mark IdString and IdStringList single argument constructors explicit.
2021-02-05 11:32:09 +00:00
D. Shah
450bfae86c generic: Fix pin names accidentally being IdStringList not IdString
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-05 10:43:35 +00:00
Keith Rothman
ca32e935a6 Use RelSlice instead of RelPtr in cases where sizes are present.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:34 -08:00
Keith Rothman
f1ee2fde58 Update APIs to conform to style guide.
- Change non-Arch methods to snake_case
 - Adds some utility functions to for accessing bel_data.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:34 -08:00
Keith Rothman
9afa8a9bea Remove unused method getReservedWireNet.
This was a holdover from the nextpnr-xilinx arch.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:33 -08:00
Keith Rothman
22c3c9c303 Update copywrite headers.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:33 -08:00
Keith Rothman
58c90184f6 Correct some typos.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:33 -08:00
Keith Rothman
d8fa9d7f36 Fix warnings with signed/unsigned.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:33 -08:00
Keith Rothman
d4f66a73c1 Fix fpga_interchange/README.md duplicate patch statement.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:33 -08:00
Keith Rothman
90ece77f8d Fix URLs in Markdown.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:33 -08:00
Keith Rothman
dc47c6d9ec Add empty constids.inc for build.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:33 -08:00
Keith Rothman
0b911e484c Run "make clangformat".
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:33 -08:00
Keith Rothman
149087b880 Add README about initial state of FPGA interchange implementation.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:33 -08:00
Keith Rothman
78737ab01d Update FPGA interchange to use IdStringList.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:33 -08:00
Keith Rothman
083f6afb1c Add initial GUI files.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:33 -08:00
Keith Rothman
4a62c8c2eb Start adding data for placement constraint solving.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:33 -08:00
Keith Rothman
5c16c5024d Debug BEL bucket data.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:33 -08:00
Keith Rothman
cd41c4001e Add initial updates to FPGA interchange arch for BEL buckets.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:33 -08:00
Keith Rothman
67dc19bb57 Address review comments.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:33 -08:00
Keith Rothman
5a89dc58e1 Fix BBA import bugs.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:33 -08:00
Keith Rothman
1dd24f6461 Assorted fixes to new FPGA interchange based arch.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:33 -08:00
Keith Rothman
6e68e8f097 Initial compiling version.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:32 -08:00
Keith Rothman
561b519716 Initial FPGA interchange (which is just a cut-down xilinx arch).
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:32 -08:00
Keith Rothman
c99fbde0eb Mark IdString and IdStringList single argument constructors explicit.
Single argument constructors will silently convert to that type.  This
is typically not the right thing to do.  For example, the nexus and
ice40 arch_pybindings.h files were incorrectly parsing bel name strings,
etc.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-04 16:38:07 -08:00
David Shah
40d026e6fc
Merge pull request #566 from litghost/use_lru_cache
Use a LRU cache for pip to wire map.
2021-02-04 10:18:55 +00:00
Keith Rothman
235a8e07e3 Use a LRU cache for pip to wire map.
This avoids storing the entire pip to wire map in memory with a moderate
runtime increase and a dramatic memory decrease (2 GB to 200 MB for
A50T).

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-03 13:45:47 -08:00
David Shah
155e0b9c42
Merge pull request #565 from YosysHQ/dave/snakecase
Use snake case consistently for non-Arch-API functions
2021-02-03 19:55:32 +00:00
D. Shah
0865198a9e Update coding.md
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-03 10:53:15 +00:00
D. Shah
f05d024666 ecp5: Use snake case for arch-specific functions
This makes the difference clearer between the general arch API that
everyone must implement; and helper functions specific to one arch.

Signed-off-by: D. Shah <dave@ds0.me>
2021-02-03 10:53:08 +00:00
D. Shah
a09a62bc4a ice40: Use snake case for arch-specific functions
This makes the difference clearer between the general arch API that
everyone must implement; and helper functions specific to one arch.

Signed-off-by: D. Shah <dave@ds0.me>
2021-02-03 10:46:12 +00:00
David Shah
9a79163eab
Merge pull request #561 from YosysHQ/dave/idstringlist
Use IdStringList for bel/wire/pip/group names
2021-02-03 09:48:07 +00:00
D. Shah
15bf9e4f74 Post-rebase fix
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-02 17:07:44 +00:00
D. Shah
7cff69f945 generic: Use IdStringList for all arch object names
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-02 17:00:56 +00:00
D. Shah
2a9584ea31 gowin: Stub implementation of IdStringList
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-02 17:00:33 +00:00
D. Shah
6566a011b4 nexus: Implement IdStringList for all arch object names
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-02 17:00:33 +00:00
D. Shah
b31b21fd51 ice40: Implement IdStringList for all arch object names
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-02 17:00:33 +00:00
D. Shah
3ae96bff88 Refactor GUI to use IdStringLists
The GUI internally had an 'IdStringList' type that I hadn't spotted, to
avoid a conflict this is renamed to IdList which also reflects its new
purpose better.

Signed-off-by: D. Shah <dave@ds0.me>
2021-02-02 17:00:33 +00:00
D. Shah
d792bce0fb ecp5: Implement IdStringList for all arch object names
This is a complete implementation of IdStringList for ECP5; excluding
the GUI (which you will have to disable for it to build).

Signed-off-by: D. Shah <dave@ds0.me>
2021-02-02 17:00:32 +00:00
D. Shah
9614d37229 docs: Update archapi.md with IdStringList
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-02 17:00:14 +00:00
D. Shah
9388df19d3 refactor: Replace getXName().c_str(ctx) with ctx->nameOfX
This makes the ongoing migration to IdStringList easier.

Signed-off-by: D. Shah <dave@ds0.me>
2021-02-02 17:00:14 +00:00
D. Shah
6d23461bcd ecp5: Proof-of-concept using IdStringList for bel names
This uses the new IdStringList API to store bel names for the ECP5. Note
that other arches and the GUI do not yet build with this
proof-of-concept patch.

getBelByName still uses the old implementation and could be more
efficiently implemented with further development.

Signed-off-by: D. Shah <dave@ds0.me>
2021-02-02 17:00:12 +00:00
D. Shah
0dbe7f96a3 common: First pass at IdStringList methods
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-02 16:59:42 +00:00
D. Shah
ff92d19fed arch: Add getNameDelimiter API for string lists
Signed-off-by: D. Shah <dave@ds0.me>
2021-02-02 16:59:40 +00:00
D. Shah
90edf33c95 common: Adding IdStringList type
Using an optimised storage for <=4 objects to avoid excessive heap
allocations.

Signed-off-by: D. Shah <dave@ds0.me>
2021-02-02 16:58:57 +00:00
David Shah
9c5d13a630
Merge pull request #564 from litghost/add_check_arch_api
Add simple python file for doing Arch API sanity checks.
2021-02-02 16:55:34 +00:00
David Shah
d1ef3ae1ba
Merge pull request #557 from litghost/refactor_placer_arch_api
RFC: Initial refactoring of placer API.
2021-02-02 16:55:13 +00:00
Keith Rothman
a4369afae5 Add simple python file for doing Arch API sanity checks.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-02 07:53:11 -08:00
Keith Rothman
da74a425d2 Run "make clangformat".
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-02 07:44:49 -08:00
Keith Rothman
01509ec7c9 Make BELs/PIPs lowercase as bels/pips per review comment.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-02 07:43:38 -08:00
Keith Rothman
1deab29b05 Moving missing empty check into initial placement loop.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-02 07:43:38 -08:00
Keith Rothman
9089ee2d16 Add pybindings for new APIs.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-02 07:43:36 -08:00
Keith Rothman
9fe546f279 Rename Partition -> BelBucket.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-02 07:34:56 -08:00
Keith Rothman
11c80c048b Update documentation.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-02 07:34:56 -08:00
Keith Rothman
310f9f7b84 Finish implementing new generic APIs.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-02 07:34:56 -08:00
Keith Rothman
8d9390fc46 Fix regression in use of FastBels.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-02 07:34:56 -08:00
Keith Rothman
16394d3158 Address some compiler warnings.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-02 07:34:56 -08:00
Keith Rothman
0338368afa Add Partition APIs to ice40, nexus, gowin archs.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-02 07:34:56 -08:00
Keith Rothman
d03d9d839b Working compile of ECP5.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-02 07:34:56 -08:00
Keith Rothman
71e210dd4b Refactor ECP5 to new Partition API.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-02 07:34:56 -08:00
Keith Rothman
878fcdd22d Implement partitioning in placer_heap.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-02 07:34:56 -08:00
Keith Rothman
b4160c228e Add archcheck for partition methods.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-02 07:34:56 -08:00
Keith Rothman
f3a7c691a3 Make some partition names consistent.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-02 07:34:56 -08:00
Keith Rothman
2285c8dbbd Initial refactoring of placer API.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-02 07:34:56 -08:00
David Shah
efc98c517e
Merge pull request #563 from litghost/seperate_pip_range_types
Seperate PipRange types in pybindings_shared.
2021-02-02 09:59:18 +00:00
Keith Rothman
5cf2f8d1ea Seperate PipRange types in pybindings_shared.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-02-01 10:23:21 -08:00
David Shah
7d0b134b48
Merge pull request #562 from litghost/speed_up_archcheck
Avoid linear scan in PIP check loop.
2021-02-01 10:00:13 +00:00
Keith Rothman
b8c823ef99 Avoid linear scan in PIP check loop.
The previous additions to archcheck increased the runtime of the nexus
archcheck quiet a bit.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-01-29 13:42:14 -08:00
David Shah
15b2852b91
Merge pull request #556 from YosysHQ/dave/cleanup
General opportunistic cleanup
2021-01-28 16:10:22 +00:00
D. Shah
94e8847d67 cleanup: Spelling fixes
Signed-off-by: D. Shah <dave@ds0.me>
2021-01-28 15:19:06 +00:00
D. Shah
5fc3e8e4d2 cleanup: Fix compiler warnings
Signed-off-by: D. Shah <dave@ds0.me>
2021-01-28 15:02:08 +00:00
D. Shah
6ecf7f86c8 cleanup: Remove dead/unused code
Note that some '#if 0' code that might still be useful for debugging in
the future has been retained.

Signed-off-by: D. Shah <dave@ds0.me>
2021-01-28 14:59:13 +00:00
D. Shah
0d97904216 clangformat
Signed-off-by: D. Shah <dave@ds0.me>
2021-01-28 14:38:20 +00:00
David Shah
b671d8f59d
Merge pull request #553 from YosysHQ/rel-slice
Switch from RelPtr to RelSlice
2021-01-28 12:53:03 +00:00
David Shah
a95d6678b1
Merge pull request #550 from pepijndevos/gw1n4
Gowin: Add GW1N-4 support
2021-01-28 08:13:21 +00:00
David Shah
6a7fa4b402
Merge pull request #554 from litghost/default_to_release
Default to Release, but allow other modes (e.g. Debug, RelWithDebInfo).
2021-01-28 07:31:27 +00:00
David Shah
bf8a14252b
Merge pull request #555 from litghost/complete_archcheck
Add connectivity round trip checks to archcheck.
2021-01-28 07:31:07 +00:00
Keith Rothman
b8770915ad Add connectivity round trip checks to archcheck.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-01-27 18:14:09 -08:00
Keith Rothman
a5472bc5c1 Default to Release, but allow other modes (e.g. Debug, RelWithDebInfo).
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
2021-01-27 18:13:10 -08:00
D. Shah
b87ab0ee9d Make RelSlice uncopyable
Signed-off-by: D. Shah <dave@ds0.me>
2021-01-27 20:49:14 +00:00
D. Shah
75ee2fc4e6 Move RelPtr/RelSlice out of arches into common
The bba approach seems widely used enough that it's reasonable for this
to become part of common code.

Signed-off-by: D. Shah <dave@ds0.me>
2021-01-27 20:43:01 +00:00
D. Shah
3fc5455ec5 ecp5: Switch from RelPtr to RelSlice
This replaces RelPtrs and a separate length field with a Rust-style
slice containing both a pointer and a length; with bounds checking
always enforced.

Thus iterating over these structures is both cleaner and safer.

Signed-off-by: D. Shah <dave@ds0.me>
2021-01-27 19:39:19 +00:00
D. Shah
c10238de8c ice40: Switch from RelPtr to RelSlice
This replaces RelPtrs and a separate length field with a Rust-style
slice containing both a pointer and a length; with bounds checking
always enforced.

Thus iterating over these structures is both cleaner and safer.

Signed-off-by: D. Shah <dave@ds0.me>
2021-01-27 18:35:49 +00:00
D. Shah
e049d5f2fc nexus: Switch from RelPtr to RelSlice
This replaces RelPtrs and a separate length field with a Rust-style
slice containing both a pointer and a length; with bounds checking
always enforced.

Thus iterating over these structures is both cleaner and safer.

Signed-off-by: D. Shah <dave@ds0.me>
2021-01-27 17:24:01 +00:00
D. Shah
dc46d84c35 ecp5: Fix bottom clock tile renaming for tilegroups
Signed-off-by: D. Shah <dave@ds0.me>
2021-01-25 15:45:56 +00:00
Pepijn de Vos
2700687c00 Gowin: Add GW1N-4 support 2021-01-03 19:45:00 +01:00
Miodrag Milanović
9b9628047c
Merge pull request #549 from YosysHQ/update
Update pybind11 version and fix for future python versions
2021-01-02 11:16:49 +01:00
Miodrag Milanovic
61b07bc9a6 PyEval_InitThreads only for older than 3.9 2021-01-02 10:22:51 +01:00
Miodrag Milanovic
e76cdab6dd Update pybind11 to version 2.6.1 2021-01-02 10:15:39 +01:00
David Shah
c6cdf30501
Merge pull request #548 from per-gron/c++17
C++17 compatibility: Don't use std::random_shuffle
2020-12-30 20:37:07 +00:00
Per Grön
60276e3447 C++17 compatibility: Don't use std::random_shuffle
std::random_shuffle deprecated in C++14 and was removed in C++17.
2020-12-30 18:53:32 +01:00
David Shah
818faa78aa clangformat
Signed-off-by: David Shah <dave@ds0.me>
2020-12-30 16:49:55 +00:00
Pepijn de Vos
3611f54902
Gowin target (#542)
* load wires

* add slice bels

* add IOB

* add aliases

* local aliases

* broken packing stuff

* working packer

* add constraints

* pnr runs1111

* add timing info

* constraints

* more constraint stuff

* add copyright

* remove generic reference

* remove parameters

* remove generic python api

* add newline to end of file

* some small refactoring

* warn on invalid constraints

* don't error on missing cell

* comment out debugging print

* typo

* avoid copy

* faster empty idstring

* remove intermediate variable

* no more deadnames

* fix cst warnings

* increase ripup and epsilon a bit

* take single device parameter

* add info to readme

* gui stubs

* Revert 4d03b681a8

* assign ff_used in assignArchInfo

* decrease beta for better routability

* try to fix CI
2020-12-30 14:59:55 +00:00
David Shah
5e53a18292 ecp5: Improve pseudo-diff IO error handling
Signed-off-by: David Shah <dave@ds0.me>
2020-12-27 20:14:49 +00:00
David Shah
74c4fa6751 ice40: Nicer error for unconstrained SB_GB_IO
Signed-off-by: David Shah <dave@ds0.me>
2020-12-27 20:11:08 +00:00
David Shah
a40829fef3 command.cc: Improve help text
Signed-off-by: David Shah <dave@ds0.me>
2020-12-27 20:05:33 +00:00
David Shah
84c55f8931
Merge pull request #543 from tcal-x/use-single-char-find
Use std::string::find(char c) when searching for a single character.
2020-12-17 21:19:05 +00:00
David Shah
c667c56bd9 ecp5: Fix FF timing data
Signed-off-by: David Shah <dave@ds0.me>
2020-12-17 20:27:32 +00:00
Tim Callahan
c967f8e434 Use std::string::find(char c) when searching for a single character.
Signed-off-by: Tim Callahan <tcal@google.com>
2020-12-16 20:07:56 -08:00
David Shah
c8cb9895a3
Merge pull request #540 from YosysHQ/dave/nexus-dotproduct
nexus: Add MULTADDSUB9X9WIDE support
2020-12-10 20:36:56 +00:00
David Shah
2c6caf4a9a nexus: Add MULTADDSUB9X9WIDE support
Signed-off-by: David Shah <dave@ds0.me>
2020-12-08 15:49:48 +00:00
David Shah
bdaa9f0eae
Merge pull request #536 from YosysHQ/dave/disable-default-gui
cmake: Disable building GUI by default
2020-12-08 12:02:30 +00:00
David Shah
0a54ffdd44 cmake: Disable building GUI by default
This should reduce the number of Qt5-related issues, which often prevent
even the basic command line flow from working.

Signed-off-by: David Shah <dave@ds0.me>
2020-12-08 10:01:23 +00:00
David Shah
ca08add9c9
Merge pull request #528 from YosysHQ/dave/nexus-lram
nexus: Add basic LRAM support
2020-12-08 09:26:09 +00:00
David Shah
588042dc99 nexus: Fix LRAM pin types
Signed-off-by: David Shah <dave@ds0.me>
2020-12-07 13:26:45 +00:00
David Shah
f923d32620 nexus: Add support for initialised LRAM
Signed-off-by: David Shah <dave@ds0.me>
2020-12-07 11:57:10 +00:00
David Shah
92ef01830c ice40: Clarify feedback paths in PLL constraints code
Signed-off-by: David Shah <dave@ds0.me>
2020-12-03 11:40:00 +00:00
David Shah
c73b4bec8f
Merge pull request #530 from YosysHQ/dave/ice40-derive-constr
ice40: Derive PLL timing constraints
2020-12-03 11:35:31 +00:00
David Shah
940b7efa15 ice40: Derive PLL timing constraints
Signed-off-by: David Shah <dave@ds0.me>
2020-12-03 09:55:30 +00:00
David Shah
270efdca85 nexus: Add basic LRAM support (no init)
Signed-off-by: David Shah <dave@ds0.me>
2020-12-02 17:07:34 +00:00
David Shah
f937982754
Merge pull request #527 from YosysHQ/dave/nexus-clocking
nexus: Clock constraint and PLL support
2020-12-02 16:21:29 +00:00
David Shah
86e6a2225c nexus: Add PLL support
Signed-off-by: David Shah <dave@ds0.me>
2020-12-02 15:01:46 +00:00
David Shah
b666c85824 nexus: Add support for deriving timing constraints in packer
Signed-off-by: David Shah <dave@ds0.me>
2020-12-02 09:44:17 +00:00
David Shah
5a291e4622 nexus/pdc: Parse simple clock constraints
Signed-off-by: David Shah <dave@ds0.me>
2020-12-02 09:34:11 +00:00
David Shah
868902fbdf
Merge pull request #526 from YosysHQ/dave/router2-timing
router2: Avoid ripup of critical path
2020-12-01 12:51:02 +00:00
David Shah
62dde576e0
Merge pull request #525 from YosysHQ/dave/router2-tweaks
router2: Improve thread safety
2020-12-01 10:22:42 +00:00
David Shah
402819c64b router2: Avoid ripup of critical path
Signed-off-by: David Shah <dave@ds0.me>
2020-12-01 09:54:19 +00:00
David Shah
3503f4e907 router2: Make splitting of wires thread-safe
Signed-off-by: David Shah <dave@ds0.me>
2020-12-01 09:38:52 +00:00
David Shah
b6c91d1621 router2: Add per-thread rng
Signed-off-by: David Shah <dave@ds0.me>
2020-12-01 09:21:44 +00:00
Miodrag Milanović
8b5c0dc1e4
Merge pull request #524 from daveshah1/nextpnr-nexus
Upstreaming basic support for Nexus devices
2020-11-30 10:56:59 +01:00
David Shah
2fe8bebc6c nexus: Update docs and CMake
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:59:04 +00:00
David Shah
567166aece nexus: Fix db integrity check
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
bb50b54d80 nexus: Add to CI
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
ca73e14cf9 nexus: Add post-place LUTFF optimisation
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
f84850064f nexus: Improve error handling in global router
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
df3c6dfe3e nexus: Preliminary integration of DSP timing data
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
76543d05e7 nexus: Tweak heuristics to improve routeability
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
e3b3201d53 nexus: Clocked MULTADDSUB36X36 fix
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
5cf7f01169 nexus: Add MULTADDSUB36X36
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
f795527454 nexus: Add MULTADDSUB18X18 support
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
edd719c5c5 nexus: ACC54 definitions
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
91d746cfc8 nexus: Add DSP pre-adder support
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
fcde8e2d56 nexus: Fix DSP signed ports
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
54539b8519 nexus: Larger DSP tweaks
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
6b5277638b nexus: Fix slow routing around DSPs
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
160045a058 nexus: Fix validity checking when DSPs are used
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
d8e748bc58 nexus: Refactor DSP macro splitting to make it more generic
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
30c65931b2 nexus: Add support for clocked MULT9X9s
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
9203181625 nexus: Support for unclocked 9x9 multiplies
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
d9a19897c4 nexus: More DSP primitive config
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
094bf419d4 nexus: Miscellaneous DSP infrastructure
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
90608f2c89 nexus: Add some infrastructure for DSP packing
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
c7ad3cece6 nexus: Tweak delay heuristics
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
a69c595802 router1: Fix same-source-dest case
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
530d6ce9e9 nexus: Add EBR timing analysis
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
9b89a82573 nexus: Add LUTRAM and WIDEFN9 timing support
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
8c1f25cf31 timing: Add a few more cell types
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
6457b4ca7b nexus: Swap sort order to make some lookups easier
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
fa9194e3e2 nexus: Add cell delay lookup
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
963fd175ad nexus: Lookup speed grade and pip delays
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
4e5ad7feac nexus: Add timing structures to BBA
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
629a06b0ae nexus: Add error if device not specified
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
f41b4045d4 nexus: Add missing Q_MOC_RUN guard
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
3d41656168 nexus: Default EBR DWS pins to 1
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
0a59cbb8ce nexus: Use dedicated Vcc routing for OXIDE_COMB pins
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
e6c2887773 nexus: Basic support for carries
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
c89d830e16 nexus: Add WIDEFN9 support
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
00ff7c6cfe nexus: Default to router2 for now
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
5e90086d4f router2: Fix case where src and dst are the same
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
f8dca82a71 nexus: Basic support for differential IO types
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:28 +00:00
David Shah
f749038959 nexus: Improve placer config
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
e8e6316f88 nexus: EBR fixes
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
27ecaf3e88 nexus: EBR FASM generation
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
4503608c7c nexus: Add packing rules for BRAM
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
8d1678f0ef nexus: Add stub GUI
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
70749b37d0 nexus: Fix Python bindings
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
1e4eb5ec39 nexus: Ignore some PDC commands
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
cbf99d5e53 nexus: LUTRAM support
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
dfd6b6e39e nexus: Add a simple global routing pass
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
40441d83cd nexus: Promote and place global buffers
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
c80144b7f0 nexus: Generate FASM files that can be used standalone
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
901bf2bb1e nexus: Update for new monolithic prjoxide
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
9affda5626 nexus: Build and embed chipdb automatically
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
7645354917 nexus: More global placement infrastructure
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
2df4d212c3 nexus: Bel search function for DCC placement
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
da1e3c8612 nexus: Add constant/inversion packing
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
1bb509897c nexus: More pin styles and FASM pinmux gen
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
0eb5c72cc5 nexus: Refactor cell pin style db
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
7f03f4d896 nexus: Tidy up FASM backend
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
d849e2f8b4 nexus: Fix PDC string handling
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
af3af59df4 nexus: Use tilegroups for IO bitgen
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
10ad7d9cfe nexus: IO packing fix
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
df3866a800 nexus: Add IO packing
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
518ead2e2d nexus: IO pre-packing
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
69b449c875 nexus: Initial PDC parser integration
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
12013b4c1f nexus: Lookup of package and IO pins
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
e2de234ef1 nexus: Add pin/pad data to bba
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
e203bd3a2b nexus: Skeleton of PDC parser
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
0a1afe1f79 nexus: Infrastructure for constant/inv handling
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
2f822a3b79 nexus: Packing helper functions
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
46536773f4 nexus: Rework how constant pins work
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
acb4cf9ead nexus: Update to planned IO fields
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
75040cdbdf nexus: Randomise delay to stop router from getting stuck
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
53d1c2c309 nexus: Fix validity checking
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
682351df7f nexus: Updates and fixes
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
e54aa836a4 nexus: Updates
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
2b13b24cbe nexus: Bring up to date
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
a586bfc290 nexus: Support Lattice-style parameters
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
84d5426242 nexus: Working on validity checking
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
887d7c717b nexus: Adding pin definitions
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
46010f33ad nexus: Globals and naming fixes
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
b5d46a0235 nexus: Add Python bindings
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
a280f893d4 nexus: Add oscillator support
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
f8f3ee06c7 nexus: Add SEIO18 support
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
44f98c545b nexus: Add global networks
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
140baf7037 nexus: Globals implementation
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
3c8a740374 nexus: Add global info to BBA
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
2fc75bae79 nexus: Fix FF naming
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
ee4e30ce8b nexus/fasm: Fix SLICE lettering
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
1ff42e9936 nexus: Fixes
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
cef0e1db8f nexus: Minimal IO FASM output
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
689922bc21 nexus: Add FASM export for comb logic and FFs
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
2c49f812d9 nexus: Add packing framework
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
eb15463406 nexus: Add routing FASM export
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
8e53b35fcc nexus/arch: Add tile loc flags and package structs
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
871f3c66bc nexus: Logic tile validity check functions
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
b00595f3da nexus: Add constids
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
1e940323b0 nexus: Add main
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
259659c838 nexus: Add more placeholder Arch functions
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
65a59e9dcc nexus: Implement bel, wire and pip Arch functions
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
ae1a486520 Add Arch constructor
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
35de36dd59 Implementing some Arch functions
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
c7f00b4760 nexus: Add iterator types based on nextpnr-xilinx
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
60c6510b3b nexus: Arch utilities
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
54e0ef9cf7 Adding archdefs and bba PODs
Signed-off-by: David Shah <dave@ds0.me>
2020-11-30 08:45:27 +00:00
David Shah
1afa494e69 clangformat
Signed-off-by: David Shah <dave@ds0.me>
2020-11-26 18:08:19 +00:00
David Shah
839fbb3fe9
Merge pull request #520 from YosysHQ/dave/improved-check
nextpnr: Improve error reporting in Context::check
2020-11-26 16:10:35 +00:00
David Shah
70de8b3a03 nextpnr: Improve error reporting in Context::check
Signed-off-by: David Shah <dave@ds0.me>
2020-11-26 11:12:20 +00:00
David Shah
8955230712
Merge pull request #519 from cr1901/patch-1
Update netlist.md
2020-11-24 19:32:48 +00:00
William D. Jones
996b4100b9
Update netlist.md
Add information about how top-level ports and connected nets differ from other ports and nets.
2020-11-24 14:30:30 -05:00
Miodrag Milanović
6514471a3b
Merge pull request #516 from meijianyue/master
missing '/local' at ecp5 installing
2020-11-18 10:18:48 +01:00
Miodrag Milanović
da4ff1c40a
Merge pull request #518 from BracketMaster/patch-1
Update CMakeLists.txt
2020-11-18 10:00:18 +01:00
Yehowshua Immanuel
fe8a011629
Update CMakeLists.txt
I believe Prjtrellis has CMAKE define pytrellis as a shared module, not library.
On MacOS, this makes a difference and NextPNR expected ``.dylib``
instead of ``.so``. Things still work on Linux.
2020-11-17 17:53:46 -05:00
梅见月七
b015ee825c
missing '/local' at ecp5 installing 2020-11-17 09:40:45 +08:00
Miodrag Milanović
93faa752f5
Remove boost-python from requirements 2020-11-16 09:42:15 +01:00
Miodrag Milanović
15f35c19b8
Merge pull request #515 from YosysHQ/python_improvements
Python code cleanup
2020-11-14 17:17:25 +01:00
Miodrag Milanovic
bb16fdb4bb Python code cleanup 2020-11-14 16:34:12 +01:00
David Shah
06555aa003 clangformat
Signed-off-by: David Shah <dave@ds0.me>
2020-11-14 09:07:34 +00:00
David Shah
b8d0e622fd
Merge pull request #514 from YosysHQ/no-copy-relptr
RelPtr: remove copy constructor and copy assignment
2020-11-14 09:06:59 +00:00
David Shah
8686b6dada RelPtr: remove copy constructor and copy assignment
These operations are meaningless for a data structure that references
another structure relative to its location.

Signed-off-by: David Shah <dave@ds0.me>
2020-11-13 20:19:53 +00:00
Miodrag Milanović
319046fed7
Merge pull request #513 from YosysHQ/python_interpreter
Do not create new python interpreter
2020-11-13 16:05:16 +01:00
Miodrag Milanovic
e15b339d41 Do not create new python interpreter 2020-11-13 15:02:24 +01:00
David Shah
cf331ca2a7
Merge pull request #512 from smunaut/fix-pll-dynamic-delay
ice40/pack/SB_PLL: Force fixed value to 4'b1111 if dynamic delay is used
2020-11-10 10:03:45 +00:00
Sylvain Munaut
bdc95b8dc0 ice40/pack/SB_PLL: Force fixed value to 4'b1111 if dynamic delay is used
It's been confirmed that :
 (1) this is required by the hardware
 (2) icecube will force that field to 4'b1111 in fixed mode

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2020-11-10 10:24:58 +01:00
David Shah
76ffdbbbde
Merge pull request #511 from YosysHQ/async-lsr-routing
ecp5: Fix handling of CLK/LSR wire attached settings
2020-11-05 12:36:17 +00:00
David Shah
9916525418 ecp5: Fix handling of CLK/LSR wire attached settings
Signed-off-by: David Shah <dave@ds0.me>
2020-11-05 11:53:55 +00:00
Miodrag Milanović
d5dde5df46
Merge pull request #509 from YosysHQ/dave/remove-wire-alias
Remove wire alias API
2020-10-15 12:22:15 +02:00
David Shah
b18ea204c2 Remove wire alias API
It has not actually been implemented in any router for over 2.5 years and causes nothing more than confusion. It can always be added back if it forms part of a future solution; possibly as part of a more general database structure rethink.

Signed-off-by: David Shah <dave@ds0.me>
2020-10-15 09:36:15 +01:00
David Shah
576baa994f ecp5: Fix some tricky ECLKSYNCB/CLKDIVF packing cases
Signed-off-by: David Shah <dave@ds0.me>
2020-10-09 21:41:55 +01:00
David Shah
b5054f0d77 Merge branch 'kittennbfive-annotate-primitives' into master 2020-10-01 09:02:39 +01:00
David Shah
c4244d967d docs: Tidy up
Signed-off-by: David Shah <dave@ds0.me>
2020-10-01 09:02:29 +01:00
kittennbfive
3c7c95ecce
Update primitives.md 2020-09-30 19:29:13 +00:00
kittennbfive
b2438caec3
update doc - UNTESTED on real hardware 2020-09-28 14:49:35 +00:00
David Shah
9aff6aa55c ecp5: Add support for setting PIO clamp
Signed-off-by: David Shah <dave@ds0.me>
2020-09-26 09:24:01 +01:00
David Shah
587bfab2a6
Merge pull request #502 from pepijndevos/patch-1
Update generic synth script for dfflegalize changes
2020-09-25 09:33:55 +01:00
David Shah
84ce3ed43e ci: Update Yosys version for dfflegalize
Signed-off-by: David Shah <dave@ds0.me>
2020-09-24 13:57:14 +01:00
Miodrag Milanović
d927878024
Merge pull request #503 from neuschaefer/typo
README.md: Fix two typos
2020-09-23 09:12:57 +02:00
Jonathan Neuschäfer
13c2e8ceba README.md: Fix two typos 2020-09-23 09:08:47 +02:00
Pepijn de Vos
26dfe6f23d
Update generic synth script for dfflegalize changes 2020-09-18 15:39:24 +02:00
David Shah
8f96417bcf
Merge pull request #501 from landley/master
Building nextpnr on Devuan ascii 2.0 needs the "C" language enabled.
2020-09-16 14:25:21 +01:00
Rob Landley
9e597e0dda Building nextpnr on Devuan ascii 2.0 needs the "C" language enabled.
See https://lists.j-core.org/pipermail/j-core/2020-September/000940.html
2020-09-16 03:02:12 -05:00
Miodrag Milanović
f7da7c26aa
Merge pull request #500 from YosysHQ/dave/py-none-fix
python: Fix handling of None in pybind11
2020-09-14 15:57:29 +02:00
David Shah
b5e5f8d85f python: Fix handling of None in pybind11
Signed-off-by: David Shah <dave@ds0.me>
2020-09-14 14:17:07 +01:00
Miodrag Milanović
48cd40773a
Merge pull request #496 from YosysHQ/gui_fix
Preserve cmd parameters  when loading json from GUI
2020-09-04 17:29:43 +02:00
Miodrag Milanovic
717bcfa19e Preserve cmd parameters when loading json from GUI 2020-09-04 17:14:30 +02:00
David Shah
4512a9de19
Merge pull request #494 from rschlaikjer/rschlaikjer-print-sources-in-time-report
Add option to print critical path source code
2020-08-31 07:38:47 +01:00
Ross Schlaikjer
c30cadd19c
No longer need fstream include 2020-08-30 18:22:05 -04:00
Ross Schlaikjer
cba4753c22
Only print filenames for now, default on 2020-08-30 18:19:41 -04:00
Ross Schlaikjer
a8c110b045
Add option to print critical path source code
In order to make debugging the critical path easier, add an option that
will log the location each net was defined, if known.
If the file that contains the definition is known, and is readable, also
print the part of the source HDL responsible for the signal definition.
2020-08-30 17:43:29 -04:00
whitequark
f6d436d58b
CMake: fix Windows-ism in status message 2020-08-26 09:51:38 +00:00
whitequark
c8ecb8341c
Merge pull request #491 from cr1901/chipdb-msg
Fix MESSAGE indicating where externally-built .bbas live.
2020-08-23 01:15:39 +00:00
William D. Jones
e63270f918 Fix MESSAGE indicating where externally-built .bbas live. 2020-08-22 21:09:21 -04:00
David Shah
109aa63474 clangformat
Signed-off-by: David Shah <dave@ds0.me>
2020-08-20 09:46:49 +01:00
David Shah
be607c10a8
Merge pull request #489 from YosysHQ/dave/ecp5-fix-ioddrx2
ecp5: Fix how ODDRX2 SCLK/RST are set
2020-08-13 20:05:16 +01:00
David Shah
fd5d95320b ecp5: Fix how ODDRX2 SCLK/RST are set
Signed-off-by: David Shah <dave@ds0.me>
2020-08-13 13:24:52 +01:00
David Shah
b0dedf1a22
Merge pull request #488 from YosysHQ/dave/port_fanin_fix
timing: Fix counting of fanin in out-of-context mode
2020-08-12 16:38:46 +01:00
David Shah
b299c64973
Merge pull request #487 from YosysHQ/dave/hierfix
Hierarchical floorplanning fixes
2020-08-12 12:32:31 +01:00
David Shah
3611b7120c timing: Fix counting of fanin in out-of-context mode
Signed-off-by: David Shah <dave@ds0.me>
2020-08-12 10:42:26 +01:00
David Shah
e475490992 ecp5: Run fixupHierarchy after packing
Signed-off-by: David Shah <dave@ds0.me>
2020-08-12 10:12:10 +01:00
David Shah
e313d051a8 Add a warning when floorplan constraint doesn't match
Signed-off-by: David Shah <dave@ds0.me>
2020-08-12 10:11:52 +01:00
Miodrag Milanović
fbe486df45
Merge pull request #485 from YosysHQ/exception_translation
Made proper exception translation
2020-08-08 10:43:22 +02:00
Miodrag Milanovic
1168d1ff90 Made proper exception translation 2020-08-07 09:46:02 +02:00
David Shah
b39a2a5020
Merge pull request #477 from YosysHQ/pybind11
Move to pybind11
2020-07-27 13:50:42 +01:00
Miodrag Milanovic
fe398ab983 clangformat 2020-07-25 10:17:13 +02:00
David Shah
bb6e6a15f1 pycontainers: Fix kv-pair-iter type
Signed-off-by: David Shah <dave@ds0.me>
2020-07-24 16:27:47 +01:00
Miodrag Milanovic
8a7c3c9802 fix whitespace 2020-07-24 16:40:45 +02:00
Miodrag Milanovic
597f4a1495 exception translation 2020-07-24 11:03:08 +02:00
Miodrag Milanovic
598ef014e6 Fixed named arguments 2020-07-24 10:59:11 +02:00
Miodrag Milanovic
770bb40eb3 proper argument propagation 2020-07-24 10:47:10 +02:00
Miodrag Milanovic
8a90328ab7 proper ctx export 2020-07-23 20:20:26 +02:00
Miodrag Milanovic
cca7d3aef7 possible fix 2020-07-23 19:55:25 +02:00
Miodrag Milanovic
6bb457be69 Needed by python lib itself for static 2020-07-23 18:40:54 +02:00
Miodrag Milanovic
8f2b707d02 Initial conversion to pybind11 2020-07-23 18:35:18 +02:00
Miodrag Milanovic
444e535f00 Add pybind11 2.5 source 2020-07-23 08:58:19 +02:00
Miodrag Milanović
e6991ad5dc
Merge pull request #474 from rroohhh/master
readme: fix typo ICEBOX -> ICESTORM
2020-07-16 15:56:43 +02:00
Robin Ole Heinemann
70afb97f61 readme: fix typo ICEBOX -> ICESTORM 2020-07-16 15:52:27 +02:00
David Shah
44007eab6f
Merge pull request #473 from YosysHQ/dave/lpf-param-check
ecp5: Add a warning for unknown LPF IOBUF attrs
2020-07-13 21:11:16 +01:00
David Shah
467d26d9e6 ecp5: Add a warning for unknown LPF IOBUF attrs
Signed-off-by: David Shah <dave@ds0.me>
2020-07-13 17:30:24 +01:00
David Shah
5f241f6baa ci: Bump prjtrellis version
Signed-off-by: David Shah <dave@ds0.me>
2020-07-13 11:34:15 +01:00
David Shah
00d702086a
Merge pull request #472 from YosysHQ/ecp5-sysconfig
ecp5: SYSCONFIG in LPF support
2020-07-13 11:32:41 +01:00
David Shah
9a621cf49c
Merge pull request #471 from smunaut/fix-pll-gbio-conflict
ice40: If IO is used by SB_GB_IO, can't use it for PLL
2020-07-12 14:54:47 +01:00
David Shah
19a4ddf2f0 ecp5: Add SYSCONFIG settings to bitstream
Signed-off-by: David Shah <dave@ds0.me>
2020-07-12 14:51:14 +01:00
David Shah
6016e54d6c ecp5: Add parsing of SYSCONFIG line in LPF
Signed-off-by: David Shah <dave@ds0.me>
2020-07-12 12:53:16 +01:00
Sylvain Munaut
33067130e5 ice40: If IO is used by SB_GB_IO, can't use it for PLL
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2020-07-09 13:04:19 +02:00
Miodrag Milanović
3cafb16aa6
Merge pull request #469 from YosysHQ/new_parts_fixes
Fixes for new part types
2020-07-08 17:24:15 +02:00
Miodrag Milanovic
2726f3af91 Fixes for new part types 2020-07-08 16:45:27 +02:00
David Shah
451d56051b
Merge pull request #468 from YosysHQ/support_hx4k
Support 4K parts directly
2020-07-08 14:15:49 +01:00
Miodrag Milanovic
1fae965cbb Use proper names in GUI 2020-07-08 14:16:00 +02:00
Miodrag Milanovic
32ddc94b4f Support rest of parts 2020-07-08 14:09:44 +02:00
Miodrag Milanovic
b45b375ff2 Missed adding option 2020-07-08 13:45:34 +02:00
Miodrag Milanovic
6991a53d68 Adding LP4K as well 2020-07-08 13:44:13 +02:00
Miodrag Milanovic
3be76a837d Support 4K parts directly 2020-07-08 13:22:59 +02:00
Miodrag Milanovic
bb3dad7ce7 Fix assert, check should be other way arround 2020-07-06 17:29:25 +02:00
David Shah
137241cfef
Merge pull request #463 from YosysHQ/fix-archcheck
Fix arch checks, and add these to CI
2020-07-02 13:32:30 +01:00
whitequark
4a2964c915
Merge pull request #465 from whitequark/fix-trellis-discovery
Improve Trellis discovery logic
2020-07-01 22:02:36 +00:00
whitequark
18bb70afca CMake: improve logic for discovering Trellis. 2020-07-01 21:11:03 +00:00
whitequark
f6e30f22f4 CMake: fix path checks in chipdb build scripts.
`if(NOT DEFINED)` is not appropriate since a variable that contains
`-NOTFOUND` still counts as `DEFINED`. This can cause issues if
configuration fails, writes `-NOTFOUND` to the cache, and is then
restarted.
2020-07-01 20:22:21 +00:00
David Shah
c0901fb972 ecp5: Fix derivation of OSCG timing constraint
Signed-off-by: David Shah <dave@ds0.me>
2020-06-29 22:11:00 +01:00
David Shah
72786e249a ci: Run --test architecture checks
Signed-off-by: David Shah <dave@ds0.me>
2020-06-29 21:32:26 +01:00
David Shah
43ad5614bd ci: Bump trellis and icestorm versions to latest
Signed-off-by: David Shah <dave@ds0.me>
2020-06-29 19:53:25 +01:00
David Shah
2c4ae853f2 ecp5: Fix getTileBelDimZ
Signed-off-by: David Shah <dave@ds0.me>
2020-06-29 19:52:31 +01:00
David Shah
c7fbdc7877 Avoid low-value and slow pip name check for ECP5
Signed-off-by: David Shah <dave@ds0.me>
2020-06-29 19:52:31 +01:00
David Shah
b24e0a609b ice40: Fix getBelsByTile
Signed-off-by: David Shah <dave@ds0.me>
2020-06-29 19:52:31 +01:00
David Shah
32e655d0af placer1: Unlock even if placement fails
Prevents a hang during routing when using --force

Fixes #462

Signed-off-by: David Shah <dave@ds0.me>
2020-06-29 16:39:31 +01:00
Miodrag Milanovic
929a1cc7e4 Make python bindings consistent 2020-06-27 13:24:30 +02:00
Miodrag Milanovic
7a95629aff Fix clangformat and execute it 2020-06-27 13:20:16 +02:00
Miodrag Milanovic
901ad4e917 Update git ignore locations 2020-06-27 13:18:06 +02:00
David Shah
9eb6e549c5 Update some URLs
Signed-off-by: David Shah <dave@ds0.me>
2020-06-26 11:43:27 +01:00
David Shah
4f4aa53120
Merge pull request #460 from whitequark/better-embed
Simplify and improve chipdb embedding/loading
2020-06-26 11:32:13 +01:00
whitequark
89e0cc8078 Simplify and improve chipdb embedding/loading. 2020-06-26 08:36:07 +00:00
David Shah
2873133479 Update COPYING
Signed-off-by: David Shah <dave@ds0.me>
2020-06-25 19:45:18 +01:00
David Shah
1df8ac805a HeAP: Add timeout to IO placement
Signed-off-by: David Shah <dave@ds0.me>
2020-06-25 19:42:53 +01:00
whitequark
19a3095ecb Fix typo 2020-06-25 17:26:57 +00:00
David Shah
dc209f6344
Merge pull request #459 from whitequark/better-chipdb
CMake: rewrite chipdb handling from ground up
2020-06-25 15:39:54 +01:00
whitequark
bf8d4c428e CMake: require at least version 3.5 (Ubuntu 16.04). 2020-06-25 14:03:37 +00:00
whitequark
1dc1164dce CMake: rewrite chipdb handling from ground up. 2020-06-25 14:03:37 +00:00
whitequark
23d19a254d CMake: only request a CXX compiler. 2020-06-24 13:22:49 +00:00
David Shah
7decb6526b
Merge pull request #458 from whitequark/patch-1
Remove dead links from README
2020-06-24 08:27:32 +01:00
whitequark
1f061b5a97
Remove dead links from README 2020-06-24 07:24:29 +00:00
David Shah
93dbb53371
Merge pull request #457 from whitequark/better-bba
CMake: promote bba to a true subproject
2020-06-24 07:09:08 +01:00
whitequark
4c7aedcf4e CMake: promote bba to a true subproject. 2020-06-23 10:47:18 +00:00
David Shah
c9e7d1448e clangformat
Signed-off-by: David Shah <dave@ds0.me>
2020-06-12 16:19:14 +01:00
David Shah
3c078f6090
Merge pull request #454 from YosysHQ/ecp5-global-place
ecp5: Fix placement of DCCs to guarantee routeability
2020-06-10 18:12:06 +01:00
David Shah
43fd9e6779 ecp5: Fix placement of DCCs to guarantee routeability
Signed-off-by: David Shah <dave@ds0.me>
2020-06-10 15:47:47 +01:00
David Shah
be50947fa6
Merge pull request #452 from smunaut/ice40_shiftreg_div_mode
ice40: Add support for the 2nd bit of SHIFTREG_DIV_MODE
2020-06-02 19:55:31 +01:00
Sylvain Munaut
9b71bba747 ice40: Add fallback behavior for Extra Cell config bits vectors
This helps make new nextpnr compatible with old chipdbs when a parameters
goes from single bit to multi bit.

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2020-06-02 20:21:16 +02:00
Sylvain Munaut
5e2b6bcef9 ice40: Add support for the 2nd bit of SHIFTREG_DIV_MODE
This requires the matching chipdb update from icestorm project !

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2020-06-02 11:03:04 +02:00
David Shah
f44498a530
Merge pull request #447 from whitequark/wasi
Port nextpnr-{ice40,ecp5} to WASI
2020-05-24 14:23:35 +01:00
whitequark
e7bb04769d Port nextpnr-{ice40,ecp5} to WASI.
This involves very few changes, all typical to WASM ports:
  * WASM doesn't currently support threads or atomics so those are
    disabled.
  * WASM doesn't currently support exceptions so the exception
    machinery is stubbed out.
  * WASM doesn't (and can't) have mmap(), so an emulation library is
    used. That library currently doesn't support MAP_SHARED flags,
    so MAP_PRIVATE is used instead.

There is also an update to bring ECP5 bbasm CMake rules to parity
with iCE40 ones, since although it is possible to embed chipdb into
nextpnr on WASM, a 200 MB WASM file has very few practical uses.

The README is not updated and there is no included toolchain file
because at the moment it's not possible to build nextpnr with
upstream boost and wasi-libc. Boost requires a patch (merged, will
be available in boost 1.74.0), wasi-libc requires a few unmerged
patches.
2020-05-23 20:57:26 +00:00
David Shah
2d406f3e27
Merge pull request #440 from YosysHQ/lattice-fixes
Fixes for the Lattice SERDES eye demo designs
2020-05-18 09:38:41 +01:00
David Shah
ddf546c2cc clangformat
Signed-off-by: David Shah <dave@ds0.me>
2020-05-16 12:57:24 +01:00
David Shah
0fb7746c20
Merge pull request #442 from nategraff-sifive/fix-unsupported-spelling
Fix spelling of 'unsupported'
2020-05-14 22:10:06 +01:00
Miodrag Milanović
f8cf206826
Merge pull request #441 from YosysHQ/eddie/fix_topo
Fix embarassing use of topographical when meaning topological
2020-05-14 19:08:22 +02:00
Miodrag Milanović
34bc421626
Merge pull request #439 from edbordin/master
Minor patch for MinGW build
2020-05-14 19:07:49 +02:00
Eddie Hung
e6b85f1bc0 Fix embarassing use of topographical when meaning topological 2020-05-14 08:55:28 -07:00
David Shah
163dee1e1a ecp5: Disconnect dedicated DCU inputs if connected to constants
Signed-off-by: David Shah <dave@ds0.me>
2020-05-14 13:26:56 +01:00
David Shah
3c60ea383d ecp5: Improve global routing robustness
Signed-off-by: David Shah <dave@ds0.me>
2020-05-14 13:12:30 +01:00
David Shah
2aaef61547 ecp5: Don't promote VCC/GND to globals even if connected to clock port
Signed-off-by: David Shah <dave@ds0.me>
2020-05-14 13:07:59 +01:00
David Shah
2cebd40f2e lpf: Support // comments
Signed-off-by: David Shah <dave@ds0.me>
2020-05-14 13:06:58 +01:00
Ed Bordin
7b84ed94b5 minor patch for MinGW build 2020-05-14 16:35:55 +10:00
Nathaniel Graff
08f68518f2 Fix spelling of 'unsupported'
Signed-off-by: Nathaniel Graff <nathaniel.graff@sifive.com>
2020-05-13 20:00:37 -07:00
David Shah
2692c6f6cc
Merge pull request #437 from miek/lvcmos33d-drive
ecp5: Allow setting drive strength for LVCMOS33D IOs
2020-05-12 14:24:18 +01:00
Mike Walters
5b660e3432 ecp5: Allow setting drive strength for LVCMOS33D IOs 2020-05-12 14:19:37 +01:00
David Shah
e431d1a33f Add missing --top option
Signed-off-by: David Shah <dave@ds0.me>
2020-05-09 19:47:03 +01:00
David Shah
0faf07aac8 Merge branch 'rschlaikjer-rschlaikjer-mult18x18-register-timings' 2020-05-01 08:17:52 +01:00
David Shah
84327b634c ecp5: MULT18X18D timing fixes
Signed-off-by: David Shah <dave@ds0.me>
2020-05-01 08:17:29 +01:00
Ross Schlaikjer
a1160068c8
No cell delay for clocked MULT18X18D 2020-04-30 11:09:22 -04:00
Ross Schlaikjer
de6ddc470b
Further condense 2020-04-29 14:52:29 -04:00
Ross Schlaikjer
6e8082860e
Dedupe clock error check 2020-04-29 14:46:09 -04:00
Ross Schlaikjer
0043ae0807
Issue warning for mixed-mode inputs 2020-04-29 14:39:52 -04:00
Ross Schlaikjer
6625284950
Handle register timing case 2020-04-29 13:58:52 -04:00
Ross Schlaikjer
a4fa953740
Use registered port class on mult18x18 2020-04-29 11:08:53 -04:00
Ross Schlaikjer
5e763b1afc
Alter MULT18X18D timing db based on register config
If the REG_INPUTA_CLK and REG_INPUTB_CLK values are set, then we should
use the faster setup/hold timings for the 18x8 multiplier.
Similarly, check the value of REG_OUTPUT_CLK for whether or not to use
faster timings for the output.

This is based on how I currently understand the registers to work - if
anyone knows the actual rules for when each timing applies please do
chime in to correct this implementation if necessary.

Along the same lines, this PR does not address the case when the
pipeline registers are enabled, since it is not clear to me how exactly
that affects the timing.
2020-04-28 20:01:29 -04:00
David Shah
5c6b2cbafe
Merge pull request #433 from YosysHQ/dave/pyfixes
python: Miscellaneous fixes
2020-04-24 19:01:04 +01:00
David Shah
25938500d6 python: Also convert regular map keys to string
Signed-off-by: David Shah <dave@ds0.me>
2020-04-24 18:23:03 +01:00
David Shah
8f1683246e python: Improve general robustness during autocomplete
Signed-off-by: David Shah <dave@ds0.me>
2020-04-24 16:44:30 +01:00
David Shah
5024fc0690 python: Escape strings for autocomplete
Signed-off-by: David Shah <dave@ds0.me>
2020-04-24 16:41:13 +01:00
David Shah
fd099cef52 python: Wrap map IdString key when accessed by index
Signed-off-by: David Shah <dave@ds0.me>
2020-04-24 16:31:08 +01:00
David Shah
5e40589114
Merge pull request #432 from smunaut/fix_disconnect
design_utils: Set port.net to null when disconnecting
2020-04-24 15:35:33 +01:00
Sylvain Munaut
3573fcca80 design_utils: Set port.net to null when disconnecting
Without this the python bindings can't actually connect anything else
to a disconnected port since the assert in connect_ports will think
it's still connected

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2020-04-24 16:13:07 +02:00
Miodrag Milanović
5cc8fe6c18
Merge pull request #428 from mmicko/master
Better Boost support
2020-04-20 14:36:18 +02:00
Miodrag Milanovic
93228f78d7 old boost support 2020-04-20 13:59:47 +02:00
David Shah
de00c00aac ecp5: Fix CSDECODE bitgen
Signed-off-by: David Shah <dave@ds0.me>
2020-04-15 20:25:56 +01:00
David Shah
4458251765
Merge pull request #426 from YosysHQ/dave/fix-pll2eclk
ecp5: Use dedicated routing for ECLKs where possible
2020-04-15 12:41:41 +01:00
David Shah
64d3e3e1e8 ecp5: Use dedicated routing for ECLKs where possible
Signed-off-by: David Shah <dave@ds0.me>
2020-04-14 19:20:13 +01:00
Miodrag Milanovic
96c14abd1f Add TRELLIS_PROGRAM_PREFIX 2020-04-11 22:05:30 +02:00
David Shah
3eff12a2a0
Merge pull request #424 from mmicko/program_prefix
Support custom PROGRAM_PREFIX
2020-04-10 14:00:00 +01:00
Miodrag Milanovic
bdea5d072d Support custom PROGRAM_PREFIX 2020-04-10 10:50:30 +02:00
David Shah
a8111bba83 ecp5: Fix routing bitgen for non-SERDES 'VCIB' tiles
Signed-off-by: David Shah <dave@ds0.me>
2020-04-10 08:25:16 +01:00
David Shah
ced336492c ecp5: Make hysteresis default-on for LVCMOS33 bidir as well as input
Signed-off-by: David Shah <dave@ds0.me>
2020-04-09 21:36:27 +01:00
David Shah
396dfb7d5e
Merge pull request #423 from rschlaikjer/rschlaikjer-regmode-timing-database
Add support for REGMODE to DP16KD
2020-04-07 20:02:29 +01:00
Ross Schlaikjer
3aecb3b08c
No need to fetch context 2020-04-07 14:44:19 -04:00
Ross Schlaikjer
fc591421f9
Change assert to error 2020-04-07 14:42:27 -04:00
Ross Schlaikjer
e46b990251
Rearrange bool algebra 2020-04-07 14:31:17 -04:00
Ross Schlaikjer
3257bdc8a1
Actually just move all the logic to ArchInfo 2020-04-07 14:11:49 -04:00
Ross Schlaikjer
0bdf1e05f1
Extract regmode configuration to ArchInfo 2020-04-07 14:03:55 -04:00
Ross Schlaikjer
c007463168
Change timing database lookup based on REGMODE value 2020-04-07 13:48:21 -04:00
David Shah
e8933f8519
Merge pull request #419 from garytwong/handle-opendrain
Handle OPENDRAIN attribute.
2020-04-07 09:44:40 +01:00
David Shah
571ad7d604
Merge pull request #421 from garytwong/fix-lpf-locate-assertion-failure
Fix assertion failure on invalid LOCATE input.
2020-04-07 09:44:22 +01:00
Gary Wong
ec1eea9990 Fix assertion failure on invalid LOCATE input.
Trying to parse this invalid LPF syntax:

    LOCATE COMP "a" SITE "A1"
    IOBUF PORT "a" IO_TYPE=LVCMOS33;

(note missing semicolon on first line) gives an assertion failure in
strip_quotes, because the fifth token is scanned as "A1"IOBUF (without
a trailing quote).

Avoid the problem by detecting extraneous input and issuing a more
specific error.
2020-04-05 21:42:45 -06:00
David Shah
70ccab4765
Merge pull request #420 from ironsteel/fix-reporting-of-default-router
command.cc: Use correct constant for default router
2020-04-04 09:13:27 +01:00
Rangel Ivanov
ef4a699b72 command.cc: Use correct constant for default router
Otherwise --help reports that the default router is heap

Signed-off-by: Rangel Ivanov <rangelivanov88@gmail.com>
2020-04-04 10:39:29 +03:00
Gary Wong
31e9fffadd Handle OPENDRAIN attribute. 2020-04-03 17:59:19 -06:00
David Shah
f9a76c56f7 ecp5: Allow use of IDDRXN and ODDRXN type primitives on the same pin
Signed-off-by: David Shah <dave@ds0.me>
2020-04-03 09:53:14 +01:00
David Shah
f09dfb028a
Merge pull request #418 from garytwong/usrmclk-works
Remove comment about the USRMCLK primitive being untested.
2020-04-03 08:31:26 +01:00
Gary Wong
8cc6a2fae5 Remove comment about the USRMCLK primitive being untested.
Tested and verified working: the trivial configuration:

    module USRMCLK( USRMCLKI, USRMCLKTS );
        input USRMCLKI, USRMCLKTS;
    endmodule

    module top( input clk );
        reg[ 24:0 ] count = 0;

        always @( posedge clk ) begin
            count <= count + 1'b1;
        end

        USRMCLK mspi( .USRMCLKI( count[ 20 ] ), .USRMCLKTS( count[ 24 ] ) );
    endmodule

produces the expected output (toggling at high frequency, toggling
tri-state at lower frequency) on an LFE5U-85 when fed with an appropriate
clock.  See https://bayimg.com/AAnNKAAGO for an example.  The top
(magenta) trace is the MCLK line.
2020-04-02 21:35:35 -06:00
David Shah
38efbf5dea
Merge pull request #417 from hackfin/master
Enum/int compatibility for EHXPLLL parameters
2020-04-02 16:28:35 +01:00
Martin
707289c8d6 Enum/int compatibility for EHXPLLL parameters
- Lattice component EHXPLLL parameter compatibility, allowing to
  pass an int parameter for the enum (as expected by trellis tile)
  e.g. CLKOP_TRIM_DELAY : integer := 0;
2020-04-02 14:25:00 +02:00
David Shah
98e2f9ea81 ice40: Derive oscillator frequency constraints
Signed-off-by: David Shah <dave@ds0.me>
2020-03-29 21:02:16 +01:00
David Shah
3d3b222e2a
Merge pull request #415 from smunaut/fix_iob_oe_reg
ice40: Fix output register timing analysis for registered output enable
2020-03-29 09:53:06 +01:00
Sylvain Munaut
bd68d6035c ice40: Fix output register timing analysis for registered output enable
Wrong bits were being tested. [5:4] is what's controlling the output
enable path.

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2020-03-29 10:27:42 +02:00
David Shah
a3ede0293a
Merge pull request #410 from YosysHQ/ecp5-12k
ecp5: Proper support for '12k' device
2020-03-25 09:46:21 +00:00
David Shah
4b54253c24 router2: Prevent overflow
Signed-off-by: David Shah <dave@ds0.me>
2020-03-22 21:17:59 +00:00
David Shah
a621e04062 ice40: Always copy DFF attrs to LC
Signed-off-by: David Shah <dave@ds0.me>
2020-03-19 21:35:31 +00:00
David Shah
d20ce45c1b Merge branch 'master' of ssh.github.com:YosysHQ/nextpnr 2020-03-17 10:07:29 +00:00
David Shah
564f40f6db timing: Improve robustness to dangling/undriven logic
Signed-off-by: David Shah <dave@ds0.me>
2020-03-17 10:07:21 +00:00
David Shah
54b15ed201 Replace assertion failure with error
Signed-off-by: David Shah <dave@ds0.me>
2020-03-13 11:35:09 +00:00
David Shah
3b49c20f43 ecp5: Proper support for '12k' device
Signed-off-by: David Shah <dave@ds0.me>
2020-03-13 11:22:11 +00:00
David Shah
bb73580209
Merge pull request #400 from YosysHQ/dave/tri-fixes
Improve handling of unused inout port bits
2020-03-10 13:50:59 +00:00
David Shah
751f4556fd ecp5: Fix differential inputs
Signed-off-by: David Shah <dave@ds0.me>
2020-03-08 11:32:34 +00:00
David Shah
7ac1735395
Merge pull request #406 from gojimmypi/patch-1
Update README with TRELLIS_INSTALL_PREFIX example
2020-03-06 15:22:45 +00:00
David Shah
af7be21591 Improve handling of unflattened netlists
Signed-off-by: David Shah <dave@ds0.me>
2020-03-06 15:21:28 +00:00
gojimmypi
b4aaae2c5f
update README TRELLIS_INSTALL_PREFIX example
`TRELLIS_INSTALL_PREFIX` will tell `next-pnr` to look in both `share` and `lib` directories.

See https://github.com/YosysHQ/nextpnr/pull/406#discussion_r387945570
2020-03-04 13:39:33 -08:00
gojimmypi
050cb6914f
Update README TRELLIS_INSTALL_PREFIX example
per https://github.com/YosysHQ/nextpnr/pull/406#discussion_r387937313 it is not an install directory
2020-03-04 13:25:47 -08:00
gojimmypi
5a26e0f0d3
Update README with TRELLIS_INSTALL_PREFIX example
see https://github.com/YosysHQ/nextpnr/pull/404 and https://github.com/SymbiFlow/prjtrellis/pull/123
2020-03-04 13:10:48 -08:00
David Shah
a957e90396
Merge pull request #405 from smunaut/fix_key_error
pycontainers: Properly handle KeyErrors
2020-03-04 07:22:37 +00:00
David Shah
c06827cd50
Merge pull request #404 from smunaut/fix_prefix_default
build: Default the ECP5 and iCE40 roots to the install prefix
2020-03-04 07:21:36 +00:00
Sylvain Munaut
4a9981ee77 pycontainers: Properly handle KeyErrors
We raise a C++ exception to abort the rest of the execution of
the function.

At the same time we standardize on using a throw runtime error as the
method to avoid warning when not returning values. (some places
used this throw and some other used std::terminate)

Fixes #403

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2020-03-04 00:12:45 +01:00
Sylvain Munaut
054be6fb67 build: Default the ECP5 and iCE40 roots to the install prefix
If the user specifies a custom install prefix, chances are icestrom/trellis
are also in that prefix rather than the hardcoded /usr/local

Fixes #351

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2020-03-03 15:32:10 +01:00
Miodrag Milanovic
5fa10e1a95 cleanup 2020-02-28 11:02:07 +01:00
Miodrag Milanovic
6566b5da73 Add support for pasting multiline code to python 2020-02-28 11:02:01 +01:00
Miodrag Milanović
7e54d2c305
Merge pull request #402 from zyp/fix_sort
gui: Fix sorting order in TreeModel.
2020-02-28 07:42:34 +01:00
Vegard Storheil Eriksen
34cc1bd41f gui: Fix sorting order in TreeModel. 2020-02-28 03:56:33 +01:00
Vegard Storheil Eriksen
bb754441c8 gui: Fix undefined behavior in TreeModel.
std::sort() requires the comparison function to return false for even
comparison. Returning true results in undefined behavior and a potential
segfault.
2020-02-28 03:48:41 +01:00
Miodrag Milanovic
3e95c57317 Add SVG option to gui 2020-02-27 09:37:09 +01:00
David Shah
9aa22433ff Improve handling of unused inout port bits
Signed-off-by: David Shah <dave@ds0.me>
2020-02-25 14:26:47 +00:00
David Shah
affb12cc27
Merge pull request #398 from YosysHQ/svg
svg: Basic SVG graphics rendering
2020-02-15 23:34:50 +00:00
David Shah
b6158f94f6 svg: Basic SVG graphics rendering
Signed-off-by: David Shah <dave@ds0.me>
2020-02-15 11:35:51 +00:00
David Shah
e0b4f0ee63
Merge pull request #393 from YosysHQ/dave/xilinx-place-backport
Backporting some placer changes from nextpnr-xilinx
2020-02-13 11:39:31 +00:00
Miodrag Milanović
bb8af6ff8b
Merge pull request #394 from laanwj/2020_02_cmake
Correct BUILD_TESTS description in CMakeLists.txt
2020-02-12 19:15:40 +01:00
Wladimir J. van der Laan
d570163116 Correct BUILD_TESTS description in CMakeLists.txt 2020-02-12 13:44:22 +00:00
David Shah
2c7d2f9e0c placer1: Add routeability optimisation (off by default)
Signed-off-by: David Shah <dave@ds0.me>
2020-02-12 10:41:27 +00:00
David Shah
9125698cb0 HeAP: backport out-of-range fix
Signed-off-by: David Shah <dave@ds0.me>
2020-02-12 10:41:27 +00:00
David Shah
1cb0e3af03 HeAP: Add X and Y scaling factors for asymmetric arches
Signed-off-by: David Shah <dave@ds0.me>
2020-02-12 10:41:27 +00:00
David Shah
7db1484c75 HeAP: Make beta configurable
Signed-off-by: David Shah <dave@ds0.me>
2020-02-12 10:41:27 +00:00
David Shah
d1f5cdcb93 HeAP: Improve handling of heterogeneous slice arches
Signed-off-by: David Shah <dave@ds0.me>
2020-02-12 10:41:27 +00:00
David Shah
1ff060c5ad HeAP: Make solver tolerance arch-configurable
Signed-off-by: David Shah <dave@ds0.me>
2020-02-12 10:41:27 +00:00
David Shah
7bda6f15a9 placer1: Allow scaling HPWL differently in each direction
Signed-off-by: David Shah <dave@ds0.me>
2020-02-12 10:41:27 +00:00
David Shah
ca73356187
Merge pull request #392 from se-bi/fix/ecp5/cmake-paths
Fix paths to prjtrellies project
2020-02-04 18:38:17 +00:00
Jared Boone
a3b74f009c CI: not using a custom install prefix for prjtrellis 2020-02-04 18:19:52 +01:00
Sebastian Birke
2c938e0e8b Rename cmake path variable TRELLIS_ROOT to TRELLIS_INSTALL_PREFIX 2020-02-04 18:19:45 +01:00
Jared Boone
1b560ae44c CMake: Changing the definition of TRELLIS_ROOT to point to root of lib, share containing trellis libs and data
two other commit message of squashed commits:
CMake: Search for user lib inside trellis instead of libtrellis

CMake: Fix missing path component for share contents
2020-02-04 18:19:45 +01:00
Sebastian Birke
c95b140dec CI: Update prjtrellis reference 2020-02-04 18:19:45 +01:00
David Shah
1ceffbe0bc
Merge pull request #391 from YosysHQ/router2-upstream
Upstreaming router2
2020-02-04 16:08:08 +00:00
David Shah
b4d029a55c
Merge pull request #385 from YosysHQ/router1-arc-fixes
Fixes for partial reconfig demo
2020-02-03 13:55:07 +00:00
David Shah
a1c902dadc generic: Implement getRouteBoundingBox
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 13:48:51 +00:00
David Shah
2248e07b66 router2: Improve flow and log output
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 13:46:05 +00:00
David Shah
a8206ed170 router2: Add a simple timing heuristic
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 13:33:20 +00:00
David Shah
ce144addb3 ice40: Implement getRouteBoundingBox for router2
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 12:00:05 +00:00
David Shah
7123209324 Allow selection of router algorithm
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:54:38 +00:00
David Shah
25f57a1e38 docs: Document getRouteBoundingBox
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:43:35 +00:00
David Shah
ad1cc12df1 router2: Make magic numbers configurable
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
5e1aac67db ecp5: Improve bounding box accuracy
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
f82e133c7c router2: Fix case of undriven unsunk arcs
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
d2c77fd9ae ecp5: router2 main rename
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
c27e7780d1 router2: Multi-thread in more cases
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
3b043432f5 router2: Flatten wire structure
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
2de98386a7 router2: Experiment with data structures
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
7ac43e5f00 router2: Profile nets by route time
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
72367e6cfd router2: Improvements
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
900fe98f0d router2: reduce bias cost factor
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
3b6d9c952a router2: special case improvement
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
a1c703729c router2: reduce memory footprint
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
37543ad003 router2: debugging
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
17256c680a router2: debugging
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
3d739b5916 router2: first pass at reserved wires
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
50b120528a router2: debugging some edge cases
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
bbc9c9b0ba router2: speedup
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
59c554b50a router2: Improve backwards routing of some cases
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
363d664f27 router2: tweaks
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
ffd679cd36 router2: Attempt to fix some stuck routing cases
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
3b28ba2f76 router2: Debugging
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
39b75244da router2: Working on multithreading
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
72f4721167 router2: Some simple partitioning
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:31 +00:00
David Shah
c21db8a0c1 router2: Congestion map generation
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:30 +00:00
David Shah
010e7ba8cb router2: Add IPIN cost to model
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:30 +00:00
David Shah
a8351b265f router2: Changes for ECP5
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:30 +00:00
David Shah
abdaa9c8a1 ecp5: Router2 test integration
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:30 +00:00
David Shah
385380401a router2: Deal with some special cases
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:30 +00:00
David Shah
fa217a50a5 router2: Binding nextpnr wires/pips
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:30 +00:00
David Shah
599236bbc6 router2: Special backwards mode for gnd/vcc-like nets
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:30 +00:00
David Shah
a4ab9b19d7 router2: Bounding box improvements
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:30 +00:00
David Shah
54ca2e9b9c router2: nearly there
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:30 +00:00
David Shah
d5f6661bfb router2: Net data fixes
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:30 +00:00
David Shah
1c686101fc router2: Fixes
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:30 +00:00
David Shah
0ca07e5a6b router2: Add some test glue
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:30 +00:00
David Shah
37d5775694 router2: A* main loop
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:30 +00:00
David Shah
dbb771dfe4 router2: helper functions
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:30 +00:00
David Shah
a0ac9d62f2 router2: infrastructure
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:30 +00:00
David Shah
51c0642ee0 router2: Basic infrastructure
Signed-off-by: David Shah <dave@ds0.me>
2020-02-03 11:38:30 +00:00
David Shah
aed93a9390
Merge pull request #389 from YosysHQ/mmicko/time_info
Add spent time info to report
2020-02-02 16:21:47 +00:00
Miodrag Milanovic
d5f50070d7 Update formatting 2020-02-02 17:20:14 +01:00
Miodrag Milanovic
f81bd6b1fc Better formatting 2020-02-02 12:16:34 +01:00
Miodrag Milanovic
531b739180 Add spent time info to report 2020-02-02 12:03:58 +01:00
David Shah
a0091eb44b
Merge pull request #388 from YosysHQ/mwk/json-fixes
json: fix handling of 32-bit parameters
2020-02-01 16:26:58 +00:00
Marcin Kościelnicki
24e3f8417e json: fix handling of 32-bit parameters
See YosysHQ/yosys#1671 for rationale.  Also, added some validation
to our parser, so that out-of-range values are reported and the user
knows they should update yosys.
2020-02-01 17:23:05 +01:00
David Shah
85f4452b0a cmake: Python 3.9 support
Signed-off-by: David Shah <dave@ds0.me>
2020-01-29 17:12:07 +00:00
David Shah
ab7078d574
Merge pull request #386 from rrika/master
python: Expose PlaceStrength enum and isValidBelForCell on ecp5
2020-01-27 09:35:23 +00:00
Erika
9185c85a54 python: Expose PlaceStrength enum and isValidBelForCell on ecp5
Signed-off-by: Erika <rrika9@yahoo.com>
2020-01-26 20:32:02 +00:00
David Shah
f1dbb0c4f2 Fix latent bug in generic out-of-context IO mode
Signed-off-by: David Shah <dave@ds0.me>
2020-01-21 19:06:46 +00:00
David Shah
3b5e64e8c6 ecp5: Fix tieoff of unused DELAY signals
Signed-off-by: David Shah <dave@ds0.me>
2020-01-21 19:02:26 +00:00
David Shah
4754ab3894 clangformat
Signed-off-by: David Shah <dave@ds0.me>
2020-01-20 20:30:43 +00:00
David Shah
7c81d4e630 ecp5: Add SPICB0 IO support
Signed-off-by: David Shah <dave@ds0.me>
2020-01-20 20:30:14 +00:00
David Shah
9dc8e1e35d ecp5: Don't reroute existing globals
Signed-off-by: David Shah <dave@ds0.me>
2020-01-20 14:58:38 +00:00
Miodrag Milanović
4ff19c8260
Merge pull request #384 from YosysHQ/warning_fixes
Warning fixes
2020-01-19 16:09:25 +01:00
David Shah
84fec7e82f Fixes for partial reconfig demo
Signed-off-by: David Shah <dave@ds0.me>
2020-01-18 15:37:13 +00:00
Miodrag Milanovic
714769e1b8 Few more caught by clang 2020-01-18 15:58:09 +01:00
Miodrag Milanovic
d281e18113 Warnings noticed by clang 2020-01-18 15:34:58 +01:00
Miodrag Milanovic
38e3b6338c Various warning fixes 2020-01-18 15:23:35 +01:00
David Shah
b67ba18590 frontend: Fix hang when loading very large designs
Signed-off-by: David Shah <dave@ds0.me>
2020-01-16 12:15:16 +00:00
David Shah
54c1bc1538
Merge pull request #382 from YosysHQ/ecp5-psuedodiff
ecp5: Add support for top pseudo diff outputs
2020-01-16 09:38:00 +00:00
David Shah
44cbc5121b
Merge pull request #381 from ldoolitt/master
More adjustments to .bba file locations
2020-01-16 09:12:56 +00:00
David Shah
f513d5fff4 ecp5: Add support for top pseudo diff outputs
Signed-off-by: David Shah <dave@ds0.me>
2020-01-15 11:43:12 +00:00
Larry Doolittle
eba6ea53f8 More adjustments to .bba file locations
Follows PM discussion with Marcus Comstedt.
Extend changes in .bba file location (made in commit b6a7b60) to ice40 and MSVC cases,
  so all cases become compatible with read-only access to git tree.
Only known down-side is inefficiency when building out-of-tree for multiple architectures;
  people following that use case should consider using PREGENERATED_BBA_PATH.
It would be nice if there were less copy-paste in MSVC vs. non-MSVC content in family.cmake,
  but that would have to be addressed by someone more skilled in Cmake and MSVC.
2020-01-14 12:28:40 -08:00
David Shah
92a2109f0c
Merge pull request #380 from ldoolitt/master
Remove barrier to out-of-tree builds
2020-01-14 18:48:16 +00:00
David Shah
4cdf002557
Merge pull request #379 from twam/pass_version
Change version to git describe and make set-able from outside
2020-01-14 18:47:45 +00:00
Larry Doolittle
b6a7b607fd Remove barrier to out-of-tree builds
With this change, nextpnr can build successfully (and run correctly) using the git tree as a read-only reference.
No change in behavior observed for in-tree builds.
2020-01-12 21:11:56 -08:00
Miodrag Milanović
56918e5596
Merge pull request #377 from YosysHQ/mmicko/recording
Enable screenshot and recording feature
2020-01-11 16:29:26 +01:00
Miodrag Milanovic
0bf8fa23d9 Skip same frames 2020-01-11 15:48:43 +01:00
Tobias Müller
659c4fad56 Change version to git describe and make set-able from outside
Change version to use git describe instead of git log as this will also work
if tags are present and make the version string set-able from outside as a
parameter to cmake, so that package managers can set this if building outside
of a git working tree.
2020-01-11 11:38:45 +01:00
Miodrag Milanovic
3f439c1ef2 Enable screenshot and recording feature 2020-01-05 13:51:12 +01:00
David Shah
abfe31d5d2 HeAP: increase timeout
Signed-off-by: David Shah <dave@ds0.me>
2019-12-30 15:53:24 +00:00
Miodrag Milanović
247e18cf02
Merge pull request #344 from YosysHQ/mmicko/ecp5_gui
ECP5 display improvement
2019-12-28 15:46:02 +01:00
Miodrag Milanovic
fb5480cde3 clangformat 2019-12-28 15:02:13 +01:00
Miodrag Milanovic
59f4755e8f made most of frequent numbers constants 2019-12-28 15:01:36 +01:00
Miodrag Milanovic
6cca93543b move constants to gfx.cc 2019-12-28 14:27:14 +01:00
Miodrag Milanovic
6ebe2fd034 remove synt example 2019-12-28 14:08:58 +01:00
Miodrag Milanovic
796d648995 Merge remote-tracking branch 'origin/master' into mmicko/ecp5_gui 2019-12-28 13:54:06 +01:00
Miodrag Milanovic
50f87a6024 add newline at eof 2019-12-28 13:51:02 +01:00
David Shah
0d43aff268 ecp5: Always promote IOLOGIC SCLK to global
Fixes #374

Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 15:53:00 +00:00
David Shah
4e0ca50db1
Merge pull request #353 from YosysHQ/generic-frontend
New hierarchy-capable generic frontend framework and json11 based JSON frontend
2019-12-27 11:19:45 +00:00
David Shah
5774b13984 Document hierarchy structures
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:30 +00:00
David Shah
0ea7f153a1 Allow constraining non-leaf cells to regions
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:30 +00:00
David Shah
fe40094216 Preserve hierarchy through packing
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:30 +00:00
David Shah
b100087024 python: Add bindings for hierarchy structures
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:30 +00:00
David Shah
9f6031cda1 frontend_base: Import cell hierarchy
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:30 +00:00
David Shah
6bf3c261fa First pass at data structures for hierarchy
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:30 +00:00
David Shah
035bfb0fe5 json: Remove legacy frontend
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:30 +00:00
David Shah
14b18cb6fa frontend: Support for loading settings and nextpnr state
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:30 +00:00
David Shah
28279b18fe frontend/generic: Fix regressions
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:30 +00:00
David Shah
c9a0033c5c frontend/base: Fix lookup of nets by module index
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:30 +00:00
David Shah
3e21f894f4 frontend: Improved error handling and fixes
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:30 +00:00
David Shah
9e6770af90 command: Use new frontend experimentally
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:30 +00:00
David Shah
eb14cf09f4 frontend: Fix template compile issues
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:30 +00:00
David Shah
a26b1a276d frontend: Top level port import
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:30 +00:00
David Shah
98f93f39be frontend/base: Functions for hierarchical submodule cell import
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:30 +00:00
David Shah
bed053251e frontend/base: Functions for leaf cell import
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:30 +00:00
David Shah
21b4965966 frontend/base: Functions for net[name] import
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:30 +00:00
David Shah
77cbd70a72 frontend: JSON implementation of the generic framework
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:29 +00:00
David Shah
240561c370 3rdparty: Add json11
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:29 +00:00
David Shah
25867e3f23 frontend/base: Improve net indexing
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:29 +00:00
David Shah
6aaa9f5a3d frontend/base: Functions for port import
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:29 +00:00
David Shah
fffc3b8447 frontend/base: Top module handling
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:29 +00:00
David Shah
fa7317f594 frontend: Draft for a generic template-based frontend API
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:44:29 +00:00
David Shah
b6e2159cec Work around Qt MOC issue with IdString enums
Signed-off-by: David Shah <dave@ds0.me>
2019-12-27 10:32:23 +00:00
David Shah
cea27dc84a
Merge pull request #372 from fghoussen/readme
[README] Add prerequisite: libboost-iostreams-dev.
2019-12-25 11:08:44 +00:00
Franck HOUSSEN
346998caed [README] Add prerequisite: libboost-iostreams-dev. 2019-12-25 11:56:18 +01:00
Miodrag Milanović
98cc243b5f
Merge pull request #370 from fghoussen/readme
[DOC] Fixing typo: cmake test suite triggered by 'make test'.
2019-12-20 15:35:24 +01:00
Miodrag Milanovic
d399346de0 Add options to enable/disable displayed elements 2019-12-20 15:25:10 +01:00
Miodrag Milanovic
a05954249a optimize and set order 2019-12-20 14:02:00 +01:00
Miodrag Milanovic
c26c5e7b8e clang format 2019-12-20 09:07:03 +01:00
Miodrag Milanovic
e4210e7fd3 Add all missing wires 2019-12-20 09:05:58 +01:00
Franck HOUSSEN
16e28f002e [DOC] Fixing typo: cmake test suite triggered by 'make test'. 2019-12-15 20:14:25 +01:00
Miodrag Milanovic
b271e59472 Add global wires 2019-12-15 17:20:48 +01:00
Miodrag Milanovic
d5174110fa more pips on connection box 2019-12-15 10:57:24 +01:00
Miodrag Milanovic
f2b8e347a9 cleanup and formating 2019-12-15 10:43:30 +01:00
Miodrag Milanovic
2872b500e3 make it more simetric 2019-12-15 10:33:12 +01:00
Miodrag Milanovic
bbc05f3113 optimize and add some missing pips 2019-12-15 10:07:55 +01:00
Miodrag Milanovic
3d42097e9d cleanup 2019-12-15 09:45:09 +01:00
Miodrag Milanovic
fa55a826b2 cleanup wire 2019-12-15 09:26:25 +01:00
Miodrag Milanovic
436260e47e move bel creation to gfx.cc 2019-12-15 09:21:58 +01:00
Miodrag Milanovic
fb27f1a031 fix formating 2019-12-14 16:40:27 +01:00
Miodrag Milanovic
cce27e72f0 lot more pips 2019-12-14 16:29:25 +01:00
Miodrag Milanovic
abf9bc3bb9 fixes and more pips 2019-12-14 16:10:41 +01:00
Miodrag Milanovic
d42ecc081e pips for alu, mult and memory 2019-12-14 13:00:09 +01:00
Miodrag Milanovic
7e7e20742d pips for ios 2019-12-14 12:30:04 +01:00
Miodrag Milanovic
601360b73a propagate w and h 2019-12-14 10:56:26 +01:00
Miodrag Milanovic
e118e418e5 pips for other type of connection box 2019-12-14 09:39:41 +01:00
Miodrag Milanovic
ebbfb6375d more new wires added 2019-12-14 09:18:24 +01:00
Miodrag Milanovic
19eb16045f ebr, mult and alu nice display 2019-12-14 08:21:02 +01:00
Miodrag Milanovic
6d005f38b5 add more 2019-12-13 19:44:49 +01:00
Miodrag Milanovic
2a5f0bbd28 new wires in db 2019-12-13 18:24:49 +01:00
Miodrag Milanovic
c0585e98eb added siologic 2019-12-13 14:32:27 +01:00
Miodrag Milanovic
16f6aaa68c Add many new wires 2019-12-13 14:01:28 +01:00
David Shah
dd7f7a53bd ice40: Improve error handling of Lattice-style parameters
Signed-off-by: David Shah <dave@ds0.me>
2019-12-10 15:28:16 +00:00
Miodrag Milanović
992c9acd56
Clarify step for macOS 2019-12-09 17:27:09 +01:00
David Shah
dd73a7ff9f
Merge pull request #369 from YosysHQ/ecp5-prld
ecp5: Add support for flipflops with preload
2019-12-08 09:54:33 +00:00
Miodrag Milanovic
7fd856b866 clangformat run 2019-12-08 09:33:06 +01:00
Miodrag Milanovic
275805d78f display IOs properly 2019-12-07 19:06:10 +01:00
Miodrag Milanovic
401bee6111 More bels show properly 2019-12-07 18:52:33 +01:00
Miodrag Milanovic
76d2a3f0db add dcca bels and dummy parts for other bels 2019-12-07 17:41:22 +01:00
Miodrag Milanovic
b764f9b13a Fix edge wires 2019-12-07 17:21:59 +01:00
David Shah
349be76d26 ecp5: Add support for flipflops with preload
Signed-off-by: David Shah <dave@ds0.me>
2019-12-07 12:20:25 +00:00
Miodrag Milanović
f0887427da
Merge pull request #368 from YosysHQ/bba_fix
Fix for bba to make it portable
2019-12-07 08:20:20 +01:00
Miodrag Milanovic
7220f456ef proper formating 2019-12-06 20:39:35 +01:00
Miodrag Milanovic
a28786097d Fix for bba to make it portable 2019-12-06 20:26:49 +01:00
David Shah
b8636902e3
Merge pull request #361 from YosysHQ/clifford/embed
Add bba #embed support
2019-12-02 07:07:06 +00:00
Clifford Wolf
5897a6a963 Switch to #embed_str for shorter compile time
Signed-off-by: Clifford Wolf <clifford@clifford.at>
2019-12-01 17:22:47 -08:00
David Shah
be37a39ecb generic: Fix width of 0-driver INIT
Signed-off-by: David Shah <dave@ds0.me>
2019-12-01 17:19:52 +00:00
David Shah
f57c2bcebb generic: Don't assume unused LUT inputs are zero
Signed-off-by: David Shah <dave@ds0.me>
2019-12-01 17:07:36 +00:00
David Shah
89e15d488a HeAP: fix region constraint handling
Signed-off-by: David Shah <dave@ds0.me>
2019-12-01 14:18:10 +00:00
Miodrag Milanovic
0c77eed07d add more pips 2019-12-01 11:00:24 +01:00
Clifford Wolf
0392cd3a5b Add bba #embed support
Signed-off-by: Clifford Wolf <clifford@clifford.at>
2019-12-01 00:44:07 +01:00
David Shah
1c1c096861 ecp5: Fix 25k DDRDLLA bitstream gen
Signed-off-by: David Shah <dave@ds0.me>
2019-11-29 10:56:04 +00:00
David Shah
ff30bc87fe ecp5: Fix placement of DDRDLLA
Signed-off-by: David Shah <dave@ds0.me>
2019-11-29 10:50:13 +00:00
David Shah
befc994806
Merge pull request #358 from YosysHQ/generic-improve
Generic Arch improvements
2019-11-27 15:50:00 +00:00
David Shah
29d4192f6f ci: Run generic post-PnR sim smoketest
Signed-off-by: David Shah <dave@ds0.me>
2019-11-27 15:18:53 +00:00
David Shah
2f56b98959 generic: Add support for post-PnR simulation
Signed-off-by: David Shah <dave@ds0.me>
2019-11-27 15:17:53 +00:00
David Shah
6562edc98e jsonwrite: Fix bus cell ports
Signed-off-by: David Shah <dave@ds0.me>
2019-11-27 15:16:28 +00:00
David Shah
2b3dda7535 generic: Add support for disabling IOB insertion
Signed-off-by: David Shah <dave@ds0.me>
2019-11-27 14:42:05 +00:00
David Shah
2957eb7cc9 generic: Improve error handling when Wire/Pip/Bel is not found
Signed-off-by: David Shah <dave@ds0.me>
2019-11-27 14:33:35 +00:00
David Shah
b4e9f5c3a6
Merge pull request #356 from YosysHQ/ecp5-ff-density
ecp5: Improve flipflop packing density
2019-11-27 11:22:14 +00:00
David Shah
2f7c7ccf80
Merge pull request #357 from YosysHQ/heap-fixes
HeAP: Support for region constraints, better error handling, default for all arches
2019-11-26 22:59:15 +00:00
David Shah
b7079d159b Update generic arch docs
Signed-off-by: David Shah <dave@ds0.me>
2019-11-26 21:52:02 +00:00
David Shah
1e4feed383 General documentation updates
Signed-off-by: David Shah <dave@ds0.me>
2019-11-26 21:47:20 +00:00
David Shah
4916eb9bb1 HeAP: more realistic timeout threshold
Signed-off-by: David Shah <dave@ds0.me>
2019-11-26 21:45:46 +00:00
David Shah
98fe4438f1 ECP5 support is no longer experimental
Signed-off-by: David Shah <dave@ds0.me>
2019-11-26 16:10:53 +00:00
David Shah
523ed4cfb2 HeAP: improve error handling when stuck
Signed-off-by: David Shah <dave@ds0.me>
2019-11-26 10:16:27 +00:00
David Shah
defafcf5fe generic: Use HeAP as placer where possible
Signed-off-by: David Shah <dave@ds0.me>
2019-11-26 10:10:26 +00:00
David Shah
ff9d6b4f89 ice40: Make HeAP the default placer
Signed-off-by: David Shah <dave@ds0.me>
2019-11-26 10:03:28 +00:00
David Shah
75f403db60 HeAP: support for bel region constraints
Signed-off-by: David Shah <dave@ds0.me>
2019-11-26 10:01:33 +00:00
David Shah
aee2e01983 ecp5: Improve flipflop packing density
Signed-off-by: David Shah <dave@ds0.me>
2019-11-20 18:22:22 +00:00
David Shah
08cf545d9b Revert "Merge pull request #355 from YosysHQ/ecp5-promote-lsr"
This reverts commit 6a7d1fe53d, reversing
changes made to c3d4117a21.
2019-11-20 17:10:11 +00:00
David Shah
6a7d1fe53d
Merge pull request #355 from YosysHQ/ecp5-promote-lsr
ecp5: Add support for promotion of LSRs to global network
2019-11-20 13:48:57 +00:00
David Shah
67e216f8fb ecp5: Add support for promotion of LSRs to global network
Signed-off-by: David Shah <dave@ds0.me>
2019-11-19 14:08:35 +00:00
David Shah
c3d4117a21 ecp5: Fix handling of custom DEL_VALUE
Signed-off-by: David Shah <dave@ds0.me>
2019-11-18 22:03:11 +00:00
David Shah
f28186bb1b timing: Fix critical path walking for ECP5
Signed-off-by: David Shah <dave@ds0.me>
2019-11-18 21:34:32 +00:00
David Shah
36c0ff2dbc ecp5: Fix dynamic DELAYF control
Signed-off-by: David Shah <dave@ds0.me>
2019-11-18 20:58:08 +00:00
David Shah
9a848d9d76 ecp5: Add logic utilisation before packing statistics
Signed-off-by: David Shah <dave@ds0.me>
2019-11-18 16:54:42 +00:00
David Shah
0a8e9b0fbd clangformat
Signed-off-by: David Shah <dave@ds0.me>
2019-11-18 15:07:55 +00:00
David Shah
d08e2ade88
Merge pull request #345 from YosysHQ/dave/sdf
Improve handling of top level IO and add SDF support
2019-11-18 14:28:40 +00:00
David Shah
e270fcd1db
Merge pull request #352 from pepijndevos/slicebug
leftover Q from before slice api change
2019-11-18 09:50:36 +00:00
Pepijn de Vos
ea05c48032 leftover Q from before slice api change 2019-11-18 10:48:19 +01:00
Miodrag Milanovic
da8b5758cd Handle H00 and V00 2019-11-11 13:30:11 +01:00
Miodrag Milanovic
2827731210 More pips and fix for V01 2019-11-11 12:49:26 +01:00
David Shah
2898d8182d Fix typo
Signed-off-by: David Shah <dave@ds0.me>
2019-11-11 09:44:11 +00:00
David Shah
0cbc25f74a python: Add interactive.py for a REPL during PnR
Signed-off-by: David Shah <dave@ds0.me>
2019-11-11 09:42:22 +00:00
Miodrag Milanovic
522bbbc1f2 cleanup 2019-11-11 09:32:28 +01:00
Miodrag Milanovic
6e349db55b proper h06 and v06 2019-11-11 08:58:46 +01:00
Miodrag Milanovic
afea345cc7 More pips added 2019-11-10 17:02:18 +01:00
Miodrag Milanovic
74f2c4a73b more pips, and valid mapping 2019-11-10 15:24:06 +01:00
Miodrag Milanovic
43c7b4fa21 Fixed V2, some more pips 2019-11-10 11:10:13 +01:00
Miodrag Milanovic
9a9265f4d2 more pips 2019-11-10 10:08:02 +01:00
Miodrag Milanovic
f6d74cb7a9 Draw some pips, fixed H6 and V6 2019-11-09 13:12:20 +01:00
David Shah
6a335411da
Merge pull request #350 from pepijndevos/newslice
Dedicated output for LUT in GENERIC_SLICE
2019-11-08 16:28:39 +00:00
Pepijn de Vos
a4848f6902 more formatting 2019-11-08 17:18:50 +01:00
Pepijn de Vos
5dd1e5e51e return FF_USED, formatting, correct INIT 2019-11-08 17:15:12 +01:00
Pepijn de Vos
7c362f292c dedicated output for LUT in GENERIC_SLICE 2019-11-08 15:54:27 +01:00
David Shah
caf7abdb8d cmake: Add boost system library
Signed-off-by: David Shah <dave@ds0.me>
2019-11-06 13:51:05 +00:00
David Shah
21c09c8b8f ecp5: Copy timing constraints across ECLKBRIDGECS
Signed-off-by: David Shah <dave@ds0.me>
2019-11-01 16:27:51 +00:00
David Shah
58b7cb920f ecp5: Fix placement of ECLKBRIDGECS
Signed-off-by: David Shah <dave@ds0.me>
2019-11-01 16:07:51 +00:00
David Shah
5cf0ed5ede ecp5: Allow setting drive strength for 3V3 IOs
Signed-off-by: David Shah <dave@ds0.me>
2019-10-26 22:21:18 +01:00
David Shah
bac8335222 ecp5: Add constids for new timing cell types
Signed-off-by: David Shah <dave@ds0.me>
2019-10-26 20:50:50 +01:00
David Shah
475fcd4425 ecp5: Add an error for out-of-sync constids and bba
Signed-off-by: David Shah <dave@ds0.me>
2019-10-26 20:38:28 +01:00
David Shah
371d33146f Merge branch 'master' of ssh.github.com:YosysHQ/nextpnr 2019-10-25 09:37:20 +01:00
David Shah
36c07a0f45 ecp5: Fix routing to shared DSP control inputs
Signed-off-by: David Shah <dave@ds0.me>
2019-10-25 09:37:13 +01:00
Miodrag Milanovic
49760a9ea8 Show V02/V06/H02/H06 2019-10-25 09:28:08 +02:00
David Shah
ae1e7837bb
Merge pull request #346 from xobs/fix-ice40-pregenerated-bba
ice40: cmake: fix build with pregenerated bba path
2019-10-25 07:55:35 +01:00
David Shah
f2b9cc6d23 sdf: Working on support for CVC
Signed-off-by: David Shah <dave@ds0.me>
2019-10-24 12:37:07 +01:00
David Shah
8343488bdf sdf: Improve SDF output
Signed-off-by: David Shah <dave@ds0.me>
2019-10-24 10:43:18 +01:00
Sean Cross
5b99382002 ice40: cmake: fix build with pregenerated bba path
When building using non-pregenerated bba files, the rule to create bbasm
files gets called twice: once unconditionally, and once as part of the
conditional that determines we're not using a pregenerated bba path.

If we _are_ using a pregenerated bba path, then this rule gets called
anyway, resulting in a build error.

Remove the duplicate, unconditional creation of the bba file generation,
to fix the build when using pregenerated files, and to speed up the
build when not using pregenerated files.

Signed-off-by: Sean Cross <sean@xobs.io>
2019-10-24 13:39:00 +08:00
Miodrag Milanovic
d1feb2aa2d display horizontal wires, add some globals to list 2019-10-23 18:17:08 +02:00
David Shah
b582ba810c ecp5: Make database build depend on constids.inc
Signed-off-by: David Shah <dave@ds0.me>
2019-10-20 10:29:07 +01:00
Miodrag Milanovic
0d2ae5cc9d Split graphics calls for wires into gfx.cc 2019-10-20 11:12:26 +02:00
Miodrag Milanovic
847910d986 type needs to be part of hash for GroupId 2019-10-20 10:03:37 +02:00
Miodrag Milanovic
e9ae0cf7ce muxes only together with slices 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
eaf760768b Remove not used line 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
e69bb4c077 Simplify layout of elements 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
3b01d2fbce fix slice wire 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
399a137a77 bound signals 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
8c79044d43 more wires between switchboxes 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
4cbdc388b8 Add more types of wires 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
28d0313ccc Less types needed 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
966d0dec19 finixed slice wires 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
74da9cc424 wd wires 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
4b79050ef4 Fix look of some wires 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
a59faa8df0 Add output wires 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
07a8022a1f fix mux display 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
a11cc8791b set wire active flag 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
3da7af9f02 clk and lsr muxes 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
0b4ced96ec draw rest of slice wires and more from switchbox 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
3e117ce792 Optimize 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
49b12a828a Add other side of slice wires 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
1ae64d7bf5 Display rest of slice input wires 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
d1dc2c3a5f Add more zoom 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
f7a6d4dc06 Start adding visible wires 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
eafc0e4e9e Added type to wire 2019-10-20 09:41:48 +02:00
Miodrag Milanovic
bfbb6dbf69 Draw swbox, smaller slices, proper io 2019-10-20 09:41:30 +02:00
David Shah
4775930e49 sdf: Add basic support for writing SDF files
Signed-off-by: David Shah <dave@ds0.me>
2019-10-19 19:20:02 +01:00
David Shah
c0484a317d sdf: Framework for writing out SDF files
Signed-off-by: David Shah <dave@ds0.me>
2019-10-19 16:08:11 +01:00
David Shah
a22f86f861 ice40: Preserve top level IO properly
Signed-off-by: David Shah <dave@ds0.me>
2019-10-19 13:01:00 +01:00
David Shah
cf5cbd1153 ecp5: Preserve top level IO properly
Signed-off-by: David Shah <dave@ds0.me>
2019-10-18 15:58:57 +01:00
David Shah
872e296f7b
Merge pull request #342 from xobs/msvc-static-fix
cmake: don't link libutil on windows
2019-10-18 12:09:40 +01:00
Sean Cross
0db8995e81 cmake: don't link libutil on windows
libutil is only required to be linked on Linux.

Signed-off-by: Sean Cross <sean@xobs.io>
2019-10-18 16:19:30 +08:00
David Shah
c365dd1cab
Merge pull request #341 from YosysHQ/dave/ice40-pcf-frequency
ice40: Add set_frequency pcf command; and document pcf format
2019-10-13 20:18:46 +01:00
David Shah
8c0610e84f ice40: Add set_frequency pcf command; and document pcf
Signed-off-by: David Shah <dave@ds0.me>
2019-10-13 18:48:39 +01:00
David Shah
ee769420e3
Merge pull request #340 from YosysHQ/dave/ecp5_io
ecp5: IOLOGIC improvements
2019-10-13 11:17:23 +01:00
David Shah
8f86ccc412 ecp5: Add support for ECLKBRIDGECS
Signed-off-by: David Shah <dave@ds0.me>
2019-10-11 14:52:31 +01:00
David Shah
58db38c746
Merge pull request #338 from YosysHQ/docs
Documentation Improvements
2019-10-11 10:02:38 +01:00
David Shah
f2fd1bf80a ecp5: Fix tristate IO registers
Signed-off-by: David Shah <dave@ds0.me>
2019-10-09 14:35:16 +01:00
David Shah
c6401413a4 ecp5: Add support for IO registers
Signed-off-by: David Shah <dave@ds0.me>
2019-10-09 14:23:35 +01:00
David Shah
a14555c8d1 ecp5: Add IDDR71B support
Signed-off-by: David Shah <dave@ds0.me>
2019-10-09 12:07:56 +01:00
David Shah
21847a55e0 ecp5: Add ODDR71B support
Signed-off-by: David Shah <dave@ds0.me>
2019-10-09 11:23:20 +01:00
David Shah
9b83e67460 ecp5: Preparations for new IO bels
Signed-off-by: David Shah <dave@ds0.me>
2019-10-09 10:55:10 +01:00
Miodrag Milanović
cc8eaf7206
Merge pull request #339 from YosysHQ/dave/cmakefix
Apply Boost CMake fix to all OSs
2019-10-09 11:54:06 +02:00
David Shah
e9cced57bf Apply Boost CMake fix to all OSs
Signed-off-by: David Shah <dave@ds0.me>
2019-10-09 10:46:30 +01:00
David Shah
cba36239a4 ecp5: Fix parameters
Signed-off-by: David Shah <dave@ds0.me>
2019-10-04 14:54:31 +01:00
David Shah
a00d6c75aa docs: Improvements to coding notes
Signed-off-by: David Shah <dave@ds0.me>
2019-10-03 11:34:31 +01:00
David Shah
2c59ce9df5
Merge pull request #337 from YosysHQ/dave/ecp5_pdp16
ecp5: Adding support for 36-bit wide PDP RAMs
2019-10-03 09:52:23 +01:00
David Shah
d04e5954a6 ecp5: Adding support for 36-bit wide PDP RAMs
Signed-off-by: David Shah <dave@ds0.me>
2019-10-01 12:01:33 +01:00
David Shah
cb8d90bcbf clangformat
Signed-off-by: David Shah <dave@ds0.me>
2019-10-01 12:01:24 +01:00
David Shah
137d9d33c1 docs: Working on coding tips
Signed-off-by: David Shah <dave@ds0.me>
2019-09-29 15:50:08 +02:00
David Shah
72244066bb docs: More netlist documentation
Signed-off-by: David Shah <dave@ds0.me>
2019-09-29 15:22:56 +02:00
David Shah
cfe86dfd15 docs: Add docs for CellInfo and NetInfo
Signed-off-by: David Shah <dave@ds0.me>
2019-09-29 12:12:28 +02:00
Miodrag Milanovic
7cd1e04951 Fix issue with latest boost on macOS, fixes #322 2019-09-28 12:33:45 +02:00
David Shah
30e3c8469b ice40: Add support for PLL DELAY_ADJUSTMENT_MODE
Fixes #336

Signed-off-by: David Shah <dave@ds0.me>
2019-09-23 19:46:31 +01:00
David Shah
395db49b21
Merge pull request #335 from YosysHQ/dave/fix-334
ice40: Fix carry feed-out when we have to split the chain next
2019-09-23 16:30:58 +01:00
David Shah
fac998ddcb ice40: Fix carry feed-out when we have to split the chain next
Signed-off-by: David Shah <dave@ds0.me>
2019-09-23 15:51:05 +01:00
David Shah
cb71b488ec
Merge pull request #332 from YosysHQ/dave/python-refactor
Improving Python API and adding docs for it
2019-09-19 20:15:42 +01:00
David Shah
f8b3c13a53
Merge pull request #331 from xobs/precompiled-bba
Support precompiled BBA files
2019-09-19 20:15:12 +01:00
David Shah
8351ae275e Merge branch 'precompiled-bba' of https://github.com/xobs/nextpnr into xobs-precompiled-bba 2019-09-19 16:02:10 +01:00
David Shah
f8719a5717
Merge pull request #330 from zeldin/bba
bba: Default to native endian in bbasm
2019-09-19 15:57:23 +01:00
David Shah
6bb098b476 docs: Add Python API documentation
Signed-off-by: David Shah <dave@ds0.me>
2019-09-19 15:52:18 +01:00
Sean Cross
7cda79f9b7 README: document PREGENERATED_BBA_PATH
Signed-off-by: Sean Cross <sean@xobs.io>
2019-09-17 11:33:39 +08:00
Sean Cross
96130efc34 ice40: support PREGENERATED_BBA_PATH
Add support for pregenerating BBA files, to build on Windows
and Darwin.

Signed-off-by: Sean Cross <sean@xobs.io>
2019-09-17 11:33:17 +08:00
Sean Cross
062091e9e4 ecp5: add support for PREGENERATED_BBA_PATH
Support pre-generated bba files to speed up compiling on Windows
and get it compiling on Darwin.

Signed-off-by: Sean Cross <sean@xobs.io>
2019-09-17 11:32:44 +08:00
David Shah
5cd2b55f1f python: Adding helper functions for netlist modification
Signed-off-by: David Shah <dave@ds0.me>
2019-09-15 19:30:56 +01:00
David Shah
d5e4986e1b python: Refactor out bindings shared between ECP5 and iCE40
Signed-off-by: David Shah <dave@ds0.me>
2019-09-15 16:15:07 +01:00
David Shah
c2299c8972 python: Fix getWireBelPins
Fixes #327

Signed-off-by: David Shah <dave@ds0.me>
2019-09-15 15:59:16 +01:00
Marcus Comstedt
2f9b04fd56 CMake: Generate chipdbs in build tree when building out-of-tree
Signed-off-by: Marcus Comstedt <marcus@mc.pp.se>
2019-09-15 13:42:17 +02:00
Marcus Comstedt
3d9ce8836c bba: Require explicit endianness flag, and supply it
Signed-off-by: Marcus Comstedt <marcus@mc.pp.se>
2019-09-15 12:30:03 +02:00
Marcus Comstedt
dd40c41ffc bba: Default to native endian in bbasm
Signed-off-by: Marcus Comstedt <marcus@mc.pp.se>
2019-09-15 09:43:40 +02:00
David Shah
bc6b47efe0
Merge pull request #329 from YosysHQ/dave/net_aliases
json: Add support for net aliases
2019-09-13 19:01:26 +01:00
David Shah
3975424ff5
Merge pull request #328 from YosysHQ/dave/timing_iobuf
Move clock constraints across buffers in more cases
2019-09-13 18:24:38 +01:00
David Shah
95540763b9 json: Add support for net aliases
Signed-off-by: David Shah <dave@ds0.me>
2019-09-13 17:27:15 +01:00
David Shah
9e8976996e ice40: Move clock constraints across SB_IO and SB_GB_IO
Signed-off-by: David Shah <dave@ds0.me>
2019-09-13 16:59:41 +01:00
David Shah
2ace9b5ad3 ecp5: Move clock constraints across IO and DCCA
Signed-off-by: David Shah <dave@ds0.me>
2019-09-13 16:50:07 +01:00
David Shah
927077e03b
Merge pull request #325 from xobs/ecp5-python-fix
Ecp5 python fixes
2019-09-11 09:46:35 +01:00
Sean Cross
0d0056a043 cmake: fix static build on Linux
When building Python, many extra libraries must be included, such
as expat and zlib.

Signed-off-by: Sean Cross <sean@xobs.io>
2019-09-10 23:12:31 +08:00
Sean Cross
f98960b936 ecp5: use $PYTHON_EXECUTABLE for python path
Sometimes the python executable might have a different name.  Cmake
sets the $PYTHON_EXECUTABLE variable to point to the binary path,
so use this variable.

Signed-off-by: Sean Cross <sean@xobs.io>
2019-09-09 22:10:51 +08:00
David Shah
c0f02563e8 Bump tests submodule
Signed-off-by: David Shah <dave@ds0.me>
2019-09-03 11:54:44 +01:00
David Shah
de5d22fbd8 Merge branch 'master' of ssh.github.com:YosysHQ/nextpnr 2019-09-03 11:53:50 +01:00
David Shah
4d8fa13033 ice40: Fix DSP cascade wires
Signed-off-by: David Shah <dave@ds0.me>
2019-09-03 11:53:43 +01:00
David Shah
c0b7379e86
Merge pull request #321 from YosysHQ/ecp5-dcc
ecp5: Add support for clock gating with DCCA
2019-08-31 20:50:54 +01:00
David Shah
04be9a71f9 ecp5: Add support for clock gating with DCCA
Signed-off-by: David Shah <dave@ds0.me>
2019-08-31 10:45:12 +01:00
David Shah
cce5cb65c1
Merge pull request #320 from YosysHQ/ecp5-partname
ecp5: Add full part name to bitstream header
2019-08-27 17:58:11 +01:00
David Shah
9f9920f92b ecp5: Add full part name to bitstream header
Signed-off-by: David Shah <dave@ds0.me>
2019-08-27 14:36:20 +01:00
David Shah
c06d7390b6
Merge pull request #319 from YosysHQ/ecp5gsr
ecp5: Add GSR/SGSR support
2019-08-27 14:27:29 +01:00
David Shah
78f86ce67a ecp5: Add GSR/SGSR support
Signed-off-by: David Shah <dave@ds0.me>
2019-08-27 13:14:41 +01:00
David Shah
ccd9ca2a30
Merge pull request #317 from DurandA/feature/ecp5-unpromote-clock
Restrict clock promotion to global on ECP5
2019-08-24 19:43:50 +01:00
Arnaud Durand
a26c9bb6d9 Rename clock restriction attribute to "noglobal" 2019-08-24 18:09:42 +02:00
Arnaud Durand
a947f09bfb Restrict clock promotion to global 2019-08-22 00:43:03 +02:00
David Shah
c192ba261d
Merge pull request #316 from gsomlo/gls-py38-cmake
cmake: add python38 to list of versions searched for boost components
2019-08-21 18:42:39 +01:00
Gabriel L. Somlo
2d66f8e6c9 cmake: add python38 to list of versions searched for boost components
Also, factor out actual search code (identical across versions).

Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>
2019-08-21 10:57:43 -04:00
Miodrag Milanović
a6a4349bd6
Merge pull request #314 from xobs/fix-windows-static
cmake: fix static build on Windows
2019-08-15 10:59:42 +02:00
Sean Cross
ace5ad09f8 Merge branch 'fix-windows-static' of github.com:xobs/nextpnr into fix-windows-static
Signed-off-by: Sean Cross <sean@xobs.io>
2019-08-15 16:32:38 +08:00
Sean Cross
8b63de9e55 cmake: static: add msvc check before adding msvc flags
When building with STATIC_BUILD=ON, different flags need to be specified
when using MSVC.  Check for this flag and only set them if necessary.

Signed-off-by: Sean Cross <sean@xobs.io>
2019-08-15 16:28:03 +08:00
Sean Cross
aa7e20357f README: add a note about static windows builds
Windows has different triples when building with static.  Note this in
the README.

Signed-off-by: Sean Cross <sean@xobs.io>
2019-08-15 12:59:27 +08:00
Sean Cross
0b5c0bd94e cmake: fix static build on windows
On Windows, we can make a static build by setting the triple to
x64-windows-static, but due to some issues with cmake we also need to
modify the linker flags and Python definitions.

Signed-off-by: Sean Cross <sean@xobs.io>
2019-08-15 12:59:00 +08:00
Sean Cross
ac0d0fc241 cmake: fix static build on Windows
On Windows, we can make a static build by setting the triple to
x64-windows-static, but due to some issues with cmake we also need to
modify the linker flags and Python definitions.

Signed-off-by: Sean Cross <sean@xobs.io>
2019-08-15 12:57:15 +08:00
David Shah
541451dc62
Merge pull request #313 from xobs/fix-string-quoting
cmakelists: quote the last argument to REGEX REPLACE
2019-08-14 18:33:04 +01:00
Sean Cross
6e932f5a2d cmakelists: quote the last argument to REGEX REPLACE
With newer versions of cmake, an unquoted 6th argument gives the
following error:

    STRING sub-command REGEX, mode REPLACE needs at least 6 arguments
    total to command.

Quoting this fixes the issue.

Signed-off-by: Sean Cross <sean@xobs.io>
2019-08-14 21:30:39 +08:00
David Shah
3f26cf5076
Merge pull request #312 from smunaut/fix_ice40_default_pkg
ice40: Only warn about default package if there is no package argument
2019-08-10 15:24:31 +01:00
Sylvain Munaut
82ce89e315 ice40: Only warn about default package if there is no package argument
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2019-08-10 16:22:04 +02:00
David Shah
c70f87e4c5
Merge pull request #309 from YosysHQ/dsptiming
ecp5: Conservative analysis of comb DSP timing
2019-08-09 10:27:15 +01:00
David Shah
67488f780c
Merge pull request #311 from YosysHQ/deprecate-default-package
Add deprecation warning for default packages
2019-08-09 10:27:03 +01:00
David Shah
c9969c1593 Add deprecation warning for default packages
Signed-off-by: David Shah <dave@ds0.me>
2019-08-08 21:35:55 +01:00
David Shah
dc565b11c7 ice40/examples: Fix blinky.sh
Signed-off-by: David Shah <dave@ds0.me>
2019-08-08 21:26:56 +01:00
David Shah
f0abbc71b5 ecp5: Fix handling of missing ports in LUT permutation
Fixes #310

Signed-off-by: David Shah <dave@ds0.me>
2019-08-08 21:24:01 +01:00
David Shah
eed85cda83 ice40: Add better stats on LC packing
Signed-off-by: David Shah <dave@ds0.me>
2019-08-08 20:56:30 +01:00
David Shah
e0a114fcb3
Merge pull request #308 from YosysHQ/ecp5_ooc
Add out-of-context mode to ECP5 architecture
2019-08-08 08:36:37 +01:00
David Shah
bb0b6e85ce json: Fix import/export of ports driven by the same net
Signed-off-by: David Shah <dave@ds0.me>
2019-08-07 18:48:06 +01:00
David Shah
fba7c2caef timing: Improve support for out-of-context flows
Signed-off-by: David Shah <dave@ds0.me>
2019-08-07 16:51:29 +01:00
David Shah
b8455f20e2 json: Group bus ports in backend
Signed-off-by: David Shah <dave@ds0.me>
2019-08-07 14:47:01 +01:00
David Shah
e55946bec7 clangfromat
Signed-off-by: David Shah <dave@ds0.me>
2019-08-07 14:46:53 +01:00
David Shah
661237eb64 ecp5: Add --out-of-context for building hard macros
Signed-off-by: David Shah <dave@ds0.me>
2019-08-07 14:22:47 +01:00
David Shah
90364fc3fa Fix typo in jsonwrite
Signed-off-by: David Shah <dave@ds0.me>
2019-08-07 14:22:03 +01:00
David Shah
eaef3b600e
Merge pull request #306 from YosysHQ/dave/jsonfix
Major improvements to constants/Property
2019-08-07 10:40:25 +01:00
David Shah
8eef6ac55e Bump tests submodule
Signed-off-by: David Shah <dave@ds0.me>
2019-08-06 12:42:12 +01:00
David Shah
7126dacccd ecp5: Add a check for legacy parameter values
Signed-off-by: David Shah <dave@ds0.me>
2019-08-06 09:53:33 +01:00
David Shah
c9ba81ab50 ice40: Fix regression
Signed-off-by: David Shah <dave@ds0.me>
2019-08-05 19:10:00 +01:00
David Shah
7b5b5524c4 ci: Update Yosys version
Signed-off-by: David Shah <dave@ds0.me>
2019-08-05 17:30:11 +01:00
David Shah
ebcdfc1ae8 generic: New Property interface
Signed-off-by: David Shah <dave@ds0.me>
2019-08-05 17:28:54 +01:00
David Shah
ec48f8f464 ecp5: New Property interface
Signed-off-by: David Shah <dave@ds0.me>
2019-08-05 17:22:37 +01:00
David Shah
1839a3a770 Major Property improvements for common and iCE40
Signed-off-by: David Shah <dave@ds0.me>
2019-08-05 14:52:15 +01:00
David Shah
1ecf271cb3
Merge pull request #305 from kivikakk/patch-1
Add `eigen` to brew install list for macOS
2019-07-29 08:53:12 +01:00
Ashe Connor
1727662f10
Add eigen to brew install list for macOS 2019-07-29 14:17:03 +10:00
David Shah
ba050c21b9 docs: Fix typo
Signed-off-by: David Shah <dave@ds0.me>
2019-07-22 09:12:33 +01:00
David Shah
d297a96dc1 ecp5: Fix missing LUT inputs, fixes #301
Signed-off-by: David Shah <dave@ds0.me>
2019-07-10 09:34:22 +01:00
David Shah
2da41a66c7 ecp5: Conservative analysis of comb DSP timing
Signed-off-by: David Shah <dave@ds0.me>
2019-07-08 15:09:54 +01:00
David Shah
19cb4ca554
Merge pull request #300 from YosysHQ/static_build_fix
Switching from std to boost fix crash
2019-07-05 14:54:38 +01:00
Miodrag Milanovic
bd694bda19 Switching from std to boost fix crash 2019-07-05 10:22:42 +02:00
David Shah
8f2813279c
Merge pull request #284 from YosysHQ/json_write
Initial support for writing to json files from nextpnr.
2019-07-03 12:39:38 +01:00
Miodrag Milanovic
e27dc41a76 add newline 2019-06-28 13:44:01 +02:00
Miodrag Milanovic
831c7f2ef1 Speedup critical path 2019-06-28 13:43:55 +02:00
David Shah
ff958830d1
Merge pull request #297 from whitequark/serialize-chipdb
Serialize chipdb generation by default
2019-06-27 17:50:13 +01:00
David Shah
c57137e17d
Merge pull request #298 from YosysHQ/clifford/bbasm
Improvements in bbasm
2019-06-27 08:49:40 +01:00
Clifford Wolf
6f38731009 Improvements in bbasm
Signed-off-by: Clifford Wolf <clifford@clifford.at>
2019-06-27 08:24:32 +02:00
Clifford Wolf
4f87bb5f99
Merge pull request #248 from koriakin/bba-fix
bba: Fix str with empty string.
2019-06-27 08:05:32 +02:00
David Shah
e78ed11421
Merge pull request #283 from tux3/warn_pcf_trailing
ice40: Warn that trailing PCF settings are ignored
2019-06-26 22:40:19 +01:00
whitequark
1b3c8ea9c1 CMake: serialize chipdb generation by default.
Fixes #296.
2019-06-26 21:31:24 +00:00
whitequark
640285755e CMake: formatting. NFC. 2019-06-26 21:27:57 +00:00
Miodrag Milanovic
be47fc3e9a clangformat run 2019-06-25 18:19:25 +02:00
Miodrag Milanovic
ec47ce2320 Merge master 2019-06-25 18:14:51 +02:00
David Shah
76ff791913
Merge pull request #294 from YosysHQ/eddie/whiteboxes
Changes to cope with YosysHQ/yosys#943
2019-06-24 22:03:51 +01:00
David Shah
138d7308dc
Merge pull request #276 from YosysHQ/add-link
Add link to arXiv paper
2019-06-24 11:43:26 +01:00
David Shah
fa77a5ae4a clangformat
Signed-off-by: David Shah <dave@ds0.me>
2019-06-24 11:43:01 +01:00
David Shah
678cffb9c7
Merge pull request #293 from YosysHQ/json_ports
Add support for upto and offset in JSON files
2019-06-24 11:41:25 +01:00
Miodrag Milanovic
560e3899d8 Fix formatting 2019-06-24 10:09:25 +02:00
David Shah
e5c21afc7c timing: Add missing std::min
Signed-off-by: David Shah <dave@ds0.me>
2019-06-23 15:01:58 +01:00
Miodrag Milanovic
bc1450a5cd Reversed logic 2019-06-22 09:30:35 +02:00
Miodrag Milanovic
5cb9735735 Add support for upto and offset in JSON files 2019-06-21 20:12:24 +02:00
Miodrag Milanovic
9affcf82d9 default for 5G is speed 8 2019-06-21 18:06:01 +02:00
Miodrag Milanovic
0c3093fe49 fix regression 2019-06-21 17:45:53 +02:00
David Shah
df8688c227 ecp5: Delay tweaking for lower speed grades
Signed-off-by: David Shah <dave@ds0.me>
2019-06-21 10:55:23 +01:00
Miodrag Milanovic
87ecd49295 Fix loading json 2019-06-21 11:31:59 +02:00
David Shah
7ae64b9477 ecp5: Reduce cfg.criticalityExponent for now
Signed-off-by: David Shah <dave@ds0.me>
2019-06-21 10:20:46 +01:00
Miodrag Milanovic
92da4a91de Preserve ports 2019-06-21 09:43:47 +02:00
Miodrag Milanovic
ff257a0929 default placement only if not set 2019-06-15 15:35:23 +02:00
Miodrag Milanovic
226885a58f use save seed 2019-06-15 15:31:18 +02:00
Miodrag Milanovic
8d5724f4fd moved some context variables to settings 2019-06-15 15:23:51 +02:00
Miodrag Milanovic
95280060b8 No need for settings class 2019-06-15 13:09:49 +02:00
Miodrag Milanovic
66ea9f39f7 enable lading of jsons and setting up context 2019-06-14 15:18:35 +02:00
Miodrag Milanovic
aca372de99 fix title 2019-06-14 13:33:20 +02:00
Miodrag Milanovic
903391a9e4 Remove base config, since deprecated 2019-06-14 13:02:15 +02:00
Miodrag Milanovic
0d8c80ad5d gui for json write and proper statuses 2019-06-14 11:14:18 +02:00
Miodrag Milanovic
053bd48bef Cleanup 2019-06-14 10:07:59 +02:00
Miodrag Milanovic
36ccc22fc9 Use flags for each step 2019-06-14 09:59:04 +02:00
Miodrag Milanovic
ca7e944d7a restore arch info for ecp5 2019-06-14 08:55:11 +02:00
Miodrag Milanovic
c6057abd00 restore context from json 2019-06-14 08:13:59 +02:00
Miodrag Milanovic
03dff10cbd Load properties from json and propagate to context create 2019-06-13 20:42:11 +02:00
Miodrag Milanovic
4de147d9e4 Save settings that we saved in project 2019-06-13 18:39:16 +02:00
Miodrag Milanovic
c760b03261 Cleanup 2019-06-13 18:18:16 +02:00
Miodrag Milanovic
1cd4a4d17a Remove concept of project and code connected 2019-06-13 17:42:41 +02:00
Miodrag Milanovic
856760599e Use properties for settings and save in json 2019-06-12 18:34:34 +02:00
David Shah
29adacf18e
Merge pull request #288 from corecode/u4k
ice40: add RGB_DRV/LED_DRV_CUR support for u4k
2019-06-10 15:11:56 +01:00
Simon Schubert
88eeafae12 ice40: add RGB_DRV/LED_DRV_CUR support for u4k 2019-06-10 14:04:25 +02:00
David Shah
187db92b05 ecp5: Improve error message for bad chars in BRAM init strings
Signed-off-by: David Shah <dave@ds0.me>
2019-06-08 10:52:37 +01:00
Miodrag Milanovic
d9b0bac248 Save top level attrs and store current step 2019-06-07 16:11:11 +02:00
Miodrag Milanovic
ef1a5fa606 Save/restore net strength 2019-06-07 14:31:13 +02:00
Miodrag Milanovic
5b62f33dd5 Restore routing from json 2019-06-07 14:23:57 +02:00
Miodrag Milanovic
07b21c5129 Add vcc and gnd nets and cells only if needed 2019-06-07 13:58:21 +02:00
Miodrag Milanovic
78e6631f76 Cleanup 2019-06-07 13:49:19 +02:00
Miodrag Milanovic
54175f9187 No need for this one 2019-06-07 13:24:16 +02:00
Miodrag Milanovic
a8871ea8aa Cleanup and fixes, flow works now 2019-06-07 13:19:11 +02:00
Miodrag Milanović
729e6c1ee9
Merge pull request #286 from YosysHQ/json_write_ecp5
ecp5: Use an attribute to store is_global
2019-06-07 04:16:44 -07:00
David Shah
15a1d4f582 ecp5: Use an attribute to store is_global
Signed-off-by: David Shah <dave@ds0.me>
2019-06-07 11:55:20 +01:00
Miodrag Milanovic
1093d7e122 WIP saving/loading attributes 2019-06-07 11:48:15 +02:00
Miodrag Milanovic
3ae50f85b1 Use index as unique identifier for nets 2019-06-04 20:08:43 +02:00
David Shah
206761b415
Merge pull request #285 from whitequark/fix-missing-newline
Fix missing \n in log statement
2019-06-04 15:29:11 +01:00
whitequark
f3339961fe Fix missing \n in log statement. 2019-06-04 13:15:23 +00:00
Miodrag Milanovic
d5f804832f hacky way to support ECP5 for now 2019-06-03 21:13:47 +02:00
Miodrag Milanovic
44d6f16b66 Support ecp5 read write additional cell info 2019-06-03 21:01:05 +02:00
Miodrag Milanovic
82ed1803c7 use NEXTPNR_BEL, since BEL is initial placement 2019-06-02 18:38:20 +02:00
Miodrag Milanovic
7c65da417b Read constraints and placing from file 2019-06-02 17:33:37 +02:00
Miodrag Milanovic
1894cb549c preserve constraints 2019-06-02 16:46:07 +02:00
Miodrag Milanovic
d0273f7faa option to disable packing 2019-06-02 10:01:20 +02:00
Miodrag Milanovic
5c47b6034e added no-place and no-route options 2019-06-02 09:13:19 +02:00
Miodrag Milanovic
eff1a1341a Revert "Do not add VCC if not used, loading json works"
This reverts commit f1b3a14bc2.
2019-06-02 08:51:32 +02:00
Miodrag Milanovic
bab6c9a09f Proper save message 2019-06-02 08:50:48 +02:00
Miodrag Milanovic
d5d8213871 Added support for attributes/properties types 2019-06-01 15:52:32 +02:00
Miodrag Milanovic
ccbe2dd18d Add reading attributes to nets from json 2019-06-01 11:41:50 +02:00
Miodrag Milanovic
aa0568628f Add writing routing data to json 2019-06-01 11:41:34 +02:00
Miodrag Milanovic
5013724c0a Solve issue with nets/cells not visible on load 2019-06-01 10:27:01 +02:00
Miodrag Milanovic
f1b3a14bc2 Do not add VCC if not used, loading json works 2019-05-31 13:38:18 +02:00
Miodrag Milanovic
1657479c81 Solve some of connection issues 2019-05-31 11:50:49 +02:00
Miodrag Milanovic
545068dec4 Initial work on jsonwrite 2019-05-31 11:09:13 +02:00
tux3
eb2c50b135 ice40: Warn that trailing PCF settings are ignored 2019-05-31 10:44:05 +02:00
David Shah
150004e393
Merge pull request #281 from whitequark/prefer-ports-as-netlabel
When choosing between labels for one net, always prefer ports
2019-05-29 21:35:15 +01:00
whitequark
a0c9a70a5e When choosing between labels for one net, always prefer ports.
1. Ports are already used in PCF and LPF files, so it is natural
that the developer would use them for constraints as well.

2. Unpredictable (the set of netlabels nextpnr looks at depends on
the optimizations during synthesis) net naming makes it impossible
for code generators like nMigen to reliably apply clock constraints.
2019-05-29 18:05:48 +00:00
Miodrag Milanovic
2ea1ccf2e6 Added explanation, fixes issue #278 2019-05-27 19:10:50 +02:00
Miodrag Milanović
68c16c2db7
Merge pull request #279 from YosysHQ/gui-no-aa
option to disable anti aliasing in gui
2019-05-25 10:41:35 -07:00
Miodrag Milanovic
9b8d3b7546 option to disable anti aliasing in gui 2019-05-25 08:42:17 +02:00
Miodrag Milanović
0d1c7118e3
Merge pull request #169 from ajeakins/master
Fix device view not showing anything on macOS.
2019-05-23 23:53:52 -07:00
David Shah
95f3d4cc6e
Merge pull request #277 from mbuesch/assert_catch_warning
gui: Fix warning: catching polymorphic type by value
2019-05-22 13:25:10 +01:00
Michael Buesch
3d4f1dc60b gui: Fix warning: catching polymorphic type by value
gui/application.cc: In member function ‘virtual bool nextpnr_ice40::Application::notify(QObject*, QEvent*)’:
gui/application.cc:56:32: warning: catching polymorphic type ‘class nextpnr_ice40::assertion_failure’ by value [-Wcatch-value=]
2019-05-20 22:17:45 +02:00
Eddie Hung
bfe4c50d88
Add link to arXiv paper 2019-05-20 11:50:23 -07:00
David Shah
c9ba65e7b2
Merge pull request #245 from twam/fix_osx
Use cmake's find_library to search for pytrellis.
2019-05-18 12:15:08 +01:00
David Shah
1b6a81a8cc
Merge pull request #274 from smunaut/ice40_hfosc_trim
ice40: Add support for HFOSC trimming
2019-05-13 12:58:15 +01:00
Sylvain Munaut
e17299a1ca ice40: Add support for HFOSC trimming
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2019-05-13 12:52:58 +02:00
Tobias Müller
ea91ea163e Use cmake's find_library to search for pytrellis. 2019-05-11 12:39:50 +02:00
David Shah
643d7dec4c
Merge pull request #273 from YosysHQ/ecp5_mclk
ecp5: Fix USRMCLK primitive
2019-05-10 21:09:43 +01:00
David Shah
12f375a239 ecp5: Fix USRMCLK primitive
Signed-off-by: David Shah <dave@ds0.me>
2019-05-10 18:51:45 +01:00
Adrian Jeakins
d00288198f Bring back check that GL contexts get the format requested. 2019-05-01 21:32:48 +01:00
David Shah
5344bc3b65
Merge pull request #261 from YosysHQ/pygeneric
Python API for generic architecture
2019-04-19 17:40:55 +01:00
Eddie Hung
d49eb2ba40 Changes to cope with YosysHQ/yosys#943 2019-04-19 09:27:34 -07:00
David Shah
0be844e6a8
Merge pull request #270 from smunaut/sb_io_conflict
SB IO conflict checks
2019-04-17 16:18:40 +01:00
David Shah
e7bb262e96
Merge pull request #269 from smunaut/pll_gb_place
PLL GB usage and placement fix
2019-04-17 16:17:09 +01:00
Sylvain Munaut
66b64f928b ice40: Check for SB_IO shared wires conflicts in isValidBelForCell
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2019-04-17 16:07:22 +02:00
Sylvain Munaut
c4cb0c5e49 ice40: In assignCellInfo get PIN_TYPE/NEG_TRIGGER from params and not attrs
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2019-04-17 16:07:16 +02:00
David Shah
87a2446081 ci: Bump Yosys version for tcl argument support
Signed-off-by: David Shah <dave@ds0.me>
2019-04-17 13:27:37 +01:00
Sylvain Munaut
6387a3d33e ice40: Only create padin gbuf for PLLs if global output actually used
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2019-04-17 14:06:23 +02:00
David Shah
c33da42365 ci: Run generic example simple.sh
Signed-off-by: David Shah <dave@ds0.me>
2019-04-17 13:02:01 +01:00
David Shah
9fa13b5adc pybindings: make errors in Python scripts stop nextpnr execution
Signed-off-by: David Shah <dave@ds0.me>
2019-04-17 11:12:58 +01:00
David Shah
ede81dc095 generic: Disable GUI as it isn't supported yet
Signed-off-by: David Shah <dave@ds0.me>
2019-04-17 11:03:06 +01:00
David Shah
48c4c1ed05 generic/examples: Add FASM writer Python script
Signed-off-by: David Shah <dave@ds0.me>
2019-04-17 11:00:23 +01:00
David Shah
90ceb829f3 pybindings: Fix use of import in user scripts
Signed-off-by: David Shah <dave@ds0.me>
2019-04-17 10:57:19 +01:00
David Shah
037e13b883
Merge pull request #267 from noopwafel/lock-for-timing
timing_opt: Add locks to optimise()
2019-04-16 16:29:26 +01:00
Alyssa Milburn
c1cc356bb0 timing_opt: Add locks to optimise()
Signed-off-by: Alyssa Milburn <amilburn@zall.org>
2019-04-16 16:03:12 +02:00
Sylvain Munaut
9dd68aa0e2 ice40: Take placed SB_GBs into account when placing PLLs
Because the PLLs drive global networks, we need to account for
already existing and placed SB_GBs when trying to place/pack them.

Theses can be user instanciated SB_GBs with BEL attribute, or
SB_GB_IOs that got converted during the IO packing.

This patch assumes that:
 - If a PLL is used the output A global network is always used, even
   if there is no connection to the global output pin
 - If a PLL with a singe output is used, then the B output global
   network is still free to be used by whatever.

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2019-04-16 10:12:28 +02:00
Eddie Hung
250c914763
Merge pull request #266 from xanderlent/patch-1
Fix ice40 example directory in README.md
2019-04-15 22:50:53 -07:00
Alexander Lent
003619e91c
Fix ice40 example directory in README.md
ice40/blinky.* moved to ice40/examples/blinky/blinky.* in commit 1780f42b9a
2019-04-15 21:27:11 -07:00
David Shah
db7e850ee8
Merge pull request #264 from smunaut/fix_sb_unused_in
ice40/pack: During IO packing, remove any unused input connection
2019-04-11 13:32:01 +01:00
Sylvain Munaut
6cb4e2e83b ice40/pack: During IO packing, remove any unused input connection
This is mostly for the benefit of PLL placement because the D_IN_x
ports are used for other purposes when PLL is enabled so we need to
make sure nothing is connected there already. (even an unused net is
too much)

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2019-04-11 13:52:23 +02:00
David Shah
22da6c8a65
Merge pull request #263 from YosysHQ/placer1_incr_bb
placer1: Improve incremental bounding box updates
2019-04-10 11:01:34 +01:00
David Shah
cfcd657e32 clangformat
Signed-off-by: David Shah <dave@ds0.me>
2019-04-08 18:08:39 +01:00
David Shah
ad9bc627e6 placer1: Check correctness of incremental updates with --debug
Signed-off-by: David Shah <dave@ds0.me>
2019-04-08 18:08:26 +01:00
David Shah
65b2a76159 placer1: Improve incremental bounding box updates
Signed-off-by: David Shah <dave@ds0.me>
2019-04-07 15:55:07 +01:00
David Shah
659c932559 generic: Fix predictDelay
Signed-off-by: David Shah <dave@ds0.me>
2019-04-04 16:58:43 +01:00
David Shah
f12a209391 generic: Router param tweaks
Signed-off-by: David Shah <dave@ds0.me>
2019-04-04 16:46:05 +01:00
David Shah
f0cd51e6bc generic: Cell timing support
Signed-off-by: David Shah <dave@ds0.me>
2019-04-04 16:34:06 +01:00
David Shah
3f98084021 generic: Improve example
Signed-off-by: David Shah <dave@ds0.me>
2019-04-04 15:40:48 +01:00
David Shah
6fffe24177 generic: GUI Python bindings
Signed-off-by: David Shah <dave@ds0.me>
2019-04-03 16:08:33 +01:00
Eddie Hung
6adf37e3c1
Merge pull request #262 from chexum/gcc4x
common: avoid std::ofstream copy
2019-04-02 11:57:55 -07:00
Janos Farkas
587b022b0a common: avoid std::ofstream copy
Using a copy constructor to set the logfile is the only thing that
stops compilation with the libstdc++ shipping with gcc 4.8 (maybe 4.7)
2019-04-02 16:39:21 +00:00
David Shah
a05593da62 generic: Add a few more bindings
Signed-off-by: David Shah <dave@ds0.me>
2019-04-02 15:30:01 +01:00
David Shah
f2c911bf07 generic: Adding API usage documentation
Signed-off-by: David Shah <dave@ds0.me>
2019-04-02 15:30:01 +01:00
David Shah
32327b761a generic: Simple working example
Signed-off-by: David Shah <dave@ds0.me>
2019-04-02 15:30:01 +01:00
David Shah
6a383cd4c5 generic: Simple procedural example works
Signed-off-by: David Shah <dave@ds0.me>
2019-04-02 15:30:01 +01:00
David Shah
ca918078bf generic: Add a simple packer for generic SLICEs and IOBs
Signed-off-by: David Shah <dave@ds0.me>
2019-04-02 15:30:01 +01:00
David Shah
99c3713293 generic: Add synth_generic.tcl
Signed-off-by: David Shah <dave@ds0.me>
2019-04-02 15:30:01 +01:00
David Shah
f88ddf85b2 generic: Add simple primitive library
Signed-off-by: David Shah <dave@ds0.me>
2019-04-02 15:30:01 +01:00
David Shah
50fd8aa01f generic: Place a single SLICE
Signed-off-by: David Shah <dave@ds0.me>
2019-04-02 15:30:01 +01:00
David Shah
fd3ad75598 generic: Python bindings for arch construction
Signed-off-by: David Shah <dave@ds0.me>
2019-04-02 15:30:01 +01:00
David Shah
30f0c582e4 python: Named argument support
Signed-off-by: David Shah <dave@ds0.me>
2019-04-02 15:30:01 +01:00
David Shah
f5bfd557b6 python: Infrastructure for generic arch Python API
Signed-off-by: David Shah <dave@ds0.me>
2019-04-02 15:30:01 +01:00
David Shah
2e246c1968
Merge pull request #260 from xobs/windows-eigen-docs
README: update windows build instructions for eigen, python
2019-04-02 12:41:25 +01:00
Sean Cross
638f84a622 README: update windows build instructions for eigen, python
The recent addition of "eigen3" to nextpnr necessitates the addition of
"eigen" to the list of vcpkg packages to be installed on Windows.

Add the 32- and 64-bit versions of eigen to the command issued to
install various dependencies.

Also document one possible build command, and note about unpacking
python36.zip.

Signed-off-by: Sean Cross <sean@xobs.io>
2019-04-02 15:25:00 +08:00
David Shah
d27ec2cd15 ice40: Don't constrain to a PLL bel that has already been used
Fixes #258

Signed-off-by: David Shah <dave@ds0.me>
2019-04-01 12:25:32 +01:00
David Shah
db152b332b HeAP: Don't call Eigen if system is empty
Fixes #259

Signed-off-by: David Shah <dave@ds0.me>
2019-04-01 12:18:02 +01:00
David Shah
ed4fc888de
Merge pull request #255 from smunaut/i2c_spi
ice40: Add support for SB_I2C and SB_SPI
2019-03-26 08:03:37 +00:00
Sylvain Munaut
d401e3e1a0 ice40: Add support for SB_I2C and SB_SPI
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2019-03-25 23:48:59 +01:00
David Shah
c2d87846d8
Merge pull request #257 from whitequark/patch-1
Fix broken header guard
2019-03-25 19:39:49 +00:00
whitequark
818165031c
Fix broken header guard 2019-03-25 19:32:58 +00:00
David Shah
c67b8259bb
Merge pull request #219 from daveshah1/placer_heap
HeAP-based analytical placer
2019-03-25 16:24:02 +00:00
David Shah
25e3350675 HeAP: Make log output more consistent
Signed-off-by: David Shah <dave@ds0.me>
2019-03-25 15:39:15 +00:00
David Shah
49e827a9b4 HeAP: Add missing newline
Signed-off-by: David Shah <dave@ds0.me>
2019-03-25 12:41:25 +00:00
David Shah
efc6872341 placer1: Restore old weighting in budget-based mode
Signed-off-by: David Shah <dave@ds0.me>
2019-03-24 13:59:27 +00:00
David Shah
00b09fbb43 HeAP: Per-iteration output all on one line
Signed-off-by: David Shah <dave@ds0.me>
2019-03-24 11:18:38 +00:00
David Shah
02ae21d8fc Add --placer option and refactor placer selection
Signed-off-by: David Shah <dave@ds0.me>
2019-03-24 11:10:20 +00:00
David Shah
52e05f4a07 placer1: Fix regression moving chained cells pre-legalise
Signed-off-by: David Shah <davey1576@gmail.com>
2019-03-23 23:15:05 +01:00
David Shah
e04efa8c6e Bump tests to include WAIVE 2019-03-23 20:51:57 +00:00
David Shah
81a7b5d2a1 Update README.md
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:46:54 +00:00
David Shah
23f2fff1c8 clangformat
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:39:05 +00:00
David Shah
801675a2c6 placer1: Only get criticalities when in timing-driven mode
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
fcc3bb1495 ecp5: Speedup cell delay lookups
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
f8a38c59f8 common: Add early return path to getNetinfoRouteDelay for fully unrouted nets
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
bd12c0a486 HeAP: Add PlacerHeapCfg
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
7142db28a8 HeAP: Make HeAP placer optional
A CMake option 'BUILD_HEAP' (default on) configures building of the
HeAP placer and the associated Eigen3 dependency.

Default for the iCE40 is SA placer, with --heap-placer to use HeAP

Default for the ECP5 is HeAP placer, as SA placer can take 1hr+ for
large ECP5 designs and HeAP tends to give better QoR. --sa-placer can
be used to use SA instead, and auto-fallback to SA if HeAP not built.

Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
1c824709e2 HeAP: Switching from TAUCS to Eigen
Signed-off-by: David Shah <davey1576@gmail.com>
2019-03-22 10:31:54 +00:00
David Shah
589b267a93 HeAP: Fix regression
Signed-off-by: David Shah <davey1576@gmail.com>
2019-03-22 10:31:54 +00:00
David Shah
8e4e03d980 HeAP: Fix occupancy count
Signed-off-by: David Shah <davey1576@gmail.com>
2019-03-22 10:31:54 +00:00
David Shah
6cf001d355 HeAP: Legaliser fixes
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
352f15e96b HeAP: Avoid getting stuck in legaliser ripup
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
70a6379bf6 HeAP: Chain support
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
87edf6305f ci: Add OpenBLAS to Dockerfile
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
2e2f44c82e HeAP: tidying up
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
fb02fc69c6 HeAP: Make strict legalisation wirelength driven where needed
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
8295f997ae HeAP: Use for ECP5 as well as iCE40
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
ba1e05f16b HeAP: Implement 'all+rotate' HeAP strategy
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
3dedc62593 HeAP: Weight arcs by criticality for timing-driven placement
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
05e9ae183d HeAP: Add multithreading
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
eb638c47b3 HeAP: fine tuning
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
2a0c117662 HeAP: Add performance counters
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
f3d9b45387 HeAP: Add SA-based iterative refinement after AP
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
0570cb7ae9 HeAP: Spreading working acceptably
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
030b02588b HeAP: Make cut-based spreading recursive
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
b483008cdf HeAP: Cut peturbation, binning and intra-bin linear spreading
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
8a791e8309 HeAP: Cut finder for spreading
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
4d2906378f HeAP: Region finder for spreading and strict legaliser
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
d1808c2594 HeAP: Fix how initial placement handles chains
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
d5cfd38179 HeAP: Successful solver convergance
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
ea56dc9d08 HeAP: Add TAUCS wrapper and integration
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
e36460b83e HeAP: Initial infrastructure
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
4cf8549f5c placer1: Legalise after reaching a diameter, not temperature
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
9cd5980d35 placer1: Add (currently-unused) option for fanout threshold for timing cost calc
Signed-off-by: David Shah <davey1576@gmail.com>
2019-03-22 10:31:54 +00:00
David Shah
bd0a33022b placer1: Implement non-timing-driven mode
Signed-off-by: David Shah <davey1576@gmail.com>
2019-03-22 10:31:54 +00:00
David Shah
1780f42b9a ice40: Add examples folder including floorplan example
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
0118ac00c4 placer1: Improve handling of regions
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
a8289b699f pycontainers: Implement __contains__
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
493d6c3fb9 Add Python helper functions for floorplanning
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
ae33ff397f placer1: Consider regions during placement
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
ade72de02f placer1: Optimise for performance
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
0cb351df52 placer1: New temperature heuristic
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:54 +00:00
David Shah
222abb5be2 placer1: Encourage chain swaps
Signed-off-by: David Shah <davey1576@gmail.com>
2019-03-22 10:31:54 +00:00
David Shah
c926b273de placer1: Tweaks
Signed-off-by: David Shah <davey1576@gmail.com>
2019-03-22 10:31:54 +00:00
David Shah
23306c163f placer1: Allow chain position swaps after legalisation
Signed-off-by: David Shah <davey1576@gmail.com>
2019-03-22 10:31:54 +00:00
David Shah
3650c8a0e7 placer1: Tweaking temperature
Signed-off-by: David Shah <davey1576@gmail.com>
2019-03-22 10:31:54 +00:00
David Shah
0d80181c5e placer1: Make budget-based placement an option
Signed-off-by: David Shah <davey1576@gmail.com>
2019-03-22 10:31:28 +00:00
David Shah
a218c27305 placer1: Tuning
Signed-off-by: David Shah <davey1576@gmail.com>
2019-03-22 10:31:28 +00:00
David Shah
3938ea41fc placer1: Fix cost delta calculation
Signed-off-by: David Shah <davey1576@gmail.com>
2019-03-22 10:31:28 +00:00
David Shah
2ef2d2b2cb placer1: Bugfixes
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:28 +00:00
David Shah
f8f89cea71 placer1: Rework to use new criticality-based weighted cost function
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:31:00 +00:00
David Shah
3e40f0b9c3 placer1: New cost calculation infrastructure
Signed-off-by: David Shah <dave@ds0.me>
2019-03-22 10:29:59 +00:00
David Shah
0d064c05f9
Merge pull request #252 from YosysHQ/tristate_json
json: Fix inputs directly driving inouts
2019-03-21 12:36:11 +00:00
David Shah
85bff66393
Merge pull request #251 from YosysHQ/ice40-u4k-fix
ice40: Fix u4k in external chipdb mode.
2019-03-20 17:26:51 +00:00
David Shah
997a66791e json: Fix inputs directly driving inouts
Signed-off-by: David Shah <dave@ds0.me>
2019-03-20 16:07:47 +00:00
Marcin Kościelnicki
1060810d7a ice40: Fix u4k in external chipdb mode.
Signed-off-by: Marcin Kościelnicki <marcin@symbioticeda.com>
2019-03-19 15:23:43 +01:00
Miodrag Milanović
cadbf42054
Merge pull request #249 from koriakin/gui-tab-fix
gui: Fix Cells/Nets tab contents.
2019-03-12 19:17:22 +01:00
Marcin Kościelnicki
b1d345c233 bba: Fix str with empty string.
Signed-off-by: Marcin Kościelnicki <marcin@symbioticeda.com>
2019-03-12 18:18:56 +01:00
Marcin Kościelnicki
a0ad5bc306 gui: Fix Cells/Nets tab contents.
Signed-off-by: Marcin Kościelnicki <marcin@symbioticeda.com>
2019-03-12 18:18:36 +01:00
David Shah
97993e76ea gui/fpgaviewwidget: Make background opaque
Signed-off-by: David Shah <dave@ds0.me>
2019-03-12 14:03:28 +00:00
Miodrag Milanović
661857fe8e
Merge pull request #247 from YosysHQ/timing-allow-fail
Add flag timing-allow-fail to allow PnR to pass with warning
2019-03-04 13:53:00 +01:00
Miodrag Milanovic
0bcf57bd47 Add flag timing-allow-fail to allow PnR to pass with warning 2019-03-04 12:29:19 +01:00
David Shah
cc5edfd97e
Merge pull request #244 from YosysHQ/ecp5tests
tests: Bump submodule to include ecp5 regressions
2019-03-01 16:13:33 +00:00
David Shah
d0ee4cef04 ci: Run ECP5 regression tests
Signed-off-by: David Shah <dave@ds0.me>
2019-03-01 10:47:59 +00:00
David Shah
203e46aee3 tests: Bump submodule to include ecp5 regressions
Signed-off-by: David Shah <dave@ds0.me>
2019-03-01 09:07:59 +00:00
David Shah
0279f63710
Merge pull request #243 from YosysHQ/ecp5lpf
ecp5: Improve constraint-related error handling
2019-02-28 15:01:42 +00:00
Serge Bazanski
9aadfef8c1
Merge pull request #212 from smunaut/gui_shift_move
gui: Allow shift+drag to move around the view
2019-02-28 15:26:48 +01:00
David Shah
8744c46ea0 ecp5: Fix handling of CRLFs and uppercase frequency units in LPF
Signed-off-by: David Shah <dave@ds0.me>
2019-02-27 22:54:32 +00:00
David Shah
a2d906a3fd ecp5: Increase ripup penalty
Signed-off-by: David Shah <dave@ds0.me>
2019-02-25 18:08:26 +00:00
David Shah
ba4150aecc ecp5: Add an error for mixed constrained/unconstrained IO
Signed-off-by: David Shah <dave@ds0.me>
2019-02-25 14:45:43 +00:00
David Shah
81b176e150 ecp5: Improve error handling and warning generation in LPF parser
Signed-off-by: David Shah <dave@ds0.me>
2019-02-25 14:40:38 +00:00
David Shah
031725c80e
Merge pull request #242 from YosysHQ/ecp5next
ecp5: Fixes and QoR improvements
2019-02-25 12:46:06 +00:00
David Shah
df79d94944 ecp5: DELAY fixes
Signed-off-by: David Shah <dave@ds0.me>
2019-02-25 11:49:25 +00:00
David Shah
95a85c8ea7 ecp5: Improve packing density
Signed-off-by: David Shah <dave@ds0.me>
2019-02-25 11:49:25 +00:00
David Shah
a0fa164399 ecp5: Add criticality-based LUT permutation
Signed-off-by: David Shah <dave@ds0.me>
2019-02-25 11:49:25 +00:00
David Shah
f363dd2d3c ecp5: Delay tuning
Signed-off-by: David Shah <dave@ds0.me>
2019-02-25 11:49:25 +00:00
David Shah
89de4caf6c timing: Fix negative slack overflow issue
Signed-off-by: David Shah <dave@ds0.me>
2019-02-25 11:49:25 +00:00
David Shah
4ec2bd1e5d ecp5: Fix global clock routing with multiclock DPRAM
Signed-off-by: David Shah <dave@ds0.me>
2019-02-25 11:49:25 +00:00
David Shah
55b0b60d9d ecp5: Router performance improvements
Signed-off-by: David Shah <dave@ds0.me>
2019-02-25 11:49:25 +00:00
David Shah
f5b11ce075 ecp5: Implement budget overrides for carry chains and SLICE muxes
Signed-off-by: David Shah <dave@ds0.me>
2019-02-25 11:49:25 +00:00
David Shah
af3ff143be ecp5: Improve delay model
Signed-off-by: David Shah <dave@ds0.me>
2019-02-25 11:49:25 +00:00
David Shah
998d055ea7 ecp5: Speed up timing analysis
Signed-off-by: David Shah <dave@ds0.me>
2019-02-25 11:49:25 +00:00
David Shah
e87fb69665 ice40: u4k merge fix
Signed-off-by: David Shah <dave@ds0.me>
2019-02-25 11:36:12 +00:00
David Shah
7a5699891a
Merge pull request #239 from YosysHQ/dsp_casc_dummy_wires
ice40: Add DSP SIGNEXTIN/OUT and ACCUMCI/O ports
2019-02-25 08:20:32 +00:00
David Shah
8c70501912
Merge pull request #236 from YosysHQ/ddrn
ecp5: Support for advanced IO functionality
2019-02-24 22:12:24 +00:00
David Shah
64dc453f12 ecp5: DELAYF/G fixes
Signed-off-by: David Shah <dave@ds0.me>
2019-02-24 13:53:06 +00:00
David Shah
15314538f8 ecp5: Add list of supported primitives
Signed-off-by: David Shah <davey1576@gmail.com>
2019-02-24 10:28:25 +01:00
David Shah
0d83f3fcfe ecp5: Connect unused DQSBUF inputs to GND
Signed-off-by: David Shah <davey1576@gmail.com>
2019-02-24 10:28:25 +01:00
David Shah
ab50a6ef54 ecp5: Compute derived constraints iteratively
Signed-off-by: David Shah <davey1576@gmail.com>
2019-02-24 10:28:25 +01:00
David Shah
0bc88e622c ecp5: Add support for 'FREQUENCY NET' and 'FREQUENCY PORT' in lpf
Signed-off-by: David Shah <davey1576@gmail.com>
2019-02-24 10:28:25 +01:00
David Shah
ae6c1170ef ecp5: Derived constraint support for PLLs, clock dividers and oscillators
Signed-off-by: David Shah <davey1576@gmail.com>
2019-02-24 10:28:25 +01:00
David Shah
e50ab2106f ecp5: Fixes for litedram
Signed-off-by: David Shah <davey1576@gmail.com>
2019-02-24 10:28:25 +01:00
David Shah
3b50b57f05 ecp5: Add DIFFRESISTOR support
Signed-off-by: David Shah <davey1576@gmail.com>
2019-02-24 10:28:25 +01:00
David Shah
f960139768 ecp5: Add support for referenced inputs
Signed-off-by: David Shah <davey1576@gmail.com>
2019-02-24 10:28:25 +01:00
David Shah
817ba5a4b9 ecp5: Add DELAYF/DELAYG support
Signed-off-by: David Shah <davey1576@gmail.com>
2019-02-24 10:28:25 +01:00
David Shah
fd52db813f ecp5: Add TERMINATION support
Signed-off-by: David Shah <dave@ds0.me>
2019-02-24 10:28:25 +01:00
David Shah
491d64293d ecp5: Add DDRDLLA support
Signed-off-by: David Shah <dave@ds0.me>
2019-02-24 10:28:25 +01:00
David Shah
68abcb365a ecp5: Add ECLKSYNCB support
Signed-off-by: David Shah <dave@ds0.me>
2019-02-24 10:28:25 +01:00
David Shah
49e9453820 ecp5: Add TSHX2DQSA support
Signed-off-by: David Shah <dave@ds0.me>
2019-02-24 10:28:25 +01:00
David Shah
82ad10a395 ecp5: Add TSHX2DQA support
Signed-off-by: David Shah <dave@ds0.me>
2019-02-24 10:28:25 +01:00
David Shah
6e8fbe8cdf ecp5: Add IDDRX2DQA support
Signed-off-by: David Shah <dave@ds0.me>
2019-02-24 10:28:25 +01:00
David Shah
4e49ab1625 ecp5: Add ODDRX2DQSB suppport
Signed-off-by: David Shah <dave@ds0.me>
2019-02-24 10:28:25 +01:00
David Shah
6f203dfd7b ecp5: Add ODDRX2DQA support
Signed-off-by: David Shah <dave@ds0.me>
2019-02-24 10:28:25 +01:00
David Shah
4402361246 ecp5: Helper functions and bitstream for DQS
Signed-off-by: David Shah <dave@ds0.me>
2019-02-24 10:28:25 +01:00
David Shah
eb45956d0e ecp5: Constraint checker and placer for DQSBUFM
Signed-off-by: David Shah <dave@ds0.me>
2019-02-24 10:28:25 +01:00
David Shah
fe2375324d ecp5: Add OSHX2A support
Signed-off-by: David Shah <dave@ds0.me>
2019-02-24 10:28:25 +01:00
David Shah
8a64a72a21 ecp5: Add IDDRX2F support
Signed-off-by: David Shah <dave@ds0.me>
2019-02-24 10:28:25 +01:00
David Shah
52d1954d96 ecp5: Packing of ODDRX2F
Signed-off-by: David Shah <dave@ds0.me>
2019-02-24 10:28:25 +01:00
David Shah
63e1f02c65 ecp5: Helper functions for DQS and ECLK
Signed-off-by: David Shah <dave@ds0.me>
2019-02-24 10:28:25 +01:00
David Shah
db1666fc3d ecp5: Add timing data for DQS-related cells
Signed-off-by: David Shah <dave@ds0.me>
2019-02-24 10:28:25 +01:00
David Shah
5cfc7674c1 ecp5: Add DQS groupings to database
Signed-off-by: David Shah <dave@ds0.me>
2019-02-24 10:28:25 +01:00
David Shah
92a4a48f47
Merge pull request #241 from corecode/u4k
ice40: support u4k
2019-02-23 17:38:33 +00:00
Simon Schubert
7044f56246 ice40: support u4k 2019-02-23 17:39:20 +01:00
Sylvain Munaut
9539f57c74 gui: Allow shift+drag to move around the view
right & middle clight are really inconvenient when working with a touchpad
in tap-to-click mode

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
2019-02-22 12:31:23 +01:00
David Shah
a05f6b261e ice40: Add DSP SIGNEXTIN/OUT and ACCUMCI/O ports
Signed-off-by: David Shah <davey1576@gmail.com>
2019-02-21 20:34:23 +00:00
David Shah
e8d3aaaf34
Merge pull request #238 from YosysHQ/padin_gb_tmgfix
ice40: Fix timing class of 'padin' GB outputs
2019-02-20 22:17:33 +00:00
David Shah
a7ea3f58e3 ice40: Fix timing class of 'padin' GB outputs
Signed-off-by: David Shah <davey1576@gmail.com>
2019-02-20 21:23:43 +00:00
David Shah
4c7306185e ecp5: Fix typo
Signed-off-by: David Shah <dave@ds0.me>
2019-02-14 12:31:33 +00:00
David Shah
9026ab8886
Merge pull request #228 from YosysHQ/ecp5_embed_base
ecp5: Embed baseconfigs in nextpnr
2019-02-14 12:20:41 +00:00
Eddie Hung
4b6505df9e
Merge pull request #227 from YosysHQ/regressions
[tests] Move tests subdir to submodule, also add regression tests of fixed ice40 issues
2019-02-13 07:01:48 -08:00
Eddie Hung
e649b1e4ed [tests] Update submodule 2019-02-12 21:27:12 -08:00
Eddie Hung
e9e9b9469c [tests] Update submodule 2019-02-12 17:02:38 -08:00
Miodrag Milanović
cf7baeec55
Merge pull request #231 from YosysHQ/mmaped_chipdb
Load chipdb from filesystem as option
2019-02-12 18:56:59 +01:00
Miodrag Milanović
c52202233a
Merge branch 'master' into mmaped_chipdb 2019-02-12 18:53:20 +01:00
Eddie Hung
d24d85a6e4
Merge pull request #234 from YosysHQ/issue233
[timing] Fix off-by-one error
2019-02-12 07:05:26 -08:00
David Shah
565d5eed17 ecp5: Fix global routing performance
Signed-off-by: David Shah <dave@ds0.me>
2019-02-12 10:56:17 +00:00
Eddie Hung
6fed51ee3d [tests] Run ice40 regressions in parallel 2019-02-11 10:17:56 -08:00
Eddie Hung
6d2594d95b [tests] Do git submodule sync/update 2019-02-11 09:32:27 -08:00
Eddie Hung
b35090d77c [timing] Do I need test in the task name too? 2019-02-11 08:51:25 -08:00
Eddie Hung
ef8105bfba [tests] Retry .cirrus.yml 2019-02-11 08:42:13 -08:00
Eddie Hung
7bd4fa99a1 Merge branch 'master' into regressions 2019-02-11 08:38:11 -08:00
Eddie Hung
63a7f57b01 [timing] Fix off-by-one error 2019-02-11 08:32:01 -08:00
David Shah
6cd0b8a123
Merge pull request #223 from gsomlo/gls-pytrellis-cmake
ecp5: cmake: Search for pytrellis.so in multiple locations
2019-02-10 15:43:29 +00:00
Gabriel L. Somlo
1b28bdd121 ecp5: cmake: Search for pytrellis.so in multiple locations
If a distro-specific "trellis-devel" package is used, the
pytrellis.so library might be located in a dedicated directory,
rather than under TRELLIS_ROOT.

Search for pytrellis.so in a list of directories, then subsequently
use the first match as part of PYTHONPATH.

Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>
2019-02-10 06:42:38 -05:00
Miodrag Milanovic
8b0af0e48d Fix according to comments on PR 2019-02-10 08:33:52 +01:00
Eddie Hung
4ac505701e [tests] Add to CI 2019-02-09 12:08:06 -08:00
Eddie Hung
fcb6362279 [tests] Update submodule 2019-02-09 11:35:46 -08:00
David Shah
4a2560b0d3
Merge pull request #232 from YosysHQ/err145
ice40: PLLs can't conflict with themselves
2019-02-09 19:31:51 +00:00
Eddie Hung
9238f1cfd7 [tests] Update submodule 2019-02-09 11:31:04 -08:00
Eddie Hung
859f105e76 Merge remote-tracking branch 'origin/err145' into regressions 2019-02-09 11:30:08 -08:00
David Shah
054be887ae ice40: PLLs can't conflict with themselves
Fixes error building testcase from #145

Signed-off-by: David Shah <dave@ds0.me>
2019-02-09 19:27:52 +00:00
Eddie Hung
366151ad61 [tests] Update submodule 2019-02-09 10:31:37 -08:00
Eddie Hung
d964ea911c Merge remote-tracking branch 'origin/master' into regressions 2019-02-09 10:24:40 -08:00
Eddie Hung
a520b38424
Merge pull request #226 from YosysHQ/190207
Fix slack_histogram computation accessing num_bins+1
2019-02-09 10:16:23 -08:00
David Shah
54820974bb
Merge pull request #230 from YosysHQ/fix229
ice40: Don't create PLLOUT_B buffer for single-output PLL variants
2019-02-09 13:12:26 +00:00
Miodrag Milanovic
73f200fe74 Load chipdb from filesystem as option 2019-02-09 13:34:57 +01:00
David Shah
170bf8a5ec ice40: Don't create PLLOUT_B buffer for single-output PLL variants
Signed-off-by: David Shah <dave@ds0.me>
2019-02-09 10:41:22 +00:00
Eddie Hung
0639be7966 [tests] Update submodule 2019-02-08 07:02:07 -08:00
David Shah
4b7ec5cecb ecp5: Add --basecfg deprecation warning
Signed-off-by: David Shah <dave@ds0.me>
2019-02-08 13:52:39 +00:00
David Shah
882775acef ecp5: Embed baseconfig
Signed-off-by: David Shah <dave@ds0.me>
2019-02-08 13:44:15 +00:00
David Shah
db990d2175 clangformat
Signed-off-by: David Shah <dave@ds0.me>
2019-02-08 13:43:55 +00:00
David Shah
c900bcc949 Merge branch 'ecp5func' 2019-02-08 12:57:17 +00:00
David Shah
e929d221f3 ecp5: Adding DTR, OSCG, CLKDIVF, USRMCLK, JTAGG
Signed-off-by: David Shah <dave@ds0.me>
2019-02-08 12:34:22 +00:00
Eddie Hung
f3f404e81c [tests] Update submodule 2019-02-07 14:23:58 -08:00
Eddie Hung
3e18260815 Merge remote-tracking branch 'origin/master' into regressions 2019-02-07 13:59:39 -08:00
Eddie Hung
3927f8c9c0 Remove regressions; see PR#227 of where it will end up 2019-02-07 13:37:48 -08:00
Eddie Hung
09207cf91f [test] Update submodule pointer 2019-02-07 13:21:03 -08:00
Eddie Hung
1c5dab9d47 [tests] Move existing tests/* into submodule nextpnr-tests 2019-02-07 13:13:03 -08:00
Eddie Hung
a65d2e425c Rename from date to pr number 2019-02-07 09:48:04 -08:00
Eddie Hung
dea61e604f Add to regressions 2019-02-07 09:42:34 -08:00
Eddie Hung
f9f15e79cd Fix slack_histogram computation accessing num_bins+1 2019-02-07 09:26:41 -08:00
Miodrag Milanovic
bfc96cc962 Better resize, FPGAViewWidget minimal is now 320x200, fixes #222 2019-02-07 17:42:14 +01:00
Miodrag Milanovic
c6604a4582 Fix reading conflicting wire in GUI for pips, fixes #225 2019-02-07 17:25:14 +01:00
David Shah
564a7e27b1 timing: Add --ignore-loops option
Signed-off-by: David Shah <dave@ds0.me>
2019-02-05 08:20:05 +01:00
David Shah
8e8c103b34 router1: Print route time
Signed-off-by: David Shah <davey1576@gmail.com>
2019-01-30 17:50:49 +00:00
David Shah
0ca0af6c72 placer1: Add place time print
Signed-off-by: David Shah <davey1576@gmail.com>
2019-01-30 17:50:49 +00:00
Eddie Hung
6d664046d3
Merge pull request #220 from YosysHQ/coi3
ice40: Add budget override for CO->I3 path
2019-01-29 11:22:31 -08:00
Eddie Hung
77bb5ea63a [ice40] Refactor Arch::getBudgetOverride() 2019-01-29 10:43:14 -08:00
David Shah
f4d8a25fb7 ice40: Add budget override for CO->I3 path
Signed-off-by: David Shah <dave@ds0.me>
2019-01-27 14:43:10 +00:00
Adrian Jeakins
7f950a1852 Reduce GL shader version for wider compatibility. 2018-12-20 22:28:53 +00:00
Adrian Jeakins
3cdd83a3be Remove format versioning now this is set at the top level application. 2018-12-20 22:21:10 +00:00
Adrian Jeakins
38f80b1048 Fix device view not showing anything on macOS.
* Fix line shader when running under the core profile and make version match those elsewhere.
* Make surface format version match the openGL functions we are using.
2018-12-05 22:27:04 +00:00
845 changed files with 201648 additions and 16634 deletions

View File

@ -1,12 +0,0 @@
task:
name: build-test-ubuntu1604
container:
cpu: 4
memory: 16
dockerfile: .cirrus/Dockerfile.ubuntu16.04
build_script: mkdir build && cd build && cmake .. -DARCH=all -DTRELLIS_ROOT=/usr/local/src/prjtrellis -DBUILD_TESTS=on && make -j $(nproc)
test_generic_script: cd build && ./nextpnr-generic-test
test_ice40_script: cd build && ./nextpnr-ice40-test
smoketest_ice40_script: export NEXTPNR=$(pwd)/build/nextpnr-ice40 && cd ice40/smoketest/attosoc && ./smoketest.sh
test_ecp5_script: cd build && ./nextpnr-ecp5-test

View File

@ -1,55 +0,0 @@
FROM ubuntu:xenial-20181113
ENV DEBIAN_FRONTEND=noninteractive
RUN set -e -x ;\
apt-get -y update ;\
apt-get -y upgrade ;\
apt-get -y install \
build-essential autoconf cmake clang bison wget flex gperf \
libreadline-dev gawk tcl-dev libffi-dev graphviz xdot python3-dev \
libboost-all-dev qt5-default git libftdi-dev pkg-config
RUN set -e -x ;\
mkdir -p /usr/local/src ;\
cd /usr/local/src ;\
git clone --recursive https://github.com/steveicarus/iverilog.git ;\
cd iverilog ;\
git reset --hard 172d7eb0a3665f89b91d601b5912c33acedc81e5 ;\
sh autoconf.sh ;\
./configure ;\
make -j $(nproc) ;\
make install ;\
rm -rf /usr/local/src/iverilog
RUN set -e -x ;\
mkdir -p /usr/local/src ;\
cd /usr/local/src ;\
git clone --recursive https://github.com/cliffordwolf/icestorm.git ;\
cd icestorm ;\
git reset --hard 9671b760f84ca4006f0ef101a3e3b201df4eabb5 ;\
make -j $(nproc) ;\
make install
RUN set -e -x ;\
mkdir -p /usr/local/src ;\
cd /usr/local/src ;\
git clone --recursive https://github.com/YosysHQ/yosys.git ;\
cd yosys ;\
git reset --hard 47a5dfdaa4bd7d400c6e3d58476de80904df460d ;\
make -j $(nproc) ;\
make install ;\
rm -rf /usr/local/src/yosys
RUN set -e -x ;\
mkdir -p /usr/local/src ;\
cd /usr/local/src ;\
git clone --recursive https://github.com/SymbiFlow/prjtrellis.git ;\
cd prjtrellis ;\
git reset --hard de035a6e5e5818804a66b9408f0ad381b10957db ;\
cd libtrellis ;\
cmake -DCMAKE_INSTALL_PREFIX=/usr . ;\
make -j $(nproc) ;\
make install

55
.github/ci/build_common.sh vendored Normal file
View File

@ -0,0 +1,55 @@
#!/bin/bash
# Install latest Yosys
function build_yosys {
PREFIX=`pwd`/.yosys
YOSYS_PATH=${DEPS_PATH}/yosys
mkdir -p ${YOSYS_PATH}
git clone --recursive https://github.com/YosysHQ/yosys ${YOSYS_PATH}
pushd ${YOSYS_PATH}
git reset --hard ${YOSYS_REVISION}
make -j`nproc` PREFIX=$PREFIX
make install PREFIX=$PREFIX
popd
}
function build_icestorm {
PREFIX=`pwd`/.icestorm
ICESTORM_PATH=${DEPS_PATH}/icestorm
mkdir -p ${ICESTORM_PATH}
git clone --recursive https://github.com/YosysHQ/icestorm ${ICESTORM_PATH}
pushd ${ICESTORM_PATH}
git reset --hard ${ICESTORM_REVISION}
make -j`nproc` PREFIX=${PREFIX}
make install PREFIX=${PREFIX}
popd
}
function build_trellis {
PREFIX=`pwd`/.trellis
TRELLIS_PATH=${DEPS_PATH}/prjtrellis
mkdir -p ${TRELLIS_PATH}
git clone --recursive https://github.com/YosysHQ/prjtrellis ${TRELLIS_PATH}
pushd ${TRELLIS_PATH}
git reset --hard ${TRELLIS_REVISION}
mkdir -p libtrellis/build
pushd libtrellis/build
cmake -DCMAKE_INSTALL_PREFIX=${PREFIX} ..
make -j`nproc`
make install
popd
popd
}
function build_prjoxide {
PREFIX=`pwd`/.prjoxide
PRJOXIDE_PATH=${DEPS_PATH}/prjoxide
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y ;\
mkdir -p ${PRJOXIDE_PATH}
git clone --recursive https://github.com/gatecat/prjoxide ${PRJOXIDE_PATH}
pushd ${PRJOXIDE_PATH}
git reset --hard ${PRJOXIDE_REVISION}
cd libprjoxide
PATH=$PATH:$HOME/.cargo/bin cargo install --root $PREFIX --path prjoxide
popd
}

24
.github/ci/build_ecp5.sh vendored Normal file
View File

@ -0,0 +1,24 @@
#!/bin/bash
function get_dependencies {
:
}
function build_nextpnr {
mkdir build
pushd build
cmake .. -DARCH=ecp5 -DTRELLIS_INSTALL_PREFIX=${GITHUB_WORKSPACE}/.trellis -DWERROR=on -DBUILD_GUI=on -DUSE_IPO=off
make nextpnr-ecp5 -j`nproc`
popd
}
function run_tests {
export PATH=${GITHUB_WORKSPACE}/.trellis/bin:${GITHUB_WORKSPACE}/.yosys/bin:$PATH
make -j $(nproc) -C tests/ecp5/regressions NPNR=$(pwd)/build/nextpnr-ecp5
}
function run_archcheck {
pushd build
./nextpnr-ecp5 --um5g-25k --package CABGA381 --test
popd
}

25
.github/ci/build_generic.sh vendored Normal file
View File

@ -0,0 +1,25 @@
#!/bin/bash
function get_dependencies {
:
}
function build_nextpnr {
mkdir build
pushd build
cmake .. -DARCH=generic -DWERROR=on
make nextpnr-generic -j`nproc`
popd
}
function run_tests {
export PATH=${GITHUB_WORKSPACE}/.yosys/bin:$PATH
( export NPNR=$(pwd)/build/nextpnr-generic && cd tests/generic/flow && ./run.sh )
}
function run_archcheck {
pushd build
# TODO
# ./nextpnr-generic --uarch example --test
popd
}

23
.github/ci/build_gowin.sh vendored Normal file
View File

@ -0,0 +1,23 @@
#!/bin/bash
function get_dependencies {
pip3 install apycula==${APYCULA_REVISION}
}
function build_nextpnr {
mkdir build
pushd build
cmake .. -DARCH=gowin -DWERROR=on -DBUILD_GUI=on -DUSE_IPO=off
make nextpnr-gowin -j`nproc`
popd
}
function run_tests {
:
}
function run_archcheck {
pushd build
./nextpnr-gowin --device GW1N-UV4LQ144C6/I5 --test
popd
}

23
.github/ci/build_himbaechel.sh vendored Normal file
View File

@ -0,0 +1,23 @@
#!/bin/bash
function get_dependencies {
:
}
function build_nextpnr {
mkdir build
pushd build
cmake .. -DARCH=himbaechel -DHIMBAECHEL_UARCH=example -DHIMBAECHEL_EXAMPLE_DEVICES=example
make nextpnr-himbaechel -j`nproc`
popd
}
function run_tests {
:
}
function run_archcheck {
pushd build
./nextpnr-himbaechel --device EXAMPLE --test
popd
}

27
.github/ci/build_ice40.sh vendored Normal file
View File

@ -0,0 +1,27 @@
#!/bin/bash
function get_dependencies {
:
}
function build_nextpnr {
mkdir build
pushd build
cmake .. -DARCH=ice40 -DICESTORM_INSTALL_PREFIX=${GITHUB_WORKSPACE}/.icestorm -DWERROR=on -DBUILD_TESTS=on -DBUILD_GUI=on
make nextpnr-ice40 nextpnr-ice40-test -j`nproc`
popd
}
function run_tests {
export PATH=${GITHUB_WORKSPACE}/.yosys/bin:${GITHUB_WORKSPACE}/.icestorm/bin:$PATH
(cd build && ./nextpnr-ice40-test)
(export NEXTPNR=$(pwd)/build/nextpnr-ice40 && cd ice40/smoketest/attosoc && ./smoketest.sh)
make -j $(nproc) -C tests/ice40/regressions NPNR=$(pwd)/build/nextpnr-ice40
}
function run_archcheck {
pushd build
./nextpnr-ice40 --hx8k --package ct256 --test
./nextpnr-ice40 --up5k --package sg48 --test
popd
}

24
.github/ci/build_machxo2.sh vendored Normal file
View File

@ -0,0 +1,24 @@
#!/bin/bash
function get_dependencies {
:
}
function build_nextpnr {
mkdir build
pushd build
cmake .. -DARCH=machxo2 -DTRELLIS_INSTALL_PREFIX=${GITHUB_WORKSPACE}/.trellis -DWERROR=on -DUSE_IPO=off
make nextpnr-machxo2 -j`nproc`
popd
}
function run_tests {
:
}
function run_archcheck {
pushd build
./nextpnr-machxo2 --device LCMXO2-1200HC-4SG32C --test
./nextpnr-machxo2 --device LCMXO3LF-6900C-6BG256C --test
popd
}

30
.github/ci/build_mistral.sh vendored Normal file
View File

@ -0,0 +1,30 @@
#!/bin/bash
export MISTRAL_PATH=${DEPS_PATH}/mistral
function get_dependencies {
# Fetch mistral
mkdir -p ${MISTRAL_PATH}
git clone --recursive https://github.com/Ravenslofty/mistral.git ${MISTRAL_PATH}
pushd ${MISTRAL_PATH}
git reset --hard ${MISTRAL_REVISION}
popd
}
function build_nextpnr {
mkdir build
pushd build
cmake .. -DARCH=mistral -DMISTRAL_ROOT=${MISTRAL_PATH}
make nextpnr-mistral -j`nproc`
popd
}
function run_tests {
:
}
function run_archcheck {
pushd build
./nextpnr-mistral --device 5CEBA2F17A7 --test
popd
}

23
.github/ci/build_nexus.sh vendored Normal file
View File

@ -0,0 +1,23 @@
#!/bin/bash
function get_dependencies {
:
}
function build_nextpnr {
mkdir build
pushd build
cmake .. -DARCH=nexus -DOXIDE_INSTALL_PREFIX=${GITHUB_WORKSPACE}/.prjoxide
make nextpnr-nexus -j`nproc`
popd
}
function run_tests {
:
}
function run_archcheck {
pushd build
./nextpnr-nexus --device LIFCL-40-9BG400CES --test
popd
}

96
.github/workflows/arch_ci.yml vendored Normal file
View File

@ -0,0 +1,96 @@
# CI for everything other than the sui generis FPGA interchange arrangements
name: Arch CI tests
on: [push, pull_request]
jobs:
Build-nextpnr:
strategy:
fail-fast: false
matrix:
arch: [mistral, ice40, ecp5, generic, nexus, machxo2, gowin, himbaechel]
runs-on: ubuntu-latest
env:
DEPS_PATH: ${{ github.workspace }}/deps
YOSYS_REVISION: 7045cf509e1d95cbc973746674cf2d7c73c02e50
ICESTORM_REVISION: 68044cc4dac829729ccd0ee88d0780525b515746
TRELLIS_REVISION: 36c615d1740473cc3574464c7f0bed44da20e5b6
PRJOXIDE_REVISION: c3fb1526cf4a2165e15b74f4a994d153c7695fe4
MISTRAL_REVISION: ebfc0dd2cc7d6d2159b641a397c88554840e93c9
APYCULA_REVISION: 0.8.2a1
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install
run: |
sudo apt-get update
sudo apt-get install git make cmake libboost-all-dev python3-dev pypy3 libeigen3-dev tcl-dev lzma-dev libftdi-dev clang bison flex swig qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools iverilog libreadline-dev liblzma-dev
- name: Cache yosys installation
uses: actions/cache@v4
id: cache-yosys
with:
path: .yosys
key: cache-yosys-${{ env.YOSYS_REVISION }}-r3
- name: Build yosys
run: |
source ./.github/ci/build_common.sh
build_yosys
if: steps.cache-yosys.outputs.cache-hit != 'true'
- name: Cache icestorm installation
uses: actions/cache@v4
id: cache-icestorm
with:
path: .icestorm
key: cache-icestorm-${{ env.ICESTORM_REVISION }}-r3
if: matrix.arch == 'ice40'
- name: Build icestorm
run: |
source ./.github/ci/build_common.sh
build_icestorm
if: matrix.arch == 'ice40' && steps.cache-icestorm.outputs.cache-hit != 'true'
- name: Cache trellis installation
uses: actions/cache@v4
id: cache-trellis
with:
path: .trellis
key: cache-trellis-${{ env.TRELLIS_REVISION }}-r3
if: matrix.arch == 'ecp5' || matrix.arch == 'machxo2'
- name: Build trellis
run: |
source ./.github/ci/build_common.sh
build_trellis
if: (matrix.arch == 'ecp5' || matrix.arch == 'machxo2') && steps.cache-trellis.outputs.cache-hit != 'true'
- name: Cache prjoxide installation
uses: actions/cache@v4
id: cache-prjoxide
with:
path: .prjoxide
key: cache-prjoxide-${{ env.PRJOXIDE_REVISION }}-r3
if: matrix.arch == 'nexus'
- name: Build prjoxide
run: |
source ./.github/ci/build_common.sh
build_prjoxide
if: matrix.arch == 'nexus' && steps.cache-prjoxide.outputs.cache-hit != 'true'
- name: Execute build nextpnr
run: |
source ./.github/ci/build_${{ matrix.arch }}.sh
get_dependencies
build_nextpnr
run_tests
run_archcheck

18
.gitignore vendored
View File

@ -1,8 +1,13 @@
/generated/
/objs/ /objs/
/nextpnr-generic* /nextpnr-generic*
/nextpnr-ice40* /nextpnr-ice40*
/nextpnr-ecp5* /nextpnr-ecp5*
/nextpnr-nexus*
/nextpnr-fpga_interchange*
/nextpnr-gowin*
/nextpnr-machxo2*
/nextpnr-himbaechel*
.cache
cmake-build-*/ cmake-build-*/
Makefile Makefile
cmake_install.cmake cmake_install.cmake
@ -19,13 +24,22 @@ CMakeCache.txt
.*.swp .*.swp
a.out a.out
*.json *.json
*.dot
*.il
/generic/examples/blinky.png
build/ build/
share/
*.asc *.asc
*.bin *.bin
/Testing/* /Testing/*
CTestTestfile.cmake CTestTestfile.cmake
install_manifest.txt install_manifest.txt
/bbasm /bba/bbasm
/bba-export.cmake
/ImportExecutables.cmake /ImportExecutables.cmake
*-coverage/ *-coverage/
*-coverage.info *-coverage.info
*.netlist
*.phys
*.dcp
*.bit

9
.gitmodules vendored Normal file
View File

@ -0,0 +1,9 @@
[submodule "tests"]
path = tests
url = https://github.com/YosysHQ/nextpnr-tests
[submodule "himbaechel/uarch/xilinx/meta"]
path = himbaechel/uarch/xilinx/meta
url = https://github.com/gatecat/nextpnr-xilinx-meta
[submodule "3rdparty/corrosion"]
path = 3rdparty/corrosion
url = https://github.com/corrosion-rs/corrosion

View File

@ -1,4 +1,5 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11) CMAKE_MINIMUM_REQUIRED(VERSION 3.13)
PROJECT(QtPropertyBrowser) PROJECT(QtPropertyBrowser)
##################### Look for required libraries ###################### ##################### Look for required libraries ######################

View File

@ -2205,11 +2205,10 @@ void QtColorEditWidget::setValue(const QColor &c)
void QtColorEditWidget::buttonClicked() void QtColorEditWidget::buttonClicked()
{ {
bool ok = false;
QRgb oldRgba = m_color.rgba(); QRgb oldRgba = m_color.rgba();
QRgb newRgba = QColorDialog::getRgba(oldRgba, &ok, this); QColor newRgba = QColorDialog::getColor(oldRgba, this).rgba();
if (ok && newRgba != oldRgba) { if (newRgba.isValid() && newRgba.rgba() != oldRgba) {
setValue(QColor::fromRgba(newRgba)); setValue(newRgba);
emit valueChanged(m_color); emit valueChanged(m_color);
} }
} }

View File

@ -132,9 +132,9 @@ public:
protected: protected:
void mouseMoveEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override;
void leaveEvent(QEvent *event) override; void leaveEvent(QEvent *event) override;
void keyPressEvent(QKeyEvent *event); void keyPressEvent(QKeyEvent *event) override;
void mousePressEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event) override;
void drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; void drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
Q_SIGNALS: Q_SIGNALS:
void hoverPropertyChanged(QtBrowserItem *item); void hoverPropertyChanged(QtBrowserItem *item);
@ -383,7 +383,7 @@ void QtPropertyEditorDelegate::paint(QPainter *painter, const QStyleOptionViewIt
opt.palette.setColor(QPalette::Text, opt.palette.color(QPalette::BrightText)); opt.palette.setColor(QPalette::Text, opt.palette.color(QPalette::BrightText));
} else { } else {
c = m_editorPrivate->calculatedBackgroundColor(m_editorPrivate->indexToBrowserItem(index)); c = m_editorPrivate->calculatedBackgroundColor(m_editorPrivate->indexToBrowserItem(index));
if (c.isValid() && (opt.features & QStyleOptionViewItemV2::Alternate)) if (c.isValid() && (opt.features & QStyleOptionViewItem::Alternate))
c = c.lighter(112); c = c.lighter(112);
} }
if (c.isValid()) if (c.isValid())
@ -609,7 +609,7 @@ void QtTreePropertyBrowserPrivate::propertyInserted(QtBrowserItem *index, QtBrow
m_indexToItem[index] = newItem; m_indexToItem[index] = newItem;
newItem->setFlags(newItem->flags() | Qt::ItemIsEditable); newItem->setFlags(newItem->flags() | Qt::ItemIsEditable);
m_treeWidget->setItemExpanded(newItem, true); newItem->setExpanded(true);
updateItem(newItem); updateItem(newItem);
} }

View File

@ -145,7 +145,6 @@ static QtProperty *wrappedProperty(QtProperty *property)
class QtVariantPropertyPrivate class QtVariantPropertyPrivate
{ {
QtVariantProperty *q_ptr;
public: public:
QtVariantPropertyPrivate(QtVariantPropertyManager *m) : manager(m) {} QtVariantPropertyPrivate(QtVariantPropertyManager *m) : manager(m) {}
@ -576,7 +575,7 @@ void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, con
void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QKeySequence &val) void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QKeySequence &val)
{ {
QVariant v; QVariant v;
qVariantSetValue(v, val); v.setValue(val);
valueChanged(property, v); valueChanged(property, v);
} }
@ -663,7 +662,7 @@ void QtVariantPropertyManagerPrivate::slotEnumIconsChanged(QtProperty *property,
{ {
if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) { if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) {
QVariant v; QVariant v;
qVariantSetValue(v, enumIcons); v.setValue(enumIcons);
emit q_ptr->attributeChanged(varProp, m_enumIconsAttribute, v); emit q_ptr->attributeChanged(varProp, m_enumIconsAttribute, v);
} }
} }
@ -1567,7 +1566,7 @@ QVariant QtVariantPropertyManager::attributeValue(const QtProperty *property, co
return enumManager->enumNames(internProp); return enumManager->enumNames(internProp);
if (attribute == d_ptr->m_enumIconsAttribute) { if (attribute == d_ptr->m_enumIconsAttribute) {
QVariant v; QVariant v;
qVariantSetValue(v, enumManager->enumIcons(internProp)); v.setValue(enumManager->enumIcons(internProp));
return v; return v;
} }
return QVariant(); return QVariant();

1
3rdparty/corrosion vendored Submodule

@ -0,0 +1 @@
Subproject commit be76480232216a64f65e3b1d9794d68cbac6c690

View File

@ -95,6 +95,7 @@ template <typename T1, typename T2>
class ValueArray2 { class ValueArray2 {
public: public:
ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {} ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
ValueArray2(const ValueArray2& other) = default;
template <typename T> template <typename T>
operator ParamGenerator<T>() const { operator ParamGenerator<T>() const {

View File

@ -1004,7 +1004,7 @@ void StackLowerThanAddress(const void* ptr, bool* result) {
// Make sure AddressSanitizer does not tamper with the stack here. // Make sure AddressSanitizer does not tamper with the stack here.
GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
bool StackGrowsDown() { bool StackGrowsDown() {
int dummy; int dummy = 0;
bool result; bool result;
StackLowerThanAddress(&dummy, &result); StackLowerThanAddress(&dummy, &result);
return result; return result;

View File

@ -13,6 +13,7 @@
#ifndef WIN32_LEAN_AND_MEAN #ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#endif #endif
#define NOMINMAX
#include <windows.h> #include <windows.h>
#include <tchar.h> #include <tchar.h>

View File

@ -7,6 +7,7 @@
#ifdef _WIN32 #ifdef _WIN32
#define WIN32_LEAN_AND_MEAN 1 #define WIN32_LEAN_AND_MEAN 1
#define NOMINMAX
#include <windows.h> #include <windows.h>
static HMODULE libgl; static HMODULE libgl;

View File

@ -57,6 +57,7 @@ extern "C" {
#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) #if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)
#define WIN32_LEAN_AND_MEAN 1 #define WIN32_LEAN_AND_MEAN 1
#define NOMINMAX
#include <windows.h> #include <windows.h>
#endif #endif

View File

@ -85,7 +85,8 @@ extern "C" {
// example to allow applications to correctly declare a GL_ARB_debug_output // example to allow applications to correctly declare a GL_ARB_debug_output
// callback) but windows.h assumes no one will define APIENTRY before it does // callback) but windows.h assumes no one will define APIENTRY before it does
#undef APIENTRY #undef APIENTRY
#include <windows.h> #define NOMINMAX
#include <windows.h>
#elif defined(GLFW_EXPOSE_NATIVE_COCOA) #elif defined(GLFW_EXPOSE_NATIVE_COCOA)
#include <ApplicationServices/ApplicationServices.h> #include <ApplicationServices/ApplicationServices.h>
#if defined(__OBJC__) #if defined(__OBJC__)

View File

@ -8723,8 +8723,10 @@ static void SettingsHandlerWindow_WriteAll(ImGuiContext* imgui_ctx, ImGuiSetting
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#endif #endif
#ifndef __MINGW32__ #ifndef __MINGW32__
#include <Windows.h> #define NOMINMAX
#include <windows.h>
#else #else
#define NOMINMAX
#include <windows.h> #include <windows.h>
#endif #endif
#endif #endif

View File

@ -27,6 +27,9 @@
#pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h #pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h
#pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h #pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h
#pragma clang diagnostic ignored "-Wold-style-cast" #pragma clang diagnostic ignored "-Wold-style-cast"
#elif defined(__GNUC__) && __GNUC__ >= 8
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wclass-memaccess"
#endif #endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

5
3rdparty/json11/CMakeLists.txt vendored Normal file
View File

@ -0,0 +1,5 @@
add_library(json11 STATIC
json11.cpp
json11.hpp
)
target_include_directories(json11 PUBLIC .)

19
3rdparty/json11/LICENSE.txt vendored Normal file
View File

@ -0,0 +1,19 @@
Copyright (c) 2013 Dropbox, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

794
3rdparty/json11/json11.cpp vendored Normal file
View File

@ -0,0 +1,794 @@
/* Copyright (c) 2013 Dropbox, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "json11.hpp"
#include <cassert>
#include <cmath>
#include <cstdlib>
#include <cstdint>
#include <cstdio>
#include <climits>
#include <cerrno>
namespace json11 {
static const int max_depth = 200;
using std::string;
using std::vector;
using std::map;
using std::make_shared;
using std::initializer_list;
using std::move;
/* Helper for representing null - just a do-nothing struct, plus comparison
* operators so the helpers in JsonValue work. We can't use nullptr_t because
* it may not be orderable.
*/
struct NullStruct {
bool operator==(NullStruct) const { return true; }
bool operator<(NullStruct) const { return false; }
};
/* * * * * * * * * * * * * * * * * * * *
* Serialization
*/
static void dump(NullStruct, string &out) {
out += "null";
}
static void dump(double value, string &out) {
if (std::isfinite(value)) {
char buf[32];
snprintf(buf, sizeof buf, "%.17g", value);
out += buf;
} else {
out += "null";
}
}
static void dump(int value, string &out) {
char buf[32];
snprintf(buf, sizeof buf, "%d", value);
out += buf;
}
static void dump(bool value, string &out) {
out += value ? "true" : "false";
}
static void dump(const string &value, string &out) {
out += '"';
for (size_t i = 0; i < value.length(); i++) {
const char ch = value[i];
if (ch == '\\') {
out += "\\\\";
} else if (ch == '"') {
out += "\\\"";
} else if (ch == '\b') {
out += "\\b";
} else if (ch == '\f') {
out += "\\f";
} else if (ch == '\n') {
out += "\\n";
} else if (ch == '\r') {
out += "\\r";
} else if (ch == '\t') {
out += "\\t";
} else if (static_cast<uint8_t>(ch) <= 0x1f) {
char buf[8];
snprintf(buf, sizeof buf, "\\u%04x", ch);
out += buf;
} else if (static_cast<uint8_t>(ch) == 0xe2 && static_cast<uint8_t>(value[i+1]) == 0x80
&& static_cast<uint8_t>(value[i+2]) == 0xa8) {
out += "\\u2028";
i += 2;
} else if (static_cast<uint8_t>(ch) == 0xe2 && static_cast<uint8_t>(value[i+1]) == 0x80
&& static_cast<uint8_t>(value[i+2]) == 0xa9) {
out += "\\u2029";
i += 2;
} else {
out += ch;
}
}
out += '"';
}
static void dump(const Json::array &values, string &out) {
bool first = true;
out += "[";
for (const auto &value : values) {
if (!first)
out += ", ";
value.dump(out);
first = false;
}
out += "]";
}
static void dump(const Json::object &values, string &out) {
bool first = true;
out += "{";
for (const auto &kv : values) {
if (!first)
out += ", ";
dump(kv.first, out);
out += ": ";
kv.second.dump(out);
first = false;
}
out += "}";
}
void Json::dump(string &out) const {
m_ptr->dump(out);
}
/* * * * * * * * * * * * * * * * * * * *
* Value wrappers
*/
template <Json::Type tag, typename T>
class Value : public JsonValue {
protected:
// Constructors
explicit Value(const T &value) : m_value(value) {}
explicit Value(T &&value) : m_value(std::move(value)) {}
// Get type tag
Json::Type type() const override {
return tag;
}
// Comparisons
bool equals(const JsonValue * other) const override {
return m_value == static_cast<const Value<tag, T> *>(other)->m_value;
}
bool less(const JsonValue * other) const override {
return m_value < static_cast<const Value<tag, T> *>(other)->m_value;
}
const T m_value;
void dump(string &out) const override { json11::dump(m_value, out); }
};
class JsonDouble final : public Value<Json::NUMBER, double> {
double number_value() const override { return m_value; }
int int_value() const override { return static_cast<int>(m_value); }
bool equals(const JsonValue * other) const override { return m_value == other->number_value(); }
bool less(const JsonValue * other) const override { return m_value < other->number_value(); }
public:
explicit JsonDouble(double value) : Value(value) {}
};
class JsonInt final : public Value<Json::NUMBER, int> {
double number_value() const override { return m_value; }
int int_value() const override { return m_value; }
bool equals(const JsonValue * other) const override { return m_value == other->number_value(); }
bool less(const JsonValue * other) const override { return m_value < other->number_value(); }
public:
explicit JsonInt(int value) : Value(value) {}
};
class JsonBoolean final : public Value<Json::BOOL, bool> {
bool bool_value() const override { return m_value; }
public:
explicit JsonBoolean(bool value) : Value(value) {}
};
class JsonString final : public Value<Json::STRING, string> {
const string &string_value() const override { return m_value; }
public:
explicit JsonString(const string &value) : Value(value) {}
explicit JsonString(string &&value) : Value(std::move(value)) {}
};
class JsonArray final : public Value<Json::ARRAY, Json::array> {
const Json::array &array_items() const override { return m_value; }
const Json & operator[](size_t i) const override;
public:
explicit JsonArray(const Json::array &value) : Value(value) {}
explicit JsonArray(Json::array &&value) : Value(std::move(value)) {}
};
class JsonObject final : public Value<Json::OBJECT, Json::object> {
const Json::object &object_items() const override { return m_value; }
const Json & operator[](const string &key) const override;
public:
explicit JsonObject(const Json::object &value) : Value(value) {}
explicit JsonObject(Json::object &&value) : Value(std::move(value)) {}
};
class JsonNull final : public Value<Json::NUL, NullStruct> {
public:
JsonNull() : Value({}) {}
};
/* * * * * * * * * * * * * * * * * * * *
* Static globals - static-init-safe
*/
struct Statics {
const std::shared_ptr<JsonValue> null = make_shared<JsonNull>();
const std::shared_ptr<JsonValue> t = make_shared<JsonBoolean>(true);
const std::shared_ptr<JsonValue> f = make_shared<JsonBoolean>(false);
const string empty_string;
const vector<Json> empty_vector;
const map<string, Json> empty_map;
Statics() {}
};
static const Statics & statics() {
static const Statics s {};
return s;
}
static const Json & static_null() {
// This has to be separate, not in Statics, because Json() accesses statics().null.
static const Json json_null;
return json_null;
}
/* * * * * * * * * * * * * * * * * * * *
* Constructors
*/
Json::Json() noexcept : m_ptr(statics().null) {}
Json::Json(std::nullptr_t) noexcept : m_ptr(statics().null) {}
Json::Json(double value) : m_ptr(make_shared<JsonDouble>(value)) {}
Json::Json(int value) : m_ptr(make_shared<JsonInt>(value)) {}
Json::Json(bool value) : m_ptr(value ? statics().t : statics().f) {}
Json::Json(const string &value) : m_ptr(make_shared<JsonString>(value)) {}
Json::Json(string &&value) : m_ptr(make_shared<JsonString>(std::move(value))) {}
Json::Json(const char * value) : m_ptr(make_shared<JsonString>(value)) {}
Json::Json(const Json::array &values) : m_ptr(make_shared<JsonArray>(values)) {}
Json::Json(Json::array &&values) : m_ptr(make_shared<JsonArray>(std::move(values))) {}
Json::Json(const Json::object &values) : m_ptr(make_shared<JsonObject>(values)) {}
Json::Json(Json::object &&values) : m_ptr(make_shared<JsonObject>(std::move(values))) {}
/* * * * * * * * * * * * * * * * * * * *
* Accessors
*/
Json::Type Json::type() const { return m_ptr->type(); }
double Json::number_value() const { return m_ptr->number_value(); }
int Json::int_value() const { return m_ptr->int_value(); }
bool Json::bool_value() const { return m_ptr->bool_value(); }
const string & Json::string_value() const { return m_ptr->string_value(); }
const vector<Json> & Json::array_items() const { return m_ptr->array_items(); }
const map<string, Json> & Json::object_items() const { return m_ptr->object_items(); }
const Json & Json::operator[] (size_t i) const { return (*m_ptr)[i]; }
const Json & Json::operator[] (const string &key) const { return (*m_ptr)[key]; }
double JsonValue::number_value() const { return 0; }
int JsonValue::int_value() const { return 0; }
bool JsonValue::bool_value() const { return false; }
const string & JsonValue::string_value() const { return statics().empty_string; }
const vector<Json> & JsonValue::array_items() const { return statics().empty_vector; }
const map<string, Json> & JsonValue::object_items() const { return statics().empty_map; }
const Json & JsonValue::operator[] (size_t) const { return static_null(); }
const Json & JsonValue::operator[] (const string &) const { return static_null(); }
const Json & JsonObject::operator[] (const string &key) const {
auto iter = m_value.find(key);
return (iter == m_value.end()) ? static_null() : iter->second;
}
const Json & JsonArray::operator[] (size_t i) const {
if (i >= m_value.size()) return static_null();
else return m_value[i];
}
/* * * * * * * * * * * * * * * * * * * *
* Comparison
*/
bool Json::operator== (const Json &other) const {
if (m_ptr == other.m_ptr)
return true;
if (m_ptr->type() != other.m_ptr->type())
return false;
return m_ptr->equals(other.m_ptr.get());
}
bool Json::operator< (const Json &other) const {
if (m_ptr == other.m_ptr)
return false;
if (m_ptr->type() != other.m_ptr->type())
return m_ptr->type() < other.m_ptr->type();
return m_ptr->less(other.m_ptr.get());
}
/* * * * * * * * * * * * * * * * * * * *
* Parsing
*/
/* esc(c)
*
* Format char c suitable for printing in an error message.
*/
static inline string esc(char c) {
char buf[12];
if (static_cast<uint8_t>(c) >= 0x20 && static_cast<uint8_t>(c) <= 0x7f) {
snprintf(buf, sizeof buf, "'%c' (%d)", c, c);
} else {
snprintf(buf, sizeof buf, "(%d)", c);
}
return string(buf);
}
static inline bool in_range(long x, long lower, long upper) {
return (x >= lower && x <= upper);
}
namespace {
/* JsonParser
*
* Object that tracks all state of an in-progress parse.
*/
struct JsonParser final {
/* State
*/
const string &str;
size_t i;
string &err;
bool failed;
const JsonParse strategy;
/* fail(msg, err_ret = Json())
*
* Mark this parse as failed.
*/
Json fail(string &&msg) {
return fail(std::move(msg), Json());
}
template <typename T>
T fail(string &&msg, const T err_ret) {
if (!failed)
err = std::move(msg);
failed = true;
return err_ret;
}
/* consume_whitespace()
*
* Advance until the current character is non-whitespace.
*/
void consume_whitespace() {
while (str[i] == ' ' || str[i] == '\r' || str[i] == '\n' || str[i] == '\t')
i++;
}
/* consume_comment()
*
* Advance comments (c-style inline and multiline).
*/
bool consume_comment() {
bool comment_found = false;
if (str[i] == '/') {
i++;
if (i == str.size())
return fail("unexpected end of input after start of comment", false);
if (str[i] == '/') { // inline comment
i++;
// advance until next line, or end of input
while (i < str.size() && str[i] != '\n') {
i++;
}
comment_found = true;
}
else if (str[i] == '*') { // multiline comment
i++;
if (i > str.size()-2)
return fail("unexpected end of input inside multi-line comment", false);
// advance until closing tokens
while (!(str[i] == '*' && str[i+1] == '/')) {
i++;
if (i > str.size()-2)
return fail(
"unexpected end of input inside multi-line comment", false);
}
i += 2;
comment_found = true;
}
else
return fail("malformed comment", false);
}
return comment_found;
}
/* consume_garbage()
*
* Advance until the current character is non-whitespace and non-comment.
*/
void consume_garbage() {
consume_whitespace();
if(strategy == JsonParse::COMMENTS) {
bool comment_found = false;
do {
comment_found = consume_comment();
if (failed) return;
consume_whitespace();
}
while(comment_found);
}
}
/* get_next_token()
*
* Return the next non-whitespace character. If the end of the input is reached,
* flag an error and return 0.
*/
char get_next_token() {
consume_garbage();
if (failed) return static_cast<char>(0);
if (i == str.size())
return fail("unexpected end of input", static_cast<char>(0));
return str[i++];
}
/* encode_utf8(pt, out)
*
* Encode pt as UTF-8 and add it to out.
*/
void encode_utf8(long pt, string & out) {
if (pt < 0)
return;
if (pt < 0x80) {
out += static_cast<char>(pt);
} else if (pt < 0x800) {
out += static_cast<char>((pt >> 6) | 0xC0);
out += static_cast<char>((pt & 0x3F) | 0x80);
} else if (pt < 0x10000) {
out += static_cast<char>((pt >> 12) | 0xE0);
out += static_cast<char>(((pt >> 6) & 0x3F) | 0x80);
out += static_cast<char>((pt & 0x3F) | 0x80);
} else {
out += static_cast<char>((pt >> 18) | 0xF0);
out += static_cast<char>(((pt >> 12) & 0x3F) | 0x80);
out += static_cast<char>(((pt >> 6) & 0x3F) | 0x80);
out += static_cast<char>((pt & 0x3F) | 0x80);
}
}
/* parse_string()
*
* Parse a string, starting at the current position.
*/
string parse_string() {
string out;
long last_escaped_codepoint = -1;
while (true) {
if (i == str.size())
return fail("unexpected end of input in string", "");
char ch = str[i++];
if (ch == '"') {
encode_utf8(last_escaped_codepoint, out);
return out;
}
if (in_range(ch, 0, 0x1f))
return fail("unescaped " + esc(ch) + " in string", "");
// The usual case: non-escaped characters
if (ch != '\\') {
encode_utf8(last_escaped_codepoint, out);
last_escaped_codepoint = -1;
out += ch;
continue;
}
// Handle escapes
if (i == str.size())
return fail("unexpected end of input in string", "");
ch = str[i++];
if (ch == 'u') {
// Extract 4-byte escape sequence
string esc = str.substr(i, 4);
// Explicitly check length of the substring. The following loop
// relies on std::string returning the terminating NUL when
// accessing str[length]. Checking here reduces brittleness.
if (esc.length() < 4) {
return fail("bad \\u escape: " + esc, "");
}
for (size_t j = 0; j < 4; j++) {
if (!in_range(esc[j], 'a', 'f') && !in_range(esc[j], 'A', 'F')
&& !in_range(esc[j], '0', '9'))
return fail("bad \\u escape: " + esc, "");
}
long codepoint = strtol(esc.data(), nullptr, 16);
// JSON specifies that characters outside the BMP shall be encoded as a pair
// of 4-hex-digit \u escapes encoding their surrogate pair components. Check
// whether we're in the middle of such a beast: the previous codepoint was an
// escaped lead (high) surrogate, and this is a trail (low) surrogate.
if (in_range(last_escaped_codepoint, 0xD800, 0xDBFF)
&& in_range(codepoint, 0xDC00, 0xDFFF)) {
// Reassemble the two surrogate pairs into one astral-plane character, per
// the UTF-16 algorithm.
encode_utf8((((last_escaped_codepoint - 0xD800) << 10)
| (codepoint - 0xDC00)) + 0x10000, out);
last_escaped_codepoint = -1;
} else {
encode_utf8(last_escaped_codepoint, out);
last_escaped_codepoint = codepoint;
}
i += 4;
continue;
}
encode_utf8(last_escaped_codepoint, out);
last_escaped_codepoint = -1;
if (ch == 'b') {
out += '\b';
} else if (ch == 'f') {
out += '\f';
} else if (ch == 'n') {
out += '\n';
} else if (ch == 'r') {
out += '\r';
} else if (ch == 't') {
out += '\t';
} else if (ch == '"' || ch == '\\' || ch == '/') {
out += ch;
} else {
return fail("invalid escape character " + esc(ch), "");
}
}
}
/* parse_number()
*
* Parse a double.
*/
Json parse_number() {
size_t start_pos = i;
if (str[i] == '-')
i++;
// Integer part
if (str[i] == '0') {
i++;
if (in_range(str[i], '0', '9'))
return fail("leading 0s not permitted in numbers");
} else if (in_range(str[i], '1', '9')) {
i++;
while (in_range(str[i], '0', '9'))
i++;
} else {
return fail("invalid " + esc(str[i]) + " in number");
}
if (str[i] != '.' && str[i] != 'e' && str[i] != 'E') {
errno = 0;
long val = std::strtol(str.c_str() + start_pos, nullptr, 0);
if (!errno && val >= INT_MIN && val <= INT_MAX)
return int(val);
}
// Decimal part
if (str[i] == '.') {
i++;
if (!in_range(str[i], '0', '9'))
return fail("at least one digit required in fractional part");
while (in_range(str[i], '0', '9'))
i++;
}
// Exponent part
if (str[i] == 'e' || str[i] == 'E') {
i++;
if (str[i] == '+' || str[i] == '-')
i++;
if (!in_range(str[i], '0', '9'))
return fail("at least one digit required in exponent");
while (in_range(str[i], '0', '9'))
i++;
}
return std::strtod(str.c_str() + start_pos, nullptr);
}
/* expect(str, res)
*
* Expect that 'str' starts at the character that was just read. If it does, advance
* the input and return res. If not, flag an error.
*/
Json expect(const string &expected, Json res) {
assert(i != 0);
i--;
if (str.compare(i, expected.length(), expected) == 0) {
i += expected.length();
return res;
} else {
return fail("parse error: expected " + expected + ", got " + str.substr(i, expected.length()));
}
}
/* parse_json()
*
* Parse a JSON object.
*/
Json parse_json(int depth) {
if (depth > max_depth) {
return fail("exceeded maximum nesting depth");
}
char ch = get_next_token();
if (failed)
return Json();
if (ch == '-' || (ch >= '0' && ch <= '9')) {
i--;
return parse_number();
}
if (ch == 't')
return expect("true", true);
if (ch == 'f')
return expect("false", false);
if (ch == 'n')
return expect("null", Json());
if (ch == '"')
return parse_string();
if (ch == '{') {
map<string, Json> data;
ch = get_next_token();
if (ch == '}')
return data;
while (1) {
if (ch != '"')
return fail("expected '\"' in object, got " + esc(ch));
string key = parse_string();
if (failed)
return Json();
ch = get_next_token();
if (ch != ':')
return fail("expected ':' in object, got " + esc(ch));
data[std::move(key)] = parse_json(depth + 1);
if (failed)
return Json();
ch = get_next_token();
if (ch == '}')
break;
if (ch != ',')
return fail("expected ',' in object, got " + esc(ch));
ch = get_next_token();
}
return data;
}
if (ch == '[') {
vector<Json> data;
ch = get_next_token();
if (ch == ']')
return data;
while (1) {
i--;
data.push_back(parse_json(depth + 1));
if (failed)
return Json();
ch = get_next_token();
if (ch == ']')
break;
if (ch != ',')
return fail("expected ',' in list, got " + esc(ch));
ch = get_next_token();
(void)ch;
}
return data;
}
return fail("expected value, got " + esc(ch));
}
};
}//namespace {
Json Json::parse(const string &in, string &err, JsonParse strategy) {
JsonParser parser { in, 0, err, false, strategy };
Json result = parser.parse_json(0);
// Check for any trailing garbage
parser.consume_garbage();
if (parser.failed)
return Json();
if (parser.i != in.size())
return parser.fail("unexpected trailing " + esc(in[parser.i]));
return result;
}
// Documented in json11.hpp
vector<Json> Json::parse_multi(const string &in,
std::string::size_type &parser_stop_pos,
string &err,
JsonParse strategy) {
JsonParser parser { in, 0, err, false, strategy };
parser_stop_pos = 0;
vector<Json> json_vec;
while (parser.i != in.size() && !parser.failed) {
json_vec.push_back(parser.parse_json(0));
if (parser.failed)
break;
// Check for another object
parser.consume_garbage();
if (parser.failed)
break;
parser_stop_pos = parser.i;
}
return json_vec;
}
/* * * * * * * * * * * * * * * * * * * *
* Shape-checking
*/
bool Json::has_shape(const shape & types, string & err) const {
if (!is_object()) {
err = "expected JSON object, got " + dump();
return false;
}
const auto& obj_items = object_items();
for (auto & item : types) {
const auto it = obj_items.find(item.first);
if (it == obj_items.cend() || it->second.type() != item.second) {
err = "bad type for " + item.first + " in " + dump();
return false;
}
}
return true;
}
} // namespace json11

232
3rdparty/json11/json11.hpp vendored Normal file
View File

@ -0,0 +1,232 @@
/* json11
*
* json11 is a tiny JSON library for C++11, providing JSON parsing and serialization.
*
* The core object provided by the library is json11::Json. A Json object represents any JSON
* value: null, bool, number (int or double), string (std::string), array (std::vector), or
* object (std::map).
*
* Json objects act like values: they can be assigned, copied, moved, compared for equality or
* order, etc. There are also helper methods Json::dump, to serialize a Json to a string, and
* Json::parse (static) to parse a std::string as a Json object.
*
* Internally, the various types of Json object are represented by the JsonValue class
* hierarchy.
*
* A note on numbers - JSON specifies the syntax of number formatting but not its semantics,
* so some JSON implementations distinguish between integers and floating-point numbers, while
* some don't. In json11, we choose the latter. Because some JSON implementations (namely
* Javascript itself) treat all numbers as the same type, distinguishing the two leads
* to JSON that will be *silently* changed by a round-trip through those implementations.
* Dangerous! To avoid that risk, json11 stores all numbers as double internally, but also
* provides integer helpers.
*
* Fortunately, double-precision IEEE754 ('double') can precisely store any integer in the
* range +/-2^53, which includes every 'int' on most systems. (Timestamps often use int64
* or long long to avoid the Y2038K problem; a double storing microseconds since some epoch
* will be exact for +/- 275 years.)
*/
/* Copyright (c) 2013 Dropbox, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#pragma once
#include <string>
#include <vector>
#include <map>
#include <memory>
#include <initializer_list>
#ifdef _MSC_VER
#if _MSC_VER <= 1800 // VS 2013
#ifndef noexcept
#define noexcept throw()
#endif
#ifndef snprintf
#define snprintf _snprintf_s
#endif
#endif
#endif
namespace json11 {
enum JsonParse {
STANDARD, COMMENTS
};
class JsonValue;
class Json final {
public:
// Types
enum Type {
NUL, NUMBER, BOOL, STRING, ARRAY, OBJECT
};
// Array and object typedefs
typedef std::vector<Json> array;
typedef std::map<std::string, Json> object;
// Constructors for the various types of JSON value.
Json() noexcept; // NUL
Json(std::nullptr_t) noexcept; // NUL
Json(double value); // NUMBER
Json(int value); // NUMBER
Json(bool value); // BOOL
Json(const std::string &value); // STRING
Json(std::string &&value); // STRING
Json(const char * value); // STRING
Json(const array &values); // ARRAY
Json(array &&values); // ARRAY
Json(const object &values); // OBJECT
Json(object &&values); // OBJECT
// Implicit constructor: anything with a to_json() function.
template <class T, class = decltype(&T::to_json)>
Json(const T & t) : Json(t.to_json()) {}
// Implicit constructor: map-like objects (std::map, std::unordered_map, etc)
template <class M, typename std::enable_if<
std::is_constructible<std::string, decltype(std::declval<M>().begin()->first)>::value
&& std::is_constructible<Json, decltype(std::declval<M>().begin()->second)>::value,
int>::type = 0>
Json(const M & m) : Json(object(m.begin(), m.end())) {}
// Implicit constructor: vector-like objects (std::list, std::vector, std::set, etc)
template <class V, typename std::enable_if<
std::is_constructible<Json, decltype(*std::declval<V>().begin())>::value,
int>::type = 0>
Json(const V & v) : Json(array(v.begin(), v.end())) {}
// This prevents Json(some_pointer) from accidentally producing a bool. Use
// Json(bool(some_pointer)) if that behavior is desired.
Json(void *) = delete;
// Accessors
Type type() const;
bool is_null() const { return type() == NUL; }
bool is_number() const { return type() == NUMBER; }
bool is_bool() const { return type() == BOOL; }
bool is_string() const { return type() == STRING; }
bool is_array() const { return type() == ARRAY; }
bool is_object() const { return type() == OBJECT; }
// Return the enclosed value if this is a number, 0 otherwise. Note that json11 does not
// distinguish between integer and non-integer numbers - number_value() and int_value()
// can both be applied to a NUMBER-typed object.
double number_value() const;
int int_value() const;
// Return the enclosed value if this is a boolean, false otherwise.
bool bool_value() const;
// Return the enclosed string if this is a string, "" otherwise.
const std::string &string_value() const;
// Return the enclosed std::vector if this is an array, or an empty vector otherwise.
const array &array_items() const;
// Return the enclosed std::map if this is an object, or an empty map otherwise.
const object &object_items() const;
// Return a reference to arr[i] if this is an array, Json() otherwise.
const Json & operator[](size_t i) const;
// Return a reference to obj[key] if this is an object, Json() otherwise.
const Json & operator[](const std::string &key) const;
// Serialize.
void dump(std::string &out) const;
std::string dump() const {
std::string out;
dump(out);
return out;
}
// Parse. If parse fails, return Json() and assign an error message to err.
static Json parse(const std::string & in,
std::string & err,
JsonParse strategy = JsonParse::STANDARD);
static Json parse(const char * in,
std::string & err,
JsonParse strategy = JsonParse::STANDARD) {
if (in) {
return parse(std::string(in), err, strategy);
} else {
err = "null input";
return nullptr;
}
}
// Parse multiple objects, concatenated or separated by whitespace
static std::vector<Json> parse_multi(
const std::string & in,
std::string::size_type & parser_stop_pos,
std::string & err,
JsonParse strategy = JsonParse::STANDARD);
static inline std::vector<Json> parse_multi(
const std::string & in,
std::string & err,
JsonParse strategy = JsonParse::STANDARD) {
std::string::size_type parser_stop_pos;
return parse_multi(in, parser_stop_pos, err, strategy);
}
bool operator== (const Json &rhs) const;
bool operator< (const Json &rhs) const;
bool operator!= (const Json &rhs) const { return !(*this == rhs); }
bool operator<= (const Json &rhs) const { return !(rhs < *this); }
bool operator> (const Json &rhs) const { return (rhs < *this); }
bool operator>= (const Json &rhs) const { return !(*this < rhs); }
/* has_shape(types, err)
*
* Return true if this is a JSON object and, for each item in types, has a field of
* the given type. If not, return false and set err to a descriptive message.
*/
typedef std::initializer_list<std::pair<std::string, Type>> shape;
bool has_shape(const shape & types, std::string & err) const;
private:
std::shared_ptr<JsonValue> m_ptr;
};
// Internal class hierarchy - JsonValue objects are not exposed to users of this API.
class JsonValue {
protected:
friend class Json;
friend class JsonInt;
friend class JsonDouble;
virtual Json::Type type() const = 0;
virtual bool equals(const JsonValue * other) const = 0;
virtual bool less(const JsonValue * other) const = 0;
virtual void dump(std::string &out) const = 0;
virtual double number_value() const;
virtual int int_value() const;
virtual bool bool_value() const;
virtual const std::string &string_value() const;
virtual const Json::array &array_items() const;
virtual const Json &operator[](size_t i) const;
virtual const Json::object &object_items() const;
virtual const Json &operator[](const std::string &key) const;
virtual ~JsonValue() {}
};
} // namespace json11

9
3rdparty/oourafft/CMakeLists.txt vendored Normal file
View File

@ -0,0 +1,9 @@
add_library(oourafft INTERFACE)
target_include_directories(oourafft INTERFACE .)
target_sources(oourafft PUBLIC
fftsg.cc
fftsg.h
fftsg2d.cc
)

3259
3rdparty/oourafft/fftsg.cc vendored Normal file

File diff suppressed because it is too large Load Diff

24
3rdparty/oourafft/fftsg.h vendored Normal file
View File

@ -0,0 +1,24 @@
#ifndef FFTSG_H
#define FFTSG_H
#include "nextpnr_namespaces.h"
NEXTPNR_NAMESPACE_BEGIN
//
// The following FFT library came from
// http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html
//
//
/// 1D FFT ////////////////////////////////////////////////////////////////
void ddct(int n, int isgn, float *a, int *ip, float *w);
void ddst(int n, int isgn, float *a, int *ip, float *w);
/// 2D FFT ////////////////////////////////////////////////////////////////
void ddct2d(int n1, int n2, int isgn, float **a, float *t, int *ip, float *w);
void ddsct2d(int n1, int n2, int isgn, float **a, float *t, int *ip, float *w);
void ddcst2d(int n1, int n2, int isgn, float **a, float *t, int *ip, float *w);
NEXTPNR_NAMESPACE_END
#endif

1310
3rdparty/oourafft/fftsg2d.cc vendored Normal file

File diff suppressed because it is too large Load Diff

167
3rdparty/oourafft/readme.txt vendored Normal file
View File

@ -0,0 +1,167 @@
General Purpose FFT (Fast Fourier/Cosine/Sine Transform) Package
Description:
A package to calculate Discrete Fourier/Cosine/Sine Transforms of
1-dimensional sequences of length 2^N.
Files:
fft4g.c : FFT Package in C - Fast Version I (radix 4,2)
fft4g.f : FFT Package in Fortran - Fast Version I (radix 4,2)
fft4g_h.c : FFT Package in C - Simple Version I (radix 4,2)
fft8g.c : FFT Package in C - Fast Version II (radix 8,4,2)
fft8g.f : FFT Package in Fortran - Fast Version II (radix 8,4,2)
fft8g_h.c : FFT Package in C - Simple Version II (radix 8,4,2)
fftsg.c : FFT Package in C - Fast Version III (Split-Radix)
fftsg.f : FFT Package in Fortran - Fast Version III (Split-Radix)
fftsg_h.c : FFT Package in C - Simple Version III (Split-Radix)
readme.txt : Readme File
sample1/ : Test Directory
Makefile : for gcc, cc
Makefile.f77: for Fortran
testxg.c : Test Program for "fft*g.c"
testxg.f : Test Program for "fft*g.f"
testxg_h.c : Test Program for "fft*g_h.c"
sample2/ : Benchmark Directory
Makefile : for gcc, cc
Makefile.pth: POSIX Thread version
pi_fft.c : PI(= 3.1415926535897932384626...) Calculation Program
for a Benchmark Test for "fft*g.c"
Difference of the Files:
C and Fortran versions are equal and
the same routines are in each version.
"fft4g*.*" are optimized for most machines.
"fft8g*.*" are fast on the UltraSPARC.
"fftsg*.*" are optimized for the machines that
have the multi-level (L1,L2,etc) cache.
The simple versions "fft*g_h.c" use no work area, but
the fast versions "fft*g.*" use work areas.
The fast versions "fft*g.*" have the same specification.
Routines in the Package:
cdft: Complex Discrete Fourier Transform
rdft: Real Discrete Fourier Transform
ddct: Discrete Cosine Transform
ddst: Discrete Sine Transform
dfct: Cosine Transform of RDFT (Real Symmetric DFT)
dfst: Sine Transform of RDFT (Real Anti-symmetric DFT)
Usage:
Please refer to the comments in the "fft**.*" file which
you want to use. Brief explanations are in the block
comments of each package. The examples are also given in
the test programs.
Method:
-------- cdft --------
fft4g*.*, fft8g*.*:
A method of in-place, radix 2^M, Sande-Tukey (decimation in
frequency). Index of the butterfly loop is in bit
reverse order to keep continuous memory access.
fftsg*.*:
A method of in-place, Split-Radix, recursive fast
algorithm.
-------- rdft --------
A method with a following butterfly operation appended to "cdft".
In forward transform :
A[k] = sum_j=0^n-1 a[j]*W(n)^(j*k), 0<=k<=n/2,
W(n) = exp(2*pi*i/n),
this routine makes an array x[] :
x[j] = a[2*j] + i*a[2*j+1], 0<=j<n/2
and calls "cdft" of length n/2 :
X[k] = sum_j=0^n/2-1 x[j] * W(n/2)^(j*k), 0<=k<n.
The result A[k] are :
A[k] = X[k] - (1+i*W(n)^k)/2 * (X[k]-conjg(X[n/2-k])),
A[n/2-k] = X[n/2-k] +
conjg((1+i*W(n)^k)/2 * (X[k]-conjg(X[n/2-k]))),
0<=k<=n/2
(notes: conjg() is a complex conjugate, X[n/2]=X[0]).
-------- ddct --------
A method with a following butterfly operation appended to "rdft".
In backward transform :
C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k<n,
this routine makes an array r[] :
r[0] = a[0],
r[j] = Re((a[j] - i*a[n-j]) * W(4*n)^j*(1+i)/2),
r[n-j] = Im((a[j] - i*a[n-j]) * W(4*n)^j*(1+i)/2),
0<j<=n/2
and calls "rdft" of length n :
A[k] = sum_j=0^n-1 r[j]*W(n)^(j*k), 0<=k<=n/2,
W(n) = exp(2*pi*i/n).
The result C[k] are :
C[2*k] = Re(A[k] * (1-i)),
C[2*k-1] = -Im(A[k] * (1-i)).
-------- ddst --------
A method with a following butterfly operation appended to "rdft".
In backward transform :
S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k<n,
this routine makes an array r[] :
r[0] = a[0],
r[j] = Im((a[n-j] - i*a[j]) * W(4*n)^j*(1+i)/2),
r[n-j] = Re((a[n-j] - i*a[j]) * W(4*n)^j*(1+i)/2),
0<j<=n/2
and calls "rdft" of length n :
A[k] = sum_j=0^n-1 r[j]*W(n)^(j*k), 0<=k<=n/2,
W(n) = exp(2*pi*i/n).
The result S[k] are :
S[2*k] = Re(A[k] * (1+i)),
S[2*k-1] = -Im(A[k] * (1+i)).
-------- dfct --------
A method to split into "dfct" and "ddct" of half length.
The transform :
C[k] = sum_j=0^n a[j]*cos(pi*j*k/n), 0<=k<=n
is divided into :
C[2*k] = sum'_j=0^n/2 (a[j]+a[n-j])*cos(pi*j*k/(n/2)),
C[2*k+1] = sum_j=0^n/2-1 (a[j]-a[n-j])*cos(pi*j*(k+1/2)/(n/2))
(sum' is a summation whose last term multiplies 1/2).
This routine uses "ddct" recursively.
To keep the in-place operation, the data in fft*g_h.*
are sorted in bit reversal order.
-------- dfst --------
A method to split into "dfst" and "ddst" of half length.
The transform :
S[k] = sum_j=1^n-1 a[j]*sin(pi*j*k/n), 0<k<n
is divided into :
S[2*k] = sum_j=1^n/2-1 (a[j]-a[n-j])*sin(pi*j*k/(n/2)),
S[2*k+1] = sum'_j=1^n/2 (a[j]+a[n-j])*sin(pi*j*(k+1/2)/(n/2))
(sum' is a summation whose last term multiplies 1/2).
This routine uses "ddst" recursively.
To keep the in-place operation, the data in fft*g_h.*
are sorted in bit reversal order.
Reference:
* Masatake MORI, Makoto NATORI, Tatuo TORII: Suchikeisan,
Iwanamikouzajyouhoukagaku18, Iwanami, 1982 (Japanese)
* Henri J. Nussbaumer: Fast Fourier Transform and Convolution
Algorithms, Springer Verlag, 1982
* C. S. Burrus, Notes on the FFT (with large FFT paper list)
http://www-dsp.rice.edu/research/fft/fftnote.asc
Copyright:
Copyright(C) 1996-2001 Takuya OOURA
email: ooura@mmm.t.u-tokyo.ac.jp
download: http://momonga.t.u-tokyo.ac.jp/~ooura/fft.html
You may use, copy, modify this code for any purpose and
without fee. You may distribute this ORIGINAL package.
History:
...
Dec. 1995 : Edit the General Purpose FFT
Mar. 1996 : Change the specification
Jun. 1996 : Change the method of trigonometric function table
Sep. 1996 : Modify the documents
Feb. 1997 : Change the butterfly loops
Dec. 1997 : Modify the documents
Dec. 1997 : Add "fft4g.*"
Jul. 1998 : Fix some bugs in the documents
Jul. 1998 : Add "fft8g.*" and delete "fft4f.*"
Jul. 1998 : Add a benchmark program "pi_fft.c"
Jul. 1999 : Add a simple version "fft*g_h.c"
Jul. 1999 : Add a Split-Radix FFT package "fftsg*.c"
Sep. 1999 : Reduce the memory operation (minor optimization)
Oct. 1999 : Change the butterfly structure of "fftsg*.c"
Oct. 1999 : Save the code size
Sep. 2001 : Add "fftsg.f"
Sep. 2001 : Add Pthread & Win32thread routines to "fftsg*.c"
Dec. 2006 : Fix a minor bug in "fftsg.f"

77
3rdparty/oourafft/readme2d.txt vendored Normal file
View File

@ -0,0 +1,77 @@
General Purpose 2D,3D FFT (Fast Fourier Transform) Package
Files
alloc.c : 2D-array Allocation
alloc.h : 2D-array Allocation
fft4f2d.c : 2D FFT Package in C - Version I (radix 4, 2)
fft4f2d.f : 2D FFT Package in Fortran - Version I (radix 4, 2)
fftsg.c : 1D FFT Package in C - Fast Version (Split-Radix)
fftsg.f : 1D FFT Package in Fortran - Fast Version (Split-Radix)
fftsg2d.c : 2D FFT Package in C - Version II (Split-Radix)
fftsg2d.f : 2D FFT Package in Fortran - Version II (Split-Radix)
fftsg3d.c : 3D FFT Package in C - Version II (Split-Radix)
fftsg3d.f : 3D FFT Package in Fortran - Version II (Split-Radix)
shrtdct.c : 8x8, 16x16 DCT Package
sample2d/
Makefile : for gcc, cc
Makefile.f77: for Fortran
Makefile.pth: Pthread version
fft4f2dt.c : Test Program for "fft4f2d.c"
fft4f2dt.f : Test Program for "fft4f2d.f"
fftsg2dt.c : Test Program for "fftsg2d.c"
fftsg2dt.f : Test Program for "fftsg2d.f"
fftsg3dt.c : Test Program for "fftsg3d.c"
fftsg3dt.f : Test Program for "fftsg3d.f"
shrtdctt.c : Test Program for "shrtdct.c"
Difference of Files
C and Fortran versions are equal and
the same routines are in each version.
---- Difference between "fft4f2d.*" and "fftsg2d.*" ----
"fft4f2d.*" are optimized for the old machines that
don't have the large size CPU cache.
"fftsg2d.*", "fftsg3d.*" use 1D FFT routines in "fftsg.*".
"fftsg2d.*", "fftsg3d.*" are optimized for the machines that
have the multi-level (L1,L2,etc) cache.
Routines in the Package
in fft4f2d.*, fftsg2d.*
cdft2d: 2-dim Complex Discrete Fourier Transform
rdft2d: 2-dim Real Discrete Fourier Transform
ddct2d: 2-dim Discrete Cosine Transform
ddst2d: 2-dim Discrete Sine Transform
rdft2dsort: rdft2d input/output ordering (fftsg2d.*)
in fftsg3d.*
cdft3d: 3-dim Complex Discrete Fourier Transform
rdft3d: 3-dim Real Discrete Fourier Transform
ddct3d: 3-dim Discrete Cosine Transform
ddst3d: 3-dim Discrete Sine Transform
rdft3dsort: rdft3d input/output ordering
in fftsg.*
cdft: 1-dim Complex Discrete Fourier Transform
rdft: 1-dim Real Discrete Fourier Transform
ddct: 1-dim Discrete Cosine Transform
ddst: 1-dim Discrete Sine Transform
dfct: 1-dim Real Symmetric DFT
dfst: 1-dim Real Anti-symmetric DFT
(these routines are called by fftsg2d.*, fftsg3d.*)
in shrtdct.c
ddct8x8s : Normalized 8x8 DCT
ddct16x16s: Normalized 16x16 DCT
(faster than ddct2d())
Usage
Brief explanations are in block comments of each packages.
The examples are given in the test programs.
Copyright
Copyright(C) 1997,2001 Takuya OOURA (email: ooura@kurims.kyoto-u.ac.jp).
You may use, copy, modify this code for any purpose and
without fee. You may distribute this ORIGINAL package.
History
...
Nov. 2001 : Add 3D-FFT routines
Dec. 2006 : Fix a documentation bug in "fftsg3d.*"
Dec. 2006 : Fix a minor bug in "fftsg.f"

35
3rdparty/pybind11/.appveyor.yml vendored Normal file
View File

@ -0,0 +1,35 @@
version: 1.0.{build}
image:
- Visual Studio 2017
test: off
skip_branch_with_pr: true
build:
parallel: true
platform:
- x86
environment:
matrix:
- PYTHON: 36
CONFIG: Debug
install:
- ps: |
$env:CMAKE_GENERATOR = "Visual Studio 15 2017"
if ($env:PLATFORM -eq "x64") { $env:PYTHON = "$env:PYTHON-x64" }
$env:PATH = "C:\Python$env:PYTHON\;C:\Python$env:PYTHON\Scripts\;$env:PATH"
python -W ignore -m pip install --upgrade pip wheel
python -W ignore -m pip install pytest numpy --no-warn-script-location pytest-timeout
- ps: |
Start-FileDownload 'https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.zip'
7z x eigen-3.3.7.zip -y > $null
$env:CMAKE_INCLUDE_PATH = "eigen-3.3.7;$env:CMAKE_INCLUDE_PATH"
build_script:
- cmake -G "%CMAKE_GENERATOR%" -A "%CMAKE_ARCH%"
-DCMAKE_CXX_STANDARD=14
-DPYBIND11_WERROR=ON
-DDOWNLOAD_CATCH=ON
-DCMAKE_SUPPRESS_REGENERATION=1
.
- set MSBuildLogger="C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
- cmake --build . --config %CONFIG% --target pytest -- /m /v:m /logger:%MSBuildLogger%
- cmake --build . --config %CONFIG% --target cpptest -- /m /v:m /logger:%MSBuildLogger%
on_failure: if exist "tests\test_cmake_build" type tests\test_cmake_build\*.log*

38
3rdparty/pybind11/.clang-format vendored Normal file
View File

@ -0,0 +1,38 @@
---
# See all possible options and defaults with:
# clang-format --style=llvm --dump-config
BasedOnStyle: LLVM
AccessModifierOffset: -4
AllowShortLambdasOnASingleLine: true
AlwaysBreakTemplateDeclarations: Yes
BinPackArguments: false
BinPackParameters: false
BreakBeforeBinaryOperators: All
BreakConstructorInitializers: BeforeColon
ColumnLimit: 99
CommentPragmas: 'NOLINT:.*|^ IWYU pragma:'
IncludeBlocks: Regroup
IndentCaseLabels: true
IndentPPDirectives: AfterHash
IndentWidth: 4
Language: Cpp
SpaceAfterCStyleCast: true
Standard: Cpp11
StatementMacros: ['PyObject_HEAD']
TabWidth: 4
IncludeCategories:
- Regex: '<pybind11/.*'
Priority: -1
- Regex: 'pybind11.h"$'
Priority: 1
- Regex: '^".*/?detail/'
Priority: 1
SortPriority: 2
- Regex: '^"'
Priority: 1
SortPriority: 3
- Regex: '<[[:alnum:]._]+>'
Priority: 4
- Regex: '.*'
Priority: 5
...

77
3rdparty/pybind11/.clang-tidy vendored Normal file
View File

@ -0,0 +1,77 @@
FormatStyle: file
Checks: |
*bugprone*,
*performance*,
clang-analyzer-optin.cplusplus.VirtualCall,
clang-analyzer-optin.performance.Padding,
cppcoreguidelines-init-variables,
cppcoreguidelines-prefer-member-initializer,
cppcoreguidelines-pro-type-static-cast-downcast,
cppcoreguidelines-slicing,
google-explicit-constructor,
llvm-namespace-comment,
misc-definitions-in-headers,
misc-misplaced-const,
misc-non-copyable-objects,
misc-static-assert,
misc-throw-by-value-catch-by-reference,
misc-uniqueptr-reset-release,
misc-unused-parameters,
modernize-avoid-bind,
modernize-loop-convert,
modernize-make-shared,
modernize-redundant-void-arg,
modernize-replace-auto-ptr,
modernize-replace-disallow-copy-and-assign-macro,
modernize-replace-random-shuffle,
modernize-shrink-to-fit,
modernize-use-auto,
modernize-use-bool-literals,
modernize-use-default-member-init,
modernize-use-emplace,
modernize-use-equals-default,
modernize-use-equals-delete,
modernize-use-noexcept,
modernize-use-nullptr,
modernize-use-override,
modernize-use-using,
readability-avoid-const-params-in-decls,
readability-braces-around-statements,
readability-const-return-type,
readability-container-size-empty,
readability-delete-null-pointer,
readability-else-after-return,
readability-implicit-bool-conversion,
readability-inconsistent-declaration-parameter-name,
readability-make-member-function-const,
readability-misplaced-array-index,
readability-non-const-parameter,
readability-qualified-auto,
readability-redundant-function-ptr-dereference,
readability-redundant-smartptr-get,
readability-redundant-string-cstr,
readability-simplify-subscript-expr,
readability-static-accessed-through-instance,
readability-static-definition-in-anonymous-namespace,
readability-string-compare,
readability-suspicious-call-argument,
readability-uniqueptr-delete-release,
-bugprone-easily-swappable-parameters,
-bugprone-exception-escape,
-bugprone-reserved-identifier,
-bugprone-unused-raii,
CheckOptions:
- key: modernize-use-equals-default.IgnoreMacros
value: false
- key: performance-for-range-copy.WarnOnAllAutoCopies
value: true
- key: performance-inefficient-string-concatenation.StrictMode
value: true
- key: performance-unnecessary-value-param.AllowedTypes
value: 'exception_ptr$;'
- key: readability-implicit-bool-conversion.AllowPointerConditions
value: true
HeaderFilterRegex: 'pybind11/.*h'

73
3rdparty/pybind11/.cmake-format.yaml vendored Normal file
View File

@ -0,0 +1,73 @@
parse:
additional_commands:
pybind11_add_module:
flags:
- THIN_LTO
- MODULE
- SHARED
- NO_EXTRAS
- EXCLUDE_FROM_ALL
- SYSTEM
format:
line_width: 99
tab_size: 2
# If an argument group contains more than this many sub-groups
# (parg or kwarg groups) then force it to a vertical layout.
max_subgroups_hwrap: 2
# If a positional argument group contains more than this many
# arguments, then force it to a vertical layout.
max_pargs_hwrap: 6
# If a cmdline positional group consumes more than this many
# lines without nesting, then invalidate the layout (and nest)
max_rows_cmdline: 2
separate_ctrl_name_with_space: false
separate_fn_name_with_space: false
dangle_parens: false
# If the trailing parenthesis must be 'dangled' on its on
# 'line, then align it to this reference: `prefix`: the start'
# 'of the statement, `prefix-indent`: the start of the'
# 'statement, plus one indentation level, `child`: align to'
# the column of the arguments
dangle_align: prefix
# If the statement spelling length (including space and
# parenthesis) is smaller than this amount, then force reject
# nested layouts.
min_prefix_chars: 4
# If the statement spelling length (including space and
# parenthesis) is larger than the tab width by more than this
# amount, then force reject un-nested layouts.
max_prefix_chars: 10
# If a candidate layout is wrapped horizontally but it exceeds
# this many lines, then reject the layout.
max_lines_hwrap: 2
line_ending: unix
# Format command names consistently as 'lower' or 'upper' case
command_case: canonical
# Format keywords consistently as 'lower' or 'upper' case
# unchanged is valid too
keyword_case: 'upper'
# A list of command names which should always be wrapped
always_wrap: []
# If true, the argument lists which are known to be sortable
# will be sorted lexicographically
enable_sort: true
# If true, the parsers may infer whether or not an argument
# list is sortable (without annotation).
autosort: false
# Causes a few issues - can be solved later, possibly.
markup:
enable_markup: false

View File

@ -0,0 +1,24 @@
template <op_id id, op_type ot, typename L = undefined_t, typename R = undefined_t>
template <typename ThisT>
auto &this_ = static_cast<ThisT &>(*this);
if (load_impl<ThisT>(temp, false)) {
ssize_t nd = 0;
auto trivial = broadcast(buffers, nd, shape);
auto ndim = (size_t) nd;
int nd;
ssize_t ndim() const { return detail::array_proxy(m_ptr)->nd; }
using op = op_impl<id, ot, Base, L_type, R_type>;
template <op_id id, op_type ot, typename L, typename R>
template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
class_ &def(const detail::op_<id, ot, L, R> &op, const Extra &...extra) {
class_ &def_cast(const detail::op_<id, ot, L, R> &op, const Extra &...extra) {
@pytest.mark.parametrize("access", ["ro", "rw", "static_ro", "static_rw"])
struct IntStruct {
explicit IntStruct(int v) : value(v){};
~IntStruct() { value = -value; }
IntStruct(const IntStruct &) = default;
IntStruct &operator=(const IntStruct &) = default;
py::class_<IntStruct>(m, "IntStruct").def(py::init([](const int i) { return IntStruct(i); }));
py::implicitly_convertible<int, IntStruct>();
m.def("test", [](int expected, const IntStruct &in) {
[](int expected, const IntStruct &in) {

1
3rdparty/pybind11/.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
docs/*.svg binary

9
3rdparty/pybind11/.github/CODEOWNERS vendored Normal file
View File

@ -0,0 +1,9 @@
*.cmake @henryiii
CMakeLists.txt @henryiii
*.yml @henryiii
*.yaml @henryiii
/tools/ @henryiii
/pybind11/ @henryiii
noxfile.py @henryiii
.clang-format @henryiii
.clang-tidy @henryiii

View File

@ -0,0 +1,388 @@
Thank you for your interest in this project! Please refer to the following
sections on how to contribute code and bug reports.
### Reporting bugs
Before submitting a question or bug report, please take a moment of your time
and ensure that your issue isn't already discussed in the project documentation
provided at [pybind11.readthedocs.org][] or in the [issue tracker][]. You can
also check [gitter][] to see if it came up before.
Assuming that you have identified a previously unknown problem or an important
question, it's essential that you submit a self-contained and minimal piece of
code that reproduces the problem. In other words: no external dependencies,
isolate the function(s) that cause breakage, submit matched and complete C++
and Python snippets that can be easily compiled and run in isolation; or
ideally make a small PR with a failing test case that can be used as a starting
point.
## Pull requests
Contributions are submitted, reviewed, and accepted using GitHub pull requests.
Please refer to [this article][using pull requests] for details and adhere to
the following rules to make the process as smooth as possible:
* Make a new branch for every feature you're working on.
* Make small and clean pull requests that are easy to review but make sure they
do add value by themselves.
* Add tests for any new functionality and run the test suite (`cmake --build
build --target pytest`) to ensure that no existing features break.
* Please run [`pre-commit`][pre-commit] to check your code matches the
project style. (Note that `gawk` is required.) Use `pre-commit run
--all-files` before committing (or use installed-mode, check pre-commit docs)
to verify your code passes before pushing to save time.
* This project has a strong focus on providing general solutions using a
minimal amount of code, thus small pull requests are greatly preferred.
### Licensing of contributions
pybind11 is provided under a BSD-style license that can be found in the
``LICENSE`` file. By using, distributing, or contributing to this project, you
agree to the terms and conditions of this license.
You are under no obligation whatsoever to provide any bug fixes, patches, or
upgrades to the features, functionality or performance of the source code
("Enhancements") to anyone; however, if you choose to make your Enhancements
available either publicly, or directly to the author of this software, without
imposing a separate written license agreement for such Enhancements, then you
hereby grant the following license: a non-exclusive, royalty-free perpetual
license to install, use, modify, prepare derivative works, incorporate into
other computer software, distribute, and sublicense such enhancements or
derivative works thereof, in binary and source code form.
## Development of pybind11
### Quick setup
To setup a quick development environment, use [`nox`](https://nox.thea.codes).
This will allow you to do some common tasks with minimal setup effort, but will
take more time to run and be less flexible than a full development environment.
If you use [`pipx run nox`](https://pipx.pypa.io), you don't even need to
install `nox`. Examples:
```bash
# List all available sessions
nox -l
# Run linters
nox -s lint
# Run tests on Python 3.9
nox -s tests-3.9
# Build and preview docs
nox -s docs -- serve
# Build SDists and wheels
nox -s build
```
### Full setup
To setup an ideal development environment, run the following commands on a
system with CMake 3.14+:
```bash
python3 -m venv venv
source venv/bin/activate
pip install -r tests/requirements.txt
cmake -S . -B build -DDOWNLOAD_CATCH=ON -DDOWNLOAD_EIGEN=ON
cmake --build build -j4
```
Tips:
* You can use `virtualenv` (faster, from PyPI) instead of `venv`.
* You can select any name for your environment folder; if it contains "env" it
will be ignored by git.
* If you don't have CMake 3.14+, just add "cmake" to the pip install command.
* You can use `-DPYBIND11_FINDPYTHON=ON` to use FindPython on CMake 3.12+
* In classic mode, you may need to set `-DPYTHON_EXECUTABLE=/path/to/python`.
FindPython uses `-DPython_ROOT_DIR=/path/to` or
`-DPython_EXECUTABLE=/path/to/python`.
### Configuration options
In CMake, configuration options are given with "-D". Options are stored in the
build directory, in the `CMakeCache.txt` file, so they are remembered for each
build directory. Two selections are special - the generator, given with `-G`,
and the compiler, which is selected based on environment variables `CXX` and
similar, or `-DCMAKE_CXX_COMPILER=`. Unlike the others, these cannot be changed
after the initial run.
The valid options are:
* `-DCMAKE_BUILD_TYPE`: Release, Debug, MinSizeRel, RelWithDebInfo
* `-DPYBIND11_FINDPYTHON=ON`: Use CMake 3.12+'s FindPython instead of the
classic, deprecated, custom FindPythonLibs
* `-DPYBIND11_NOPYTHON=ON`: Disable all Python searching (disables tests)
* `-DBUILD_TESTING=ON`: Enable the tests
* `-DDOWNLOAD_CATCH=ON`: Download catch to build the C++ tests
* `-DDOWNLOAD_EIGEN=ON`: Download Eigen for the NumPy tests
* `-DPYBIND11_INSTALL=ON/OFF`: Enable the install target (on by default for the
master project)
* `-DUSE_PYTHON_INSTALL_DIR=ON`: Try to install into the python dir
<details><summary>A few standard CMake tricks: (click to expand)</summary><p>
* Use `cmake --build build -v` to see the commands used to build the files.
* Use `cmake build -LH` to list the CMake options with help.
* Use `ccmake` if available to see a curses (terminal) gui, or `cmake-gui` for
a completely graphical interface (not present in the PyPI package).
* Use `cmake --build build -j12` to build with 12 cores (for example).
* Use `-G` and the name of a generator to use something different. `cmake
--help` lists the generators available.
- On Unix, setting `CMAKE_GENERATER=Ninja` in your environment will give
you automatic multithreading on all your CMake projects!
* Open the `CMakeLists.txt` with QtCreator to generate for that IDE.
* You can use `-DCMAKE_EXPORT_COMPILE_COMMANDS=ON` to generate the `.json` file
that some tools expect.
</p></details>
To run the tests, you can "build" the check target:
```bash
cmake --build build --target check
```
`--target` can be spelled `-t` in CMake 3.15+. You can also run individual
tests with these targets:
* `pytest`: Python tests only, using the
[pytest](https://docs.pytest.org/en/stable/) framework
* `cpptest`: C++ tests only
* `test_cmake_build`: Install / subdirectory tests
If you want to build just a subset of tests, use
`-DPYBIND11_TEST_OVERRIDE="test_callbacks;test_pickling"`. If this is
empty, all tests will be built. Tests are specified without an extension if they need both a .py and
.cpp file.
You may also pass flags to the `pytest` target by editing `tests/pytest.ini` or
by using the `PYTEST_ADDOPTS` environment variable
(see [`pytest` docs](https://docs.pytest.org/en/2.7.3/customize.html#adding-default-options)). As an example:
```bash
env PYTEST_ADDOPTS="--capture=no --exitfirst" \
cmake --build build --target pytest
# Or using abbreviated flags
env PYTEST_ADDOPTS="-s -x" cmake --build build --target pytest
```
### Formatting
All formatting is handled by pre-commit.
Install with brew (macOS) or pip (any OS):
```bash
# Any OS
python3 -m pip install pre-commit
# OR macOS with homebrew:
brew install pre-commit
```
Then, you can run it on the items you've added to your staging area, or all
files:
```bash
pre-commit run
# OR
pre-commit run --all-files
```
And, if you want to always use it, you can install it as a git hook (hence the
name, pre-commit):
```bash
pre-commit install
```
### Clang-Format
As of v2.6.2, pybind11 ships with a [`clang-format`][clang-format]
configuration file at the top level of the repo (the filename is
`.clang-format`). Currently, formatting is NOT applied automatically, but
manually using `clang-format` for newly developed files is highly encouraged.
To check if a file needs formatting:
```bash
clang-format -style=file --dry-run some.cpp
```
The output will show things to be fixed, if any. To actually format the file:
```bash
clang-format -style=file -i some.cpp
```
Note that the `-style-file` option searches the parent directories for the
`.clang-format` file, i.e. the commands above can be run in any subdirectory
of the pybind11 repo.
### Clang-Tidy
[`clang-tidy`][clang-tidy] performs deeper static code analyses and is
more complex to run, compared to `clang-format`, but support for `clang-tidy`
is built into the pybind11 CMake configuration. To run `clang-tidy`, the
following recipe should work. Run the `docker` command from the top-level
directory inside your pybind11 git clone. Files will be modified in place,
so you can use git to monitor the changes.
```bash
docker run --rm -v $PWD:/mounted_pybind11 -it silkeh/clang:15-bullseye
apt-get update && apt-get install -y git python3-dev python3-pytest
cmake -S /mounted_pybind11/ -B build -DCMAKE_CXX_CLANG_TIDY="$(which clang-tidy);--use-color" -DDOWNLOAD_EIGEN=ON -DDOWNLOAD_CATCH=ON -DCMAKE_CXX_STANDARD=17
cmake --build build -j 2
```
You can add `--fix` to the options list if you want.
### Include what you use
To run include what you use, install (`brew install include-what-you-use` on
macOS), then run:
```bash
cmake -S . -B build-iwyu -DCMAKE_CXX_INCLUDE_WHAT_YOU_USE=$(which include-what-you-use)
cmake --build build
```
The report is sent to stderr; you can pipe it into a file if you wish.
### Build recipes
This builds with the Intel compiler (assuming it is in your path, along with a
recent CMake and Python):
```bash
python3 -m venv venv
. venv/bin/activate
pip install pytest
cmake -S . -B build-intel -DCMAKE_CXX_COMPILER=$(which icpc) -DDOWNLOAD_CATCH=ON -DDOWNLOAD_EIGEN=ON -DPYBIND11_WERROR=ON
```
This will test the PGI compilers:
```bash
docker run --rm -it -v $PWD:/pybind11 nvcr.io/hpc/pgi-compilers:ce
apt-get update && apt-get install -y python3-dev python3-pip python3-pytest
wget -qO- "https://cmake.org/files/v3.18/cmake-3.18.2-Linux-x86_64.tar.gz" | tar --strip-components=1 -xz -C /usr/local
cmake -S pybind11/ -B build
cmake --build build
```
### Explanation of the SDist/wheel building design
> These details below are _only_ for packaging the Python sources from git. The
> SDists and wheels created do not have any extra requirements at all and are
> completely normal.
The main objective of the packaging system is to create SDists (Python's source
distribution packages) and wheels (Python's binary distribution packages) that
include everything that is needed to work with pybind11, and which can be
installed without any additional dependencies. This is more complex than it
appears: in order to support CMake as a first class language even when using
the PyPI package, they must include the _generated_ CMake files (so as not to
require CMake when installing the `pybind11` package itself). They should also
provide the option to install to the "standard" location
(`<ENVROOT>/include/pybind11` and `<ENVROOT>/share/cmake/pybind11`) so they are
easy to find with CMake, but this can cause problems if you are not an
environment or using ``pyproject.toml`` requirements. This was solved by having
two packages; the "nice" pybind11 package that stores the includes and CMake
files inside the package, that you get access to via functions in the package,
and a `pybind11-global` package that can be included via `pybind11[global]` if
you want the more invasive but discoverable file locations.
If you want to install or package the GitHub source, it is best to have Pip 10
or newer on Windows, macOS, or Linux (manylinux1 compatible, includes most
distributions). You can then build the SDists, or run any procedure that makes
SDists internally, like making wheels or installing.
```bash
# Editable development install example
python3 -m pip install -e .
```
Since Pip itself does not have an `sdist` command (it does have `wheel` and
`install`), you may want to use the upcoming `build` package:
```bash
python3 -m pip install build
# Normal package
python3 -m build -s .
# Global extra
PYBIND11_GLOBAL_SDIST=1 python3 -m build -s .
```
If you want to use the classic "direct" usage of `python setup.py`, you will
need CMake 3.15+ and either `make` or `ninja` preinstalled (possibly via `pip
install cmake ninja`), since directly running Python on `setup.py` cannot pick
up and install `pyproject.toml` requirements. As long as you have those two
things, though, everything works the way you would expect:
```bash
# Normal package
python3 setup.py sdist
# Global extra
PYBIND11_GLOBAL_SDIST=1 python3 setup.py sdist
```
A detailed explanation of the build procedure design for developers wanting to
work on or maintain the packaging system is as follows:
#### 1. Building from the source directory
When you invoke any `setup.py` command from the source directory, including
`pip wheel .` and `pip install .`, you will activate a full source build. This
is made of the following steps:
1. If the tool is PEP 518 compliant, like Pip 10+, it will create a temporary
virtual environment and install the build requirements (mostly CMake) into
it. (if you are not on Windows, macOS, or a manylinux compliant system, you
can disable this with `--no-build-isolation` as long as you have CMake 3.15+
installed)
2. The environment variable `PYBIND11_GLOBAL_SDIST` is checked - if it is set
and truthy, this will be make the accessory `pybind11-global` package,
instead of the normal `pybind11` package. This package is used for
installing the files directly to your environment root directory, using
`pybind11[global]`.
2. `setup.py` reads the version from `pybind11/_version.py` and verifies it
matches `includes/pybind11/detail/common.h`.
3. CMake is run with `-DCMAKE_INSTALL_PREIFX=pybind11`. Since the CMake install
procedure uses only relative paths and is identical on all platforms, these
files are valid as long as they stay in the correct relative position to the
includes. `pybind11/share/cmake/pybind11` has the CMake files, and
`pybind11/include` has the includes. The build directory is discarded.
4. Simpler files are placed in the SDist: `tools/setup_*.py.in`,
`tools/pyproject.toml` (`main` or `global`)
5. The package is created by running the setup function in the
`tools/setup_*.py`. `setup_main.py` fills in Python packages, and
`setup_global.py` fills in only the data/header slots.
6. A context manager cleans up the temporary CMake install directory (even if
an error is thrown).
### 2. Building from SDist
Since the SDist has the rendered template files in `tools` along with the
includes and CMake files in the correct locations, the builds are completely
trivial and simple. No extra requirements are required. You can even use Pip 9
if you really want to.
[pre-commit]: https://pre-commit.com
[clang-format]: https://clang.llvm.org/docs/ClangFormat.html
[clang-tidy]: https://clang.llvm.org/extra/clang-tidy/
[pybind11.readthedocs.org]: http://pybind11.readthedocs.org/en/latest
[issue tracker]: https://github.com/pybind/pybind11/issues
[gitter]: https://gitter.im/pybind/Lobby
[using pull requests]: https://help.github.com/articles/using-pull-requests

View File

@ -0,0 +1,61 @@
name: Bug Report
description: File an issue about a bug
title: "[BUG]: "
labels: [triage]
body:
- type: markdown
attributes:
value: |
Please do your best to make the issue as easy to act on as possible, and only submit here if there is clearly a problem with pybind11 (ask first if unsure). **Note that a reproducer in a PR is much more likely to get immediate attention.**
- type: checkboxes
id: steps
attributes:
label: Required prerequisites
description: Make sure you've completed the following steps before submitting your issue -- thank you!
options:
- label: Make sure you've read the [documentation](https://pybind11.readthedocs.io). Your issue may be addressed there.
required: true
- label: Search the [issue tracker](https://github.com/pybind/pybind11/issues) and [Discussions](https:/pybind/pybind11/discussions) to verify that this hasn't already been reported. +1 or comment there if it has.
required: true
- label: Consider asking first in the [Gitter chat room](https://gitter.im/pybind/Lobby) or in a [Discussion](https:/pybind/pybind11/discussions/new).
required: false
- type: input
id: version
attributes:
label: What version (or hash if on master) of pybind11 are you using?
validations:
required: true
- type: textarea
id: description
attributes:
label: Problem description
placeholder: >-
Provide a short description, state the expected behavior and what
actually happens. Include relevant information like what version of
pybind11 you are using, what system you are on, and any useful commands
/ output.
validations:
required: true
- type: textarea
id: code
attributes:
label: Reproducible example code
placeholder: >-
The code should be minimal, have no external dependencies, isolate the
function(s) that cause breakage. Submit matched and complete C++ and
Python snippets that can be easily compiled and run to diagnose the
issue. — Note that a reproducer in a PR is much more likely to get
immediate attention: failing tests in the pybind11 CI are the best
starting point for working out fixes.
render: text
- type: input
id: regression
attributes:
label: Is this a regression? Put the last known working version here if it is.
description: Put the last known working version here if this is a regression.
value: Not a regression

View File

@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Ask a question
url: https://github.com/pybind/pybind11/discussions/new
about: Please ask and answer questions here, or propose new ideas.
- name: Gitter room
url: https://gitter.im/pybind/Lobby
about: A room for discussing pybind11 with an active community

View File

@ -0,0 +1,15 @@
version: 2
updates:
# Maintain dependencies for GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
groups:
actions:
patterns:
- "*"
ignore:
- dependency-name: actions/checkout
versions:
- "<5"

8
3rdparty/pybind11/.github/labeler.yml vendored Normal file
View File

@ -0,0 +1,8 @@
docs:
- any:
- 'docs/**/*.rst'
- '!docs/changelog.rst'
- '!docs/upgrade.rst'
ci:
- '.github/workflows/*.yml'

View File

@ -0,0 +1,3 @@
needs changelog:
- all:
- '!docs/changelog.rst'

View File

@ -0,0 +1,19 @@
<!--
Title (above): please place [branch_name] at the beginning if you are targeting a branch other than master. *Do not target stable*.
It is recommended to use conventional commit format, see conventionalcommits.org, but not required.
-->
## Description
<!-- Include relevant issues or PRs here, describe what changed and why -->
## Suggested changelog entry:
<!-- Fill in the below block with the expected RestructuredText entry. Delete if no entry needed;
but do not delete header or rst block if an entry is needed! Will be collected via a script. -->
```rst
```
<!-- If the upgrade guide needs updating, note that here too -->

1202
3rdparty/pybind11/.github/workflows/ci.yml vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,92 @@
name: Config
on:
workflow_dispatch:
pull_request:
push:
branches:
- master
- stable
- v*
permissions:
contents: read
env:
PIP_BREAK_SYSTEM_PACKAGES: 1
# For cmake:
VERBOSE: 1
jobs:
# This tests various versions of CMake in various combinations, to make sure
# the configure step passes.
cmake:
strategy:
fail-fast: false
matrix:
runs-on: [ubuntu-20.04, macos-latest, windows-latest]
arch: [x64]
cmake: ["3.26"]
include:
- runs-on: ubuntu-20.04
arch: x64
cmake: "3.5"
- runs-on: ubuntu-20.04
arch: x64
cmake: "3.27"
- runs-on: macos-latest
arch: x64
cmake: "3.7"
- runs-on: windows-2019
arch: x64 # x86 compilers seem to be missing on 2019 image
cmake: "3.18"
name: 🐍 3.7 • CMake ${{ matrix.cmake }} • ${{ matrix.runs-on }}
runs-on: ${{ matrix.runs-on }}
steps:
- uses: actions/checkout@v4
- name: Setup Python 3.7
uses: actions/setup-python@v5
with:
python-version: 3.7
architecture: ${{ matrix.arch }}
- name: Prepare env
run: python -m pip install -r tests/requirements.txt
# An action for adding a specific version of CMake:
# https://github.com/jwlawson/actions-setup-cmake
- name: Setup CMake ${{ matrix.cmake }}
uses: jwlawson/actions-setup-cmake@v2.0
with:
cmake-version: ${{ matrix.cmake }}
# These steps use a directory with a space in it intentionally
- name: Make build directories
run: mkdir "build dir"
- name: Configure
working-directory: build dir
shell: bash
run: >
cmake ..
-DPYBIND11_WERROR=ON
-DDOWNLOAD_CATCH=ON
-DPYTHON_EXECUTABLE=$(python -c "import sys; print(sys.executable)")
# Only build and test if this was manually triggered in the GitHub UI
- name: Build
working-directory: build dir
if: github.event_name == 'workflow_dispatch'
run: cmake --build . --config Release
- name: Test
working-directory: build dir
if: github.event_name == 'workflow_dispatch'
run: cmake --build . --config Release --target check

View File

@ -0,0 +1,60 @@
# This is a format job. Pre-commit has a first-party GitHub action, so we use
# that: https://github.com/pre-commit/action
name: Format
on:
workflow_dispatch:
pull_request:
push:
branches:
- master
- stable
- "v*"
permissions:
contents: read
env:
FORCE_COLOR: 3
# For cmake:
VERBOSE: 1
jobs:
pre-commit:
name: Format
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.x"
- name: Add matchers
run: echo "::add-matcher::$GITHUB_WORKSPACE/.github/matchers/pylint.json"
- uses: pre-commit/action@v3.0.1
with:
# Slow hooks are marked with manual - slow is okay here, run them too
extra_args: --hook-stage manual --all-files
clang-tidy:
# When making changes here, please also review the "Clang-Tidy" section
# in .github/CONTRIBUTING.md and update as needed.
name: Clang-Tidy
runs-on: ubuntu-latest
container: silkeh/clang:15-bullseye
steps:
- uses: actions/checkout@v4
- name: Install requirements
run: apt-get update && apt-get install -y git python3-dev python3-pytest
- name: Configure
run: >
cmake -S . -B build
-DCMAKE_CXX_CLANG_TIDY="$(which clang-tidy);--use-color;--warnings-as-errors=*"
-DDOWNLOAD_EIGEN=ON
-DDOWNLOAD_CATCH=ON
-DCMAKE_CXX_STANDARD=17
- name: Build
run: cmake --build build -j 2 -- --keep-going

View File

@ -0,0 +1,25 @@
name: Labeler
on:
pull_request_target:
types: [closed]
permissions: {}
jobs:
label:
name: Labeler
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/labeler@v4
if: >
github.event.pull_request.merged == true &&
!startsWith(github.event.pull_request.title, 'chore(deps):') &&
!startsWith(github.event.pull_request.title, 'ci(fix):') &&
!startsWith(github.event.pull_request.title, 'docs(changelog):')
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
configuration-path: .github/labeler_merged.yml

View File

@ -0,0 +1,114 @@
name: Pip
on:
workflow_dispatch:
pull_request:
push:
branches:
- master
- stable
- v*
release:
types:
- published
permissions:
contents: read
env:
PIP_BREAK_SYSTEM_PACKAGES: 1
PIP_ONLY_BINARY: numpy
jobs:
# This builds the sdists and wheels and makes sure the files are exactly as
# expected. Using Windows and Python 3.6, since that is often the most
# challenging matrix element.
test-packaging:
name: 🐍 3.6 • 📦 tests • windows-latest
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Setup 🐍 3.6
uses: actions/setup-python@v5
with:
python-version: 3.6
- name: Prepare env
run: |
python -m pip install -r tests/requirements.txt
- name: Python Packaging tests
run: pytest tests/extra_python_package/
# This runs the packaging tests and also builds and saves the packages as
# artifacts.
packaging:
name: 🐍 3.8 • 📦 & 📦 tests • ubuntu-latest
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup 🐍 3.8
uses: actions/setup-python@v5
with:
python-version: 3.8
- name: Prepare env
run: |
python -m pip install -r tests/requirements.txt build twine
- name: Python Packaging tests
run: pytest tests/extra_python_package/
- name: Build SDist and wheels
run: |
python -m build
PYBIND11_GLOBAL_SDIST=1 python -m build
- name: Check metadata
run: twine check dist/*
- name: Save standard package
uses: actions/upload-artifact@v4
with:
name: standard
path: dist/pybind11-*
- name: Save global package
uses: actions/upload-artifact@v4
with:
name: global
path: dist/pybind11_global-*
# When a GitHub release is made, upload the artifacts to PyPI
upload:
name: Upload to PyPI
runs-on: ubuntu-latest
if: github.event_name == 'release' && github.event.action == 'published'
needs: [packaging]
steps:
- uses: actions/setup-python@v5
with:
python-version: "3.x"
# Downloads all to directories matching the artifact names
- uses: actions/download-artifact@v4
- name: Publish standard package
uses: pypa/gh-action-pypi-publish@release/v1
with:
password: ${{ secrets.pypi_password }}
packages-dir: standard/
- name: Publish global package
uses: pypa/gh-action-pypi-publish@release/v1
with:
password: ${{ secrets.pypi_password_global }}
packages-dir: global/

View File

@ -0,0 +1,116 @@
name: Upstream
on:
workflow_dispatch:
pull_request:
permissions:
contents: read
concurrency:
group: upstream-${{ github.ref }}
cancel-in-progress: true
env:
PIP_BREAK_SYSTEM_PACKAGES: 1
# For cmake:
VERBOSE: 1
jobs:
standard:
name: "🐍 3.13 latest • ubuntu-latest • x64"
runs-on: ubuntu-latest
# Only runs when the 'python dev' label is selected
if: "contains(github.event.pull_request.labels.*.name, 'python dev')"
steps:
- uses: actions/checkout@v4
- name: Setup Python 3.13
uses: actions/setup-python@v5
with:
python-version: "3.13"
allow-prereleases: true
- name: Setup Boost
run: sudo apt-get install libboost-dev
- name: Update CMake
uses: jwlawson/actions-setup-cmake@v2.0
- name: Run pip installs
run: |
python -m pip install --upgrade pip
python -m pip install -r tests/requirements.txt
- name: Show platform info
run: |
python -m platform
cmake --version
pip list
# First build - C++11 mode and inplace
- name: Configure C++11
run: >
cmake -S . -B build11
-DPYBIND11_WERROR=ON
-DDOWNLOAD_CATCH=ON
-DDOWNLOAD_EIGEN=ON
-DCMAKE_CXX_STANDARD=11
-DCMAKE_BUILD_TYPE=Debug
- name: Build C++11
run: cmake --build build11 -j 2
- name: Python tests C++11
run: cmake --build build11 --target pytest -j 2
- name: C++11 tests
run: cmake --build build11 --target cpptest -j 2
- name: Interface test C++11
run: cmake --build build11 --target test_cmake_build
# Second build - C++17 mode and in a build directory
- name: Configure C++17
run: >
cmake -S . -B build17
-DPYBIND11_WERROR=ON
-DDOWNLOAD_CATCH=ON
-DDOWNLOAD_EIGEN=ON
-DCMAKE_CXX_STANDARD=17
- name: Build C++17
run: cmake --build build17 -j 2
- name: Python tests C++17
run: cmake --build build17 --target pytest
- name: C++17 tests
run: cmake --build build17 --target cpptest
# Third build - C++17 mode with unstable ABI
- name: Configure (unstable ABI)
run: >
cmake -S . -B build17max
-DPYBIND11_WERROR=ON
-DDOWNLOAD_CATCH=ON
-DDOWNLOAD_EIGEN=ON
-DCMAKE_CXX_STANDARD=17
-DPYBIND11_INTERNALS_VERSION=10000000
- name: Build (unstable ABI)
run: cmake --build build17max -j 2
- name: Python tests (unstable ABI)
run: cmake --build build17max --target pytest
- name: Interface test (unstable ABI)
run: cmake --build build17max --target test_cmake_build
# This makes sure the setup_helpers module can build packages using
# setuptools
- name: Setuptools helpers test
run: |
pip install setuptools
pytest tests/extra_setuptools

46
3rdparty/pybind11/.gitignore vendored Normal file
View File

@ -0,0 +1,46 @@
CMakeCache.txt
CMakeFiles
Makefile
cmake_install.cmake
cmake_uninstall.cmake
.DS_Store
*.so
*.pyd
*.dll
*.sln
*.sdf
*.opensdf
*.vcxproj
*.vcxproj.user
*.filters
example.dir
Win32
x64
Release
Debug
.vs
CTestTestfile.cmake
Testing
autogen
MANIFEST
/.ninja_*
/*.ninja
/docs/.build
*.py[co]
*.egg-info
*~
.*.swp
.DS_Store
/dist
/*build*
.cache/
sosize-*.txt
pybind11Config*.cmake
pybind11Targets.cmake
/*env*
/.vscode
/pybind11/include/*
/pybind11/share/*
/docs/_build/*
.ipynb_checkpoints/
tests/main.cpp

View File

@ -0,0 +1,155 @@
# To use:
#
# pre-commit run -a
#
# Or:
#
# pre-commit install # (runs every time you commit in git)
#
# To update this file:
#
# pre-commit autoupdate
#
# See https://github.com/pre-commit/pre-commit
ci:
autoupdate_commit_msg: "chore(deps): update pre-commit hooks"
autofix_commit_msg: "style: pre-commit fixes"
autoupdate_schedule: monthly
# third-party content
exclude: ^tools/JoinPaths.cmake$
repos:
# Clang format the codebase automatically
- repo: https://github.com/pre-commit/mirrors-clang-format
rev: "v17.0.6"
hooks:
- id: clang-format
types_or: [c++, c, cuda]
# Ruff, the Python auto-correcting linter/formatter written in Rust
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.2.0
hooks:
- id: ruff
args: ["--fix", "--show-fixes"]
- id: ruff-format
# Check static types with mypy
- repo: https://github.com/pre-commit/mirrors-mypy
rev: "v1.8.0"
hooks:
- id: mypy
args: []
exclude: ^(tests|docs)/
additional_dependencies:
- markdown-it-py<3 # Drop this together with dropping Python 3.7 support.
- nox
- rich
- types-setuptools
# CMake formatting
- repo: https://github.com/cheshirekow/cmake-format-precommit
rev: "v0.6.13"
hooks:
- id: cmake-format
additional_dependencies: [pyyaml]
types: [file]
files: (\.cmake|CMakeLists.txt)(.in)?$
# Standard hooks
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: "v4.5.0"
hooks:
- id: check-added-large-files
- id: check-case-conflict
- id: check-docstring-first
- id: check-merge-conflict
- id: check-symlinks
- id: check-toml
- id: check-yaml
- id: debug-statements
- id: end-of-file-fixer
- id: mixed-line-ending
- id: requirements-txt-fixer
- id: trailing-whitespace
# Also code format the docs
- repo: https://github.com/asottile/blacken-docs
rev: "1.16.0"
hooks:
- id: blacken-docs
additional_dependencies:
- black==23.*
# Changes tabs to spaces
- repo: https://github.com/Lucas-C/pre-commit-hooks
rev: "v1.5.4"
hooks:
- id: remove-tabs
# Avoid directional quotes
- repo: https://github.com/sirosen/texthooks
rev: "0.6.4"
hooks:
- id: fix-ligatures
- id: fix-smartquotes
# Checking for common mistakes
- repo: https://github.com/pre-commit/pygrep-hooks
rev: "v1.10.0"
hooks:
- id: rst-backticks
- id: rst-directive-colons
- id: rst-inline-touching-normal
# Checks the manifest for missing files (native support)
- repo: https://github.com/mgedmin/check-manifest
rev: "0.49"
hooks:
- id: check-manifest
# This is a slow hook, so only run this if --hook-stage manual is passed
stages: [manual]
additional_dependencies: [cmake, ninja]
# Check for spelling
# Use tools/codespell_ignore_lines_from_errors.py
# to rebuild .codespell-ignore-lines
- repo: https://github.com/codespell-project/codespell
rev: "v2.2.6"
hooks:
- id: codespell
exclude: ".supp$"
args: ["-x.codespell-ignore-lines", "-Lccompiler"]
# Check for common shell mistakes
- repo: https://github.com/shellcheck-py/shellcheck-py
rev: "v0.9.0.6"
hooks:
- id: shellcheck
# Disallow some common capitalization mistakes
- repo: local
hooks:
- id: disallow-caps
name: Disallow improper capitalization
language: pygrep
entry: PyBind|\bNumpy\b|Cmake|CCache|PyTest
exclude: ^\.pre-commit-config.yaml$
# PyLint has native support - not always usable, but works for us
- repo: https://github.com/PyCQA/pylint
rev: "v3.0.3"
hooks:
- id: pylint
files: ^pybind11
- repo: https://github.com/python-jsonschema/check-jsonschema
rev: 0.28.0
hooks:
- id: check-readthedocs
- id: check-github-workflows
- id: check-dependabot

20
3rdparty/pybind11/.readthedocs.yml vendored Normal file
View File

@ -0,0 +1,20 @@
# https://blog.readthedocs.com/migrate-configuration-v2/
version: 2
build:
os: ubuntu-22.04
apt_packages:
- librsvg2-bin
tools:
python: "3.11"
sphinx:
configuration: docs/conf.py
python:
install:
- requirements: docs/requirements.txt
formats:
- pdf

374
3rdparty/pybind11/CMakeLists.txt vendored Normal file
View File

@ -0,0 +1,374 @@
# CMakeLists.txt -- Build system for the pybind11 modules
#
# Copyright (c) 2015 Wenzel Jakob <wenzel@inf.ethz.ch>
#
# All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
# Propagate this policy (FindPythonInterp removal) so it can be detected later
if(NOT CMAKE_VERSION VERSION_LESS "3.27")
cmake_policy(GET CMP0148 _pybind11_cmp0148)
endif()
cmake_minimum_required(VERSION 3.5)
# The `cmake_minimum_required(VERSION 3.5...3.27)` syntax does not work with
# some versions of VS that have a patched CMake 3.11. This forces us to emulate
# the behavior using the following workaround:
if(${CMAKE_VERSION} VERSION_LESS 3.27)
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
else()
cmake_policy(VERSION 3.27)
endif()
if(_pybind11_cmp0148)
cmake_policy(SET CMP0148 ${_pybind11_cmp0148})
unset(_pybind11_cmp0148)
endif()
# Avoid infinite recursion if tests include this as a subdirectory
if(DEFINED PYBIND11_MASTER_PROJECT)
return()
endif()
# Extract project version from source
file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/include/pybind11/detail/common.h"
pybind11_version_defines REGEX "#define PYBIND11_VERSION_(MAJOR|MINOR|PATCH) ")
foreach(ver ${pybind11_version_defines})
if(ver MATCHES [[#define PYBIND11_VERSION_(MAJOR|MINOR|PATCH) +([^ ]+)$]])
set(PYBIND11_VERSION_${CMAKE_MATCH_1} "${CMAKE_MATCH_2}")
endif()
endforeach()
if(PYBIND11_VERSION_PATCH MATCHES [[\.([a-zA-Z0-9]+)$]])
set(pybind11_VERSION_TYPE "${CMAKE_MATCH_1}")
endif()
string(REGEX MATCH "^[0-9]+" PYBIND11_VERSION_PATCH "${PYBIND11_VERSION_PATCH}")
project(
pybind11
LANGUAGES CXX
VERSION "${PYBIND11_VERSION_MAJOR}.${PYBIND11_VERSION_MINOR}.${PYBIND11_VERSION_PATCH}")
# Standard includes
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
include(CMakeDependentOption)
if(NOT pybind11_FIND_QUIETLY)
message(STATUS "pybind11 v${pybind11_VERSION} ${pybind11_VERSION_TYPE}")
endif()
# Check if pybind11 is being used directly or via add_subdirectory
if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
### Warn if not an out-of-source builds
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
set(lines
"You are building in-place. If that is not what you intended to "
"do, you can clean the source directory with:\n"
"rm -r CMakeCache.txt CMakeFiles/ cmake_uninstall.cmake pybind11Config.cmake "
"pybind11ConfigVersion.cmake tests/CMakeFiles/\n")
message(AUTHOR_WARNING ${lines})
endif()
set(PYBIND11_MASTER_PROJECT ON)
if(OSX AND CMAKE_VERSION VERSION_LESS 3.7)
# Bug in macOS CMake < 3.7 is unable to download catch
message(WARNING "CMAKE 3.7+ needed on macOS to download catch, and newer HIGHLY recommended")
elseif(WINDOWS AND CMAKE_VERSION VERSION_LESS 3.8)
# Only tested with 3.8+ in CI.
message(WARNING "CMAKE 3.8+ tested on Windows, previous versions untested")
endif()
message(STATUS "CMake ${CMAKE_VERSION}")
if(CMAKE_CXX_STANDARD)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
endif()
set(pybind11_system "")
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
if(CMAKE_VERSION VERSION_LESS "3.18")
set(_pybind11_findpython_default OFF)
else()
set(_pybind11_findpython_default ON)
endif()
else()
set(PYBIND11_MASTER_PROJECT OFF)
set(pybind11_system SYSTEM)
set(_pybind11_findpython_default OFF)
endif()
# Options
option(PYBIND11_INSTALL "Install pybind11 header files?" ${PYBIND11_MASTER_PROJECT})
option(PYBIND11_TEST "Build pybind11 test suite?" ${PYBIND11_MASTER_PROJECT})
option(PYBIND11_NOPYTHON "Disable search for Python" OFF)
option(PYBIND11_DISABLE_HANDLE_TYPE_NAME_DEFAULT_IMPLEMENTATION
"To enforce that a handle_type_name<> specialization exists" OFF)
option(PYBIND11_SIMPLE_GIL_MANAGEMENT
"Use simpler GIL management logic that does not support disassociation" OFF)
option(PYBIND11_NUMPY_1_ONLY
"Disable NumPy 2 support to avoid changes to previous pybind11 versions." OFF)
set(PYBIND11_INTERNALS_VERSION
""
CACHE STRING "Override the ABI version, may be used to enable the unstable ABI.")
if(PYBIND11_DISABLE_HANDLE_TYPE_NAME_DEFAULT_IMPLEMENTATION)
add_compile_definitions(PYBIND11_DISABLE_HANDLE_TYPE_NAME_DEFAULT_IMPLEMENTATION)
endif()
if(PYBIND11_SIMPLE_GIL_MANAGEMENT)
add_compile_definitions(PYBIND11_SIMPLE_GIL_MANAGEMENT)
endif()
if(PYBIND11_NUMPY_1_ONLY)
add_compile_definitions(PYBIND11_NUMPY_1_ONLY)
endif()
cmake_dependent_option(
USE_PYTHON_INCLUDE_DIR
"Install pybind11 headers in Python include directory instead of default installation prefix"
OFF "PYBIND11_INSTALL" OFF)
cmake_dependent_option(PYBIND11_FINDPYTHON "Force new FindPython" ${_pybind11_findpython_default}
"NOT CMAKE_VERSION VERSION_LESS 3.12" OFF)
# Allow PYTHON_EXECUTABLE if in FINDPYTHON mode and building pybind11's tests
# (makes transition easier while we support both modes).
if(PYBIND11_MASTER_PROJECT
AND PYBIND11_FINDPYTHON
AND DEFINED PYTHON_EXECUTABLE
AND NOT DEFINED Python_EXECUTABLE)
set(Python_EXECUTABLE "${PYTHON_EXECUTABLE}")
endif()
# NB: when adding a header don't forget to also add it to setup.py
set(PYBIND11_HEADERS
include/pybind11/detail/class.h
include/pybind11/detail/common.h
include/pybind11/detail/cpp_conduit.h
include/pybind11/detail/descr.h
include/pybind11/detail/init.h
include/pybind11/detail/internals.h
include/pybind11/detail/type_caster_base.h
include/pybind11/detail/typeid.h
include/pybind11/attr.h
include/pybind11/buffer_info.h
include/pybind11/cast.h
include/pybind11/chrono.h
include/pybind11/common.h
include/pybind11/complex.h
include/pybind11/options.h
include/pybind11/eigen.h
include/pybind11/eigen/common.h
include/pybind11/eigen/matrix.h
include/pybind11/eigen/tensor.h
include/pybind11/embed.h
include/pybind11/eval.h
include/pybind11/gil.h
include/pybind11/gil_safe_call_once.h
include/pybind11/iostream.h
include/pybind11/functional.h
include/pybind11/numpy.h
include/pybind11/operators.h
include/pybind11/pybind11.h
include/pybind11/pytypes.h
include/pybind11/stl.h
include/pybind11/stl_bind.h
include/pybind11/stl/filesystem.h
include/pybind11/type_caster_pyobject_ptr.h
include/pybind11/typing.h)
# Compare with grep and warn if mismatched
if(PYBIND11_MASTER_PROJECT AND NOT CMAKE_VERSION VERSION_LESS 3.12)
file(
GLOB_RECURSE _pybind11_header_check
LIST_DIRECTORIES false
RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
CONFIGURE_DEPENDS "include/pybind11/*.h")
set(_pybind11_here_only ${PYBIND11_HEADERS})
set(_pybind11_disk_only ${_pybind11_header_check})
list(REMOVE_ITEM _pybind11_here_only ${_pybind11_header_check})
list(REMOVE_ITEM _pybind11_disk_only ${PYBIND11_HEADERS})
if(_pybind11_here_only)
message(AUTHOR_WARNING "PYBIND11_HEADERS has extra files:" ${_pybind11_here_only})
endif()
if(_pybind11_disk_only)
message(AUTHOR_WARNING "PYBIND11_HEADERS is missing files:" ${_pybind11_disk_only})
endif()
endif()
# CMake 3.12 added list(TRANSFORM <list> PREPEND
# But we can't use it yet
string(REPLACE "include/" "${CMAKE_CURRENT_SOURCE_DIR}/include/" PYBIND11_HEADERS
"${PYBIND11_HEADERS}")
# Cache variable so this can be used in parent projects
set(pybind11_INCLUDE_DIR
"${CMAKE_CURRENT_LIST_DIR}/include"
CACHE INTERNAL "Directory where pybind11 headers are located")
# Backward compatible variable for add_subdirectory mode
if(NOT PYBIND11_MASTER_PROJECT)
set(PYBIND11_INCLUDE_DIR
"${pybind11_INCLUDE_DIR}"
CACHE INTERNAL "")
endif()
# Note: when creating targets, you cannot use if statements at configure time -
# you need generator expressions, because those will be placed in the target file.
# You can also place ifs *in* the Config.in, but not here.
# This section builds targets, but does *not* touch Python
# Non-IMPORT targets cannot be defined twice
if(NOT TARGET pybind11_headers)
# Build the headers-only target (no Python included):
# (long name used here to keep this from clashing in subdirectory mode)
add_library(pybind11_headers INTERFACE)
add_library(pybind11::pybind11_headers ALIAS pybind11_headers) # to match exported target
add_library(pybind11::headers ALIAS pybind11_headers) # easier to use/remember
target_include_directories(
pybind11_headers ${pybind11_system} INTERFACE $<BUILD_INTERFACE:${pybind11_INCLUDE_DIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
target_compile_features(pybind11_headers INTERFACE cxx_inheriting_constructors cxx_user_literals
cxx_right_angle_brackets)
if(NOT "${PYBIND11_INTERNALS_VERSION}" STREQUAL "")
target_compile_definitions(
pybind11_headers INTERFACE "PYBIND11_INTERNALS_VERSION=${PYBIND11_INTERNALS_VERSION}")
endif()
else()
# It is invalid to install a target twice, too.
set(PYBIND11_INSTALL OFF)
endif()
include("${CMAKE_CURRENT_SOURCE_DIR}/tools/pybind11Common.cmake")
# https://github.com/jtojnar/cmake-snips/#concatenating-paths-when-building-pkg-config-files
# TODO: cmake 3.20 adds the cmake_path() function, which obsoletes this snippet
include("${CMAKE_CURRENT_SOURCE_DIR}/tools/JoinPaths.cmake")
# Relative directory setting
if(USE_PYTHON_INCLUDE_DIR AND DEFINED Python_INCLUDE_DIRS)
file(RELATIVE_PATH CMAKE_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_PREFIX} ${Python_INCLUDE_DIRS})
elseif(USE_PYTHON_INCLUDE_DIR AND DEFINED PYTHON_INCLUDE_DIR)
file(RELATIVE_PATH CMAKE_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_PREFIX} ${PYTHON_INCLUDE_DIRS})
endif()
if(PYBIND11_INSTALL)
install(DIRECTORY ${pybind11_INCLUDE_DIR}/pybind11 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
set(PYBIND11_CMAKECONFIG_INSTALL_DIR
"${CMAKE_INSTALL_DATAROOTDIR}/cmake/${PROJECT_NAME}"
CACHE STRING "install path for pybind11Config.cmake")
if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}")
set(pybind11_INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
else()
set(pybind11_INCLUDEDIR "\$\{PACKAGE_PREFIX_DIR\}/${CMAKE_INSTALL_INCLUDEDIR}")
endif()
configure_package_config_file(
tools/${PROJECT_NAME}Config.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
INSTALL_DESTINATION ${PYBIND11_CMAKECONFIG_INSTALL_DIR})
if(CMAKE_VERSION VERSION_LESS 3.14)
# Remove CMAKE_SIZEOF_VOID_P from ConfigVersion.cmake since the library does
# not depend on architecture specific settings or libraries.
set(_PYBIND11_CMAKE_SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
unset(CMAKE_SIZEOF_VOID_P)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY AnyNewerVersion)
set(CMAKE_SIZEOF_VOID_P ${_PYBIND11_CMAKE_SIZEOF_VOID_P})
else()
# CMake 3.14+ natively supports header-only libraries
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY AnyNewerVersion ARCH_INDEPENDENT)
endif()
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
tools/FindPythonLibsNew.cmake
tools/pybind11Common.cmake
tools/pybind11Tools.cmake
tools/pybind11NewTools.cmake
DESTINATION ${PYBIND11_CMAKECONFIG_INSTALL_DIR})
if(NOT PYBIND11_EXPORT_NAME)
set(PYBIND11_EXPORT_NAME "${PROJECT_NAME}Targets")
endif()
install(TARGETS pybind11_headers EXPORT "${PYBIND11_EXPORT_NAME}")
install(
EXPORT "${PYBIND11_EXPORT_NAME}"
NAMESPACE "pybind11::"
DESTINATION ${PYBIND11_CMAKECONFIG_INSTALL_DIR})
# pkg-config support
if(NOT prefix_for_pc_file)
if(IS_ABSOLUTE "${CMAKE_INSTALL_DATAROOTDIR}")
set(prefix_for_pc_file "${CMAKE_INSTALL_PREFIX}")
else()
set(pc_datarootdir "${CMAKE_INSTALL_DATAROOTDIR}")
if(CMAKE_VERSION VERSION_LESS 3.20)
set(prefix_for_pc_file "\${pcfiledir}/..")
while(pc_datarootdir)
get_filename_component(pc_datarootdir "${pc_datarootdir}" DIRECTORY)
string(APPEND prefix_for_pc_file "/..")
endwhile()
else()
cmake_path(RELATIVE_PATH CMAKE_INSTALL_PREFIX BASE_DIRECTORY CMAKE_INSTALL_DATAROOTDIR
OUTPUT_VARIABLE prefix_for_pc_file)
endif()
endif()
endif()
join_paths(includedir_for_pc_file "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}")
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/tools/pybind11.pc.in"
"${CMAKE_CURRENT_BINARY_DIR}/pybind11.pc" @ONLY)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/pybind11.pc"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig/")
# Uninstall target
if(PYBIND11_MASTER_PROJECT)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY)
add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P
${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
endif()
endif()
# BUILD_TESTING takes priority, but only if this is the master project
if(PYBIND11_MASTER_PROJECT AND DEFINED BUILD_TESTING)
if(BUILD_TESTING)
if(_pybind11_nopython)
message(FATAL_ERROR "Cannot activate tests in NOPYTHON mode")
else()
add_subdirectory(tests)
endif()
endif()
else()
if(PYBIND11_TEST)
if(_pybind11_nopython)
message(FATAL_ERROR "Cannot activate tests in NOPYTHON mode")
else()
add_subdirectory(tests)
endif()
endif()
endif()
# Better symmetry with find_package(pybind11 CONFIG) mode.
if(NOT PYBIND11_MASTER_PROJECT)
set(pybind11_FOUND
TRUE
CACHE INTERNAL "True if pybind11 and all required components found on the system")
endif()

29
3rdparty/pybind11/LICENSE vendored Normal file
View File

@ -0,0 +1,29 @@
Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>, All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Please also refer to the file .github/CONTRIBUTING.md, which clarifies licensing of
external contributions to this project including patches, pull requests, etc.

6
3rdparty/pybind11/MANIFEST.in vendored Normal file
View File

@ -0,0 +1,6 @@
prune tests
recursive-include pybind11/include/pybind11 *.h
recursive-include pybind11 *.py
recursive-include pybind11 py.typed
include pybind11/share/cmake/pybind11/*.cmake
include LICENSE README.rst SECURITY.md pyproject.toml setup.py setup.cfg

181
3rdparty/pybind11/README.rst vendored Normal file
View File

@ -0,0 +1,181 @@
.. figure:: https://github.com/pybind/pybind11/raw/master/docs/pybind11-logo.png
:alt: pybind11 logo
**pybind11 — Seamless operability between C++11 and Python**
|Latest Documentation Status| |Stable Documentation Status| |Gitter chat| |GitHub Discussions| |CI| |Build status|
|Repology| |PyPI package| |Conda-forge| |Python Versions|
`Setuptools example <https://github.com/pybind/python_example>`_
`Scikit-build example <https://github.com/pybind/scikit_build_example>`_
`CMake example <https://github.com/pybind/cmake_example>`_
.. start
**pybind11** is a lightweight header-only library that exposes C++ types
in Python and vice versa, mainly to create Python bindings of existing
C++ code. Its goals and syntax are similar to the excellent
`Boost.Python <http://www.boost.org/doc/libs/1_58_0/libs/python/doc/>`_
library by David Abrahams: to minimize boilerplate code in traditional
extension modules by inferring type information using compile-time
introspection.
The main issue with Boost.Python—and the reason for creating such a
similar project—is Boost. Boost is an enormously large and complex suite
of utility libraries that works with almost every C++ compiler in
existence. This compatibility has its cost: arcane template tricks and
workarounds are necessary to support the oldest and buggiest of compiler
specimens. Now that C++11-compatible compilers are widely available,
this heavy machinery has become an excessively large and unnecessary
dependency.
Think of this library as a tiny self-contained version of Boost.Python
with everything stripped away that isn't relevant for binding
generation. Without comments, the core header files only require ~4K
lines of code and depend on Python (3.6+, or PyPy) and the C++
standard library. This compact implementation was possible thanks to
some C++11 language features (specifically: tuples, lambda functions and
variadic templates). Since its creation, this library has grown beyond
Boost.Python in many ways, leading to dramatically simpler binding code in many
common situations.
Tutorial and reference documentation is provided at
`pybind11.readthedocs.io <https://pybind11.readthedocs.io/en/latest>`_.
A PDF version of the manual is available
`here <https://pybind11.readthedocs.io/_/downloads/en/latest/pdf/>`_.
And the source code is always available at
`github.com/pybind/pybind11 <https://github.com/pybind/pybind11>`_.
Core features
-------------
pybind11 can map the following core C++ features to Python:
- Functions accepting and returning custom data structures per value,
reference, or pointer
- Instance methods and static methods
- Overloaded functions
- Instance attributes and static attributes
- Arbitrary exception types
- Enumerations
- Callbacks
- Iterators and ranges
- Custom operators
- Single and multiple inheritance
- STL data structures
- Smart pointers with reference counting like ``std::shared_ptr``
- Internal references with correct reference counting
- C++ classes with virtual (and pure virtual) methods can be extended
in Python
- Integrated NumPy support (NumPy 2 requires pybind11 2.12+)
Goodies
-------
In addition to the core functionality, pybind11 provides some extra
goodies:
- Python 3.6+, and PyPy3 7.3 are supported with an implementation-agnostic
interface (pybind11 2.9 was the last version to support Python 2 and 3.5).
- It is possible to bind C++11 lambda functions with captured
variables. The lambda capture data is stored inside the resulting
Python function object.
- pybind11 uses C++11 move constructors and move assignment operators
whenever possible to efficiently transfer custom data types.
- It's easy to expose the internal storage of custom data types through
Pythons' buffer protocols. This is handy e.g. for fast conversion
between C++ matrix classes like Eigen and NumPy without expensive
copy operations.
- pybind11 can automatically vectorize functions so that they are
transparently applied to all entries of one or more NumPy array
arguments.
- Python's slice-based access and assignment operations can be
supported with just a few lines of code.
- Everything is contained in just a few header files; there is no need
to link against any additional libraries.
- Binaries are generally smaller by a factor of at least 2 compared to
equivalent bindings generated by Boost.Python. A recent pybind11
conversion of PyRosetta, an enormous Boost.Python binding project,
`reported <https://graylab.jhu.edu/Sergey/2016.RosettaCon/PyRosetta-4.pdf>`_
a binary size reduction of **5.4x** and compile time reduction by
**5.8x**.
- Function signatures are precomputed at compile time (using
``constexpr``), leading to smaller binaries.
- With little extra effort, C++ types can be pickled and unpickled
similar to regular Python objects.
Supported compilers
-------------------
1. Clang/LLVM 3.3 or newer (for Apple Xcode's clang, this is 5.0.0 or
newer)
2. GCC 4.8 or newer
3. Microsoft Visual Studio 2017 or newer
4. Intel classic C++ compiler 18 or newer (ICC 20.2 tested in CI)
5. Cygwin/GCC (previously tested on 2.5.1)
6. NVCC (CUDA 11.0 tested in CI)
7. NVIDIA PGI (20.9 tested in CI)
About
-----
This project was created by `Wenzel
Jakob <http://rgl.epfl.ch/people/wjakob>`_. Significant features and/or
improvements to the code were contributed by Jonas Adler, Lori A. Burns,
Sylvain Corlay, Eric Cousineau, Aaron Gokaslan, Ralf Grosse-Kunstleve, Trent Houliston, Axel
Huebl, @hulucc, Yannick Jadoul, Sergey Lyskov, Johan Mabille, Tomasz Miąsko,
Dean Moldovan, Ben Pritchard, Jason Rhinelander, Boris Schäling, Pim
Schellart, Henry Schreiner, Ivan Smirnov, Boris Staletic, and Patrick Stewart.
We thank Google for a generous financial contribution to the continuous
integration infrastructure used by this project.
Contributing
~~~~~~~~~~~~
See the `contributing
guide <https://github.com/pybind/pybind11/blob/master/.github/CONTRIBUTING.md>`_
for information on building and contributing to pybind11.
License
~~~~~~~
pybind11 is provided under a BSD-style license that can be found in the
`LICENSE <https://github.com/pybind/pybind11/blob/master/LICENSE>`_
file. By using, distributing, or contributing to this project, you agree
to the terms and conditions of this license.
.. |Latest Documentation Status| image:: https://readthedocs.org/projects/pybind11/badge?version=latest
:target: http://pybind11.readthedocs.org/en/latest
.. |Stable Documentation Status| image:: https://img.shields.io/badge/docs-stable-blue.svg
:target: http://pybind11.readthedocs.org/en/stable
.. |Gitter chat| image:: https://img.shields.io/gitter/room/gitterHQ/gitter.svg
:target: https://gitter.im/pybind/Lobby
.. |CI| image:: https://github.com/pybind/pybind11/workflows/CI/badge.svg
:target: https://github.com/pybind/pybind11/actions
.. |Build status| image:: https://ci.appveyor.com/api/projects/status/riaj54pn4h08xy40?svg=true
:target: https://ci.appveyor.com/project/wjakob/pybind11
.. |PyPI package| image:: https://img.shields.io/pypi/v/pybind11.svg
:target: https://pypi.org/project/pybind11/
.. |Conda-forge| image:: https://img.shields.io/conda/vn/conda-forge/pybind11.svg
:target: https://github.com/conda-forge/pybind11-feedstock
.. |Repology| image:: https://repology.org/badge/latest-versions/python:pybind11.svg
:target: https://repology.org/project/python:pybind11/versions
.. |Python Versions| image:: https://img.shields.io/pypi/pyversions/pybind11.svg
:target: https://pypi.org/project/pybind11/
.. |GitHub Discussions| image:: https://img.shields.io/static/v1?label=Discussions&message=Ask&color=blue&logo=github
:target: https://github.com/pybind/pybind11/discussions

13
3rdparty/pybind11/SECURITY.md vendored Normal file
View File

@ -0,0 +1,13 @@
# Security Policy
## Supported Versions
Security updates are applied only to the latest release.
## Reporting a Vulnerability
If you have discovered a security vulnerability in this project, please report it privately. **Do not disclose it as a public issue.** This gives us time to work with you to fix the issue before public exposure, reducing the chance that the exploit will be used before a patch is released.
Please disclose it at [security advisory](https://github.com/pybind/pybind11/security/advisories/new).
This project is maintained by a team of volunteers on a reasonable-effort basis. As such, please give us at least 90 days to work on a fix before public exposure.

21
3rdparty/pybind11/docs/Doxyfile vendored Normal file
View File

@ -0,0 +1,21 @@
PROJECT_NAME = pybind11
INPUT = ../include/pybind11/
RECURSIVE = YES
GENERATE_HTML = NO
GENERATE_LATEX = NO
GENERATE_XML = YES
XML_OUTPUT = .build/doxygenxml
XML_PROGRAMLISTING = YES
MACRO_EXPANSION = YES
EXPAND_ONLY_PREDEF = YES
EXPAND_AS_DEFINED = PYBIND11_RUNTIME_EXCEPTION
ALIASES = "rst=\verbatim embed:rst"
ALIASES += "endrst=\endverbatim"
QUIET = YES
WARNINGS = YES
WARN_IF_UNDOCUMENTED = NO
PREDEFINED = PYBIND11_NOINLINE

View File

@ -0,0 +1,3 @@
.highlight .go {
color: #707070;
}

View File

@ -0,0 +1,81 @@
Chrono
======
When including the additional header file :file:`pybind11/chrono.h` conversions
from C++11 chrono datatypes to python datetime objects are automatically enabled.
This header also enables conversions of python floats (often from sources such
as ``time.monotonic()``, ``time.perf_counter()`` and ``time.process_time()``)
into durations.
An overview of clocks in C++11
------------------------------
A point of confusion when using these conversions is the differences between
clocks provided in C++11. There are three clock types defined by the C++11
standard and users can define their own if needed. Each of these clocks have
different properties and when converting to and from python will give different
results.
The first clock defined by the standard is ``std::chrono::system_clock``. This
clock measures the current date and time. However, this clock changes with to
updates to the operating system time. For example, if your time is synchronised
with a time server this clock will change. This makes this clock a poor choice
for timing purposes but good for measuring the wall time.
The second clock defined in the standard is ``std::chrono::steady_clock``.
This clock ticks at a steady rate and is never adjusted. This makes it excellent
for timing purposes, however the value in this clock does not correspond to the
current date and time. Often this clock will be the amount of time your system
has been on, although it does not have to be. This clock will never be the same
clock as the system clock as the system clock can change but steady clocks
cannot.
The third clock defined in the standard is ``std::chrono::high_resolution_clock``.
This clock is the clock that has the highest resolution out of the clocks in the
system. It is normally a typedef to either the system clock or the steady clock
but can be its own independent clock. This is important as when using these
conversions as the types you get in python for this clock might be different
depending on the system.
If it is a typedef of the system clock, python will get datetime objects, but if
it is a different clock they will be timedelta objects.
Provided conversions
--------------------
.. rubric:: C++ to Python
- ``std::chrono::system_clock::time_point````datetime.datetime``
System clock times are converted to python datetime instances. They are
in the local timezone, but do not have any timezone information attached
to them (they are naive datetime objects).
- ``std::chrono::duration````datetime.timedelta``
Durations are converted to timedeltas, any precision in the duration
greater than microseconds is lost by rounding towards zero.
- ``std::chrono::[other_clocks]::time_point````datetime.timedelta``
Any clock time that is not the system clock is converted to a time delta.
This timedelta measures the time from the clocks epoch to now.
.. rubric:: Python to C++
- ``datetime.datetime`` or ``datetime.date`` or ``datetime.time````std::chrono::system_clock::time_point``
Date/time objects are converted into system clock timepoints. Any
timezone information is ignored and the type is treated as a naive
object.
- ``datetime.timedelta````std::chrono::duration``
Time delta are converted into durations with microsecond precision.
- ``datetime.timedelta````std::chrono::[other_clocks]::time_point``
Time deltas that are converted into clock timepoints are treated as
the amount of time from the start of the clocks epoch.
- ``float````std::chrono::duration``
Floats that are passed to C++ as durations be interpreted as a number of
seconds. These will be converted to the duration using ``duration_cast``
from the float.
- ``float````std::chrono::[other_clocks]::time_point``
Floats that are passed to C++ as time points will be interpreted as the
number of seconds from the start of the clocks epoch.

View File

@ -0,0 +1,93 @@
Custom type casters
===================
In very rare cases, applications may require custom type casters that cannot be
expressed using the abstractions provided by pybind11, thus requiring raw
Python C API calls. This is fairly advanced usage and should only be pursued by
experts who are familiar with the intricacies of Python reference counting.
The following snippets demonstrate how this works for a very simple ``inty``
type that that should be convertible from Python types that provide a
``__int__(self)`` method.
.. code-block:: cpp
struct inty { long long_value; };
void print(inty s) {
std::cout << s.long_value << std::endl;
}
The following Python snippet demonstrates the intended usage from the Python side:
.. code-block:: python
class A:
def __int__(self):
return 123
from example import print
print(A())
To register the necessary conversion routines, it is necessary to add an
instantiation of the ``pybind11::detail::type_caster<T>`` template.
Although this is an implementation detail, adding an instantiation of this
type is explicitly allowed.
.. code-block:: cpp
namespace PYBIND11_NAMESPACE { namespace detail {
template <> struct type_caster<inty> {
public:
/**
* This macro establishes the name 'inty' in
* function signatures and declares a local variable
* 'value' of type inty
*/
PYBIND11_TYPE_CASTER(inty, const_name("inty"));
/**
* Conversion part 1 (Python->C++): convert a PyObject into a inty
* instance or return false upon failure. The second argument
* indicates whether implicit conversions should be applied.
*/
bool load(handle src, bool) {
/* Extract PyObject from handle */
PyObject *source = src.ptr();
/* Try converting into a Python integer value */
PyObject *tmp = PyNumber_Long(source);
if (!tmp)
return false;
/* Now try to convert into a C++ int */
value.long_value = PyLong_AsLong(tmp);
Py_DECREF(tmp);
/* Ensure return code was OK (to avoid out-of-range errors etc) */
return !(value.long_value == -1 && !PyErr_Occurred());
}
/**
* Conversion part 2 (C++ -> Python): convert an inty instance into
* a Python object. The second and third arguments are used to
* indicate the return value policy and parent object (for
* ``return_value_policy::reference_internal``) and are generally
* ignored by implicit casters.
*/
static handle cast(inty src, return_value_policy /* policy */, handle /* parent */) {
return PyLong_FromLong(src.long_value);
}
};
}} // namespace PYBIND11_NAMESPACE::detail
.. note::
A ``type_caster<T>`` defined with ``PYBIND11_TYPE_CASTER(T, ...)`` requires
that ``T`` is default-constructible (``value`` is first default constructed
and then ``load()`` assigns to it).
.. warning::
When using custom type casters, it's important to declare them consistently
in every compilation unit of the Python extension module. Otherwise,
undefined behavior can ensue.

View File

@ -0,0 +1,310 @@
Eigen
#####
`Eigen <http://eigen.tuxfamily.org>`_ is C++ header-based library for dense and
sparse linear algebra. Due to its popularity and widespread adoption, pybind11
provides transparent conversion and limited mapping support between Eigen and
Scientific Python linear algebra data types.
To enable the built-in Eigen support you must include the optional header file
:file:`pybind11/eigen.h`.
Pass-by-value
=============
When binding a function with ordinary Eigen dense object arguments (for
example, ``Eigen::MatrixXd``), pybind11 will accept any input value that is
already (or convertible to) a ``numpy.ndarray`` with dimensions compatible with
the Eigen type, copy its values into a temporary Eigen variable of the
appropriate type, then call the function with this temporary variable.
Sparse matrices are similarly copied to or from
``scipy.sparse.csr_matrix``/``scipy.sparse.csc_matrix`` objects.
Pass-by-reference
=================
One major limitation of the above is that every data conversion implicitly
involves a copy, which can be both expensive (for large matrices) and disallows
binding functions that change their (Matrix) arguments. Pybind11 allows you to
work around this by using Eigen's ``Eigen::Ref<MatrixType>`` class much as you
would when writing a function taking a generic type in Eigen itself (subject to
some limitations discussed below).
When calling a bound function accepting a ``Eigen::Ref<const MatrixType>``
type, pybind11 will attempt to avoid copying by using an ``Eigen::Map`` object
that maps into the source ``numpy.ndarray`` data: this requires both that the
data types are the same (e.g. ``dtype='float64'`` and ``MatrixType::Scalar`` is
``double``); and that the storage is layout compatible. The latter limitation
is discussed in detail in the section below, and requires careful
consideration: by default, numpy matrices and Eigen matrices are *not* storage
compatible.
If the numpy matrix cannot be used as is (either because its types differ, e.g.
passing an array of integers to an Eigen parameter requiring doubles, or
because the storage is incompatible), pybind11 makes a temporary copy and
passes the copy instead.
When a bound function parameter is instead ``Eigen::Ref<MatrixType>`` (note the
lack of ``const``), pybind11 will only allow the function to be called if it
can be mapped *and* if the numpy array is writeable (that is
``a.flags.writeable`` is true). Any access (including modification) made to
the passed variable will be transparently carried out directly on the
``numpy.ndarray``.
This means you can write code such as the following and have it work as
expected:
.. code-block:: cpp
void scale_by_2(Eigen::Ref<Eigen::VectorXd> v) {
v *= 2;
}
Note, however, that you will likely run into limitations due to numpy and
Eigen's difference default storage order for data; see the below section on
:ref:`storage_orders` for details on how to bind code that won't run into such
limitations.
.. note::
Passing by reference is not supported for sparse types.
Returning values to Python
==========================
When returning an ordinary dense Eigen matrix type to numpy (e.g.
``Eigen::MatrixXd`` or ``Eigen::RowVectorXf``) pybind11 keeps the matrix and
returns a numpy array that directly references the Eigen matrix: no copy of the
data is performed. The numpy array will have ``array.flags.owndata`` set to
``False`` to indicate that it does not own the data, and the lifetime of the
stored Eigen matrix will be tied to the returned ``array``.
If you bind a function with a non-reference, ``const`` return type (e.g.
``const Eigen::MatrixXd``), the same thing happens except that pybind11 also
sets the numpy array's ``writeable`` flag to false.
If you return an lvalue reference or pointer, the usual pybind11 rules apply,
as dictated by the binding function's return value policy (see the
documentation on :ref:`return_value_policies` for full details). That means,
without an explicit return value policy, lvalue references will be copied and
pointers will be managed by pybind11. In order to avoid copying, you should
explicitly specify an appropriate return value policy, as in the following
example:
.. code-block:: cpp
class MyClass {
Eigen::MatrixXd big_mat = Eigen::MatrixXd::Zero(10000, 10000);
public:
Eigen::MatrixXd &getMatrix() { return big_mat; }
const Eigen::MatrixXd &viewMatrix() { return big_mat; }
};
// Later, in binding code:
py::class_<MyClass>(m, "MyClass")
.def(py::init<>())
.def("copy_matrix", &MyClass::getMatrix) // Makes a copy!
.def("get_matrix", &MyClass::getMatrix, py::return_value_policy::reference_internal)
.def("view_matrix", &MyClass::viewMatrix, py::return_value_policy::reference_internal)
;
.. code-block:: python
a = MyClass()
m = a.get_matrix() # flags.writeable = True, flags.owndata = False
v = a.view_matrix() # flags.writeable = False, flags.owndata = False
c = a.copy_matrix() # flags.writeable = True, flags.owndata = True
# m[5,6] and v[5,6] refer to the same element, c[5,6] does not.
Note in this example that ``py::return_value_policy::reference_internal`` is
used to tie the life of the MyClass object to the life of the returned arrays.
You may also return an ``Eigen::Ref``, ``Eigen::Map`` or other map-like Eigen
object (for example, the return value of ``matrix.block()`` and related
methods) that map into a dense Eigen type. When doing so, the default
behaviour of pybind11 is to simply reference the returned data: you must take
care to ensure that this data remains valid! You may ask pybind11 to
explicitly *copy* such a return value by using the
``py::return_value_policy::copy`` policy when binding the function. You may
also use ``py::return_value_policy::reference_internal`` or a
``py::keep_alive`` to ensure the data stays valid as long as the returned numpy
array does.
When returning such a reference of map, pybind11 additionally respects the
readonly-status of the returned value, marking the numpy array as non-writeable
if the reference or map was itself read-only.
.. note::
Sparse types are always copied when returned.
.. _storage_orders:
Storage orders
==============
Passing arguments via ``Eigen::Ref`` has some limitations that you must be
aware of in order to effectively pass matrices by reference. First and
foremost is that the default ``Eigen::Ref<MatrixType>`` class requires
contiguous storage along columns (for column-major types, the default in Eigen)
or rows if ``MatrixType`` is specifically an ``Eigen::RowMajor`` storage type.
The former, Eigen's default, is incompatible with ``numpy``'s default row-major
storage, and so you will not be able to pass numpy arrays to Eigen by reference
without making one of two changes.
(Note that this does not apply to vectors (or column or row matrices): for such
types the "row-major" and "column-major" distinction is meaningless).
The first approach is to change the use of ``Eigen::Ref<MatrixType>`` to the
more general ``Eigen::Ref<MatrixType, 0, Eigen::Stride<Eigen::Dynamic,
Eigen::Dynamic>>`` (or similar type with a fully dynamic stride type in the
third template argument). Since this is a rather cumbersome type, pybind11
provides a ``py::EigenDRef<MatrixType>`` type alias for your convenience (along
with EigenDMap for the equivalent Map, and EigenDStride for just the stride
type).
This type allows Eigen to map into any arbitrary storage order. This is not
the default in Eigen for performance reasons: contiguous storage allows
vectorization that cannot be done when storage is not known to be contiguous at
compile time. The default ``Eigen::Ref`` stride type allows non-contiguous
storage along the outer dimension (that is, the rows of a column-major matrix
or columns of a row-major matrix), but not along the inner dimension.
This type, however, has the added benefit of also being able to map numpy array
slices. For example, the following (contrived) example uses Eigen with a numpy
slice to multiply by 2 all coefficients that are both on even rows (0, 2, 4,
...) and in columns 2, 5, or 8:
.. code-block:: cpp
m.def("scale", [](py::EigenDRef<Eigen::MatrixXd> m, double c) { m *= c; });
.. code-block:: python
# a = np.array(...)
scale_by_2(myarray[0::2, 2:9:3])
The second approach to avoid copying is more intrusive: rearranging the
underlying data types to not run into the non-contiguous storage problem in the
first place. In particular, that means using matrices with ``Eigen::RowMajor``
storage, where appropriate, such as:
.. code-block:: cpp
using RowMatrixXd = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
// Use RowMatrixXd instead of MatrixXd
Now bound functions accepting ``Eigen::Ref<RowMatrixXd>`` arguments will be
callable with numpy's (default) arrays without involving a copying.
You can, alternatively, change the storage order that numpy arrays use by
adding the ``order='F'`` option when creating an array:
.. code-block:: python
myarray = np.array(source, order="F")
Such an object will be passable to a bound function accepting an
``Eigen::Ref<MatrixXd>`` (or similar column-major Eigen type).
One major caveat with this approach, however, is that it is not entirely as
easy as simply flipping all Eigen or numpy usage from one to the other: some
operations may alter the storage order of a numpy array. For example, ``a2 =
array.transpose()`` results in ``a2`` being a view of ``array`` that references
the same data, but in the opposite storage order!
While this approach allows fully optimized vectorized calculations in Eigen, it
cannot be used with array slices, unlike the first approach.
When *returning* a matrix to Python (either a regular matrix, a reference via
``Eigen::Ref<>``, or a map/block into a matrix), no special storage
consideration is required: the created numpy array will have the required
stride that allows numpy to properly interpret the array, whatever its storage
order.
Failing rather than copying
===========================
The default behaviour when binding ``Eigen::Ref<const MatrixType>`` Eigen
references is to copy matrix values when passed a numpy array that does not
conform to the element type of ``MatrixType`` or does not have a compatible
stride layout. If you want to explicitly avoid copying in such a case, you
should bind arguments using the ``py::arg().noconvert()`` annotation (as
described in the :ref:`nonconverting_arguments` documentation).
The following example shows an example of arguments that don't allow data
copying to take place:
.. code-block:: cpp
// The method and function to be bound:
class MyClass {
// ...
double some_method(const Eigen::Ref<const MatrixXd> &matrix) { /* ... */ }
};
float some_function(const Eigen::Ref<const MatrixXf> &big,
const Eigen::Ref<const MatrixXf> &small) {
// ...
}
// The associated binding code:
using namespace pybind11::literals; // for "arg"_a
py::class_<MyClass>(m, "MyClass")
// ... other class definitions
.def("some_method", &MyClass::some_method, py::arg().noconvert());
m.def("some_function", &some_function,
"big"_a.noconvert(), // <- Don't allow copying for this arg
"small"_a // <- This one can be copied if needed
);
With the above binding code, attempting to call the the ``some_method(m)``
method on a ``MyClass`` object, or attempting to call ``some_function(m, m2)``
will raise a ``RuntimeError`` rather than making a temporary copy of the array.
It will, however, allow the ``m2`` argument to be copied into a temporary if
necessary.
Note that explicitly specifying ``.noconvert()`` is not required for *mutable*
Eigen references (e.g. ``Eigen::Ref<MatrixXd>`` without ``const`` on the
``MatrixXd``): mutable references will never be called with a temporary copy.
Vectors versus column/row matrices
==================================
Eigen and numpy have fundamentally different notions of a vector. In Eigen, a
vector is simply a matrix with the number of columns or rows set to 1 at
compile time (for a column vector or row vector, respectively). NumPy, in
contrast, has comparable 2-dimensional 1xN and Nx1 arrays, but *also* has
1-dimensional arrays of size N.
When passing a 2-dimensional 1xN or Nx1 array to Eigen, the Eigen type must
have matching dimensions: That is, you cannot pass a 2-dimensional Nx1 numpy
array to an Eigen value expecting a row vector, or a 1xN numpy array as a
column vector argument.
On the other hand, pybind11 allows you to pass 1-dimensional arrays of length N
as Eigen parameters. If the Eigen type can hold a column vector of length N it
will be passed as such a column vector. If not, but the Eigen type constraints
will accept a row vector, it will be passed as a row vector. (The column
vector takes precedence when both are supported, for example, when passing a
1D numpy array to a MatrixXd argument). Note that the type need not be
explicitly a vector: it is permitted to pass a 1D numpy array of size 5 to an
Eigen ``Matrix<double, Dynamic, 5>``: you would end up with a 1x5 Eigen matrix.
Passing the same to an ``Eigen::MatrixXd`` would result in a 5x1 Eigen matrix.
When returning an Eigen vector to numpy, the conversion is ambiguous: a row
vector of length 4 could be returned as either a 1D array of length 4, or as a
2D array of size 1x4. When encountering such a situation, pybind11 compromises
by considering the returned Eigen type: if it is a compile-time vector--that
is, the type has either the number of rows or columns set to 1 at compile
time--pybind11 converts to a 1D numpy array when returning the value. For
instances that are a vector only at run-time (e.g. ``MatrixXd``,
``Matrix<float, Dynamic, 4>``), pybind11 returns the vector as a 2D array to
numpy. If this isn't want you want, you can use ``array.reshape(...)`` to get
a view of the same data in the desired dimensions.
.. seealso::
The file :file:`tests/test_eigen.cpp` contains a complete example that
shows how to pass Eigen sparse and dense data types in more detail.

View File

@ -0,0 +1,109 @@
Functional
##########
The following features must be enabled by including :file:`pybind11/functional.h`.
Callbacks and passing anonymous functions
=========================================
The C++11 standard brought lambda functions and the generic polymorphic
function wrapper ``std::function<>`` to the C++ programming language, which
enable powerful new ways of working with functions. Lambda functions come in
two flavors: stateless lambda function resemble classic function pointers that
link to an anonymous piece of code, while stateful lambda functions
additionally depend on captured variables that are stored in an anonymous
*lambda closure object*.
Here is a simple example of a C++ function that takes an arbitrary function
(stateful or stateless) with signature ``int -> int`` as an argument and runs
it with the value 10.
.. code-block:: cpp
int func_arg(const std::function<int(int)> &f) {
return f(10);
}
The example below is more involved: it takes a function of signature ``int -> int``
and returns another function of the same kind. The return value is a stateful
lambda function, which stores the value ``f`` in the capture object and adds 1 to
its return value upon execution.
.. code-block:: cpp
std::function<int(int)> func_ret(const std::function<int(int)> &f) {
return [f](int i) {
return f(i) + 1;
};
}
This example demonstrates using python named parameters in C++ callbacks which
requires using ``py::cpp_function`` as a wrapper. Usage is similar to defining
methods of classes:
.. code-block:: cpp
py::cpp_function func_cpp() {
return py::cpp_function([](int i) { return i+1; },
py::arg("number"));
}
After including the extra header file :file:`pybind11/functional.h`, it is almost
trivial to generate binding code for all of these functions.
.. code-block:: cpp
#include <pybind11/functional.h>
PYBIND11_MODULE(example, m) {
m.def("func_arg", &func_arg);
m.def("func_ret", &func_ret);
m.def("func_cpp", &func_cpp);
}
The following interactive session shows how to call them from Python.
.. code-block:: pycon
$ python
>>> import example
>>> def square(i):
... return i * i
...
>>> example.func_arg(square)
100L
>>> square_plus_1 = example.func_ret(square)
>>> square_plus_1(4)
17L
>>> plus_1 = func_cpp()
>>> plus_1(number=43)
44L
.. warning::
Keep in mind that passing a function from C++ to Python (or vice versa)
will instantiate a piece of wrapper code that translates function
invocations between the two languages. Naturally, this translation
increases the computational cost of each function call somewhat. A
problematic situation can arise when a function is copied back and forth
between Python and C++ many times in a row, in which case the underlying
wrappers will accumulate correspondingly. The resulting long sequence of
C++ -> Python -> C++ -> ... roundtrips can significantly decrease
performance.
There is one exception: pybind11 detects case where a stateless function
(i.e. a function pointer or a lambda function without captured variables)
is passed as an argument to another C++ function exposed in Python. In this
case, there is no overhead. Pybind11 will extract the underlying C++
function pointer from the wrapped function to sidestep a potential C++ ->
Python -> C++ roundtrip. This is demonstrated in :file:`tests/test_callbacks.cpp`.
.. note::
This functionality is very useful when generating bindings for callbacks in
C++ libraries (e.g. GUI libraries, asynchronous networking libraries, etc.).
The file :file:`tests/test_callbacks.cpp` contains a complete example
that demonstrates how to work with callbacks and anonymous functions in
more detail.

View File

@ -0,0 +1,43 @@
.. _type-conversions:
Type conversions
################
Apart from enabling cross-language function calls, a fundamental problem
that a binding tool like pybind11 must address is to provide access to
native Python types in C++ and vice versa. There are three fundamentally
different ways to do this—which approach is preferable for a particular type
depends on the situation at hand.
1. Use a native C++ type everywhere. In this case, the type must be wrapped
using pybind11-generated bindings so that Python can interact with it.
2. Use a native Python type everywhere. It will need to be wrapped so that
C++ functions can interact with it.
3. Use a native C++ type on the C++ side and a native Python type on the
Python side. pybind11 refers to this as a *type conversion*.
Type conversions are the most "natural" option in the sense that native
(non-wrapped) types are used everywhere. The main downside is that a copy
of the data must be made on every Python ↔ C++ transition: this is
needed since the C++ and Python versions of the same type generally won't
have the same memory layout.
pybind11 can perform many kinds of conversions automatically. An overview
is provided in the table ":ref:`conversion_table`".
The following subsections discuss the differences between these options in more
detail. The main focus in this section is on type conversions, which represent
the last case of the above list.
.. toctree::
:maxdepth: 1
overview
strings
stl
functional
chrono
eigen
custom

View File

@ -0,0 +1,170 @@
Overview
########
.. rubric:: 1. Native type in C++, wrapper in Python
Exposing a custom C++ type using :class:`py::class_` was covered in detail
in the :doc:`/classes` section. There, the underlying data structure is
always the original C++ class while the :class:`py::class_` wrapper provides
a Python interface. Internally, when an object like this is sent from C++ to
Python, pybind11 will just add the outer wrapper layer over the native C++
object. Getting it back from Python is just a matter of peeling off the
wrapper.
.. rubric:: 2. Wrapper in C++, native type in Python
This is the exact opposite situation. Now, we have a type which is native to
Python, like a ``tuple`` or a ``list``. One way to get this data into C++ is
with the :class:`py::object` family of wrappers. These are explained in more
detail in the :doc:`/advanced/pycpp/object` section. We'll just give a quick
example here:
.. code-block:: cpp
void print_list(py::list my_list) {
for (auto item : my_list)
std::cout << item << " ";
}
.. code-block:: pycon
>>> print_list([1, 2, 3])
1 2 3
The Python ``list`` is not converted in any way -- it's just wrapped in a C++
:class:`py::list` class. At its core it's still a Python object. Copying a
:class:`py::list` will do the usual reference-counting like in Python.
Returning the object to Python will just remove the thin wrapper.
.. rubric:: 3. Converting between native C++ and Python types
In the previous two cases we had a native type in one language and a wrapper in
the other. Now, we have native types on both sides and we convert between them.
.. code-block:: cpp
void print_vector(const std::vector<int> &v) {
for (auto item : v)
std::cout << item << "\n";
}
.. code-block:: pycon
>>> print_vector([1, 2, 3])
1 2 3
In this case, pybind11 will construct a new ``std::vector<int>`` and copy each
element from the Python ``list``. The newly constructed object will be passed
to ``print_vector``. The same thing happens in the other direction: a new
``list`` is made to match the value returned from C++.
Lots of these conversions are supported out of the box, as shown in the table
below. They are very convenient, but keep in mind that these conversions are
fundamentally based on copying data. This is perfectly fine for small immutable
types but it may become quite expensive for large data structures. This can be
avoided by overriding the automatic conversion with a custom wrapper (i.e. the
above-mentioned approach 1). This requires some manual effort and more details
are available in the :ref:`opaque` section.
.. _conversion_table:
List of all builtin conversions
-------------------------------
The following basic data types are supported out of the box (some may require
an additional extension header to be included). To pass other data structures
as arguments and return values, refer to the section on binding :ref:`classes`.
+------------------------------------+---------------------------+-----------------------------------+
| Data type | Description | Header file |
+====================================+===========================+===================================+
| ``int8_t``, ``uint8_t`` | 8-bit integers | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``int16_t``, ``uint16_t`` | 16-bit integers | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``int32_t``, ``uint32_t`` | 32-bit integers | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``int64_t``, ``uint64_t`` | 64-bit integers | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``ssize_t``, ``size_t`` | Platform-dependent size | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``float``, ``double`` | Floating point types | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``bool`` | Two-state Boolean type | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``char`` | Character literal | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``char16_t`` | UTF-16 character literal | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``char32_t`` | UTF-32 character literal | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``wchar_t`` | Wide character literal | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``const char *`` | UTF-8 string literal | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``const char16_t *`` | UTF-16 string literal | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``const char32_t *`` | UTF-32 string literal | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``const wchar_t *`` | Wide string literal | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::string`` | STL dynamic UTF-8 string | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::u16string`` | STL dynamic UTF-16 string | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::u32string`` | STL dynamic UTF-32 string | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::wstring`` | STL dynamic wide string | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::string_view``, | STL C++17 string views | :file:`pybind11/pybind11.h` |
| ``std::u16string_view``, etc. | | |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::pair<T1, T2>`` | Pair of two custom types | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::tuple<...>`` | Arbitrary tuple of types | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::reference_wrapper<...>`` | Reference type wrapper | :file:`pybind11/pybind11.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::complex<T>`` | Complex numbers | :file:`pybind11/complex.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::array<T, Size>`` | STL static array | :file:`pybind11/stl.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::vector<T>`` | STL dynamic array | :file:`pybind11/stl.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::deque<T>`` | STL double-ended queue | :file:`pybind11/stl.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::valarray<T>`` | STL value array | :file:`pybind11/stl.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::list<T>`` | STL linked list | :file:`pybind11/stl.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::map<T1, T2>`` | STL ordered map | :file:`pybind11/stl.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::unordered_map<T1, T2>`` | STL unordered map | :file:`pybind11/stl.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::set<T>`` | STL ordered set | :file:`pybind11/stl.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::unordered_set<T>`` | STL unordered set | :file:`pybind11/stl.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::optional<T>`` | STL optional type (C++17) | :file:`pybind11/stl.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::experimental::optional<T>`` | STL optional type (exp.) | :file:`pybind11/stl.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::variant<...>`` | Type-safe union (C++17) | :file:`pybind11/stl.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::filesystem::path<T>`` | STL path (C++17) [#]_ | :file:`pybind11/stl/filesystem.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::function<...>`` | STL polymorphic function | :file:`pybind11/functional.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::chrono::duration<...>`` | STL time duration | :file:`pybind11/chrono.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``std::chrono::time_point<...>`` | STL date/time | :file:`pybind11/chrono.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``Eigen::Matrix<...>`` | Eigen: dense matrix | :file:`pybind11/eigen.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``Eigen::Map<...>`` | Eigen: mapped memory | :file:`pybind11/eigen.h` |
+------------------------------------+---------------------------+-----------------------------------+
| ``Eigen::SparseMatrix<...>`` | Eigen: sparse matrix | :file:`pybind11/eigen.h` |
+------------------------------------+---------------------------+-----------------------------------+
.. [#] ``std::filesystem::path`` is converted to ``pathlib.Path`` and
``os.PathLike`` is converted to ``std::filesystem::path``.

View File

@ -0,0 +1,249 @@
STL containers
##############
Automatic conversion
====================
When including the additional header file :file:`pybind11/stl.h`, conversions
between ``std::vector<>``/``std::deque<>``/``std::list<>``/``std::array<>``/``std::valarray<>``,
``std::set<>``/``std::unordered_set<>``, and
``std::map<>``/``std::unordered_map<>`` and the Python ``list``, ``set`` and
``dict`` data structures are automatically enabled. The types ``std::pair<>``
and ``std::tuple<>`` are already supported out of the box with just the core
:file:`pybind11/pybind11.h` header.
The major downside of these implicit conversions is that containers must be
converted (i.e. copied) on every Python->C++ and C++->Python transition, which
can have implications on the program semantics and performance. Please read the
next sections for more details and alternative approaches that avoid this.
.. note::
Arbitrary nesting of any of these types is possible.
.. seealso::
The file :file:`tests/test_stl.cpp` contains a complete
example that demonstrates how to pass STL data types in more detail.
.. _cpp17_container_casters:
C++17 library containers
========================
The :file:`pybind11/stl.h` header also includes support for ``std::optional<>``
and ``std::variant<>``. These require a C++17 compiler and standard library.
In C++14 mode, ``std::experimental::optional<>`` is supported if available.
Various versions of these containers also exist for C++11 (e.g. in Boost).
pybind11 provides an easy way to specialize the ``type_caster`` for such
types:
.. code-block:: cpp
// `boost::optional` as an example -- can be any `std::optional`-like container
namespace PYBIND11_NAMESPACE { namespace detail {
template <typename T>
struct type_caster<boost::optional<T>> : optional_caster<boost::optional<T>> {};
}}
The above should be placed in a header file and included in all translation units
where automatic conversion is needed. Similarly, a specialization can be provided
for custom variant types:
.. code-block:: cpp
// `boost::variant` as an example -- can be any `std::variant`-like container
namespace PYBIND11_NAMESPACE { namespace detail {
template <typename... Ts>
struct type_caster<boost::variant<Ts...>> : variant_caster<boost::variant<Ts...>> {};
// Specifies the function used to visit the variant -- `apply_visitor` instead of `visit`
template <>
struct visit_helper<boost::variant> {
template <typename... Args>
static auto call(Args &&...args) -> decltype(boost::apply_visitor(args...)) {
return boost::apply_visitor(args...);
}
};
}} // namespace PYBIND11_NAMESPACE::detail
The ``visit_helper`` specialization is not required if your ``name::variant`` provides
a ``name::visit()`` function. For any other function name, the specialization must be
included to tell pybind11 how to visit the variant.
.. warning::
When converting a ``variant`` type, pybind11 follows the same rules as when
determining which function overload to call (:ref:`overload_resolution`), and
so the same caveats hold. In particular, the order in which the ``variant``'s
alternatives are listed is important, since pybind11 will try conversions in
this order. This means that, for example, when converting ``variant<int, bool>``,
the ``bool`` variant will never be selected, as any Python ``bool`` is already
an ``int`` and is convertible to a C++ ``int``. Changing the order of alternatives
(and using ``variant<bool, int>``, in this example) provides a solution.
.. note::
pybind11 only supports the modern implementation of ``boost::variant``
which makes use of variadic templates. This requires Boost 1.56 or newer.
.. _opaque:
Making opaque types
===================
pybind11 heavily relies on a template matching mechanism to convert parameters
and return values that are constructed from STL data types such as vectors,
linked lists, hash tables, etc. This even works in a recursive manner, for
instance to deal with lists of hash maps of pairs of elementary and custom
types, etc.
However, a fundamental limitation of this approach is that internal conversions
between Python and C++ types involve a copy operation that prevents
pass-by-reference semantics. What does this mean?
Suppose we bind the following function
.. code-block:: cpp
void append_1(std::vector<int> &v) {
v.push_back(1);
}
and call it from Python, the following happens:
.. code-block:: pycon
>>> v = [5, 6]
>>> append_1(v)
>>> print(v)
[5, 6]
As you can see, when passing STL data structures by reference, modifications
are not propagated back the Python side. A similar situation arises when
exposing STL data structures using the ``def_readwrite`` or ``def_readonly``
functions:
.. code-block:: cpp
/* ... definition ... */
class MyClass {
std::vector<int> contents;
};
/* ... binding code ... */
py::class_<MyClass>(m, "MyClass")
.def(py::init<>())
.def_readwrite("contents", &MyClass::contents);
In this case, properties can be read and written in their entirety. However, an
``append`` operation involving such a list type has no effect:
.. code-block:: pycon
>>> m = MyClass()
>>> m.contents = [5, 6]
>>> print(m.contents)
[5, 6]
>>> m.contents.append(7)
>>> print(m.contents)
[5, 6]
Finally, the involved copy operations can be costly when dealing with very
large lists. To deal with all of the above situations, pybind11 provides a
macro named ``PYBIND11_MAKE_OPAQUE(T)`` that disables the template-based
conversion machinery of types, thus rendering them *opaque*. The contents of
opaque objects are never inspected or extracted, hence they *can* be passed by
reference. For instance, to turn ``std::vector<int>`` into an opaque type, add
the declaration
.. code-block:: cpp
PYBIND11_MAKE_OPAQUE(std::vector<int>);
before any binding code (e.g. invocations to ``class_::def()``, etc.). This
macro must be specified at the top level (and outside of any namespaces), since
it adds a template instantiation of ``type_caster``. If your binding code consists of
multiple compilation units, it must be present in every file (typically via a
common header) preceding any usage of ``std::vector<int>``. Opaque types must
also have a corresponding ``class_`` declaration to associate them with a name
in Python, and to define a set of available operations, e.g.:
.. code-block:: cpp
py::class_<std::vector<int>>(m, "IntVector")
.def(py::init<>())
.def("clear", &std::vector<int>::clear)
.def("pop_back", &std::vector<int>::pop_back)
.def("__len__", [](const std::vector<int> &v) { return v.size(); })
.def("__iter__", [](std::vector<int> &v) {
return py::make_iterator(v.begin(), v.end());
}, py::keep_alive<0, 1>()) /* Keep vector alive while iterator is used */
// ....
.. seealso::
The file :file:`tests/test_opaque_types.cpp` contains a complete
example that demonstrates how to create and expose opaque types using
pybind11 in more detail.
.. _stl_bind:
Binding STL containers
======================
The ability to expose STL containers as native Python objects is a fairly
common request, hence pybind11 also provides an optional header file named
:file:`pybind11/stl_bind.h` that does exactly this. The mapped containers try
to match the behavior of their native Python counterparts as much as possible.
The following example showcases usage of :file:`pybind11/stl_bind.h`:
.. code-block:: cpp
// Don't forget this
#include <pybind11/stl_bind.h>
PYBIND11_MAKE_OPAQUE(std::vector<int>);
PYBIND11_MAKE_OPAQUE(std::map<std::string, double>);
// ...
// later in binding code:
py::bind_vector<std::vector<int>>(m, "VectorInt");
py::bind_map<std::map<std::string, double>>(m, "MapStringDouble");
When binding STL containers pybind11 considers the types of the container's
elements to decide whether the container should be confined to the local module
(via the :ref:`module_local` feature). If the container element types are
anything other than already-bound custom types bound without
``py::module_local()`` the container binding will have ``py::module_local()``
applied. This includes converting types such as numeric types, strings, Eigen
types; and types that have not yet been bound at the time of the stl container
binding. This module-local binding is designed to avoid potential conflicts
between module bindings (for example, from two separate modules each attempting
to bind ``std::vector<int>`` as a python type).
It is possible to override this behavior to force a definition to be either
module-local or global. To do so, you can pass the attributes
``py::module_local()`` (to make the binding module-local) or
``py::module_local(false)`` (to make the binding global) into the
``py::bind_vector`` or ``py::bind_map`` arguments:
.. code-block:: cpp
py::bind_vector<std::vector<int>>(m, "VectorInt", py::module_local(false));
Note, however, that such a global binding would make it impossible to load this
module at the same time as any other pybind module that also attempts to bind
the same container type (``std::vector<int>`` in the above example).
See :ref:`module_local` for more details on module-local bindings.
.. seealso::
The file :file:`tests/test_stl_binders.cpp` shows how to use the
convenience STL container wrappers.

View File

@ -0,0 +1,296 @@
Strings, bytes and Unicode conversions
######################################
Passing Python strings to C++
=============================
When a Python ``str`` is passed from Python to a C++ function that accepts
``std::string`` or ``char *`` as arguments, pybind11 will encode the Python
string to UTF-8. All Python ``str`` can be encoded in UTF-8, so this operation
does not fail.
The C++ language is encoding agnostic. It is the responsibility of the
programmer to track encodings. It's often easiest to simply `use UTF-8
everywhere <http://utf8everywhere.org/>`_.
.. code-block:: c++
m.def("utf8_test",
[](const std::string &s) {
cout << "utf-8 is icing on the cake.\n";
cout << s;
}
);
m.def("utf8_charptr",
[](const char *s) {
cout << "My favorite food is\n";
cout << s;
}
);
.. code-block:: pycon
>>> utf8_test("🎂")
utf-8 is icing on the cake.
🎂
>>> utf8_charptr("🍕")
My favorite food is
🍕
.. note::
Some terminal emulators do not support UTF-8 or emoji fonts and may not
display the example above correctly.
The results are the same whether the C++ function accepts arguments by value or
reference, and whether or not ``const`` is used.
Passing bytes to C++
--------------------
A Python ``bytes`` object will be passed to C++ functions that accept
``std::string`` or ``char*`` *without* conversion. In order to make a function
*only* accept ``bytes`` (and not ``str``), declare it as taking a ``py::bytes``
argument.
Returning C++ strings to Python
===============================
When a C++ function returns a ``std::string`` or ``char*`` to a Python caller,
**pybind11 will assume that the string is valid UTF-8** and will decode it to a
native Python ``str``, using the same API as Python uses to perform
``bytes.decode('utf-8')``. If this implicit conversion fails, pybind11 will
raise a ``UnicodeDecodeError``.
.. code-block:: c++
m.def("std_string_return",
[]() {
return std::string("This string needs to be UTF-8 encoded");
}
);
.. code-block:: pycon
>>> isinstance(example.std_string_return(), str)
True
Because UTF-8 is inclusive of pure ASCII, there is never any issue with
returning a pure ASCII string to Python. If there is any possibility that the
string is not pure ASCII, it is necessary to ensure the encoding is valid
UTF-8.
.. warning::
Implicit conversion assumes that a returned ``char *`` is null-terminated.
If there is no null terminator a buffer overrun will occur.
Explicit conversions
--------------------
If some C++ code constructs a ``std::string`` that is not a UTF-8 string, one
can perform a explicit conversion and return a ``py::str`` object. Explicit
conversion has the same overhead as implicit conversion.
.. code-block:: c++
// This uses the Python C API to convert Latin-1 to Unicode
m.def("str_output",
[]() {
std::string s = "Send your r\xe9sum\xe9 to Alice in HR"; // Latin-1
py::handle py_s = PyUnicode_DecodeLatin1(s.data(), s.length(), nullptr);
if (!py_s) {
throw py::error_already_set();
}
return py::reinterpret_steal<py::str>(py_s);
}
);
.. code-block:: pycon
>>> str_output()
'Send your résumé to Alice in HR'
The `Python C API
<https://docs.python.org/3/c-api/unicode.html#built-in-codecs>`_ provides
several built-in codecs. Note that these all return *new* references, so
use :cpp:func:`reinterpret_steal` when converting them to a :cpp:class:`str`.
One could also use a third party encoding library such as libiconv to transcode
to UTF-8.
Return C++ strings without conversion
-------------------------------------
If the data in a C++ ``std::string`` does not represent text and should be
returned to Python as ``bytes``, then one can return the data as a
``py::bytes`` object.
.. code-block:: c++
m.def("return_bytes",
[]() {
std::string s("\xba\xd0\xba\xd0"); // Not valid UTF-8
return py::bytes(s); // Return the data without transcoding
}
);
.. code-block:: pycon
>>> example.return_bytes()
b'\xba\xd0\xba\xd0'
Note the asymmetry: pybind11 will convert ``bytes`` to ``std::string`` without
encoding, but cannot convert ``std::string`` back to ``bytes`` implicitly.
.. code-block:: c++
m.def("asymmetry",
[](std::string s) { // Accepts str or bytes from Python
return s; // Looks harmless, but implicitly converts to str
}
);
.. code-block:: pycon
>>> isinstance(example.asymmetry(b"have some bytes"), str)
True
>>> example.asymmetry(b"\xba\xd0\xba\xd0") # invalid utf-8 as bytes
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xba in position 0: invalid start byte
Wide character strings
======================
When a Python ``str`` is passed to a C++ function expecting ``std::wstring``,
``wchar_t*``, ``std::u16string`` or ``std::u32string``, the ``str`` will be
encoded to UTF-16 or UTF-32 depending on how the C++ compiler implements each
type, in the platform's native endianness. When strings of these types are
returned, they are assumed to contain valid UTF-16 or UTF-32, and will be
decoded to Python ``str``.
.. code-block:: c++
#define UNICODE
#include <windows.h>
m.def("set_window_text",
[](HWND hwnd, std::wstring s) {
// Call SetWindowText with null-terminated UTF-16 string
::SetWindowText(hwnd, s.c_str());
}
);
m.def("get_window_text",
[](HWND hwnd) {
const int buffer_size = ::GetWindowTextLength(hwnd) + 1;
auto buffer = std::make_unique< wchar_t[] >(buffer_size);
::GetWindowText(hwnd, buffer.data(), buffer_size);
std::wstring text(buffer.get());
// wstring will be converted to Python str
return text;
}
);
Strings in multibyte encodings such as Shift-JIS must transcoded to a
UTF-8/16/32 before being returned to Python.
Character literals
==================
C++ functions that accept character literals as input will receive the first
character of a Python ``str`` as their input. If the string is longer than one
Unicode character, trailing characters will be ignored.
When a character literal is returned from C++ (such as a ``char`` or a
``wchar_t``), it will be converted to a ``str`` that represents the single
character.
.. code-block:: c++
m.def("pass_char", [](char c) { return c; });
m.def("pass_wchar", [](wchar_t w) { return w; });
.. code-block:: pycon
>>> example.pass_char("A")
'A'
While C++ will cast integers to character types (``char c = 0x65;``), pybind11
does not convert Python integers to characters implicitly. The Python function
``chr()`` can be used to convert integers to characters.
.. code-block:: pycon
>>> example.pass_char(0x65)
TypeError
>>> example.pass_char(chr(0x65))
'A'
If the desire is to work with an 8-bit integer, use ``int8_t`` or ``uint8_t``
as the argument type.
Grapheme clusters
-----------------
A single grapheme may be represented by two or more Unicode characters. For
example 'é' is usually represented as U+00E9 but can also be expressed as the
combining character sequence U+0065 U+0301 (that is, the letter 'e' followed by
a combining acute accent). The combining character will be lost if the
two-character sequence is passed as an argument, even though it renders as a
single grapheme.
.. code-block:: pycon
>>> example.pass_wchar("é")
'é'
>>> combining_e_acute = "e" + "\u0301"
>>> combining_e_acute
'é'
>>> combining_e_acute == "é"
False
>>> example.pass_wchar(combining_e_acute)
'e'
Normalizing combining characters before passing the character literal to C++
may resolve *some* of these issues:
.. code-block:: pycon
>>> example.pass_wchar(unicodedata.normalize("NFC", combining_e_acute))
'é'
In some languages (Thai for example), there are `graphemes that cannot be
expressed as a single Unicode code point
<http://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries>`_, so there is
no way to capture them in a C++ character type.
C++17 string views
==================
C++17 string views are automatically supported when compiling in C++17 mode.
They follow the same rules for encoding and decoding as the corresponding STL
string type (for example, a ``std::u16string_view`` argument will be passed
UTF-16-encoded data, and a returned ``std::string_view`` will be decoded as
UTF-8).
References
==========
* `The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) <https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/>`_
* `C++ - Using STL Strings at Win32 API Boundaries <https://msdn.microsoft.com/en-ca/magazine/mt238407.aspx>`_

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,262 @@
.. _embedding:
Embedding the interpreter
#########################
While pybind11 is mainly focused on extending Python using C++, it's also
possible to do the reverse: embed the Python interpreter into a C++ program.
All of the other documentation pages still apply here, so refer to them for
general pybind11 usage. This section will cover a few extra things required
for embedding.
Getting started
===============
A basic executable with an embedded interpreter can be created with just a few
lines of CMake and the ``pybind11::embed`` target, as shown below. For more
information, see :doc:`/compiling`.
.. code-block:: cmake
cmake_minimum_required(VERSION 3.5...3.27)
project(example)
find_package(pybind11 REQUIRED) # or `add_subdirectory(pybind11)`
add_executable(example main.cpp)
target_link_libraries(example PRIVATE pybind11::embed)
The essential structure of the ``main.cpp`` file looks like this:
.. code-block:: cpp
#include <pybind11/embed.h> // everything needed for embedding
namespace py = pybind11;
int main() {
py::scoped_interpreter guard{}; // start the interpreter and keep it alive
py::print("Hello, World!"); // use the Python API
}
The interpreter must be initialized before using any Python API, which includes
all the functions and classes in pybind11. The RAII guard class ``scoped_interpreter``
takes care of the interpreter lifetime. After the guard is destroyed, the interpreter
shuts down and clears its memory. No Python functions can be called after this.
Executing Python code
=====================
There are a few different ways to run Python code. One option is to use ``eval``,
``exec`` or ``eval_file``, as explained in :ref:`eval`. Here is a quick example in
the context of an executable with an embedded interpreter:
.. code-block:: cpp
#include <pybind11/embed.h>
namespace py = pybind11;
int main() {
py::scoped_interpreter guard{};
py::exec(R"(
kwargs = dict(name="World", number=42)
message = "Hello, {name}! The answer is {number}".format(**kwargs)
print(message)
)");
}
Alternatively, similar results can be achieved using pybind11's API (see
:doc:`/advanced/pycpp/index` for more details).
.. code-block:: cpp
#include <pybind11/embed.h>
namespace py = pybind11;
using namespace py::literals;
int main() {
py::scoped_interpreter guard{};
auto kwargs = py::dict("name"_a="World", "number"_a=42);
auto message = "Hello, {name}! The answer is {number}"_s.format(**kwargs);
py::print(message);
}
The two approaches can also be combined:
.. code-block:: cpp
#include <pybind11/embed.h>
#include <iostream>
namespace py = pybind11;
using namespace py::literals;
int main() {
py::scoped_interpreter guard{};
auto locals = py::dict("name"_a="World", "number"_a=42);
py::exec(R"(
message = "Hello, {name}! The answer is {number}".format(**locals())
)", py::globals(), locals);
auto message = locals["message"].cast<std::string>();
std::cout << message;
}
Importing modules
=================
Python modules can be imported using ``module_::import()``:
.. code-block:: cpp
py::module_ sys = py::module_::import("sys");
py::print(sys.attr("path"));
For convenience, the current working directory is included in ``sys.path`` when
embedding the interpreter. This makes it easy to import local Python files:
.. code-block:: python
"""calc.py located in the working directory"""
def add(i, j):
return i + j
.. code-block:: cpp
py::module_ calc = py::module_::import("calc");
py::object result = calc.attr("add")(1, 2);
int n = result.cast<int>();
assert(n == 3);
Modules can be reloaded using ``module_::reload()`` if the source is modified e.g.
by an external process. This can be useful in scenarios where the application
imports a user defined data processing script which needs to be updated after
changes by the user. Note that this function does not reload modules recursively.
.. _embedding_modules:
Adding embedded modules
=======================
Embedded binary modules can be added using the ``PYBIND11_EMBEDDED_MODULE`` macro.
Note that the definition must be placed at global scope. They can be imported
like any other module.
.. code-block:: cpp
#include <pybind11/embed.h>
namespace py = pybind11;
PYBIND11_EMBEDDED_MODULE(fast_calc, m) {
// `m` is a `py::module_` which is used to bind functions and classes
m.def("add", [](int i, int j) {
return i + j;
});
}
int main() {
py::scoped_interpreter guard{};
auto fast_calc = py::module_::import("fast_calc");
auto result = fast_calc.attr("add")(1, 2).cast<int>();
assert(result == 3);
}
Unlike extension modules where only a single binary module can be created, on
the embedded side an unlimited number of modules can be added using multiple
``PYBIND11_EMBEDDED_MODULE`` definitions (as long as they have unique names).
These modules are added to Python's list of builtins, so they can also be
imported in pure Python files loaded by the interpreter. Everything interacts
naturally:
.. code-block:: python
"""py_module.py located in the working directory"""
import cpp_module
a = cpp_module.a
b = a + 1
.. code-block:: cpp
#include <pybind11/embed.h>
namespace py = pybind11;
PYBIND11_EMBEDDED_MODULE(cpp_module, m) {
m.attr("a") = 1;
}
int main() {
py::scoped_interpreter guard{};
auto py_module = py::module_::import("py_module");
auto locals = py::dict("fmt"_a="{} + {} = {}", **py_module.attr("__dict__"));
assert(locals["a"].cast<int>() == 1);
assert(locals["b"].cast<int>() == 2);
py::exec(R"(
c = a + b
message = fmt.format(a, b, c)
)", py::globals(), locals);
assert(locals["c"].cast<int>() == 3);
assert(locals["message"].cast<std::string>() == "1 + 2 = 3");
}
Interpreter lifetime
====================
The Python interpreter shuts down when ``scoped_interpreter`` is destroyed. After
this, creating a new instance will restart the interpreter. Alternatively, the
``initialize_interpreter`` / ``finalize_interpreter`` pair of functions can be used
to directly set the state at any time.
Modules created with pybind11 can be safely re-initialized after the interpreter
has been restarted. However, this may not apply to third-party extension modules.
The issue is that Python itself cannot completely unload extension modules and
there are several caveats with regard to interpreter restarting. In short, not
all memory may be freed, either due to Python reference cycles or user-created
global data. All the details can be found in the CPython documentation.
.. warning::
Creating two concurrent ``scoped_interpreter`` guards is a fatal error. So is
calling ``initialize_interpreter`` for a second time after the interpreter
has already been initialized.
Do not use the raw CPython API functions ``Py_Initialize`` and
``Py_Finalize`` as these do not properly handle the lifetime of
pybind11's internal data.
Sub-interpreter support
=======================
Creating multiple copies of ``scoped_interpreter`` is not possible because it
represents the main Python interpreter. Sub-interpreters are something different
and they do permit the existence of multiple interpreters. This is an advanced
feature of the CPython API and should be handled with care. pybind11 does not
currently offer a C++ interface for sub-interpreters, so refer to the CPython
documentation for all the details regarding this feature.
We'll just mention a couple of caveats the sub-interpreters support in pybind11:
1. Sub-interpreters will not receive independent copies of embedded modules.
Instead, these are shared and modifications in one interpreter may be
reflected in another.
2. Managing multiple threads, multiple interpreters and the GIL can be
challenging and there are several caveats here, even within the pure
CPython API (please refer to the Python docs for details). As for
pybind11, keep in mind that ``gil_scoped_release`` and ``gil_scoped_acquire``
do not take sub-interpreters into account.

View File

@ -0,0 +1,401 @@
Exceptions
##########
Built-in C++ to Python exception translation
============================================
When Python calls C++ code through pybind11, pybind11 provides a C++ exception handler
that will trap C++ exceptions, translate them to the corresponding Python exception,
and raise them so that Python code can handle them.
pybind11 defines translations for ``std::exception`` and its standard
subclasses, and several special exception classes that translate to specific
Python exceptions. Note that these are not actually Python exceptions, so they
cannot be examined using the Python C API. Instead, they are pure C++ objects
that pybind11 will translate the corresponding Python exception when they arrive
at its exception handler.
.. tabularcolumns:: |p{0.5\textwidth}|p{0.45\textwidth}|
+--------------------------------------+--------------------------------------+
| Exception thrown by C++ | Translated to Python exception type |
+======================================+======================================+
| :class:`std::exception` | ``RuntimeError`` |
+--------------------------------------+--------------------------------------+
| :class:`std::bad_alloc` | ``MemoryError`` |
+--------------------------------------+--------------------------------------+
| :class:`std::domain_error` | ``ValueError`` |
+--------------------------------------+--------------------------------------+
| :class:`std::invalid_argument` | ``ValueError`` |
+--------------------------------------+--------------------------------------+
| :class:`std::length_error` | ``ValueError`` |
+--------------------------------------+--------------------------------------+
| :class:`std::out_of_range` | ``IndexError`` |
+--------------------------------------+--------------------------------------+
| :class:`std::range_error` | ``ValueError`` |
+--------------------------------------+--------------------------------------+
| :class:`std::overflow_error` | ``OverflowError`` |
+--------------------------------------+--------------------------------------+
| :class:`pybind11::stop_iteration` | ``StopIteration`` (used to implement |
| | custom iterators) |
+--------------------------------------+--------------------------------------+
| :class:`pybind11::index_error` | ``IndexError`` (used to indicate out |
| | of bounds access in ``__getitem__``, |
| | ``__setitem__``, etc.) |
+--------------------------------------+--------------------------------------+
| :class:`pybind11::key_error` | ``KeyError`` (used to indicate out |
| | of bounds access in ``__getitem__``, |
| | ``__setitem__`` in dict-like |
| | objects, etc.) |
+--------------------------------------+--------------------------------------+
| :class:`pybind11::value_error` | ``ValueError`` (used to indicate |
| | wrong value passed in |
| | ``container.remove(...)``) |
+--------------------------------------+--------------------------------------+
| :class:`pybind11::type_error` | ``TypeError`` |
+--------------------------------------+--------------------------------------+
| :class:`pybind11::buffer_error` | ``BufferError`` |
+--------------------------------------+--------------------------------------+
| :class:`pybind11::import_error` | ``ImportError`` |
+--------------------------------------+--------------------------------------+
| :class:`pybind11::attribute_error` | ``AttributeError`` |
+--------------------------------------+--------------------------------------+
| Any other exception | ``RuntimeError`` |
+--------------------------------------+--------------------------------------+
Exception translation is not bidirectional. That is, *catching* the C++
exceptions defined above will not trap exceptions that originate from
Python. For that, catch :class:`pybind11::error_already_set`. See :ref:`below
<handling_python_exceptions_cpp>` for further details.
There is also a special exception :class:`cast_error` that is thrown by
:func:`handle::call` when the input arguments cannot be converted to Python
objects.
Registering custom translators
==============================
If the default exception conversion policy described above is insufficient,
pybind11 also provides support for registering custom exception translators.
Similar to pybind11 classes, exception translators can be local to the module
they are defined in or global to the entire python session. To register a simple
exception conversion that translates a C++ exception into a new Python exception
using the C++ exception's ``what()`` method, a helper function is available:
.. code-block:: cpp
py::register_exception<CppExp>(module, "PyExp");
This call creates a Python exception class with the name ``PyExp`` in the given
module and automatically converts any encountered exceptions of type ``CppExp``
into Python exceptions of type ``PyExp``.
A matching function is available for registering a local exception translator:
.. code-block:: cpp
py::register_local_exception<CppExp>(module, "PyExp");
It is possible to specify base class for the exception using the third
parameter, a ``handle``:
.. code-block:: cpp
py::register_exception<CppExp>(module, "PyExp", PyExc_RuntimeError);
py::register_local_exception<CppExp>(module, "PyExp", PyExc_RuntimeError);
Then ``PyExp`` can be caught both as ``PyExp`` and ``RuntimeError``.
The class objects of the built-in Python exceptions are listed in the Python
documentation on `Standard Exceptions <https://docs.python.org/3/c-api/exceptions.html#standard-exceptions>`_.
The default base class is ``PyExc_Exception``.
When more advanced exception translation is needed, the functions
``py::register_exception_translator(translator)`` and
``py::register_local_exception_translator(translator)`` can be used to register
functions that can translate arbitrary exception types (and which may include
additional logic to do so). The functions takes a stateless callable (e.g. a
function pointer or a lambda function without captured variables) with the call
signature ``void(std::exception_ptr)``.
When a C++ exception is thrown, the registered exception translators are tried
in reverse order of registration (i.e. the last registered translator gets the
first shot at handling the exception). All local translators will be tried
before a global translator is tried.
Inside the translator, ``std::rethrow_exception`` should be used within
a try block to re-throw the exception. One or more catch clauses to catch
the appropriate exceptions should then be used with each clause using
``py::set_error()`` (see below).
To declare a custom Python exception type, declare a ``py::exception`` variable
and use this in the associated exception translator (note: it is often useful
to make this a static declaration when using it inside a lambda expression
without requiring capturing).
The following example demonstrates this for a hypothetical exception classes
``MyCustomException`` and ``OtherException``: the first is translated to a
custom python exception ``MyCustomError``, while the second is translated to a
standard python RuntimeError:
.. code-block:: cpp
PYBIND11_CONSTINIT static py::gil_safe_call_once_and_store<py::object> exc_storage;
exc_storage.call_once_and_store_result(
[&]() { return py::exception<MyCustomException>(m, "MyCustomError"); });
py::register_exception_translator([](std::exception_ptr p) {
try {
if (p) std::rethrow_exception(p);
} catch (const MyCustomException &e) {
py::set_error(exc_storage.get_stored(), e.what());
} catch (const OtherException &e) {
py::set_error(PyExc_RuntimeError, e.what());
}
});
Multiple exceptions can be handled by a single translator, as shown in the
example above. If the exception is not caught by the current translator, the
previously registered one gets a chance.
If none of the registered exception translators is able to handle the
exception, it is handled by the default converter as described in the previous
section.
.. seealso::
The file :file:`tests/test_exceptions.cpp` contains examples
of various custom exception translators and custom exception types.
.. note::
Call ``py::set_error()`` for every exception caught in a custom exception
translator. Failure to do so will cause Python to crash with ``SystemError:
error return without exception set``.
Exceptions that you do not plan to handle should simply not be caught, or
may be explicitly (re-)thrown to delegate it to the other,
previously-declared existing exception translators.
Note that ``libc++`` and ``libstdc++`` `behave differently under macOS
<https://stackoverflow.com/questions/19496643/using-clang-fvisibility-hidden-and-typeinfo-and-type-erasure/28827430>`_
with ``-fvisibility=hidden``. Therefore exceptions that are used across ABI
boundaries need to be explicitly exported, as exercised in
``tests/test_exceptions.h``. See also:
"Problems with C++ exceptions" under `GCC Wiki <https://gcc.gnu.org/wiki/Visibility>`_.
Local vs Global Exception Translators
=====================================
When a global exception translator is registered, it will be applied across all
modules in the reverse order of registration. This can create behavior where the
order of module import influences how exceptions are translated.
If module1 has the following translator:
.. code-block:: cpp
py::register_exception_translator([](std::exception_ptr p) {
try {
if (p) std::rethrow_exception(p);
} catch (const std::invalid_argument &e) {
py::set_error(PyExc_ArgumentError, "module1 handled this");
}
}
and module2 has the following similar translator:
.. code-block:: cpp
py::register_exception_translator([](std::exception_ptr p) {
try {
if (p) std::rethrow_exception(p);
} catch (const std::invalid_argument &e) {
py::set_error(PyExc_ArgumentError, "module2 handled this");
}
}
then which translator handles the invalid_argument will be determined by the
order that module1 and module2 are imported. Since exception translators are
applied in the reverse order of registration, which ever module was imported
last will "win" and that translator will be applied.
If there are multiple pybind11 modules that share exception types (either
standard built-in or custom) loaded into a single python instance and
consistent error handling behavior is needed, then local translators should be
used.
Changing the previous example to use ``register_local_exception_translator``
would mean that when invalid_argument is thrown in the module2 code, the
module2 translator will always handle it, while in module1, the module1
translator will do the same.
.. _handling_python_exceptions_cpp:
Handling exceptions from Python in C++
======================================
When C++ calls Python functions, such as in a callback function or when
manipulating Python objects, and Python raises an ``Exception``, pybind11
converts the Python exception into a C++ exception of type
:class:`pybind11::error_already_set` whose payload contains a C++ string textual
summary and the actual Python exception. ``error_already_set`` is used to
propagate Python exception back to Python (or possibly, handle them in C++).
.. tabularcolumns:: |p{0.5\textwidth}|p{0.45\textwidth}|
+--------------------------------------+--------------------------------------+
| Exception raised in Python | Thrown as C++ exception type |
+======================================+======================================+
| Any Python ``Exception`` | :class:`pybind11::error_already_set` |
+--------------------------------------+--------------------------------------+
For example:
.. code-block:: cpp
try {
// open("missing.txt", "r")
auto file = py::module_::import("io").attr("open")("missing.txt", "r");
auto text = file.attr("read")();
file.attr("close")();
} catch (py::error_already_set &e) {
if (e.matches(PyExc_FileNotFoundError)) {
py::print("missing.txt not found");
} else if (e.matches(PyExc_PermissionError)) {
py::print("missing.txt found but not accessible");
} else {
throw;
}
}
Note that C++ to Python exception translation does not apply here, since that is
a method for translating C++ exceptions to Python, not vice versa. The error raised
from Python is always ``error_already_set``.
This example illustrates this behavior:
.. code-block:: cpp
try {
py::eval("raise ValueError('The Ring')");
} catch (py::value_error &boromir) {
// Boromir never gets the ring
assert(false);
} catch (py::error_already_set &frodo) {
// Frodo gets the ring
py::print("I will take the ring");
}
try {
// py::value_error is a request for pybind11 to raise a Python exception
throw py::value_error("The ball");
} catch (py::error_already_set &cat) {
// cat won't catch the ball since
// py::value_error is not a Python exception
assert(false);
} catch (py::value_error &dog) {
// dog will catch the ball
py::print("Run Spot run");
throw; // Throw it again (pybind11 will raise ValueError)
}
Handling errors from the Python C API
=====================================
Where possible, use :ref:`pybind11 wrappers <wrappers>` instead of calling
the Python C API directly. When calling the Python C API directly, in
addition to manually managing reference counts, one must follow the pybind11
error protocol, which is outlined here.
After calling the Python C API, if Python returns an error,
``throw py::error_already_set();``, which allows pybind11 to deal with the
exception and pass it back to the Python interpreter. This includes calls to
the error setting functions such as ``py::set_error()``.
.. code-block:: cpp
py::set_error(PyExc_TypeError, "C API type error demo");
throw py::error_already_set();
// But it would be easier to simply...
throw py::type_error("pybind11 wrapper type error");
Alternately, to ignore the error, call `PyErr_Clear
<https://docs.python.org/3/c-api/exceptions.html#c.PyErr_Clear>`_.
Any Python error must be thrown or cleared, or Python/pybind11 will be left in
an invalid state.
Chaining exceptions ('raise from')
==================================
Python has a mechanism for indicating that exceptions were caused by other
exceptions:
.. code-block:: py
try:
print(1 / 0)
except Exception as exc:
raise RuntimeError("could not divide by zero") from exc
To do a similar thing in pybind11, you can use the ``py::raise_from`` function. It
sets the current python error indicator, so to continue propagating the exception
you should ``throw py::error_already_set()``.
.. code-block:: cpp
try {
py::eval("print(1 / 0"));
} catch (py::error_already_set &e) {
py::raise_from(e, PyExc_RuntimeError, "could not divide by zero");
throw py::error_already_set();
}
.. versionadded:: 2.8
.. _unraisable_exceptions:
Handling unraisable exceptions
==============================
If a Python function invoked from a C++ destructor or any function marked
``noexcept(true)`` (collectively, "noexcept functions") throws an exception, there
is no way to propagate the exception, as such functions may not throw.
Should they throw or fail to catch any exceptions in their call graph,
the C++ runtime calls ``std::terminate()`` to abort immediately.
Similarly, Python exceptions raised in a class's ``__del__`` method do not
propagate, but are logged by Python as an unraisable error. In Python 3.8+, a
`system hook is triggered
<https://docs.python.org/3/library/sys.html#sys.unraisablehook>`_
and an auditing event is logged.
Any noexcept function should have a try-catch block that traps
class:`error_already_set` (or any other exception that can occur). Note that
pybind11 wrappers around Python exceptions such as
:class:`pybind11::value_error` are *not* Python exceptions; they are C++
exceptions that pybind11 catches and converts to Python exceptions. Noexcept
functions cannot propagate these exceptions either. A useful approach is to
convert them to Python exceptions and then ``discard_as_unraisable`` as shown
below.
.. code-block:: cpp
void nonthrowing_func() noexcept(true) {
try {
// ...
} catch (py::error_already_set &eas) {
// Discard the Python error using Python APIs, using the C++ magic
// variable __func__. Python already knows the type and value and of the
// exception object.
eas.discard_as_unraisable(__func__);
} catch (const std::exception &e) {
// Log and discard C++ exceptions.
third_party::log(e);
}
}
.. versionadded:: 2.6

View File

@ -0,0 +1,614 @@
Functions
#########
Before proceeding with this section, make sure that you are already familiar
with the basics of binding functions and classes, as explained in :doc:`/basics`
and :doc:`/classes`. The following guide is applicable to both free and member
functions, i.e. *methods* in Python.
.. _return_value_policies:
Return value policies
=====================
Python and C++ use fundamentally different ways of managing the memory and
lifetime of objects managed by them. This can lead to issues when creating
bindings for functions that return a non-trivial type. Just by looking at the
type information, it is not clear whether Python should take charge of the
returned value and eventually free its resources, or if this is handled on the
C++ side. For this reason, pybind11 provides several *return value policy*
annotations that can be passed to the :func:`module_::def` and
:func:`class_::def` functions. The default policy is
:enum:`return_value_policy::automatic`.
Return value policies are tricky, and it's very important to get them right.
Just to illustrate what can go wrong, consider the following simple example:
.. code-block:: cpp
/* Function declaration */
Data *get_data() { return _data; /* (pointer to a static data structure) */ }
...
/* Binding code */
m.def("get_data", &get_data); // <-- KABOOM, will cause crash when called from Python
What's going on here? When ``get_data()`` is called from Python, the return
value (a native C++ type) must be wrapped to turn it into a usable Python type.
In this case, the default return value policy (:enum:`return_value_policy::automatic`)
causes pybind11 to assume ownership of the static ``_data`` instance.
When Python's garbage collector eventually deletes the Python
wrapper, pybind11 will also attempt to delete the C++ instance (via ``operator
delete()``) due to the implied ownership. At this point, the entire application
will come crashing down, though errors could also be more subtle and involve
silent data corruption.
In the above example, the policy :enum:`return_value_policy::reference` should have
been specified so that the global data instance is only *referenced* without any
implied transfer of ownership, i.e.:
.. code-block:: cpp
m.def("get_data", &get_data, py::return_value_policy::reference);
On the other hand, this is not the right policy for many other situations,
where ignoring ownership could lead to resource leaks.
As a developer using pybind11, it's important to be familiar with the different
return value policies, including which situation calls for which one of them.
The following table provides an overview of available policies:
.. tabularcolumns:: |p{0.5\textwidth}|p{0.45\textwidth}|
+--------------------------------------------------+----------------------------------------------------------------------------+
| Return value policy | Description |
+==================================================+============================================================================+
| :enum:`return_value_policy::take_ownership` | Reference an existing object (i.e. do not create a new copy) and take |
| | ownership. Python will call the destructor and delete operator when the |
| | object's reference count reaches zero. Undefined behavior ensues when the |
| | C++ side does the same, or when the data was not dynamically allocated. |
+--------------------------------------------------+----------------------------------------------------------------------------+
| :enum:`return_value_policy::copy` | Create a new copy of the returned object, which will be owned by Python. |
| | This policy is comparably safe because the lifetimes of the two instances |
| | are decoupled. |
+--------------------------------------------------+----------------------------------------------------------------------------+
| :enum:`return_value_policy::move` | Use ``std::move`` to move the return value contents into a new instance |
| | that will be owned by Python. This policy is comparably safe because the |
| | lifetimes of the two instances (move source and destination) are decoupled.|
+--------------------------------------------------+----------------------------------------------------------------------------+
| :enum:`return_value_policy::reference` | Reference an existing object, but do not take ownership. The C++ side is |
| | responsible for managing the object's lifetime and deallocating it when |
| | it is no longer used. Warning: undefined behavior will ensue when the C++ |
| | side deletes an object that is still referenced and used by Python. |
+--------------------------------------------------+----------------------------------------------------------------------------+
| :enum:`return_value_policy::reference_internal` | Indicates that the lifetime of the return value is tied to the lifetime |
| | of a parent object, namely the implicit ``this``, or ``self`` argument of |
| | the called method or property. Internally, this policy works just like |
| | :enum:`return_value_policy::reference` but additionally applies a |
| | ``keep_alive<0, 1>`` *call policy* (described in the next section) that |
| | prevents the parent object from being garbage collected as long as the |
| | return value is referenced by Python. This is the default policy for |
| | property getters created via ``def_property``, ``def_readwrite``, etc. |
+--------------------------------------------------+----------------------------------------------------------------------------+
| :enum:`return_value_policy::automatic` | This policy falls back to the policy |
| | :enum:`return_value_policy::take_ownership` when the return value is a |
| | pointer. Otherwise, it uses :enum:`return_value_policy::move` or |
| | :enum:`return_value_policy::copy` for rvalue and lvalue references, |
| | respectively. See above for a description of what all of these different |
| | policies do. This is the default policy for ``py::class_``-wrapped types. |
+--------------------------------------------------+----------------------------------------------------------------------------+
| :enum:`return_value_policy::automatic_reference` | As above, but use policy :enum:`return_value_policy::reference` when the |
| | return value is a pointer. This is the default conversion policy for |
| | function arguments when calling Python functions manually from C++ code |
| | (i.e. via ``handle::operator()``) and the casters in ``pybind11/stl.h``. |
| | You probably won't need to use this explicitly. |
+--------------------------------------------------+----------------------------------------------------------------------------+
Return value policies can also be applied to properties:
.. code-block:: cpp
class_<MyClass>(m, "MyClass")
.def_property("data", &MyClass::getData, &MyClass::setData,
py::return_value_policy::copy);
Technically, the code above applies the policy to both the getter and the
setter function, however, the setter doesn't really care about *return*
value policies which makes this a convenient terse syntax. Alternatively,
targeted arguments can be passed through the :class:`cpp_function` constructor:
.. code-block:: cpp
class_<MyClass>(m, "MyClass")
.def_property("data",
py::cpp_function(&MyClass::getData, py::return_value_policy::copy),
py::cpp_function(&MyClass::setData)
);
.. warning::
Code with invalid return value policies might access uninitialized memory or
free data structures multiple times, which can lead to hard-to-debug
non-determinism and segmentation faults, hence it is worth spending the
time to understand all the different options in the table above.
.. note::
One important aspect of the above policies is that they only apply to
instances which pybind11 has *not* seen before, in which case the policy
clarifies essential questions about the return value's lifetime and
ownership. When pybind11 knows the instance already (as identified by its
type and address in memory), it will return the existing Python object
wrapper rather than creating a new copy.
.. note::
The next section on :ref:`call_policies` discusses *call policies* that can be
specified *in addition* to a return value policy from the list above. Call
policies indicate reference relationships that can involve both return values
and parameters of functions.
.. note::
As an alternative to elaborate call policies and lifetime management logic,
consider using smart pointers (see the section on :ref:`smart_pointers` for
details). Smart pointers can tell whether an object is still referenced from
C++ or Python, which generally eliminates the kinds of inconsistencies that
can lead to crashes or undefined behavior. For functions returning smart
pointers, it is not necessary to specify a return value policy.
.. _call_policies:
Additional call policies
========================
In addition to the above return value policies, further *call policies* can be
specified to indicate dependencies between parameters or ensure a certain state
for the function call.
Keep alive
----------
In general, this policy is required when the C++ object is any kind of container
and another object is being added to the container. ``keep_alive<Nurse, Patient>``
indicates that the argument with index ``Patient`` should be kept alive at least
until the argument with index ``Nurse`` is freed by the garbage collector. Argument
indices start at one, while zero refers to the return value. For methods, index
``1`` refers to the implicit ``this`` pointer, while regular arguments begin at
index ``2``. Arbitrarily many call policies can be specified. When a ``Nurse``
with value ``None`` is detected at runtime, the call policy does nothing.
When the nurse is not a pybind11-registered type, the implementation internally
relies on the ability to create a *weak reference* to the nurse object. When
the nurse object is not a pybind11-registered type and does not support weak
references, an exception will be thrown.
If you use an incorrect argument index, you will get a ``RuntimeError`` saying
``Could not activate keep_alive!``. You should review the indices you're using.
Consider the following example: here, the binding code for a list append
operation ties the lifetime of the newly added element to the underlying
container:
.. code-block:: cpp
py::class_<List>(m, "List")
.def("append", &List::append, py::keep_alive<1, 2>());
For consistency, the argument indexing is identical for constructors. Index
``1`` still refers to the implicit ``this`` pointer, i.e. the object which is
being constructed. Index ``0`` refers to the return type which is presumed to
be ``void`` when a constructor is viewed like a function. The following example
ties the lifetime of the constructor element to the constructed object:
.. code-block:: cpp
py::class_<Nurse>(m, "Nurse")
.def(py::init<Patient &>(), py::keep_alive<1, 2>());
.. note::
``keep_alive`` is analogous to the ``with_custodian_and_ward`` (if Nurse,
Patient != 0) and ``with_custodian_and_ward_postcall`` (if Nurse/Patient ==
0) policies from Boost.Python.
Call guard
----------
The ``call_guard<T>`` policy allows any scope guard type ``T`` to be placed
around the function call. For example, this definition:
.. code-block:: cpp
m.def("foo", foo, py::call_guard<T>());
is equivalent to the following pseudocode:
.. code-block:: cpp
m.def("foo", [](args...) {
T scope_guard;
return foo(args...); // forwarded arguments
});
The only requirement is that ``T`` is default-constructible, but otherwise any
scope guard will work. This is very useful in combination with ``gil_scoped_release``.
See :ref:`gil`.
Multiple guards can also be specified as ``py::call_guard<T1, T2, T3...>``. The
constructor order is left to right and destruction happens in reverse.
.. seealso::
The file :file:`tests/test_call_policies.cpp` contains a complete example
that demonstrates using `keep_alive` and `call_guard` in more detail.
.. _python_objects_as_args:
Python objects as arguments
===========================
pybind11 exposes all major Python types using thin C++ wrapper classes. These
wrapper classes can also be used as parameters of functions in bindings, which
makes it possible to directly work with native Python types on the C++ side.
For instance, the following statement iterates over a Python ``dict``:
.. code-block:: cpp
void print_dict(const py::dict& dict) {
/* Easily interact with Python types */
for (auto item : dict)
std::cout << "key=" << std::string(py::str(item.first)) << ", "
<< "value=" << std::string(py::str(item.second)) << std::endl;
}
It can be exported:
.. code-block:: cpp
m.def("print_dict", &print_dict);
And used in Python as usual:
.. code-block:: pycon
>>> print_dict({"foo": 123, "bar": "hello"})
key=foo, value=123
key=bar, value=hello
For more information on using Python objects in C++, see :doc:`/advanced/pycpp/index`.
Accepting \*args and \*\*kwargs
===============================
Python provides a useful mechanism to define functions that accept arbitrary
numbers of arguments and keyword arguments:
.. code-block:: python
def generic(*args, **kwargs):
... # do something with args and kwargs
Such functions can also be created using pybind11:
.. code-block:: cpp
void generic(py::args args, const py::kwargs& kwargs) {
/// .. do something with args
if (kwargs)
/// .. do something with kwargs
}
/// Binding code
m.def("generic", &generic);
The class ``py::args`` derives from ``py::tuple`` and ``py::kwargs`` derives
from ``py::dict``.
You may also use just one or the other, and may combine these with other
arguments. Note, however, that ``py::kwargs`` must always be the last argument
of the function, and ``py::args`` implies that any further arguments are
keyword-only (see :ref:`keyword_only_arguments`).
Please refer to the other examples for details on how to iterate over these,
and on how to cast their entries into C++ objects. A demonstration is also
available in ``tests/test_kwargs_and_defaults.cpp``.
.. note::
When combining \*args or \*\*kwargs with :ref:`keyword_args` you should
*not* include ``py::arg`` tags for the ``py::args`` and ``py::kwargs``
arguments.
Default arguments revisited
===========================
The section on :ref:`default_args` previously discussed basic usage of default
arguments using pybind11. One noteworthy aspect of their implementation is that
default arguments are converted to Python objects right at declaration time.
Consider the following example:
.. code-block:: cpp
py::class_<MyClass>("MyClass")
.def("myFunction", py::arg("arg") = SomeType(123));
In this case, pybind11 must already be set up to deal with values of the type
``SomeType`` (via a prior instantiation of ``py::class_<SomeType>``), or an
exception will be thrown.
Another aspect worth highlighting is that the "preview" of the default argument
in the function signature is generated using the object's ``__repr__`` method.
If not available, the signature may not be very helpful, e.g.:
.. code-block:: pycon
FUNCTIONS
...
| myFunction(...)
| Signature : (MyClass, arg : SomeType = <SomeType object at 0x101b7b080>) -> NoneType
...
The first way of addressing this is by defining ``SomeType.__repr__``.
Alternatively, it is possible to specify the human-readable preview of the
default argument manually using the ``arg_v`` notation:
.. code-block:: cpp
py::class_<MyClass>("MyClass")
.def("myFunction", py::arg_v("arg", SomeType(123), "SomeType(123)"));
Sometimes it may be necessary to pass a null pointer value as a default
argument. In this case, remember to cast it to the underlying type in question,
like so:
.. code-block:: cpp
py::class_<MyClass>("MyClass")
.def("myFunction", py::arg("arg") = static_cast<SomeType *>(nullptr));
.. _keyword_only_arguments:
Keyword-only arguments
======================
Python implements keyword-only arguments by specifying an unnamed ``*``
argument in a function definition:
.. code-block:: python
def f(a, *, b): # a can be positional or via keyword; b must be via keyword
pass
f(a=1, b=2) # good
f(b=2, a=1) # good
f(1, b=2) # good
f(1, 2) # TypeError: f() takes 1 positional argument but 2 were given
Pybind11 provides a ``py::kw_only`` object that allows you to implement
the same behaviour by specifying the object between positional and keyword-only
argument annotations when registering the function:
.. code-block:: cpp
m.def("f", [](int a, int b) { /* ... */ },
py::arg("a"), py::kw_only(), py::arg("b"));
.. versionadded:: 2.6
A ``py::args`` argument implies that any following arguments are keyword-only,
as if ``py::kw_only()`` had been specified in the same relative location of the
argument list as the ``py::args`` argument. The ``py::kw_only()`` may be
included to be explicit about this, but is not required.
.. versionchanged:: 2.9
This can now be combined with ``py::args``. Before, ``py::args`` could only
occur at the end of the argument list, or immediately before a ``py::kwargs``
argument at the end.
Positional-only arguments
=========================
Python 3.8 introduced a new positional-only argument syntax, using ``/`` in the
function definition (note that this has been a convention for CPython
positional arguments, such as in ``pow()``, since Python 2). You can
do the same thing in any version of Python using ``py::pos_only()``:
.. code-block:: cpp
m.def("f", [](int a, int b) { /* ... */ },
py::arg("a"), py::pos_only(), py::arg("b"));
You now cannot give argument ``a`` by keyword. This can be combined with
keyword-only arguments, as well.
.. versionadded:: 2.6
.. _nonconverting_arguments:
Non-converting arguments
========================
Certain argument types may support conversion from one type to another. Some
examples of conversions are:
* :ref:`implicit_conversions` declared using ``py::implicitly_convertible<A,B>()``
* Calling a method accepting a double with an integer argument
* Calling a ``std::complex<float>`` argument with a non-complex python type
(for example, with a float). (Requires the optional ``pybind11/complex.h``
header).
* Calling a function taking an Eigen matrix reference with a numpy array of the
wrong type or of an incompatible data layout. (Requires the optional
``pybind11/eigen.h`` header).
This behaviour is sometimes undesirable: the binding code may prefer to raise
an error rather than convert the argument. This behaviour can be obtained
through ``py::arg`` by calling the ``.noconvert()`` method of the ``py::arg``
object, such as:
.. code-block:: cpp
m.def("floats_only", [](double f) { return 0.5 * f; }, py::arg("f").noconvert());
m.def("floats_preferred", [](double f) { return 0.5 * f; }, py::arg("f"));
Attempting the call the second function (the one without ``.noconvert()``) with
an integer will succeed, but attempting to call the ``.noconvert()`` version
will fail with a ``TypeError``:
.. code-block:: pycon
>>> floats_preferred(4)
2.0
>>> floats_only(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: floats_only(): incompatible function arguments. The following argument types are supported:
1. (f: float) -> float
Invoked with: 4
You may, of course, combine this with the :var:`_a` shorthand notation (see
:ref:`keyword_args`) and/or :ref:`default_args`. It is also permitted to omit
the argument name by using the ``py::arg()`` constructor without an argument
name, i.e. by specifying ``py::arg().noconvert()``.
.. note::
When specifying ``py::arg`` options it is necessary to provide the same
number of options as the bound function has arguments. Thus if you want to
enable no-convert behaviour for just one of several arguments, you will
need to specify a ``py::arg()`` annotation for each argument with the
no-convert argument modified to ``py::arg().noconvert()``.
.. _none_arguments:
Allow/Prohibiting None arguments
================================
When a C++ type registered with :class:`py::class_` is passed as an argument to
a function taking the instance as pointer or shared holder (e.g. ``shared_ptr``
or a custom, copyable holder as described in :ref:`smart_pointers`), pybind
allows ``None`` to be passed from Python which results in calling the C++
function with ``nullptr`` (or an empty holder) for the argument.
To explicitly enable or disable this behaviour, using the
``.none`` method of the :class:`py::arg` object:
.. code-block:: cpp
py::class_<Dog>(m, "Dog").def(py::init<>());
py::class_<Cat>(m, "Cat").def(py::init<>());
m.def("bark", [](Dog *dog) -> std::string {
if (dog) return "woof!"; /* Called with a Dog instance */
else return "(no dog)"; /* Called with None, dog == nullptr */
}, py::arg("dog").none(true));
m.def("meow", [](Cat *cat) -> std::string {
// Can't be called with None argument
return "meow";
}, py::arg("cat").none(false));
With the above, the Python call ``bark(None)`` will return the string ``"(no
dog)"``, while attempting to call ``meow(None)`` will raise a ``TypeError``:
.. code-block:: pycon
>>> from animals import Dog, Cat, bark, meow
>>> bark(Dog())
'woof!'
>>> meow(Cat())
'meow'
>>> bark(None)
'(no dog)'
>>> meow(None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: meow(): incompatible function arguments. The following argument types are supported:
1. (cat: animals.Cat) -> str
Invoked with: None
The default behaviour when the tag is unspecified is to allow ``None``.
.. note::
Even when ``.none(true)`` is specified for an argument, ``None`` will be converted to a
``nullptr`` *only* for custom and :ref:`opaque <opaque>` types. Pointers to built-in types
(``double *``, ``int *``, ...) and STL types (``std::vector<T> *``, ...; if ``pybind11/stl.h``
is included) are copied when converted to C++ (see :doc:`/advanced/cast/overview`) and will
not allow ``None`` as argument. To pass optional argument of these copied types consider
using ``std::optional<T>``
.. _overload_resolution:
Overload resolution order
=========================
When a function or method with multiple overloads is called from Python,
pybind11 determines which overload to call in two passes. The first pass
attempts to call each overload without allowing argument conversion (as if
every argument had been specified as ``py::arg().noconvert()`` as described
above).
If no overload succeeds in the no-conversion first pass, a second pass is
attempted in which argument conversion is allowed (except where prohibited via
an explicit ``py::arg().noconvert()`` attribute in the function definition).
If the second pass also fails a ``TypeError`` is raised.
Within each pass, overloads are tried in the order they were registered with
pybind11. If the ``py::prepend()`` tag is added to the definition, a function
can be placed at the beginning of the overload sequence instead, allowing user
overloads to proceed built in functions.
What this means in practice is that pybind11 will prefer any overload that does
not require conversion of arguments to an overload that does, but otherwise
prefers earlier-defined overloads to later-defined ones.
.. note::
pybind11 does *not* further prioritize based on the number/pattern of
overloaded arguments. That is, pybind11 does not prioritize a function
requiring one conversion over one requiring three, but only prioritizes
overloads requiring no conversion at all to overloads that require
conversion of at least one argument.
.. versionadded:: 2.6
The ``py::prepend()`` tag.
Binding functions with template parameters
==========================================
You can bind functions that have template parameters. Here's a function:
.. code-block:: cpp
template <typename T>
void set(T t);
C++ templates cannot be instantiated at runtime, so you cannot bind the
non-instantiated function:
.. code-block:: cpp
// BROKEN (this will not compile)
m.def("set", &set);
You must bind each instantiated function template separately. You may bind
each instantiation with the same name, which will be treated the same as
an overloaded function:
.. code-block:: cpp
m.def("set", &set<int>);
m.def("set", &set<std::string>);
Sometimes it's more clear to bind them with separate names, which is also
an option:
.. code-block:: cpp
m.def("setInt", &set<int>);
m.def("setString", &set<std::string>);

429
3rdparty/pybind11/docs/advanced/misc.rst vendored Normal file
View File

@ -0,0 +1,429 @@
Miscellaneous
#############
.. _macro_notes:
General notes regarding convenience macros
==========================================
pybind11 provides a few convenience macros such as
:func:`PYBIND11_DECLARE_HOLDER_TYPE` and ``PYBIND11_OVERRIDE_*``. Since these
are "just" macros that are evaluated in the preprocessor (which has no concept
of types), they *will* get confused by commas in a template argument; for
example, consider:
.. code-block:: cpp
PYBIND11_OVERRIDE(MyReturnType<T1, T2>, Class<T3, T4>, func)
The limitation of the C preprocessor interprets this as five arguments (with new
arguments beginning after each comma) rather than three. To get around this,
there are two alternatives: you can use a type alias, or you can wrap the type
using the ``PYBIND11_TYPE`` macro:
.. code-block:: cpp
// Version 1: using a type alias
using ReturnType = MyReturnType<T1, T2>;
using ClassType = Class<T3, T4>;
PYBIND11_OVERRIDE(ReturnType, ClassType, func);
// Version 2: using the PYBIND11_TYPE macro:
PYBIND11_OVERRIDE(PYBIND11_TYPE(MyReturnType<T1, T2>),
PYBIND11_TYPE(Class<T3, T4>), func)
The ``PYBIND11_MAKE_OPAQUE`` macro does *not* require the above workarounds.
.. _gil:
Global Interpreter Lock (GIL)
=============================
The Python C API dictates that the Global Interpreter Lock (GIL) must always
be held by the current thread to safely access Python objects. As a result,
when Python calls into C++ via pybind11 the GIL must be held, and pybind11
will never implicitly release the GIL.
.. code-block:: cpp
void my_function() {
/* GIL is held when this function is called from Python */
}
PYBIND11_MODULE(example, m) {
m.def("my_function", &my_function);
}
pybind11 will ensure that the GIL is held when it knows that it is calling
Python code. For example, if a Python callback is passed to C++ code via
``std::function``, when C++ code calls the function the built-in wrapper
will acquire the GIL before calling the Python callback. Similarly, the
``PYBIND11_OVERRIDE`` family of macros will acquire the GIL before calling
back into Python.
When writing C++ code that is called from other C++ code, if that code accesses
Python state, it must explicitly acquire and release the GIL.
The classes :class:`gil_scoped_release` and :class:`gil_scoped_acquire` can be
used to acquire and release the global interpreter lock in the body of a C++
function call. In this way, long-running C++ code can be parallelized using
multiple Python threads, **but great care must be taken** when any
:class:`gil_scoped_release` appear: if there is any way that the C++ code
can access Python objects, :class:`gil_scoped_acquire` should be used to
reacquire the GIL. Taking :ref:`overriding_virtuals` as an example, this
could be realized as follows (important changes highlighted):
.. code-block:: cpp
:emphasize-lines: 8,30,31
class PyAnimal : public Animal {
public:
/* Inherit the constructors */
using Animal::Animal;
/* Trampoline (need one for each virtual function) */
std::string go(int n_times) {
/* PYBIND11_OVERRIDE_PURE will acquire the GIL before accessing Python state */
PYBIND11_OVERRIDE_PURE(
std::string, /* Return type */
Animal, /* Parent class */
go, /* Name of function */
n_times /* Argument(s) */
);
}
};
PYBIND11_MODULE(example, m) {
py::class_<Animal, PyAnimal> animal(m, "Animal");
animal
.def(py::init<>())
.def("go", &Animal::go);
py::class_<Dog>(m, "Dog", animal)
.def(py::init<>());
m.def("call_go", [](Animal *animal) -> std::string {
// GIL is held when called from Python code. Release GIL before
// calling into (potentially long-running) C++ code
py::gil_scoped_release release;
return call_go(animal);
});
}
The ``call_go`` wrapper can also be simplified using the ``call_guard`` policy
(see :ref:`call_policies`) which yields the same result:
.. code-block:: cpp
m.def("call_go", &call_go, py::call_guard<py::gil_scoped_release>());
Common Sources Of Global Interpreter Lock Errors
==================================================================
Failing to properly hold the Global Interpreter Lock (GIL) is one of the
more common sources of bugs within code that uses pybind11. If you are
running into GIL related errors, we highly recommend you consult the
following checklist.
- Do you have any global variables that are pybind11 objects or invoke
pybind11 functions in either their constructor or destructor? You are generally
not allowed to invoke any Python function in a global static context. We recommend
using lazy initialization and then intentionally leaking at the end of the program.
- Do you have any pybind11 objects that are members of other C++ structures? One
commonly overlooked requirement is that pybind11 objects have to increase their reference count
whenever their copy constructor is called. Thus, you need to be holding the GIL to invoke
the copy constructor of any C++ class that has a pybind11 member. This can sometimes be very
tricky to track for complicated programs Think carefully when you make a pybind11 object
a member in another struct.
- C++ destructors that invoke Python functions can be particularly troublesome as
destructors can sometimes get invoked in weird and unexpected circumstances as a result
of exceptions.
- You should try running your code in a debug build. That will enable additional assertions
within pybind11 that will throw exceptions on certain GIL handling errors
(reference counting operations).
Binding sequence data types, iterators, the slicing protocol, etc.
==================================================================
Please refer to the supplemental example for details.
.. seealso::
The file :file:`tests/test_sequences_and_iterators.cpp` contains a
complete example that shows how to bind a sequence data type, including
length queries (``__len__``), iterators (``__iter__``), the slicing
protocol and other kinds of useful operations.
Partitioning code over multiple extension modules
=================================================
It's straightforward to split binding code over multiple extension modules,
while referencing types that are declared elsewhere. Everything "just" works
without any special precautions. One exception to this rule occurs when
extending a type declared in another extension module. Recall the basic example
from Section :ref:`inheritance`.
.. code-block:: cpp
py::class_<Pet> pet(m, "Pet");
pet.def(py::init<const std::string &>())
.def_readwrite("name", &Pet::name);
py::class_<Dog>(m, "Dog", pet /* <- specify parent */)
.def(py::init<const std::string &>())
.def("bark", &Dog::bark);
Suppose now that ``Pet`` bindings are defined in a module named ``basic``,
whereas the ``Dog`` bindings are defined somewhere else. The challenge is of
course that the variable ``pet`` is not available anymore though it is needed
to indicate the inheritance relationship to the constructor of ``class_<Dog>``.
However, it can be acquired as follows:
.. code-block:: cpp
py::object pet = (py::object) py::module_::import("basic").attr("Pet");
py::class_<Dog>(m, "Dog", pet)
.def(py::init<const std::string &>())
.def("bark", &Dog::bark);
Alternatively, you can specify the base class as a template parameter option to
``class_``, which performs an automated lookup of the corresponding Python
type. Like the above code, however, this also requires invoking the ``import``
function once to ensure that the pybind11 binding code of the module ``basic``
has been executed:
.. code-block:: cpp
py::module_::import("basic");
py::class_<Dog, Pet>(m, "Dog")
.def(py::init<const std::string &>())
.def("bark", &Dog::bark);
Naturally, both methods will fail when there are cyclic dependencies.
Note that pybind11 code compiled with hidden-by-default symbol visibility (e.g.
via the command line flag ``-fvisibility=hidden`` on GCC/Clang), which is
required for proper pybind11 functionality, can interfere with the ability to
access types defined in another extension module. Working around this requires
manually exporting types that are accessed by multiple extension modules;
pybind11 provides a macro to do just this:
.. code-block:: cpp
class PYBIND11_EXPORT Dog : public Animal {
...
};
Note also that it is possible (although would rarely be required) to share arbitrary
C++ objects between extension modules at runtime. Internal library data is shared
between modules using capsule machinery [#f6]_ which can be also utilized for
storing, modifying and accessing user-defined data. Note that an extension module
will "see" other extensions' data if and only if they were built with the same
pybind11 version. Consider the following example:
.. code-block:: cpp
auto data = reinterpret_cast<MyData *>(py::get_shared_data("mydata"));
if (!data)
data = static_cast<MyData *>(py::set_shared_data("mydata", new MyData(42)));
If the above snippet was used in several separately compiled extension modules,
the first one to be imported would create a ``MyData`` instance and associate
a ``"mydata"`` key with a pointer to it. Extensions that are imported later
would be then able to access the data behind the same pointer.
.. [#f6] https://docs.python.org/3/extending/extending.html#using-capsules
Module Destructors
==================
pybind11 does not provide an explicit mechanism to invoke cleanup code at
module destruction time. In rare cases where such functionality is required, it
is possible to emulate it using Python capsules or weak references with a
destruction callback.
.. code-block:: cpp
auto cleanup_callback = []() {
// perform cleanup here -- this function is called with the GIL held
};
m.add_object("_cleanup", py::capsule(cleanup_callback));
This approach has the potential downside that instances of classes exposed
within the module may still be alive when the cleanup callback is invoked
(whether this is acceptable will generally depend on the application).
Alternatively, the capsule may also be stashed within a type object, which
ensures that it not called before all instances of that type have been
collected:
.. code-block:: cpp
auto cleanup_callback = []() { /* ... */ };
m.attr("BaseClass").attr("_cleanup") = py::capsule(cleanup_callback);
Both approaches also expose a potentially dangerous ``_cleanup`` attribute in
Python, which may be undesirable from an API standpoint (a premature explicit
call from Python might lead to undefined behavior). Yet another approach that
avoids this issue involves weak reference with a cleanup callback:
.. code-block:: cpp
// Register a callback function that is invoked when the BaseClass object is collected
py::cpp_function cleanup_callback(
[](py::handle weakref) {
// perform cleanup here -- this function is called with the GIL held
weakref.dec_ref(); // release weak reference
}
);
// Create a weak reference with a cleanup callback and initially leak it
(void) py::weakref(m.attr("BaseClass"), cleanup_callback).release();
.. note::
PyPy does not garbage collect objects when the interpreter exits. An alternative
approach (which also works on CPython) is to use the :py:mod:`atexit` module [#f7]_,
for example:
.. code-block:: cpp
auto atexit = py::module_::import("atexit");
atexit.attr("register")(py::cpp_function([]() {
// perform cleanup here -- this function is called with the GIL held
}));
.. [#f7] https://docs.python.org/3/library/atexit.html
Generating documentation using Sphinx
=====================================
Sphinx [#f4]_ has the ability to inspect the signatures and documentation
strings in pybind11-based extension modules to automatically generate beautiful
documentation in a variety formats. The python_example repository [#f5]_ contains a
simple example repository which uses this approach.
There are two potential gotchas when using this approach: first, make sure that
the resulting strings do not contain any :kbd:`TAB` characters, which break the
docstring parsing routines. You may want to use C++11 raw string literals,
which are convenient for multi-line comments. Conveniently, any excess
indentation will be automatically be removed by Sphinx. However, for this to
work, it is important that all lines are indented consistently, i.e.:
.. code-block:: cpp
// ok
m.def("foo", &foo, R"mydelimiter(
The foo function
Parameters
----------
)mydelimiter");
// *not ok*
m.def("foo", &foo, R"mydelimiter(The foo function
Parameters
----------
)mydelimiter");
By default, pybind11 automatically generates and prepends a signature to the docstring of a function
registered with ``module_::def()`` and ``class_::def()``. Sometimes this
behavior is not desirable, because you want to provide your own signature or remove
the docstring completely to exclude the function from the Sphinx documentation.
The class ``options`` allows you to selectively suppress auto-generated signatures:
.. code-block:: cpp
PYBIND11_MODULE(example, m) {
py::options options;
options.disable_function_signatures();
m.def("add", [](int a, int b) { return a + b; }, "A function which adds two numbers");
}
pybind11 also appends all members of an enum to the resulting enum docstring.
This default behavior can be disabled by using the ``disable_enum_members_docstring()``
function of the ``options`` class.
With ``disable_user_defined_docstrings()`` all user defined docstrings of
``module_::def()``, ``class_::def()`` and ``enum_()`` are disabled, but the
function signatures and enum members are included in the docstring, unless they
are disabled separately.
Note that changes to the settings affect only function bindings created during the
lifetime of the ``options`` instance. When it goes out of scope at the end of the module's init function,
the default settings are restored to prevent unwanted side effects.
.. [#f4] http://www.sphinx-doc.org
.. [#f5] http://github.com/pybind/python_example
.. _avoiding-cpp-types-in-docstrings:
Avoiding C++ types in docstrings
================================
Docstrings are generated at the time of the declaration, e.g. when ``.def(...)`` is called.
At this point parameter and return types should be known to pybind11.
If a custom type is not exposed yet through a ``py::class_`` constructor or a custom type caster,
its C++ type name will be used instead to generate the signature in the docstring:
.. code-block:: text
| __init__(...)
| __init__(self: example.Foo, arg0: ns::Bar) -> None
^^^^^^^
This limitation can be circumvented by ensuring that C++ classes are registered with pybind11
before they are used as a parameter or return type of a function:
.. code-block:: cpp
PYBIND11_MODULE(example, m) {
auto pyFoo = py::class_<ns::Foo>(m, "Foo");
auto pyBar = py::class_<ns::Bar>(m, "Bar");
pyFoo.def(py::init<const ns::Bar&>());
pyBar.def(py::init<const ns::Foo&>());
}
Setting inner type hints in docstrings
======================================
When you use pybind11 wrappers for ``list``, ``dict``, and other generic python
types, the docstring will just display the generic type. You can convey the
inner types in the docstring by using a special 'typed' version of the generic
type.
.. code-block:: cpp
PYBIND11_MODULE(example, m) {
m.def("pass_list_of_str", [](py::typing::List<py::str> arg) {
// arg can be used just like py::list
));
}
The resulting docstring will be ``pass_list_of_str(arg0: list[str]) -> None``.
The following special types are available in ``pybind11/typing.h``:
* ``py::Tuple<Args...>``
* ``py::Dict<K, V>``
* ``py::List<V>``
* ``py::Set<V>``
* ``py::Callable<Signature>``
.. warning:: Just like in python, these are merely hints. They don't actually
enforce the types of their contents at runtime or compile time.

View File

@ -0,0 +1,13 @@
Python C++ interface
####################
pybind11 exposes Python types and functions using thin C++ wrappers, which
makes it possible to conveniently call Python code from C++ without resorting
to Python's C API.
.. toctree::
:maxdepth: 2
object
numpy
utilities

View File

@ -0,0 +1,455 @@
.. _numpy:
NumPy
#####
Buffer protocol
===============
Python supports an extremely general and convenient approach for exchanging
data between plugin libraries. Types can expose a buffer view [#f2]_, which
provides fast direct access to the raw internal data representation. Suppose we
want to bind the following simplistic Matrix class:
.. code-block:: cpp
class Matrix {
public:
Matrix(size_t rows, size_t cols) : m_rows(rows), m_cols(cols) {
m_data = new float[rows*cols];
}
float *data() { return m_data; }
size_t rows() const { return m_rows; }
size_t cols() const { return m_cols; }
private:
size_t m_rows, m_cols;
float *m_data;
};
The following binding code exposes the ``Matrix`` contents as a buffer object,
making it possible to cast Matrices into NumPy arrays. It is even possible to
completely avoid copy operations with Python expressions like
``np.array(matrix_instance, copy = False)``.
.. code-block:: cpp
py::class_<Matrix>(m, "Matrix", py::buffer_protocol())
.def_buffer([](Matrix &m) -> py::buffer_info {
return py::buffer_info(
m.data(), /* Pointer to buffer */
sizeof(float), /* Size of one scalar */
py::format_descriptor<float>::format(), /* Python struct-style format descriptor */
2, /* Number of dimensions */
{ m.rows(), m.cols() }, /* Buffer dimensions */
{ sizeof(float) * m.cols(), /* Strides (in bytes) for each index */
sizeof(float) }
);
});
Supporting the buffer protocol in a new type involves specifying the special
``py::buffer_protocol()`` tag in the ``py::class_`` constructor and calling the
``def_buffer()`` method with a lambda function that creates a
``py::buffer_info`` description record on demand describing a given matrix
instance. The contents of ``py::buffer_info`` mirror the Python buffer protocol
specification.
.. code-block:: cpp
struct buffer_info {
void *ptr;
py::ssize_t itemsize;
std::string format;
py::ssize_t ndim;
std::vector<py::ssize_t> shape;
std::vector<py::ssize_t> strides;
};
To create a C++ function that can take a Python buffer object as an argument,
simply use the type ``py::buffer`` as one of its arguments. Buffers can exist
in a great variety of configurations, hence some safety checks are usually
necessary in the function body. Below, you can see a basic example on how to
define a custom constructor for the Eigen double precision matrix
(``Eigen::MatrixXd``) type, which supports initialization from compatible
buffer objects (e.g. a NumPy matrix).
.. code-block:: cpp
/* Bind MatrixXd (or some other Eigen type) to Python */
typedef Eigen::MatrixXd Matrix;
typedef Matrix::Scalar Scalar;
constexpr bool rowMajor = Matrix::Flags & Eigen::RowMajorBit;
py::class_<Matrix>(m, "Matrix", py::buffer_protocol())
.def(py::init([](py::buffer b) {
typedef Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic> Strides;
/* Request a buffer descriptor from Python */
py::buffer_info info = b.request();
/* Some basic validation checks ... */
if (info.format != py::format_descriptor<Scalar>::format())
throw std::runtime_error("Incompatible format: expected a double array!");
if (info.ndim != 2)
throw std::runtime_error("Incompatible buffer dimension!");
auto strides = Strides(
info.strides[rowMajor ? 0 : 1] / (py::ssize_t)sizeof(Scalar),
info.strides[rowMajor ? 1 : 0] / (py::ssize_t)sizeof(Scalar));
auto map = Eigen::Map<Matrix, 0, Strides>(
static_cast<Scalar *>(info.ptr), info.shape[0], info.shape[1], strides);
return Matrix(map);
}));
For reference, the ``def_buffer()`` call for this Eigen data type should look
as follows:
.. code-block:: cpp
.def_buffer([](Matrix &m) -> py::buffer_info {
return py::buffer_info(
m.data(), /* Pointer to buffer */
sizeof(Scalar), /* Size of one scalar */
py::format_descriptor<Scalar>::format(), /* Python struct-style format descriptor */
2, /* Number of dimensions */
{ m.rows(), m.cols() }, /* Buffer dimensions */
{ sizeof(Scalar) * (rowMajor ? m.cols() : 1),
sizeof(Scalar) * (rowMajor ? 1 : m.rows()) }
/* Strides (in bytes) for each index */
);
})
For a much easier approach of binding Eigen types (although with some
limitations), refer to the section on :doc:`/advanced/cast/eigen`.
.. seealso::
The file :file:`tests/test_buffers.cpp` contains a complete example
that demonstrates using the buffer protocol with pybind11 in more detail.
.. [#f2] http://docs.python.org/3/c-api/buffer.html
Arrays
======
By exchanging ``py::buffer`` with ``py::array`` in the above snippet, we can
restrict the function so that it only accepts NumPy arrays (rather than any
type of Python object satisfying the buffer protocol).
In many situations, we want to define a function which only accepts a NumPy
array of a certain data type. This is possible via the ``py::array_t<T>``
template. For instance, the following function requires the argument to be a
NumPy array containing double precision values.
.. code-block:: cpp
void f(py::array_t<double> array);
When it is invoked with a different type (e.g. an integer or a list of
integers), the binding code will attempt to cast the input into a NumPy array
of the requested type. This feature requires the :file:`pybind11/numpy.h`
header to be included. Note that :file:`pybind11/numpy.h` does not depend on
the NumPy headers, and thus can be used without declaring a build-time
dependency on NumPy; NumPy>=1.7.0 is a runtime dependency.
Data in NumPy arrays is not guaranteed to packed in a dense manner;
furthermore, entries can be separated by arbitrary column and row strides.
Sometimes, it can be useful to require a function to only accept dense arrays
using either the C (row-major) or Fortran (column-major) ordering. This can be
accomplished via a second template argument with values ``py::array::c_style``
or ``py::array::f_style``.
.. code-block:: cpp
void f(py::array_t<double, py::array::c_style | py::array::forcecast> array);
The ``py::array::forcecast`` argument is the default value of the second
template parameter, and it ensures that non-conforming arguments are converted
into an array satisfying the specified requirements instead of trying the next
function overload.
There are several methods on arrays; the methods listed below under references
work, as well as the following functions based on the NumPy API:
- ``.dtype()`` returns the type of the contained values.
- ``.strides()`` returns a pointer to the strides of the array (optionally pass
an integer axis to get a number).
- ``.flags()`` returns the flag settings. ``.writable()`` and ``.owndata()``
are directly available.
- ``.offset_at()`` returns the offset (optionally pass indices).
- ``.squeeze()`` returns a view with length-1 axes removed.
- ``.view(dtype)`` returns a view of the array with a different dtype.
- ``.reshape({i, j, ...})`` returns a view of the array with a different shape.
``.resize({...})`` is also available.
- ``.index_at(i, j, ...)`` gets the count from the beginning to a given index.
There are also several methods for getting references (described below).
Structured types
================
In order for ``py::array_t`` to work with structured (record) types, we first
need to register the memory layout of the type. This can be done via
``PYBIND11_NUMPY_DTYPE`` macro, called in the plugin definition code, which
expects the type followed by field names:
.. code-block:: cpp
struct A {
int x;
double y;
};
struct B {
int z;
A a;
};
// ...
PYBIND11_MODULE(test, m) {
// ...
PYBIND11_NUMPY_DTYPE(A, x, y);
PYBIND11_NUMPY_DTYPE(B, z, a);
/* now both A and B can be used as template arguments to py::array_t */
}
The structure should consist of fundamental arithmetic types, ``std::complex``,
previously registered substructures, and arrays of any of the above. Both C++
arrays and ``std::array`` are supported. While there is a static assertion to
prevent many types of unsupported structures, it is still the user's
responsibility to use only "plain" structures that can be safely manipulated as
raw memory without violating invariants.
Vectorizing functions
=====================
Suppose we want to bind a function with the following signature to Python so
that it can process arbitrary NumPy array arguments (vectors, matrices, general
N-D arrays) in addition to its normal arguments:
.. code-block:: cpp
double my_func(int x, float y, double z);
After including the ``pybind11/numpy.h`` header, this is extremely simple:
.. code-block:: cpp
m.def("vectorized_func", py::vectorize(my_func));
Invoking the function like below causes 4 calls to be made to ``my_func`` with
each of the array elements. The significant advantage of this compared to
solutions like ``numpy.vectorize()`` is that the loop over the elements runs
entirely on the C++ side and can be crunched down into a tight, optimized loop
by the compiler. The result is returned as a NumPy array of type
``numpy.dtype.float64``.
.. code-block:: pycon
>>> x = np.array([[1, 3], [5, 7]])
>>> y = np.array([[2, 4], [6, 8]])
>>> z = 3
>>> result = vectorized_func(x, y, z)
The scalar argument ``z`` is transparently replicated 4 times. The input
arrays ``x`` and ``y`` are automatically converted into the right types (they
are of type ``numpy.dtype.int64`` but need to be ``numpy.dtype.int32`` and
``numpy.dtype.float32``, respectively).
.. note::
Only arithmetic, complex, and POD types passed by value or by ``const &``
reference are vectorized; all other arguments are passed through as-is.
Functions taking rvalue reference arguments cannot be vectorized.
In cases where the computation is too complicated to be reduced to
``vectorize``, it will be necessary to create and access the buffer contents
manually. The following snippet contains a complete example that shows how this
works (the code is somewhat contrived, since it could have been done more
simply using ``vectorize``).
.. code-block:: cpp
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
namespace py = pybind11;
py::array_t<double> add_arrays(py::array_t<double> input1, py::array_t<double> input2) {
py::buffer_info buf1 = input1.request(), buf2 = input2.request();
if (buf1.ndim != 1 || buf2.ndim != 1)
throw std::runtime_error("Number of dimensions must be one");
if (buf1.size != buf2.size)
throw std::runtime_error("Input shapes must match");
/* No pointer is passed, so NumPy will allocate the buffer */
auto result = py::array_t<double>(buf1.size);
py::buffer_info buf3 = result.request();
double *ptr1 = static_cast<double *>(buf1.ptr);
double *ptr2 = static_cast<double *>(buf2.ptr);
double *ptr3 = static_cast<double *>(buf3.ptr);
for (size_t idx = 0; idx < buf1.shape[0]; idx++)
ptr3[idx] = ptr1[idx] + ptr2[idx];
return result;
}
PYBIND11_MODULE(test, m) {
m.def("add_arrays", &add_arrays, "Add two NumPy arrays");
}
.. seealso::
The file :file:`tests/test_numpy_vectorize.cpp` contains a complete
example that demonstrates using :func:`vectorize` in more detail.
Direct access
=============
For performance reasons, particularly when dealing with very large arrays, it
is often desirable to directly access array elements without internal checking
of dimensions and bounds on every access when indices are known to be already
valid. To avoid such checks, the ``array`` class and ``array_t<T>`` template
class offer an unchecked proxy object that can be used for this unchecked
access through the ``unchecked<N>`` and ``mutable_unchecked<N>`` methods,
where ``N`` gives the required dimensionality of the array:
.. code-block:: cpp
m.def("sum_3d", [](py::array_t<double> x) {
auto r = x.unchecked<3>(); // x must have ndim = 3; can be non-writeable
double sum = 0;
for (py::ssize_t i = 0; i < r.shape(0); i++)
for (py::ssize_t j = 0; j < r.shape(1); j++)
for (py::ssize_t k = 0; k < r.shape(2); k++)
sum += r(i, j, k);
return sum;
});
m.def("increment_3d", [](py::array_t<double> x) {
auto r = x.mutable_unchecked<3>(); // Will throw if ndim != 3 or flags.writeable is false
for (py::ssize_t i = 0; i < r.shape(0); i++)
for (py::ssize_t j = 0; j < r.shape(1); j++)
for (py::ssize_t k = 0; k < r.shape(2); k++)
r(i, j, k) += 1.0;
}, py::arg().noconvert());
To obtain the proxy from an ``array`` object, you must specify both the data
type and number of dimensions as template arguments, such as ``auto r =
myarray.mutable_unchecked<float, 2>()``.
If the number of dimensions is not known at compile time, you can omit the
dimensions template parameter (i.e. calling ``arr_t.unchecked()`` or
``arr.unchecked<T>()``. This will give you a proxy object that works in the
same way, but results in less optimizable code and thus a small efficiency
loss in tight loops.
Note that the returned proxy object directly references the array's data, and
only reads its shape, strides, and writeable flag when constructed. You must
take care to ensure that the referenced array is not destroyed or reshaped for
the duration of the returned object, typically by limiting the scope of the
returned instance.
The returned proxy object supports some of the same methods as ``py::array`` so
that it can be used as a drop-in replacement for some existing, index-checked
uses of ``py::array``:
- ``.ndim()`` returns the number of dimensions
- ``.data(1, 2, ...)`` and ``r.mutable_data(1, 2, ...)``` returns a pointer to
the ``const T`` or ``T`` data, respectively, at the given indices. The
latter is only available to proxies obtained via ``a.mutable_unchecked()``.
- ``.itemsize()`` returns the size of an item in bytes, i.e. ``sizeof(T)``.
- ``.ndim()`` returns the number of dimensions.
- ``.shape(n)`` returns the size of dimension ``n``
- ``.size()`` returns the total number of elements (i.e. the product of the shapes).
- ``.nbytes()`` returns the number of bytes used by the referenced elements
(i.e. ``itemsize()`` times ``size()``).
.. seealso::
The file :file:`tests/test_numpy_array.cpp` contains additional examples
demonstrating the use of this feature.
Ellipsis
========
Python provides a convenient ``...`` ellipsis notation that is often used to
slice multidimensional arrays. For instance, the following snippet extracts the
middle dimensions of a tensor with the first and last index set to zero.
.. code-block:: python
a = ... # a NumPy array
b = a[0, ..., 0]
The function ``py::ellipsis()`` function can be used to perform the same
operation on the C++ side:
.. code-block:: cpp
py::array a = /* A NumPy array */;
py::array b = a[py::make_tuple(0, py::ellipsis(), 0)];
Memory view
===========
For a case when we simply want to provide a direct accessor to C/C++ buffer
without a concrete class object, we can return a ``memoryview`` object. Suppose
we wish to expose a ``memoryview`` for 2x4 uint8_t array, we can do the
following:
.. code-block:: cpp
const uint8_t buffer[] = {
0, 1, 2, 3,
4, 5, 6, 7
};
m.def("get_memoryview2d", []() {
return py::memoryview::from_buffer(
buffer, // buffer pointer
{ 2, 4 }, // shape (rows, cols)
{ sizeof(uint8_t) * 4, sizeof(uint8_t) } // strides in bytes
);
});
This approach is meant for providing a ``memoryview`` for a C/C++ buffer not
managed by Python. The user is responsible for managing the lifetime of the
buffer. Using a ``memoryview`` created in this way after deleting the buffer in
C++ side results in undefined behavior.
We can also use ``memoryview::from_memory`` for a simple 1D contiguous buffer:
.. code-block:: cpp
m.def("get_memoryview1d", []() {
return py::memoryview::from_memory(
buffer, // buffer pointer
sizeof(uint8_t) * 8 // buffer size
);
});
.. versionchanged:: 2.6
``memoryview::from_memory`` added.

View File

@ -0,0 +1,286 @@
Python types
############
.. _wrappers:
Available wrappers
==================
All major Python types are available as thin C++ wrapper classes. These
can also be used as function parameters -- see :ref:`python_objects_as_args`.
Available types include :class:`handle`, :class:`object`, :class:`bool_`,
:class:`int_`, :class:`float_`, :class:`str`, :class:`bytes`, :class:`tuple`,
:class:`list`, :class:`dict`, :class:`slice`, :class:`none`, :class:`capsule`,
:class:`iterable`, :class:`iterator`, :class:`function`, :class:`buffer`,
:class:`array`, and :class:`array_t`.
.. warning::
Be sure to review the :ref:`pytypes_gotchas` before using this heavily in
your C++ API.
.. _instantiating_compound_types:
Instantiating compound Python types from C++
============================================
Dictionaries can be initialized in the :class:`dict` constructor:
.. code-block:: cpp
using namespace pybind11::literals; // to bring in the `_a` literal
py::dict d("spam"_a=py::none(), "eggs"_a=42);
A tuple of python objects can be instantiated using :func:`py::make_tuple`:
.. code-block:: cpp
py::tuple tup = py::make_tuple(42, py::none(), "spam");
Each element is converted to a supported Python type.
A `simple namespace`_ can be instantiated using
.. code-block:: cpp
using namespace pybind11::literals; // to bring in the `_a` literal
py::object SimpleNamespace = py::module_::import("types").attr("SimpleNamespace");
py::object ns = SimpleNamespace("spam"_a=py::none(), "eggs"_a=42);
Attributes on a namespace can be modified with the :func:`py::delattr`,
:func:`py::getattr`, and :func:`py::setattr` functions. Simple namespaces can
be useful as lightweight stand-ins for class instances.
.. _simple namespace: https://docs.python.org/3/library/types.html#types.SimpleNamespace
.. _casting_back_and_forth:
Casting back and forth
======================
In this kind of mixed code, it is often necessary to convert arbitrary C++
types to Python, which can be done using :func:`py::cast`:
.. code-block:: cpp
MyClass *cls = ...;
py::object obj = py::cast(cls);
The reverse direction uses the following syntax:
.. code-block:: cpp
py::object obj = ...;
MyClass *cls = obj.cast<MyClass *>();
When conversion fails, both directions throw the exception :class:`cast_error`.
.. _python_libs:
Accessing Python libraries from C++
===================================
It is also possible to import objects defined in the Python standard
library or available in the current Python environment (``sys.path``) and work
with these in C++.
This example obtains a reference to the Python ``Decimal`` class.
.. code-block:: cpp
// Equivalent to "from decimal import Decimal"
py::object Decimal = py::module_::import("decimal").attr("Decimal");
.. code-block:: cpp
// Try to import scipy
py::object scipy = py::module_::import("scipy");
return scipy.attr("__version__");
.. _calling_python_functions:
Calling Python functions
========================
It is also possible to call Python classes, functions and methods
via ``operator()``.
.. code-block:: cpp
// Construct a Python object of class Decimal
py::object pi = Decimal("3.14159");
.. code-block:: cpp
// Use Python to make our directories
py::object os = py::module_::import("os");
py::object makedirs = os.attr("makedirs");
makedirs("/tmp/path/to/somewhere");
One can convert the result obtained from Python to a pure C++ version
if a ``py::class_`` or type conversion is defined.
.. code-block:: cpp
py::function f = <...>;
py::object result_py = f(1234, "hello", some_instance);
MyClass &result = result_py.cast<MyClass>();
.. _calling_python_methods:
Calling Python methods
========================
To call an object's method, one can again use ``.attr`` to obtain access to the
Python method.
.. code-block:: cpp
// Calculate e^π in decimal
py::object exp_pi = pi.attr("exp")();
py::print(py::str(exp_pi));
In the example above ``pi.attr("exp")`` is a *bound method*: it will always call
the method for that same instance of the class. Alternately one can create an
*unbound method* via the Python class (instead of instance) and pass the ``self``
object explicitly, followed by other arguments.
.. code-block:: cpp
py::object decimal_exp = Decimal.attr("exp");
// Compute the e^n for n=0..4
for (int n = 0; n < 5; n++) {
py::print(decimal_exp(Decimal(n));
}
Keyword arguments
=================
Keyword arguments are also supported. In Python, there is the usual call syntax:
.. code-block:: python
def f(number, say, to):
... # function code
f(1234, say="hello", to=some_instance) # keyword call in Python
In C++, the same call can be made using:
.. code-block:: cpp
using namespace pybind11::literals; // to bring in the `_a` literal
f(1234, "say"_a="hello", "to"_a=some_instance); // keyword call in C++
Unpacking arguments
===================
Unpacking of ``*args`` and ``**kwargs`` is also possible and can be mixed with
other arguments:
.. code-block:: cpp
// * unpacking
py::tuple args = py::make_tuple(1234, "hello", some_instance);
f(*args);
// ** unpacking
py::dict kwargs = py::dict("number"_a=1234, "say"_a="hello", "to"_a=some_instance);
f(**kwargs);
// mixed keywords, * and ** unpacking
py::tuple args = py::make_tuple(1234);
py::dict kwargs = py::dict("to"_a=some_instance);
f(*args, "say"_a="hello", **kwargs);
Generalized unpacking according to PEP448_ is also supported:
.. code-block:: cpp
py::dict kwargs1 = py::dict("number"_a=1234);
py::dict kwargs2 = py::dict("to"_a=some_instance);
f(**kwargs1, "say"_a="hello", **kwargs2);
.. seealso::
The file :file:`tests/test_pytypes.cpp` contains a complete
example that demonstrates passing native Python types in more detail. The
file :file:`tests/test_callbacks.cpp` presents a few examples of calling
Python functions from C++, including keywords arguments and unpacking.
.. _PEP448: https://www.python.org/dev/peps/pep-0448/
.. _implicit_casting:
Implicit casting
================
When using the C++ interface for Python types, or calling Python functions,
objects of type :class:`object` are returned. It is possible to invoke implicit
conversions to subclasses like :class:`dict`. The same holds for the proxy objects
returned by ``operator[]`` or ``obj.attr()``.
Casting to subtypes improves code readability and allows values to be passed to
C++ functions that require a specific subtype rather than a generic :class:`object`.
.. code-block:: cpp
#include <pybind11/numpy.h>
using namespace pybind11::literals;
py::module_ os = py::module_::import("os");
py::module_ path = py::module_::import("os.path"); // like 'import os.path as path'
py::module_ np = py::module_::import("numpy"); // like 'import numpy as np'
py::str curdir_abs = path.attr("abspath")(path.attr("curdir"));
py::print(py::str("Current directory: ") + curdir_abs);
py::dict environ = os.attr("environ");
py::print(environ["HOME"]);
py::array_t<float> arr = np.attr("ones")(3, "dtype"_a="float32");
py::print(py::repr(arr + py::int_(1)));
These implicit conversions are available for subclasses of :class:`object`; there
is no need to call ``obj.cast()`` explicitly as for custom classes, see
:ref:`casting_back_and_forth`.
.. note::
If a trivial conversion via move constructor is not possible, both implicit and
explicit casting (calling ``obj.cast()``) will attempt a "rich" conversion.
For instance, ``py::list env = os.attr("environ");`` will succeed and is
equivalent to the Python code ``env = list(os.environ)`` that produces a
list of the dict keys.
.. TODO: Adapt text once PR #2349 has landed
Handling exceptions
===================
Python exceptions from wrapper classes will be thrown as a ``py::error_already_set``.
See :ref:`Handling exceptions from Python in C++
<handling_python_exceptions_cpp>` for more information on handling exceptions
raised when calling C++ wrapper classes.
.. _pytypes_gotchas:
Gotchas
=======
Default-Constructed Wrappers
----------------------------
When a wrapper type is default-constructed, it is **not** a valid Python object (i.e. it is not ``py::none()``). It is simply the same as
``PyObject*`` null pointer. To check for this, use
``static_cast<bool>(my_wrapper)``.
Assigning py::none() to wrappers
--------------------------------
You may be tempted to use types like ``py::str`` and ``py::dict`` in C++
signatures (either pure C++, or in bound signatures), and assign them default
values of ``py::none()``. However, in a best case scenario, it will fail fast
because ``None`` is not convertible to that type (e.g. ``py::dict``), or in a
worse case scenario, it will silently work but corrupt the types you want to
work with (e.g. ``py::str(py::none())`` will yield ``"None"`` in Python).

View File

@ -0,0 +1,155 @@
Utilities
#########
Using Python's print function in C++
====================================
The usual way to write output in C++ is using ``std::cout`` while in Python one
would use ``print``. Since these methods use different buffers, mixing them can
lead to output order issues. To resolve this, pybind11 modules can use the
:func:`py::print` function which writes to Python's ``sys.stdout`` for consistency.
Python's ``print`` function is replicated in the C++ API including optional
keyword arguments ``sep``, ``end``, ``file``, ``flush``. Everything works as
expected in Python:
.. code-block:: cpp
py::print(1, 2.0, "three"); // 1 2.0 three
py::print(1, 2.0, "three", "sep"_a="-"); // 1-2.0-three
auto args = py::make_tuple("unpacked", true);
py::print("->", *args, "end"_a="<-"); // -> unpacked True <-
.. _ostream_redirect:
Capturing standard output from ostream
======================================
Often, a library will use the streams ``std::cout`` and ``std::cerr`` to print,
but this does not play well with Python's standard ``sys.stdout`` and ``sys.stderr``
redirection. Replacing a library's printing with ``py::print <print>`` may not
be feasible. This can be fixed using a guard around the library function that
redirects output to the corresponding Python streams:
.. code-block:: cpp
#include <pybind11/iostream.h>
...
// Add a scoped redirect for your noisy code
m.def("noisy_func", []() {
py::scoped_ostream_redirect stream(
std::cout, // std::ostream&
py::module_::import("sys").attr("stdout") // Python output
);
call_noisy_func();
});
.. warning::
The implementation in ``pybind11/iostream.h`` is NOT thread safe. Multiple
threads writing to a redirected ostream concurrently cause data races
and potentially buffer overflows. Therefore it is currently a requirement
that all (possibly) concurrent redirected ostream writes are protected by
a mutex. #HelpAppreciated: Work on iostream.h thread safety. For more
background see the discussions under
`PR #2982 <https://github.com/pybind/pybind11/pull/2982>`_ and
`PR #2995 <https://github.com/pybind/pybind11/pull/2995>`_.
This method respects flushes on the output streams and will flush if needed
when the scoped guard is destroyed. This allows the output to be redirected in
real time, such as to a Jupyter notebook. The two arguments, the C++ stream and
the Python output, are optional, and default to standard output if not given. An
extra type, ``py::scoped_estream_redirect <scoped_estream_redirect>``, is identical
except for defaulting to ``std::cerr`` and ``sys.stderr``; this can be useful with
``py::call_guard``, which allows multiple items, but uses the default constructor:
.. code-block:: cpp
// Alternative: Call single function using call guard
m.def("noisy_func", &call_noisy_function,
py::call_guard<py::scoped_ostream_redirect,
py::scoped_estream_redirect>());
The redirection can also be done in Python with the addition of a context
manager, using the ``py::add_ostream_redirect() <add_ostream_redirect>`` function:
.. code-block:: cpp
py::add_ostream_redirect(m, "ostream_redirect");
The name in Python defaults to ``ostream_redirect`` if no name is passed. This
creates the following context manager in Python:
.. code-block:: python
with ostream_redirect(stdout=True, stderr=True):
noisy_function()
It defaults to redirecting both streams, though you can use the keyword
arguments to disable one of the streams if needed.
.. note::
The above methods will not redirect C-level output to file descriptors, such
as ``fprintf``. For those cases, you'll need to redirect the file
descriptors either directly in C or with Python's ``os.dup2`` function
in an operating-system dependent way.
.. _eval:
Evaluating Python expressions from strings and files
====================================================
pybind11 provides the ``eval``, ``exec`` and ``eval_file`` functions to evaluate
Python expressions and statements. The following example illustrates how they
can be used.
.. code-block:: cpp
// At beginning of file
#include <pybind11/eval.h>
...
// Evaluate in scope of main module
py::object scope = py::module_::import("__main__").attr("__dict__");
// Evaluate an isolated expression
int result = py::eval("my_variable + 10", scope).cast<int>();
// Evaluate a sequence of statements
py::exec(
"print('Hello')\n"
"print('world!');",
scope);
// Evaluate the statements in an separate Python file on disk
py::eval_file("script.py", scope);
C++11 raw string literals are also supported and quite handy for this purpose.
The only requirement is that the first statement must be on a new line following
the raw string delimiter ``R"(``, ensuring all lines have common leading indent:
.. code-block:: cpp
py::exec(R"(
x = get_answer()
if x == 42:
print('Hello World!')
else:
print('Bye!')
)", scope
);
.. note::
`eval` and `eval_file` accept a template parameter that describes how the
string/file should be interpreted. Possible choices include ``eval_expr``
(isolated expression), ``eval_single_statement`` (a single statement, return
value is always ``none``), and ``eval_statements`` (sequence of statements,
return value is always ``none``). `eval` defaults to ``eval_expr``,
`eval_file` defaults to ``eval_statements`` and `exec` is just a shortcut
for ``eval<eval_statements>``.

View File

@ -0,0 +1,174 @@
Smart pointers
##############
std::unique_ptr
===============
Given a class ``Example`` with Python bindings, it's possible to return
instances wrapped in C++11 unique pointers, like so
.. code-block:: cpp
std::unique_ptr<Example> create_example() { return std::unique_ptr<Example>(new Example()); }
.. code-block:: cpp
m.def("create_example", &create_example);
In other words, there is nothing special that needs to be done. While returning
unique pointers in this way is allowed, it is *illegal* to use them as function
arguments. For instance, the following function signature cannot be processed
by pybind11.
.. code-block:: cpp
void do_something_with_example(std::unique_ptr<Example> ex) { ... }
The above signature would imply that Python needs to give up ownership of an
object that is passed to this function, which is generally not possible (for
instance, the object might be referenced elsewhere).
std::shared_ptr
===============
The binding generator for classes, :class:`class_`, can be passed a template
type that denotes a special *holder* type that is used to manage references to
the object. If no such holder type template argument is given, the default for
a type named ``Type`` is ``std::unique_ptr<Type>``, which means that the object
is deallocated when Python's reference count goes to zero.
It is possible to switch to other types of reference counting wrappers or smart
pointers, which is useful in codebases that rely on them. For instance, the
following snippet causes ``std::shared_ptr`` to be used instead.
.. code-block:: cpp
py::class_<Example, std::shared_ptr<Example> /* <- holder type */> obj(m, "Example");
Note that any particular class can only be associated with a single holder type.
One potential stumbling block when using holder types is that they need to be
applied consistently. Can you guess what's broken about the following binding
code?
.. code-block:: cpp
class Child { };
class Parent {
public:
Parent() : child(std::make_shared<Child>()) { }
Child *get_child() { return child.get(); } /* Hint: ** DON'T DO THIS ** */
private:
std::shared_ptr<Child> child;
};
PYBIND11_MODULE(example, m) {
py::class_<Child, std::shared_ptr<Child>>(m, "Child");
py::class_<Parent, std::shared_ptr<Parent>>(m, "Parent")
.def(py::init<>())
.def("get_child", &Parent::get_child);
}
The following Python code will cause undefined behavior (and likely a
segmentation fault).
.. code-block:: python
from example import Parent
print(Parent().get_child())
The problem is that ``Parent::get_child()`` returns a pointer to an instance of
``Child``, but the fact that this instance is already managed by
``std::shared_ptr<...>`` is lost when passing raw pointers. In this case,
pybind11 will create a second independent ``std::shared_ptr<...>`` that also
claims ownership of the pointer. In the end, the object will be freed **twice**
since these shared pointers have no way of knowing about each other.
There are two ways to resolve this issue:
1. For types that are managed by a smart pointer class, never use raw pointers
in function arguments or return values. In other words: always consistently
wrap pointers into their designated holder types (such as
``std::shared_ptr<...>``). In this case, the signature of ``get_child()``
should be modified as follows:
.. code-block:: cpp
std::shared_ptr<Child> get_child() { return child; }
2. Adjust the definition of ``Child`` by specifying
``std::enable_shared_from_this<T>`` (see cppreference_ for details) as a
base class. This adds a small bit of information to ``Child`` that allows
pybind11 to realize that there is already an existing
``std::shared_ptr<...>`` and communicate with it. In this case, the
declaration of ``Child`` should look as follows:
.. _cppreference: http://en.cppreference.com/w/cpp/memory/enable_shared_from_this
.. code-block:: cpp
class Child : public std::enable_shared_from_this<Child> { };
.. _smart_pointers:
Custom smart pointers
=====================
pybind11 supports ``std::unique_ptr`` and ``std::shared_ptr`` right out of the
box. For any other custom smart pointer, transparent conversions can be enabled
using a macro invocation similar to the following. It must be declared at the
top namespace level before any binding code:
.. code-block:: cpp
PYBIND11_DECLARE_HOLDER_TYPE(T, SmartPtr<T>);
The first argument of :func:`PYBIND11_DECLARE_HOLDER_TYPE` should be a
placeholder name that is used as a template parameter of the second argument.
Thus, feel free to use any identifier, but use it consistently on both sides;
also, don't use the name of a type that already exists in your codebase.
The macro also accepts a third optional boolean parameter that is set to false
by default. Specify
.. code-block:: cpp
PYBIND11_DECLARE_HOLDER_TYPE(T, SmartPtr<T>, true);
if ``SmartPtr<T>`` can always be initialized from a ``T*`` pointer without the
risk of inconsistencies (such as multiple independent ``SmartPtr`` instances
believing that they are the sole owner of the ``T*`` pointer). A common
situation where ``true`` should be passed is when the ``T`` instances use
*intrusive* reference counting.
Please take a look at the :ref:`macro_notes` before using this feature.
By default, pybind11 assumes that your custom smart pointer has a standard
interface, i.e. provides a ``.get()`` member function to access the underlying
raw pointer. If this is not the case, pybind11's ``holder_helper`` must be
specialized:
.. code-block:: cpp
// Always needed for custom holder types
PYBIND11_DECLARE_HOLDER_TYPE(T, SmartPtr<T>);
// Only needed if the type's `.get()` goes by another name
namespace PYBIND11_NAMESPACE { namespace detail {
template <typename T>
struct holder_helper<SmartPtr<T>> { // <-- specialization
static const T *get(const SmartPtr<T> &p) { return p.getPointer(); }
};
}}
The above specialization informs pybind11 that the custom ``SmartPtr`` class
provides ``.get()`` functionality via ``.getPointer()``.
.. seealso::
The file :file:`tests/test_smart_ptr.cpp` contains a complete example
that demonstrates how to work with custom reference-counting holder types
in more detail.

307
3rdparty/pybind11/docs/basics.rst vendored Normal file
View File

@ -0,0 +1,307 @@
.. _basics:
First steps
###########
This sections demonstrates the basic features of pybind11. Before getting
started, make sure that development environment is set up to compile the
included set of test cases.
Compiling the test cases
========================
Linux/macOS
-----------
On Linux you'll need to install the **python-dev** or **python3-dev** packages as
well as **cmake**. On macOS, the included python version works out of the box,
but **cmake** must still be installed.
After installing the prerequisites, run
.. code-block:: bash
mkdir build
cd build
cmake ..
make check -j 4
The last line will both compile and run the tests.
Windows
-------
On Windows, only **Visual Studio 2017** and newer are supported.
.. Note::
To use the C++17 in Visual Studio 2017 (MSVC 14.1), pybind11 requires the flag
``/permissive-`` to be passed to the compiler `to enforce standard conformance`_. When
building with Visual Studio 2019, this is not strictly necessary, but still advised.
.. _`to enforce standard conformance`: https://docs.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance?view=vs-2017
To compile and run the tests:
.. code-block:: batch
mkdir build
cd build
cmake ..
cmake --build . --config Release --target check
This will create a Visual Studio project, compile and run the target, all from the
command line.
.. Note::
If all tests fail, make sure that the Python binary and the testcases are compiled
for the same processor type and bitness (i.e. either **i386** or **x86_64**). You
can specify **x86_64** as the target architecture for the generated Visual Studio
project using ``cmake -A x64 ..``.
.. seealso::
Advanced users who are already familiar with Boost.Python may want to skip
the tutorial and look at the test cases in the :file:`tests` directory,
which exercise all features of pybind11.
Header and namespace conventions
================================
For brevity, all code examples assume that the following two lines are present:
.. code-block:: cpp
#include <pybind11/pybind11.h>
namespace py = pybind11;
Some features may require additional headers, but those will be specified as needed.
.. _simple_example:
Creating bindings for a simple function
=======================================
Let's start by creating Python bindings for an extremely simple function, which
adds two numbers and returns their result:
.. code-block:: cpp
int add(int i, int j) {
return i + j;
}
For simplicity [#f1]_, we'll put both this function and the binding code into
a file named :file:`example.cpp` with the following contents:
.. code-block:: cpp
#include <pybind11/pybind11.h>
int add(int i, int j) {
return i + j;
}
PYBIND11_MODULE(example, m) {
m.doc() = "pybind11 example plugin"; // optional module docstring
m.def("add", &add, "A function that adds two numbers");
}
.. [#f1] In practice, implementation and binding code will generally be located
in separate files.
The :func:`PYBIND11_MODULE` macro creates a function that will be called when an
``import`` statement is issued from within Python. The module name (``example``)
is given as the first macro argument (it should not be in quotes). The second
argument (``m``) defines a variable of type :class:`py::module_ <module>` which
is the main interface for creating bindings. The method :func:`module_::def`
generates binding code that exposes the ``add()`` function to Python.
.. note::
Notice how little code was needed to expose our function to Python: all
details regarding the function's parameters and return value were
automatically inferred using template metaprogramming. This overall
approach and the used syntax are borrowed from Boost.Python, though the
underlying implementation is very different.
pybind11 is a header-only library, hence it is not necessary to link against
any special libraries and there are no intermediate (magic) translation steps.
On Linux, the above example can be compiled using the following command:
.. code-block:: bash
$ c++ -O3 -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) example.cpp -o example$(python3-config --extension-suffix)
.. note::
If you used :ref:`include_as_a_submodule` to get the pybind11 source, then
use ``$(python3-config --includes) -Iextern/pybind11/include`` instead of
``$(python3 -m pybind11 --includes)`` in the above compilation, as
explained in :ref:`building_manually`.
For more details on the required compiler flags on Linux and macOS, see
:ref:`building_manually`. For complete cross-platform compilation instructions,
refer to the :ref:`compiling` page.
The `python_example`_ and `cmake_example`_ repositories are also a good place
to start. They are both complete project examples with cross-platform build
systems. The only difference between the two is that `python_example`_ uses
Python's ``setuptools`` to build the module, while `cmake_example`_ uses CMake
(which may be preferable for existing C++ projects).
.. _python_example: https://github.com/pybind/python_example
.. _cmake_example: https://github.com/pybind/cmake_example
Building the above C++ code will produce a binary module file that can be
imported to Python. Assuming that the compiled module is located in the
current directory, the following interactive Python session shows how to
load and execute the example:
.. code-block:: pycon
$ python
Python 3.9.10 (main, Jan 15 2022, 11:48:04)
[Clang 13.0.0 (clang-1300.0.29.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import example
>>> example.add(1, 2)
3
>>>
.. _keyword_args:
Keyword arguments
=================
With a simple code modification, it is possible to inform Python about the
names of the arguments ("i" and "j" in this case).
.. code-block:: cpp
m.def("add", &add, "A function which adds two numbers",
py::arg("i"), py::arg("j"));
:class:`arg` is one of several special tag classes which can be used to pass
metadata into :func:`module_::def`. With this modified binding code, we can now
call the function using keyword arguments, which is a more readable alternative
particularly for functions taking many parameters:
.. code-block:: pycon
>>> import example
>>> example.add(i=1, j=2)
3L
The keyword names also appear in the function signatures within the documentation.
.. code-block:: pycon
>>> help(example)
....
FUNCTIONS
add(...)
Signature : (i: int, j: int) -> int
A function which adds two numbers
A shorter notation for named arguments is also available:
.. code-block:: cpp
// regular notation
m.def("add1", &add, py::arg("i"), py::arg("j"));
// shorthand
using namespace pybind11::literals;
m.def("add2", &add, "i"_a, "j"_a);
The :var:`_a` suffix forms a C++11 literal which is equivalent to :class:`arg`.
Note that the literal operator must first be made visible with the directive
``using namespace pybind11::literals``. This does not bring in anything else
from the ``pybind11`` namespace except for literals.
.. _default_args:
Default arguments
=================
Suppose now that the function to be bound has default arguments, e.g.:
.. code-block:: cpp
int add(int i = 1, int j = 2) {
return i + j;
}
Unfortunately, pybind11 cannot automatically extract these parameters, since they
are not part of the function's type information. However, they are simple to specify
using an extension of :class:`arg`:
.. code-block:: cpp
m.def("add", &add, "A function which adds two numbers",
py::arg("i") = 1, py::arg("j") = 2);
The default values also appear within the documentation.
.. code-block:: pycon
>>> help(example)
....
FUNCTIONS
add(...)
Signature : (i: int = 1, j: int = 2) -> int
A function which adds two numbers
The shorthand notation is also available for default arguments:
.. code-block:: cpp
// regular notation
m.def("add1", &add, py::arg("i") = 1, py::arg("j") = 2);
// shorthand
m.def("add2", &add, "i"_a=1, "j"_a=2);
Exporting variables
===================
To expose a value from C++, use the ``attr`` function to register it in a
module as shown below. Built-in types and general objects (more on that later)
are automatically converted when assigned as attributes, and can be explicitly
converted using the function ``py::cast``.
.. code-block:: cpp
PYBIND11_MODULE(example, m) {
m.attr("the_answer") = 42;
py::object world = py::cast("World");
m.attr("what") = world;
}
These are then accessible from Python:
.. code-block:: pycon
>>> import example
>>> example.the_answer
42
>>> example.what
'World'
.. _supported_types:
Supported data types
====================
A large number of data types are supported out of the box and can be used
seamlessly as functions arguments, return values or with ``py::cast`` in general.
For a full overview, see the :doc:`advanced/cast/index` section.

87
3rdparty/pybind11/docs/benchmark.py vendored Normal file
View File

@ -0,0 +1,87 @@
import datetime as dt
import os
import random
nfns = 4 # Functions per class
nargs = 4 # Arguments per function
def generate_dummy_code_pybind11(nclasses=10):
decl = ""
bindings = ""
for cl in range(nclasses):
decl += f"class cl{cl:03};\n"
decl += "\n"
for cl in range(nclasses):
decl += f"class {cl:03} {{\n"
decl += "public:\n"
bindings += f' py::class_<cl{cl:03}>(m, "cl{cl:03}")\n'
for fn in range(nfns):
ret = random.randint(0, nclasses - 1)
params = [random.randint(0, nclasses - 1) for i in range(nargs)]
decl += f" cl{ret:03} *fn_{fn:03}("
decl += ", ".join(f"cl{p:03} *" for p in params)
decl += ");\n"
bindings += f' .def("fn_{fn:03}", &cl{cl:03}::fn_{fn:03})\n'
decl += "};\n\n"
bindings += " ;\n"
result = "#include <pybind11/pybind11.h>\n\n"
result += "namespace py = pybind11;\n\n"
result += decl + "\n"
result += "PYBIND11_MODULE(example, m) {\n"
result += bindings
result += "}"
return result
def generate_dummy_code_boost(nclasses=10):
decl = ""
bindings = ""
for cl in range(nclasses):
decl += f"class cl{cl:03};\n"
decl += "\n"
for cl in range(nclasses):
decl += "class cl%03i {\n" % cl
decl += "public:\n"
bindings += f' py::class_<cl{cl:03}>("cl{cl:03}")\n'
for fn in range(nfns):
ret = random.randint(0, nclasses - 1)
params = [random.randint(0, nclasses - 1) for i in range(nargs)]
decl += f" cl{ret:03} *fn_{fn:03}("
decl += ", ".join(f"cl{p:03} *" for p in params)
decl += ");\n"
bindings += f' .def("fn_{fn:03}", &cl{cl:03}::fn_{fn:03}, py::return_value_policy<py::manage_new_object>())\n'
decl += "};\n\n"
bindings += " ;\n"
result = "#include <boost/python.hpp>\n\n"
result += "namespace py = boost::python;\n\n"
result += decl + "\n"
result += "BOOST_PYTHON_MODULE(example) {\n"
result += bindings
result += "}"
return result
for codegen in [generate_dummy_code_pybind11, generate_dummy_code_boost]:
print("{")
for i in range(10):
nclasses = 2**i
with open("test.cpp", "w") as f:
f.write(codegen(nclasses))
n1 = dt.datetime.now()
os.system(
"g++ -Os -shared -rdynamic -undefined dynamic_lookup "
"-fvisibility=hidden -std=c++14 test.cpp -I include "
"-I /System/Library/Frameworks/Python.framework/Headers -o test.so"
)
n2 = dt.datetime.now()
elapsed = (n2 - n1).total_seconds()
size = os.stat("test.so").st_size
print(" {%i, %f, %i}," % (nclasses * nfns, elapsed, size))
print("}")

95
3rdparty/pybind11/docs/benchmark.rst vendored Normal file
View File

@ -0,0 +1,95 @@
Benchmark
=========
The following is the result of a synthetic benchmark comparing both compilation
time and module size of pybind11 against Boost.Python. A detailed report about a
Boost.Python to pybind11 conversion of a real project is available here: [#f1]_.
.. [#f1] http://graylab.jhu.edu/RosettaCon2016/PyRosetta-4.pdf
Setup
-----
A python script (see the ``docs/benchmark.py`` file) was used to generate a set
of files with dummy classes whose count increases for each successive benchmark
(between 1 and 2048 classes in powers of two). Each class has four methods with
a randomly generated signature with a return value and four arguments. (There
was no particular reason for this setup other than the desire to generate many
unique function signatures whose count could be controlled in a simple way.)
Here is an example of the binding code for one class:
.. code-block:: cpp
...
class cl034 {
public:
cl279 *fn_000(cl084 *, cl057 *, cl065 *, cl042 *);
cl025 *fn_001(cl098 *, cl262 *, cl414 *, cl121 *);
cl085 *fn_002(cl445 *, cl297 *, cl145 *, cl421 *);
cl470 *fn_003(cl200 *, cl323 *, cl332 *, cl492 *);
};
...
PYBIND11_MODULE(example, m) {
...
py::class_<cl034>(m, "cl034")
.def("fn_000", &cl034::fn_000)
.def("fn_001", &cl034::fn_001)
.def("fn_002", &cl034::fn_002)
.def("fn_003", &cl034::fn_003)
...
}
The Boost.Python version looks almost identical except that a return value
policy had to be specified as an argument to ``def()``. For both libraries,
compilation was done with
.. code-block:: bash
Apple LLVM version 7.0.2 (clang-700.1.81)
and the following compilation flags
.. code-block:: bash
g++ -Os -shared -rdynamic -undefined dynamic_lookup -fvisibility=hidden -std=c++14
Compilation time
----------------
The following log-log plot shows how the compilation time grows for an
increasing number of class and function declarations. pybind11 includes many
fewer headers, which initially leads to shorter compilation times, but the
performance is ultimately fairly similar (pybind11 is 19.8 seconds faster for
the largest largest file with 2048 classes and a total of 8192 methods -- a
modest **1.2x** speedup relative to Boost.Python, which required 116.35
seconds).
.. only:: not latex
.. image:: pybind11_vs_boost_python1.svg
.. only:: latex
.. image:: pybind11_vs_boost_python1.png
Module size
-----------
Differences between the two libraries become much more pronounced when
considering the file size of the generated Python plugin: for the largest file,
the binary generated by Boost.Python required 16.8 MiB, which was **2.17
times** / **9.1 megabytes** larger than the output generated by pybind11. For
very small inputs, Boost.Python has an edge in the plot below -- however, note
that it stores many definitions in an external library, whose size was not
included here, hence the comparison is slightly shifted in Boost.Python's
favor.
.. only:: not latex
.. image:: pybind11_vs_boost_python2.svg
.. only:: latex
.. image:: pybind11_vs_boost_python2.png

3019
3rdparty/pybind11/docs/changelog.rst vendored Normal file

File diff suppressed because it is too large Load Diff

555
3rdparty/pybind11/docs/classes.rst vendored Normal file
View File

@ -0,0 +1,555 @@
.. _classes:
Object-oriented code
####################
Creating bindings for a custom type
===================================
Let's now look at a more complex example where we'll create bindings for a
custom C++ data structure named ``Pet``. Its definition is given below:
.. code-block:: cpp
struct Pet {
Pet(const std::string &name) : name(name) { }
void setName(const std::string &name_) { name = name_; }
const std::string &getName() const { return name; }
std::string name;
};
The binding code for ``Pet`` looks as follows:
.. code-block:: cpp
#include <pybind11/pybind11.h>
namespace py = pybind11;
PYBIND11_MODULE(example, m) {
py::class_<Pet>(m, "Pet")
.def(py::init<const std::string &>())
.def("setName", &Pet::setName)
.def("getName", &Pet::getName);
}
:class:`class_` creates bindings for a C++ *class* or *struct*-style data
structure. :func:`init` is a convenience function that takes the types of a
constructor's parameters as template arguments and wraps the corresponding
constructor (see the :ref:`custom_constructors` section for details). An
interactive Python session demonstrating this example is shown below:
.. code-block:: pycon
% python
>>> import example
>>> p = example.Pet("Molly")
>>> print(p)
<example.Pet object at 0x10cd98060>
>>> p.getName()
'Molly'
>>> p.setName("Charly")
>>> p.getName()
'Charly'
.. seealso::
Static member functions can be bound in the same way using
:func:`class_::def_static`.
.. note::
Binding C++ types in unnamed namespaces (also known as anonymous namespaces)
works reliably on many platforms, but not all. The `XFAIL_CONDITION` in
tests/test_unnamed_namespace_a.py encodes the currently known conditions.
For background see `#4319 <https://github.com/pybind/pybind11/pull/4319>`_.
If portability is a concern, it is therefore not recommended to bind C++
types in unnamed namespaces. It will be safest to manually pick unique
namespace names.
Keyword and default arguments
=============================
It is possible to specify keyword and default arguments using the syntax
discussed in the previous chapter. Refer to the sections :ref:`keyword_args`
and :ref:`default_args` for details.
Binding lambda functions
========================
Note how ``print(p)`` produced a rather useless summary of our data structure in the example above:
.. code-block:: pycon
>>> print(p)
<example.Pet object at 0x10cd98060>
To address this, we could bind a utility function that returns a human-readable
summary to the special method slot named ``__repr__``. Unfortunately, there is no
suitable functionality in the ``Pet`` data structure, and it would be nice if
we did not have to change it. This can easily be accomplished by binding a
Lambda function instead:
.. code-block:: cpp
py::class_<Pet>(m, "Pet")
.def(py::init<const std::string &>())
.def("setName", &Pet::setName)
.def("getName", &Pet::getName)
.def("__repr__",
[](const Pet &a) {
return "<example.Pet named '" + a.name + "'>";
}
);
Both stateless [#f1]_ and stateful lambda closures are supported by pybind11.
With the above change, the same Python code now produces the following output:
.. code-block:: pycon
>>> print(p)
<example.Pet named 'Molly'>
.. [#f1] Stateless closures are those with an empty pair of brackets ``[]`` as the capture object.
.. _properties:
Instance and static fields
==========================
We can also directly expose the ``name`` field using the
:func:`class_::def_readwrite` method. A similar :func:`class_::def_readonly`
method also exists for ``const`` fields.
.. code-block:: cpp
py::class_<Pet>(m, "Pet")
.def(py::init<const std::string &>())
.def_readwrite("name", &Pet::name)
// ... remainder ...
This makes it possible to write
.. code-block:: pycon
>>> p = example.Pet("Molly")
>>> p.name
'Molly'
>>> p.name = "Charly"
>>> p.name
'Charly'
Now suppose that ``Pet::name`` was a private internal variable
that can only be accessed via setters and getters.
.. code-block:: cpp
class Pet {
public:
Pet(const std::string &name) : name(name) { }
void setName(const std::string &name_) { name = name_; }
const std::string &getName() const { return name; }
private:
std::string name;
};
In this case, the method :func:`class_::def_property`
(:func:`class_::def_property_readonly` for read-only data) can be used to
provide a field-like interface within Python that will transparently call
the setter and getter functions:
.. code-block:: cpp
py::class_<Pet>(m, "Pet")
.def(py::init<const std::string &>())
.def_property("name", &Pet::getName, &Pet::setName)
// ... remainder ...
Write only properties can be defined by passing ``nullptr`` as the
input for the read function.
.. seealso::
Similar functions :func:`class_::def_readwrite_static`,
:func:`class_::def_readonly_static` :func:`class_::def_property_static`,
and :func:`class_::def_property_readonly_static` are provided for binding
static variables and properties. Please also see the section on
:ref:`static_properties` in the advanced part of the documentation.
Dynamic attributes
==================
Native Python classes can pick up new attributes dynamically:
.. code-block:: pycon
>>> class Pet:
... name = "Molly"
...
>>> p = Pet()
>>> p.name = "Charly" # overwrite existing
>>> p.age = 2 # dynamically add a new attribute
By default, classes exported from C++ do not support this and the only writable
attributes are the ones explicitly defined using :func:`class_::def_readwrite`
or :func:`class_::def_property`.
.. code-block:: cpp
py::class_<Pet>(m, "Pet")
.def(py::init<>())
.def_readwrite("name", &Pet::name);
Trying to set any other attribute results in an error:
.. code-block:: pycon
>>> p = example.Pet()
>>> p.name = "Charly" # OK, attribute defined in C++
>>> p.age = 2 # fail
AttributeError: 'Pet' object has no attribute 'age'
To enable dynamic attributes for C++ classes, the :class:`py::dynamic_attr` tag
must be added to the :class:`py::class_` constructor:
.. code-block:: cpp
py::class_<Pet>(m, "Pet", py::dynamic_attr())
.def(py::init<>())
.def_readwrite("name", &Pet::name);
Now everything works as expected:
.. code-block:: pycon
>>> p = example.Pet()
>>> p.name = "Charly" # OK, overwrite value in C++
>>> p.age = 2 # OK, dynamically add a new attribute
>>> p.__dict__ # just like a native Python class
{'age': 2}
Note that there is a small runtime cost for a class with dynamic attributes.
Not only because of the addition of a ``__dict__``, but also because of more
expensive garbage collection tracking which must be activated to resolve
possible circular references. Native Python classes incur this same cost by
default, so this is not anything to worry about. By default, pybind11 classes
are more efficient than native Python classes. Enabling dynamic attributes
just brings them on par.
.. _inheritance:
Inheritance and automatic downcasting
=====================================
Suppose now that the example consists of two data structures with an
inheritance relationship:
.. code-block:: cpp
struct Pet {
Pet(const std::string &name) : name(name) { }
std::string name;
};
struct Dog : Pet {
Dog(const std::string &name) : Pet(name) { }
std::string bark() const { return "woof!"; }
};
There are two different ways of indicating a hierarchical relationship to
pybind11: the first specifies the C++ base class as an extra template
parameter of the :class:`class_`:
.. code-block:: cpp
py::class_<Pet>(m, "Pet")
.def(py::init<const std::string &>())
.def_readwrite("name", &Pet::name);
// Method 1: template parameter:
py::class_<Dog, Pet /* <- specify C++ parent type */>(m, "Dog")
.def(py::init<const std::string &>())
.def("bark", &Dog::bark);
Alternatively, we can also assign a name to the previously bound ``Pet``
:class:`class_` object and reference it when binding the ``Dog`` class:
.. code-block:: cpp
py::class_<Pet> pet(m, "Pet");
pet.def(py::init<const std::string &>())
.def_readwrite("name", &Pet::name);
// Method 2: pass parent class_ object:
py::class_<Dog>(m, "Dog", pet /* <- specify Python parent type */)
.def(py::init<const std::string &>())
.def("bark", &Dog::bark);
Functionality-wise, both approaches are equivalent. Afterwards, instances will
expose fields and methods of both types:
.. code-block:: pycon
>>> p = example.Dog("Molly")
>>> p.name
'Molly'
>>> p.bark()
'woof!'
The C++ classes defined above are regular non-polymorphic types with an
inheritance relationship. This is reflected in Python:
.. code-block:: cpp
// Return a base pointer to a derived instance
m.def("pet_store", []() { return std::unique_ptr<Pet>(new Dog("Molly")); });
.. code-block:: pycon
>>> p = example.pet_store()
>>> type(p) # `Dog` instance behind `Pet` pointer
Pet # no pointer downcasting for regular non-polymorphic types
>>> p.bark()
AttributeError: 'Pet' object has no attribute 'bark'
The function returned a ``Dog`` instance, but because it's a non-polymorphic
type behind a base pointer, Python only sees a ``Pet``. In C++, a type is only
considered polymorphic if it has at least one virtual function and pybind11
will automatically recognize this:
.. code-block:: cpp
struct PolymorphicPet {
virtual ~PolymorphicPet() = default;
};
struct PolymorphicDog : PolymorphicPet {
std::string bark() const { return "woof!"; }
};
// Same binding code
py::class_<PolymorphicPet>(m, "PolymorphicPet");
py::class_<PolymorphicDog, PolymorphicPet>(m, "PolymorphicDog")
.def(py::init<>())
.def("bark", &PolymorphicDog::bark);
// Again, return a base pointer to a derived instance
m.def("pet_store2", []() { return std::unique_ptr<PolymorphicPet>(new PolymorphicDog); });
.. code-block:: pycon
>>> p = example.pet_store2()
>>> type(p)
PolymorphicDog # automatically downcast
>>> p.bark()
'woof!'
Given a pointer to a polymorphic base, pybind11 performs automatic downcasting
to the actual derived type. Note that this goes beyond the usual situation in
C++: we don't just get access to the virtual functions of the base, we get the
concrete derived type including functions and attributes that the base type may
not even be aware of.
.. seealso::
For more information about polymorphic behavior see :ref:`overriding_virtuals`.
Overloaded methods
==================
Sometimes there are several overloaded C++ methods with the same name taking
different kinds of input arguments:
.. code-block:: cpp
struct Pet {
Pet(const std::string &name, int age) : name(name), age(age) { }
void set(int age_) { age = age_; }
void set(const std::string &name_) { name = name_; }
std::string name;
int age;
};
Attempting to bind ``Pet::set`` will cause an error since the compiler does not
know which method the user intended to select. We can disambiguate by casting
them to function pointers. Binding multiple functions to the same Python name
automatically creates a chain of function overloads that will be tried in
sequence.
.. code-block:: cpp
py::class_<Pet>(m, "Pet")
.def(py::init<const std::string &, int>())
.def("set", static_cast<void (Pet::*)(int)>(&Pet::set), "Set the pet's age")
.def("set", static_cast<void (Pet::*)(const std::string &)>(&Pet::set), "Set the pet's name");
The overload signatures are also visible in the method's docstring:
.. code-block:: pycon
>>> help(example.Pet)
class Pet(__builtin__.object)
| Methods defined here:
|
| __init__(...)
| Signature : (Pet, str, int) -> NoneType
|
| set(...)
| 1. Signature : (Pet, int) -> NoneType
|
| Set the pet's age
|
| 2. Signature : (Pet, str) -> NoneType
|
| Set the pet's name
If you have a C++14 compatible compiler [#cpp14]_, you can use an alternative
syntax to cast the overloaded function:
.. code-block:: cpp
py::class_<Pet>(m, "Pet")
.def("set", py::overload_cast<int>(&Pet::set), "Set the pet's age")
.def("set", py::overload_cast<const std::string &>(&Pet::set), "Set the pet's name");
Here, ``py::overload_cast`` only requires the parameter types to be specified.
The return type and class are deduced. This avoids the additional noise of
``void (Pet::*)()`` as seen in the raw cast. If a function is overloaded based
on constness, the ``py::const_`` tag should be used:
.. code-block:: cpp
struct Widget {
int foo(int x, float y);
int foo(int x, float y) const;
};
py::class_<Widget>(m, "Widget")
.def("foo_mutable", py::overload_cast<int, float>(&Widget::foo))
.def("foo_const", py::overload_cast<int, float>(&Widget::foo, py::const_));
If you prefer the ``py::overload_cast`` syntax but have a C++11 compatible compiler only,
you can use ``py::detail::overload_cast_impl`` with an additional set of parentheses:
.. code-block:: cpp
template <typename... Args>
using overload_cast_ = pybind11::detail::overload_cast_impl<Args...>;
py::class_<Pet>(m, "Pet")
.def("set", overload_cast_<int>()(&Pet::set), "Set the pet's age")
.def("set", overload_cast_<const std::string &>()(&Pet::set), "Set the pet's name");
.. [#cpp14] A compiler which supports the ``-std=c++14`` flag.
.. note::
To define multiple overloaded constructors, simply declare one after the
other using the ``.def(py::init<...>())`` syntax. The existing machinery
for specifying keyword and default arguments also works.
Enumerations and internal types
===============================
Let's now suppose that the example class contains internal types like enumerations, e.g.:
.. code-block:: cpp
struct Pet {
enum Kind {
Dog = 0,
Cat
};
struct Attributes {
float age = 0;
};
Pet(const std::string &name, Kind type) : name(name), type(type) { }
std::string name;
Kind type;
Attributes attr;
};
The binding code for this example looks as follows:
.. code-block:: cpp
py::class_<Pet> pet(m, "Pet");
pet.def(py::init<const std::string &, Pet::Kind>())
.def_readwrite("name", &Pet::name)
.def_readwrite("type", &Pet::type)
.def_readwrite("attr", &Pet::attr);
py::enum_<Pet::Kind>(pet, "Kind")
.value("Dog", Pet::Kind::Dog)
.value("Cat", Pet::Kind::Cat)
.export_values();
py::class_<Pet::Attributes>(pet, "Attributes")
.def(py::init<>())
.def_readwrite("age", &Pet::Attributes::age);
To ensure that the nested types ``Kind`` and ``Attributes`` are created within the scope of ``Pet``, the
``pet`` :class:`class_` instance must be supplied to the :class:`enum_` and :class:`class_`
constructor. The :func:`enum_::export_values` function exports the enum entries
into the parent scope, which should be skipped for newer C++11-style strongly
typed enums.
.. code-block:: pycon
>>> p = Pet("Lucy", Pet.Cat)
>>> p.type
Kind.Cat
>>> int(p.type)
1L
The entries defined by the enumeration type are exposed in the ``__members__`` property:
.. code-block:: pycon
>>> Pet.Kind.__members__
{'Dog': Kind.Dog, 'Cat': Kind.Cat}
The ``name`` property returns the name of the enum value as a unicode string.
.. note::
It is also possible to use ``str(enum)``, however these accomplish different
goals. The following shows how these two approaches differ.
.. code-block:: pycon
>>> p = Pet("Lucy", Pet.Cat)
>>> pet_type = p.type
>>> pet_type
Pet.Cat
>>> str(pet_type)
'Pet.Cat'
>>> pet_type.name
'Cat'
.. note::
When the special tag ``py::arithmetic()`` is specified to the ``enum_``
constructor, pybind11 creates an enumeration that also supports rudimentary
arithmetic and bit-level operations like comparisons, and, or, xor, negation,
etc.
.. code-block:: cpp
py::enum_<Pet::Kind>(pet, "Kind", py::arithmetic())
...
By default, these are omitted to conserve space.
.. warning::
Contrary to Python customs, enum values from the wrappers should not be compared using ``is``, but with ``==`` (see `#1177 <https://github.com/pybind/pybind11/issues/1177>`_ for background).

View File

@ -0,0 +1,8 @@
CMake helpers
-------------
Pybind11 can be used with ``add_subdirectory(extern/pybind11)``, or from an
install with ``find_package(pybind11 CONFIG)``. The interface provided in
either case is functionally identical.
.. cmake-module:: ../../tools/pybind11Config.cmake.in

649
3rdparty/pybind11/docs/compiling.rst vendored Normal file
View File

@ -0,0 +1,649 @@
.. _compiling:
Build systems
#############
.. _build-setuptools:
Building with setuptools
========================
For projects on PyPI, building with setuptools is the way to go. Sylvain Corlay
has kindly provided an example project which shows how to set up everything,
including automatic generation of documentation using Sphinx. Please refer to
the [python_example]_ repository.
.. [python_example] https://github.com/pybind/python_example
A helper file is provided with pybind11 that can simplify usage with setuptools.
To use pybind11 inside your ``setup.py``, you have to have some system to
ensure that ``pybind11`` is installed when you build your package. There are
four possible ways to do this, and pybind11 supports all four: You can ask all
users to install pybind11 beforehand (bad), you can use
:ref:`setup_helpers-pep518` (good, but very new and requires Pip 10),
:ref:`setup_helpers-setup_requires` (discouraged by Python packagers now that
PEP 518 is available, but it still works everywhere), or you can
:ref:`setup_helpers-copy-manually` (always works but you have to manually sync
your copy to get updates).
An example of a ``setup.py`` using pybind11's helpers:
.. code-block:: python
from glob import glob
from setuptools import setup
from pybind11.setup_helpers import Pybind11Extension
ext_modules = [
Pybind11Extension(
"python_example",
sorted(glob("src/*.cpp")), # Sort source files for reproducibility
),
]
setup(..., ext_modules=ext_modules)
If you want to do an automatic search for the highest supported C++ standard,
that is supported via a ``build_ext`` command override; it will only affect
``Pybind11Extensions``:
.. code-block:: python
from glob import glob
from setuptools import setup
from pybind11.setup_helpers import Pybind11Extension, build_ext
ext_modules = [
Pybind11Extension(
"python_example",
sorted(glob("src/*.cpp")),
),
]
setup(..., cmdclass={"build_ext": build_ext}, ext_modules=ext_modules)
If you have single-file extension modules that are directly stored in the
Python source tree (``foo.cpp`` in the same directory as where a ``foo.py``
would be located), you can also generate ``Pybind11Extensions`` using
``setup_helpers.intree_extensions``: ``intree_extensions(["path/to/foo.cpp",
...])`` returns a list of ``Pybind11Extensions`` which can be passed to
``ext_modules``, possibly after further customizing their attributes
(``libraries``, ``include_dirs``, etc.). By doing so, a ``foo.*.so`` extension
module will be generated and made available upon installation.
``intree_extension`` will automatically detect if you are using a ``src``-style
layout (as long as no namespace packages are involved), but you can also
explicitly pass ``package_dir`` to it (as in ``setuptools.setup``).
Since pybind11 does not require NumPy when building, a light-weight replacement
for NumPy's parallel compilation distutils tool is included. Use it like this:
.. code-block:: python
from pybind11.setup_helpers import ParallelCompile
# Optional multithreaded build
ParallelCompile("NPY_NUM_BUILD_JOBS").install()
setup(...)
The argument is the name of an environment variable to control the number of
threads, such as ``NPY_NUM_BUILD_JOBS`` (as used by NumPy), though you can set
something different if you want; ``CMAKE_BUILD_PARALLEL_LEVEL`` is another choice
a user might expect. You can also pass ``default=N`` to set the default number
of threads (0 will take the number of threads available) and ``max=N``, the
maximum number of threads; if you have a large extension you may want set this
to a memory dependent number.
If you are developing rapidly and have a lot of C++ files, you may want to
avoid rebuilding files that have not changed. For simple cases were you are
using ``pip install -e .`` and do not have local headers, you can skip the
rebuild if an object file is newer than its source (headers are not checked!)
with the following:
.. code-block:: python
from pybind11.setup_helpers import ParallelCompile, naive_recompile
ParallelCompile("NPY_NUM_BUILD_JOBS", needs_recompile=naive_recompile).install()
If you have a more complex build, you can implement a smarter function and pass
it to ``needs_recompile``, or you can use [Ccache]_ instead. ``CXX="cache g++"
pip install -e .`` would be the way to use it with GCC, for example. Unlike the
simple solution, this even works even when not compiling in editable mode, but
it does require Ccache to be installed.
Keep in mind that Pip will not even attempt to rebuild if it thinks it has
already built a copy of your code, which it deduces from the version number.
One way to avoid this is to use [setuptools_scm]_, which will generate a
version number that includes the number of commits since your last tag and a
hash for a dirty directory. Another way to force a rebuild is purge your cache
or use Pip's ``--no-cache-dir`` option.
.. [Ccache] https://ccache.dev
.. [setuptools_scm] https://github.com/pypa/setuptools_scm
.. _setup_helpers-pep518:
PEP 518 requirements (Pip 10+ required)
---------------------------------------
If you use `PEP 518's <https://www.python.org/dev/peps/pep-0518/>`_
``pyproject.toml`` file, you can ensure that ``pybind11`` is available during
the compilation of your project. When this file exists, Pip will make a new
virtual environment, download just the packages listed here in ``requires=``,
and build a wheel (binary Python package). It will then throw away the
environment, and install your wheel.
Your ``pyproject.toml`` file will likely look something like this:
.. code-block:: toml
[build-system]
requires = ["setuptools>=42", "pybind11>=2.6.1"]
build-backend = "setuptools.build_meta"
.. note::
The main drawback to this method is that a `PEP 517`_ compliant build tool,
such as Pip 10+, is required for this approach to work; older versions of
Pip completely ignore this file. If you distribute binaries (called wheels
in Python) using something like `cibuildwheel`_, remember that ``setup.py``
and ``pyproject.toml`` are not even contained in the wheel, so this high
Pip requirement is only for source builds, and will not affect users of
your binary wheels. If you are building SDists and wheels, then
`pypa-build`_ is the recommended official tool.
.. _PEP 517: https://www.python.org/dev/peps/pep-0517/
.. _cibuildwheel: https://cibuildwheel.readthedocs.io
.. _pypa-build: https://pypa-build.readthedocs.io/en/latest/
.. _setup_helpers-setup_requires:
Classic ``setup_requires``
--------------------------
If you want to support old versions of Pip with the classic
``setup_requires=["pybind11"]`` keyword argument to setup, which triggers a
two-phase ``setup.py`` run, then you will need to use something like this to
ensure the first pass works (which has not yet installed the ``setup_requires``
packages, since it can't install something it does not know about):
.. code-block:: python
try:
from pybind11.setup_helpers import Pybind11Extension
except ImportError:
from setuptools import Extension as Pybind11Extension
It doesn't matter that the Extension class is not the enhanced subclass for the
first pass run; and the second pass will have the ``setup_requires``
requirements.
This is obviously more of a hack than the PEP 518 method, but it supports
ancient versions of Pip.
.. _setup_helpers-copy-manually:
Copy manually
-------------
You can also copy ``setup_helpers.py`` directly to your project; it was
designed to be usable standalone, like the old example ``setup.py``. You can
set ``include_pybind11=False`` to skip including the pybind11 package headers,
so you can use it with git submodules and a specific git version. If you use
this, you will need to import from a local file in ``setup.py`` and ensure the
helper file is part of your MANIFEST.
Closely related, if you include pybind11 as a subproject, you can run the
``setup_helpers.py`` inplace. If loaded correctly, this should even pick up
the correct include for pybind11, though you can turn it off as shown above if
you want to input it manually.
Suggested usage if you have pybind11 as a submodule in ``extern/pybind11``:
.. code-block:: python
DIR = os.path.abspath(os.path.dirname(__file__))
sys.path.append(os.path.join(DIR, "extern", "pybind11"))
from pybind11.setup_helpers import Pybind11Extension # noqa: E402
del sys.path[-1]
.. versionchanged:: 2.6
Added ``setup_helpers`` file.
Building with cppimport
========================
[cppimport]_ is a small Python import hook that determines whether there is a C++
source file whose name matches the requested module. If there is, the file is
compiled as a Python extension using pybind11 and placed in the same folder as
the C++ source file. Python is then able to find the module and load it.
.. [cppimport] https://github.com/tbenthompson/cppimport
.. _cmake:
Building with CMake
===================
For C++ codebases that have an existing CMake-based build system, a Python
extension module can be created with just a few lines of code:
.. code-block:: cmake
cmake_minimum_required(VERSION 3.5...3.27)
project(example LANGUAGES CXX)
add_subdirectory(pybind11)
pybind11_add_module(example example.cpp)
This assumes that the pybind11 repository is located in a subdirectory named
:file:`pybind11` and that the code is located in a file named :file:`example.cpp`.
The CMake command ``add_subdirectory`` will import the pybind11 project which
provides the ``pybind11_add_module`` function. It will take care of all the
details needed to build a Python extension module on any platform.
A working sample project, including a way to invoke CMake from :file:`setup.py` for
PyPI integration, can be found in the [cmake_example]_ repository.
.. [cmake_example] https://github.com/pybind/cmake_example
.. versionchanged:: 2.6
CMake 3.4+ is required.
.. versionchanged:: 2.11
CMake 3.5+ is required.
Further information can be found at :doc:`cmake/index`.
pybind11_add_module
-------------------
To ease the creation of Python extension modules, pybind11 provides a CMake
function with the following signature:
.. code-block:: cmake
pybind11_add_module(<name> [MODULE | SHARED] [EXCLUDE_FROM_ALL]
[NO_EXTRAS] [THIN_LTO] [OPT_SIZE] source1 [source2 ...])
This function behaves very much like CMake's builtin ``add_library`` (in fact,
it's a wrapper function around that command). It will add a library target
called ``<name>`` to be built from the listed source files. In addition, it
will take care of all the Python-specific compiler and linker flags as well
as the OS- and Python-version-specific file extension. The produced target
``<name>`` can be further manipulated with regular CMake commands.
``MODULE`` or ``SHARED`` may be given to specify the type of library. If no
type is given, ``MODULE`` is used by default which ensures the creation of a
Python-exclusive module. Specifying ``SHARED`` will create a more traditional
dynamic library which can also be linked from elsewhere. ``EXCLUDE_FROM_ALL``
removes this target from the default build (see CMake docs for details).
Since pybind11 is a template library, ``pybind11_add_module`` adds compiler
flags to ensure high quality code generation without bloat arising from long
symbol names and duplication of code in different translation units. It
sets default visibility to *hidden*, which is required for some pybind11
features and functionality when attempting to load multiple pybind11 modules
compiled under different pybind11 versions. It also adds additional flags
enabling LTO (Link Time Optimization) and strip unneeded symbols. See the
:ref:`FAQ entry <faq:symhidden>` for a more detailed explanation. These
latter optimizations are never applied in ``Debug`` mode. If ``NO_EXTRAS`` is
given, they will always be disabled, even in ``Release`` mode. However, this
will result in code bloat and is generally not recommended.
As stated above, LTO is enabled by default. Some newer compilers also support
different flavors of LTO such as `ThinLTO`_. Setting ``THIN_LTO`` will cause
the function to prefer this flavor if available. The function falls back to
regular LTO if ``-flto=thin`` is not available. If
``CMAKE_INTERPROCEDURAL_OPTIMIZATION`` is set (either ``ON`` or ``OFF``), then
that will be respected instead of the built-in flag search.
.. note::
If you want to set the property form on targets or the
``CMAKE_INTERPROCEDURAL_OPTIMIZATION_<CONFIG>`` versions of this, you should
still use ``set(CMAKE_INTERPROCEDURAL_OPTIMIZATION OFF)`` (otherwise a
no-op) to disable pybind11's ipo flags.
The ``OPT_SIZE`` flag enables size-based optimization equivalent to the
standard ``/Os`` or ``-Os`` compiler flags and the ``MinSizeRel`` build type,
which avoid optimizations that that can substantially increase the size of the
resulting binary. This flag is particularly useful in projects that are split
into performance-critical parts and associated bindings. In this case, we can
compile the project in release mode (and hence, optimize performance globally),
and specify ``OPT_SIZE`` for the binding target, where size might be the main
concern as performance is often less critical here. A ~25% size reduction has
been observed in practice. This flag only changes the optimization behavior at
a per-target level and takes precedence over the global CMake build type
(``Release``, ``RelWithDebInfo``) except for ``Debug`` builds, where
optimizations remain disabled.
.. _ThinLTO: http://clang.llvm.org/docs/ThinLTO.html
Configuration variables
-----------------------
By default, pybind11 will compile modules with the compiler default or the
minimum standard required by pybind11, whichever is higher. You can set the
standard explicitly with
`CMAKE_CXX_STANDARD <https://cmake.org/cmake/help/latest/variable/CMAKE_CXX_STANDARD.html>`_:
.. code-block:: cmake
set(CMAKE_CXX_STANDARD 14 CACHE STRING "C++ version selection") # or 11, 14, 17, 20
set(CMAKE_CXX_STANDARD_REQUIRED ON) # optional, ensure standard is supported
set(CMAKE_CXX_EXTENSIONS OFF) # optional, keep compiler extensions off
The variables can also be set when calling CMake from the command line using
the ``-D<variable>=<value>`` flag. You can also manually set ``CXX_STANDARD``
on a target or use ``target_compile_features`` on your targets - anything that
CMake supports.
Classic Python support: The target Python version can be selected by setting
``PYBIND11_PYTHON_VERSION`` or an exact Python installation can be specified
with ``PYTHON_EXECUTABLE``. For example:
.. code-block:: bash
cmake -DPYBIND11_PYTHON_VERSION=3.6 ..
# Another method:
cmake -DPYTHON_EXECUTABLE=/path/to/python ..
# This often is a good way to get the current Python, works in environments:
cmake -DPYTHON_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)") ..
find_package vs. add_subdirectory
---------------------------------
For CMake-based projects that don't include the pybind11 repository internally,
an external installation can be detected through ``find_package(pybind11)``.
See the `Config file`_ docstring for details of relevant CMake variables.
.. code-block:: cmake
cmake_minimum_required(VERSION 3.4...3.18)
project(example LANGUAGES CXX)
find_package(pybind11 REQUIRED)
pybind11_add_module(example example.cpp)
Note that ``find_package(pybind11)`` will only work correctly if pybind11
has been correctly installed on the system, e. g. after downloading or cloning
the pybind11 repository :
.. code-block:: bash
# Classic CMake
cd pybind11
mkdir build
cd build
cmake ..
make install
# CMake 3.15+
cd pybind11
cmake -S . -B build
cmake --build build -j 2 # Build on 2 cores
cmake --install build
Once detected, the aforementioned ``pybind11_add_module`` can be employed as
before. The function usage and configuration variables are identical no matter
if pybind11 is added as a subdirectory or found as an installed package. You
can refer to the same [cmake_example]_ repository for a full sample project
-- just swap out ``add_subdirectory`` for ``find_package``.
.. _Config file: https://github.com/pybind/pybind11/blob/master/tools/pybind11Config.cmake.in
.. _find-python-mode:
FindPython mode
---------------
CMake 3.12+ (3.15+ recommended, 3.18.2+ ideal) added a new module called
FindPython that had a highly improved search algorithm and modern targets
and tools. If you use FindPython, pybind11 will detect this and use the
existing targets instead:
.. code-block:: cmake
cmake_minimum_required(VERSION 3.15...3.22)
project(example LANGUAGES CXX)
find_package(Python 3.6 COMPONENTS Interpreter Development REQUIRED)
find_package(pybind11 CONFIG REQUIRED)
# or add_subdirectory(pybind11)
pybind11_add_module(example example.cpp)
You can also use the targets (as listed below) with FindPython. If you define
``PYBIND11_FINDPYTHON``, pybind11 will perform the FindPython step for you
(mostly useful when building pybind11's own tests, or as a way to change search
algorithms from the CMake invocation, with ``-DPYBIND11_FINDPYTHON=ON``.
.. warning::
If you use FindPython to multi-target Python versions, use the individual
targets listed below, and avoid targets that directly include Python parts.
There are `many ways to hint or force a discovery of a specific Python
installation <https://cmake.org/cmake/help/latest/module/FindPython.html>`_),
setting ``Python_ROOT_DIR`` may be the most common one (though with
virtualenv/venv support, and Conda support, this tends to find the correct
Python version more often than the old system did).
.. warning::
When the Python libraries (i.e. ``libpythonXX.a`` and ``libpythonXX.so``
on Unix) are not available, as is the case on a manylinux image, the
``Development`` component will not be resolved by ``FindPython``. When not
using the embedding functionality, CMake 3.18+ allows you to specify
``Development.Module`` instead of ``Development`` to resolve this issue.
.. versionadded:: 2.6
Advanced: interface library targets
-----------------------------------
Pybind11 supports modern CMake usage patterns with a set of interface targets,
available in all modes. The targets provided are:
``pybind11::headers``
Just the pybind11 headers and minimum compile requirements
``pybind11::pybind11``
Python headers + ``pybind11::headers``
``pybind11::python_link_helper``
Just the "linking" part of pybind11:module
``pybind11::module``
Everything for extension modules - ``pybind11::pybind11`` + ``Python::Module`` (FindPython CMake 3.15+) or ``pybind11::python_link_helper``
``pybind11::embed``
Everything for embedding the Python interpreter - ``pybind11::pybind11`` + ``Python::Python`` (FindPython) or Python libs
``pybind11::lto`` / ``pybind11::thin_lto``
An alternative to `INTERPROCEDURAL_OPTIMIZATION` for adding link-time optimization.
``pybind11::windows_extras``
``/bigobj`` and ``/mp`` for MSVC.
``pybind11::opt_size``
``/Os`` for MSVC, ``-Os`` for other compilers. Does nothing for debug builds.
Two helper functions are also provided:
``pybind11_strip(target)``
Strips a target (uses ``CMAKE_STRIP`` after the target is built)
``pybind11_extension(target)``
Sets the correct extension (with SOABI) for a target.
You can use these targets to build complex applications. For example, the
``add_python_module`` function is identical to:
.. code-block:: cmake
cmake_minimum_required(VERSION 3.5...3.27)
project(example LANGUAGES CXX)
find_package(pybind11 REQUIRED) # or add_subdirectory(pybind11)
add_library(example MODULE main.cpp)
target_link_libraries(example PRIVATE pybind11::module pybind11::lto pybind11::windows_extras)
pybind11_extension(example)
if(NOT MSVC AND NOT ${CMAKE_BUILD_TYPE} MATCHES Debug|RelWithDebInfo)
# Strip unnecessary sections of the binary on Linux/macOS
pybind11_strip(example)
endif()
set_target_properties(example PROPERTIES CXX_VISIBILITY_PRESET "hidden"
CUDA_VISIBILITY_PRESET "hidden")
Instead of setting properties, you can set ``CMAKE_*`` variables to initialize these correctly.
.. warning::
Since pybind11 is a metatemplate library, it is crucial that certain
compiler flags are provided to ensure high quality code generation. In
contrast to the ``pybind11_add_module()`` command, the CMake interface
provides a *composable* set of targets to ensure that you retain flexibility.
It can be especially important to provide or set these properties; the
:ref:`FAQ <faq:symhidden>` contains an explanation on why these are needed.
.. versionadded:: 2.6
.. _nopython-mode:
Advanced: NOPYTHON mode
-----------------------
If you want complete control, you can set ``PYBIND11_NOPYTHON`` to completely
disable Python integration (this also happens if you run ``FindPython2`` and
``FindPython3`` without running ``FindPython``). This gives you complete
freedom to integrate into an existing system (like `Scikit-Build's
<https://scikit-build.readthedocs.io>`_ ``PythonExtensions``).
``pybind11_add_module`` and ``pybind11_extension`` will be unavailable, and the
targets will be missing any Python specific behavior.
.. versionadded:: 2.6
Embedding the Python interpreter
--------------------------------
In addition to extension modules, pybind11 also supports embedding Python into
a C++ executable or library. In CMake, simply link with the ``pybind11::embed``
target. It provides everything needed to get the interpreter running. The Python
headers and libraries are attached to the target. Unlike ``pybind11::module``,
there is no need to manually set any additional properties here. For more
information about usage in C++, see :doc:`/advanced/embedding`.
.. code-block:: cmake
cmake_minimum_required(VERSION 3.5...3.27)
project(example LANGUAGES CXX)
find_package(pybind11 REQUIRED) # or add_subdirectory(pybind11)
add_executable(example main.cpp)
target_link_libraries(example PRIVATE pybind11::embed)
.. _building_manually:
Building manually
=================
pybind11 is a header-only library, hence it is not necessary to link against
any special libraries and there are no intermediate (magic) translation steps.
On Linux, you can compile an example such as the one given in
:ref:`simple_example` using the following command:
.. code-block:: bash
$ c++ -O3 -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) example.cpp -o example$(python3-config --extension-suffix)
The ``python3 -m pybind11 --includes`` command fetches the include paths for
both pybind11 and Python headers. This assumes that pybind11 has been installed
using ``pip`` or ``conda``. If it hasn't, you can also manually specify
``-I <path-to-pybind11>/include`` together with the Python includes path
``python3-config --includes``.
On macOS: the build command is almost the same but it also requires passing
the ``-undefined dynamic_lookup`` flag so as to ignore missing symbols when
building the module:
.. code-block:: bash
$ c++ -O3 -Wall -shared -std=c++11 -undefined dynamic_lookup $(python3 -m pybind11 --includes) example.cpp -o example$(python3-config --extension-suffix)
In general, it is advisable to include several additional build parameters
that can considerably reduce the size of the created binary. Refer to section
:ref:`cmake` for a detailed example of a suitable cross-platform CMake-based
build system that works on all platforms including Windows.
.. note::
On Linux and macOS, it's better to (intentionally) not link against
``libpython``. The symbols will be resolved when the extension library
is loaded into a Python binary. This is preferable because you might
have several different installations of a given Python version (e.g. the
system-provided Python, and one that ships with a piece of commercial
software). In this way, the plugin will work with both versions, instead
of possibly importing a second Python library into a process that already
contains one (which will lead to a segfault).
Building with Bazel
===================
You can build with the Bazel build system using the `pybind11_bazel
<https://github.com/pybind/pybind11_bazel>`_ repository.
Generating binding code automatically
=====================================
The ``Binder`` project is a tool for automatic generation of pybind11 binding
code by introspecting existing C++ codebases using LLVM/Clang. See the
[binder]_ documentation for details.
.. [binder] http://cppbinder.readthedocs.io/en/latest/about.html
[AutoWIG]_ is a Python library that wraps automatically compiled libraries into
high-level languages. It parses C++ code using LLVM/Clang technologies and
generates the wrappers using the Mako templating engine. The approach is automatic,
extensible, and applies to very complex C++ libraries, composed of thousands of
classes or incorporating modern meta-programming constructs.
.. [AutoWIG] https://github.com/StatisKit/AutoWIG
[robotpy-build]_ is a is a pure python, cross platform build tool that aims to
simplify creation of python wheels for pybind11 projects, and provide
cross-project dependency management. Additionally, it is able to autogenerate
customizable pybind11-based wrappers by parsing C++ header files.
.. [robotpy-build] https://robotpy-build.readthedocs.io
[litgen]_ is an automatic python bindings generator with a focus on generating
documented and discoverable bindings: bindings will nicely reproduce the documentation
found in headers. It is is based on srcML (srcml.org), a highly scalable, multi-language
parsing tool with a developer centric approach. The API that you want to expose to python
must be C++14 compatible (but your implementation can use more modern constructs).
.. [litgen] https://pthom.github.io/litgen

368
3rdparty/pybind11/docs/conf.py vendored Normal file
View File

@ -0,0 +1,368 @@
#!/usr/bin/env python3
#
# pybind11 documentation build configuration file, created by
# sphinx-quickstart on Sun Oct 11 19:23:48 2015.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import os
import re
import subprocess
import sys
from pathlib import Path
DIR = Path(__file__).parent.resolve()
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
# sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
"breathe",
"sphinx_copybutton",
"sphinxcontrib.rsvgconverter",
"sphinxcontrib.moderncmakedomain",
]
breathe_projects = {"pybind11": ".build/doxygenxml/"}
breathe_default_project = "pybind11"
breathe_domain_by_extension = {"h": "cpp"}
# Add any paths that contain templates here, relative to this directory.
templates_path = [".templates"]
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md']
source_suffix = ".rst"
# The encoding of source files.
# source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = "index"
# General information about the project.
project = "pybind11"
copyright = "2017, Wenzel Jakob"
author = "Wenzel Jakob"
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
# Read the listed version
with open("../pybind11/_version.py") as f:
code = compile(f.read(), "../pybind11/_version.py", "exec")
loc = {}
exec(code, loc)
# The full version, including alpha/beta/rc tags.
version = loc["__version__"]
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
# today = ''
# Else, today_fmt is used as the format for a strftime call.
# today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = [".build", "release.rst"]
# The reST default role (used for this markup: `text`) to use for all
# documents.
default_role = "any"
# If true, '()' will be appended to :func: etc. cross-reference text.
# add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
# add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
# show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
# pygments_style = 'monokai'
# A list of ignored prefixes for module index sorting.
# modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
# keep_warnings = False
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = "furo"
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
# html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
# html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<version> documentation".
# html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
# html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
# html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
# html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ["_static"]
html_css_files = [
"css/custom.css",
]
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
# html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
# html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
# html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
# html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
# html_additional_pages = {}
# If false, no module index is generated.
# html_domain_indices = True
# If false, no index is generated.
# html_use_index = True
# If true, the index is split into individual pages for each letter.
# html_split_index = False
# If true, links to the reST sources are added to the pages.
# html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
# html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
# html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
# html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
# html_file_suffix = None
# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja'
# 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr'
# html_search_language = 'en'
# A dictionary with options for the search language support, empty by default.
# Now only 'ja' uses this config value
# html_search_options = {'type': 'default'}
# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
# html_search_scorer = 'scorer.js'
# Output file base name for HTML help builder.
htmlhelp_basename = "pybind11doc"
# -- Options for LaTeX output ---------------------------------------------
latex_engine = "pdflatex"
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
# 'papersize': 'letterpaper',
#
# The font size ('10pt', '11pt' or '12pt').
# 'pointsize': '10pt',
#
# Additional stuff for the LaTeX preamble.
# remove blank pages (between the title page and the TOC, etc.)
"classoptions": ",openany,oneside",
"preamble": r"""
\usepackage{fontawesome}
\usepackage{textgreek}
\DeclareUnicodeCharacter{00A0}{}
\DeclareUnicodeCharacter{2194}{\faArrowsH}
\DeclareUnicodeCharacter{1F382}{\faBirthdayCake}
\DeclareUnicodeCharacter{1F355}{\faAdjust}
\DeclareUnicodeCharacter{0301}{'}
\DeclareUnicodeCharacter{03C0}{\textpi}
""",
# Latex figure (float) alignment
# 'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, "pybind11.tex", "pybind11 Documentation", "Wenzel Jakob", "manual"),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
# latex_logo = 'pybind11-logo.png'
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
# latex_use_parts = False
# If true, show page references after internal links.
# latex_show_pagerefs = False
# If true, show URL addresses after external links.
# latex_show_urls = False
# Documents to append as an appendix to all manuals.
# latex_appendices = []
# If false, no module index is generated.
# latex_domain_indices = True
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [(master_doc, "pybind11", "pybind11 Documentation", [author], 1)]
# If true, show URL addresses after external links.
# man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(
master_doc,
"pybind11",
"pybind11 Documentation",
author,
"pybind11",
"One line description of project.",
"Miscellaneous",
),
]
# Documents to append as an appendix to all manuals.
# texinfo_appendices = []
# If false, no module index is generated.
# texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
# texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
# texinfo_no_detailmenu = False
primary_domain = "cpp"
highlight_language = "cpp"
def generate_doxygen_xml(app):
build_dir = os.path.join(app.confdir, ".build")
if not os.path.exists(build_dir):
os.mkdir(build_dir)
try:
subprocess.call(["doxygen", "--version"])
retcode = subprocess.call(["doxygen"], cwd=app.confdir)
if retcode < 0:
sys.stderr.write(f"doxygen error code: {-retcode}\n")
except OSError as e:
sys.stderr.write(f"doxygen execution failed: {e}\n")
def prepare(app):
with open(DIR.parent / "README.rst") as f:
contents = f.read()
if app.builder.name == "latex":
# Remove badges and stuff from start
contents = contents[contents.find(r".. start") :]
# Filter out section titles for index.rst for LaTeX
contents = re.sub(r"^(.*)\n[-~]{3,}$", r"**\1**", contents, flags=re.MULTILINE)
with open(DIR / "readme.rst", "w") as f:
f.write(contents)
def clean_up(app, exception): # noqa: ARG001
(DIR / "readme.rst").unlink()
def setup(app):
# Add hook for building doxygen xml when needed
app.connect("builder-inited", generate_doxygen_xml)
# Copy the readme in
app.connect("builder-inited", prepare)
# Clean up the generated readme
app.connect("build-finished", clean_up)

308
3rdparty/pybind11/docs/faq.rst vendored Normal file
View File

@ -0,0 +1,308 @@
Frequently asked questions
##########################
"ImportError: dynamic module does not define init function"
===========================================================
1. Make sure that the name specified in PYBIND11_MODULE is identical to the
filename of the extension library (without suffixes such as ``.so``).
2. If the above did not fix the issue, you are likely using an incompatible
version of Python that does not match what you compiled with.
"Symbol not found: ``__Py_ZeroStruct`` / ``_PyInstanceMethod_Type``"
========================================================================
See the first answer.
"SystemError: dynamic module not initialized properly"
======================================================
See the first answer.
The Python interpreter immediately crashes when importing my module
===================================================================
See the first answer.
.. _faq_reference_arguments:
Limitations involving reference arguments
=========================================
In C++, it's fairly common to pass arguments using mutable references or
mutable pointers, which allows both read and write access to the value
supplied by the caller. This is sometimes done for efficiency reasons, or to
realize functions that have multiple return values. Here are two very basic
examples:
.. code-block:: cpp
void increment(int &i) { i++; }
void increment_ptr(int *i) { (*i)++; }
In Python, all arguments are passed by reference, so there is no general
issue in binding such code from Python.
However, certain basic Python types (like ``str``, ``int``, ``bool``,
``float``, etc.) are **immutable**. This means that the following attempt
to port the function to Python doesn't have the same effect on the value
provided by the caller -- in fact, it does nothing at all.
.. code-block:: python
def increment(i):
i += 1 # nope..
pybind11 is also affected by such language-level conventions, which means that
binding ``increment`` or ``increment_ptr`` will also create Python functions
that don't modify their arguments.
Although inconvenient, one workaround is to encapsulate the immutable types in
a custom type that does allow modifications.
An other alternative involves binding a small wrapper lambda function that
returns a tuple with all output arguments (see the remainder of the
documentation for examples on binding lambda functions). An example:
.. code-block:: cpp
int foo(int &i) { i++; return 123; }
and the binding code
.. code-block:: cpp
m.def("foo", [](int i) { int rv = foo(i); return std::make_tuple(rv, i); });
How can I reduce the build time?
================================
It's good practice to split binding code over multiple files, as in the
following example:
:file:`example.cpp`:
.. code-block:: cpp
void init_ex1(py::module_ &);
void init_ex2(py::module_ &);
/* ... */
PYBIND11_MODULE(example, m) {
init_ex1(m);
init_ex2(m);
/* ... */
}
:file:`ex1.cpp`:
.. code-block:: cpp
void init_ex1(py::module_ &m) {
m.def("add", [](int a, int b) { return a + b; });
}
:file:`ex2.cpp`:
.. code-block:: cpp
void init_ex2(py::module_ &m) {
m.def("sub", [](int a, int b) { return a - b; });
}
:command:`python`:
.. code-block:: pycon
>>> import example
>>> example.add(1, 2)
3
>>> example.sub(1, 1)
0
As shown above, the various ``init_ex`` functions should be contained in
separate files that can be compiled independently from one another, and then
linked together into the same final shared object. Following this approach
will:
1. reduce memory requirements per compilation unit.
2. enable parallel builds (if desired).
3. allow for faster incremental builds. For instance, when a single class
definition is changed, only a subset of the binding code will generally need
to be recompiled.
"recursive template instantiation exceeded maximum depth of 256"
================================================================
If you receive an error about excessive recursive template evaluation, try
specifying a larger value, e.g. ``-ftemplate-depth=1024`` on GCC/Clang. The
culprit is generally the generation of function signatures at compile time
using C++14 template metaprogramming.
.. _`faq:hidden_visibility`:
"'SomeClass' declared with greater visibility than the type of its field 'SomeClass::member' [-Wattributes]"
============================================================================================================
This error typically indicates that you are compiling without the required
``-fvisibility`` flag. pybind11 code internally forces hidden visibility on
all internal code, but if non-hidden (and thus *exported*) code attempts to
include a pybind type (for example, ``py::object`` or ``py::list``) you can run
into this warning.
To avoid it, make sure you are specifying ``-fvisibility=hidden`` when
compiling pybind code.
As to why ``-fvisibility=hidden`` is necessary, because pybind modules could
have been compiled under different versions of pybind itself, it is also
important that the symbols defined in one module do not clash with the
potentially-incompatible symbols defined in another. While Python extension
modules are usually loaded with localized symbols (under POSIX systems
typically using ``dlopen`` with the ``RTLD_LOCAL`` flag), this Python default
can be changed, but even if it isn't it is not always enough to guarantee
complete independence of the symbols involved when not using
``-fvisibility=hidden``.
Additionally, ``-fvisibility=hidden`` can deliver considerably binary size
savings. (See the following section for more details.)
.. _`faq:symhidden`:
How can I create smaller binaries?
==================================
To do its job, pybind11 extensively relies on a programming technique known as
*template metaprogramming*, which is a way of performing computation at compile
time using type information. Template metaprogramming usually instantiates code
involving significant numbers of deeply nested types that are either completely
removed or reduced to just a few instructions during the compiler's optimization
phase. However, due to the nested nature of these types, the resulting symbol
names in the compiled extension library can be extremely long. For instance,
the included test suite contains the following symbol:
.. only:: html
.. code-block:: none
__ZN8pybind1112cpp_functionC1Iv8Example2JRNSt3__16vectorINS3_12basic_stringIwNS3_11char_traitsIwEENS3_9allocatorIwEEEENS8_ISA_EEEEEJNS_4nameENS_7siblingENS_9is_methodEA28_cEEEMT0_FT_DpT1_EDpRKT2_
.. only:: not html
.. code-block:: cpp
__ZN8pybind1112cpp_functionC1Iv8Example2JRNSt3__16vectorINS3_12basic_stringIwNS3_11char_traitsIwEENS3_9allocatorIwEEEENS8_ISA_EEEEEJNS_4nameENS_7siblingENS_9is_methodEA28_cEEEMT0_FT_DpT1_EDpRKT2_
which is the mangled form of the following function type:
.. code-block:: cpp
pybind11::cpp_function::cpp_function<void, Example2, std::__1::vector<std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >, std::__1::allocator<std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > > >&, pybind11::name, pybind11::sibling, pybind11::is_method, char [28]>(void (Example2::*)(std::__1::vector<std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >, std::__1::allocator<std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > > >&), pybind11::name const&, pybind11::sibling const&, pybind11::is_method const&, char const (&) [28])
The memory needed to store just the mangled name of this function (196 bytes)
is larger than the actual piece of code (111 bytes) it represents! On the other
hand, it's silly to even give this function a name -- after all, it's just a
tiny cog in a bigger piece of machinery that is not exposed to the outside
world. So we'll generally only want to export symbols for those functions which
are actually called from the outside.
This can be achieved by specifying the parameter ``-fvisibility=hidden`` to GCC
and Clang, which sets the default symbol visibility to *hidden*, which has a
tremendous impact on the final binary size of the resulting extension library.
(On Visual Studio, symbols are already hidden by default, so nothing needs to
be done there.)
In addition to decreasing binary size, ``-fvisibility=hidden`` also avoids
potential serious issues when loading multiple modules and is required for
proper pybind operation. See the previous FAQ entry for more details.
How can I properly handle Ctrl-C in long-running functions?
===========================================================
Ctrl-C is received by the Python interpreter, and holds it until the GIL
is released, so a long-running function won't be interrupted.
To interrupt from inside your function, you can use the ``PyErr_CheckSignals()``
function, that will tell if a signal has been raised on the Python side. This
function merely checks a flag, so its impact is negligible. When a signal has
been received, you must either explicitly interrupt execution by throwing
``py::error_already_set`` (which will propagate the existing
``KeyboardInterrupt``), or clear the error (which you usually will not want):
.. code-block:: cpp
PYBIND11_MODULE(example, m)
{
m.def("long running_func", []()
{
for (;;) {
if (PyErr_CheckSignals() != 0)
throw py::error_already_set();
// Long running iteration
}
});
}
CMake doesn't detect the right Python version
=============================================
The CMake-based build system will try to automatically detect the installed
version of Python and link against that. When this fails, or when there are
multiple versions of Python and it finds the wrong one, delete
``CMakeCache.txt`` and then add ``-DPYTHON_EXECUTABLE=$(which python)`` to your
CMake configure line. (Replace ``$(which python)`` with a path to python if
your prefer.)
You can alternatively try ``-DPYBIND11_FINDPYTHON=ON``, which will activate the
new CMake FindPython support instead of pybind11's custom search. Requires
CMake 3.12+, and 3.15+ or 3.18.2+ are even better. You can set this in your
``CMakeLists.txt`` before adding or finding pybind11, as well.
Inconsistent detection of Python version in CMake and pybind11
==============================================================
The functions ``find_package(PythonInterp)`` and ``find_package(PythonLibs)``
provided by CMake for Python version detection are modified by pybind11 due to
unreliability and limitations that make them unsuitable for pybind11's needs.
Instead pybind11 provides its own, more reliable Python detection CMake code.
Conflicts can arise, however, when using pybind11 in a project that *also* uses
the CMake Python detection in a system with several Python versions installed.
This difference may cause inconsistencies and errors if *both* mechanisms are
used in the same project.
There are three possible solutions:
1. Avoid using ``find_package(PythonInterp)`` and ``find_package(PythonLibs)``
from CMake and rely on pybind11 in detecting Python version. If this is not
possible, the CMake machinery should be called *before* including pybind11.
2. Set ``PYBIND11_FINDPYTHON`` to ``True`` or use ``find_package(Python
COMPONENTS Interpreter Development)`` on modern CMake (3.12+, 3.15+ better,
3.18.2+ best). Pybind11 in these cases uses the new CMake FindPython instead
of the old, deprecated search tools, and these modules are much better at
finding the correct Python. If FindPythonLibs/Interp are not available
(CMake 3.27+), then this will be ignored and FindPython will be used.
3. Set ``PYBIND11_NOPYTHON`` to ``TRUE``. Pybind11 will not search for Python.
However, you will have to use the target-based system, and do more setup
yourself, because it does not know about or include things that depend on
Python, like ``pybind11_add_module``. This might be ideal for integrating
into an existing system, like scikit-build's Python helpers.
How to cite this project?
=========================
We suggest the following BibTeX template to cite pybind11 in scientific
discourse:
.. code-block:: bash
@misc{pybind11,
author = {Wenzel Jakob and Jason Rhinelander and Dean Moldovan},
year = {2017},
note = {https://github.com/pybind/pybind11},
title = {pybind11 -- Seamless operability between C++11 and Python}
}

48
3rdparty/pybind11/docs/index.rst vendored Normal file
View File

@ -0,0 +1,48 @@
.. only:: latex
Intro
=====
.. include:: readme.rst
.. only:: not latex
Contents:
.. toctree::
:maxdepth: 1
changelog
upgrade
.. toctree::
:caption: The Basics
:maxdepth: 2
installing
basics
classes
compiling
.. toctree::
:caption: Advanced Topics
:maxdepth: 2
advanced/functions
advanced/classes
advanced/exceptions
advanced/smart_ptrs
advanced/cast/index
advanced/pycpp/index
advanced/embedding
advanced/misc
.. toctree::
:caption: Extra Information
:maxdepth: 1
faq
benchmark
limitations
reference
cmake/index

105
3rdparty/pybind11/docs/installing.rst vendored Normal file
View File

@ -0,0 +1,105 @@
.. _installing:
Installing the library
######################
There are several ways to get the pybind11 source, which lives at
`pybind/pybind11 on GitHub <https://github.com/pybind/pybind11>`_. The pybind11
developers recommend one of the first three ways listed here, submodule, PyPI,
or conda-forge, for obtaining pybind11.
.. _include_as_a_submodule:
Include as a submodule
======================
When you are working on a project in Git, you can use the pybind11 repository
as a submodule. From your git repository, use:
.. code-block:: bash
git submodule add -b stable ../../pybind/pybind11 extern/pybind11
git submodule update --init
This assumes you are placing your dependencies in ``extern/``, and that you are
using GitHub; if you are not using GitHub, use the full https or ssh URL
instead of the relative URL ``../../pybind/pybind11`` above. Some other servers
also require the ``.git`` extension (GitHub does not).
From here, you can now include ``extern/pybind11/include``, or you can use
the various integration tools (see :ref:`compiling`) pybind11 provides directly
from the local folder.
Include with PyPI
=================
You can download the sources and CMake files as a Python package from PyPI
using Pip. Just use:
.. code-block:: bash
pip install pybind11
This will provide pybind11 in a standard Python package format. If you want
pybind11 available directly in your environment root, you can use:
.. code-block:: bash
pip install "pybind11[global]"
This is not recommended if you are installing with your system Python, as it
will add files to ``/usr/local/include/pybind11`` and
``/usr/local/share/cmake/pybind11``, so unless that is what you want, it is
recommended only for use in virtual environments or your ``pyproject.toml``
file (see :ref:`compiling`).
Include with conda-forge
========================
You can use pybind11 with conda packaging via `conda-forge
<https://github.com/conda-forge/pybind11-feedstock>`_:
.. code-block:: bash
conda install -c conda-forge pybind11
Include with vcpkg
==================
You can download and install pybind11 using the Microsoft `vcpkg
<https://github.com/Microsoft/vcpkg/>`_ dependency manager:
.. code-block:: bash
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
vcpkg install pybind11
The pybind11 port in vcpkg is kept up to date by Microsoft team members and
community contributors. If the version is out of date, please `create an issue
or pull request <https://github.com/Microsoft/vcpkg/>`_ on the vcpkg
repository.
Global install with brew
========================
The brew package manager (Homebrew on macOS, or Linuxbrew on Linux) has a
`pybind11 package
<https://github.com/Homebrew/homebrew-core/blob/master/Formula/pybind11.rb>`_.
To install:
.. code-block:: bash
brew install pybind11
.. We should list Conan, and possibly a few other C++ package managers (hunter,
.. perhaps). Conan has a very clean CMake integration that would be good to show.
Other options
=============
Other locations you can find pybind11 are `listed here
<https://repology.org/project/python:pybind11/versions>`_; these are maintained
by various packagers and the community.

72
3rdparty/pybind11/docs/limitations.rst vendored Normal file
View File

@ -0,0 +1,72 @@
Limitations
###########
Design choices
^^^^^^^^^^^^^^
pybind11 strives to be a general solution to binding generation, but it also has
certain limitations:
- pybind11 casts away ``const``-ness in function arguments and return values.
This is in line with the Python language, which has no concept of ``const``
values. This means that some additional care is needed to avoid bugs that
would be caught by the type checker in a traditional C++ program.
- The NumPy interface ``pybind11::array`` greatly simplifies accessing
numerical data from C++ (and vice versa), but it's not a full-blown array
class like ``Eigen::Array`` or ``boost.multi_array``. ``Eigen`` objects are
directly supported, however, with ``pybind11/eigen.h``.
Large but useful features could be implemented in pybind11 but would lead to a
significant increase in complexity. Pybind11 strives to be simple and compact.
Users who require large new features are encouraged to write an extension to
pybind11; see `pybind11_json <https://github.com/pybind/pybind11_json>`_ for an
example.
Known bugs
^^^^^^^^^^
These are issues that hopefully will one day be fixed, but currently are
unsolved. If you know how to help with one of these issues, contributions
are welcome!
- Intel 20.2 is currently having an issue with the test suite.
`#2573 <https://github.com/pybind/pybind11/pull/2573>`_
- Debug mode Python does not support 1-5 tests in the test suite currently.
`#2422 <https://github.com/pybind/pybind11/pull/2422>`_
- PyPy3 7.3.1 and 7.3.2 have issues with several tests on 32-bit Windows.
Known limitations
^^^^^^^^^^^^^^^^^
These are issues that are probably solvable, but have not been fixed yet. A
clean, well written patch would likely be accepted to solve them.
- Type casters are not kept alive recursively.
`#2527 <https://github.com/pybind/pybind11/issues/2527>`_
One consequence is that containers of ``char *`` are currently not supported.
`#2245 <https://github.com/pybind/pybind11/issues/2245>`_
- The ``cpptest`` does not run on Windows with Python 3.8 or newer, due to DLL
loader changes. User code that is correctly installed should not be affected.
`#2560 <https://github.com/pybind/pybind11/issue/2560>`_
Python 3.9.0 warning
^^^^^^^^^^^^^^^^^^^^
Combining older versions of pybind11 (< 2.6.0) with Python on exactly 3.9.0
will trigger undefined behavior that typically manifests as crashes during
interpreter shutdown (but could also destroy your data. **You have been
warned**).
This issue was `fixed in Python <https://github.com/python/cpython/pull/22670>`_.
As a mitigation for this bug, pybind11 2.6.0 or newer includes a workaround
specifically when Python 3.9.0 is detected at runtime, leaking about 50 bytes
of memory when a callback function is garbage collected. For reference, the
pybind11 test suite has about 2,000 such callbacks, but only 49 are garbage
collected before the end-of-process. Wheels (even if built with Python 3.9.0)
will correctly avoid the leak when run in Python 3.9.1, and this does not
affect other 3.X versions.

BIN
3rdparty/pybind11/docs/pybind11-logo.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Some files were not shown because too many files have changed in this diff Show More