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

// verilator lint_off NORETURN
class c0 #(
    type T = real
);
  static function T f();
  endfunction
endclass
class c2 #(
    type REQ = int,
    type RSP = int,
    type IMP = int
);
  function new(IMP imp);
  endfunction
endclass
class c3 #(
    type REQ,
    type RSP,
    type IMP = RSP
);
  function new(IMP imp);
  endfunction
endclass

class c1 #(
    type REQ = int,
    RSP = REQ
);
  typedef c1#(REQ, RSP) this_type;
  typedef c0#(this_type) type_id;
  c2 #(REQ, RSP, this_type) c2inst;
  function new(string name, int parent);
    c2inst = new(this);
  endfunction

  c3 #(REQ, this_type) c3inst;
endclass

`define test \
c1 #(real) c1inst1;\
c1 #(real, real) c1inst2;\
c1 #(real, int) c1inst3;\
c1 #() c1inst4;\
c1 c1inst5;

`test
interface interf;
  // `test
endinterface
module t;
  // `test
  interf interf_inst ();
endmodule
class topc;
  // `test
endclass

class paramcl;
endclass : paramcl
class c5;
  c1 #(paramcl) seq;
  function void f();
    seq = c1#(paramcl)::type_id::f();
  endfunction : f
endclass
c5 c5inst;
