
"nextpnr.h" is no longer the god header. Important improvements: - Functions in log.h can be used without including BaseCtx/Arch/Context. This means that log_X functions can be called without included "nextpnr.h" - NPNR_ASSERT can be used without including "nextpnr.h" by including "nextpnr_assertions.h". This allows NPNR_ASSERT to be used safely in any header file. - Types defined in "archdefs.h" are now available without including BaseCtx/Arch/Context. This means that utility classes that will be used inside of BaseCtx/Arch/Context can be defined safely in a self-contained header. Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
82 lines
2.5 KiB
C++
82 lines
2.5 KiB
C++
/*
|
|
* nextpnr -- Next Generation Place and Route
|
|
*
|
|
* Copyright (C) 2018 Clifford Wolf <clifford@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.
|
|
*
|
|
*/
|
|
|
|
#include "property.h"
|
|
|
|
#include "nextpnr_namespaces.h"
|
|
|
|
NEXTPNR_NAMESPACE_BEGIN
|
|
|
|
Property::Property() : is_string(false), str(""), intval(0) {}
|
|
|
|
Property::Property(int64_t intval, int width) : is_string(false), intval(intval)
|
|
{
|
|
str.reserve(width);
|
|
for (int i = 0; i < width; i++)
|
|
str.push_back((intval & (1ULL << i)) ? S1 : S0);
|
|
}
|
|
|
|
Property::Property(const std::string &strval) : is_string(true), str(strval), intval(0xDEADBEEF) {}
|
|
|
|
Property::Property(State bit) : is_string(false), str(std::string("") + char(bit)), intval(bit == S1) {}
|
|
|
|
|
|
std::string Property::to_string() const
|
|
{
|
|
if (is_string) {
|
|
std::string result = str;
|
|
int state = 0;
|
|
for (char c : str) {
|
|
if (state == 0) {
|
|
if (c == '0' || c == '1' || c == 'x' || c == 'z')
|
|
state = 0;
|
|
else if (c == ' ')
|
|
state = 1;
|
|
else
|
|
state = 2;
|
|
} else if (state == 1 && c != ' ')
|
|
state = 2;
|
|
}
|
|
if (state < 2)
|
|
result += " ";
|
|
return result;
|
|
} else {
|
|
return std::string(str.rbegin(), str.rend());
|
|
}
|
|
}
|
|
|
|
Property Property::from_string(const std::string &s)
|
|
{
|
|
Property p;
|
|
|
|
size_t cursor = s.find_first_not_of("01xz");
|
|
if (cursor == std::string::npos) {
|
|
p.str = std::string(s.rbegin(), s.rend());
|
|
p.is_string = false;
|
|
p.update_intval();
|
|
} else if (s.find_first_not_of(' ', cursor) == std::string::npos) {
|
|
p = Property(s.substr(0, s.size() - 1));
|
|
} else {
|
|
p = Property(s);
|
|
}
|
|
return p;
|
|
}
|
|
|
|
NEXTPNR_NAMESPACE_END
|