Merge branch 'master' of https://github.com/YosysHQ/prjtrellis into facade
diff --git a/.github/archlinux/PKGBUILD b/.github/archlinux/PKGBUILD
index d55c6f0..f94e14b 100644
--- a/.github/archlinux/PKGBUILD
+++ b/.github/archlinux/PKGBUILD
@@ -8,7 +8,7 @@
pkgrel=1
pkgdesc='Documentation and definitions for the Lattice ECP5 bit-stream format'
arch=('x86_64')
-url='https://github.com/SymbiFlow/prjtrellis'
+url='https://github.com/YosysHQ/prjtrellis'
license=('custom:ISC' 'MIT')
depends=('boost-libs' "$_pkgname-db")
makedepends=('git' 'cmake' 'boost' 'python-sphinx' 'python-sphinx_rtd_theme' 'python-recommonmark')
diff --git a/libtrellis/include/ChipConfig.hpp b/libtrellis/include/ChipConfig.hpp
index 59efe84..40973ed 100644
--- a/libtrellis/include/ChipConfig.hpp
+++ b/libtrellis/include/ChipConfig.hpp
@@ -28,6 +28,7 @@
vector<string> metadata;
map<string, TileConfig> tiles;
vector<TileGroup> tilegroups;
+ map<string, string> sysconfig;
// Block RAM initialisation (WIP)
map<uint16_t, vector<uint16_t>> bram_data;
diff --git a/libtrellis/include/RoutingGraph.hpp b/libtrellis/include/RoutingGraph.hpp
index be23e77..f1c7f1e 100644
--- a/libtrellis/include/RoutingGraph.hpp
+++ b/libtrellis/include/RoutingGraph.hpp
@@ -26,9 +26,6 @@
Location(int16_t x, int16_t y) : x(x), y(y)
{};
- Location(const Location &loc) : x(loc.x), y(loc.y)
- {};
-
bool operator==(const Location &other) const
{ return x == other.x && y == other.y; }
diff --git a/libtrellis/src/ChipConfig.cpp b/libtrellis/src/ChipConfig.cpp
index 0ffdf82..7472bcb 100644
--- a/libtrellis/src/ChipConfig.cpp
+++ b/libtrellis/src/ChipConfig.cpp
@@ -14,6 +14,8 @@
ss << ".device " << chip_name << endl << endl;
for (const auto &meta : metadata)
ss << ".comment " << meta << endl;
+ for (const auto &sc : sysconfig)
+ ss << ".sysconfig " << sc.first << " " << sc.second << endl;
ss << endl;
for (const auto &tile : tiles) {
if (!tile.second.empty()) {
@@ -67,6 +69,10 @@
TileConfig tc;
ss >> tc;
cc.tiles[tilename] = tc;
+ } else if (verb == ".sysconfig") {
+ std::string key, value;
+ ss >> key >> value;
+ cc.sysconfig[key] = value;
} else if (verb == ".bram_init") {
uint16_t bram;
ss >> bram;
diff --git a/libtrellis/tools/ecppack.cpp b/libtrellis/tools/ecppack.cpp
index 6bf2895..f6bf902 100644
--- a/libtrellis/tools/ecppack.cpp
+++ b/libtrellis/tools/ecppack.cpp
@@ -55,18 +55,26 @@
pos.add("input", 1);
options.add_options()("bit", po::value<std::string>(), "output bitstream file");
pos.add("bit", 1);
+ options.add_options()("version", "show current version and exit");
po::variables_map vm;
+
try {
po::parsed_options parsed = po::command_line_parser(argc, argv).options(options).positional(pos).run();
po::store(parsed, vm);
+
+ if (vm.count("version")) {
+ cerr << "Project Trellis ecppack Version " << git_describe_str << endl;
+ return 0;
+ }
+
po::notify(vm);
}
- catch (po::required_option &e) {
+ catch (po::required_option& e) {
cerr << "Error: input file is mandatory." << endl << endl;
goto help;
}
- catch (std::exception &e) {
+ catch (std::exception& e) {
cerr << "Error: " << e.what() << endl << endl;
goto help;
}
@@ -127,6 +135,18 @@
map<string, string> bitopts;
+ // Apply options passed from nextpnr via SYSCONFIG
+ if (cc.sysconfig.count("MCCLK_FREQ")) {
+ std::string freq = cc.sysconfig.at("MCCLK_FREQ");
+ if (freq == "62")
+ freq = "62.0";
+ bitopts["freq"] = freq;
+ }
+
+ if (cc.sysconfig.count("COMPRESS_CONFIG") && cc.sysconfig.at("COMPRESS_CONFIG") == "ON")
+ bitopts["compress"] = "yes";
+
+ // Override with command line options
if (vm.count("freq"))
bitopts["freq"] = vm["freq"].as<string>();
@@ -216,13 +236,8 @@
// Create JTAG bitstream without SPI flash related settings, as these
// seem to confuse the chip sometimes when configuring over JTAG
if (!bitopts.empty() && !(bitopts.size() == 1 && bitopts.count("compress"))) {
- bitopts.clear();
- if (vm.count("background"))
- bitopts["background"] = "yes";
- if (vm.count("bootaddr"))
- bitopts["multiboot"] = "yes";
- if (vm.count("compress"))
- bitopts["compress"] = "yes";
+ bitopts.erase("spimode");
+ bitopts.erase("freq");
b = Bitstream::serialise_chip(c, bitopts);
}