
* 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>
132 lines
4.1 KiB
C++
132 lines
4.1 KiB
C++
/*
|
|
* nextpnr -- Next Generation Place and Route
|
|
*
|
|
* Copyright (C) 2024 The Project Beyond Authors.
|
|
*
|
|
* Permission to use, copy, modify, and/or distribute this software for any
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
* copyright notice and this permission notice appear in all copies.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
*
|
|
*/
|
|
|
|
#include <algorithm>
|
|
#include <boost/optional.hpp>
|
|
#include <iterator>
|
|
#include <queue>
|
|
#include <unordered_set>
|
|
#include "chain_utils.h"
|
|
#include "design_utils.h"
|
|
#include "log.h"
|
|
#include "nextpnr.h"
|
|
#include "ng_ultra.h"
|
|
|
|
#ifndef NG_ULTRA_PACK_H
|
|
#define NG_ULTRA_PACK_H
|
|
|
|
NEXTPNR_NAMESPACE_BEGIN
|
|
|
|
struct NgUltraPacker
|
|
{
|
|
NgUltraPacker(Context *ctx, NgUltraImpl *uarch) : ctx(ctx), uarch(uarch) { h.init(ctx); };
|
|
|
|
void remove_not_used();
|
|
// Constants
|
|
void pack_constants();
|
|
void remove_constants();
|
|
|
|
// LUTs & FFs
|
|
void update_lut_init();
|
|
void update_dffs();
|
|
void pack_xluts();
|
|
void pack_lut_multi_dffs();
|
|
void pack_dff_chains();
|
|
void pack_lut_dffs();
|
|
void pack_dffs();
|
|
void pack_cys();
|
|
void pack_rfs();
|
|
void pack_cdcs();
|
|
void pack_fifos();
|
|
|
|
void pack_rams();
|
|
void pack_dsps();
|
|
|
|
// IO
|
|
void pack_iobs();
|
|
void pack_ioms();
|
|
|
|
void pack_gcks();
|
|
void pack_plls();
|
|
void pack_wfgs();
|
|
void pre_place();
|
|
|
|
void insert_ioms();
|
|
void insert_wfbs();
|
|
|
|
// Post placement
|
|
void duplicate_gck();
|
|
void insert_bypass_gck();
|
|
void insert_csc();
|
|
|
|
/* clang-format off */
|
|
TESTABLE_PRIVATE:
|
|
void set_lut_input_if_constant(CellInfo *cell, IdString input);
|
|
/* clang-format on */
|
|
void lut_to_fe(CellInfo *lut, CellInfo *fe, bool no_dff, Property lut_table);
|
|
void dff_to_fe(CellInfo *dff, CellInfo *fe, bool pass_thru_lut);
|
|
void dff_rewrite(CellInfo *cell);
|
|
void ddfr_rewrite(CellInfo *cell);
|
|
|
|
void exchange_if_constant(CellInfo *cell, IdString input1, IdString input2);
|
|
void pack_cy_input_and_output(CellInfo *cy, IdString cluster, IdString in_port, IdString out_port, int placer,
|
|
int &lut_only, int &lut_and_ff, int &dff_only);
|
|
|
|
void pack_xrf_input_and_output(CellInfo *cy, IdString cluster, IdString in_port, IdString out_port,
|
|
ClusterPlacement placement, int &lut_only, int &lut_and_ff, int &dff_only);
|
|
|
|
void connect_gnd_if_unconnected(CellInfo *cell, IdString input, bool warn);
|
|
void disconnect_if_gnd(CellInfo *cell, IdString input);
|
|
|
|
void insert_wfb(CellInfo *cell, IdString port);
|
|
|
|
void mandatory_param(CellInfo *cell, IdString param);
|
|
void disconnect_unused(CellInfo *cell, IdString port);
|
|
void bind_attr_loc(CellInfo *cell, dict<IdString, Property> *attrs);
|
|
BelId get_available_gck(int lobe, NetInfo *si1, NetInfo *si2);
|
|
BelId getCSC(Loc l, int row);
|
|
// General helper functions
|
|
void flush_cells();
|
|
|
|
IdString assign_wfg(IdString ckg, IdString ckg2, CellInfo *cell);
|
|
void dsp_same_driver(IdString port, CellInfo *cell, CellInfo **target);
|
|
void dsp_same_sink(IdString port, CellInfo *cell, CellInfo **target);
|
|
|
|
int make_init_with_const_input(int init, int input, bool value);
|
|
|
|
int memory_width(int config, bool ecc);
|
|
int memory_addr_bits(int config, bool ecc);
|
|
|
|
void constrain_location(CellInfo *cell);
|
|
void extract_lowskew_signals(CellInfo *cell, dict<IdString, dict<IdString, std::vector<PortRef>>> &lowskew_signals);
|
|
// Cell creating
|
|
CellInfo *create_cell_ptr(IdString type, IdString name);
|
|
|
|
Context *ctx;
|
|
NgUltraImpl *uarch;
|
|
|
|
pool<IdString> packed_cells;
|
|
pool<IdString> global_lowskew;
|
|
|
|
HimbaechelHelpers h;
|
|
};
|
|
|
|
NEXTPNR_NAMESPACE_END
|
|
#endif
|