DataModel.py

Summary

Lines:

93 of 103 covered (90.3%)

Excluded lines:

7

Coverage:

90.3%

Directory:

ToolSetup

Missed lines:

108-109, 123-124, 152-153, 173-174, 187-188

Source

pyEDAA/ToolSetup/DataModel.pycoveredpartialuncoveredexcludednot executable
1# ==================================================================================================================== #
2#              _____ ____    _        _    _____           _ ____       _                                              #
3#  _ __  _   _| ____|  _ \  / \      / \  |_   _|__   ___ | / ___|  ___| |_ _   _ _ __                                 #
4# | '_ \| | | |  _| | | | |/ _ \    / _ \   | |/ _ \ / _ \| \___ \ / _ \ __| | | | '_ \                                #
5# | |_) | |_| | |___| |_| / ___ \  / ___ \ _| | (_) | (_) | |___) |  __/ |_| |_| | |_) |                               #
6# | .__/ \__, |_____|____/_/   \_\/_/   \_(_)_|\___/ \___/|_|____/ \___|\__|\__,_| .__/                                #
7# |_|    |___/                                                                   |_|                                   #
8# ==================================================================================================================== #
9# Authors:                                                                                                             #
10#   Patrick Lehmann                                                                                                    #
11#                                                                                                                      #
12# License:                                                                                                             #
13# ==================================================================================================================== #
14# Copyright 2021-2026 Electronic Design Automation Abstraction (EDA²)                                                  #
15#                                                                                                                      #
16# Licensed under the Apache License, Version 2.0 (the "License");                                                      #
17# you may not use this file except in compliance with the License.                                                     #
18# You may obtain a copy of the License at                                                                              #
19#                                                                                                                      #
20#   http://www.apache.org/licenses/LICENSE-2.0                                                                         #
21#                                                                                                                      #
22# Unless required by applicable law or agreed to in writing, software                                                  #
23# distributed under the License is distributed on an "AS IS" BASIS,                                                    #
24# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.                                             #
25# See the License for the specific language governing permissions and                                                  #
26# limitations under the License.                                                                                       #
27#                                                                                                                      #
28# SPDX-License-Identifier: Apache-2.0                                                                                  #
29# ==================================================================================================================== #
30#
31"""Abstract data model for tool configurations."""
32from pathlib import Path
33from typing  import Optional as Nullable, Dict, ClassVar, Type
34
35from pyTooling.Decorators import export
36
37
38@export
39class ToolInformation:
40	_installationDirectory: Path
41	_binaryDirectory: Path
42	_version: Nullable[str]
43	_edition: Nullable[str]
44
45	def __init__(self, installationDirectory: Path, binaryDirectory: Path, version: Nullable[str] = None, edition: Nullable[str] = None) -> None:
46		self._installationDirectory = installationDirectory
47		self._binaryDirectory = binaryDirectory
48		self._version = version
49		self._edition = edition
50
51	@property
52	def InstallationDirectory(self) -> Path:
53		return self._installationDirectory
54
55	@property
56	def BinaryDirectory(self) -> Path:
57		return self._binaryDirectory
58
59	@property
60	def Version(self) -> str:
61		return self._version
62
63	@property
64	def Edition(self) -> str:
65		return self._edition
66
67
68@export
69class VendorInformation:
70	_installationDirectory: Path
71
72	def __init__(self, installationDirectory: Path) -> None:
73		self._installationDirectory = installationDirectory
74
75	@property
76	def InstallationDirectory(self) -> Path:
77		return self._installationDirectory
78
79
80@export
81class ToolInstance(ToolInformation):
82	_tool: Nullable["Tool"]
83
84	def __init__(self, installationDirectory: Path, binaryDirectory: Path, version: Nullable[str] = None, edition: Nullable[str] = None, parent: "Tool" = None) -> None:
85		super().__init__(installationDirectory, binaryDirectory, version, edition)
86		self._tool = parent
87
88	@property
89	def Tool(self) -> "Tool":
90		return self._tool
91
92
93@export
94class Tool:
95	_vendor: Nullable["Vendor"]
96	_name: str
97	_allLoaded: bool
98	_variants: Dict[str, ToolInstance]
99	_instanceClass: ClassVar[Type[ToolInstance]]
100
101	def __init__(self, name: str, parent: "Vendor" = None) -> None:
102		self._vendor = parent
103		self._name = name
104		self._allLoaded = False
105		self._variants = {}
106
107	def __contains__(self, key: str) -> bool:
108		self._LoadAllVariants()
109		return key in self._variants
110
111	def __getitem__(self, key: str) -> ToolInstance:
112		try:
113			return self._variants[key]
114		except KeyError:
115			return self._LoadVariant(key)
116
117	@property
118	def Vendor(self) -> "Vendor":
119		return self._vendor
120
121	@property
122	def Variants(self) -> Dict[str, ToolInstance]:
123		self._LoadAllVariants()
124		return self._variants
125
126	@property
127	def Default(self) -> ToolInstance:
128		raise NotImplementedError()
129
130	def _LoadVariant(self, key: str) -> ToolInstance:
131		raise NotImplementedError()
132
133	def _LoadAllVariants(self) -> None:
134		raise NotImplementedError()
135
136
137@export
138class Vendor(VendorInformation):
139	_installation: Nullable["Installation"]
140	_name: str
141	_allLoaded: bool
142	_tools: Dict[str, Tool]
143
144	def __init__(self, name: str, installationDirectory: Path, parent: "Installation" = None) -> None:
145		super().__init__(installationDirectory)
146		self._installation = parent
147		self._name = name
148		self._allLoaded = False
149		self._tools = {}
150
151	def __contains__(self, key: str) -> bool:
152		self._LoadAllTools()
153		return key in self._tools
154
155	def __getitem__(self, key: str) -> Tool:
156		try:
157			return self._tools[key]
158		except KeyError:
159			return self._LoadTool(key)
160
161	def _LoadTool(self, key: str) -> Tool:
162		raise NotImplementedError()
163
164	def _LoadAllTools(self) -> None:
165		raise NotImplementedError()
166
167	@property
168	def Installation(self) -> "Installation":
169		return self._installation
170
171	@property
172	def Tools(self) -> Dict[str, Tool]:
173		self._LoadAllTools()
174		return self._tools
175
176
177@export
178class Installation:
179	_allLoaded: bool
180	_vendors: Dict[str, Vendor]
181
182	def __init__(self) -> None:
183		self._allLoaded = False
184		self._vendors = {}
185
186	def __contains__(self, key: str) -> bool:
187		self._LoadAllVendors()
188		return key in self._vendor
189
190	def __getitem__(self, key: str) -> Vendor:
191		try:
192			return self._vendors[key]
193		except KeyError:
194			return self._LoadVendor(key)
195
196	def _LoadVendor(self, key: str) -> Vendor:
197		raise NotImplementedError()
198
199	def _LoadAllVendors(self) -> None:
200		raise NotImplementedError()