From 33c2246311ab2c59a84ac71eb5187c6b06ac12d8 Mon Sep 17 00:00:00 2001 From: Catherine Date: Thu, 31 Aug 2023 20:33:35 +0000 Subject: [PATCH] back.{verilog,rtlil}: in `convert()`, accept a `Component` without ports. Closes #883. --- amaranth/back/rtlil.py | 14 +++++++++++++- amaranth/back/verilog.py | 16 ++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/amaranth/back/rtlil.py b/amaranth/back/rtlil.py index c6fefcd..685bbf3 100644 --- a/amaranth/back/rtlil.py +++ b/amaranth/back/rtlil.py @@ -6,6 +6,7 @@ import re from .._utils import bits_for, flatten from ..hdl import ast, ir, mem, xfrm +from ..lib import wiring __all__ = ["convert", "convert_fragment"] @@ -1003,7 +1004,18 @@ def convert_fragment(fragment, name="top", *, emit_src=True): return str(builder), name_map -def convert(elaboratable, name="top", platform=None, *, ports, emit_src=True, **kwargs): +def convert(elaboratable, name="top", platform=None, *, ports=None, emit_src=True, **kwargs): + if (ports is None and + hasattr(elaboratable, "signature") and + isinstance(elaboratable.signature, wiring.Signature)): + ports = [] + for path, member, value in elaboratable.signature.flatten(elaboratable): + if isinstance(value, ast.ValueCastable): + value = value.as_value() + if isinstance(value, ast.Value): + ports.append(value) + elif ports is None: + raise TypeError("The `convert()` function requires a `ports=` argument") fragment = ir.Fragment.get(elaboratable, platform).prepare(ports=ports, **kwargs) il_text, name_map = convert_fragment(fragment, name, emit_src=emit_src) return il_text diff --git a/amaranth/back/verilog.py b/amaranth/back/verilog.py index b6425ea..6a9c247 100644 --- a/amaranth/back/verilog.py +++ b/amaranth/back/verilog.py @@ -1,7 +1,8 @@ import warnings from .._toolchain.yosys import * -from ..hdl import ir +from ..hdl import ast, ir +from ..lib import wiring from . import rtlil @@ -45,8 +46,19 @@ def convert_fragment(*args, strip_internal_attrs=False, **kwargs): return _convert_rtlil_text(rtlil_text, strip_internal_attrs=strip_internal_attrs), name_map -def convert(elaboratable, name="top", platform=None, *, ports, emit_src=True, +def convert(elaboratable, name="top", platform=None, *, ports=None, emit_src=True, strip_internal_attrs=False, **kwargs): + if (ports is None and + hasattr(elaboratable, "signature") and + isinstance(elaboratable.signature, wiring.Signature)): + ports = [] + for path, member, value in elaboratable.signature.flatten(elaboratable): + if isinstance(value, ast.ValueCastable): + value = value.as_value() + if isinstance(value, ast.Value): + ports.append(value) + elif ports is None: + raise TypeError("The `convert()` function requires a `ports=` argument") fragment = ir.Fragment.get(elaboratable, platform).prepare(ports=ports, **kwargs) verilog_text, name_map = convert_fragment(fragment, name, emit_src=emit_src, strip_internal_attrs=strip_internal_attrs) return verilog_text