diff options
author | gatecat <gatecat@ds0.me> | 2022-04-08 14:32:33 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-08 14:32:33 +0100 |
commit | 57681e69ce75c781142908cf128bc3f3f59e2f6b (patch) | |
tree | ea642e20bc07441a800944390e1f904e6ce5b113 /common/kernel/design_utils.h | |
parent | e42e22575f20b59634f88b5cf694efdb413ff0a0 (diff) | |
parent | 49f178ed94b5fad00d25dbd12adea0bf4732f803 (diff) | |
download | nextpnr-57681e69ce75c781142908cf128bc3f3f59e2f6b.tar.gz nextpnr-57681e69ce75c781142908cf128bc3f3f59e2f6b.tar.bz2 nextpnr-57681e69ce75c781142908cf128bc3f3f59e2f6b.zip |
Merge pull request #973 from YosysHQ/gatecat/folder-tidy
Split up common into kernel,place,route
Diffstat (limited to 'common/kernel/design_utils.h')
-rw-r--r-- | common/kernel/design_utils.h | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/common/kernel/design_utils.h b/common/kernel/design_utils.h new file mode 100644 index 00000000..069600b5 --- /dev/null +++ b/common/kernel/design_utils.h @@ -0,0 +1,100 @@ +/* + * nextpnr -- Next Generation Place and Route + * + * Copyright (C) 2018 Claire Xenia Wolf <claire@yosyshq.com> + * Copyright (C) 2018 gatecat <gatecat@ds0.me> + * + * 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 "nextpnr.h" + +#ifndef DESIGN_UTILS_H +#define DESIGN_UTILS_H + +#include <algorithm> + +NEXTPNR_NAMESPACE_BEGIN + +/* +Utilities for design manipulation, intended for use inside packing algorithms + */ + +// Disconnect a net (if connected) from old, and connect it to rep +void replace_port(CellInfo *old_cell, IdString old_name, CellInfo *rep_cell, IdString rep_name); + +// If a net drives a given port of a cell matching a predicate (in many +// cases more than one cell type, e.g. SB_DFFxx so a predicate is used), return +// the first instance of that cell (otherwise nullptr). If exclusive is set to +// true, then this cell must be the only load. If ignore_cell is set, that cell +// is not considered +template <typename F1> +CellInfo *net_only_drives(const Context *ctx, NetInfo *net, F1 cell_pred, IdString port, bool exclusive = false, + CellInfo *exclude = nullptr) +{ + if (net == nullptr) + return nullptr; + if (exclusive) { + if (exclude == nullptr) { + if (net->users.entries() != 1) + return nullptr; + } else { + if (net->users.entries() > 2) { + return nullptr; + } else if (net->users.entries() == 2) { + bool found = false; + for (auto &usr : net->users) { + if (usr.cell == exclude) + found = true; + } + if (!found) + return nullptr; + } + } + } + for (const auto &load : net->users) { + if (load.cell != exclude && cell_pred(ctx, load.cell) && load.port == port) { + return load.cell; + } + } + return nullptr; +} + +// If a net is driven by a given port of a cell matching a predicate, return +// that cell, otherwise nullptr +template <typename F1> CellInfo *net_driven_by(const Context *ctx, const NetInfo *net, F1 cell_pred, IdString port) +{ + if (net == nullptr) + return nullptr; + if (net->driver.cell == nullptr) + return nullptr; + if (cell_pred(ctx, net->driver.cell) && net->driver.port == port) { + return net->driver.cell; + } else { + return nullptr; + } +} + +// Check if a port is used +inline bool port_used(CellInfo *cell, IdString port_name) +{ + auto port_fnd = cell->ports.find(port_name); + return port_fnd != cell->ports.end() && port_fnd->second.net != nullptr; +} + +void print_utilisation(const Context *ctx); + +NEXTPNR_NAMESPACE_END + +#endif |