diff .cms/lib/codemirror/mode/verilog/test.js @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.cms/lib/codemirror/mode/verilog/test.js	Fri Oct 11 22:40:23 2024 +0000
@@ -0,0 +1,443 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/5/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]",
+     ""
+  );
+
+})();