Restrict RTLIL::IdString to not contain whitespace or control chars.
authorwhitequark <whitequark@whitequark.org>
Wed, 27 May 2020 05:20:39 +0000 (05:20 +0000)
committerwhitequark <whitequark@whitequark.org>
Fri, 29 May 2020 06:43:18 +0000 (06:43 +0000)
This is an existing invariant (most backends can't cope with these)
but one that was not checked or documented.

kernel/rtlil.h
manual/CHAPTER_Overview.tex

index 11c45bbec77904615e85d669cfd5b2a181fb1bcb..898c54a3a0d7d2c5f4bbb2dcc188477722f5a946 100644 (file)
@@ -150,9 +150,6 @@ namespace RTLIL
                        if (!p[0])
                                return 0;
 
-                       log_assert(p[0] == '$' || p[0] == '\\');
-                       log_assert(p[1] != 0);
-
                        auto it = global_id_index_.find((char*)p);
                        if (it != global_id_index_.end()) {
                #ifndef YOSYS_NO_IDS_REFCNT
@@ -165,6 +162,11 @@ namespace RTLIL
                                return it->second;
                        }
 
+                       log_assert(p[0] == '$' || p[0] == '\\');
+                       log_assert(p[1] != 0);
+                       for (const char *c = p; *c; c++)
+                               log_assert((unsigned)*c > (unsigned)' ');
+
                #ifndef YOSYS_NO_IDS_REFCNT
                        if (global_free_idx_list_.empty()) {
                                if (global_id_storage_.empty()) {
index be37d8d39c5490a694db8d6a8c19b26978d6f1f3..ac0f48e47aa9664a44c4ddb29164758261afd2f2 100644 (file)
@@ -184,9 +184,12 @@ may hold important information for Yosys developers can be used without
 disturbing external tools. For example the Verilog backend assigns names in the form {\tt \_{\it integer}\_}.
 \end{itemize}
 
-In order to avoid programming errors, the RTLIL data structures check if all
-identifiers start with either a backslash or a dollar sign and generate a
-runtime error if this rule is violated.
+Whitespace and control characters (any character with an ASCII code 32 or less) are not allowed
+in RTLIL identifiers; most frontends and backends cannot support these characters in identifiers.
+
+In order to avoid programming errors, the RTLIL data structures check if all identifiers start
+with either a backslash or a dollar sign, and contain no whitespace or control characters.
+Violating these rules results in a runtime error.
 
 All RTLIL identifiers are case sensitive.