diff options
author | D. Shah <dave@ds0.me> | 2021-01-29 11:29:32 +0000 |
---|---|---|
committer | D. Shah <dave@ds0.me> | 2021-02-02 16:59:42 +0000 |
commit | 0dbe7f96a39640c42dbb2ebb41324d0edf2a5f4b (patch) | |
tree | 27bf46127c6024da15b3169a0218a4a467bf0514 /common | |
parent | ff92d19fed274c6469720cc726e80dc777fa767f (diff) | |
download | nextpnr-0dbe7f96a39640c42dbb2ebb41324d0edf2a5f4b.tar.gz nextpnr-0dbe7f96a39640c42dbb2ebb41324d0edf2a5f4b.tar.bz2 nextpnr-0dbe7f96a39640c42dbb2ebb41324d0edf2a5f4b.zip |
common: First pass at IdStringList methods
Signed-off-by: D. Shah <dave@ds0.me>
Diffstat (limited to 'common')
-rw-r--r-- | common/nextpnr.cc | 35 | ||||
-rw-r--r-- | common/nextpnr.h | 32 |
2 files changed, 64 insertions, 3 deletions
diff --git a/common/nextpnr.cc b/common/nextpnr.cc index 9a856b99..57baedf9 100644 --- a/common/nextpnr.cc +++ b/common/nextpnr.cc @@ -69,6 +69,41 @@ void IdString::initialize_add(const BaseCtx *ctx, const char *s, int idx) ctx->idstring_idx_to_str->push_back(&insert_rc.first->first); } +IdStringList IdStringList::parse(Context *ctx, const std::string &str) +{ + char delim = ctx->getNameDelimiter(); + size_t id_count = std::count(str.begin(), str.end(), delim) + 1; + IdStringList list(id_count); + size_t start = 0; + for (size_t i = 0; i < id_count; i++) { + size_t end = str.find(delim, start); + NPNR_ASSERT((i == (id_count - 1)) || (end != std::string::npos)); + list.ids[i] = ctx->id(str.substr(start, end - start)); + start = end + 1; + } + return list; +} + +void IdStringList::build_str(const Context *ctx, std::string &str) const +{ + char delim = ctx->getNameDelimiter(); + bool first = true; + str.clear(); + for (auto entry : ids) { + if (!first) + str += delim; + str += entry.str(ctx); + first = false; + } +} + +std::string IdStringList::str(const Context *ctx) const +{ + std::string s; + build_str(ctx, s); + return s; +} + TimingConstrObjectId BaseCtx::timingWildcardObject() { TimingConstrObjectId id; diff --git a/common/nextpnr.h b/common/nextpnr.h index 68a341f3..66f31867 100644 --- a/common/nextpnr.h +++ b/common/nextpnr.h @@ -156,7 +156,7 @@ template <typename T, size_t N> class SSOArray size_t m_size; private: - inline bool is_heap() { return (m_size > N); } + inline bool is_heap() const { return (m_size > N); } void alloc() { if (is_heap()) { @@ -165,8 +165,8 @@ template <typename T, size_t N> class SSOArray } public: - T *data() { return is_heap() ? data_heap : &data_static; } - const T *data() const { return is_heap() ? data_heap : &data_static; } + T *data() { return is_heap() ? data_heap : data_static; } + const T *data() const { return is_heap() ? data_heap : data_static; } size_t size() const { return m_size; } T *begin() { return data(); } @@ -174,6 +174,8 @@ template <typename T, size_t N> class SSOArray const T *begin() const { return data(); } const T *end() const { return data() + m_size; } + SSOArray() : m_size(0){}; + SSOArray(size_t size, const T &init = T()) : m_size(size) { alloc(); @@ -205,11 +207,35 @@ template <typename T, size_t N> class SSOArray return true; return !std::equal(begin(), end(), other.begin()); } + T &operator[](size_t idx) + { + NPNR_ASSERT(idx < m_size); + return data()[idx]; + } + const T &operator[](size_t idx) const + { + NPNR_ASSERT(idx < m_size); + return data()[idx]; + } }; struct IdStringList { SSOArray<IdString, 4> ids; + + IdStringList(){}; + explicit IdStringList(size_t n) : ids(n, IdString()){}; + explicit IdStringList(IdString id) : ids(1, id){}; + template <typename Tlist> IdStringList(const Tlist &list) : ids(list){}; + + static IdStringList parse(Context *ctx, const std::string &str); + void build_str(const Context *ctx, std::string &str) const; + std::string str(const Context *ctx) const; + + size_t size() const { return ids.size(); } + const IdString *begin() const { return ids.begin(); } + const IdString *end() const { return ids.end(); } + const IdString &operator[](size_t idx) const { return ids[idx]; } }; struct GraphicElement |