• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

nickg / nvc / 16099227452

06 Jul 2025 12:45PM UTC coverage: 92.335% (+0.05%) from 92.284%
16099227452

push

github

nickg
Handle underscores in Verilog decimal literals

Fixes #1230

18 of 20 new or added lines in 1 file covered. (90.0%)

598 existing lines in 16 files now uncovered.

71069 of 76969 relevant lines covered (92.33%)

564781.41 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

89.14
/src/vlog/vlog-dump.c
1
//
2
//  Copyright (C) 2022-2025 Nick Gasson
3
//
4
//  This program is free software: you can redistribute it and/or modify
5
//  it under the terms of the GNU General Public License as published by
6
//  the Free Software Foundation, either version 3 of the License, or
7
//  (at your option) any later version.
8
//
9
//  This program is distributed in the hope that it will be useful,
10
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
11
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
//  GNU General Public License for more details.
13
//
14
//  You should have received a copy of the GNU General Public License
15
//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
//
17

18
#include "util.h"
19
#include "common.h"
20
#include "object.h"
21
#include "ident.h"
22
#include "vlog/vlog-node.h"
23
#include "vlog/vlog-number.h"
24
#include "vlog/vlog-phase.h"
25

26
#include <ctype.h>
27

28
#define DUMP_ADDRESS 0
29

30
static inline void tab(int indent)
60✔
31
{
32
   print_syntax("%*s", indent, "");
60✔
33
}
60✔
34

35
static void vlog_dump_address(vlog_node_t v)
36
{
37
#if DUMP_ADDRESS
38
   uint32_t a = (uint32_t)((uintptr_t)object_arena(vlog_to_object(v)) >> 2);
39
   a = (a ^ 61) ^ (a >> 16);
40
   a = a + (a << 3);
41
   a = a ^ (a >> 4);
42
   a = a * UINT32_C(0x27d4eb2d);
43
   a = a ^ (a >> 15);
44

45
   const int r = 1 + a % 5;
46
   const int g = 1 + (a >> 8) % 5;
47
   const int b = 1 + (a >> 16) % 5;
48

49
   const int color = 16 + 36*r + 6*g + b;
50

51
   char *LOCAL fmt = xasprintf("$!#%d${%%p:%s}$$", color,
52
                               vlog_kind_str(vlog_kind(v)));
53
   color_printf(fmt, v);
54
#endif
55
}
56

57
static void vlog_dump_paren(vlog_node_t v, int indent)
33✔
58
{
59
   switch (vlog_kind(v)) {
33✔
60
   case V_REF:
25✔
61
   case V_BIT_SELECT:
62
   case V_NUMBER:
63
      vlog_dump(v, indent);
25✔
64
      break;
25✔
65
   default:
8✔
66
      print_syntax("(");
8✔
67
      vlog_dump(v, indent);
8✔
68
      print_syntax(")");
8✔
69
   }
70
}
33✔
71

72
static void vlog_dump_module(vlog_node_t v, int indent)
3✔
73
{
74
   vlog_dump_address(v);
3✔
75
   print_syntax("#module %s", istr(vlog_ident2(v)));
3✔
76

77
   const int nports = vlog_ports(v);
3✔
78
   if (nports > 0) {
3✔
79
      print_syntax(" (");
1✔
80
      for (int i = 0; i < nports; i++) {
5✔
81
         if (i > 0) print_syntax(", ");
4✔
82
         vlog_dump(vlog_port(v, i), 0);
4✔
83
      }
84
      print_syntax(")");
1✔
85
   }
86

87
   print_syntax(";\n");
3✔
88

89
   const int ndecls = vlog_decls(v);
3✔
90
   for (int i = 0; i < ndecls; i++)
21✔
91
      vlog_dump(vlog_decl(v, i), indent + 2);
18✔
92

93
   const int nstmts = vlog_stmts(v);
3✔
94
   for (int i = 0; i < nstmts; i++)
13✔
95
      vlog_dump(vlog_stmt(v, i), indent + 2);
10✔
96

97
   print_syntax("#endmodule // %s\n\n", istr(vlog_ident2(v)));
3✔
98
}
3✔
99

100
static void vlog_dump_primitive(vlog_node_t v, int indent)
1✔
101
{
102
   vlog_dump_address(v);
1✔
103
   print_syntax("#primitive %s", istr(vlog_ident2(v)));
1✔
104

105
   const int nports = vlog_ports(v);
1✔
106
   if (nports > 0) {
1✔
107
      print_syntax(" (");
1✔
108
      for (int i = 0; i < nports; i++) {
5✔
109
         if (i > 0) print_syntax(", ");
4✔
110
         vlog_dump(vlog_port(v, i), 0);
4✔
111
      }
112
      print_syntax(")");
1✔
113
   }
114

115
   print_syntax(";\n");
1✔
116

117
   const int ndecls = vlog_decls(v);
1✔
118
   for (int i = 0; i < ndecls; i++)
5✔
119
      vlog_dump(vlog_decl(v, i), indent + 2);
4✔
120

121
   const int nstmts = vlog_stmts(v);
1✔
122
   for (int i = 0; i < nstmts; i++)
2✔
123
      vlog_dump(vlog_stmt(v, i), indent + 2);
1✔
124

125
   print_syntax("#endprimitive // %s\n\n", istr(vlog_ident2(v)));
1✔
126
}
1✔
127

