Skip to content

Commit 9669491

Browse files
authored
Merge pull request #282 from dgeelen/dgeelen/cmdline_vcd
Add support for configuring VCD traces from the commandline.
2 parents 5669a06 + 2d2c42e commit 9669491

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

simavr/sim/run_avr.c

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,76 @@ main(
121121
display_usage(basename(argv[0]));
122122
} else if (!strcmp(argv[pi], "-t") || !strcmp(argv[pi], "--trace")) {
123123
trace++;
124+
} else if (!strcmp(argv[pi], "--vcd-trace-name")) {
125+
if (pi + 1 >= argc) {
126+
fprintf(stderr, "%s: missing mandatory argument for %s.\n", argv[0], argv[pi]);
127+
exit(1);
128+
}
129+
++pi;
130+
strncpy(f.tracename, argv[pi], sizeof(f.tracename));
131+
} else if (!strcmp(argv[pi], "--add-vcd-trace")) {
132+
if (pi + 1 >= argc) {
133+
fprintf(stderr, "%s: missing mandatory argument for %s.\n", argv[0], argv[pi]);
134+
exit(1);
135+
}
136+
++pi;
137+
struct {
138+
char kind[64];
139+
uint8_t mask;
140+
uint16_t addr;
141+
char name[64];
142+
} trace;
143+
const int n_args = sscanf(
144+
argv[pi],
145+
"%63[^=]=%63[^@]@0x%hx/0x%hhx",
146+
&trace.name[0],
147+
&trace.kind[0],
148+
&trace.addr,
149+
&trace.mask
150+
);
151+
if (n_args != 4) {
152+
--pi;
153+
fprintf(stderr, "%s: format for %s is name=kind@addr/mask.\n", argv[0], argv[pi]);
154+
exit(1);
155+
}
156+
157+
/****/ if (!strcmp(trace.kind, "portpin")) {
158+
f.trace[f.tracecount].kind = AVR_MMCU_TAG_VCD_PORTPIN;
159+
} else if (!strcmp(trace.kind, "irq")) {
160+
f.trace[f.tracecount].kind = AVR_MMCU_TAG_VCD_IRQ;
161+
} else if (!strcmp(trace.kind, "trace")) {
162+
f.trace[f.tracecount].kind = AVR_MMCU_TAG_VCD_TRACE;
163+
} else {
164+
fprintf(
165+
stderr,
166+
"%s: unknown trace kind '%s', not one of 'portpin', 'irq', or 'trace'.\n",
167+
argv[0],
168+
trace.kind
169+
);
170+
exit(1);
171+
}
172+
f.trace[f.tracecount].mask = trace.mask;
173+
f.trace[f.tracecount].addr = trace.addr;
174+
strncpy(f.trace[f.tracecount].name, trace.name, sizeof(f.trace[f.tracecount].name));
175+
176+
printf(
177+
"Adding %s trace on address 0x%04x, mask 0x%02x ('%s')\n",
178+
f.trace[f.tracecount].kind == AVR_MMCU_TAG_VCD_PORTPIN ? "portpin"
179+
: f.trace[f.tracecount].kind == AVR_MMCU_TAG_VCD_IRQ ? "irq"
180+
: f.trace[f.tracecount].kind == AVR_MMCU_TAG_VCD_TRACE ? "trace"
181+
: "unknown",
182+
f.trace[f.tracecount].addr,
183+
f.trace[f.tracecount].mask,
184+
f.trace[f.tracecount].name
185+
);
186+
187+
++f.tracecount;
188+
} else if (!strcmp(argv[pi], "--vcd-trace-file")) {
189+
if (pi + 1 >= argc) {
190+
fprintf(stderr, "%s: missing mandatory argument for %s.\n", argv[0], argv[pi]);
191+
exit(1);
192+
}
193+
strncpy(f.tracename, argv[++pi], sizeof(f.tracename));
124194
} else if (!strcmp(argv[pi], "-ti")) {
125195
if (pi < argc-1)
126196
trace_vectors[trace_vectors_count++] = atoi(argv[++pi]);

0 commit comments

Comments
 (0)