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