* SER_CLK support
* Update constids
* wip
* CLK_FEEDBACK
* Handle SER_CLK and SER_CLK_N
* clangformat
* Cleanup
* Use _ as separator for PLL CFGs
* Remove unused clocking cells
* Do not use same name for IO models
* Fix IDDR merge
* Cleanup
* Properly handle user global signals
* Move signal inversion in bitstream creation
* Start adding multi die support
* Display die location for pins used
* Do not use constant s as locations
* Cleanup SB_DRIVE handling
* Use DDR locations from chip database
* Place only in prefered die for now
* Set D2D
* Fixed typos
A segment router replaces the source-to-sink connection by
general-purpose PIPs with bus-branch segment network connections.
The problem arises when the source is connected to the sinks directly
without switching as in the case of LUT->DFF, such wires should be left
as is, which is what this PR does.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
* gatemate: clock router
Co-authored-by: Miodrag Milanovic <mmicko@gmail.com>
* Re-add clock router pip binding
* Refactoring
* Require globals to use a BUFG
* Fix misunderstanding of GPIO/RAM clocking
* Add plane info to chipdb
* Force clock routing along a specific plane
* Remove overly-limiting condition
* Move clock router into its own file
* Clock router based on delay
* Refine clock router conditions
* More detailed clock routing output
* Clean up debug messages
* clangformat
---------
Co-authored-by: Miodrag Milanovic <mmicko@gmail.com>
Fill in the delays for PIP classes related to HCLK and IODELAY. Also:
- if clock routing fails, we try to use the next fastest mechanism - segment networks;
- fixing harmless typos.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
* Initial code for GateMate
* Initial work on forming bitstream
* Add CCF parsing
* Use CCF to set IO location
* Propagate errors
* Restructure code
* Add support for reading from config
* Start adding infrastructure for reading bitstream
* Fix script
* GPIO initial work
* Add IN1->RAM_O2 propagation
* Fixed typo
* Cleanup
* More parameter checks
* Add LVDS support
* Cleanup
* Keep just used connections for now
* Naive lut tree CPE pack
* Naive pack CC_DFF
* pack DFF fixes
* Handle MUX flags
* Fix DFF pack
* Prevent pass trough issues
* Cleanup
* Use device wrapper class
* Update due to API changes
* Use pin connection aliases
* Start work on BUFG support
* Fix CC_L2T5 pack
* Add CPE input inverters
* Constrain routes to have correct inversion state
* Add clock inversion pip
* Added MX2 and MX4 support
* Fix script
* BUFG support
* debug print if route found with wrong polarity
* Some CC_DFF improvements
* Create reproducible chip database
* Simplify inversion of special signals
* Few more DFF features
* Add forgotten virtual port renames
* Handle muxes with constant inputs
* Allow inversion for muxes
* cleanup
* DFF input can be constant
* init DFF only when needed
* cleanup
* Add basic PLL support
* Add some timings
* Add USR_RSTN support
* Display few more primitives
* Use pass trough signals to validate architecture data
* Use extra tile information from chip database
* Updates needed for a build system changes
* Implement SB_DRIVE support
* Properly named configuration bits
* autogenerated constids.inc
* small fix
* Initial code for CPE halfs
* Some cleanup
* make sure FFs are compatible
* reverted due to db change
* Merge DFF where applicable
* memory allocation issue
* fix
* better MX2
* ram_i handling
* Cleanup MX4
* Support latches
* compare L_D flag as well
* Move virtual pips
* Naive addf pack
* carry chains grouping
* Keep chip database reproducible
* split addf vectors
* Block CPEs when GPIO is used
* Prepare placement code
* RAM_I/RAM_O rewrite
* fix ram_i/o index
* Display RAM and add new primitives
* PLL wip code
* CC_PLL_ADV packing
* PLL handling cleanup
* Add PLL comments
* Keep only high fan-out BUFG
* Add skeleton for tests
* Utilize move_ram_o
* GPIO wip
* GPIO wip
* PLL fixes
* cleanup
* FF_OBF support
* Handle FF_IBF
* Make SLEW FAST if not defined as in latest p_r
* Make sure FF_OBF only driving GPIO
* Moved pll calc into separate file
* IDDR handling and started ODDR
* Route DDR input for CC_ODDR
* Notify error in case ODDR or IDDR are used but not with I/O pin
* cleanup for CC_USR_RSTN
* Extract proper RAM location for bitstream
* Code cleanup
* Allow auto place of pads
* Use clock source flag
* Configure GPIO clock signals
* Handle conflicting clk
* Use BUGF in proper order
* Connected CLK, works without but good for debugging
* CC_CFG_CTRL placement
* Group RAM data 40 bytes per row
* Write BRAM content
* RAM wip
* Use relative constraints from chipdb
* fix broken build
* Memory wip
* Handle custom clock for memories
* Support FIFO
* optimize move_ram_io
* Fix SR signal handling acorrding to findings
* set placer beta
* Pre place what we can
* Revert "debug print if route found with wrong polarity"
This reverts commit cf9ded2f18.
* Revert "Constrain routes to have correct inversion state"
This reverts commit 795c284d48.
* Remove virtual pips
* Implement post processing inversion
* ADDF add ability to route additional CO
* Merge two ADDFs in one CPE
* Added TODO
* clangformat
* Cleanup
* Add serdes handling in config file
* Cleanup
* Cleanup
* Cleanup
* Fix in PLL handling
* Fixed ADDF edge case
* No need for this
* Fix latch
* Sanity checks
* Support CC_BRAM_20K merge
* Start creating testing environment
* LVDS fixes
* Add connection helper
* Cleanup
* Fix tabs
* Formatting fix
* Remove optimization tests for now
* remove read_bitstream
* removed .c_str()
* Removed config parsing
* using snake_case
* Use bool_or_default where applicable
* refactored bitstream write code
* Add allow-unconstrained option
* Update DFF related messages
* Add clock constraint propagation
---------
Co-authored-by: Lofty <dan.ravensloft@gmail.com>
* Gowin. BUGFIX Use a separate net for segment gates
We use a temporary separate small network (typically 2 - 3 sinks) for
routing from the segment network source to the segment gate. This fixes
the rare but unpleasant case of self-intersection when a route to a gate
is routed using PIPs after the gate, this is no longer allowed when
using a separate small network.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
* Gowin. Fix style.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
---------
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
DLLDLY is the clock delay primitive that adjust the input clock
according to the DLLSTEP signal and outputs the delayed clock.
These primitives are associated with clock pins and are "tapped" between
the output of this IBUF and the clock networks, leaving the possibility
to connect to the original unshifted signal as well, although the latter
is not very practical because it is no longer possible to use fast
wires.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
Gowin chips have an interesting mechanism - wires that run vertically
through several rows (at least 10) in each column of the chip. In each
row a particular wire has branches to the left and right, covering on
average 4 neighboring cells in the row. For lack of a better term, I
further call such a wire a segment.
So a segment can provide a direct connection in a local rectangle. There
are no special restrictions on the sinks, so segment networks can be
used for ClockEnable, LocalSetReset, as well as for LUT and DFF inputs.
The sources are not so simple - the sources can be the upper or lower
end of the segment, which in theory can lead to unfortunate consequences
if the signal is applied from both ends.
The matter is complicated by the fact that there are default
connections, i.e. in the absence of any set fuse the segment input is
still connected to something (VCC for example) and to disable the unused
end of the segment you need to set a special combination of fuses.
Taking into account which end of which segment is used is one of the
tasks of this router. In addition, segment ends can physically coincide
with PLL, DSP and BSRAM inputs, which can also lead to unexpected
effects. Some of these things are tracked when generating the base, some
in this router, some when packing in gowin_pack.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
Adds the ability to use high-speed clock lines (together with CLKDIV2
type frequency dividers operating on them) as sieve signals for the
CLKIN and CLKFB inputs of the rPLL and PLLVR primitives (these cover the
full range of supported Gowin chips).
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
* Gowin. Add I3C io buffer.
A buffer is added that can operate as a normal IOBUF in PUSH-PULL mode
or switch to open-drain IOBUF mode.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
* Gowin. Turn a variable into a set of flags
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
---------
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
Adds output (MIPI_OBUF and MIPI_OBUF_A) and input (MIPI_IBUF) primitives
to allow the use of “real” MIPI (not emulation) ports capable of
operating in both HS and LP modes.
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
Due to the way CMake-generated Makefiles evaluate dependencies, this
calls the `.bba` generation custom command twice, which then fails as
they both use the same `.bba.new` file as an output and one of them
moves it first.
This broke builds using `make -j` but not builds using
`make -j nextpnr-himbaechel-example`.
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
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
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).
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.
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>
* 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>