Skip to content

Commit a3cc612

Browse files
author
whitequark
committedNov 20, 2016
fhdl.verilog: escape names not starting with [a-zA-Z_].
1 parent 2b76c23 commit a3cc612

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed
 

Diff for: ‎migen/fhdl/verilog.py

+18-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from functools import partial
22
from operator import itemgetter
33
import collections
4+
import re
45

56
from migen.fhdl.structure import *
67
from migen.fhdl.structure import _Operator, _Slice, _Assign, _Fragment
@@ -31,14 +32,24 @@
3132
}
3233

3334

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+
3445
def _printsig(ns, s):
3546
if s.signed:
3647
n = "signed "
3748
else:
3849
n = ""
3950
if len(s) > 1:
4051
n += "[" + str(len(s)-1) + ":0] "
41-
n += ns.get_name(s)
52+
n += _printname(ns, s)
4253
return n
4354

4455

@@ -54,7 +65,7 @@ def _printexpr(ns, node):
5465
if isinstance(node, Constant):
5566
return _printconstant(node)
5667
elif isinstance(node, Signal):
57-
return ns.get_name(node), node.signed
68+
return _printname(ns, node), node.signed
5869
elif isinstance(node, _Operator):
5970
arity = len(node.operands)
6071
r1, s1 = _printexpr(ns, node.operands[0])
@@ -246,7 +257,7 @@ def _printcomb(f, ns,
246257
r += explanation
247258
r += syn_off
248259
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"
250261
r += syn_on
251262
r += "\n"
252263

@@ -267,15 +278,15 @@ def _printcomb(f, ns,
267278
r += "\t$display(\"Running comb block #" + str(n) + "\");\n"
268279
if blocking_assign:
269280
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"
271282
r += _printnode(ns, _AT_BLOCKING, 1, g[1])
272283
else:
273284
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"
275286
r += _printnode(ns, _AT_NONBLOCKING, 1, g[1])
276287
if dummy_signal:
277288
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"
279290
r += syn_on
280291
r += "end\n"
281292
r += "\n"
@@ -285,7 +296,7 @@ def _printcomb(f, ns,
285296
def _printsync(f, ns):
286297
r = ""
287298
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"
289300
r += _printnode(ns, _AT_SIGNAL, 1, v)
290301
r += "end\n\n"
291302
return r

1 commit comments

Comments
 (1)

sbourdeauducq commented on Nov 20, 2016

@sbourdeauducq
Member

Why did you need that? The names are normally derived from Python variable/attribute names that should already start with a-zA-Z_.

Please sign in to comment.