You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
443 lines
12 KiB
443 lines
12 KiB
// 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]", |
|
"" |
|
); |
|
|
|
})();
|
|
|