From 04c88be4a69e45971da67f3c9de40cbc690e21d3 Mon Sep 17 00:00:00 2001 From: Soheil Shahrouz Date: Wed, 24 Sep 2025 15:08:19 -0400 Subject: [PATCH 1/4] remove vtr::string_view --- doc/src/api/vtrutil/containers.rst | 6 - .../src/read_fpga_interchange_arch.cpp | 2 +- libs/libarchfpga/src/read_xml_util.cpp | 4 +- libs/librrgraph/src/base/rr_metadata.cpp | 4 +- libs/librrgraph/src/base/rr_metadata.h | 4 +- .../src/io/rr_graph_uxsdcxx_serializer.h | 6 +- libs/libvtrutil/src/vtr_expr_eval.cpp | 2 +- libs/libvtrutil/src/vtr_expr_eval.h | 16 +- libs/libvtrutil/src/vtr_string_interning.h | 17 +- libs/libvtrutil/src/vtr_string_view.h | 192 ------------------ libs/libvtrutil/test/test_strings.cpp | 106 +++------- utils/fasm/src/fasm.cpp | 14 +- utils/fasm/test/test_fasm.cpp | 4 +- .../build_switchblocks.cpp | 10 +- vpr/src/route/rr_graph_generation/rr_types.h | 9 +- vpr/test/test_vpr.cpp | 18 +- 16 files changed, 73 insertions(+), 341 deletions(-) delete mode 100644 libs/libvtrutil/src/vtr_string_view.h diff --git a/doc/src/api/vtrutil/containers.rst b/doc/src/api/vtrutil/containers.rst index b0eb95ec2cc..086db2f8683 100644 --- a/doc/src/api/vtrutil/containers.rst +++ b/doc/src/api/vtrutil/containers.rst @@ -99,12 +99,6 @@ vtr_array_view :project: vtr :members: -vtr_string_view ---------------- -.. doxygenclass:: vtr::string_view - :project: vtr - :members: - vtr_cache --------- .. doxygenclass:: vtr::Cache diff --git a/libs/libarchfpga/src/read_fpga_interchange_arch.cpp b/libs/libarchfpga/src/read_fpga_interchange_arch.cpp index 6268ede1b01..f17688f936f 100644 --- a/libs/libarchfpga/src/read_fpga_interchange_arch.cpp +++ b/libs/libarchfpga/src/read_fpga_interchange_arch.cpp @@ -285,7 +285,7 @@ struct ArchReader { set_arch_file_name(arch_file); for (std::string str : ar_.getStrList()) { - auto interned_string = arch_->strings.intern_string(vtr::string_view(str.c_str())); + auto interned_string = arch_->strings.intern_string(str); arch_->interned_strings.push_back(interned_string); } } diff --git a/libs/libarchfpga/src/read_xml_util.cpp b/libs/libarchfpga/src/read_xml_util.cpp index 5419fc15973..4fbf675e5c1 100644 --- a/libs/libarchfpga/src/read_xml_util.cpp +++ b/libs/libarchfpga/src/read_xml_util.cpp @@ -174,8 +174,8 @@ t_metadata_dict process_meta_data(vtr::string_internment& strings, std::string key = get_attribute(meta_tag, "name", loc_data).as_string(); std::string value = meta_tag.child_value(); - data.add(strings.intern_string(vtr::string_view(key.c_str())), - strings.intern_string(vtr::string_view(value.c_str()))); + data.add(strings.intern_string(key), + strings.intern_string(value)); meta_tag = meta_tag.next_sibling(meta_tag.name()); } } diff --git a/libs/librrgraph/src/base/rr_metadata.cpp b/libs/librrgraph/src/base/rr_metadata.cpp index dea18543770..fd8970b327b 100644 --- a/libs/librrgraph/src/base/rr_metadata.cpp +++ b/libs/librrgraph/src/base/rr_metadata.cpp @@ -16,7 +16,7 @@ void add_rr_node_metadata(MetadataStorage& rr_node_metadata, int src_node, value); } -void add_rr_node_metadata(MetadataStorage& rr_node_metadata, int src_node, vtr::string_view key, vtr::string_view value, const t_arch* arch) { +void add_rr_node_metadata(MetadataStorage& rr_node_metadata, int src_node, std::string_view key, std::string_view value, const t_arch* arch) { rr_node_metadata.add_metadata(src_node, arch->strings.intern_string(key), arch->strings.intern_string(value)); @@ -33,7 +33,7 @@ const t_metadata_value* rr_edge_metadata(const RRGraphBuilder& rr_graph_builder, return iter->second.one(key); } -void add_rr_edge_metadata(MetadataStorage>& rr_edge_metadata, int src_node, int sink_id, short switch_id, vtr::string_view key, vtr::string_view value, const t_arch* arch) { +void add_rr_edge_metadata(MetadataStorage>& rr_edge_metadata, int src_node, int sink_id, short switch_id, std::string_view key, std::string_view value, const t_arch* arch) { auto rr_edge = std::make_tuple(src_node, sink_id, switch_id); rr_edge_metadata.add_metadata(rr_edge, arch->strings.intern_string(key), diff --git a/libs/librrgraph/src/base/rr_metadata.h b/libs/librrgraph/src/base/rr_metadata.h index dd2b9f5b935..79ab5bde5ce 100644 --- a/libs/librrgraph/src/base/rr_metadata.h +++ b/libs/librrgraph/src/base/rr_metadata.h @@ -7,10 +7,10 @@ namespace vpr { const t_metadata_value* rr_node_metadata(const RRGraphBuilder& rr_graph_builder, int src_node, vtr::interned_string key); void add_rr_node_metadata(MetadataStorage& rr_node_metadata, int src_node, vtr::interned_string key, vtr::interned_string value); -void add_rr_node_metadata(MetadataStorage& rr_node_metadata, int src_node, vtr::string_view key, vtr::string_view value, const t_arch* arch); +void add_rr_node_metadata(MetadataStorage& rr_node_metadata, int src_node, std::string_view key, std::string_view value, const t_arch* arch); const t_metadata_value* rr_edge_metadata(const RRGraphBuilder& rr_graph_builder, int src_node, int sink_node, short switch_id, vtr::interned_string key); void add_rr_edge_metadata(MetadataStorage>& rr_edge_metadata, int src_node, int sink_node, short switch_id, vtr::interned_string key, vtr::interned_string value); -void add_rr_edge_metadata(MetadataStorage>& rr_edge_metadata, int src_node, int sink_node, short switch_id, vtr::string_view key, vtr::string_view value, const t_arch* arch); +void add_rr_edge_metadata(MetadataStorage>& rr_edge_metadata, int src_node, int sink_node, short switch_id, std::string_view key, std::string_view value, const t_arch* arch); } // namespace vpr diff --git a/libs/librrgraph/src/io/rr_graph_uxsdcxx_serializer.h b/libs/librrgraph/src/io/rr_graph_uxsdcxx_serializer.h index ea09e79a818..20c42146f9d 100644 --- a/libs/librrgraph/src/io/rr_graph_uxsdcxx_serializer.h +++ b/libs/librrgraph/src/io/rr_graph_uxsdcxx_serializer.h @@ -55,12 +55,12 @@ class MetadataBind { void set_name(const char* name) { if (!ignore_) { - name_ = strings_->intern_string(vtr::string_view(name)); + name_ = strings_->intern_string(name); } } void set_value(const char* value) { if (!ignore_) { - value_ = strings_->intern_string(vtr::string_view(value)); + value_ = strings_->intern_string(value); } } void set_node_target(int inode) { @@ -321,7 +321,7 @@ class RrGraphSerializer final : public uxsd::RrGraphBase { , rr_node_metadata_(rr_node_metadata) , rr_edge_metadata_(rr_edge_metadata) , strings_(strings) - , empty_(strings_->intern_string(vtr::string_view(""))) + , empty_(strings_->intern_string("")) , report_error_(nullptr) , is_flat_(is_flat) { // Initialize internal data diff --git a/libs/libvtrutil/src/vtr_expr_eval.cpp b/libs/libvtrutil/src/vtr_expr_eval.cpp index e3716865455..a3bb335d730 100644 --- a/libs/libvtrutil/src/vtr_expr_eval.cpp +++ b/libs/libvtrutil/src/vtr_expr_eval.cpp @@ -318,7 +318,7 @@ static void get_formula_object(const char* ch, int& ichar, const t_formula_data& //A number fobj->type = E_FML_NUMBER; fobj->data.num = mydata.get_var_value( - vtr::string_view( + std::string_view( var_name.data(), var_name.size())); } else if (is_variable(var_name)) { diff --git a/libs/libvtrutil/src/vtr_expr_eval.h b/libs/libvtrutil/src/vtr_expr_eval.h index 326af017bd5..65e34776668 100644 --- a/libs/libvtrutil/src/vtr_expr_eval.h +++ b/libs/libvtrutil/src/vtr_expr_eval.h @@ -4,10 +4,10 @@ #include #include #include +#include #include "vtr_util.h" #include "vtr_error.h" -#include "vtr_string_view.h" #include "vtr_flat_map.h" #include "../../../vpr/src/draw/breakpoint_state_globals.h" @@ -44,18 +44,10 @@ class t_formula_data { } ///@brief set the value of a specific part of the formula - void set_var_value(vtr::string_view var, int value) { vars_[var] = value; } - - ///@brief set the value of a specific part of the formula (the var can be c-style string) - void set_var_value(const char* var, int value) { vars_[vtr::string_view(var)] = value; } - - ///@brief get the value of a specific part of the formula - int get_var_value(const std::string& var) const { - return get_var_value(vtr::string_view(var.data(), var.size())); - } + void set_var_value(std::string_view var, int value) { vars_[var] = value; } ///@brief get the value of a specific part of the formula (the var can be c-style string) - int get_var_value(vtr::string_view var) const { + int get_var_value(std::string_view var) const { auto iter = vars_.find(var); if (iter == vars_.end()) { std::string copy(var.data(), var.size()); @@ -66,7 +58,7 @@ class t_formula_data { } private: - vtr::flat_map vars_; + vtr::flat_map vars_; }; /**** Enums ****/ diff --git a/libs/libvtrutil/src/vtr_string_interning.h b/libs/libvtrutil/src/vtr_string_interning.h index c845aded20c..ad31f6cbeb9 100644 --- a/libs/libvtrutil/src/vtr_string_interning.h +++ b/libs/libvtrutil/src/vtr_string_interning.h @@ -49,10 +49,11 @@ #include #include #include +#include #include "vtr_strong_id.h" -#include "vtr_string_view.h" #include "vtr_vector.h" +#include "vtr_hash.h" namespace vtr { @@ -132,7 +133,7 @@ class interned_string_iterator { std::fill(parts_.begin(), parts_.end(), StringId()); part_idx_ = size_t(-1); str_idx_ = size_t(-1); - view_ = vtr::string_view(); + view_ = std::string_view(); } const string_internment* internment_; @@ -140,7 +141,7 @@ class interned_string_iterator { std::array parts_; size_t part_idx_; size_t str_idx_; - vtr::string_view view_; + std::string_view view_; }; ///@brief == operator @@ -346,7 +347,7 @@ class string_internment { * If interned_string is ever called with two strings of the same value, * the interned_string will be equal. */ - interned_string intern_string(vtr::string_view view) { + interned_string intern_string(std::string_view view) { size_t num_parts = 1; for (const auto& c : view) { if (c == kSplitChar) { @@ -381,12 +382,10 @@ class string_internment { /** * @brief Retrieve a string part based on id. - * * This method should not generally be called directly. */ - vtr::string_view get_string(StringId id) const { - auto& str = strings_[id]; - return vtr::string_view(str.data(), str.size()); + std::string_view get_string(StringId id) const { + return strings_[id]; } ///@brief Number of unique string parts stored. @@ -395,7 +394,7 @@ class string_internment { } private: - StringId intern_one_string(vtr::string_view view) { + StringId intern_one_string(std::string_view view) { temporary_.assign(view.begin(), view.end()); StringId next_id(strings_.size()); auto result = string_to_id_.insert(std::make_pair(temporary_, next_id)); diff --git a/libs/libvtrutil/src/vtr_string_view.h b/libs/libvtrutil/src/vtr_string_view.h deleted file mode 100644 index 9a80bb44167..00000000000 --- a/libs/libvtrutil/src/vtr_string_view.h +++ /dev/null @@ -1,192 +0,0 @@ -#pragma once - -#include -#include -#include - -#include "vtr_hash.h" - -namespace vtr { - -/** - * @brief Implements a view to a fixed length string (similar to std::basic_string_view). - * - * The underlying string does not need to be NULL terminated. - */ -class string_view { - public: - static constexpr size_t npos = size_t(-1); - - ///@brief constructor - explicit constexpr string_view() - : data_(nullptr) - , size_(0) {} - - ///@brief constructor - explicit string_view(const char* str) - : data_(str) - , size_(strlen(str)) {} - ///@brief constructor - explicit constexpr string_view(const char* str, size_t size) - : data_(str) - , size_(size) {} - - explicit string_view(const std::string& other) - : data_(other.c_str()) - , size_(other.size()) {} - - constexpr string_view(const string_view& other) noexcept = default; - ///@brief copy constructor - constexpr string_view& operator=(const string_view& view) noexcept { - data_ = view.data_; - size_ = view.size_; - return *this; - } - - ///@brief indexing [] operator (immutable) - constexpr char operator[](size_t pos) const { - return data_[pos]; - } - - ///@brief aT() operator (immutable) - const char& at(size_t pos) const { - if (pos >= size()) { - throw std::out_of_range("Pos is out of range."); - } - - return data_[pos]; - } - - ///@brief Returns the first character of the string - constexpr const char& front() const { - return data_[0]; - } - - ///@brief Returns the last character of the string - constexpr const char& back() const { - return data_[size() - 1]; - } - - ///@brief Returns a pointer to the string data - constexpr const char* data() const { - return data_; - } - - ///@brief Returns the string size - constexpr size_t size() const noexcept { - return size_; - } - - ///@brief Returns the string size - constexpr size_t length() const noexcept { - return size_; - } - - ///@brief Returns true if empty - constexpr bool empty() const noexcept { - return size_ == 0; - } - - ///@brief Returns a pointer to the begin of the string - constexpr const char* begin() const noexcept { - return data_; - } - - ///@brief Same as begin() - constexpr const char* cbegin() const noexcept { - return data_; - } - - ///@brief Returns a pointer to the end of the string - constexpr const char* end() const noexcept { - return data_ + size_; - } - - ///@brief Same as end() - constexpr const char* cend() const noexcept { - return data_ + size_; - } - - ///@brief Swaps two string views - void swap(string_view& v) noexcept { - std::swap(data_, v.data_); - std::swap(size_, v.size_); - } - - ///@brief Returns a newly constructed string object with its value initialized to a copy of a substring of this object. - string_view substr(size_t pos = 0, size_t count = npos) { - if (pos > size()) { - throw std::out_of_range("Pos is out of range."); - } - - size_t rcount = size_ - pos; - if (count != npos && (pos + count) < size_) { - rcount = count; - } - - return string_view(data_ + pos, rcount); - } - - private: - const char* data_; - size_t size_; -}; - -///@brief == operator -inline bool operator==(string_view lhs, - string_view rhs) noexcept { - return lhs.size() == rhs.size() && (lhs.empty() || rhs.empty() || (strncmp(lhs.data(), rhs.data(), std::min(lhs.size(), rhs.size())) == 0)); -} - -///@brief != operator -inline bool operator!=(string_view lhs, - string_view rhs) noexcept { - return lhs.size() != rhs.size() || strncmp(lhs.data(), rhs.data(), std::min(lhs.size(), rhs.size())) != 0; -} - -///@brief < operator -inline bool operator<(string_view lhs, - string_view rhs) noexcept { - return std::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end()); -} - -///brief >= operator -inline bool operator>=(string_view lhs, - string_view rhs) noexcept { - return !std::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end()); -} - -///@brief > operator -inline bool operator>(string_view lhs, - string_view rhs) noexcept { - return rhs < lhs; -} - -///@brief <= operator -inline bool operator<=(string_view lhs, - string_view rhs) noexcept { - return rhs >= lhs; -} - -///@brief << operator for ostream -inline std::ostream& operator<<(std::ostream& os, string_view const& value) { - for (const auto& c : value) { - os << c; - } - return os; -} - -} // namespace vtr - -namespace std { -template<> -struct hash { - std::size_t operator()(vtr::string_view const& s) const noexcept { - std::size_t h = 0; - for (const auto& data : s) { - vtr::hash_combine(h, std::hash()(data)); - } - return h; - } -}; -} // namespace std diff --git a/libs/libvtrutil/test/test_strings.cpp b/libs/libvtrutil/test/test_strings.cpp index b28d1c9ef1a..d8014a0d2ad 100644 --- a/libs/libvtrutil/test/test_strings.cpp +++ b/libs/libvtrutil/test/test_strings.cpp @@ -1,76 +1,16 @@ #include "catch2/catch_test_macros.hpp" -#include "vtr_string_view.h" +#include #include "vtr_string_interning.h" -TEST_CASE("String view", "[vtr_string_view/string_view]") { - vtr::string_view a("test"); - vtr::string_view b("test"); - vtr::string_view c("tes"); - vtr::string_view d("est"); - vtr::string_view e("es"); - - REQUIRE(a.size() == 4); - REQUIRE(b.size() == 4); - REQUIRE(c.size() == 3); - REQUIRE(d.size() == 3); - REQUIRE(e.size() == 2); - - REQUIRE(a[0] == 't'); - REQUIRE(a[1] == 'e'); - REQUIRE(a[2] == 's'); - REQUIRE(a[3] == 't'); - - auto itr = a.begin(); - REQUIRE(*itr++ == 't'); - REQUIRE(*itr++ == 'e'); - REQUIRE(*itr++ == 's'); - REQUIRE(*itr++ == 't'); - REQUIRE(itr == a.end()); - - REQUIRE(a.front() == 't'); - REQUIRE(c.front() == 't'); - REQUIRE(c.back() == 's'); - - REQUIRE(a == b); - REQUIRE(a <= b); - REQUIRE(a >= b); - REQUIRE(a != c); - - REQUIRE(c < a); - REQUIRE(a >= c); - - REQUIRE(a > c); - REQUIRE(c <= a); - - REQUIRE(c != d); - REQUIRE(a.substr(0, 3) == c); - REQUIRE(a.substr(1, 3) == d); - REQUIRE(a.substr(1) == d); - REQUIRE(a.substr(1, 2) == e); - REQUIRE(std::hash()(a) == std::hash()(b)); - REQUIRE(std::hash()(a) != std::hash()(c)); - - vtr::string_view f = a; - REQUIRE(b == f); - - f = e; - REQUIRE(b != f); - REQUIRE(e == f); - - std::swap(a, f); - REQUIRE(a == e); - REQUIRE(f == b); -} - TEST_CASE("Basic string internment", "[vtr_string_interning/string_internment]") { vtr::string_internment internment; - vtr::interned_string a = internment.intern_string(vtr::string_view("test")); - vtr::interned_string b = internment.intern_string(vtr::string_view("test")); - vtr::interned_string c = internment.intern_string(vtr::string_view("tes")); - vtr::interned_string d = internment.intern_string(vtr::string_view("est")); - vtr::interned_string e = internment.intern_string(vtr::string_view("es")); + vtr::interned_string a = internment.intern_string("test"); + vtr::interned_string b = internment.intern_string("test"); + vtr::interned_string c = internment.intern_string("tes"); + vtr::interned_string d = internment.intern_string("est"); + vtr::interned_string e = internment.intern_string("es"); auto itr = a.begin(&internment); REQUIRE(*itr++ == 't'); @@ -140,14 +80,14 @@ TEST_CASE("Split string internment", "[vtr_string_interning/string_internment]") size_t unique_strings = 0; REQUIRE(internment.unique_strings() == unique_strings); - vtr::interned_string a = internment.intern_string(vtr::string_view("test")); + vtr::interned_string a = internment.intern_string("test"); unique_strings += 1; REQUIRE(internment.unique_strings() == unique_strings); - vtr::interned_string b = internment.intern_string(vtr::string_view("test.test")); + vtr::interned_string b = internment.intern_string("test.test"); REQUIRE(internment.unique_strings() == unique_strings); - vtr::interned_string c = internment.intern_string(vtr::string_view("test.test.test")); + vtr::interned_string c = internment.intern_string("test.test.test"); REQUIRE(internment.unique_strings() == unique_strings); - vtr::interned_string d = internment.intern_string(vtr::string_view("test.test.test.test")); + vtr::interned_string d = internment.intern_string("test.test.test.test"); unique_strings += 1; REQUIRE(internment.unique_strings() == unique_strings); @@ -156,16 +96,16 @@ TEST_CASE("Split string internment", "[vtr_string_interning/string_internment]") test_internment_retreval(&internment, c, "test.test.test"); test_internment_retreval(&internment, d, "test.test.test.test"); - vtr::interned_string f = internment.intern_string(vtr::string_view("a")); + vtr::interned_string f = internment.intern_string("a"); unique_strings += 1; REQUIRE(internment.unique_strings() == unique_strings); - vtr::interned_string g = internment.intern_string(vtr::string_view("b.c")); + vtr::interned_string g = internment.intern_string("b.c"); unique_strings += 2; REQUIRE(internment.unique_strings() == unique_strings); - vtr::interned_string h = internment.intern_string(vtr::string_view("d.e.f")); + vtr::interned_string h = internment.intern_string("d.e.f"); unique_strings += 3; REQUIRE(internment.unique_strings() == unique_strings); - vtr::interned_string i = internment.intern_string(vtr::string_view("g.h.i.j")); + vtr::interned_string i = internment.intern_string("g.h.i.j"); unique_strings += 1; REQUIRE(internment.unique_strings() == unique_strings); @@ -174,15 +114,15 @@ TEST_CASE("Split string internment", "[vtr_string_interning/string_internment]") test_internment_retreval(&internment, h, "d.e.f"); test_internment_retreval(&internment, i, "g.h.i.j"); - vtr::interned_string j = internment.intern_string(vtr::string_view(".")); + vtr::interned_string j = internment.intern_string("."); unique_strings += 1; REQUIRE(internment.unique_strings() == unique_strings); - vtr::interned_string k = internment.intern_string(vtr::string_view("..")); + vtr::interned_string k = internment.intern_string(".."); REQUIRE(internment.unique_strings() == unique_strings); - vtr::interned_string l = internment.intern_string(vtr::string_view("...")); + vtr::interned_string l = internment.intern_string("..."); unique_strings += 1; REQUIRE(internment.unique_strings() == unique_strings); - vtr::interned_string m = internment.intern_string(vtr::string_view("....")); + vtr::interned_string m = internment.intern_string("...."); unique_strings += 1; REQUIRE(internment.unique_strings() == unique_strings); @@ -191,16 +131,16 @@ TEST_CASE("Split string internment", "[vtr_string_interning/string_internment]") test_internment_retreval(&internment, l, "..."); test_internment_retreval(&internment, m, "...."); - vtr::interned_string n = internment.intern_string(vtr::string_view(".q")); + vtr::interned_string n = internment.intern_string(".q"); unique_strings += 1; REQUIRE(internment.unique_strings() == unique_strings); - vtr::interned_string o = internment.intern_string(vtr::string_view(".a.")); + vtr::interned_string o = internment.intern_string(".a."); REQUIRE(internment.unique_strings() == unique_strings); - vtr::interned_string p = internment.intern_string(vtr::string_view("b.c.d")); + vtr::interned_string p = internment.intern_string("b.c.d"); REQUIRE(internment.unique_strings() == unique_strings); - vtr::interned_string q = internment.intern_string(vtr::string_view("e..f")); + vtr::interned_string q = internment.intern_string("e..f"); REQUIRE(internment.unique_strings() == unique_strings); - vtr::interned_string r = internment.intern_string(vtr::string_view("e.")); + vtr::interned_string r = internment.intern_string("e."); REQUIRE(internment.unique_strings() == unique_strings); test_internment_retreval(&internment, n, ".q"); diff --git a/utils/fasm/src/fasm.cpp b/utils/fasm/src/fasm.cpp index 047bd7df012..0f75998dc25 100644 --- a/utils/fasm/src/fasm.cpp +++ b/utils/fasm/src/fasm.cpp @@ -22,13 +22,13 @@ namespace fasm { FasmWriterVisitor::FasmWriterVisitor(vtr::string_internment *strings, std::ostream& f, bool is_flat) : strings_(strings), os_(f), pb_graph_pin_lookup_from_index_by_type_(g_vpr_ctx.device().logical_block_types), - fasm_lut(strings->intern_string(vtr::string_view("fasm_lut"))), - fasm_features(strings->intern_string(vtr::string_view("fasm_features"))), - fasm_params(strings->intern_string(vtr::string_view("fasm_params"))), - fasm_prefix(strings->intern_string(vtr::string_view("fasm_prefix"))), - fasm_placeholders(strings->intern_string(vtr::string_view("fasm_placeholders"))), - fasm_type(strings->intern_string(vtr::string_view("fasm_type"))), - fasm_mux(strings->intern_string(vtr::string_view("fasm_mux"))), + fasm_lut(strings->intern_string("fasm_lut")), + fasm_features(strings->intern_string("fasm_features")), + fasm_params(strings->intern_string("fasm_params")), + fasm_prefix(strings->intern_string("fasm_prefix")), + fasm_placeholders(strings->intern_string("fasm_placeholders")), + fasm_type(strings->intern_string("fasm_type")), + fasm_mux(strings->intern_string("fasm_mux")), is_flat_(is_flat){ } diff --git a/utils/fasm/test/test_fasm.cpp b/utils/fasm/test/test_fasm.cpp index 63767ccc1d1..990e2e1f649 100644 --- a/utils/fasm/test/test_fasm.cpp +++ b/utils/fasm/test/test_fasm.cpp @@ -277,8 +277,8 @@ TEST_CASE("fasm_integration_test", "[fasm]") { (size_t)inode, sink_inode, switch_id, - vtr::string_view("fasm_features"), - vtr::string_view(value.data(), value.size()), + "fasm_features", + value, device_ctx.arch); } } diff --git a/vpr/src/route/rr_graph_generation/build_switchblocks.cpp b/vpr/src/route/rr_graph_generation/build_switchblocks.cpp index 86e8126ab4c..65c672140e9 100644 --- a/vpr/src/route/rr_graph_generation/build_switchblocks.cpp +++ b/vpr/src/route/rr_graph_generation/build_switchblocks.cpp @@ -126,11 +126,11 @@ */ #include +#include #include "vtr_assert.h" #include "vtr_memory.h" #include "vtr_log.h" -#include "vtr_string_view.h" #include "vpr_error.h" #include "vpr_types.h" @@ -182,7 +182,7 @@ struct t_wireconn_scratchpad { /************ Typedefs ************/ /* Used to get info about a given wire type based on the name */ -typedef vtr::flat_map t_wire_type_sizes; +typedef vtr::flat_map t_wire_type_sizes; /************ Function Declarations ************/ /** @@ -650,14 +650,14 @@ static t_wire_type_sizes count_wire_type_sizes(const t_chan_seg_details* channel int num_wires = 0; WireInfo wire_info; - vtr::string_view wire_type = channel[0].type_name(); + std::string_view wire_type = channel[0].type_name(); int length = channel[0].length(); int start = 0; t_wire_type_sizes wire_type_sizes; for (int iwire = 0; iwire < nodes_per_chan; iwire++) { - vtr::string_view new_type = channel[iwire].type_name(); + std::string_view new_type = channel[iwire].type_name(); int new_length = channel[iwire].length(); int new_start = iwire; if (new_type != wire_type) { @@ -700,7 +700,7 @@ static void get_switchpoint_wires(const DeviceGrid& grid, for (const t_wire_switchpoints& wire_switchpoints : wire_switchpoints_vec) { collected_wire_switchpoints.clear(); - auto wire_type = vtr::string_view(wire_switchpoints.segment_name); + std::string_view wire_type = wire_switchpoints.segment_name; const std::vector& points = wire_switchpoints.switchpoints; if (wire_type_sizes.find(wire_type) == wire_type_sizes.end()) { diff --git a/vpr/src/route/rr_graph_generation/rr_types.h b/vpr/src/route/rr_graph_generation/rr_types.h index ab8f4ffca68..a1059f530d9 100644 --- a/vpr/src/route/rr_graph_generation/rr_types.h +++ b/vpr/src/route/rr_graph_generation/rr_types.h @@ -1,9 +1,10 @@ #pragma once #include +#include + #include "rr_node_types.h" #include "vtr_ndmatrix.h" -#include "vtr_string_view.h" /* AA: This structure stores the track connections for each physical pin. Note that num_pins refers to the # of logical pins for a tile and * we use the relative x and y location (0...width and 0...height of the tile) and the side of that unit tile to locate the physical pin. @@ -143,10 +144,8 @@ class t_chan_seg_details { int index() const { return seg_detail_->index; } int abs_index() const { return seg_detail_->abs_index; } - const vtr::string_view type_name() const { - return vtr::string_view( - seg_detail_->type_name.data(), - seg_detail_->type_name.size()); + const std::string_view type_name() const { + return seg_detail_->type_name; } public: //Modifiers diff --git a/vpr/test/test_vpr.cpp b/vpr/test/test_vpr.cpp index 3f3b0588714..8ed11f809bc 100644 --- a/vpr/test/test_vpr.cpp +++ b/vpr/test/test_vpr.cpp @@ -26,11 +26,11 @@ TEST_CASE("read_arch_metadata", "[vpr]") { xml_read_arch(kArchFile, /*timing_enabled=*/false, &arch, physical_tile_types, logical_block_types); - auto type_str = arch.strings.intern_string(vtr::string_view("type")); - auto pb_type_type = arch.strings.intern_string(vtr::string_view("pb_type_type")); - auto single = arch.strings.intern_string(vtr::string_view("single")); - auto mode_str = arch.strings.intern_string(vtr::string_view("mode")); - auto interconnect_str = arch.strings.intern_string(vtr::string_view("interconnect")); + auto type_str = arch.strings.intern_string("type"); + auto pb_type_type = arch.strings.intern_string("pb_type_type"); + auto single = arch.strings.intern_string("single"); + auto mode_str = arch.strings.intern_string("mode"); + auto interconnect_str = arch.strings.intern_string("interconnect"); bool found_perimeter_meta = false; bool found_single_meta = false; @@ -153,8 +153,8 @@ TEST_CASE("read_rr_graph_metadata", "[vpr]") { sink_inode = size_t(rr_graph.edge_sink_node(RRNodeId(src_inode), 0)); switch_id = rr_graph.edge_switch(RRNodeId(src_inode), 0); - vpr::add_rr_node_metadata(rr_graph_builder.rr_node_metadata(), src_inode, vtr::string_view("node"), vtr::string_view("test node"), device_ctx.arch); - vpr::add_rr_edge_metadata(rr_graph_builder.rr_edge_metadata(), src_inode, sink_inode, switch_id, vtr::string_view("edge"), vtr::string_view("test edge"), device_ctx.arch); + vpr::add_rr_node_metadata(rr_graph_builder.rr_node_metadata(), src_inode, "node", "test node", device_ctx.arch); + vpr::add_rr_edge_metadata(rr_graph_builder.rr_edge_metadata(), src_inode, sink_inode, switch_id, "edge", "test edge", device_ctx.arch); write_rr_graph(&mutable_device_ctx.rr_graph_builder, &mutable_device_ctx.rr_graph, @@ -209,8 +209,8 @@ TEST_CASE("read_rr_graph_metadata", "[vpr]") { CHECK(device_ctx.rr_graph_builder.rr_node_metadata_size() == 1); CHECK(device_ctx.rr_graph_builder.rr_edge_metadata_size() == 1); - auto node = arch.strings.intern_string(vtr::string_view("node")); - auto edge = arch.strings.intern_string(vtr::string_view("edge")); + auto node = arch.strings.intern_string("node"); + auto edge = arch.strings.intern_string("edge"); for (const auto& node_meta : device_ctx.rr_graph.rr_node_metadata_data()) { CHECK(src_order[node_meta.first] == src_inode); From 328aa7eab2b69539f43ec82a628cd3bf1beceff0 Mon Sep 17 00:00:00 2001 From: Soheil Shahrouz Date: Wed, 24 Sep 2025 15:36:29 -0400 Subject: [PATCH 2/4] make format --- libs/libarchfpga/src/grid_types.h | 2 +- libs/libarchfpga/src/interposer_types.h | 6 +++--- libs/libarchfpga/src/read_xml_arch_file.cpp | 2 +- libs/libarchfpga/src/read_xml_arch_file_interposer.cpp | 2 +- vpr/src/analytical_place/full_legalizer.cpp | 2 +- vpr/src/analytical_place/full_legalizer.h | 2 +- vpr/src/base/vpr_types.h | 4 ++-- vpr/src/place/annealer.h | 4 ++-- vpr/src/route/overuse_report.cpp | 2 +- vpr/test/test_undefined_value.cpp | 2 +- 10 files changed, 14 insertions(+), 14 deletions(-) diff --git a/libs/libarchfpga/src/grid_types.h b/libs/libarchfpga/src/grid_types.h index 6c2afd769bc..9929efbac1c 100644 --- a/libs/libarchfpga/src/grid_types.h +++ b/libs/libarchfpga/src/grid_types.h @@ -131,4 +131,4 @@ struct t_grid_loc_def { enum class e_grid_def_type { AUTO, FIXED -}; \ No newline at end of file +}; diff --git a/libs/libarchfpga/src/interposer_types.h b/libs/libarchfpga/src/interposer_types.h index efdfa24be93..ad9a33b07c6 100644 --- a/libs/libarchfpga/src/interposer_types.h +++ b/libs/libarchfpga/src/interposer_types.h @@ -33,8 +33,8 @@ inline const std::unordered_map CHAR_INTERPOSER_DIM_ * */ struct t_interdie_wire_inf { - std::string sg_name; ///< Name of the scatter-gather pattern to be used for the interdie connection - std::string sg_link; ///< Name of the scatter-gather link to be used for the interdie connection + std::string sg_name; ///< Name of the scatter-gather pattern to be used for the interdie connection + std::string sg_link; ///< Name of the scatter-gather link to be used for the interdie connection /** * @brief * Contains starting and ending point (both inclusive) of scatter-gather instantiations and the increment/distance between the instantiations. @@ -43,7 +43,7 @@ struct t_interdie_wire_inf { * Locations defined by this offset definition define the starting point or the gathering point of the SG pattern. The end or scatter point of the SG pattern is defined by the sg_link. */ t_grid_loc_spec offset_definition; - int num; ///< Number of scatter-gather instantiations per switchblock location + int num; ///< Number of scatter-gather instantiations per switchblock location }; /** diff --git a/libs/libarchfpga/src/read_xml_arch_file.cpp b/libs/libarchfpga/src/read_xml_arch_file.cpp index 92cbb979b16..205e59df11a 100644 --- a/libs/libarchfpga/src/read_xml_arch_file.cpp +++ b/libs/libarchfpga/src/read_xml_arch_file.cpp @@ -2659,7 +2659,7 @@ static void process_block_type_locs(t_grid_def& grid_def, } t_interposer_cut_inf interposer_cut = parse_interposer_cut_tag(loc_spec_tag, loc_data); - + if ((interposer_cut.dim == e_interposer_cut_dim::X && interposer_cut.loc >= grid_def.height) || (interposer_cut.dim == e_interposer_cut_dim::Y && interposer_cut.loc >= grid_def.width)) { archfpga_throw(loc_data.filename_c_str(), loc_data.line(loc_spec_tag), "Interposer cut dimensions are outside of device bounds"); } diff --git a/libs/libarchfpga/src/read_xml_arch_file_interposer.cpp b/libs/libarchfpga/src/read_xml_arch_file_interposer.cpp index f5b9beba193..2faad0ef7a8 100644 --- a/libs/libarchfpga/src/read_xml_arch_file_interposer.cpp +++ b/libs/libarchfpga/src/read_xml_arch_file_interposer.cpp @@ -36,7 +36,7 @@ t_interposer_cut_inf parse_interposer_cut_tag(pugi::xml_node interposer_cut_tag, interdie_wire.offset_definition.start_expr = pugiutil::get_attribute(interdie_wire_tag, "offset_start", loc_data).as_string(); interdie_wire.offset_definition.end_expr = pugiutil::get_attribute(interdie_wire_tag, "offset_end", loc_data).as_string(); interdie_wire.offset_definition.incr_expr = pugiutil::get_attribute(interdie_wire_tag, "offset_increment", loc_data).as_string(); - + interdie_wire.num = pugiutil::get_attribute(interdie_wire_tag, "num", loc_data).as_int(); interposer.interdie_wires.push_back(interdie_wire); diff --git a/vpr/src/analytical_place/full_legalizer.cpp b/vpr/src/analytical_place/full_legalizer.cpp index 5861ea5598e..a5f42009fa6 100644 --- a/vpr/src/analytical_place/full_legalizer.cpp +++ b/vpr/src/analytical_place/full_legalizer.cpp @@ -1317,4 +1317,4 @@ void FullLegalizer::update_drawing_data_structures() { get_draw_state_vars()->refresh_graphic_resources_after_cluster_change(); } #endif -} \ No newline at end of file +} diff --git a/vpr/src/analytical_place/full_legalizer.h b/vpr/src/analytical_place/full_legalizer.h index 5e17f105371..da641dee42d 100644 --- a/vpr/src/analytical_place/full_legalizer.h +++ b/vpr/src/analytical_place/full_legalizer.h @@ -59,7 +59,7 @@ class FullLegalizer { * device grid and fixed blocks are observed. */ virtual void legalize(const PartialPlacement& p_placement) = 0; - + /// @brief Update drawing data structure for current placement void update_drawing_data_structures(); diff --git a/vpr/src/base/vpr_types.h b/vpr/src/base/vpr_types.h index 2f3e788e189..49e8bd438e5 100644 --- a/vpr/src/base/vpr_types.h +++ b/vpr/src/base/vpr_types.h @@ -972,8 +972,8 @@ enum class e_place_delta_delay_algorithm { * for the placer. */ enum class e_anneal_init_t_estimator { - COST_VARIANCE, ///pb_type->name; + const char* pb_type_name = get_pb_graph_node_from_pin_physical_num(physical_type, rr_graph.node_ptc_num(node_id))->pb_type->name; const t_pb_graph_pin* pb_pin = get_pb_pin_from_pin_physical_num(physical_type, rr_graph.node_ptc_num(node_id)); os << "Intra-Tile Pin - Port : " << pb_pin->port->name << " - PB Type : " << std::string(pb_type_name) << "\n"; } diff --git a/vpr/test/test_undefined_value.cpp b/vpr/test/test_undefined_value.cpp index ca28f6dcd40..8114610a0d3 100644 --- a/vpr/test/test_undefined_value.cpp +++ b/vpr/test/test_undefined_value.cpp @@ -5,4 +5,4 @@ // Make sure the 'unknown value' constants in VPR, LibArchFPGA and LibRRGraph are all equal to the same value (-1) // Ideally these values should be independent of each other, but since they might be compared with each other in // the project we enforce that they all have the same value. -static_assert(UNDEFINED == -1 && ARCH_FPGA_UNDEFINED_VAL == -1 && LIBRRGRAPH_UNDEFINED_VAL == -1, "The 'undefined value' constants in VPR, LibArchFPGA and LibRRGraph all must equal -1."); \ No newline at end of file +static_assert(UNDEFINED == -1 && ARCH_FPGA_UNDEFINED_VAL == -1 && LIBRRGRAPH_UNDEFINED_VAL == -1, "The 'undefined value' constants in VPR, LibArchFPGA and LibRRGraph all must equal -1."); From 6c61999c3aa3067a270b8b203d355e772d637372 Mon Sep 17 00:00:00 2001 From: Soheil Shahrouz Date: Wed, 24 Sep 2025 16:21:29 -0400 Subject: [PATCH 3/4] avoid creating a string from string_view in t_formula_data::get_var_value() --- libs/libvtrutil/src/vtr_expr_eval.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/libs/libvtrutil/src/vtr_expr_eval.h b/libs/libvtrutil/src/vtr_expr_eval.h index 65e34776668..15e8211e2a3 100644 --- a/libs/libvtrutil/src/vtr_expr_eval.h +++ b/libs/libvtrutil/src/vtr_expr_eval.h @@ -13,14 +13,14 @@ /** * @file - * @brief This file implements an expressopn evaluator + * @brief This file implements an expression evaluator * * The expression evaluator is capable of performing many operations on given variables, * after parsing the expression. The parser goes character by character and identifies * the type of char or chars. (e.g bracket, comma, number, operator, variable). * The supported operations include addition, subtraction, multiplication, division, * finding max, min, gcd, lcm, as well as boolean operators such as &&, ||, ==, >=, <= etc. - * The result is returned as an int value and operation precedance is taken into account. + * The result is returned as an int value and operation precedence is taken into account. * (e.g given 3-2*4, the result will be -5). This class is also used to parse expressions * indicating breakpoints. The breakpoint expressions consist of variable names such as * move_num, temp_num, from_block etc, and boolean operators (e.g move_num == 3). @@ -46,12 +46,11 @@ class t_formula_data { ///@brief set the value of a specific part of the formula void set_var_value(std::string_view var, int value) { vars_[var] = value; } - ///@brief get the value of a specific part of the formula (the var can be c-style string) + ///@brief get the value of a specific part of the formula. int get_var_value(std::string_view var) const { auto iter = vars_.find(var); if (iter == vars_.end()) { - std::string copy(var.data(), var.size()); - throw vtr::VtrError(vtr::string_fmt("No value found for variable '%s' from expression\n", copy.c_str()), __FILE__, __LINE__); + throw vtr::VtrError(vtr::string_fmt("No value found for variable '%s' from expression\n", var.data()), __FILE__, __LINE__); } return iter->second; From dd13895a8404ab1b0c1291f0da9f9eb1c112a6d4 Mon Sep 17 00:00:00 2001 From: Soheil Shahrouz Date: Wed, 24 Sep 2025 16:22:57 -0400 Subject: [PATCH 4/4] pass an std::string to string_view instead of pointer and size --- libs/libvtrutil/src/vtr_expr_eval.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/libs/libvtrutil/src/vtr_expr_eval.cpp b/libs/libvtrutil/src/vtr_expr_eval.cpp index a3bb335d730..c8185bf8d4b 100644 --- a/libs/libvtrutil/src/vtr_expr_eval.cpp +++ b/libs/libvtrutil/src/vtr_expr_eval.cpp @@ -315,12 +315,9 @@ static void get_formula_object(const char* ch, int& ichar, const t_formula_data& } } else if (!is_breakpoint) { - //A number + // A number fobj->type = E_FML_NUMBER; - fobj->data.num = mydata.get_var_value( - std::string_view( - var_name.data(), - var_name.size())); + fobj->data.num = mydata.get_var_value(var_name); } else if (is_variable(var_name)) { fobj->type = E_FML_VARIABLE; if (same_string(var_name, "temp_count"))