// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain.
// SPDX-FileCopyrightText: 2015 Johan Bjork
// SPDX-License-Identifier: CC0-1.0

interface intf;
  logic logic_in_intf;
  modport source(output logic_in_intf);
  modport sink(input logic_in_intf);
endinterface

module modify_interface (
    input logic value,
    intf.source intf_inst
);
  assign intf_inst.logic_in_intf = value;
endmodule

function integer return_3();
  return 3;
endfunction

module t #(
    parameter N = 6
) ();
  intf ifs[N-1:0] ();
  logic [N-1:0] data;
  assign data = {1'b0, 1'b1, 1'b0, 1'b1, 1'b0, 1'b1};

  generate
    genvar i;
    for (i = 0; i < 3; i++) begin
      assign ifs[i].logic_in_intf = data[i];
    end
  endgenerate
  // verilator lint_off SIDEEFFECT
  modify_interface m3 (
      .value(data[return_3()]),
      .intf_inst(ifs[return_3()])
  );
  // verilator lint_on SIDEEFFECT

  modify_interface m4 (
      .value(data[4]),
      .intf_inst(ifs[4])
  );

  modify_interface m5 (
      .value(~ifs[4].logic_in_intf),
      .intf_inst(ifs[5])
  );

  generate
    genvar j;
    for (j = 0; j < N - 1; j++) begin
      initial begin
        #1;
        if (ifs[j].logic_in_intf != data[j]) $stop;
      end
    end
  endgenerate

  initial begin
    #1;
    if (ifs[5].logic_in_intf != ~ifs[4].logic_in_intf) $stop;
    $write("*-* All Finished *-*\n");
    $finish;
  end
endmodule
