test.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. // CodeMirror, copyright (c) by Marijn Haverbeke and others
  2. // Distributed under an MIT license: https://codemirror.net/LICENSE
  3. ;(function () {
  4. var mode = CodeMirror.getMode({ indentUnit: 4 }, 'verilog')
  5. function MT(name) {
  6. test.mode(name, mode, Array.prototype.slice.call(arguments, 1))
  7. }
  8. MT(
  9. 'binary_literals',
  10. "[number 1'b0]",
  11. "[number 1'b1]",
  12. "[number 1'bx]",
  13. "[number 1'bz]",
  14. "[number 1'bX]",
  15. "[number 1'bZ]",
  16. "[number 1'B0]",
  17. "[number 1'B1]",
  18. "[number 1'Bx]",
  19. "[number 1'Bz]",
  20. "[number 1'BX]",
  21. "[number 1'BZ]",
  22. "[number 1'b0]",
  23. "[number 1'b1]",
  24. "[number 2'b01]",
  25. "[number 2'bxz]",
  26. "[number 2'b11]",
  27. "[number 2'b10]",
  28. "[number 2'b1Z]",
  29. "[number 12'b0101_0101_0101]",
  30. "[number 1'b 0]",
  31. "[number 'b0101]"
  32. )
  33. MT('octal_literals', "[number 3'o7]", "[number 3'O7]", "[number 3'so7]", "[number 3'SO7]")
  34. MT(
  35. 'decimal_literals',
  36. '[number 0]',
  37. '[number 1]',
  38. '[number 7]',
  39. '[number 123_456]',
  40. "[number 'd33]",
  41. "[number 8'd255]",
  42. "[number 8'D255]",
  43. "[number 8'sd255]",
  44. "[number 8'SD255]",
  45. "[number 32'd123]",
  46. "[number 32 'd123]",
  47. "[number 32 'd 123]"
  48. )
  49. MT(
  50. 'hex_literals',
  51. "[number 4'h0]",
  52. "[number 4'ha]",
  53. "[number 4'hF]",
  54. "[number 4'hx]",
  55. "[number 4'hz]",
  56. "[number 4'hX]",
  57. "[number 4'hZ]",
  58. "[number 32'hdc78]",
  59. "[number 32'hDC78]",
  60. "[number 32 'hDC78]",
  61. "[number 32'h DC78]",
  62. "[number 32 'h DC78]",
  63. "[number 32'h44x7]",
  64. "[number 32'hFFF?]"
  65. )
  66. MT(
  67. 'real_number_literals',
  68. '[number 1.2]',
  69. '[number 0.1]',
  70. '[number 2394.26331]',
  71. '[number 1.2E12]',
  72. '[number 1.2e12]',
  73. '[number 1.30e-2]',
  74. '[number 0.1e-0]',
  75. '[number 23E10]',
  76. '[number 29E-2]',
  77. '[number 236.123_763_e-12]'
  78. )
  79. MT('operators', '[meta ^]')
  80. MT('keywords', '[keyword logic]', '[keyword logic] [variable foo]', '[keyword reg] [variable abc]')
  81. MT('variables', '[variable _leading_underscore]', '[variable _if]', '[number 12] [variable foo]', '[variable foo] [number 14]')
  82. MT('tick_defines', '[def `FOO]', '[def `foo]', '[def `FOO_bar]')
  83. MT('system_calls', '[meta $display]', '[meta $vpi_printf]')
  84. MT('line_comment', '[comment // Hello world]')
  85. // Alignment tests
  86. MT(
  87. 'align_port_map_style1',
  88. /**
  89. * mod mod(.a(a),
  90. * .b(b)
  91. * );
  92. */
  93. '[variable mod] [variable mod][bracket (].[variable a][bracket (][variable a][bracket )],',
  94. ' .[variable b][bracket (][variable b][bracket )]',
  95. ' [bracket )];',
  96. ''
  97. )
  98. MT(
  99. 'align_port_map_style2',
  100. /**
  101. * mod mod(
  102. * .a(a),
  103. * .b(b)
  104. * );
  105. */
  106. '[variable mod] [variable mod][bracket (]',
  107. ' .[variable a][bracket (][variable a][bracket )],',
  108. ' .[variable b][bracket (][variable b][bracket )]',
  109. '[bracket )];',
  110. ''
  111. )
  112. MT(
  113. 'align_assignments',
  114. /**
  115. * always @(posedge clk) begin
  116. * if (rst)
  117. * data_out <= 8'b0 +
  118. * 8'b1;
  119. * else
  120. * data_out = 8'b0 +
  121. * 8'b1;
  122. * data_out =
  123. * 8'b0 + 8'b1;
  124. * end
  125. */
  126. '[keyword always] [def @][bracket (][keyword posedge] [variable clk][bracket )] [keyword begin]',
  127. ' [keyword if] [bracket (][variable rst][bracket )]',
  128. " [variable data_out] [meta <=] [number 8'b0] [meta +]",
  129. " [number 8'b1];",
  130. ' [keyword else]',
  131. " [variable data_out] [meta =] [number 8'b0] [meta +]",
  132. " [number 8'b1];",
  133. " [variable data_out] [meta =] [number 8'b0] [meta +]",
  134. " [number 8'b1];",
  135. '[keyword end]',
  136. ''
  137. )
  138. // Indentation tests
  139. MT('indent_single_statement_if', '[keyword if] [bracket (][variable foo][bracket )]', ' [keyword break];', '')
  140. MT('no_indent_after_single_line_if', '[keyword if] [bracket (][variable foo][bracket )] [keyword break];', '')
  141. MT('indent_after_if_begin_same_line', '[keyword if] [bracket (][variable foo][bracket )] [keyword begin]', ' [keyword break];', ' [keyword break];', '[keyword end]', '')
  142. MT('indent_after_if_begin_next_line', '[keyword if] [bracket (][variable foo][bracket )]', ' [keyword begin]', ' [keyword break];', ' [keyword break];', ' [keyword end]', '')
  143. MT('indent_single_statement_if_else', '[keyword if] [bracket (][variable foo][bracket )]', ' [keyword break];', '[keyword else]', ' [keyword break];', '')
  144. MT(
  145. 'indent_if_else_begin_same_line',
  146. '[keyword if] [bracket (][variable foo][bracket )] [keyword begin]',
  147. ' [keyword break];',
  148. ' [keyword break];',
  149. '[keyword end] [keyword else] [keyword begin]',
  150. ' [keyword break];',
  151. ' [keyword break];',
  152. '[keyword end]',
  153. ''
  154. )
  155. MT(
  156. 'indent_if_else_begin_next_line',
  157. '[keyword if] [bracket (][variable foo][bracket )]',
  158. ' [keyword begin]',
  159. ' [keyword break];',
  160. ' [keyword break];',
  161. ' [keyword end]',
  162. '[keyword else]',
  163. ' [keyword begin]',
  164. ' [keyword break];',
  165. ' [keyword break];',
  166. ' [keyword end]',
  167. ''
  168. )
  169. MT(
  170. 'indent_if_nested_without_begin',
  171. '[keyword if] [bracket (][variable foo][bracket )]',
  172. ' [keyword if] [bracket (][variable foo][bracket )]',
  173. ' [keyword if] [bracket (][variable foo][bracket )]',
  174. ' [keyword break];',
  175. ''
  176. )
  177. MT(
  178. 'indent_case',
  179. '[keyword case] [bracket (][variable state][bracket )]',
  180. ' [variable FOO]:',
  181. ' [keyword break];',
  182. ' [variable BAR]:',
  183. ' [keyword break];',
  184. '[keyword endcase]',
  185. ''
  186. )
  187. MT('unindent_after_end_with_preceding_text', '[keyword begin]', ' [keyword break]; [keyword end]', '')
  188. MT('export_function_one_line_does_not_indent', '[keyword export] [string "DPI-C"] [keyword function] [variable helloFromSV];', '')
  189. MT('export_task_one_line_does_not_indent', '[keyword export] [string "DPI-C"] [keyword task] [variable helloFromSV];', '')
  190. MT('export_function_two_lines_indents_properly', '[keyword export]', ' [string "DPI-C"] [keyword function] [variable helloFromSV];', '')
  191. MT('export_task_two_lines_indents_properly', '[keyword export]', ' [string "DPI-C"] [keyword task] [variable helloFromSV];', '')
  192. MT('import_function_one_line_does_not_indent', '[keyword import] [string "DPI-C"] [keyword function] [variable helloFromC];', '')
  193. MT('import_task_one_line_does_not_indent', '[keyword import] [string "DPI-C"] [keyword task] [variable helloFromC];', '')
  194. MT('import_package_single_line_does_not_indent', '[keyword import] [variable p]::[variable x];', '[keyword import] [variable p]::[variable y];', '')
  195. MT(
  196. 'covergroup_with_function_indents_properly',
  197. '[keyword covergroup] [variable cg] [keyword with] [keyword function] [variable sample][bracket (][keyword bit] [variable b][bracket )];',
  198. ' [variable c] : [keyword coverpoint] [variable c];',
  199. '[keyword endgroup]: [variable cg]',
  200. ''
  201. )
  202. MT(
  203. 'indent_uvm_macros',
  204. /**
  205. * `uvm_object_utils_begin(foo)
  206. * `uvm_field_event(foo, UVM_ALL_ON)
  207. * `uvm_object_utils_end
  208. */
  209. '[def `uvm_object_utils_begin][bracket (][variable foo][bracket )]',
  210. ' [def `uvm_field_event][bracket (][variable foo], [variable UVM_ALL_ON][bracket )]',
  211. '[def `uvm_object_utils_end]',
  212. ''
  213. )
  214. MT(
  215. 'indent_uvm_macros2',
  216. /**
  217. * `uvm_do_with(mem_read,{
  218. * bar_nb == 0;
  219. * })
  220. */
  221. '[def `uvm_do_with][bracket (][variable mem_read],[bracket {]',
  222. ' [variable bar_nb] [meta ==] [number 0];',
  223. '[bracket })]',
  224. ''
  225. )
  226. MT(
  227. 'indent_wait_disable_fork',
  228. /**
  229. * virtual task body();
  230. * repeat (20) begin
  231. * fork
  232. * `uvm_create_on(t,p_seq)
  233. * join_none
  234. * end
  235. * wait fork;
  236. * disable fork;
  237. * endtask : body
  238. */
  239. '[keyword virtual] [keyword task] [variable body][bracket ()];',
  240. ' [keyword repeat] [bracket (][number 20][bracket )] [keyword begin]',
  241. ' [keyword fork]',
  242. ' [def `uvm_create_on][bracket (][variable t],[variable p_seq][bracket )]',
  243. ' [keyword join_none]',
  244. ' [keyword end]',
  245. ' [keyword wait] [keyword fork];',
  246. ' [keyword disable] [keyword fork];',
  247. '[keyword endtask] : [variable body]',
  248. ''
  249. )
  250. MT(
  251. 'indent_typedef_class',
  252. /**
  253. * typedef class asdf;
  254. * typedef p p_t[];
  255. * typedef enum {
  256. * ASDF
  257. * } t;
  258. */
  259. '[keyword typedef] [keyword class] [variable asdf];',
  260. '[keyword typedef] [variable p] [variable p_t][bracket [[]]];',
  261. '[keyword typedef] [keyword enum] [bracket {]',
  262. ' [variable ASDF]',
  263. '[bracket }] [variable t];',
  264. ''
  265. )
  266. MT(
  267. 'indent_case_with_macro',
  268. /**
  269. * // It should be assumed that Macros can have ';' inside, or 'begin'/'end' blocks.
  270. * // As such, 'case' statement should indent correctly with macros inside.
  271. * case(foo)
  272. * ASDF : this.foo = seqNum;
  273. * ABCD : `update(f)
  274. * EFGH : `update(g)
  275. * endcase
  276. */
  277. '[keyword case][bracket (][variable foo][bracket )]',
  278. ' [variable ASDF] : [keyword this].[variable foo] [meta =] [variable seqNum];',
  279. ' [variable ABCD] : [def `update][bracket (][variable f][bracket )]',
  280. ' [variable EFGH] : [def `update][bracket (][variable g][bracket )]',
  281. '[keyword endcase]',
  282. ''
  283. )
  284. MT(
  285. 'indent_extern_function',
  286. /**
  287. * extern virtual function void do(ref packet trans);
  288. * extern virtual function void do2(ref packet trans);
  289. */
  290. '[keyword extern] [keyword virtual] [keyword function] [keyword void] [variable do1][bracket (][keyword ref] [variable packet] [variable trans][bracket )];',
  291. '[keyword extern] [keyword virtual] [keyword function] [keyword void] [variable do2][bracket (][keyword ref] [variable packet] [variable trans][bracket )];',
  292. ''
  293. )
  294. MT(
  295. 'indent_assignment',
  296. /**
  297. * for (int i=1;i < fun;i++) begin
  298. * foo = 2 << asdf || 11'h35 >> abcd
  299. * && 8'h6 | 1'b1;
  300. * end
  301. */
  302. '[keyword for] [bracket (][keyword int] [variable i][meta =][number 1];[variable i] [meta <] [variable fun];[variable i][meta ++][bracket )] [keyword begin]',
  303. " [variable foo] [meta =] [number 2] [meta <<] [variable asdf] [meta ||] [number 11'h35] [meta >>] [variable abcd]",
  304. " [meta &&] [number 8'h6] [meta |] [number 1'b1];",
  305. '[keyword end]',
  306. ''
  307. )
  308. MT(
  309. 'indent_foreach_constraint',
  310. /**
  311. * `uvm_rand_send_with(wrTlp, {
  312. * length ==1;
  313. * foreach (Data[i]) {
  314. * payload[i] == Data[i];
  315. * }
  316. * })
  317. */
  318. '[def `uvm_rand_send_with][bracket (][variable wrTlp], [bracket {]',
  319. ' [variable length] [meta ==][number 1];',
  320. ' [keyword foreach] [bracket (][variable Data][bracket [[][variable i][bracket ]])] [bracket {]',
  321. ' [variable payload][bracket [[][variable i][bracket ]]] [meta ==] [variable Data][bracket [[][variable i][bracket ]]];',
  322. ' [bracket }]',
  323. '[bracket })]',
  324. ''
  325. )
  326. MT(
  327. 'indent_compiler_directives',
  328. /**
  329. * `ifdef DUT
  330. * `else
  331. * `ifndef FOO
  332. * `define FOO
  333. * `endif
  334. * `endif
  335. * `timescale 1ns/1ns
  336. */
  337. '[def `ifdef] [variable DUT]',
  338. '[def `else]',
  339. ' [def `ifndef] [variable FOO]',
  340. ' [def `define] [variable FOO]',
  341. ' [def `endif]',
  342. '[def `endif]',
  343. '[def `timescale] [number 1][variable ns][meta /][number 1][variable ns]',
  344. ''
  345. )
  346. })()