@@ -876,21 +876,23 @@ def tick_segment(self, n, symbol_len, segment_size):
876
876
num_tick = self ._tick + str (n )
877
877
return num_tick .ljust (symbol_len * segment_size )
878
878
879
- def render_val (self , w , n , current_val , symbol_len ):
879
+ def render_val (self , w , n , current_val , symbol_len , repr_func ):
880
880
if w is not self .prev_wire :
881
881
self .prev_wire = w
882
882
self .prior_val = current_val
883
- out = self ._render_val_with_prev (w , n , current_val , symbol_len )
883
+ out = self ._render_val_with_prev (w , n , current_val , symbol_len , repr_func )
884
884
self .prior_val = current_val
885
885
return out
886
886
887
- def _render_val_with_prev (self , w , n , current_val , symbol_len ):
887
+ def _render_val_with_prev (self , w , n , current_val , symbol_len , repr_func ):
888
888
"""Return a string encoding the given value in a waveform.
889
889
890
890
:param w: The WireVector we are rendering to a waveform
891
891
:param n: An integer from 0 to segment_len-1
892
892
:param current_val: the value to be rendered
893
893
:param symbol_len: and integer for how big to draw the current value
894
+ :param repr_func: function to use for representing the current_val;
895
+ examples are 'hex', 'oct', 'bin', and 'str' (for decimal). Defaults to 'hex'.
894
896
895
897
Returns a string of printed length symbol_len that will draw the
896
898
representation of current_val. The input prior_val is used to
@@ -900,9 +902,9 @@ def _render_val_with_prev(self, w, n, current_val, symbol_len):
900
902
if len (w ) > 1 :
901
903
out = self ._revstart
902
904
if current_val != self .prior_val :
903
- out += self ._x + hex (current_val ).rstrip ('L' ).ljust (sl )[:sl ]
905
+ out += self ._x + repr_func (current_val ).rstrip ('L' ).ljust (sl )[:sl ]
904
906
elif n == 0 :
905
- out += hex (current_val ).rstrip ('L' ).ljust (symbol_len )[:symbol_len ]
907
+ out += repr_func (current_val ).rstrip ('L' ).ljust (symbol_len )[:symbol_len ]
906
908
else :
907
909
out += ' ' * symbol_len
908
910
out += self ._revstop
@@ -1130,14 +1132,18 @@ def print_trace_strs(time):
1130
1132
1131
1133
def render_trace (
1132
1134
self , trace_list = None , file = sys .stdout , render_cls = default_renderer (),
1133
- symbol_len = 5 , segment_size = 5 , segment_delim = ' ' , extra_line = True ):
1135
+ symbol_len = 5 , repr_func = hex , segment_size = 5 , segment_delim = ' ' , extra_line = True ):
1134
1136
1135
1137
""" Render the trace to a file using unicode and ASCII escape sequences.
1136
1138
1137
1139
:param trace_list: A list of signal names to be output in the specified order.
1138
1140
:param file: The place to write output, default to stdout.
1139
1141
:param render_cls: A class that translates traces into output bytes.
1140
1142
:param symbol_len: The "length" of each rendered cycle in characters.
1143
+ If None, the length will be automatically set such that the largest
1144
+ represented value fits.
1145
+ :param repr_func: Function to use for representing each value in the trace;
1146
+ examples are 'hex', 'oct', 'bin', and 'str' (for decimal). Defaults to 'hex'.
1141
1147
:param segment_size: Traces are broken in the segments of this number of cycles.
1142
1148
:param segment_delim: The character to be output between segments.
1143
1149
:param extra_line: A Boolean to determine if we should print a blank line between signals.
@@ -1166,12 +1172,12 @@ def render_trace(
1166
1172
else :
1167
1173
self .render_trace_to_text (
1168
1174
trace_list = trace_list , file = file , render_cls = render_cls ,
1169
- symbol_len = symbol_len , segment_size = segment_size ,
1175
+ symbol_len = symbol_len , repr_func = repr_func , segment_size = segment_size ,
1170
1176
segment_delim = segment_delim , extra_line = extra_line )
1171
1177
1172
1178
def render_trace_to_text (
1173
1179
self , trace_list , file , render_cls ,
1174
- symbol_len , segment_size , segment_delim , extra_line ):
1180
+ symbol_len , repr_func , segment_size , segment_delim , extra_line ):
1175
1181
1176
1182
renderer = render_cls ()
1177
1183
@@ -1185,7 +1191,8 @@ def formatted_trace_line(wire, trace):
1185
1191
self ._wires [wire ],
1186
1192
i % segment_size ,
1187
1193
trace [i ],
1188
- symbol_len )
1194
+ symbol_len ,
1195
+ repr_func )
1189
1196
return heading + trace_line
1190
1197
1191
1198
# default to printing all signals in sorted order
@@ -1204,6 +1211,12 @@ def formatted_trace_line(wire, trace):
1204
1211
"untraceable wires were removed prior to simulation, "
1205
1212
"if a CompiledSimulation was used." )
1206
1213
1214
+ if symbol_len is None :
1215
+ maxvallen = 0
1216
+ for trace in self .trace .values ():
1217
+ maxvallen = max (maxvallen , max (len (repr_func (v )) for v in trace ))
1218
+ symbol_len = maxvallen + 1
1219
+
1207
1220
# print the 'ruler' which is just a list of 'ticks'
1208
1221
# mapped by the pretty map
1209
1222
0 commit comments