Skip to content

Commit 89e991d

Browse files
committed
Add Node.component_type_name property
1 parent 723afcd commit 89e991d

File tree

2 files changed

+86
-27
lines changed

2 files changed

+86
-27
lines changed

src/systemrdl/node.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,17 @@ def __deepcopy__(self, memo: Dict[int, Any]) -> 'Node':
6464
setattr(result, k, deepcopy(v, memo))
6565
return result
6666

67+
@property
68+
def component_type_name(self) -> str:
69+
"""
70+
Returns the component type name that this node represents.
71+
For example: "reg", "field", "addrmap", etc...
72+
73+
74+
.. versionadded:: 1.31
75+
"""
76+
raise NotImplementedError
77+
6778
@overload
6879
@staticmethod
6980
def _factory(inst: comp.Field, env: 'RDLEnvironment', parent: Optional['Node']) -> 'FieldNode': ...
@@ -1268,6 +1279,10 @@ def top(self) -> 'AddrmapNode':
12681279
return child
12691280
raise RuntimeError
12701281

1282+
@property
1283+
def component_type_name(self) -> Literal['$root']:
1284+
return "$root"
1285+
12711286
#===============================================================================
12721287
class SignalNode(VectorNode):
12731288
"""
@@ -1278,6 +1293,10 @@ class SignalNode(VectorNode):
12781293
parent: Node
12791294
inst: comp.Signal
12801295

1296+
@property
1297+
def component_type_name(self) -> Literal['signal']:
1298+
return "signal"
1299+
12811300
@overload # type: ignore[override]
12821301
def get_property(self, prop_name: Literal["signalwidth"], *, default: T)-> Union[int, T]: ...
12831302

@@ -1357,6 +1376,10 @@ class FieldNode(VectorNode):
13571376
parent: 'RegNode'
13581377
inst: comp.Field
13591378

1379+
@property
1380+
def component_type_name(self) -> Literal['field']:
1381+
return "field"
1382+
13601383
@overload # type: ignore[override]
13611384
def get_property(self, prop_name: Literal["dontcompare"], *, default: T)-> Union[Union[int, bool], T]: ...
13621385

@@ -2022,6 +2045,9 @@ def has_overlaps(self) -> bool:
20222045
def overlapping_fields(self) -> List['FieldNode']:
20232046
"""
20242047
Returns a list of all other fields that overlap with this field.
2048+
2049+
2050+
.. versionadded:: 1.31
20252051
"""
20262052
fields = []
20272053
for field_name in self.inst.overlaps_with_names:
@@ -2041,6 +2067,10 @@ class RegNode(AddressableNode):
20412067
parent: Union['AddrmapNode', 'RegNode', 'MemNode']
20422068
inst: comp.Reg
20432069

2070+
@property
2071+
def component_type_name(self) -> Literal['reg']:
2072+
return "reg"
2073+
20442074
@overload # type: ignore[override]
20452075
def get_property(self, prop_name: Literal["dontcompare"], *, default: T)-> Union[bool, T]: ...
20462076

@@ -2371,6 +2401,9 @@ def has_overlaps(self) -> bool:
23712401
def overlapping_regs(self) -> List['RegNode']:
23722402
"""
23732403
Returns a list of all other registers that overlap with this register.
2404+
2405+
2406+
.. versionadded:: 1.31
23742407
"""
23752408
regs = []
23762409
for reg_name in self.inst.overlaps_with_names:
@@ -2391,6 +2424,10 @@ class RegfileNode(AddressableNode):
23912424
parent: Union['AddrmapNode', 'RegfileNode']
23922425
inst: comp.Regfile
23932426

2427+
@property
2428+
def component_type_name(self) -> Literal['regfile']:
2429+
return "regfile"
2430+
23942431
@overload # type: ignore[override]
23952432
def get_property(self, prop_name: Literal["dontcompare"], *, default: T)-> Union[bool, T]: ...
23962433

@@ -2474,6 +2511,10 @@ class AddrmapNode(AddressableNode):
24742511
parent: Union['AddrmapNode', RootNode]
24752512
inst: comp.Addrmap
24762513

2514+
@property
2515+
def component_type_name(self) -> Literal['addrmap']:
2516+
return "addrmap"
2517+
24772518
@overload # type: ignore[override]
24782519
def get_property(self, prop_name: Literal["dontcompare"], *, default: T)-> Union[bool, T]: ...
24792520

@@ -2605,6 +2646,10 @@ class MemNode(AddressableNode):
26052646
parent: AddrmapNode
26062647
inst: comp.Mem
26072648

2649+
@property
2650+
def component_type_name(self) -> Literal['mem']:
2651+
return "mem"
2652+
26082653
@overload # type: ignore[override]
26092654
def get_property(self, prop_name: Literal["hdl_path_slice"], *, default: T)-> Union[Optional[List[str]], T]: ...
26102655

test/test_node_utils.py

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from unittest_utils import RDLSourceTestCase
22
from systemrdl.rdltypes import PrecedenceType
3-
from systemrdl.node import RegNode, FieldNode
3+
from systemrdl.node import RegNode, FieldNode, RegfileNode, AddrmapNode, SignalNode, MemNode
44

55
class TestNodeUtils(RDLSourceTestCase):
66

@@ -346,10 +346,10 @@ def test_names(self):
346346
["rdl_src/nested_params.rdl"],
347347
"nested_params"
348348
)
349-
r1 = top.find_by_path("nested_params.r1_inst")
350-
r1_2 = top.find_by_path("nested_params.r1_inst2")
351-
f = top.find_by_path("nested_params.r1_inst.f")
352-
f2 = top.find_by_path("nested_params.r1_inst.f2")
349+
r1: RegNode = top.find_by_path("nested_params.r1_inst")
350+
r1_2: RegNode = top.find_by_path("nested_params.r1_inst2")
351+
f: FieldNode = top.find_by_path("nested_params.r1_inst.f")
352+
f2: FieldNode = top.find_by_path("nested_params.r1_inst.f2")
353353

354354
self.assertEqual(r1.inst_name, "r1_inst")
355355
self.assertEqual(r1.type_name, "r1_WIDTH_5")
@@ -373,7 +373,7 @@ def test_owning_addrmap(self):
373373
["rdl_src/references_default_lhs.rdl"],
374374
"top"
375375
)
376-
top_addrmap = top.find_by_path("top")
376+
top_addrmap: AddrmapNode = top.find_by_path("top")
377377
self.assertIsNone(top.owning_addrmap)
378378
self.assertIsNone(top.find_by_path("glbl_sig").owning_addrmap)
379379
self.assertEqual(top_addrmap.owning_addrmap, top_addrmap)
@@ -386,9 +386,9 @@ def test_find_by_path_via_parent(self):
386386
"hier"
387387
)
388388

389-
a = top.find_by_path("hier.x.a")
390-
b = top.find_by_path("hier.y.b")
391-
ba = top.find_by_path("hier.y.b.a")
389+
a: RegNode = top.find_by_path("hier.x.a")
390+
b: RegNode = top.find_by_path("hier.y.b")
391+
ba: FieldNode = top.find_by_path("hier.y.b.a")
392392

393393
self.assertEqual(top.find_by_path("hier.x.b.^.a"), a)
394394
self.assertEqual(ba.find_by_path("^"), b)
@@ -400,8 +400,8 @@ def test_typed_iterators(self):
400400
"hier"
401401
)
402402

403-
x = top.find_by_path("hier.x")
404-
a = top.find_by_path("hier.x.a")
403+
x: RegfileNode = top.find_by_path("hier.x")
404+
a: RegNode = top.find_by_path("hier.x.a")
405405

406406
with self.subTest("registers"):
407407
paths = [n.get_path() for n in top.top.registers()]
@@ -432,22 +432,22 @@ def test_field_prop_helpers(self):
432432
"top"
433433
)
434434

435-
f1 = root.find_by_path("top.r1.f1")
436-
f2 = root.find_by_path("top.r1.f2")
437-
f3 = root.find_by_path("top.r1.f3")
438-
f4 = root.find_by_path("top.r1.f4")
439-
f5 = root.find_by_path("top.r1.f5")
440-
f6 = root.find_by_path("top.r1.f6")
441-
f7 = root.find_by_path("top.r1.f7")
442-
f8 = root.find_by_path("top.r1.f8")
443-
f9 = root.find_by_path("top.r1.f9")
444-
f10 = root.find_by_path("top.r1.f10")
445-
f11 = root.find_by_path("top.r1.f11")
446-
f12 = root.find_by_path("top.r1.f12")
447-
448-
r1 = root.find_by_path("top.r1")
449-
r2 = root.find_by_path("top.r2")
450-
r3 = root.find_by_path("top.r3")
435+
f1: FieldNode = root.find_by_path("top.r1.f1")
436+
f2: FieldNode = root.find_by_path("top.r1.f2")
437+
f3: FieldNode = root.find_by_path("top.r1.f3")
438+
f4: FieldNode = root.find_by_path("top.r1.f4")
439+
f5: FieldNode = root.find_by_path("top.r1.f5")
440+
f6: FieldNode = root.find_by_path("top.r1.f6")
441+
f7: FieldNode = root.find_by_path("top.r1.f7")
442+
f8: FieldNode = root.find_by_path("top.r1.f8")
443+
f9: FieldNode = root.find_by_path("top.r1.f9")
444+
f10: FieldNode = root.find_by_path("top.r1.f10")
445+
f11: FieldNode = root.find_by_path("top.r1.f11")
446+
f12: FieldNode = root.find_by_path("top.r1.f12")
447+
448+
r1: RegNode = root.find_by_path("top.r1")
449+
r2: RegNode = root.find_by_path("top.r2")
450+
r3: RegNode = root.find_by_path("top.r3")
451451

452452
self.assertFalse(f1.is_volatile)
453453
self.assertTrue(f2.is_volatile)
@@ -557,3 +557,17 @@ def tup(field: FieldNode):
557557
self.assertEqual( f[4], (17, 16))
558558
self.assertEqual(tup(f[5]), (29, 18))
559559
self.assertEqual( f[6], (31, 30))
560+
561+
562+
def test_component_type_name(self):
563+
564+
top = self.compile(
565+
["rdl_src/address_packing.rdl"],
566+
"hier"
567+
)
568+
self.assertEqual(top.component_type_name, "$root")
569+
self.assertEqual(top.find_by_path("hier").component_type_name, "addrmap")
570+
self.assertEqual(top.find_by_path("hier.x").component_type_name, "regfile")
571+
self.assertEqual(top.find_by_path("hier.x.a").component_type_name, "reg")
572+
self.assertEqual(top.find_by_path("hier.x.a.a").component_type_name, "field")
573+
self.assertEqual(top.find_by_path("hier.z_mem").component_type_name, "mem")

0 commit comments

Comments
 (0)