Add 'get or default' functions
Signed-off-by: David Shah <davey1576@gmail.com>
This commit is contained in:
parent
e95f38e88e
commit
f9bfccf68e
63
common/util.h
Normal file
63
common/util.h
Normal 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
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user