`define SHADOW \
    integer i; \
    Interface intfs[1:0]();

interface Interface;
    integer x;
    modport ModportA(input .x(x + 1));
    modport ModportB(input .x(x + 2));
endinterface

module ModuleA(intf);
    Interface intf;
    `SHADOW
    initial #1 $display("ModuleA got %0d", intf.x);
    ModuleN n(intf);
endmodule

module ModuleB(intf);
    Interface.ModportA intf;
    `SHADOW
    initial #1 $display("ModuleB got %0d", intf.x);
    ModuleN n(intf);
endmodule

module ModuleC(intf);
    Interface.ModportB intf;
    `SHADOW
    initial #1 $display("ModuleC got %0d", intf.x);
    ModuleN n(intf);
endmodule

module ModuleN(intf);
    Interface intf;
    `SHADOW
    initial #1 $display("ModuleN got %0d", intf.x);

    typedef struct packed {
        logic a, b;
    } Struct;
    Struct [1:0] structs;
    assign structs[1].a = structs[0].b;
    assign structs[0].a = structs[1].b;
endmodule

module top;
    Interface intfs[4:8]();
    `define LOOP for (genvar i = 4; i <= 8; ++i)
    `LOOP initial intfs[i].x = i ** 2;
    `LOOP ModuleA a1(intfs[i]);
    `LOOP ModuleA a2(intfs[i].ModportA);
    `LOOP ModuleA a3(intfs[i].ModportB);
    `LOOP ModuleB b1(intfs[i]);
    `LOOP ModuleB b2(intfs[i].ModportA);
    `LOOP ModuleC c1(intfs[i]);
    `LOOP ModuleC c2(intfs[i].ModportB);
endmodule