128
static void vlog_dump_udp_entry(vlog_node_t v, int indent)
4✔
129
{
130
   tab(indent);
4✔
131

132
   vlog_udp_symbol_t last = V_UDP_SYMBOL_INPUT;
4✔
133
   const int nsymbols = vlog_params(v);
4✔
134
   for (int i = 0; i < nsymbols; i++) {
20✔
135
      vlog_node_t sym = vlog_param(v, i);
16✔
136

137
      const vlog_udp_symbol_t kind = vlog_subkind(sym);
16✔
138
      if (kind != last) {
16✔
139
         print_syntax(":");
4✔
140
         last = kind;
4✔
141
      }
142

143
      print_syntax("%c", (char)vlog_ival(sym));
16✔
144
   }
145

146
   print_syntax(";\n");
4✔
147
}
4✔
148

149
static void vlog_dump_udp_table(vlog_node_t v, int indent)
1✔
150
{
151
   tab(indent);
1✔
152
   print_syntax("#table\n");
1✔
153

154
   const int nparams = vlog_params(v);
1✔
155
   for (int i = 0; i < nparams; i++)
5✔
156
      vlog_dump(vlog_param(v, i), indent + 2);
4✔
157

158
   tab(indent);
1✔
159
   print_syntax("#endtable\n");
1✔
160
}
1✔
161

162
static void vlog_dump_port_decl(vlog_node_t v, int indent)
8✔
163
{
164
   tab(indent);
8✔
165
   vlog_dump_address(v);
8✔
166

167
   switch (vlog_subkind(v)) {
8✔
168
   case V_PORT_INPUT: print_syntax("#input"); break;
6✔
169
   case V_PORT_INOUT: print_syntax("#inout"); break;
×
170
   case V_PORT_OUTPUT: print_syntax("#output"); break;
2✔
171
   }
172

173
   print_syntax(" %s;\n", istr(vlog_ident(v)));
8✔
174
}
8✔
175

176
static void vlog_dump_dimensions(vlog_node_t v, int indent)
26✔
177
{
178
   const int ndims = vlog_ranges(v);
26✔
179
   int dim = 0;
26✔
180
   for (; dim < ndims; dim++) {
30✔
181
      vlog_node_t d = vlog_range(v, dim);
4✔
182
      print_syntax(" [");
4✔
183
      vlog_dump(vlog_left(d), indent);
4✔
184
      print_syntax(":");
4✔
185
      vlog_dump(vlog_right(d), indent);
4✔
186
      print_syntax("]");
4✔
187
   }
188
}
26✔
189

190
static void vlog_dump_net_decl(vlog_node_t v, int indent)
6✔
191
{
192
   tab(indent);
6✔
193
   vlog_dump_address(v);
6✔
194

195
   switch (vlog_subkind(v)) {
6✔
196
   case V_NET_WIRE: print_syntax("#wire "); break;
6✔
197
   }
198

199
   vlog_dump(vlog_type(v), indent);
6✔
200
   print_syntax(" %s", istr(vlog_ident(v)));
6✔
201
   vlog_dump_dimensions(v, indent);
6✔
202
   print_syntax(";\n");
6✔
203
}
6✔
204

205
static void vlog_dump_var_decl(vlog_node_t v, int indent)
6✔
206
{
207
   tab(indent);
6✔
208
   vlog_dump_address(v);
6✔
209

210
   vlog_dump(vlog_type(v), indent);
6✔
211
   print_syntax(" %s", istr(vlog_ident(v)));
6✔
212
   vlog_dump_dimensions(v, indent);
6✔
213

214
   if (vlog_has_value(v)) {
6✔
215
      print_syntax(" = ");
2✔
216
      vlog_dump(vlog_value(v), indent);
2✔
217
   }
218

219
   print_syntax(";\n");
6✔
220
}
6✔
221

222
static void vlog_dump_always(vlog_node_t v, int indent)
1✔
223
{
224
   tab(indent);
1✔
225

226
   print_syntax("#always ");
1✔
227
   vlog_dump(vlog_stmt(v, 0), indent);
1✔
228
   print_syntax("\n");
1✔
229
}
1✔
230

231
static void vlog_dump_initial(vlog_node_t v, int indent)
3✔
232
{
233
   tab(indent);
3✔
234

235
   print_syntax("#initial ");
3✔
236
   vlog_dump(vlog_stmt(v, 0), indent);
3✔
237
   print_syntax("\n");
3✔
238
}
3✔
239

