libtrellis: Allow hex in IDCODE override in ecppack

Example:

ecppack --idcode 0x21111043 design_out.config design.bit

Signed-off-by: Jens Andersen <jens.andersen@gmail.com>
diff --git a/libtrellis/tools/ecppack.cpp b/libtrellis/tools/ecppack.cpp
index dd5280c..5ae362e 100644
--- a/libtrellis/tools/ecppack.cpp
+++ b/libtrellis/tools/ecppack.cpp
@@ -31,7 +31,7 @@
     options.add_options()("verbose,v", "verbose output");
     options.add_options()("db", po::value<std::string>(), "Trellis database folder location");
     options.add_options()("usercode", po::value<uint32_t>(), "USERCODE to set in bitstream");
-    options.add_options()("idcode", po::value<uint32_t>(), "IDCODE to override in bitstream");
+    options.add_options()("idcode", po::value<std::string>(), "IDCODE to override in bitstream");
     options.add_options()("freq", po::value<std::string>(), "config frequency in MHz");
     options.add_options()("svf", po::value<std::string>(), "output SVF file");
     options.add_options()("svf-rowsize", po::value<int>(), "SVF row size in bits (default 8000)");
@@ -94,8 +94,16 @@
     Chip c = cc.to_chip();
     if (vm.count("usercode"))
         c.usercode = vm["usercode"].as<uint32_t>();
-    if (vm.count("idcode"))
-        c.info.idcode = vm["idcode"].as<uint32_t>();
+
+    if (vm.count("idcode")) {
+        string idcode_str = vm["idcode"].as<string>();
+        uint32_t idcode = uint32_t(strtoul(idcode_str.c_str(), nullptr, 0));
+        if (idcode == 0) {
+            cerr << "Invalid idcode: " << idcode_str << endl;
+            return 1;
+        }
+        c.info.idcode = idcode;
+    }
 
     map<string, string> bitopts;