aboutsummaryrefslogtreecommitdiffstats
path: root/ice40/main.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ice40/main.cc')
-rw-r--r--ice40/main.cc71
1 files changed, 71 insertions, 0 deletions
diff --git a/ice40/main.cc b/ice40/main.cc
index 4047be06..6a5e6687 100644
--- a/ice40/main.cc
+++ b/ice40/main.cc
@@ -30,6 +30,8 @@
#include <boost/filesystem/convenience.hpp>
#include <boost/program_options.hpp>
+#include <boost/property_tree/json_parser.hpp>
+#include <boost/property_tree/ptree.hpp>
#include <fstream>
#include <iostream>
#include "bitstream.h"
@@ -67,6 +69,7 @@ int main(int argc, char *argv[])
{
try {
namespace po = boost::program_options;
+ namespace pt = boost::property_tree;
int rc = 0;
std::string str;
@@ -103,6 +106,8 @@ int main(int argc, char *argv[])
options.add_options()("freq", po::value<double>(), "set target frequency for design in MHz");
options.add_options()("no-tmdriv", "disable timing-driven placement");
options.add_options()("package", po::value<std::string>(), "set device package");
+ options.add_options()("save", po::value<std::string>(), "project file to write");
+ options.add_options()("load", po::value<std::string>(), "project file to read");
po::variables_map vm;
try {
@@ -133,6 +138,50 @@ int main(int argc, char *argv[])
return 1;
}
+ if (vm.count("load")) {
+ try {
+ pt::ptree root;
+ std::string filename = vm["load"].as<std::string>();
+ pt::read_json(filename, root);
+ log_info("Loading project %s...\n", filename.c_str());
+ log_break();
+ vm.clear();
+
+ int version = root.get<int>("project.version");
+ if (version != 1)
+ log_error("Wrong project format version.\n");
+
+ std::string arch_name = root.get<std::string>("project.arch.name");
+ if (arch_name != "ice40")
+ log_error("Unsuported project architecture.\n");
+
+ std::string arch_type = root.get<std::string>("project.arch.type");
+ vm.insert(std::make_pair(arch_type, po::variable_value()));
+
+ std::string arch_package = root.get<std::string>("project.arch.package");
+ vm.insert(std::make_pair("package", po::variable_value(arch_package, false)));
+
+ auto project = root.get_child("project");
+ if (project.count("input")) {
+ auto input = project.get_child("input");
+ if (input.count("json"))
+ vm.insert(std::make_pair("json", po::variable_value(input.get<std::string>("json"), false)));
+ if (input.count("pcf"))
+ vm.insert(std::make_pair("pcf", po::variable_value(input.get<std::string>("pcf"), false)));
+ }
+ if (project.count("params")) {
+ auto params = project.get_child("params");
+ if (params.count("freq"))
+ vm.insert(std::make_pair("freq", po::variable_value(params.get<double>("freq"), false)));
+ if (params.count("seed"))
+ vm.insert(std::make_pair("seed", po::variable_value(params.get<int>("seed"), false)));
+ }
+ po::notify(vm);
+ } catch (...) {
+ log_error("Error loading project file.\n");
+ }
+ }
+
ArchArgs chipArgs;
if (vm.count("lp384")) {
@@ -193,6 +242,28 @@ int main(int argc, char *argv[])
if (vm.count("package"))
chipArgs.package = vm["package"].as<std::string>();
+ if (vm.count("save")) {
+ Context ctx(chipArgs);
+ std::string filename = vm["save"].as<std::string>();
+ std::ofstream f(filename);
+ pt::ptree root;
+ root.put("project.version", 1);
+ root.put("project.name", boost::filesystem::basename(filename));
+ root.put("project.arch.name", ctx.archId().c_str(&ctx));
+ root.put("project.arch.type", ctx.archArgsToId(chipArgs).c_str(&ctx));
+ root.put("project.arch.package", chipArgs.package);
+ if (vm.count("json"))
+ root.put("project.input.json", vm["json"].as<std::string>());
+ if (vm.count("pcf"))
+ root.put("project.input.pcf", vm["pcf"].as<std::string>());
+ if (vm.count("freq"))
+ root.put("project.params.freq", vm["freq"].as<double>());
+ if (vm.count("seed"))
+ root.put("project.params.seed", vm["seed"].as<int>());
+ pt::write_json(f, root);
+ return 1;
+ }
+
Context ctx(chipArgs);
#ifndef NO_PYTHON