240
static void vlog_dump_block(vlog_node_t v, int indent)
2✔
241
{
242
   print_syntax("#begin\n");
2✔
243

244
   const int ndecls = vlog_decls(v);
2✔
245
   for (int i = 0; i < ndecls; i++)
2✔
246
      vlog_dump(vlog_decl(v, i), indent + 2);
×
247

248
   const int nstmts = vlog_stmts(v);
2✔
249
   for (int i = 0; i < nstmts; i++) {
19✔
250
      tab(indent + 2);
17✔
251
      vlog_dump(vlog_stmt(v, i), indent + 2);
17✔
252
      print_syntax("\n");
17✔
253
   }
254

255
   tab(indent);
2✔
256
   print_syntax("#end");
2✔
257
}
2✔
258

259
static void vlog_dump_timing(vlog_node_t v, int indent)
2✔
260
{
261
   vlog_dump(vlog_value(v), indent);
2✔
262

263
   if (vlog_stmts(v) > 0)
2✔
264
      vlog_dump(vlog_stmt(v, 0), indent);
2✔
265
   else
266
      print_syntax(";\n");
×
267
}
2✔
268

269
static void vlog_dump_event(vlog_node_t v)
1✔
270
{
271
   switch (vlog_subkind(v)) {
1✔
272
   case V_EVENT_POSEDGE: print_syntax("#posedge "); break;
1✔
273
   case V_EVENT_NEGEDGE: print_syntax("#negedge "); break;
×
274
   }
275

276
   vlog_dump(vlog_value(v), 0);
1✔
277
}
1✔
278

279
static void vlog_dump_event_control(vlog_node_t v)
1✔
280
{
281
   print_syntax("@(");
1✔
282

283
   const int nparams = vlog_params(v);
1✔
284
   for (int i = 0; i < nparams; i++)
2✔
285
      vlog_dump(vlog_param(v, i), 0);
1✔
286

287
   print_syntax(") ");
1✔
288
}
1✔
289

290
static void vlog_dump_nbassign(vlog_node_t v, int indent)
4✔
291
{
292
   vlog_dump(vlog_target(v), 0);
4✔
293
   print_syntax(" <= ");
4✔
294
   if (vlog_has_delay(v))
4✔
295
      vlog_dump(vlog_delay(v), 0);
1✔
296
   vlog_dump(vlog_value(v), 0);
4✔
297
   print_syntax(";");
4✔
298
}
4✔
299

300
static void vlog_dump_bassign(vlog_node_t v, int indent)
10✔
301
{
302
   vlog_dump(vlog_target(v), 0);
10✔
303

304
   switch (vlog_subkind(v)) {
10✔
305
   case V_ASSIGN_EQUALS:
10✔
306
      print_syntax(" = ");
10✔
307
      break;
10✔
308
   }
309

310
   if (vlog_has_delay(v))
10✔
311
      vlog_dump(vlog_delay(v), 0);
1✔
312

313
   vlog_dump(vlog_value(v), 0);
10✔
314
   print_syntax(";");
10✔
315
}
10✔
316

317
static void vlog_dump_assign(vlog_node_t v, int indent)
4✔
318
{
319
   tab(indent);
4✔
320
   print_syntax("#assign ");
4✔
321
   vlog_dump(vlog_target(v), 0);
4✔
322
   print_syntax(" = ");
4✔
323
   vlog_dump(vlog_value(v), 0);
4✔
324
   print_syntax(";\n");
4✔
325
}
4✔
326

327
static void vlog_dump_stmt_or_null(vlog_node_t v, int indent)
12✔
328
{
329
   switch (vlog_stmts(v)) {
12✔
330
   case 0:  print_syntax(";"); break;
5✔
331
   case 1:  vlog_dump(vlog_stmt(v, 0), indent); break;
7✔
332
   default: should_not_reach_here();
333
   }
334
}
12✔
335

336
static void vlog_dump_if(vlog_node_t v, int indent)
5✔
337
{
338
   print_syntax("#if ");
5✔
339

340
   const int nconds = vlog_conds(v);
5✔
341
   for (int i = 0; i < nconds; i++) {
10✔
342
      if (i > 0) {
5✔
343
         print_syntax("\n");
×
344
         tab(indent);
×
345
         print_syntax("#else ");
×
346
      }
347

348
      vlog_node_t c = vlog_cond(v, i);
5✔
349
      if (vlog_has_value(c)) {
5✔
350
         print_syntax("(");
5✔
351
         vlog_dump(vlog_value(c), 0);
5✔
352
         print_syntax(") ");
5✔
353
      }
354

355
      vlog_dump_stmt_or_null(c, indent);
5✔
356
   }
357
}
5✔
358

359
static void vlog_dump_sys_tcall(vlog_node_t v, int indent)
2✔
360
{
361
   print_syntax("%s", istr(vlog_ident(v)));
2✔
362

363
   const int nparams = vlog_params(v);
2✔
364
   if (nparams > 0) {
2✔
365
      print_syntax("(");
1✔
366
      for (int i = 0; i < nparams; i++) {
3✔
367
         if (i > 0) print_syntax(", ");
2✔
368
         vlog_dump(vlog_param(v, i), 0);
2✔
369
      }
370
      print_syntax(")");
1✔
371
   }
372

373
   print_syntax(";");
2✔
374
}
2✔
375

376
static void vlog_dump_sys_fcall(vlog_node_t v)
1✔
377
{
378
   print_syntax("%s", istr(vlog_ident(v)));
1✔
379

380
   const int nparams = vlog_params(v);
1✔
381
   if (nparams > 0) {
1✔
382
      print_syntax("(");
×
383
      for (int i = 0; i < nparams; i++) {
×
384
         if (i > 0) print_syntax(", ");
×
385
         vlog_dump(vlog_param(v, i), 0);
×
386
      }
387
      print_syntax(")");
×
388
   }
389
}
1✔
390

391
static void vlog_dump_string(vlog_node_t v)
1✔
392
{
393
   print_syntax("\"");
1✔
394

395
   number_t n = vlog_number(v);
1✔
396
   for (int i = number_width(n)/8 - 1; i >= 0; i--)
6✔
397
      print_syntax("%c", number_byte(n, i));
5✔
398

399
   print_syntax("\"");
1✔
400
}
1✔
401

402
static void vlog_dump_number(vlog_node_t v)
36✔
403
{
404
   LOCAL_TEXT_BUF tb = tb_new();
72✔
405
   number_print(vlog_number(v), tb);
36✔
406

407
   print_syntax("%s", tb_get(tb));
36✔
408
}
36✔
409

410
static void vlog_dump_real(vlog_node_t v)
1✔
411
{
412
   print_syntax("%g", vlog_dval(v));
1✔
413
}
1✔
414

415
static void vlog_dump_binary(vlog_node_t v)
16✔
416
{
417
   vlog_dump_paren(vlog_left(v), 0);
16✔
418

419
   switch (vlog_subkind(v)) {
16✔
420
   case V_BINARY_OR:       print_syntax(" | "); break;
2✔
421
   case V_BINARY_AND:      print_syntax(" & "); break;
3✔
422
   case V_BINARY_CASE_EQ:  print_syntax(" === "); break;
2✔
423
   case V_BINARY_CASE_NEQ: print_syntax(" !== "); break;
×
424
   case V_BINARY_LOG_EQ:   print_syntax(" == "); break;
3✔
425
   case V_BINARY_LOG_NEQ:  print_syntax(" != "); break;
×
426
   case V_BINARY_LOG_OR:   print_syntax(" || "); break;
2✔
427
   case V_BINARY_LOG_AND:  print_syntax(" && "); break;
1✔
428
   case V_BINARY_PLUS:     print_syntax(" + "); break;
2✔
429
   case V_BINARY_MINUS:    print_syntax(" - "); break;
×
430
   case V_BINARY_LT:       print_syntax(" < "); break;
1✔
431
   case V_BINARY_GT:       print_syntax(" > "); break;
×
432
   }
433

434
   vlog_dump_paren(vlog_right(v), 0);
16✔
435
}
16✔
436

437
static void vlog_dump_unary(vlog_node_t v)
2✔
438
{
439
   switch (vlog_subkind(v)) {
2✔
440
   case V_UNARY_NOT: print_syntax("!"); break;
1✔
441
   case V_UNARY_BITNEG: print_syntax("~~"); break;
1✔
442
   }
443

444
   vlog_dump(vlog_value(v), 0);
2✔
445
}
2✔
446

447
static void vlog_dump_postfix(vlog_node_t v)
1✔
448
{
449
   vlog_dump(vlog_target(v), 0);
1✔
450

451
   switch (vlog_subkind(v)) {
1✔
452
   case V_INCDEC_PLUS: print_syntax("++"); break;
1✔
453
   case V_INCDEC_MINUS: print_syntax("--"); break;
×
454
   }
455
}
1✔
456

457
static void vlog_dump_prefix(vlog_node_t v)
1✔
458
{
459
   switch (vlog_subkind(v)) {
1✔
460
   case V_INCDEC_PLUS: print_syntax("++"); break;
1✔
461
   case V_INCDEC_MINUS: print_syntax("--"); break;
×
462
   }
463

464
   vlog_dump(vlog_target(v), 0);
1✔
465
}
1✔
466

467
static void vlog_dump_delay_control(vlog_node_t v, int indent)
3✔
468
{
469
   print_syntax("##");
3✔
470
   vlog_dump(vlog_value(v), 0);
3✔
471
   print_syntax(" ");
3✔
472
}
3✔
473

474
static void vlog_dump_gate_inst(vlog_node_t v, int indent)
1✔
475
{
476
   tab(indent);
1✔
477

478
   switch (vlog_subkind(v)) {
1✔
479
   case V_GATE_PULLUP: print_syntax("#pullup "); break;
1✔
480
   case V_GATE_PULLDOWN: print_syntax("#pulldown "); break;
×
481
   }
482

483
   const int nparams = vlog_params(v);
1✔
484
   if (nparams > 0) {
1✔
485
      print_syntax("(");
1✔
486
      for (int i = 0; i < nparams; i++) {
2✔
487
         if (i > 0) print_syntax(",");
1✔
488
         vlog_dump(vlog_param(v, i), 0);
1✔
489
      }
490
      print_syntax(") ");
1✔
491
   }
492

493
   if (vlog_has_ident(v))
1✔
494
      print_syntax("%s ", istr(vlog_ident(v)));
1✔
495

496
   print_syntax("(");
1✔
497
   vlog_dump(vlog_target(v), 0);
1✔
498
   print_syntax(");\n");
1✔
499
}
1✔
500

501
static void vlog_dump_mod_inst(vlog_node_t v, int indent)
2✔
502
{
503
   print_syntax("%s ", istr(vlog_ident(v)));
2✔
504

505
   const int nparams = vlog_params(v);
2✔
506
   print_syntax("(");
2✔
507
   for (int i = 0; i < nparams; i++) {
4✔
508
      if (i > 0) print_syntax(",");
2✔
509
      vlog_dump(vlog_param(v, i), 0);
2✔
510
   }
511
   print_syntax(")");
2✔
512
}
2✔
513

514
static void vlog_dump_inst_list(vlog_node_t v, int indent)
1✔
515
{
516
   tab(indent);
1✔
517

518
   print_syntax("%s ", istr(vlog_ident(v)));
1✔
519

520
   const int nparams = vlog_params(v);
1✔
521
   if (nparams > 0) {
1✔
522
      print_syntax("##(");
1✔
523
      for (int i = 0; i < nparams; i++) {
2✔
524
         if (i > 0) print_syntax(",");
1✔
525
         vlog_dump(vlog_param(v, i), 0);
1✔
526
      }
527
      print_syntax(") ");
1✔
528
   }
529

530
   const int nstmts = vlog_stmts(v);
1✔
531
   for (int i = 0; i < nstmts; i++) {
3✔
532
      if (i > 0) print_syntax(", ");
2✔
533
      vlog_dump(vlog_stmt(v, i), indent + 2);
2✔
534
   }
535

536
   print_syntax(";\n");
1✔
537
}
1✔
538

539
static void vlog_dump_param_assign(vlog_node_t v, int indent)
3✔
540
{
541
   if (vlog_has_ident(v)) {
3✔
542
      print_syntax(".%s(", istr(vlog_ident(v)));
×
543
      if (vlog_has_value(v))
×
544
         vlog_dump(vlog_value(v), indent);
×
545
      print_syntax(")");
×
546
   }
547
   else
548
      vlog_dump(vlog_value(v), indent);
3✔
549
}
3✔
550

551
static void vlog_dump_strength(vlog_node_t v, int indent)
1✔
552
{
553
   static const char *map[] = {
1✔
554
      "highz", "small", "medium", "weak", "large", "pull", "strong", "supply"
555
   };
556

557
   const unsigned level = vlog_subkind(v);
1✔
558
   print_syntax("%s0,%s1", map[STRENGTH0(level)], map[STRENGTH1(level)]);
1✔
559
}
1✔
560

561
static void vlog_dump_bit_select(vlog_node_t v, int indent)
2✔
562
{
563
   vlog_dump(vlog_value(v), 0);
2✔
564

565
   const int nparams = vlog_params(v);
2✔
566
   for (int i = 0; i < nparams; i++) {
4✔
567
      print_syntax("[");
2✔
568
      vlog_dump(vlog_param(v, i), 0);
2✔
569
      print_syntax("]");
2✔
570
   }
571
}
2✔
572

573
static void vlog_dump_part_select(vlog_node_t v, int indent)
1✔
574
{
575
   vlog_dump(vlog_value(v), 0);
1✔
576
   print_syntax("[");
1✔
577
   vlog_dump(vlog_left(v), 0);
1✔
578
   print_syntax(":");
1✔
579
   vlog_dump(vlog_right(v), 0);
1✔
580
   print_syntax("]");
1✔
581
}
1✔
582

583
static void vlog_dump_data_type(vlog_node_t v, int indent)
14✔
584
{
585
   switch (vlog_subkind(v)) {
14✔
586
   case DT_LOGIC: print_syntax("#logic"); break;
10✔
587
   case DT_REAL: print_syntax("#real"); break;
1✔
588
   case DT_REALTIME: print_syntax("#realtime"); break;
×
589
   case DT_SHORTREAL: print_syntax("#shortreal"); break;
×
590
   case DT_INTEGER: print_syntax("#integer"); break;
2✔
591
   case DT_BIT: print_syntax("#bit"); break;
1✔
592
   case DT_INT: print_syntax("#int"); break;
×
593
   default: should_not_reach_here();
594
   }
595

596
   vlog_dump_dimensions(v, indent);
14✔
597
}
14✔
598

599
static void vlog_dump_do_while(vlog_node_t v, int indent)
1✔
600
{
601
   print_syntax("#do ");
1✔
602

603
   vlog_dump_stmt_or_null(v, indent);
1✔
604

605
   print_syntax(" #while (");
1✔
606
   vlog_dump(vlog_value(v), indent);
1✔
607
   print_syntax(");");
1✔
608
}
1✔
609

610
static void vlog_dump_while(vlog_node_t v, int indent)
1✔
611
{
612
   print_syntax("#while (");
1✔
613
   vlog_dump(vlog_value(v), indent);
1✔
614
   print_syntax(")");
1✔
615

616
   vlog_dump_stmt_or_null(v, indent);
1✔
617
}
1✔
618

619
static void vlog_dump_repeat(vlog_node_t v, int indent)
1✔
620
{
621
   print_syntax("#repeat (");
1✔
622
   vlog_dump(vlog_value(v), indent);
1✔
623
   print_syntax(") ");
1✔
624

625
   vlog_dump_stmt_or_null(v, indent);
1✔
626
}
1✔
627

628
static void vlog_dump_forever(vlog_node_t v, int indent)
1✔
629
{
630
   print_syntax("#forever ");
1✔
631
   vlog_dump_stmt_or_null(v, indent);
1✔
632
}
1✔
633

634
static void vlog_dump_for_init(vlog_node_t v, int indent)
1✔
635
{
636
   const int nstmts = vlog_stmts(v);
1✔
637
   if (nstmts == 0)
1✔
UNCOV
638
      print_syntax(";");
×
639
   else {
640
      for (int i = 0; i < nstmts; i++) {
2✔
641
         vlog_dump(vlog_stmt(v, i), indent);
1✔
642
         print_syntax(" ");
1✔
643
      }
644
   }
645
}
1✔
646

647
static void vlog_dump_for_step(vlog_node_t v, int indent)
1✔
648
{
649
   const int nstmts = vlog_stmts(v);
1✔
650
   if (nstmts == 0)
1✔
UNCOV
651
      print_syntax(";");
×
652
   else {
653
      for (int i = 0; i < nstmts; i++) {
2✔
654
         print_syntax(" ");
1✔
655
         vlog_dump(vlog_stmt(v, i), indent);
1✔
656
      }
657
   }
658
}
1✔
659

660
static void vlog_dump_for_loop(vlog_node_t v, int indent)
1✔
661
{
662
   print_syntax("#for (");
1✔
663
   vlog_dump(vlog_left(v), 0);
1✔
664

665
   if (vlog_has_value(v))
1✔
666
      vlog_dump(vlog_value(v), 0);
1✔
667

668
   print_syntax(";");
1✔
669
   vlog_dump(vlog_right(v), 0);
1✔
670
   print_syntax(") ");
1✔
671

672
   vlog_dump_stmt_or_null(v, indent);
1✔
673
}
1✔
674

675
static void vlog_dump_case(vlog_node_t v, int indent)
1✔
676
{
677
   static const char *suffix[] = { "", "x", "z" };
1✔
678

679
   print_syntax("#case%s (", suffix[vlog_subkind(v)]);
1✔
680
   vlog_dump(vlog_value(v), indent);
1✔
681
   print_syntax(")\n");
1✔
682

683
   const int nstmts = vlog_stmts(v);
1✔
684
   for (int i = 0; i < nstmts; i++)
3✔
685
      vlog_dump(vlog_stmt(v, i), indent + 2);
2✔
686

687
   tab(indent);
1✔
688
   print_syntax("#endcase");
1✔
689
}
1✔
690

691
static void vlog_dump_case_item(vlog_node_t v, int indent)
2✔
692
{
693
   tab(indent);
2✔
694

695
   const int nparams = vlog_params(v);
2✔
696
   if (nparams == 0)
2✔
697
      print_syntax("#default");
1✔
698
   else {
699
      vlog_dump(vlog_param(v, 0), 0);
1✔
700
      for (int i = 1; i < nparams; i++) {
2✔
701
         print_syntax(", ");
1✔
702
         vlog_dump(vlog_param(v, i), 0);
1✔
703
      }
704
   }
705

706
   print_syntax(": ");
2✔
707
   vlog_dump_stmt_or_null(v, indent);
2✔
708
   print_syntax("\n");
2✔
709
}
2✔
710

711
static void vlog_dump_cond_expr(vlog_node_t v, int indent)
1✔
712
{
713
   vlog_dump(vlog_value(v), 0);
1✔
714
   print_syntax(" ? ");
1✔
715
   vlog_dump(vlog_left(v), 0);
1✔
716
   print_syntax(" : ");
1✔
717
   vlog_dump(vlog_right(v), 0);
1✔
718
}
1✔
719

720
static void vlog_dump_concat(vlog_node_t v, int indent)
2✔
721
{
722
   print_syntax("{");
2✔
723

724
   const bool multiple = vlog_has_value(v);
2✔
725
   if (multiple) {
2✔
726
      vlog_dump_paren(vlog_value(v), 0);
1✔
727
      print_syntax("{");
1✔
728
   }
729

730
   const int nparams = vlog_params(v);
2✔
731
   for (int i = 0; i < nparams; i++) {
5✔
732
      if (i > 0) print_syntax(", ");
3✔
733
      vlog_dump(vlog_param(v, i), 0);
3✔
734
   }
735

736
   if (multiple)
2✔
737
      print_syntax("}");
1✔
738

739
   print_syntax("}");
2✔
740
}
2✔
741

742
static void vlog_dump_param_decl(vlog_node_t v, int indent)
2✔
743
{
744
   tab(indent);
2✔
745
   vlog_dump_address(v);
2✔
746

747
   switch (vlog_kind(v)) {
2✔
748
   case V_PARAM_DECL:
1✔
749
      print_syntax("#parameter ");
1✔
750
      break;
1✔
751
   case V_LOCALPARAM:
1✔
752
      print_syntax("#localparam ");
1✔
753
      break;
1✔
UNCOV
754
   default:
×
755
      should_not_reach_here();
756
   }
757

758
   vlog_dump(vlog_type(v), indent);
2✔
759
   print_syntax(" %s", istr(vlog_ident(v)));
2✔
760

761
   if (vlog_has_value(v)) {
2✔
762
      print_syntax(" = ");
2✔
763
      vlog_dump(vlog_value(v), indent);
2✔
764
   }
765

766
   print_syntax(";\n");
2✔
767
}
2✔
768

769
static void vlog_dump_ref(vlog_node_t v, int indent)
64✔
770
{
771
   if (vlog_has_ref(v))
64✔
772
      vlog_dump_address(vlog_ref(v));
64✔
773

774
   print_syntax("%s", istr(vlog_ident(v)));
64✔
775
}
64✔
776

UNCOV
777
static void vlog_dump_task_decl(vlog_node_t v, int indent)
×
778
{
779
   tab(indent);
×
780
   print_syntax("#task %s(", istr(vlog_ident(v)));
×
781

782
   print_syntax(");\n");
×
783

UNCOV
784
   const int nstmts = vlog_stmts(v);
×
785
   for (int i = 0; i < nstmts; i++) {
×
786
      tab(indent + 2);
×
787
      vlog_dump(vlog_stmt(v, i), indent + 2);
×
UNCOV
788
      print_syntax("\n");
×
789
   }
790

791
   tab(indent);
×
792
   print_syntax("#endtask\n");
×
UNCOV
793
}
×
794

UNCOV
795
static void vlog_dump_func_decl(vlog_node_t v, int indent)
×
796
{
797
   tab(indent);
×
798
   print_syntax("#function %s(", istr(vlog_ident(v)));
×
799

800
   print_syntax(");\n");
×
801

UNCOV
802
   const int nstmts = vlog_stmts(v);
×
803
   for (int i = 0; i < nstmts; i++) {
×
804
      tab(indent + 2);
×
805
      vlog_dump(vlog_stmt(v, i), indent + 2);
×
UNCOV
806
      print_syntax("\n");
×
807
   }
808

809
   tab(indent);
×
810
   print_syntax("#endfunction\n");
×
811
}
×
812

813
static void vlog_dump_wait(vlog_node_t v, int indent)
×
814
{
UNCOV
815
   print_syntax("#wait (");
×
UNCOV
816
   vlog_dump(vlog_value(v), 0);
×
UNCOV
817
   print_syntax(") ");
×
818
   vlog_dump_stmt_or_null(v, indent);
×
819
}
×
820

