aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Shah <davey1576@gmail.com>2018-06-17 11:14:49 +0200
committerDavid Shah <davey1576@gmail.com>2018-06-17 11:14:49 +0200
commitf9bfccf68e939a2d14c0d94a14234822e9727b89 (patch)
treeaa917a5a3e02324bfec6bf5a8c71372091da4a0f
parente95f38e88ebcd07e0cf313cabbd5c2e56a6db85c (diff)
downloadnextpnr-f9bfccf68e939a2d14c0d94a14234822e9727b89.tar.gz
nextpnr-f9bfccf68e939a2d14c0d94a14234822e9727b89.tar.bz2
nextpnr-f9bfccf68e939a2d14c0d94a14234822e9727b89.zip
Add 'get or default' functions
Signed-off-by: David Shah <davey1576@gmail.com>
-rw-r--r--common/util.h63
-rw-r--r--ice40/arch_place.cc7
2 files changed, 67 insertions, 3 deletions
diff --git a/common/util.h b/common/util.h
new file mode 100644
index 00000000..2313a290
--- /dev/null
+++ b/common/util.h
@@ -0,0 +1,63 @@
+/*
+ * nextpnr -- Next Generation Place and Route
+ *
+ * Copyright (C) 2018 David Shah <david@symbioticeda.com>
+ *
+ * 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.
+ *
+ */
+
+#ifndef UTIL_H
+#define UTIL_H
+
+#include <string>
+#include "nextpnr.h"
+
+NEXTPNR_NAMESPACE_BEGIN
+
+// Get a value from a map-style container, returning default if value is not
+// found
+template<typename Container, typename KeyType, typename ValueType>
+ValueType get_or_default(const Container &ct, const KeyType &key,
+ ValueType def = ValueType())
+{
+ auto found = ct.find(key);
+ if (found == ct.end())
+ return def;
+ else
+ return found->second;
+};
+
+// Get a value from a map-style container, converting to int, and returning
+// default if value is not found
+template<typename Container, typename KeyType>
+int int_or_default(const Container &ct, const KeyType &key,
+ int def = 0)
+{
+ auto found = ct.find(key);
+ if (found == ct.end())
+ return def;
+ else
+ return std::stoi(found->second);
+};
+
+// As above, but convert to bool
+template<typename Container, typename KeyType>
+bool bool_or_default(const Container &ct, const KeyType &key,
+ bool def = false)
+{
+ return bool(int_or_default(ct, key, int(def)));
+};
+NEXTPNR_NAMESPACE_END
+
+#endif
diff --git a/ice40/arch_place.cc b/ice40/arch_place.cc
index 93b7beb4..83dd63aa 100644
--- a/ice40/arch_place.cc
+++ b/ice40/arch_place.cc
@@ -19,6 +19,7 @@
#include "arch_place.h"
#include "cells.h"
+#include "util.h"
NEXTPNR_NAMESPACE_BEGIN
@@ -39,7 +40,7 @@ static bool logicCellsCompatible(const std::vector<const CellInfo *> &cells)
std::unordered_set<const NetInfo *> locals;
for (auto cell : cells) {
- if (std::stoi(cell->params.at("DFF_ENABLE"))) {
+ if (bool_or_default(cell->params, "DFF_ENABLE")) {
if (!dffs_exist) {
dffs_exist = true;
cen = get_net_or_nullptr(cell, "CEN");
@@ -53,7 +54,7 @@ static bool logicCellsCompatible(const std::vector<const CellInfo *> &cells)
if (!is_global_net(sr))
locals.insert(sr);
- if (std::stoi(cell->params.at("NEG_CLK"))) {
+ if (bool_or_default(cell->params, "NEG_CLK")) {
dffs_neg = true;
}
} else {
@@ -63,7 +64,7 @@ static bool logicCellsCompatible(const std::vector<const CellInfo *> &cells)
return false;
if (sr != get_net_or_nullptr(cell, "SR"))
return false;
- if (dffs_neg != bool(std::stoi(cell->params.at("NEG_CLK"))))
+ if (dffs_neg != bool_or_default(cell->params, "NEG_CLK"))
return false;
}
}