aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-x.cirrus/archcheck.sh1
-rw-r--r--common/command.cc28
-rw-r--r--common/placer_heap.cc8
-rw-r--r--gowin/arch.cc28
-rw-r--r--gowin/arch.h6
5 files changed, 53 insertions, 18 deletions
diff --git a/.cirrus/archcheck.sh b/.cirrus/archcheck.sh
index 35f115d0..6ff6c043 100755
--- a/.cirrus/archcheck.sh
+++ b/.cirrus/archcheck.sh
@@ -5,3 +5,4 @@ ${BUILD_DIR}/nextpnr-ice40 --hx8k --package ct256 --test
${BUILD_DIR}/nextpnr-ice40 --up5k --package sg48 --test
${BUILD_DIR}/nextpnr-ecp5 --um5g-25k --package CABGA381 --test
${BUILD_DIR}/nextpnr-nexus --device LIFCL-40-9BG400CES --test
+${BUILD_DIR}/nextpnr-gowin --device GW1N-UV4LQ144C6/I5 --test
diff --git a/common/command.cc b/common/command.cc
index d3e8af8d..2303ad91 100644
--- a/common/command.cc
+++ b/common/command.cc
@@ -161,6 +161,11 @@ po::options_description CommandHandler::getGeneralOptions()
general.add_options()("no-print-critical-path-source",
"disable printing of the line numbers associated with each net in the critical path");
+ general.add_options()("placer-heap-alpha", po::value<float>(), "placer heap alpha value (float, default: 0.1)");
+ general.add_options()("placer-heap-beta", po::value<float>(), "placer heap beta value (float, default: 0.9)");
+ general.add_options()("placer-heap-critexp", po::value<int>(), "placer heap criticality exponent (int, default: 2)");
+ general.add_options()("placer-heap-timingweight", po::value<int>(), "placer heap timing weight (int, default: 10)");
+
general.add_options()("placed-svg", po::value<std::string>(), "write render of placement to SVG file");
general.add_options()("routed-svg", po::value<std::string>(), "write render of routing to SVG file");
@@ -258,6 +263,18 @@ void CommandHandler::setupContext(Context *ctx)
if (vm.count("no-tmdriv"))
ctx->settings[ctx->id("timing_driven")] = false;
+ if (vm.count("placer-heap-alpha"))
+ ctx->settings[ctx->id("placerHeap/alpha")] = std::to_string(vm["placer-heap-alpha"].as<float>());
+
+ if (vm.count("placer-heap-beta"))
+ ctx->settings[ctx->id("placerHeap/beta")] = std::to_string(vm["placer-heap-beta"].as<float>());
+
+ if (vm.count("placer-heap-critexp"))
+ ctx->settings[ctx->id("placerHeap/criticalityExponent")] = std::to_string(vm["placer-heap-critexp"].as<int>());
+
+ if (vm.count("placer-heap-timingweight"))
+ ctx->settings[ctx->id("placerHeap/timingWeight")] = std::to_string(vm["placer-heap-timingweight"].as<int>());
+
// Setting default values
if (ctx->settings.find(ctx->id("target_freq")) == ctx->settings.end())
ctx->settings[ctx->id("target_freq")] = std::to_string(12e6);
@@ -275,6 +292,15 @@ void CommandHandler::setupContext(Context *ctx)
ctx->settings[ctx->id("arch.name")] = std::string(ctx->archId().c_str(ctx));
ctx->settings[ctx->id("arch.type")] = std::string(ctx->archArgsToId(ctx->archArgs()).c_str(ctx));
ctx->settings[ctx->id("seed")] = ctx->rngstate;
+
+ if (ctx->settings.find(ctx->id("placerHeap/alpha")) == ctx->settings.end())
+ ctx->settings[ctx->id("placerHeap/alpha")] = std::to_string(0.1);
+ if (ctx->settings.find(ctx->id("placerHeap/beta")) == ctx->settings.end())
+ ctx->settings[ctx->id("placerHeap/beta")] = std::to_string(0.9);
+ if (ctx->settings.find(ctx->id("placerHeap/criticalityExponent")) == ctx->settings.end())
+ ctx->settings[ctx->id("placerHeap/criticalityExponent")] = std::to_string(2);
+ if (ctx->settings.find(ctx->id("placerHeap/timingWeight")) == ctx->settings.end())
+ ctx->settings[ctx->id("placerHeap/timingWeight")] = std::to_string(10);
}
int CommandHandler::executeMain(std::unique_ptr<Context> ctx)
@@ -421,6 +447,8 @@ int CommandHandler::exec()
setupArchContext(ctx.get());
int rc = executeMain(std::move(ctx));
printFooter();
+ log_break();
+ log_info("Program finished normally.\n");
return rc;
} catch (log_execution_error_exception) {
printFooter();
diff --git a/common/placer_heap.cc b/common/placer_heap.cc
index 7d529401..92caaf09 100644
--- a/common/placer_heap.cc
+++ b/common/placer_heap.cc
@@ -1764,10 +1764,10 @@ bool placer_heap(Context *ctx, PlacerHeapCfg cfg) { return HeAPPlacer(ctx, cfg).
PlacerHeapCfg::PlacerHeapCfg(Context *ctx)
{
- alpha = ctx->setting<float>("placerHeap/alpha", 0.1);
- beta = ctx->setting<float>("placerHeap/beta", 0.9);
- criticalityExponent = ctx->setting<int>("placerHeap/criticalityExponent", 2);
- timingWeight = ctx->setting<int>("placerHeap/timingWeight", 10);
+ alpha = ctx->setting<float>("placerHeap/alpha");
+ beta = ctx->setting<float>("placerHeap/beta");
+ criticalityExponent = ctx->setting<int>("placerHeap/criticalityExponent");
+ timingWeight = ctx->setting<int>("placerHeap/timingWeight");
timing_driven = ctx->setting<bool>("timing_driven");
solverTolerance = 1e-5;
placeAllAtOnce = false;
diff --git a/gowin/arch.cc b/gowin/arch.cc
index 58df773c..b817dae0 100644
--- a/gowin/arch.cc
+++ b/gowin/arch.cc
@@ -89,6 +89,16 @@ void Arch::addPip(IdString name, IdString type, IdString srcWire, IdString dstWi
if (int(tilePipDimZ[loc.x].size()) <= loc.y)
tilePipDimZ[loc.x].resize(loc.y + 1);
+ // Needed to ensure empty tile bel locations
+ if (int(bels_by_tile.size()) <= loc.x)
+ bels_by_tile.resize(loc.x + 1);
+ if (int(bels_by_tile[loc.x].size()) <= loc.y)
+ bels_by_tile[loc.x].resize(loc.y + 1);
+ if (int(tileBelDimZ.size()) <= loc.x)
+ tileBelDimZ.resize(loc.x + 1);
+ if (int(tileBelDimZ[loc.x].size()) <= loc.y)
+ tileBelDimZ[loc.x].resize(loc.y + 1);
+
gridDimX = std::max(gridDimX, loc.x + 1);
gridDimY = std::max(gridDimY, loc.y + 1);
tilePipDimZ[loc.x][loc.y] = std::max(tilePipDimZ[loc.x][loc.y], loc.z + 1);
@@ -124,7 +134,7 @@ void Arch::addBel(IdString name, IdString type, Loc loc, bool gb)
tileBelDimZ[loc.x].resize(loc.y + 1);
gridDimX = std::max(gridDimX, loc.x + 1);
- gridDimY = std::max(gridDimY, loc.x + 1);
+ gridDimY = std::max(gridDimY, loc.y + 1);
tileBelDimZ[loc.x][loc.y] = std::max(tileBelDimZ[loc.x][loc.y], loc.z + 1);
}
@@ -589,14 +599,14 @@ Arch::Arch(ArchArgs args) : args(args)
const PairPOD pip = pips[p][j];
int destrow = row;
int destcol = col;
- IdString destid(pip.dest_id);
- IdString gdestname = wireToGlobal(destrow, destcol, db, destid);
+ IdString destid(pip.dest_id), gdestid(pip.dest_id);
+ IdString gdestname = wireToGlobal(destrow, destcol, db, gdestid);
if (wires.count(gdestname) == 0)
addWire(gdestname, destid, destcol, destrow);
int srcrow = row;
int srccol = col;
- IdString srcid(pip.src_id);
- IdString gsrcname = wireToGlobal(srcrow, srccol, db, srcid);
+ IdString srcid(pip.src_id), gsrcid(pip.src_id);
+ IdString gsrcname = wireToGlobal(srcrow, srccol, db, gsrcid);
if (wires.count(gsrcname) == 0)
addWire(gsrcname, srcid, srccol, srcrow);
}
@@ -701,12 +711,12 @@ Arch::Arch(ArchArgs args) : args(args)
const PairPOD pip = pips[p][j];
int destrow = row;
int destcol = col;
- IdString destid(pip.dest_id);
- IdString gdestname = wireToGlobal(destrow, destcol, db, destid);
+ IdString destid(pip.dest_id), gdestid(pip.dest_id);
+ IdString gdestname = wireToGlobal(destrow, destcol, db, gdestid);
int srcrow = row;
int srccol = col;
- IdString srcid(pip.src_id);
- IdString gsrcname = wireToGlobal(srcrow, srccol, db, srcid);
+ IdString srcid(pip.src_id), gsrcid(pip.src_id);
+ IdString gsrcname = wireToGlobal(srcrow, srccol, db, gsrcid);
snprintf(buf, 32, "R%dC%d_%s_%s", row + 1, col + 1, srcid.c_str(this), destid.c_str(this));
IdString pipname = id(buf);
diff --git a/gowin/arch.h b/gowin/arch.h
index 3a1b2534..cdc011aa 100644
--- a/gowin/arch.h
+++ b/gowin/arch.h
@@ -243,7 +243,7 @@ struct CellTiming
std::unordered_map<IdString, std::vector<TimingClockingInfo>> clockingInfo;
};
-struct ArchRanges
+struct ArchRanges : BaseArchRanges
{
using ArchArgsT = ArchArgs;
// Bels
@@ -269,10 +269,6 @@ struct ArchRanges
using GroupGroupsRangeT = const std::vector<GroupId> &;
// Decals
using DecalGfxRangeT = const std::vector<GraphicElement> &;
- // Placement validity
- using CellTypeRangeT = std::vector<IdString>;
- using BelBucketRangeT = std::vector<BelBucketId>;
- using BucketBelRangeT = std::vector<BelId>;
};
struct Arch : BaseArch<ArchRanges>