// DESCRIPTION: Verilator: Test symbol table scope map and general public
// signal reflection
//
// This file ONLY is placed under the Creative Commons Public Domain.
// SPDX-FileCopyrightText: 2015 Todd Strader
// SPDX-License-Identifier: CC0-1.0

module t (
    input wire CLK
);

  foo #(.WIDTH(1)) foo1 (.*);
  foo #(.WIDTH(7)) foo7 (.*);
  foo #(.WIDTH(8)) foo8 (.*);
  foo #(.WIDTH(32)) foo32 (.*);
  foo #(.WIDTH(33)) foo33 (.*);
  foo #(.WIDTH(40)) foo40 (.*);
  foo #(.WIDTH(41)) foo41 (.*);
  foo #(.WIDTH(64)) foo64 (.*);
  foo #(.WIDTH(65)) foo65 (.*);
  foo #(.WIDTH(96)) foo96 (.*);
  foo #(.WIDTH(97)) foo97 (.*);
  foo #(.WIDTH(128)) foo128 (.*);
  foo #(.WIDTH(256)) foo256 (.*);
  foo #(.WIDTH(1024)) foo1024 (.*);
  bar #(.WIDTH(1024)) bar1024 (.*);

endmodule

module foo #(
    parameter WIDTH = 32
) (
    input CLK
);

  logic [( ( WIDTH + 7 ) / 8 ) * 8 - 1 : 0] initial_value;
  logic [WIDTH - 1 : 0] value_q  /* verilator public */;
  integer i;

  initial begin
    initial_value = '1;

    for (i = 0; i < WIDTH / 8; i++) initial_value[i*8+:8] = i[7 : 0];

    value_q = initial_value[WIDTH-1 : 0];
  end

  always @(posedge CLK) value_q <= ~value_q;

endmodule

module bar #(
    parameter WIDTH = 32
) (
    input CLK
);

  foo #(.WIDTH(WIDTH)) foo (.*);

endmodule
