libtrellis: Allow specifying idcode override in ecpunpack Signed-off-by: Jens Andersen <jens.andersen@gmail.com>
diff --git a/libtrellis/tools/ecpunpack.cpp b/libtrellis/tools/ecpunpack.cpp index d76aba1..68ad3a8 100644 --- a/libtrellis/tools/ecpunpack.cpp +++ b/libtrellis/tools/ecpunpack.cpp
@@ -3,6 +3,7 @@ #include "Chip.hpp" #include "Database.hpp" #include <iostream> +#include <boost/optional.hpp> #include <boost/program_options.hpp> #include <stdexcept> #include <streambuf> @@ -14,6 +15,7 @@ { using namespace Trellis; namespace po = boost::program_options; + boost::optional<uint32_t> idcode; std::string database_folder = TRELLIS_PREFIX "/share/trellis/database"; @@ -21,6 +23,7 @@ options.add_options()("help,h", "show help"); options.add_options()("verbose,v", "verbose output"); options.add_options()("db", po::value<std::string>(), "Trellis database folder location"); + options.add_options()("idcode", po::value<std::string>(), "IDCODE to override in bitstream"); po::positional_options_description pos; options.add_options()("input", po::value<std::string>()->required(), "input bitstream file"); pos.add("input", 1); @@ -59,6 +62,17 @@ database_folder = vm["db"].as<string>(); } + if (vm.count("idcode")) { + string idcode_str = vm["idcode"].as<string>(); + uint32_t idcode_val; + idcode_val = uint32_t(strtoul(idcode_str.c_str(), nullptr, 0)); + if (idcode_val == 0) { + cerr << "Invalid idcode: " << idcode_str << endl; + return 1; + } + idcode = idcode_val; + } + try { load_database(database_folder); } catch (runtime_error &e) { @@ -67,7 +81,7 @@ } try { - Chip c = Bitstream::read_bit(bit_file).deserialise_chip(); + Chip c = Bitstream::read_bit(bit_file).deserialise_chip(idcode); ChipConfig cc = ChipConfig::from_chip(c); ofstream out_file(vm["textcfg"].as<string>()); if (!out_file) {