1
1
from functools import partial
2
2
from operator import itemgetter
3
3
import collections
4
+ import re
4
5
5
6
from migen .fhdl .structure import *
6
7
from migen .fhdl .structure import _Operator , _Slice , _Assign , _Fragment
31
32
}
32
33
33
34
35
+ _name_re = re .compile ("^[a-zA-Z_]" )
36
+
37
+ def _printname (ns , s ):
38
+ n = ns .get_name (s )
39
+ if _name_re .match (n ):
40
+ return n
41
+ else :
42
+ return "\\ " + n + " "
43
+
44
+
34
45
def _printsig (ns , s ):
35
46
if s .signed :
36
47
n = "signed "
37
48
else :
38
49
n = ""
39
50
if len (s ) > 1 :
40
51
n += "[" + str (len (s )- 1 ) + ":0] "
41
- n += ns . get_name ( s )
52
+ n += _printname ( ns , s )
42
53
return n
43
54
44
55
@@ -54,7 +65,7 @@ def _printexpr(ns, node):
54
65
if isinstance (node , Constant ):
55
66
return _printconstant (node )
56
67
elif isinstance (node , Signal ):
57
- return ns . get_name ( node ), node .signed
68
+ return _printname ( ns , node ), node .signed
58
69
elif isinstance (node , _Operator ):
59
70
arity = len (node .operands )
60
71
r1 , s1 = _printexpr (ns , node .operands [0 ])
@@ -246,7 +257,7 @@ def _printcomb(f, ns,
246
257
r += explanation
247
258
r += syn_off
248
259
r += "reg " + _printsig (ns , dummy_s ) + ";\n "
249
- r += "initial " + ns . get_name ( dummy_s ) + " <= 1'd0;\n "
260
+ r += "initial " + _printname ( ns , dummy_s ) + " <= 1'd0;\n "
250
261
r += syn_on
251
262
r += "\n "
252
263
@@ -267,15 +278,15 @@ def _printcomb(f, ns,
267
278
r += "\t $display(\" Running comb block #" + str (n ) + "\" );\n "
268
279
if blocking_assign :
269
280
for t in g [0 ]:
270
- r += "\t " + ns . get_name ( t ) + " = " + _printexpr (ns , t .reset )[0 ] + ";\n "
281
+ r += "\t " + _printname ( ns , t ) + " = " + _printexpr (ns , t .reset )[0 ] + ";\n "
271
282
r += _printnode (ns , _AT_BLOCKING , 1 , g [1 ])
272
283
else :
273
284
for t in g [0 ]:
274
- r += "\t " + ns . get_name ( t ) + " <= " + _printexpr (ns , t .reset )[0 ] + ";\n "
285
+ r += "\t " + _printname ( ns , t ) + " <= " + _printexpr (ns , t .reset )[0 ] + ";\n "
275
286
r += _printnode (ns , _AT_NONBLOCKING , 1 , g [1 ])
276
287
if dummy_signal :
277
288
r += syn_off
278
- r += "\t " + ns . get_name ( dummy_d ) + " <= " + ns . get_name ( dummy_s ) + ";\n "
289
+ r += "\t " + _printname ( ns , dummy_d ) + " <= " + _printname ( ns , dummy_s ) + ";\n "
279
290
r += syn_on
280
291
r += "end\n "
281
292
r += "\n "
@@ -285,7 +296,7 @@ def _printcomb(f, ns,
285
296
def _printsync (f , ns ):
286
297
r = ""
287
298
for k , v in sorted (f .sync .items (), key = itemgetter (0 )):
288
- r += "always @(posedge " + ns . get_name ( f .clock_domains [k ].clk ) + ") begin\n "
299
+ r += "always @(posedge " + _printname ( ns , f .clock_domains [k ].clk ) + ") begin\n "
289
300
r += _printnode (ns , _AT_SIGNAL , 1 , v )
290
301
r += "end\n \n "
291
302
return r
1 commit comments
sbourdeauducq commentedon Nov 20, 2016
Why did you need that? The names are normally derived from Python variable/attribute names that should already start with a-zA-Z_.