back.rtlil: properly escape strings in attributes.
This commit is contained in:
		
							parent
							
								
									41d69c3ad7
								
							
						
					
					
						commit
						635094350f
					
				|  | @ -26,6 +26,13 @@ class _Namer: | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class _Bufferer: | class _Bufferer: | ||||||
|  |     _escape_map = str.maketrans({ | ||||||
|  |         "\"": "\\\"", | ||||||
|  |         "\\": "\\\\", | ||||||
|  |         "\t": "\\t", | ||||||
|  |         "\r": "\\r", | ||||||
|  |         "\n": "\\n", | ||||||
|  |     }) | ||||||
|     def __init__(self): |     def __init__(self): | ||||||
|         super().__init__() |         super().__init__() | ||||||
|         self._buffer = io.StringIO() |         self._buffer = io.StringIO() | ||||||
|  | @ -36,9 +43,17 @@ class _Bufferer: | ||||||
|     def _append(self, fmt, *args, **kwargs): |     def _append(self, fmt, *args, **kwargs): | ||||||
|         self._buffer.write(fmt.format(*args, **kwargs)) |         self._buffer.write(fmt.format(*args, **kwargs)) | ||||||
| 
 | 
 | ||||||
|  |     def attribute(self, name, value, indent=0): | ||||||
|  |         if isinstance(value, str): | ||||||
|  |             self._append("{}attribute \\{} \"{}\"\n", | ||||||
|  |                          "  " * indent, name, value.translate(self._escape_map)) | ||||||
|  |         else: | ||||||
|  |             self._append("{}attribute \\{} {}\n", | ||||||
|  |                          "  " * indent, name, int(value)) | ||||||
|  | 
 | ||||||
|     def _src(self, src): |     def _src(self, src): | ||||||
|         if src: |         if src: | ||||||
|             self._append("  attribute \\src \"{}\"\n", src.replace("\"", "\\\"")) |             self.attribute("src", src) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class _Builder(_Namer, _Bufferer): | class _Builder(_Namer, _Bufferer): | ||||||
|  | @ -57,10 +72,7 @@ class _ModuleBuilder(_Namer, _Bufferer): | ||||||
| 
 | 
 | ||||||
|     def __enter__(self): |     def __enter__(self): | ||||||
|         for name, value in self.attrs.items(): |         for name, value in self.attrs.items(): | ||||||
|             if isinstance(value, str): |             self.attribute(name, value, indent=0) | ||||||
|                 self._append("attribute \\{} \"{}\"\n", name, value.replace("\"", "\\\"")) |  | ||||||
|             else: |  | ||||||
|                 self._append("attribute \\{} {}\n", name, int(value)) |  | ||||||
|         self._append("module {}\n", self.name) |         self._append("module {}\n", self.name) | ||||||
|         return self |         return self | ||||||
| 
 | 
 | ||||||
|  | @ -68,11 +80,8 @@ class _ModuleBuilder(_Namer, _Bufferer): | ||||||
|         self._append("end\n") |         self._append("end\n") | ||||||
|         self.rtlil._buffer.write(str(self)) |         self.rtlil._buffer.write(str(self)) | ||||||
| 
 | 
 | ||||||
|     def attribute(self, name, value): |     def attribute(self, name, value, indent=1): | ||||||
|         if isinstance(value, str): |         super().attribute(name, value, indent) | ||||||
|             self._append("  attribute \\{} \"{}\"\n", name, value.replace("\"", "\\\"")) |  | ||||||
|         else: |  | ||||||
|             self._append("  attribute \\{} {}\n", name, int(value)) |  | ||||||
| 
 | 
 | ||||||
|     def wire(self, width, port_id=None, port_kind=None, name=None, src=""): |     def wire(self, width, port_id=None, port_kind=None, name=None, src=""): | ||||||
|         self._src(src) |         self._src(src) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 whitequark
						whitequark