2024-05-03 16:30:31 +08:00
|
|
|
/*
|
|
|
|
* nextpnr -- Next Generation Place and Route
|
|
|
|
*
|
|
|
|
* Copyright (C) 2023 gatecat <gatecat@ds0.me>
|
|
|
|
* Copyright (C) 2023 Miodrag Milanovic <micko@yosyshq.com>
|
|
|
|
*
|
|
|
|
* 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); };
|
|
|
|
|
|
|
|
// Constants
|
|
|
|
void pack_constants();
|
|
|
|
void remove_constants();
|
|
|
|
|
|
|
|
// LUTs & FFs
|
|
|
|
void update_lut_init();
|
|
|
|
void update_dffs();
|
|
|
|
void pack_lut_dffs();
|
|
|
|
void pack_dffs();
|
|
|
|
void pack_cys();
|
2024-05-14 22:45:22 +08:00
|
|
|
void pack_rfs();
|
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-07 18:29:40 +08:00
|
|
|
void insert_ioms();
|
2024-05-10 00:41:21 +08:00
|
|
|
|
2024-05-27 18:57:22 +08:00
|
|
|
void setup();
|
|
|
|
|
2024-05-03 16:30:31 +08:00
|
|
|
private:
|
|
|
|
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);
|
|
|
|
|
|
|
|
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-05-03 16:30:31 +08:00
|
|
|
// General helper functions
|
|
|
|
void flush_cells();
|
|
|
|
|
2024-06-12 16:23:31 +08:00
|
|
|
void constrain_location(CellInfo *cell);
|
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-05-27 18:57:22 +08:00
|
|
|
dict<IdString,pool<IdString>> clock_sinks;
|
2024-05-03 16:30:31 +08:00
|
|
|
|
|
|
|
HimbaechelHelpers h;
|
|
|
|
};
|
|
|
|
|
|
|
|
NEXTPNR_NAMESPACE_END
|
|
|
|
#endif
|