// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: https://codemirror.net/LICENSE ;(function () { var mode = CodeMirror.getMode({ indentUnit: 4 }, 'verilog') function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)) } MT( 'binary_literals', "[number 1'b0]", "[number 1'b1]", "[number 1'bx]", "[number 1'bz]", "[number 1'bX]", "[number 1'bZ]", "[number 1'B0]", "[number 1'B1]", "[number 1'Bx]", "[number 1'Bz]", "[number 1'BX]", "[number 1'BZ]", "[number 1'b0]", "[number 1'b1]", "[number 2'b01]", "[number 2'bxz]", "[number 2'b11]", "[number 2'b10]", "[number 2'b1Z]", "[number 12'b0101_0101_0101]", "[number 1'b 0]", "[number 'b0101]" ) MT('octal_literals', "[number 3'o7]", "[number 3'O7]", "[number 3'so7]", "[number 3'SO7]") MT( 'decimal_literals', '[number 0]', '[number 1]', '[number 7]', '[number 123_456]', "[number 'd33]", "[number 8'd255]", "[number 8'D255]", "[number 8'sd255]", "[number 8'SD255]", "[number 32'd123]", "[number 32 'd123]", "[number 32 'd 123]" ) MT( 'hex_literals', "[number 4'h0]", "[number 4'ha]", "[number 4'hF]", "[number 4'hx]", "[number 4'hz]", "[number 4'hX]", "[number 4'hZ]", "[number 32'hdc78]", "[number 32'hDC78]", "[number 32 'hDC78]", "[number 32'h DC78]", "[number 32 'h DC78]", "[number 32'h44x7]", "[number 32'hFFF?]" ) MT( 'real_number_literals', '[number 1.2]', '[number 0.1]', '[number 2394.26331]', '[number 1.2E12]', '[number 1.2e12]', '[number 1.30e-2]', '[number 0.1e-0]', '[number 23E10]', '[number 29E-2]', '[number 236.123_763_e-12]' ) MT('operators', '[meta ^]') MT('keywords', '[keyword logic]', '[keyword logic] [variable foo]', '[keyword reg] [variable abc]') MT('variables', '[variable _leading_underscore]', '[variable _if]', '[number 12] [variable foo]', '[variable foo] [number 14]') MT('tick_defines', '[def `FOO]', '[def `foo]', '[def `FOO_bar]') MT('system_calls', '[meta $display]', '[meta $vpi_printf]') MT('line_comment', '[comment // Hello world]') // Alignment tests MT( 'align_port_map_style1', /** * mod mod(.a(a), * .b(b) * ); */ '[variable mod] [variable mod][bracket (].[variable a][bracket (][variable a][bracket )],', ' .[variable b][bracket (][variable b][bracket )]', ' [bracket )];', '' ) MT( 'align_port_map_style2', /** * mod mod( * .a(a), * .b(b) * ); */ '[variable mod] [variable mod][bracket (]', ' .[variable a][bracket (][variable a][bracket )],', ' .[variable b][bracket (][variable b][bracket )]', '[bracket )];', '' ) MT( 'align_assignments', /** * always @(posedge clk) begin * if (rst) * data_out <= 8'b0 + * 8'b1; * else * data_out = 8'b0 + * 8'b1; * data_out = * 8'b0 + 8'b1; * end */ '[keyword always] [def @][bracket (][keyword posedge] [variable clk][bracket )] [keyword begin]', ' [keyword if] [bracket (][variable rst][bracket )]', " [variable data_out] [meta <=] [number 8'b0] [meta +]", " [number 8'b1];", ' [keyword else]', " [variable data_out] [meta =] [number 8'b0] [meta +]", " [number 8'b1];", " [variable data_out] [meta =] [number 8'b0] [meta +]", " [number 8'b1];", '[keyword end]', '' ) // Indentation tests MT('indent_single_statement_if', '[keyword if] [bracket (][variable foo][bracket )]', ' [keyword break];', '') MT('no_indent_after_single_line_if', '[keyword if] [bracket (][variable foo][bracket )] [keyword break];', '') MT('indent_after_if_begin_same_line', '[keyword if] [bracket (][variable foo][bracket )] [keyword begin]', ' [keyword break];', ' [keyword break];', '[keyword end]', '') MT('indent_after_if_begin_next_line', '[keyword if] [bracket (][variable foo][bracket )]', ' [keyword begin]', ' [keyword break];', ' [keyword break];', ' [keyword end]', '') MT('indent_single_statement_if_else', '[keyword if] [bracket (][variable foo][bracket )]', ' [keyword break];', '[keyword else]', ' [keyword break];', '') MT( 'indent_if_else_begin_same_line', '[keyword if] [bracket (][variable foo][bracket )] [keyword begin]', ' [keyword break];', ' [keyword break];', '[keyword end] [keyword else] [keyword begin]', ' [keyword break];', ' [keyword break];', '[keyword end]', '' ) MT( 'indent_if_else_begin_next_line', '[keyword if] [bracket (][variable foo][bracket )]', ' [keyword begin]', ' [keyword break];', ' [keyword break];', ' [keyword end]', '[keyword else]', ' [keyword begin]', ' [keyword break];', ' [keyword break];', ' [keyword end]', '' ) MT( 'indent_if_nested_without_begin', '[keyword if] [bracket (][variable foo][bracket )]', ' [keyword if] [bracket (][variable foo][bracket )]', ' [keyword if] [bracket (][variable foo][bracket )]', ' [keyword break];', '' ) MT( 'indent_case', '[keyword case] [bracket (][variable state][bracket )]', ' [variable FOO]:', ' [keyword break];', ' [variable BAR]:', ' [keyword break];', '[keyword endcase]', '' ) MT('unindent_after_end_with_preceding_text', '[keyword begin]', ' [keyword break]; [keyword end]', '') MT('export_function_one_line_does_not_indent', '[keyword export] [string "DPI-C"] [keyword function] [variable helloFromSV];', '') MT('export_task_one_line_does_not_indent', '[keyword export] [string "DPI-C"] [keyword task] [variable helloFromSV];', '') MT('export_function_two_lines_indents_properly', '[keyword export]', ' [string "DPI-C"] [keyword function] [variable helloFromSV];', '') MT('export_task_two_lines_indents_properly', '[keyword export]', ' [string "DPI-C"] [keyword task] [variable helloFromSV];', '') MT('import_function_one_line_does_not_indent', '[keyword import] [string "DPI-C"] [keyword function] [variable helloFromC];', '') MT('import_task_one_line_does_not_indent', '[keyword import] [string "DPI-C"] [keyword task] [variable helloFromC];', '') MT('import_package_single_line_does_not_indent', '[keyword import] [variable p]::[variable x];', '[keyword import] [variable p]::[variable y];', '') MT( 'covergroup_with_function_indents_properly', '[keyword covergroup] [variable cg] [keyword with] [keyword function] [variable sample][bracket (][keyword bit] [variable b][bracket )];', ' [variable c] : [keyword coverpoint] [variable c];', '[keyword endgroup]: [variable cg]', '' ) MT( 'indent_uvm_macros', /** * `uvm_object_utils_begin(foo) * `uvm_field_event(foo, UVM_ALL_ON) * `uvm_object_utils_end */ '[def `uvm_object_utils_begin][bracket (][variable foo][bracket )]', ' [def `uvm_field_event][bracket (][variable foo], [variable UVM_ALL_ON][bracket )]', '[def `uvm_object_utils_end]', '' ) MT( 'indent_uvm_macros2', /** * `uvm_do_with(mem_read,{ * bar_nb == 0; * }) */ '[def `uvm_do_with][bracket (][variable mem_read],[bracket {]', ' [variable bar_nb] [meta ==] [number 0];', '[bracket })]', '' ) MT( 'indent_wait_disable_fork', /** * virtual task body(); * repeat (20) begin * fork * `uvm_create_on(t,p_seq) * join_none * end * wait fork; * disable fork; * endtask : body */ '[keyword virtual] [keyword task] [variable body][bracket ()];', ' [keyword repeat] [bracket (][number 20][bracket )] [keyword begin]', ' [keyword fork]', ' [def `uvm_create_on][bracket (][variable t],[variable p_seq][bracket )]', ' [keyword join_none]', ' [keyword end]', ' [keyword wait] [keyword fork];', ' [keyword disable] [keyword fork];', '[keyword endtask] : [variable body]', '' ) MT( 'indent_typedef_class', /** * typedef class asdf; * typedef p p_t[]; * typedef enum { * ASDF * } t; */ '[keyword typedef] [keyword class] [variable asdf];', '[keyword typedef] [variable p] [variable p_t][bracket [[]]];', '[keyword typedef] [keyword enum] [bracket {]', ' [variable ASDF]', '[bracket }] [variable t];', '' ) MT( 'indent_case_with_macro', /** * // It should be assumed that Macros can have ';' inside, or 'begin'/'end' blocks. * // As such, 'case' statement should indent correctly with macros inside. * case(foo) * ASDF : this.foo = seqNum; * ABCD : `update(f) * EFGH : `update(g) * endcase */ '[keyword case][bracket (][variable foo][bracket )]', ' [variable ASDF] : [keyword this].[variable foo] [meta =] [variable seqNum];', ' [variable ABCD] : [def `update][bracket (][variable f][bracket )]', ' [variable EFGH] : [def `update][bracket (][variable g][bracket )]', '[keyword endcase]', '' ) MT( 'indent_extern_function', /** * extern virtual function void do(ref packet trans); * extern virtual function void do2(ref packet trans); */ '[keyword extern] [keyword virtual] [keyword function] [keyword void] [variable do1][bracket (][keyword ref] [variable packet] [variable trans][bracket )];', '[keyword extern] [keyword virtual] [keyword function] [keyword void] [variable do2][bracket (][keyword ref] [variable packet] [variable trans][bracket )];', '' ) MT( 'indent_assignment', /** * for (int i=1;i < fun;i++) begin * foo = 2 << asdf || 11'h35 >> abcd * && 8'h6 | 1'b1; * end */ '[keyword for] [bracket (][keyword int] [variable i][meta =][number 1];[variable i] [meta <] [variable fun];[variable i][meta ++][bracket )] [keyword begin]', " [variable foo] [meta =] [number 2] [meta <<] [variable asdf] [meta ||] [number 11'h35] [meta >>] [variable abcd]", " [meta &&] [number 8'h6] [meta |] [number 1'b1];", '[keyword end]', '' ) MT( 'indent_foreach_constraint', /** * `uvm_rand_send_with(wrTlp, { * length ==1; * foreach (Data[i]) { * payload[i] == Data[i]; * } * }) */ '[def `uvm_rand_send_with][bracket (][variable wrTlp], [bracket {]', ' [variable length] [meta ==][number 1];', ' [keyword foreach] [bracket (][variable Data][bracket [[][variable i][bracket ]])] [bracket {]', ' [variable payload][bracket [[][variable i][bracket ]]] [meta ==] [variable Data][bracket [[][variable i][bracket ]]];', ' [bracket }]', '[bracket })]', '' ) MT( 'indent_compiler_directives', /** * `ifdef DUT * `else * `ifndef FOO * `define FOO * `endif * `endif * `timescale 1ns/1ns */ '[def `ifdef] [variable DUT]', '[def `else]', ' [def `ifndef] [variable FOO]', ' [def `define] [variable FOO]', ' [def `endif]', '[def `endif]', '[def `timescale] [number 1][variable ns][meta /][number 1][variable ns]', '' ) })()