@@ -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