back.rtlil,cli: allow suppressing generation of src attributes.

Fixes #572.
This commit is contained in:
whitequark 2021-12-11 11:38:40 +00:00
parent 66295fa388
commit fd7d01ef10
2 changed files with 25 additions and 14 deletions

View file

@ -95,6 +95,10 @@ class _ProxiedBuilder:
class _AttrBuilder: class _AttrBuilder:
def __init__(self, emit_src, *args, **kwargs):
super().__init__(*args, **kwargs)
self.emit_src = emit_src
def _attribute(self, name, value, *, indent=0): def _attribute(self, name, value, *, indent=0):
self._append("{}attribute \\{} {}\n", self._append("{}attribute \\{} {}\n",
" " * indent, name, _const(value)) " " * indent, name, _const(value))
@ -102,19 +106,23 @@ class _AttrBuilder:
def _attributes(self, attrs, *, src=None, **kwargs): def _attributes(self, attrs, *, src=None, **kwargs):
for name, value in attrs.items(): for name, value in attrs.items():
self._attribute(name, value, **kwargs) self._attribute(name, value, **kwargs)
if src: if src and self.emit_src:
self._attribute("src", src, **kwargs) self._attribute("src", src, **kwargs)
class _Builder(_Namer, _BufferedBuilder): class _Builder(_BufferedBuilder, _Namer):
def __init__(self, emit_src):
super().__init__()
self.emit_src = emit_src
def module(self, name=None, attrs={}): def module(self, name=None, attrs={}):
name = self._make_name(name, local=False) name = self._make_name(name, local=False)
return _ModuleBuilder(self, name, attrs) return _ModuleBuilder(self, name, attrs)
class _ModuleBuilder(_Namer, _BufferedBuilder, _AttrBuilder): class _ModuleBuilder(_AttrBuilder, _BufferedBuilder, _Namer):
def __init__(self, rtlil, name, attrs): def __init__(self, rtlil, name, attrs):
super().__init__() super().__init__(emit_src=rtlil.emit_src)
self.rtlil = rtlil self.rtlil = rtlil
self.name = name self.name = name
self.attrs = {"generator": "Amaranth"} self.attrs = {"generator": "Amaranth"}
@ -181,9 +189,9 @@ class _ModuleBuilder(_Namer, _BufferedBuilder, _AttrBuilder):
return _ProcessBuilder(self, name, attrs, src) return _ProcessBuilder(self, name, attrs, src)
class _ProcessBuilder(_BufferedBuilder, _AttrBuilder): class _ProcessBuilder(_AttrBuilder, _BufferedBuilder):
def __init__(self, rtlil, name, attrs, src): def __init__(self, rtlil, name, attrs, src):
super().__init__() super().__init__(emit_src=rtlil.emit_src)
self.rtlil = rtlil self.rtlil = rtlil
self.name = name self.name = name
self.attrs = {} self.attrs = {}
@ -223,8 +231,9 @@ class _CaseBuilder(_ProxiedBuilder):
return _SwitchBuilder(self.rtlil, cond, attrs, src, self.indent) return _SwitchBuilder(self.rtlil, cond, attrs, src, self.indent)
class _SwitchBuilder(_ProxiedBuilder, _AttrBuilder): class _SwitchBuilder(_AttrBuilder, _ProxiedBuilder):
def __init__(self, rtlil, cond, attrs, src, indent): def __init__(self, rtlil, cond, attrs, src, indent):
super().__init__(emit_src=rtlil.emit_src)
self.rtlil = rtlil self.rtlil = rtlil
self.cond = cond self.cond = cond
self.attrs = attrs self.attrs = attrs
@ -1015,15 +1024,15 @@ def _convert_fragment(builder, fragment, name_map, hierarchy):
return module.name, port_map return module.name, port_map
def convert_fragment(fragment, name="top"): def convert_fragment(fragment, name="top", *, emit_src=True):
assert isinstance(fragment, ir.Fragment) assert isinstance(fragment, ir.Fragment)
builder = _Builder() builder = _Builder(emit_src=emit_src)
name_map = ast.SignalDict() name_map = ast.SignalDict()
_convert_fragment(builder, fragment, name_map, hierarchy=(name,)) _convert_fragment(builder, fragment, name_map, hierarchy=(name,))
return str(builder), name_map return str(builder), name_map
def convert(elaboratable, name="top", platform=None, **kwargs): def convert(elaboratable, name="top", platform=None, *, emit_src=True, **kwargs):
fragment = ir.Fragment.get(elaboratable, platform).prepare(**kwargs) fragment = ir.Fragment.get(elaboratable, platform).prepare(**kwargs)
il_text, name_map = convert_fragment(fragment, name) il_text, name_map = convert_fragment(fragment, name, emit_src=emit_src)
return il_text return il_text

View file

@ -19,6 +19,8 @@ def main_parser(parser=None):
p_generate.add_argument("-t", "--type", dest="generate_type", p_generate.add_argument("-t", "--type", dest="generate_type",
metavar="LANGUAGE", choices=["il", "cc", "v"], metavar="LANGUAGE", choices=["il", "cc", "v"],
help="generate LANGUAGE (il for RTLIL, v for Verilog, cc for CXXRTL; default: file extension of FILE, if given)") help="generate LANGUAGE (il for RTLIL, v for Verilog, cc for CXXRTL; default: file extension of FILE, if given)")
p_generate.add_argument("--no-src", dest="emit_src", default=True, action="store_false",
help="suppress generation of source location attributes")
p_generate.add_argument("generate_file", p_generate.add_argument("generate_file",
metavar="FILE", type=argparse.FileType("w"), nargs="?", metavar="FILE", type=argparse.FileType("w"), nargs="?",
help="write generated code to FILE") help="write generated code to FILE")
@ -55,11 +57,11 @@ def main_runner(parser, args, design, platform=None, name="top", ports=()):
if generate_type is None: if generate_type is None:
parser.error("Unable to auto-detect language, specify explicitly with -t/--type") parser.error("Unable to auto-detect language, specify explicitly with -t/--type")
if generate_type == "il": if generate_type == "il":
output = rtlil.convert(fragment, name=name, ports=ports) output = rtlil.convert(fragment, name=name, ports=ports, emit_src=args.emit_src)
if generate_type == "cc": if generate_type == "cc":
output = cxxrtl.convert(fragment, name=name, ports=ports) output = cxxrtl.convert(fragment, name=name, ports=ports, emit_src=args.emit_src)
if generate_type == "v": if generate_type == "v":
output = verilog.convert(fragment, name=name, ports=ports) output = verilog.convert(fragment, name=name, ports=ports, emit_src=args.emit_src)
if args.generate_file: if args.generate_file:
args.generate_file.write(output) args.generate_file.write(output)
else: else: