Skip to content

Commit 8fd67aa

Browse files
author
Krzysztof Szymanski
committed
Parse explicit VLNV in KPM frontend
1 parent 9ef98e3 commit 8fd67aa

6 files changed

Lines changed: 37 additions & 28 deletions

File tree

tests/tests_ir/frontend/test_kpm.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from pipeline_manager.dataflow_builder.data_structures import OutOfSpecificationNodeError
1010

1111
from examples.ir_examples.modules import ALL_MODULES
12-
from topwrap.backend.kpm.common import LayerType
12+
from topwrap.backend.kpm.common import LayerType, id_to_kpm_name
1313
from topwrap.frontend.kpm.common import KpmFrontendParseException
1414
from topwrap.frontend.kpm.dataflow import KpmDataflowFrontend
1515
from topwrap.frontend.kpm.frontend import KpmFrontend
@@ -101,7 +101,10 @@ def test_ir(self, files: dict[str, JsonType], file: str, validator: Callable[[Mo
101101
def test_non_default_version(self):
102102
mod = Module(id=Identifier(name="versioned_mod", version="2.0"), ports=[])
103103
front = KpmDataflowFrontend([mod])
104-
assert front._modmap[mod.id.name] is mod
104+
assert mod.id == Identifier(
105+
name="versioned_mod", version="2.0", library="libdefault", vendor="vendor"
106+
)
107+
assert front._modmap[id_to_kpm_name(mod.id)] == mod
105108

106109
def test_io_inference(self, files: dict[str, JsonType]):
107110
front = KpmDataflowFrontend(ALL_MODULES)

topwrap/backend/kpm/common.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,14 @@ class KpmNodeId:
6060

6161
@classmethod
6262
def from_ir_id(cls, id: Identifier):
63-
return cls(id.to_kpm_name(), f"{id.vendor}/{id.library}")
63+
return cls(id_to_kpm_name(id), f"{id.vendor}/{id.library}")
64+
65+
66+
def id_to_kpm_name(id: Identifier) -> str:
67+
"""
68+
Return KPM name from id in the format '{name} v{version} ({vendor}/{library})'.
69+
"""
70+
return f"{id.name} v{id.version} ({id.vendor}/{id.library})"
6471

6572

6673
def kpm_dir_from(dir: Union[PortDirection, InterfaceMode, str]) -> KpmDirection:

topwrap/frontend/kpm/common.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
from topwrap.frontend.frontend import FrontendParseException
1616
from topwrap.model.connections import PortDirection
1717
from topwrap.model.interface import InterfaceMode
18-
from topwrap.model.misc import TranslationError
18+
from topwrap.model.misc import (
19+
TranslationError,
20+
)
1921

2022

2123
class KpmFrontendParseException(FrontendParseException):

topwrap/frontend/kpm/dataflow.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,13 @@
5454
from topwrap.model.hdl_types import Bit, Logic
5555
from topwrap.model.interconnect import Interconnect
5656
from topwrap.model.interface import Interface, InterfaceDefinition
57-
from topwrap.model.misc import ElaboratableValue, FileReference, Identifier, ObjectId, QuerableView
57+
from topwrap.model.misc import (
58+
ElaboratableValue,
59+
FileReference,
60+
Identifier,
61+
ObjectId,
62+
QuerableView,
63+
)
5864
from topwrap.model.module import Design, Module
5965
from topwrap.util import JsonType, UnreachableError
6066

@@ -205,7 +211,7 @@ def __init__(self, modules: Iterable[Module]) -> None:
205211
for mod in modules:
206212
spec.add_module(mod)
207213
for node in spec._spec._get_nodes(False):
208-
if (add := node.get("additionalData")) is not None:
214+
if (add := node.get("additionalData", None)) is not None:
209215
self._modmap[node["name"]] = modids[Identifier(**add["full_module_id"])]
210216
self._spec = spec.build()
211217

topwrap/frontend/kpm/specification.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from pipeline_manager.dataflow_builder.entities import Direction
99

10-
from topwrap.backend.kpm.common import PORT_INTF_TYPE, KpmNodeAdditionalData, LayerType
10+
from topwrap.backend.kpm.common import PORT_INTF_TYPE, LayerType
1111
from topwrap.frontend.kpm.common import (
1212
KpmFrontendParseException,
1313
kpm_dir_to_ir_intf,
@@ -17,7 +17,12 @@
1717
from topwrap.kpm_common import SPECIFICATION_VERSION
1818
from topwrap.model.connections import Port
1919
from topwrap.model.interface import Interface, InterfaceDefinition
20-
from topwrap.model.misc import ElaboratableValue, FileReference, Identifier, Parameter
20+
from topwrap.model.misc import (
21+
ElaboratableValue,
22+
FileReference,
23+
Identifier,
24+
Parameter,
25+
)
2126
from topwrap.model.module import Module
2227
from topwrap.util import JsonType
2328

@@ -84,13 +89,13 @@ def parse(
8489
if node.get("layer", "") != LayerType.IP_CORE.value:
8590
continue
8691

87-
add: KpmNodeAdditionalData = node["additionalData"]
92+
add = node.get("additionalData", None)
93+
if add is None:
94+
raise KpmFrontendParseException(
95+
f"Node {node['name']} lacks additionalData vith VLNV"
96+
)
8897
mod = Module(
89-
id=Identifier(
90-
name=add["full_module_id"]["name"],
91-
vendor=add["full_module_id"]["vendor"],
92-
library=add["full_module_id"]["library"],
93-
),
98+
id=Identifier(**add["full_module_id"]),
9499
refs=[FileReference(source)] if source else (),
95100
)
96101

topwrap/model/misc.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -259,20 +259,6 @@ def combined(self) -> str:
259259
def __str__(self) -> str:
260260
return f"{self.vendor}:{self.library}:{self.name}:{self.version}"
261261

262-
def to_kpm_name(self) -> str:
263-
"""
264-
Return KPM name from id in the format "{name} v{version} ({vendor}/{library})".
265-
"""
266-
return f"{self.name} v{self.version} ({self.vendor}/{self.library})"
267-
268-
269-
def id_from_kpm_name(kpm_name: str) -> Identifier:
270-
name, rest = kpm_name.split(" v", 1)
271-
version, rest = rest.split(" (", 1)
272-
vendor, rest = rest.split("/", 1)
273-
library = rest[:-1]
274-
return Identifier(name, vendor, library, version)
275-
276262

277263
@dataclass
278264
class FileReference:

0 commit comments

Comments
 (0)