Skip to content

back.{verilog,rtlil}: in convert(), accept a Component without ports #886

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Sep 4, 2023

Conversation

whitequark
Copy link
Member

Fixes #883.
Depends on amaranth-lang/rfcs#25.

@codecov
Copy link

codecov bot commented Aug 31, 2023

Codecov Report

Merging #886 (bffaafc) into main (88cbf30) will decrease coverage by 0.12%.
Report is 7 commits behind head on main.
The diff coverage is 57.14%.

@@            Coverage Diff             @@
##             main     #886      +/-   ##
==========================================
- Coverage   83.90%   83.79%   -0.12%     
==========================================
  Files          53       54       +1     
  Lines        7588     7651      +63     
  Branches     1839     1860      +21     
==========================================
+ Hits         6367     6411      +44     
- Misses       1025     1042      +17     
- Partials      196      198       +2     
Files Changed Coverage Δ
amaranth/back/rtlil.py 77.88% <18.18%> (-1.09%) ⬇️
amaranth/back/verilog.py 52.38% <25.00%> (-13.25%) ⬇️
amaranth/lib/wiring.py 100.00% <100.00%> (ø)

... and 7 files with indirect coverage changes

📣 We’re building smart automated test selection to slash your CI/CD build times. Learn more

@whitequark whitequark added this to the 0.4 milestone Sep 1, 2023
@cr1901
Copy link
Contributor

cr1901 commented Sep 2, 2023

While testing this, I ran into some issues getting efbutils to compile. Consider the following MCVE:

from amaranth import Module, unsigned
from amaranth.lib.data import Union
from amaranth.lib.wiring import Signature, In, Out, Component, connect
from amaranth.back import verilog


class WriteData(Union):
    stream: unsigned(8)


SeqWriteStreamSignature = Signature({
    "data": Out(WriteData),
    "ready": In(1),
    "valid": Out(1)
})

SeqReadStreamSignature = Signature({
    "data": Out(8),
    "ready": In(1),
    "valid": Out(1)
})


class Wrapper(Component):
    wr: Out(SeqWriteStreamSignature)
    rd: In(SeqReadStreamSignature)

    def __init__(self, s):
        super().__init__()
        self.s = s

    def elaborate(self, plat):
        m = Module()

        m.submodules += self.s

        connect(m, self.s.wr, self.wr)
        connect(m, self.rd, self.s.rd)

        return m


class Inner(Component):
    wr: In(SeqWriteStreamSignature)
    rd: Out(SeqReadStreamSignature)

    def __init__(self):
        super().__init__()

    def elaborate(self, plat):
        m = Module()

        m.d.comb += [
            self.rd.data.eq(self.wr.data),
            self.wr.ready.eq(self.rd.ready),
            self.rd.valid.eq(self.wr.valid)
        ]

        return m


if __name__ == "__main__":
    s = Inner()
    m = Wrapper(s)

    print(verilog.convert(m))

This results in the following output:

/* Generated by Yosys 0.32+76 (git sha1 73cb4977b, sccache x86_64-w64-mingw32-g++ 13.2.0 -Os) */

(* \amaranth.hierarchy  = "top.U$$0" *)
(* generator = "Amaranth" *)
module \U$$0 (wr__ready, wr__valid, rd__data, rd__ready, rd__valid, wr__data);
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  output [7:0] rd__data;
  wire [7:0] rd__data;
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  input rd__ready;
  wire rd__ready;
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  output rd__valid;
  wire rd__valid;
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  input [7:0] wr__data;
  wire [7:0] wr__data;
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  output wr__ready;
  wire wr__ready;
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  input wr__valid;
  wire wr__valid;
  assign rd__valid = wr__valid;
  assign wr__ready = rd__ready;
  assign rd__data = wr__data;
endmodule

(* \amaranth.hierarchy  = "top" *)
(* top =  1  *)
(* generator = "Amaranth" *)
module top(rd__ready, rd__valid, wr__ready, wr__valid, rd__data);
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  wire [7:0] \U$$0_rd__data ;
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  wire \U$$0_rd__ready ;
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  wire \U$$0_rd__valid ;
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  wire [7:0] \U$$0_wr__data ;
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  wire \U$$0_wr__ready ;
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  wire \U$$0_wr__valid ;
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  output [7:0] rd__data;
  wire [7:0] rd__data;
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  input rd__ready;
  wire rd__ready;
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  output rd__valid;
  wire rd__valid;
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  wire [7:0] wr__data;
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  output wr__ready;
  wire wr__ready;
  (* src = "C:/msys64/home/William/Projects/FPGA/amaranth/amaranth/build/__editable__.amaranth-0.4.dev178+geda5669-py3-none-any/amaranth/lib/wiring.py:227" *)
  input wr__valid;
  wire wr__valid;
  \U$$0  \U$$0  (
    .rd__data(\U$$0_rd__data ),
    .rd__ready(\U$$0_rd__ready ),
    .rd__valid(\U$$0_rd__valid ),
    .wr__data(8'h00),
    .wr__ready(\U$$0_wr__ready ),
    .wr__valid(\U$$0_wr__valid )
  );
  assign wr__data = 8'h00;
  assign rd__valid = \U$$0_rd__valid ;
  assign \U$$0_rd__ready  = rd__ready;
  assign rd__data = \U$$0_rd__data ;
  assign \U$$0_wr__valid  = wr__valid;
  assign wr__ready = \U$$0_wr__ready ;
  assign \U$$0_wr__data  = 8'h00;
endmodule

Notice that the top-level port wr__data is missing/internally replaced with a constant assignment to 8'h00, but rd__data is not. wr__data was originally a Union, but rd__data was originally an unsigned shape.

@whitequark
Copy link
Member Author

@cr1901 Should be working now!

@cr1901
Copy link
Contributor

cr1901 commented Sep 3, 2023

Can confirm it's working on my end now, on the exact same commit :).

@whitequark
Copy link
Member Author

Thanks!

@whitequark whitequark marked this pull request as ready for review September 4, 2023 19:05
@whitequark whitequark added this pull request to the merge queue Sep 4, 2023
Merged via the queue into amaranth-lang:main with commit 33c2246 Sep 4, 2023
@whitequark whitequark deleted the implement-883 branch September 4, 2023 19:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

Infer Verilog ports on Interface objects
2 participants