Add 'get or default' functions

Signed-off-by: David Shah <davey1576@gmail.com>
This commit is contained in:
David Shah 2018-06-17 11:14:49 +02:00
parent e95f38e88e
commit f9bfccf68e
2 changed files with 67 additions and 3 deletions

63
common/util.h Normal file
View File

@ -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

View File

@ -19,6 +19,7 @@
#include "arch_place.h" #include "arch_place.h"
#include "cells.h" #include "cells.h"
#include "util.h"
NEXTPNR_NAMESPACE_BEGIN NEXTPNR_NAMESPACE_BEGIN
@ -39,7 +40,7 @@ static bool logicCellsCompatible(const std::vector<const CellInfo *> &cells)
std::unordered_set<const NetInfo *> locals; std::unordered_set<const NetInfo *> locals;
for (auto cell : cells) { for (auto cell : cells) {
if (std::stoi(cell->params.at("DFF_ENABLE"))) { if (bool_or_default(cell->params, "DFF_ENABLE")) {
if (!dffs_exist) { if (!dffs_exist) {
dffs_exist = true; dffs_exist = true;
cen = get_net_or_nullptr(cell, "CEN"); 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)) if (!is_global_net(sr))
locals.insert(sr); locals.insert(sr);
if (std::stoi(cell->params.at("NEG_CLK"))) { if (bool_or_default(cell->params, "NEG_CLK")) {
dffs_neg = true; dffs_neg = true;
} }
} else { } else {
@ -63,7 +64,7 @@ static bool logicCellsCompatible(const std::vector<const CellInfo *> &cells)
return false; return false;
if (sr != get_net_or_nullptr(cell, "SR")) if (sr != get_net_or_nullptr(cell, "SR"))
return false; 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; return false;
} }
} }