aboutsummaryrefslogtreecommitdiffstats
path: root/mistral/main.cc
diff options
context:
space:
mode:
Diffstat (limited to 'mistral/main.cc')
-rw-r--r--mistral/main.cc105
1 files changed, 105 insertions, 0 deletions
diff --git a/mistral/main.cc b/mistral/main.cc
new file mode 100644
index 00000000..9147a68b
--- /dev/null
+++ b/mistral/main.cc
@@ -0,0 +1,105 @@
+/*
+ * nextpnr -- Next Generation Place and Route
+ *
+ * Copyright (C) 2021 gatecat <gatecat@ds0.me>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+#ifdef MAIN_EXECUTABLE
+
+#include <fstream>
+#include "command.h"
+#include "design_utils.h"
+#include "jsonwrite.h"
+#include "log.h"
+#include "timing.h"
+
+USING_NEXTPNR_NAMESPACE
+
+class MistralCommandHandler : public CommandHandler
+{
+ public:
+ MistralCommandHandler(int argc, char **argv);
+ virtual ~MistralCommandHandler(){};
+ std::unique_ptr<Context> createContext(std::unordered_map<std::string, Property> &values) override;
+ void setupArchContext(Context *ctx) override{};
+ void customBitstream(Context *ctx) override;
+ void customAfterLoad(Context *ctx) override;
+
+ protected:
+ po::options_description getArchOptions() override;
+};
+
+MistralCommandHandler::MistralCommandHandler(int argc, char **argv) : CommandHandler(argc, argv) {}
+
+po::options_description MistralCommandHandler::getArchOptions()
+{
+ po::options_description specific("Architecture specific options");
+ specific.add_options()("mistral", po::value<std::string>(), "path to mistral root");
+ specific.add_options()("device", po::value<std::string>(), "device name (e.g. 5CSEBA6U23I7)");
+ specific.add_options()("qsf", po::value<std::string>(), "path to QSF constraints file");
+ specific.add_options()("rbf", po::value<std::string>(), "RBF bitstream to write");
+
+ return specific;
+}
+
+void MistralCommandHandler::customBitstream(Context *ctx)
+{
+ if (vm.count("rbf")) {
+ std::string filename = vm["rbf"].as<std::string>();
+ ctx->build_bitstream();
+ std::vector<uint8_t> data;
+ ctx->cyclonev->rbf_save(data);
+
+ std::ofstream out(filename, std::ios::binary);
+ if (!out)
+ log_error("Failed to open output RBF file %s.\n", filename.c_str());
+ out.write(reinterpret_cast<const char *>(data.data()), data.size());
+ }
+}
+
+std::unique_ptr<Context> MistralCommandHandler::createContext(std::unordered_map<std::string, Property> &values)
+{
+ ArchArgs chipArgs;
+ if (!vm.count("mistral")) {
+ log_error("mistral must be specified on the command line\n");
+ }
+ if (!vm.count("device")) {
+ log_error("device must be specified on the command line (e.g. --device 5CSEBA6U23I7)\n");
+ }
+ chipArgs.mistral_root = vm["mistral"].as<std::string>();
+ chipArgs.device = vm["device"].as<std::string>();
+ auto ctx = std::unique_ptr<Context>(new Context(chipArgs));
+ return ctx;
+}
+
+void MistralCommandHandler::customAfterLoad(Context *ctx)
+{
+ if (vm.count("qsf")) {
+ std::string filename = vm["qsf"].as<std::string>();
+ std::ifstream in(filename);
+ if (!in)
+ log_error("Failed to open input QSF file %s.\n", filename.c_str());
+ ctx->read_qsf(in);
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ MistralCommandHandler handler(argc, argv);
+ return handler.exec();
+}
+
+#endif