back.rtlil,cli: allow suppressing generation of src
attributes.
Fixes #572.
This commit is contained in:
parent
66295fa388
commit
fd7d01ef10
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue