diff options
-rwxr-xr-x | .cirrus/archcheck.sh | 1 | ||||
-rw-r--r-- | common/command.cc | 28 | ||||
-rw-r--r-- | common/placer_heap.cc | 8 | ||||
-rw-r--r-- | gowin/arch.cc | 28 | ||||
-rw-r--r-- | gowin/arch.h | 6 |
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> |