@@ -876,35 +876,46 @@ 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 , repr_func ):
879
+ def render_val (self , w , n , current_val , symbol_len , repr_func , repr_per_name ):
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 , repr_func )
883
+ out = self ._render_val_with_prev (w , n , current_val , symbol_len , repr_func , repr_per_name )
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 , repr_func ):
887
+ def _render_val_with_prev (self , w , n , current_val , symbol_len , repr_func , repr_per_name ):
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
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'.
895
+ examples are 'hex', 'oct', 'bin', 'str' (for decimal), or even the name
896
+ of an IntEnum class you know the value will belong to. Defaults to 'hex'.
897
+ :param repr_per_name: Map from signal name to a function that takes in the signal's
898
+ value and returns a user-defined representation. If a signal name is
899
+ not found in the map, the argument `repr_func` will be used instead.
896
900
897
901
Returns a string of printed length symbol_len that will draw the
898
902
representation of current_val. The input prior_val is used to
899
903
render transitions.
900
904
"""
905
+ def to_str (v ):
906
+ f = repr_per_name .get (w .name )
907
+ if f is None :
908
+ return str (repr_func (v ))
909
+ else :
910
+ return str (f (v ))
911
+
901
912
sl = symbol_len - 1
902
913
if len (w ) > 1 :
903
914
out = self ._revstart
904
915
if current_val != self .prior_val :
905
- out += self ._x + repr_func (current_val ).rstrip ('L' ).ljust (sl )[:sl ]
916
+ out += self ._x + to_str (current_val ).rstrip ('L' ).ljust (sl )[:sl ]
906
917
elif n == 0 :
907
- out += repr_func (current_val ).rstrip ('L' ).ljust (symbol_len )[:symbol_len ]
918
+ out += to_str (current_val ).rstrip ('L' ).ljust (symbol_len )[:symbol_len ]
908
919
else :
909
920
out += ' ' * symbol_len
910
921
out += self ._revstop
@@ -1132,7 +1143,8 @@ def print_trace_strs(time):
1132
1143
1133
1144
def render_trace (
1134
1145
self , trace_list = None , file = sys .stdout , render_cls = default_renderer (),
1135
- symbol_len = 5 , repr_func = hex , segment_size = 5 , segment_delim = ' ' , extra_line = True ):
1146
+ symbol_len = 5 , repr_func = hex , repr_per_name = {}, segment_size = 5 ,
1147
+ segment_delim = ' ' , extra_line = True ):
1136
1148
1137
1149
""" Render the trace to a file using unicode and ASCII escape sequences.
1138
1150
@@ -1144,6 +1156,9 @@ def render_trace(
1144
1156
represented value fits.
1145
1157
:param repr_func: Function to use for representing each value in the trace;
1146
1158
examples are 'hex', 'oct', 'bin', and 'str' (for decimal). Defaults to 'hex'.
1159
+ :param repr_per_name: Map from signal name to a function that takes in the signal's
1160
+ value and returns a user-defined representation. If a signal name is
1161
+ not found in the map, the argument `repr_func` will be used instead.
1147
1162
:param segment_size: Traces are broken in the segments of this number of cycles.
1148
1163
:param segment_delim: The character to be output between segments.
1149
1164
:param extra_line: A Boolean to determine if we should print a blank line between signals.
@@ -1172,12 +1187,12 @@ def render_trace(
1172
1187
else :
1173
1188
self .render_trace_to_text (
1174
1189
trace_list = trace_list , file = file , render_cls = render_cls ,
1175
- symbol_len = symbol_len , repr_func = repr_func , segment_size = segment_size ,
1176
- segment_delim = segment_delim , extra_line = extra_line )
1190
+ symbol_len = symbol_len , repr_func = repr_func , repr_per_name = repr_per_name ,
1191
+ segment_size = segment_size , segment_delim = segment_delim , extra_line = extra_line )
1177
1192
1178
1193
def render_trace_to_text (
1179
1194
self , trace_list , file , render_cls ,
1180
- symbol_len , repr_func , segment_size , segment_delim , extra_line ):
1195
+ symbol_len , repr_func , repr_per_name , segment_size , segment_delim , extra_line ):
1181
1196
1182
1197
renderer = render_cls ()
1183
1198
@@ -1192,7 +1207,8 @@ def formatted_trace_line(wire, trace):
1192
1207
i % segment_size ,
1193
1208
trace [i ],
1194
1209
symbol_len ,
1195
- repr_func )
1210
+ repr_func ,
1211
+ repr_per_name )
1196
1212
return heading + trace_line
1197
1213
1198
1214
# default to printing all signals in sorted order
@@ -1212,9 +1228,17 @@ def formatted_trace_line(wire, trace):
1212
1228
"if a CompiledSimulation was used." )
1213
1229
1214
1230
if symbol_len is None :
1231
+
1232
+ def to_str (v , name ):
1233
+ f = repr_per_name .get (name )
1234
+ if f is None :
1235
+ return str (repr_func (v ))
1236
+ else :
1237
+ return str (f (v ))
1238
+
1215
1239
maxvallen = 0
1216
- for trace in self .trace .values ():
1217
- maxvallen = max (maxvallen , max (len (repr_func ( v )) for v in trace ))
1240
+ for name , trace in self .trace .items ():
1241
+ maxvallen = max (maxvallen , max (len (to_str ( v , name )) for v in trace ))
1218
1242
symbol_len = maxvallen + 1
1219
1243
1220
1244
# print the 'ruler' which is just a list of 'ticks'
0 commit comments