Skip to content

Commit 74420c9

Browse files
committed
Add keyword filtering to add escapes to RDL keywords used in identifiers. #7
1 parent 69dc006 commit 74420c9

File tree

3 files changed

+38
-12
lines changed

3 files changed

+38
-12
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# All SystemRDL 2.0 keywords
2+
RDL_KEYWORDS = {
3+
"abstract", "accesstype", "addressingtype", "addrmap", "alias", "all",
4+
"bit", "boolean", "bothedge", "compact", "component", "componentwidth",
5+
"constraint", "default", "encode", "enum", "external", "false", "field",
6+
"fullalign", "hw", "inside", "internal", "level", "longint", "mem", "na",
7+
"negedge", "nonsticky", "number", "onreadtype", "onwritetype", "posedge",
8+
"property", "r", "rclr", "ref", "reg", "regalign", "regfile", "rset",
9+
"ruser", "rw", "rw1", "signal", "string", "struct", "sw", "this", "true",
10+
"type", "unsigned", "w", "w1", "wclr", "woclr", "woset", "wot", "wr",
11+
"wset", "wuser", "wzc", "wzs", "wzt",
12+
}
13+
14+
def kw_filter(s: str) -> str:
15+
"""
16+
Make all user identifiers 'safe' and ensure they do not collide with
17+
SystemRDL keywords.
18+
19+
SystemRDL allows identifier escaping with a preceding backslash
20+
"""
21+
if s in RDL_KEYWORDS:
22+
s = "\\" + s
23+
return s

src/peakrdl_systemrdl/rdl_generator.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from .definition_generator import DefinitionGenerator
77
from .stringify import stringify_rdl_value
8+
from .identifier_filter import kw_filter as kwf
89

910
if TYPE_CHECKING:
1011
from systemrdl.node import AddressableNode
@@ -14,9 +15,9 @@ class RDLGenerator(DefinitionGenerator, RDLListener):
1415
def get_content(self, node: 'Node') -> str:
1516

1617
if node.type_name is not None:
17-
type_name = node.type_name
18+
type_name = kwf(node.type_name)
1819
else:
19-
type_name = node.inst_name
20+
type_name = kwf(node.inst_name)
2021

2122
self.start("addrmap", type_name)
2223
self.assign_properties(node)
@@ -39,7 +40,7 @@ def assign_properties(self, node: 'Node') -> None:
3940
self.add_content(f"{prop_name} = {value_s};")
4041

4142
def define_enum(self, enum: Type[rdltypes.UserEnum])-> None:
42-
self.push(f"enum {enum.type_name}", "")
43+
self.push(f"enum {kwf(enum.type_name)}", "")
4344
for identifier, member in enum.members.items():
4445
if member.rdl_name or member.rdl_desc:
4546
self.add_content(f"{identifier} = {member.value} {{")
@@ -61,22 +62,22 @@ def get_addressable_assignment(self, node: 'AddressableNode') -> str:
6162

6263
def enter_Addrmap(self, node: 'AddrmapNode') -> None:
6364
suffix = self.get_addressable_assignment(node)
64-
self.push("addrmap", node.inst_name, node.array_dimensions, suffix)
65+
self.push("addrmap", kwf(node.inst_name), node.array_dimensions, suffix)
6566
self.assign_properties(node)
6667

6768
def enter_Regfile(self, node: 'RegfileNode') -> None:
6869
suffix = self.get_addressable_assignment(node)
69-
self.push("regfile", node.inst_name, node.array_dimensions, suffix, node.external)
70+
self.push("regfile", kwf(node.inst_name), node.array_dimensions, suffix, node.external)
7071
self.assign_properties(node)
7172

7273
def enter_Mem(self, node: 'MemNode') -> None:
7374
suffix = self.get_addressable_assignment(node)
74-
self.push("mem", node.inst_name, node.array_dimensions, suffix, True)
75+
self.push("mem", kwf(node.inst_name), node.array_dimensions, suffix, True)
7576
self.assign_properties(node)
7677

7778
def enter_Reg(self, node: 'RegNode') -> None:
7879
suffix = self.get_addressable_assignment(node)
79-
self.push("reg", node.inst_name, node.array_dimensions, suffix, node.external)
80+
self.push("reg", kwf(node.inst_name), node.array_dimensions, suffix, node.external)
8081
self.assign_properties(node)
8182

8283
def enter_Field(self, node: 'FieldNode') -> None:
@@ -85,7 +86,7 @@ def enter_Field(self, node: 'FieldNode') -> None:
8586
if isinstance(reset, int):
8687
suffix += f" = 0x{reset:X}"
8788

88-
self.push("field", node.inst_name, suffix=suffix, is_external=node.external)
89+
self.push("field", kwf(node.inst_name), suffix=suffix, is_external=node.external)
8990

9091
encode = node.get_property('encode')
9192
if encode is not None:
@@ -94,7 +95,7 @@ def enter_Field(self, node: 'FieldNode') -> None:
9495
self.assign_properties(node)
9596

9697
def enter_Signal(self, node: 'SignalNode') -> None:
97-
self.push("signal", node.inst_name)
98+
self.push("signal", kwf(node.inst_name))
9899
self.assign_properties(node)
99100

100101
def exit_Component(self, node: 'Node') -> None:

src/peakrdl_systemrdl/stringify.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
from systemrdl import rdltypes, node
44

5+
from .identifier_filter import kw_filter as kwf
6+
57
def stringify_rdl_value(value: Any) -> str:
68
"""
79
Convert value into its RDL string.
@@ -57,13 +59,13 @@ def stringify_builtin_enum(value: rdltypes.BuiltinEnum) -> str:
5759

5860

5961
def stringify_user_enum_member(value: rdltypes.UserEnum) -> str:
60-
return "%s::%s" % (type(value).type_name, value.name) # type: ignore
62+
return "%s::%s" % (kwf(type(value).type_name), kwf(value.name)) # type: ignore
6163

6264

6365
def stringify_struct(value: rdltypes.UserStruct) -> str:
6466
elements = ["%s:%s" % (k, stringify_rdl_value(v)) for k,v in value._values.items()]
65-
return "%s'{%s}" % (type(value).type_name, ", ".join(elements))
67+
return "%s'{%s}" % (kwf(type(value).type_name), ", ".join(elements))
6668

6769

6870
def stringify_user_enum_type(value: rdltypes.UserEnum) -> str:
69-
return value.type_name # type: ignore
71+
return kwf(value.type_name) # type: ignore

0 commit comments

Comments
 (0)