nextpnr/himbaechel/uarch/ng-ultra/pack.h

120 lines
3.4 KiB
C
Raw Normal View History

2024-05-03 16:30:31 +08:00
/*
* nextpnr -- Next Generation Place and Route
*
2024-09-24 18:31:10 +08:00
* NG-Ultra Architecture Implementation
2024-05-03 16:30:31 +08:00
*
2024-09-24 18:31:10 +08:00
* Copyright (C) 2024 YosysHQ GmbH
2024-05-03 16:30:31 +08:00
*
*/
#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); };
2024-06-24 00:15:42 +08:00
void remove_not_used();
2024-05-03 16:30:31 +08:00
// Constants
void pack_constants();
void remove_constants();
// LUTs & FFs
void update_lut_init();
void update_dffs();
2024-06-25 16:04:10 +08:00
void pack_xluts();
2024-08-07 18:20:34 +08:00
void pack_lut_multi_dffs();
2024-08-08 15:47:05 +08:00
void pack_dff_chains();
2024-05-03 16:30:31 +08:00
void pack_lut_dffs();
void pack_dffs();
void pack_cys();
2024-05-14 22:45:22 +08:00
void pack_rfs();
2024-06-24 00:15:42 +08:00
void pack_cdcs();
void pack_fifos();
2024-05-03 16:30:31 +08:00
2024-05-16 17:35:28 +08:00
void pack_rams();
2024-06-18 18:49:20 +08:00
void pack_dsps();
2024-05-16 17:35:28 +08:00
2024-05-03 16:30:31 +08:00
// IO
void pack_iobs();
void pack_ioms();
2024-06-06 15:41:43 +08:00
void pack_gcks();
void pack_plls();
void pack_wfgs();
2024-06-19 20:51:51 +08:00
void pre_place();
2024-06-06 15:41:43 +08:00
2024-06-07 18:29:40 +08:00
void insert_ioms();
2024-06-19 20:51:51 +08:00
void insert_wfbs();
2024-05-10 00:41:21 +08:00
2024-06-19 00:11:26 +08:00
// Post placement
void duplicate_gck();
void insert_bypass_gck();
2024-08-21 22:32:35 +08:00
void insert_csc();
2024-06-19 00:11:26 +08:00
2024-07-08 15:10:32 +08:00
TESTABLE_PRIVATE:
2024-05-03 16:30:31 +08:00
void set_lut_input_if_constant(CellInfo *cell, IdString input);
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);
2024-07-03 15:30:36 +08:00
void dff_rewrite(CellInfo *cell);
2024-07-18 18:16:26 +08:00
void ddfr_rewrite(CellInfo *cell);
2024-05-03 16:30:31 +08:00
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);
2024-05-27 18:24:21 +08:00
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);
2024-05-14 22:45:22 +08:00
2024-06-10 23:59:49 +08:00
void connect_gnd_if_unconnected(CellInfo *cell, IdString input, bool warn);
2024-05-16 17:35:28 +08:00
void disconnect_if_gnd(CellInfo *cell, IdString input);
2024-06-07 18:29:40 +08:00
void insert_wfb(CellInfo *cell, IdString port);
2024-06-04 23:40:34 +08:00
void mandatory_param(CellInfo *cell, IdString param);
2024-06-05 17:50:42 +08:00
void disconnect_unused(CellInfo *cell, IdString port);
2024-06-14 13:58:42 +08:00
void bind_attr_loc(CellInfo *cell, dict<IdString, Property> *attrs);
2024-06-27 16:40:13 +08:00
BelId get_available_gck(int lobe, NetInfo *si1, NetInfo *si2);
2024-08-22 15:41:11 +08:00
BelId getCSC(Loc l, int row);
2024-05-03 16:30:31 +08:00
// General helper functions
void flush_cells();
2024-06-20 16:06:05 +08:00
IdString assign_wfg(IdString ckg, IdString ckg2, CellInfo *cell);
2024-06-20 16:29:22 +08:00
void dsp_same_driver(IdString port, CellInfo *cell, CellInfo **target);
void dsp_same_sink(IdString port, CellInfo *cell, CellInfo **target);
2024-06-20 16:06:05 +08:00
2024-07-08 15:10:32 +08:00
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);
2024-06-12 16:23:31 +08:00
void constrain_location(CellInfo *cell);
2024-08-21 22:32:35 +08:00
void extract_lowskew_signals(CellInfo *cell, dict<IdString,dict<IdString,std::vector<PortRef>>> &lowskew_signals);
2024-05-03 16:30:31 +08:00
// Cell creating
std::unique_ptr<CellInfo> create_cell(IdString type, IdString name);
CellInfo *create_cell_ptr(IdString type, IdString name);
Context *ctx;
NgUltraImpl *uarch;
pool<IdString> packed_cells;
std::vector<std::unique_ptr<CellInfo>> new_cells;
2024-08-21 22:32:35 +08:00
pool<IdString> global_lowskew;
2024-06-27 18:20:32 +08:00
2024-05-03 16:30:31 +08:00
HimbaechelHelpers h;
};
NEXTPNR_NAMESPACE_END
#endif