functional backends: identifiers in c++/smtlib may not start with digits

This commit is contained in:
Emily Schmidt 2024-08-27 13:10:34 +01:00
parent 459e6b913a
commit b428bf4600
3 changed files with 6 additions and 6 deletions

View File

@ -48,8 +48,8 @@ template<typename Id> struct CxxScope : public Functional::Scope<Id> {
for(const char **p = reserved_keywords; *p != nullptr; p++) for(const char **p = reserved_keywords; *p != nullptr; p++)
this->reserve(*p); this->reserve(*p);
} }
bool is_character_legal(char c) override { bool is_character_legal(char c, int index) override {
return isascii(c) && (isalnum(c) || c == '_' || c == '$'); return isascii(c) && (isalpha(c) || (isdigit(c) && index > 0) || c == '_' || c == '$');
} }
}; };

View File

@ -48,8 +48,8 @@ struct SmtScope : public Functional::Scope<int> {
for(const char **p = reserved_keywords; *p != nullptr; p++) for(const char **p = reserved_keywords; *p != nullptr; p++)
reserve(*p); reserve(*p);
} }
bool is_character_legal(char c) override { bool is_character_legal(char c, int index) override {
return isascii(c) && (isalnum(c) || strchr("~!@$%^&*_-+=<>.?/", c)); return isascii(c) && (isalpha(c) || (isdigit(c) && index > 0) || strchr("~!@$%^&*_-+=<>.?/", c));
} }
}; };

View File

@ -576,7 +576,7 @@ namespace Functional {
template<class Id> class Scope { template<class Id> class Scope {
protected: protected:
char substitution_character = '_'; char substitution_character = '_';
virtual bool is_character_legal(char) = 0; virtual bool is_character_legal(char, int) = 0;
private: private:
pool<std::string> _used_names; pool<std::string> _used_names;
dict<Id, std::string> _by_id; dict<Id, std::string> _by_id;
@ -587,7 +587,7 @@ namespace Functional {
std::string unique_name(IdString suggestion) { std::string unique_name(IdString suggestion) {
std::string str = RTLIL::unescape_id(suggestion); std::string str = RTLIL::unescape_id(suggestion);
for(size_t i = 0; i < str.size(); i++) for(size_t i = 0; i < str.size(); i++)
if(!is_character_legal(str[i])) if(!is_character_legal(str[i], i))
str[i] = substitution_character; str[i] = substitution_character;
if(_used_names.count(str) == 0) { if(_used_names.count(str) == 0) {
_used_names.insert(str); _used_names.insert(str);