| #include "fasm_utils.h" |
| #include "vpr_utils.h" |
| |
| #include <regex> |
| |
| namespace fasm { |
| |
| void parse_name_with_optional_index(const std::string in, std::string *name, int *index) { |
| auto in_parts = vtr::split(in, "[]"); |
| |
| if(in_parts.size() == 1) { |
| *name = in; |
| *index = 0; |
| } else if(in_parts.size() == 2) { |
| *name = in_parts[0]; |
| *index = vtr::atoi(in_parts[1]); |
| } else { |
| vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, |
| "Cannot parse %s.", in.c_str()); |
| } |
| } |
| |
| std::vector<std::string> split_fasm_entry(std::string entry, |
| std::string delims, |
| std::string ignore) { |
| for (size_t ii=0; ii<entry.length(); ii++) { |
| while (ignore.find(entry[ii]) != std::string::npos) { |
| entry.erase(ii, 1); |
| } |
| } |
| |
| return vtr::split(entry, delims); |
| } |
| |
| std::vector<std::string> find_tags_in_feature (const std::string& a_String) { |
| const std::regex regex ("(\\{[a-zA-Z0-9_]+\\})"); |
| |
| std::vector<std::string> tags; |
| std::string str(a_String); |
| std::smatch match; |
| |
| // Search for tags |
| while (std::regex_search(str, match, regex)) { |
| std::string tag(match.str()); |
| |
| // Strip braces |
| tags.push_back(tag.substr(1, tag.length()-2)); |
| str = match.suffix().str(); |
| } |
| |
| return tags; |
| } |
| |
| std::string substitute_tags (const std::string& a_Feature, const std::map<const std::string, std::string>& a_Tags) { |
| |
| // First list tags that are given in the feature string |
| auto tags = find_tags_in_feature(a_Feature); |
| if (tags.empty()) { |
| return a_Feature; |
| } |
| |
| // Check if those tags are defined, If not then throw an error |
| bool have_errors = false; |
| for (auto tag: tags) { |
| if (a_Tags.count(tag) == 0) { |
| vtr::printf_error(__FILE__, __LINE__, "fasm placeholder '%s' not defined!", tag.c_str()); |
| have_errors = true; |
| } |
| } |
| |
| if (have_errors) { |
| vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, |
| "fasm feature '%s' contains placeholders that are not defined for the tile that it is used in!", |
| a_Feature.c_str() |
| ); |
| } |
| |
| // Substitute tags |
| std::string feature(a_Feature); |
| for (auto tag: tags) { |
| std::regex regex("\\{" + tag + "\\}"); |
| feature = std::regex_replace(feature, regex, a_Tags.at(tag)); |
| } |
| |
| return feature; |
| } |
| |
| } // namespace fasm |