mirror of
https://github.com/YosysHQ/nextpnr.git
synced 2026-04-25 03:44:35 +00:00
Merge remote-tracking branch 'origin/master' into placer_speedup
This commit is contained in:
@@ -75,7 +75,7 @@ void archcheck_locs(const Context *ctx)
|
||||
log_assert(0 <= loc.z);
|
||||
log_assert(loc.x < ctx->getGridDimX());
|
||||
log_assert(loc.y < ctx->getGridDimY());
|
||||
log_assert(loc.z < ctx->getTileDimZ(loc.x, loc.y));
|
||||
log_assert(loc.z < ctx->getTileBelDimZ(loc.x, loc.y));
|
||||
|
||||
BelId bel2 = ctx->getBelByLocation(loc);
|
||||
dbg(" ... %s\n", ctx->getBelName(bel2).c_str(ctx));
|
||||
@@ -88,7 +88,7 @@ void archcheck_locs(const Context *ctx)
|
||||
dbg("> %d %d\n", x, y);
|
||||
std::unordered_set<int> usedz;
|
||||
|
||||
for (int z = 0; z < ctx->getTileDimZ(x, y); z++) {
|
||||
for (int z = 0; z < ctx->getTileBelDimZ(x, y); z++) {
|
||||
BelId bel = ctx->getBelByLocation(Loc(x, y, z));
|
||||
if (bel == BelId())
|
||||
continue;
|
||||
|
||||
@@ -84,6 +84,7 @@ po::options_description CommandHandler::getGeneralOptions()
|
||||
po::options_description general("General options");
|
||||
general.add_options()("help,h", "show help");
|
||||
general.add_options()("verbose,v", "verbose output");
|
||||
general.add_options()("quiet,q", "quiet mode, only errors displayed");
|
||||
general.add_options()("debug", "debug output");
|
||||
general.add_options()("force,f", "keep running after errors");
|
||||
#ifndef NO_GUI
|
||||
@@ -119,6 +120,10 @@ void CommandHandler::setupContext(Context *ctx)
|
||||
ctx->debug = true;
|
||||
}
|
||||
|
||||
if (vm.count("quiet")) {
|
||||
log_quiet_warnings = true;
|
||||
}
|
||||
|
||||
if (vm.count("force")) {
|
||||
ctx->force = true;
|
||||
}
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
|
||||
NEXTPNR_NAMESPACE_BEGIN
|
||||
|
||||
NPNR_NORETURN void logv_error(const char *format, va_list ap) NPNR_ATTRIBUTE(noreturn);
|
||||
|
||||
std::vector<FILE *> log_files;
|
||||
std::vector<std::ostream *> log_streams;
|
||||
FILE *log_errfile = NULL;
|
||||
@@ -38,7 +40,6 @@ log_write_type log_write_function = nullptr;
|
||||
bool log_error_stderr = false;
|
||||
bool log_cmd_error_throw = false;
|
||||
bool log_quiet_warnings = false;
|
||||
int log_verbose_level;
|
||||
std::string log_last_error;
|
||||
void (*log_error_atexit)() = NULL;
|
||||
|
||||
@@ -80,7 +81,7 @@ void logv(const char *format, va_list ap)
|
||||
//
|
||||
// Trim newlines from the beginning
|
||||
while (format[0] == '\n' && format[1] != 0) {
|
||||
log("\n");
|
||||
log_always("\n");
|
||||
format++;
|
||||
}
|
||||
|
||||
@@ -108,7 +109,7 @@ void logv_info(const char *format, va_list ap)
|
||||
{
|
||||
std::string message = vstringf(format, ap);
|
||||
|
||||
log("Info: %s", message.c_str());
|
||||
log_always("Info: %s", message.c_str());
|
||||
log_flush();
|
||||
}
|
||||
|
||||
@@ -116,7 +117,7 @@ void logv_warning(const char *format, va_list ap)
|
||||
{
|
||||
std::string message = vstringf(format, ap);
|
||||
|
||||
log("Warning: %s", message.c_str());
|
||||
log_always("Warning: %s", message.c_str());
|
||||
log_flush();
|
||||
}
|
||||
|
||||
@@ -124,7 +125,7 @@ void logv_warning_noprefix(const char *format, va_list ap)
|
||||
{
|
||||
std::string message = vstringf(format, ap);
|
||||
|
||||
log("%s", message.c_str());
|
||||
log_always("%s", message.c_str());
|
||||
}
|
||||
|
||||
void logv_error(const char *format, va_list ap)
|
||||
@@ -142,7 +143,7 @@ void logv_error(const char *format, va_list ap)
|
||||
f = stderr;
|
||||
|
||||
log_last_error = vstringf(format, ap);
|
||||
log("ERROR: %s", log_last_error.c_str());
|
||||
log_always("ERROR: %s", log_last_error.c_str());
|
||||
log_flush();
|
||||
|
||||
if (log_error_atexit)
|
||||
@@ -154,8 +155,17 @@ void logv_error(const char *format, va_list ap)
|
||||
throw log_execution_error_exception();
|
||||
}
|
||||
|
||||
void log_always(const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
logv(format, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void log(const char *format, ...)
|
||||
{
|
||||
if (log_quiet_warnings) return;
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
logv(format, ap);
|
||||
@@ -164,6 +174,7 @@ void log(const char *format, ...)
|
||||
|
||||
void log_info(const char *format, ...)
|
||||
{
|
||||
if (log_quiet_warnings) return;
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
logv_info(format, ap);
|
||||
@@ -172,6 +183,7 @@ void log_info(const char *format, ...)
|
||||
|
||||
void log_warning(const char *format, ...)
|
||||
{
|
||||
if (log_quiet_warnings) return;
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
logv_warning(format, ap);
|
||||
@@ -180,6 +192,7 @@ void log_warning(const char *format, ...)
|
||||
|
||||
void log_warning_noprefix(const char *format, ...)
|
||||
{
|
||||
if (log_quiet_warnings) return;
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
logv_warning_noprefix(format, ap);
|
||||
@@ -200,7 +213,7 @@ void log_cmd_error(const char *format, ...)
|
||||
|
||||
if (log_cmd_error_throw) {
|
||||
log_last_error = vstringf(format, ap);
|
||||
log("ERROR: %s", log_last_error.c_str());
|
||||
log_always("ERROR: %s", log_last_error.c_str());
|
||||
log_flush();
|
||||
throw log_cmd_error_exception();
|
||||
}
|
||||
@@ -210,10 +223,11 @@ void log_cmd_error(const char *format, ...)
|
||||
|
||||
void log_break()
|
||||
{
|
||||
if (log_quiet_warnings) return;
|
||||
if (log_newline_count < 2)
|
||||
log("\n");
|
||||
log_always("\n");
|
||||
if (log_newline_count < 2)
|
||||
log("\n");
|
||||
log_always("\n");
|
||||
}
|
||||
|
||||
void log_flush()
|
||||
|
||||
@@ -48,18 +48,12 @@ extern FILE *log_errfile;
|
||||
extern log_write_type log_write_function;
|
||||
|
||||
extern bool log_quiet_warnings;
|
||||
extern int log_verbose_level;
|
||||
extern std::string log_last_error;
|
||||
extern void (*log_error_atexit)();
|
||||
|
||||
void logv(const char *format, va_list ap);
|
||||
void logv_warning(const char *format, va_list ap);
|
||||
void logv_warning_noprefix(const char *format, va_list ap);
|
||||
NPNR_NORETURN void logv_error(const char *format, va_list ap) NPNR_ATTRIBUTE(noreturn);
|
||||
|
||||
extern std::ostream clog;
|
||||
void log(const char *format, ...) NPNR_ATTRIBUTE(format(printf, 1, 2));
|
||||
void log_header(const char *format, ...) NPNR_ATTRIBUTE(format(printf, 1, 2));
|
||||
void log_always(const char *format, ...) NPNR_ATTRIBUTE(format(printf, 1, 2));
|
||||
void log_info(const char *format, ...) NPNR_ATTRIBUTE(format(printf, 1, 2));
|
||||
void log_warning(const char *format, ...) NPNR_ATTRIBUTE(format(printf, 1, 2));
|
||||
void log_warning_noprefix(const char *format, ...) NPNR_ATTRIBUTE(format(printf, 1, 2));
|
||||
|
||||
@@ -216,6 +216,19 @@ struct BelPin
|
||||
|
||||
struct CellInfo;
|
||||
|
||||
struct Region
|
||||
{
|
||||
IdString name;
|
||||
|
||||
bool constr_bels = false;
|
||||
bool constr_wires = false;
|
||||
bool constr_pips = false;
|
||||
|
||||
std::unordered_set<BelId> bels;
|
||||
std::unordered_set<WireId> wires;
|
||||
std::unordered_set<Loc> piplocs;
|
||||
};
|
||||
|
||||
enum PlaceStrength
|
||||
{
|
||||
STRENGTH_NONE = 0,
|
||||
@@ -250,6 +263,8 @@ struct NetInfo : ArchNetInfo
|
||||
|
||||
// wire -> uphill_pip
|
||||
std::unordered_map<WireId, PipMap> wires;
|
||||
|
||||
Region *region = nullptr;
|
||||
};
|
||||
|
||||
enum PortType
|
||||
@@ -289,6 +304,8 @@ struct CellInfo : ArchCellInfo
|
||||
int constr_z = UNCONSTR; // this.z - parent.z
|
||||
bool constr_abs_z = false; // parent.z := 0
|
||||
// parent.[xyz] := 0 when (constr_parent == nullptr)
|
||||
|
||||
Region *region = nullptr;
|
||||
};
|
||||
|
||||
enum TimingPortClass
|
||||
@@ -391,6 +408,9 @@ struct BaseCtx
|
||||
std::unordered_map<IdString, std::unique_ptr<NetInfo>> nets;
|
||||
std::unordered_map<IdString, std::unique_ptr<CellInfo>> cells;
|
||||
|
||||
// Floorplanning regions
|
||||
std::unordered_map<IdString, std::unique_ptr<Region>> region;
|
||||
|
||||
BaseCtx()
|
||||
{
|
||||
idstring_str_to_idx = new std::unordered_map<std::string, int>;
|
||||
|
||||
@@ -251,7 +251,7 @@ class ConstraintLegaliseWorker
|
||||
ySearch = IncreasingDiameterSearch(loc.y + child->constr_y);
|
||||
}
|
||||
if (child->constr_z == child->UNCONSTR) {
|
||||
zSearch = IncreasingDiameterSearch(loc.z, 0, ctx->getTileDimZ(loc.x, loc.y));
|
||||
zSearch = IncreasingDiameterSearch(loc.z, 0, ctx->getTileBelDimZ(loc.x, loc.y));
|
||||
} else {
|
||||
if (child->constr_abs_z) {
|
||||
zSearch = IncreasingDiameterSearch(child->constr_z);
|
||||
@@ -329,7 +329,7 @@ class ConstraintLegaliseWorker
|
||||
yRootSearch = IncreasingDiameterSearch(cell->constr_y);
|
||||
|
||||
if (cell->constr_z == cell->UNCONSTR)
|
||||
zRootSearch = IncreasingDiameterSearch(currentLoc.z, 0, ctx->getTileDimZ(currentLoc.x, currentLoc.y));
|
||||
zRootSearch = IncreasingDiameterSearch(currentLoc.z, 0, ctx->getTileBelDimZ(currentLoc.x, currentLoc.y));
|
||||
else
|
||||
zRootSearch = IncreasingDiameterSearch(cell->constr_z);
|
||||
while (!xRootSearch.done()) {
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "timing.h"
|
||||
#include <algorithm>
|
||||
#include <boost/range/adaptor/reversed.hpp>
|
||||
#include <deque>
|
||||
#include <unordered_map>
|
||||
#include <utility>
|
||||
#include "log.h"
|
||||
|
||||
Reference in New Issue
Block a user