Coverage for pyVHDLModel/IEEE.py: 86%
263 statements
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-05 23:04 +0000
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-05 23:04 +0000
1# ==================================================================================================================== #
2# __ ___ _ ____ _ __ __ _ _ #
3# _ __ _ \ \ / / | | | _ \| | | \/ | ___ __| | ___| | #
4# | '_ \| | | \ \ / /| |_| | | | | | | |\/| |/ _ \ / _` |/ _ \ | #
5# | |_) | |_| |\ V / | _ | |_| | |___| | | | (_) | (_| | __/ | #
6# | .__/ \__, | \_/ |_| |_|____/|_____|_| |_|\___/ \__,_|\___|_| #
7# |_| |___/ #
8# ==================================================================================================================== #
9# Authors: #
10# Patrick Lehmann #
11# #
12# License: #
13# ==================================================================================================================== #
14# Copyright 2017-2026 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 * Synopsys packages
81 * :class:`~pyVHDLModel.IEEE.Std_logic_arith`
82 * :class:`~pyVHDLModel.IEEE.Std_logic_misc`
83 * :class:`~pyVHDLModel.IEEE.Std_logic_signed`
84 * :class:`~pyVHDLModel.IEEE.Std_logic_textio`
85 * :class:`~pyVHDLModel.IEEE.Std_logic_unsigned`
87 * Mentor Graphics packages
89 * :class:`~pyVHDLModel.IEEE.Std_logic_arith`
91 * VITAL packages
93 * :class:`~pyVHDLModel.IEEE.VITAL_Timing`
94 * :class:`~pyVHDLModel.IEEE.VITAL_Primitives`
95 * :class:`~pyVHDLModel.IEEE.VITAL_Memory`
97 .. seealso::
99 Other predefined libraries:
100 * Library :class:`~pyVHDLModel.STD.Std`
101 """
103 _flavor: IEEEFlavor
105 def __init__(self, flavor: Nullable[IEEEFlavor] = None) -> None:
106 super().__init__(PACKAGES)
108 self._flavor = IEEEFlavor.IEEE
109 if flavor is None:
110 return
111 elif IEEEFlavor.IEEE in flavor:
112 pass
113 elif IEEEFlavor.Synopsys in flavor:
114 self.LoadSynopsysPackages()
115 elif IEEEFlavor.MentorGraphics in flavor: 115 ↛ 118line 115 didn't jump to line 118 because the condition on line 115 was always true
116 self.LoadMentorGraphicsPackages()
117 else:
118 raise VHDLModelException(f"Unknown IEEE library flavor '{flavor}'.")
120 if IEEEFlavor.WithVITAL in flavor: 120 ↛ 121line 120 didn't jump to line 121 because the condition on line 120 was never true
121 self.LoadVITALPackages()
123 @readonly
124 def Flavor(self) -> IEEEFlavor:
125 return self._flavor
127 def LoadSynopsysPackages(self) -> None:
128 if IEEEFlavor.IEEE not in self._flavor: 128 ↛ 129line 128 didn't jump to line 129 because the condition on line 128 was never true
129 raise VHDLModelException(f"IEEE library flavor is '{self._flavor}' and can't be changed to '{IEEEFlavor.Synopsys}'.")
131 self._flavor = (self._flavor & ~IEEEFlavor.IEEE) | IEEEFlavor.Synopsys
132 self.AddPackages(SYNOPSYS_PACKAGES)
134 def LoadMentorGraphicsPackages(self) -> None:
135 if IEEEFlavor.IEEE not in self._flavor: 135 ↛ 136line 135 didn't jump to line 136 because the condition on line 135 was never true
136 raise VHDLModelException(f"IEEE library flavor is '{self._flavor}' and can't be changed to '{IEEEFlavor.MentorGraphics}'.")
138 self._flavor = (self._flavor & ~IEEEFlavor.IEEE) | IEEEFlavor.MentorGraphics
139 self.AddPackages(MENTOR_GRAPHICS_PACKAGES)
141 def LoadVITALPackages(self) -> None:
142 self._flavor |= IEEEFlavor.WithVITAL
143 self.AddPackages(VITAL_PACKAGES)
146@export
147class Math_Real(PredefinedPackage):
148 """
149 Predefined package ``ieee.math_real``.
150 """
153@export
154class Math_Real_Body(PredefinedPackageBody):
155 """
156 Predefined package body of package ``ieee.math_real``.
157 """
160@export
161class Math_Complex(PredefinedPackage):
162 """
163 Predefined package ``ieee.math_complex``.
164 """
166 def __init__(self) -> None:
167 super().__init__()
169 self._AddPackageClause(("work.math_real.all",))
172@export
173class Math_Complex_Body(PredefinedPackageBody):
174 """
175 Predefined package body of package ``ieee.math_complex``.
176 """
178 def __init__(self) -> None:
179 super().__init__()
181 self._AddPackageClause(("work.math_real.all",))
184@export
185class Std_Logic_1164(PredefinedPackage):
186 """
187 Predefined package ``ieee.std_logic_1164``.
189 Predefined types:
191 * ``std_ulogic``, ``std_ulogic_vector``
192 * ``std_logic``, ``std_logic_vector``
193 """
195 def __init__(self) -> None:
196 super().__init__()
198 self._AddPackageClause(("STD.TEXTIO.all", ))
200 stdULogic = EnumeratedType("std_ulogic", (
201 EnumerationLiteral("U"),
202 EnumerationLiteral("X"),
203 EnumerationLiteral("0"),
204 EnumerationLiteral("1"),
205 EnumerationLiteral("Z"),
206 EnumerationLiteral("W"),
207 EnumerationLiteral("L"),
208 EnumerationLiteral("H"),
209 EnumerationLiteral("-"),
210 ), None)
211 self._types[stdULogic._normalizedIdentifier] = stdULogic
212 self._declaredItems.append(stdULogic)
214 stdULogicVector = ArrayType("std_ulogic_vector", (SimpleSubtypeSymbol(SimpleName("natural")),), SimpleSubtypeSymbol(SimpleName("std_ulogic")), None)
215 self._types[stdULogicVector._normalizedIdentifier] = stdULogicVector
216 self._declaredItems.append(stdULogicVector)
218 stdLogic = Subtype("std_logic", SimpleSubtypeSymbol(SimpleName("std_ulogic")), None)
219 stdLogic._baseType = stdULogic
220 self._subtypes[stdLogic._normalizedIdentifier] = stdLogic
221 self._declaredItems.append(stdLogic)
223 stdLogicVector = Subtype("std_logic_vector", SimpleSubtypeSymbol(SimpleName("std_ulogic_vector")), None)
224 stdLogicVector._baseType = stdULogicVector
225 self._subtypes[stdLogicVector._normalizedIdentifier] = stdLogicVector
226 self._declaredItems.append(stdLogicVector)
229@export
230class Std_Logic_1164_Body(PredefinedPackageBody):
231 """
232 Predefined package body of package ``ieee.std_logic_1164``.
233 """
236@export
237class Std_Logic_TextIO(PredefinedPackage):
238 """
239 Predefined package ``ieee.std_logic_textio``.
240 """
242 def __init__(self) -> None:
243 super().__init__()
245 self._AddPackageClause(("STD.TEXTIO.all", ))
246 self._AddLibraryClause(("IEEE", ))
247 self._AddPackageClause(("IEEE.std_logic_1164.all", ))
250@export
251class Numeric_Bit(PredefinedPackage):
252 """
253 Predefined package ``ieee.numeric_bit``.
254 """
256 def __init__(self) -> None:
257 super().__init__()
259 self._AddPackageClause(("STD.TEXTIO.all", ))
262@export
263class Numeric_Bit_Body(PredefinedPackageBody):
264 """
265 Predefined package body of package ``ieee.numeric_bit``.
266 """
269@export
270class Numeric_Bit_Unsigned(PredefinedPackage):
271 """
272 Predefined package ``ieee.numeric_bit_unsigned``.
273 """
276@export
277class Numeric_Bit_Unsigned_Body(PredefinedPackageBody):
278 """
279 Predefined package body of package ``ieee.numeric_bit_unsigned``.
280 """
282 def __init__(self) -> None:
283 super().__init__()
285 self._AddLibraryClause(("IEEE", ))
286 self._AddPackageClause(("IEEE.numeric_bit.all", ))
289@export
290class Numeric_Std(PredefinedPackage):
291 """
292 Predefined package ``ieee.numeric_std``.
294 Predefined types:
296 * ``unresolved_unsigned``, ``unsigned``
297 * ``unresolved_signed``, ``signed``
298 """
300 def __init__(self) -> None:
301 super().__init__()
303 self._AddPackageClause(("STD.TEXTIO.all", ))
304 self._AddLibraryClause(("IEEE", ))
305 self._AddPackageClause(("IEEE.std_logic_1164.all", ))
307 unresolvedUnsigned = ArrayType("unresolved_unsigned", (SimpleSubtypeSymbol(SimpleName("natural")),), SimpleSubtypeSymbol(SimpleName("std_ulogic")), None)
308 self._types[unresolvedUnsigned._normalizedIdentifier] = unresolvedUnsigned
309 self._declaredItems.append(unresolvedUnsigned)
311 unsigned = Subtype("unsigned", SimpleSubtypeSymbol(SimpleName("unresolved_unsigned")), None)
312 unsigned._baseType = unresolvedUnsigned
313 self._subtypes[unsigned._normalizedIdentifier] = unsigned
314 self._declaredItems.append(unsigned)
316 unresolvedSigned = ArrayType("unresolved_signed", (SimpleSubtypeSymbol(SimpleName("natural")),), SimpleSubtypeSymbol(SimpleName("std_ulogic")), None)
317 self._types[unresolvedSigned._normalizedIdentifier] = unresolvedSigned
318 self._declaredItems.append(unresolvedSigned)
320 signed = Subtype("signed", SimpleSubtypeSymbol(SimpleName("unresolved_signed")), None)
321 signed._baseType = unresolvedSigned
322 self._subtypes[signed._normalizedIdentifier] = signed
323 self._declaredItems.append(signed)
326@export
327class Numeric_Std_Body(PredefinedPackageBody):
328 """
329 Predefined package body of package ``ieee.numeric_std``.
330 """
333@export
334class Numeric_Std_Unsigned(PredefinedPackage):
335 """
336 Predefined package ``ieee.numeric_std_unsigned``.
337 """
339 def __init__(self) -> None:
340 super().__init__()
342 self._AddLibraryClause(("IEEE", ))
343 self._AddPackageClause(("IEEE.std_logic_1164.all", ))
346@export
347class Numeric_Std_Unsigned_Body(PredefinedPackageBody):
348 """
349 Predefined package body of package ``ieee.numeric_std_unsigned``.
350 """
352 def __init__(self) -> None:
353 super().__init__()
355 self._AddLibraryClause(("IEEE", ))
356 self._AddPackageClause(("IEEE.numeric_std.all", ))
359@export
360class Fixed_Float_Types(PredefinedPackage):
361 """
362 Predefined package ``ieee.fixed_float_types``.
363 """
366@export
367class Fixed_Generic_Pkg(PredefinedPackage):
368 """
369 Predefined package ``ieee.fixed_generic_pkg``.
370 """
372 def __init__(self) -> None:
373 super().__init__()
375 self._AddPackageClause(("STD.TEXTIO.all", ))
376 self._AddLibraryClause(("IEEE", ))
377 self._AddPackageClause(("IEEE.STD_LOGIC_1164.all", ))
378 self._AddPackageClause(("IEEE.NUMERIC_STD.all", ))
379 self._AddPackageClause(("IEEE.fixed_float_types.all", ))
382@export
383class Fixed_Generic_Pkg_Body(PredefinedPackageBody):
384 """
385 Predefined package body of package ``ieee.fixed_generic_pkg``.
386 """
388 def __init__(self) -> None:
389 super().__init__()
391 self._AddLibraryClause(("IEEE", ))
392 self._AddPackageClause(("IEEE.MATH_REAL.all", ))
395@export
396class Fixed_Pkg(PredefinedPackage):
397 """
398 Predefined package ``ieee.fixed_pkg``.
399 """
400 def __init__(self) -> None:
401 super().__init__()
403 self._AddLibraryClause(("IEEE", ))
406@export
407class Float_Generic_Pkg(PredefinedPackage):
408 """
409 Predefined package ``ieee.float_generic_pkg``.
410 """
412 def __init__(self) -> None:
413 super().__init__()
415 self._AddPackageClause(("STD.TEXTIO.all", ))
416 self._AddLibraryClause(("IEEE", ))
417 self._AddPackageClause(("IEEE.STD_LOGIC_1164.all", ))
418 self._AddPackageClause(("IEEE.NUMERIC_STD.all", ))
419 self._AddPackageClause(("IEEE.fixed_float_types.all", ))
422@export
423class Float_Generic_Pkg_Body(PredefinedPackageBody):
424 """
425 Predefined package body of package ``ieee.float_generic_pkg``.
426 """
429@export
430class Float_Pkg(PredefinedPackage):
431 """
432 Predefined package ``ieee.float_pkg``.
433 """
435 def __init__(self) -> None:
436 super().__init__()
438 self._AddLibraryClause(("IEEE", ))
441PACKAGES = (
442 (Math_Real, Math_Real_Body),
443 (Math_Complex, Math_Complex_Body),
444 (Std_Logic_1164, Std_Logic_1164_Body),
445 (Std_Logic_TextIO, None),
446 (Numeric_Bit, Numeric_Bit_Body),
447 (Numeric_Bit_Unsigned, Numeric_Bit_Unsigned_Body),
448 (Numeric_Std, Numeric_Std_Body),
449 (Numeric_Std_Unsigned, Numeric_Std_Unsigned_Body),
450 (Fixed_Float_Types, None),
451 (Fixed_Generic_Pkg, Fixed_Generic_Pkg_Body),
452 (Fixed_Pkg, None),
453 (Float_Generic_Pkg, Float_Generic_Pkg_Body),
454 (Float_Pkg, None),
455)
458@export
459class Std_Logic_Arith(PredefinedPackage):
460 """
461 Predefined Mentor Graphics package ``ieee.std_logic_arith``.
462 """
464 def __init__(self) -> None:
465 super().__init__()
467 self._AddLibraryClause(("IEEE", ))
469 # used inside of package
470 # self._AddPackageClause(("IEEE.std_logic_1164.all", ))
473@export
474class Std_Logic_Arith_Body(PredefinedPackageBody):
475 """
476 Predefined package body of Mentor Graphics package ``ieee.std_logic_arith``.
477 """
480MENTOR_GRAPHICS_PACKAGES = (
481 (Std_Logic_Arith, Std_Logic_Arith_Body),
482)
485@export
486class VITAL_Timing(PredefinedPackage):
487 """
488 Predefined package ``ieee.VITAL_Timing``.
489 """
491 def __init__(self) -> None:
492 super().__init__()
494 self._AddLibraryClause(("IEEE", ))
495 self._AddPackageClause(("IEEE.STD_LOGIC_1164.all", ))
498@export
499class VITAL_Timing_Body(PredefinedPackageBody):
500 """
501 Predefined package body of package ``ieee.VITAL_Timing``.
502 """
504 def __init__(self) -> None:
505 super().__init__()
507 self._AddLibraryClause(("STD", ))
508 self._AddPackageClause(("STD.TEXTIO.all", ))
511@export
512class VITAL_Primitives(PredefinedPackage):
513 """
514 Predefined package ``ieee.VITAL_Primitives``.
515 """
517 def __init__(self) -> None:
518 super().__init__()
520 self._AddLibraryClause(("IEEE", ))
521 self._AddPackageClause(("IEEE.STD_LOGIC_1164.all", ))
522 self._AddPackageClause(("IEEE.VITAL_Timing.all", ))
525@export
526class VITAL_Primitives_Body(PredefinedPackageBody):
527 """
528 Predefined package body of package ``ieee.VITAL_Primitives``.
529 """
531 def __init__(self) -> None:
532 super().__init__()
534 self._AddLibraryClause(("STD", ))
535 self._AddPackageClause(("STD.TEXTIO.all", ))
538@export
539class VITAL_Memory(PredefinedPackage):
540 """
541 Predefined package ``ieee.VITAL_Memory``.
542 """
544 def __init__(self) -> None:
545 super().__init__()
547 self._AddLibraryClause(("IEEE", ))
548 self._AddPackageClause(("IEEE.STD_LOGIC_1164.all", ))
549 self._AddPackageClause(("IEEE.VITAL_Timing.all", ))
550 self._AddPackageClause(("IEEE.VITAL_Primitives.all", ))
552 self._AddLibraryClause(("STD", ))
553 self._AddPackageClause(("STD.TEXTIO.all", ))
556@export
557class VITAL_Memory_Body(PredefinedPackageBody):
558 """
559 Predefined package body of package ``ieee.VITAL_Memory``.
560 """
562 def __init__(self) -> None:
563 super().__init__()
565 self._AddLibraryClause(("IEEE", ))
566 self._AddPackageClause(("IEEE.STD_LOGIC_1164.all", ))
567 self._AddPackageClause(("IEEE.VITAL_Timing.all", ))
568 self._AddPackageClause(("IEEE.VITAL_Primitives.all", ))
570 self._AddLibraryClause(("STD", ))
571 self._AddPackageClause(("STD.TEXTIO.all", ))
574VITAL_PACKAGES = (
575 (VITAL_Timing, VITAL_Timing_Body),
576 (VITAL_Primitives, VITAL_Primitives_Body),
577 (VITAL_Memory, VITAL_Memory_Body)
578)
581@export
582class Std_Logic_Arith(PredefinedPackage):
583 """
584 Predefined Synopsys package ``ieee.std_logic_arith``.
585 """
587 def __init__(self) -> None:
588 super().__init__()
590 self._AddLibraryClause(("IEEE", ))
591 self._AddPackageClause(("IEEE.std_logic_1164.all", ))
594@export
595class Std_Logic_Misc(PredefinedPackage):
596 """
597 Predefined Synopsys package ``ieee.std_logic_misc``.
598 """
600 def __init__(self) -> None:
601 super().__init__()
603 self._AddLibraryClause(("IEEE", ))
604 self._AddPackageClause(("IEEE.std_logic_1164.all", ))
607@export
608class Std_Logic_Misc_Body(PredefinedPackageBody):
609 """
610 Predefined package body of Synopsys package ``ieee.std_logic_misc``.
611 """
614@export
615class Std_Logic_Signed(PredefinedPackage):
616 """
617 Predefined Synopsys package ``ieee.std_logic_signed``.
618 """
620 def __init__(self) -> None:
621 super().__init__()
623 self._AddLibraryClause(("IEEE", ))
624 self._AddPackageClause(("IEEE.std_logic_1164.all", ))
625 self._AddPackageClause(("IEEE.std_logic_arith.all", ))
628@export
629class Std_Logic_TextIO(PredefinedPackage):
630 """
631 Predefined Synopsys package ``ieee.std_logic_textio``.
632 """
634 def __init__(self) -> None:
635 super().__init__()
637 self._AddPackageClause(("STD.textio.all", ))
639 self._AddLibraryClause(("IEEE", ))
640 self._AddPackageClause(("IEEE.std_logic_1164.all", ))
643@export
644class Std_Logic_Unsigned(PredefinedPackage):
645 """
646 Predefined Synopsys package ``ieee.std_logic_unsigned``.
647 """
649 def __init__(self) -> None:
650 super().__init__()
652 self._AddLibraryClause(("IEEE", ))
653 self._AddPackageClause(("IEEE.std_logic_1164.all", ))
654 self._AddPackageClause(("IEEE.std_logic_arith.all", ))
657SYNOPSYS_PACKAGES = (
658 (Std_Logic_Arith, None),
659 (Std_Logic_Misc, Std_Logic_Misc_Body),
660 (Std_Logic_Signed, None),
661 (Std_Logic_TextIO, None),
662 (Std_Logic_Unsigned, None),
663)