2018-06-17 17:14:49 +08:00
|
|
|
/*
|
|
|
|
* 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
|
|
|
|
|
2018-06-22 18:57:22 +08:00
|
|
|
#include <map>
|
2018-06-26 21:06:59 +08:00
|
|
|
#include <set>
|
2018-06-22 20:58:27 +08:00
|
|
|
#include <string>
|
2018-06-17 17:14:49 +08:00
|
|
|
#include "nextpnr.h"
|
|
|
|
|
|
|
|
NEXTPNR_NAMESPACE_BEGIN
|
|
|
|
|
|
|
|
// Get a value from a map-style container, returning default if value is not
|
|
|
|
// found
|
2018-06-17 17:45:41 +08:00
|
|
|
template <typename Container, typename KeyType, typename ValueType>
|
2018-06-23 22:12:52 +08:00
|
|
|
ValueType get_or_default(const Container &ct, const KeyType &key, ValueType def = ValueType())
|
2018-06-17 17:14:49 +08:00
|
|
|
{
|
|
|
|
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
|
2018-06-23 22:12:52 +08:00
|
|
|
template <typename Container, typename KeyType> int int_or_default(const Container &ct, const KeyType &key, int def = 0)
|
2018-06-17 17:14:49 +08:00
|
|
|
{
|
|
|
|
auto found = ct.find(key);
|
|
|
|
if (found == ct.end())
|
|
|
|
return def;
|
|
|
|
else
|
|
|
|
return std::stoi(found->second);
|
|
|
|
};
|
|
|
|
|
|
|
|
// As above, but convert to bool
|
2018-06-17 17:45:41 +08:00
|
|
|
template <typename Container, typename KeyType>
|
|
|
|
bool bool_or_default(const Container &ct, const KeyType &key, bool def = false)
|
2018-06-17 17:14:49 +08:00
|
|
|
{
|
|
|
|
return bool(int_or_default(ct, key, int(def)));
|
|
|
|
};
|
2018-06-22 18:57:22 +08:00
|
|
|
|
|
|
|
// Wrap an unordered_map, and allow it to be iterated over sorted by key
|
2018-06-26 20:13:52 +08:00
|
|
|
template <typename K, typename V> std::map<K, V *> sorted(const std::unordered_map<K, std::unique_ptr<V>> &orig)
|
2018-06-22 20:58:27 +08:00
|
|
|
{
|
2018-06-26 20:13:52 +08:00
|
|
|
std::map<K, V *> retVal;
|
|
|
|
for (auto &item : orig)
|
|
|
|
retVal.emplace(std::make_pair(item.first, item.second.get()));
|
2018-06-26 03:33:48 +08:00
|
|
|
return retVal;
|
2018-06-22 18:57:22 +08:00
|
|
|
};
|
|
|
|
|
2018-06-26 21:06:59 +08:00
|
|
|
// Wrap an unordered_set, and allow it to be iterated over sorted by key
|
|
|
|
template <typename K> std::set<K> sorted(const std::unordered_set<K> &orig)
|
|
|
|
{
|
|
|
|
std::set<K> retVal;
|
|
|
|
for (auto &item : orig)
|
|
|
|
retVal.insert(item);
|
|
|
|
return retVal;
|
|
|
|
};
|
|
|
|
|
2018-06-17 17:14:49 +08:00
|
|
|
NEXTPNR_NAMESPACE_END
|
|
|
|
|
|
|
|
#endif
|