821
void vlog_dump(vlog_node_t v, int indent)
230✔
822
{
823
   switch (vlog_kind(v)) {
230✔
UNCOV
824
   case V_INST_BODY:
×
UNCOV
825
      print_syntax("// Instantiated module %s\n", istr(vlog_ident(v)));
×
826
      // Fall-through
827
   case V_MODULE:
3✔
828
      vlog_dump_module(v, indent);
3✔
829
      break;
3✔
830
   case V_PRIMITIVE:
1✔
831
      vlog_dump_primitive(v, indent);
1✔
832
      break;
1✔
833
   case V_REF:
64✔
834
      vlog_dump_ref(v, indent);
64✔
835
      break;
64✔
836
   case V_PORT_DECL:
8✔
837
      vlog_dump_port_decl(v, indent);
8✔
838
      break;
8✔
839
   case V_NET_DECL:
6✔
840
      vlog_dump_net_decl(v, indent);
6✔
841
      break;
6✔
842
   case V_VAR_DECL:
6✔
843
      vlog_dump_var_decl(v, indent);
6✔
844
      break;
6✔
845
   case V_ALWAYS:
1✔
846
      vlog_dump_always(v, indent);
1✔
847
      break;
1✔
848
   case V_INITIAL:
3✔
849
      vlog_dump_initial(v, indent);
3✔
850
      break;
3✔
851
   case V_TIMING:
2✔
852
      vlog_dump_timing(v, indent);
2✔
853
      break;
2✔
854
   case V_EVENT:
1✔
855
      vlog_dump_event(v);
1✔
856
      break;
1✔
857
   case V_EVENT_CONTROL:
1✔
858
      vlog_dump_event_control(v);
1✔
859
      break;
1✔
860
   case V_NBASSIGN:
4✔
861
      vlog_dump_nbassign(v, indent);
4✔
862
      break;
4✔
863
   case V_BASSIGN:
10✔
864
      vlog_dump_bassign(v, indent);
10✔
865
      break;
10✔
866
   case V_ASSIGN:
4✔
867
      vlog_dump_assign(v, indent);
4✔
868
      break;
4✔
869
   case V_BLOCK:
2✔
870
      vlog_dump_block(v, indent);
2✔
871
      break;
2✔
872
   case V_SYS_TCALL:
2✔
873
      vlog_dump_sys_tcall(v, indent);
2✔
874
      break;
2✔
875
   case V_SYS_FCALL:
1✔
876
      vlog_dump_sys_fcall(v);
1✔
877
      break;
1✔
878
   case V_STRING:
1✔
879
      vlog_dump_string(v);
1✔
880
      break;
1✔
881
   case V_NUMBER:
36✔
882
      vlog_dump_number(v);
36✔
883
      break;
36✔
884
   case V_REAL:
1✔
885
      vlog_dump_real(v);
1✔
886
      break;
1✔
887
   case V_IF:
5✔
888
   case V_IF_GENERATE:
889
      vlog_dump_if(v, indent);
5✔
890
      break;
5✔
891
   case V_BINARY:
16✔
892
      vlog_dump_binary(v);
16✔
893
      break;
16✔
894
   case V_UNARY:
2✔
895
      vlog_dump_unary(v);
2✔
896
      break;
2✔
897
   case V_POSTFIX:
1✔
898
      vlog_dump_postfix(v);
1✔
899
      break;
1✔
900
   case V_PREFIX:
1✔
901
      vlog_dump_prefix(v);
1✔
902
      break;
1✔
903
   case V_DELAY_CONTROL:
3✔
904
      vlog_dump_delay_control(v, indent);
3✔
905
      break;
3✔
906
   case V_GATE_INST:
1✔
907
      vlog_dump_gate_inst(v, indent);
1✔
908
      break;
1✔
909
   case V_MOD_INST:
2✔
910
      vlog_dump_mod_inst(v, indent);
2✔
911
      break;
2✔
912
   case V_INST_LIST:
1✔
913
      vlog_dump_inst_list(v, indent);
1✔
914
      break;
1✔
915
   case V_STRENGTH:
1✔
916
      vlog_dump_strength(v, indent);
1✔
917
      break;
1✔
918
   case V_BIT_SELECT:
2✔
919
      vlog_dump_bit_select(v, indent);
2✔
920
      break;
2✔
921
   case V_PART_SELECT:
1✔
922
      vlog_dump_part_select(v, indent);
1✔
923
      break;
1✔
924
   case V_UDP_ENTRY:
4✔
925
      vlog_dump_udp_entry(v, indent);
4✔
926
      break;
4✔
927
   case V_UDP_TABLE:
1✔
928
      vlog_dump_udp_table(v, indent);
1✔
929
      break;
1✔
930
   case V_DATA_TYPE:
14✔
931
      vlog_dump_data_type(v, indent);
14✔
932
      break;
14✔
933
   case V_EMPTY:
934
      break;
935
   case V_DO_WHILE:
1✔
936
      vlog_dump_do_while(v, indent);
1✔
937
      break;
1✔
938
   case V_WHILE:
1✔
939
      vlog_dump_while(v, indent);
1✔
940
      break;
1✔
941
   case V_REPEAT:
1✔
942
      vlog_dump_repeat(v, indent);
1✔
943
      break;
1✔
944
   case V_FOREVER:
1✔
945
      vlog_dump_forever(v, indent);
1✔
946
      break;
1✔
947
   case V_FOR_LOOP:
1✔
948
      vlog_dump_for_loop(v, indent);
1✔
949
      break;
1✔
950
   case V_FOR_INIT:
1✔
951
      vlog_dump_for_init(v, indent);
1✔
952
      break;
1✔
953
   case V_FOR_STEP:
1✔
954
      vlog_dump_for_step(v, indent);
1✔
955
      break;
1✔
956
   case V_CASE:
1✔
957
      vlog_dump_case(v, indent);
1✔
958
      break;
1✔
959
   case V_COND_EXPR:
1✔
960
      vlog_dump_cond_expr(v, indent);
1✔
961
      break;
1✔
962
   case V_CASE_ITEM:
2✔
963
      vlog_dump_case_item(v, indent);
2✔
964
      break;
2✔
965
   case V_CONCAT:
2✔
966
      vlog_dump_concat(v, indent);
2✔
967
      break;
2✔
968
   case V_PARAM_DECL:
2✔
969
   case V_LOCALPARAM:
970
      vlog_dump_param_decl(v, indent);
2✔
971
      break;
2✔
972
   case V_PARAM_ASSIGN:
3✔
973
   case V_PORT_CONN:
974
      vlog_dump_param_assign(v, indent);
3✔
975
      break;
3✔
976
   case V_TASK_DECL:
×
977
      vlog_dump_task_decl(v, indent);
×
978
      break;
×
UNCOV
979
   case V_FUNC_DECL:
×
UNCOV
980
      vlog_dump_func_decl(v, indent);
×
UNCOV
981
      break;
×
UNCOV
982
   case V_WAIT:
×
UNCOV
983
      vlog_dump_wait(v, indent);
×
UNCOV
984
      break;
×
UNCOV
985
   default:
×
UNCOV
986
      print_syntax("\n");
×
UNCOV
987
      fflush(stdout);
×
988
      fatal_trace("cannot dump %s", vlog_kind_str(vlog_kind(v)));
989
   }
990
}
230✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc