Coverage for pyVHDLModel/IEEE.py: 97%
210 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-03-07 22:12 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-03-07 22:12 +0000
1# ==================================================================================================================== #
2# __ ___ _ ____ _ __ __ _ _ #
3# _ __ _ \ \ / / | | | _ \| | | \/ | ___ __| | ___| | #
4# | '_ \| | | \ \ / /| |_| | | | | | | |\/| |/ _ \ / _` |/ _ \ | #
5# | |_) | |_| |\ V / | _ | |_| | |___| | | | (_) | (_| | __/ | #
6# | .__/ \__, | \_/ |_| |_|____/|_____|_| |_|\___/ \__,_|\___|_| #
7# |_| |___/ #
8# ==================================================================================================================== #
9# Authors: #
10# Patrick Lehmann #
11# #
12# License: #
13# ==================================================================================================================== #
14# Copyright 2017-2025 Patrick Lehmann - Boetzingen, Germany #
15# Copyright 2016-2017 Patrick Lehmann - Dresden, Germany #
16# #
17# Licensed under the Apache License, Version 2.0 (the "License"); #
18# you may not use this file except in compliance with the License. #
19# You may obtain a copy of the License at #
20# #
21# http://www.apache.org/licenses/LICENSE-2.0 #
22# #
23# Unless required by applicable law or agreed to in writing, software #
24# distributed under the License is distributed on an "AS IS" BASIS, #
25# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
26# See the License for the specific language governing permissions and #
27# limitations under the License. #
28# #
29# SPDX-License-Identifier: Apache-2.0 #
30# ==================================================================================================================== #
31#
32"""This module contains library and package declarations for VHDL library ``IEEE``."""
34from typing import Optional as Nullable
36from pyTooling.Decorators import export, readonly
38from pyVHDLModel import IEEEFlavor
39from pyVHDLModel.Exception import VHDLModelException
40from pyVHDLModel.Expression import EnumerationLiteral
41from pyVHDLModel.Name import SimpleName
42from pyVHDLModel.Predefined import PredefinedLibrary, PredefinedPackage, PredefinedPackageBody
43from pyVHDLModel.Symbol import SimpleSubtypeSymbol
44from pyVHDLModel.Type import EnumeratedType, ArrayType, Subtype
47@export
48class Ieee(PredefinedLibrary):
49 """
50 Predefined VHDL library ``ieee``.
52 The following predefined packages are in this library:
54 * Math
56 * :class:`~pyVHDLModel.IEEE.Math_Real`
57 * :class:`~pyVHDLModel.IEEE.Math_Complex`
59 * Std_logic
61 * :class:`~pyVHDLModel.IEEE.Std_Logic_1164`
62 * :class:`~pyVHDLModel.IEEE.Std_Logic_TextIO`
64 * Numeric
66 * :class:`~pyVHDLModel.IEEE.Numeric_Bit`
67 * :class:`~pyVHDLModel.IEEE.Numeric_Bit_Unsigned`
68 * :class:`~pyVHDLModel.IEEE.Numeric_Std`
69 * :class:`~pyVHDLModel.IEEE.Numeric_Std_Unsigned`
71 * Fixed/floating point
73 * :class:`~pyVHDLModel.IEEE.Fixed_Float_Types`
74 * :class:`~pyVHDLModel.IEEE.Fixed_Generic_Pkg`
75 * :class:`~pyVHDLModel.IEEE.Fixed_Pkg`
76 * :class:`~pyVHDLModel.IEEE.Float_Generic_Pkg`
77 * :class:`~pyVHDLModel.IEEE.Float_Pkg`
79 * Mentor Graphics packages
81 * :class:`~pyVHDLModel.IEEE.Std_logic_arith`
83 * Synopsys packages
85 * :class:`~pyVHDLModel.IEEE.Std_logic_arith`
86 * :class:`~pyVHDLModel.IEEE.Std_logic_misc`
87 * :class:`~pyVHDLModel.IEEE.Std_logic_signed`
88 * :class:`~pyVHDLModel.IEEE.Std_logic_textio`
89 * :class:`~pyVHDLModel.IEEE.Std_logic_unsigned`
91 .. seealso::
93 Other predefined libraries:
94 * Library :class:`~pyVHDLModel.STD.Std`
95 """
97 _flavor: IEEEFlavor
99 def __init__(self, flavor: Nullable[IEEEFlavor] = None) -> None:
100 super().__init__(PACKAGES)
102 self._flavor = IEEEFlavor.IEEE
103 if flavor is None or flavor is IEEEFlavor.IEEE:
104 pass
105 elif flavor is IEEEFlavor.MentorGraphics:
106 self.LoadMentorGraphicsPackages()
107 elif flavor is IEEEFlavor.Synopsys: 107 ↛ 110line 107 didn't jump to line 110 because the condition on line 107 was always true
108 self.LoadSynopsysPackages()
109 else:
110 raise VHDLModelException(f"Unknown IEEE library flavor '{flavor}'.")
112 @readonly
113 def Flavor(self) -> IEEEFlavor:
114 return self._flavor
116 def LoadMentorGraphicsPackages(self) -> None:
117 if self._flavor is not IEEEFlavor.IEEE: 117 ↛ 118line 117 didn't jump to line 118 because the condition on line 117 was never true
118 raise VHDLModelException(f"IEEE library flavor is '{self._flavor}' and can't be changed to '{IEEEFlavor.MentorGraphics}'.")
120 self._flavor = IEEEFlavor.MentorGraphics
121 self.AddPackages(MENTOR_GRAPHICS_PACKAGES)
123 def LoadSynopsysPackages(self) -> None:
124 if self._flavor is not IEEEFlavor.IEEE: 124 ↛ 125line 124 didn't jump to line 125 because the condition on line 124 was never true
125 raise VHDLModelException(f"IEEE library flavor is '{self._flavor}' and can't be changed to '{IEEEFlavor.MentorGraphics}'.")
127 self._flavor = IEEEFlavor.Synopsys
128 self.AddPackages(SYNOPSYS_PACKAGES)
131@export
132class Math_Real(PredefinedPackage):
133 """
134 Predefined package ``ieee.math_real``.
135 """
138@export
139class Math_Real_Body(PredefinedPackageBody):
140 """
141 Predefined package body of package ``ieee.math_real``.
142 """
145@export
146class Math_Complex(PredefinedPackage):
147 """
148 Predefined package ``ieee.math_complex``.
149 """
151 def __init__(self) -> None:
152 super().__init__()
154 self._AddPackageClause(("work.math_real.all",))
157@export
158class Math_Complex_Body(PredefinedPackageBody):
159 """
160 Predefined package body of package ``ieee.math_complex``.
161 """
163 def __init__(self) -> None:
164 super().__init__()
166 self._AddPackageClause(("work.math_real.all",))
169@export
170class Std_Logic_1164(PredefinedPackage):
171 """
172 Predefined package ``ieee.std_logic_1164``.
174 Predefined types:
176 * ``std_ulogic``, ``std_ulogic_vector``
177 * ``std_logic``, ``std_logic_vector``
178 """
180 def __init__(self) -> None:
181 super().__init__()
183 self._AddPackageClause(("STD.TEXTIO.all", ))
185 stdULogic = EnumeratedType("std_ulogic", (
186 EnumerationLiteral("U"),
187 EnumerationLiteral("X"),
188 EnumerationLiteral("0"),
189 EnumerationLiteral("1"),
190 EnumerationLiteral("Z"),
191 EnumerationLiteral("W"),
192 EnumerationLiteral("L"),
193 EnumerationLiteral("H"),
194 EnumerationLiteral("-"),
195 ), None)
196 self._types[stdULogic._normalizedIdentifier] = stdULogic
197 self._declaredItems.append(stdULogic)
199 stdULogicVector = ArrayType("std_ulogic_vector", (SimpleSubtypeSymbol(SimpleName("natural")),), SimpleSubtypeSymbol(SimpleName("std_ulogic")), None)
200 self._types[stdULogicVector._normalizedIdentifier] = stdULogicVector
201 self._declaredItems.append(stdULogicVector)
203 stdLogic = Subtype("std_logic", SimpleSubtypeSymbol(SimpleName("std_ulogic")), None)
204 stdLogic._baseType = stdULogic
205 self._subtypes[stdLogic._normalizedIdentifier] = stdLogic
206 self._declaredItems.append(stdLogic)
208 stdLogicVector = Subtype("std_logic_vector", SimpleSubtypeSymbol(SimpleName("std_ulogic_vector")), None)
209 stdLogicVector._baseType = stdULogicVector
210 self._subtypes[stdLogicVector._normalizedIdentifier] = stdLogicVector
211 self._declaredItems.append(stdLogicVector)
214@export
215class Std_Logic_1164_Body(PredefinedPackageBody):
216 """
217 Predefined package body of package ``ieee.std_logic_1164``.
218 """
221@export
222class Std_Logic_TextIO(PredefinedPackage):
223 """
224 Predefined package ``ieee.std_logic_textio``.
225 """
227 def __init__(self) -> None:
228 super().__init__()
230 self._AddPackageClause(("STD.TEXTIO.all", ))
231 self._AddLibraryClause(("IEEE", ))
232 self._AddPackageClause(("IEEE.std_logic_1164.all", ))
235@export
236class Numeric_Bit(PredefinedPackage):
237 """
238 Predefined package ``ieee.numeric_bit``.
239 """
241 def __init__(self) -> None:
242 super().__init__()
244 self._AddPackageClause(("STD.TEXTIO.all", ))
247@export
248class Numeric_Bit_Body(PredefinedPackageBody):
249 """
250 Predefined package body of package ``ieee.numeric_bit``.
251 """
254@export
255class Numeric_Bit_Unsigned(PredefinedPackage):
256 """
257 Predefined package ``ieee.numeric_bit_unsigned``.
258 """
261@export
262class Numeric_Bit_Unsigned_Body(PredefinedPackageBody):
263 """
264 Predefined package body of package ``ieee.numeric_bit_unsigned``.
265 """
267 def __init__(self) -> None:
268 super().__init__()
270 self._AddLibraryClause(("IEEE", ))
271 self._AddPackageClause(("IEEE.numeric_bit.all", ))
274@export
275class Numeric_Std(PredefinedPackage):
276 """
277 Predefined package ``ieee.numeric_std``.
279 Predefined types:
281 * ``unresolved_unsigned``, ``unsigned``
282 * ``unresolved_signed``, ``signed``
283 """
285 def __init__(self) -> None:
286 super().__init__()
288 self._AddPackageClause(("STD.TEXTIO.all", ))
289 self._AddLibraryClause(("IEEE", ))
290 self._AddPackageClause(("IEEE.std_logic_1164.all", ))
292 unresolvedUnsigned = ArrayType("unresolved_unsigned", (SimpleSubtypeSymbol(SimpleName("natural")),), SimpleSubtypeSymbol(SimpleName("std_ulogic")), None)
293 self._types[unresolvedUnsigned._normalizedIdentifier] = unresolvedUnsigned
294 self._declaredItems.append(unresolvedUnsigned)
296 unsigned = Subtype("unsigned", SimpleSubtypeSymbol(SimpleName("unresolved_unsigned")), None)
297 unsigned._baseType = unresolvedUnsigned
298 self._subtypes[unsigned._normalizedIdentifier] = unsigned
299 self._declaredItems.append(unsigned)
301 unresolvedSigned = ArrayType("unresolved_signed", (SimpleSubtypeSymbol(SimpleName("natural")),), SimpleSubtypeSymbol(SimpleName("std_ulogic")), None)
302 self._types[unresolvedSigned._normalizedIdentifier] = unresolvedSigned
303 self._declaredItems.append(unresolvedSigned)
305 signed = Subtype("signed", SimpleSubtypeSymbol(SimpleName("unresolved_signed")), None)
306 signed._baseType = unresolvedSigned
307 self._subtypes[signed._normalizedIdentifier] = signed
308 self._declaredItems.append(signed)
311@export
312class Numeric_Std_Body(PredefinedPackageBody):
313 """
314 Predefined package body of package ``ieee.numeric_std``.
315 """
318@export
319class Numeric_Std_Unsigned(PredefinedPackage):
320 """
321 Predefined package ``ieee.numeric_std_unsigned``.
322 """
324 def __init__(self) -> None:
325 super().__init__()
327 self._AddLibraryClause(("IEEE", ))
328 self._AddPackageClause(("IEEE.std_logic_1164.all", ))
331@export
332class Numeric_Std_Unsigned_Body(PredefinedPackageBody):
333 """
334 Predefined package body of package ``ieee.numeric_std_unsigned``.
335 """
337 def __init__(self) -> None:
338 super().__init__()
340 self._AddLibraryClause(("IEEE", ))
341 self._AddPackageClause(("IEEE.numeric_std.all", ))
344@export
345class Fixed_Float_Types(PredefinedPackage):
346 """
347 Predefined package ``ieee.fixed_float_types``.
348 """
351@export
352class Fixed_Generic_Pkg(PredefinedPackage):
353 """
354 Predefined package ``ieee.fixed_generic_pkg``.
355 """
357 def __init__(self) -> None:
358 super().__init__()
360 self._AddPackageClause(("STD.TEXTIO.all", ))
361 self._AddLibraryClause(("IEEE", ))
362 self._AddPackageClause(("IEEE.STD_LOGIC_1164.all", ))
363 self._AddPackageClause(("IEEE.NUMERIC_STD.all", ))
364 self._AddPackageClause(("IEEE.fixed_float_types.all", ))
367@export
368class Fixed_Generic_Pkg_Body(PredefinedPackageBody):
369 """
370 Predefined package body of package ``ieee.fixed_generic_pkg``.
371 """
373 def __init__(self) -> None:
374 super().__init__()
376 self._AddLibraryClause(("IEEE", ))
377 self._AddPackageClause(("IEEE.MATH_REAL.all", ))
380@export
381class Fixed_Pkg(PredefinedPackage):
382 """
383 Predefined package ``ieee.fixed_pkg``.
384 """
385 def __init__(self) -> None:
386 super().__init__()
388 self._AddLibraryClause(("IEEE", ))
391@export
392class Float_Generic_Pkg(PredefinedPackage):
393 """
394 Predefined package ``ieee.float_generic_pkg``.
395 """
397 def __init__(self) -> None:
398 super().__init__()
400 self._AddPackageClause(("STD.TEXTIO.all", ))
401 self._AddLibraryClause(("IEEE", ))
402 self._AddPackageClause(("IEEE.STD_LOGIC_1164.all", ))
403 self._AddPackageClause(("IEEE.NUMERIC_STD.all", ))
404 self._AddPackageClause(("IEEE.fixed_float_types.all", ))
407@export
408class Float_Generic_Pkg_Body(PredefinedPackageBody):
409 """
410 Predefined package body of package ``ieee.float_generic_pkg``.
411 """
414@export
415class Float_Pkg(PredefinedPackage):
416 """
417 Predefined package ``ieee.float_pkg``.
418 """
420 def __init__(self) -> None:
421 super().__init__()
423 self._AddLibraryClause(("IEEE", ))
426PACKAGES = (
427 (Math_Real, Math_Real_Body),
428 (Math_Complex, Math_Complex_Body),
429 (Std_Logic_1164, Std_Logic_1164_Body),
430 (Std_Logic_TextIO, None),
431 (Numeric_Bit, Numeric_Bit_Body),
432 (Numeric_Bit_Unsigned, Numeric_Bit_Unsigned_Body),
433 (Numeric_Std, Numeric_Std_Body),
434 (Numeric_Std_Unsigned, Numeric_Std_Unsigned_Body),
435 (Fixed_Float_Types, None),
436 (Fixed_Generic_Pkg, Fixed_Generic_Pkg_Body),
437 (Fixed_Pkg, None),
438 (Float_Generic_Pkg, Float_Generic_Pkg_Body),
439 (Float_Pkg, None),
440)
443@export
444class Std_Logic_Arith(PredefinedPackage):
445 """
446 Predefined Mentor Graphics package ``ieee.std_logic_arith``.
447 """
449 def __init__(self) -> None:
450 super().__init__()
452 self._AddLibraryClause(("IEEE", ))
454 # used inside of package
455 # self._AddPackageClause(("IEEE.std_logic_1164.all", ))
458@export
459class Std_Logic_Arith_Body(PredefinedPackageBody):
460 """
461 Predefined package body of Mentor Graphics package ``ieee.std_logic_arith``.
462 """
465MENTOR_GRAPHICS_PACKAGES = (
466 (Std_Logic_Arith, Std_Logic_Arith_Body),
467)
470@export
471class Std_Logic_Arith(PredefinedPackage):
472 """
473 Predefined Synopsys package ``ieee.std_logic_arith``.
474 """
476 def __init__(self) -> None:
477 super().__init__()
479 self._AddLibraryClause(("IEEE", ))
480 self._AddPackageClause(("IEEE.std_logic_1164.all", ))
483@export
484class Std_Logic_Misc(PredefinedPackage):
485 """
486 Predefined Synopsys package ``ieee.std_logic_misc``.
487 """
489 def __init__(self) -> None:
490 super().__init__()
492 self._AddLibraryClause(("IEEE", ))
493 self._AddPackageClause(("IEEE.std_logic_1164.all", ))
496@export
497class Std_Logic_Misc_Body(PredefinedPackageBody):
498 """
499 Predefined package body of Synopsys package ``ieee.std_logic_misc``.
500 """
503@export
504class Std_Logic_Signed(PredefinedPackage):
505 """
506 Predefined Synopsys package ``ieee.std_logic_signed``.
507 """
509 def __init__(self) -> None:
510 super().__init__()
512 self._AddLibraryClause(("IEEE", ))
513 self._AddPackageClause(("IEEE.std_logic_1164.all", ))
514 self._AddPackageClause(("IEEE.std_logic_arith.all", ))
517@export
518class Std_Logic_TextIO(PredefinedPackage):
519 """
520 Predefined Synopsys package ``ieee.std_logic_textio``.
521 """
523 def __init__(self) -> None:
524 super().__init__()
526 self._AddPackageClause(("STD.textio.all", ))
528 self._AddLibraryClause(("IEEE", ))
529 self._AddPackageClause(("IEEE.std_logic_1164.all", ))
532@export
533class Std_Logic_Unsigned(PredefinedPackage):
534 """
535 Predefined Synopsys package ``ieee.std_logic_unsigned``.
536 """
538 def __init__(self) -> None:
539 super().__init__()
541 self._AddLibraryClause(("IEEE", ))
542 self._AddPackageClause(("IEEE.std_logic_1164.all", ))
543 self._AddPackageClause(("IEEE.std_logic_arith.all", ))
546SYNOPSYS_PACKAGES = (
547 (Std_Logic_Arith, None),
548 (Std_Logic_Misc, Std_Logic_Misc_Body),
549 (Std_Logic_Signed, None),
550 (Std_Logic_TextIO, None),
551 (Std_Logic_Unsigned, None),
552)