Coverage for pyVHDLModel/Common.py: 64%

52 statements  

« prev     ^ index     » next       coverage.py v7.6.7, created at 2024-11-22 22:15 +0000

1# ==================================================================================================================== # 

2# __ ___ _ ____ _ __ __ _ _ # 

3# _ __ _ \ \ / / | | | _ \| | | \/ | ___ __| | ___| | # 

4# | '_ \| | | \ \ / /| |_| | | | | | | |\/| |/ _ \ / _` |/ _ \ | # 

5# | |_) | |_| |\ V / | _ | |_| | |___| | | | (_) | (_| | __/ | # 

6# | .__/ \__, | \_/ |_| |_|____/|_____|_| |_|\___/ \__,_|\___|_| # 

7# |_| |___/ # 

8# ==================================================================================================================== # 

9# Authors: # 

10# Patrick Lehmann # 

11# # 

12# License: # 

13# ==================================================================================================================== # 

14# Copyright 2017-2024 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""" 

33This module contains parts of an abstract document language model for VHDL. 

34 

35Common definitions and Mixins are used by many classes in the model as base-classes. 

36""" 

37from typing import List, Iterable, Union, Optional as Nullable 

38 

39from pyTooling.Decorators import export, readonly 

40from pyTooling.MetaClasses import ExtendedType 

41 

42from pyVHDLModel.Base import ModelEntity, LabeledEntityMixin 

43from pyVHDLModel.Expression import BaseExpression, QualifiedExpression, FunctionCall, TypeConversion, Literal 

44from pyVHDLModel.Symbol import Symbol 

45from pyVHDLModel.Association import ParameterAssociationItem 

46 

47 

48ExpressionUnion = Union[ 

49 BaseExpression, 

50 QualifiedExpression, 

51 FunctionCall, 

52 TypeConversion, 

53 # ConstantOrSymbol, TODO: ObjectSymbol 

54 Literal, 

55] 

56 

57 

58@export 

59class Statement(ModelEntity, LabeledEntityMixin): 

60 """ 

61 A ``Statement`` is a base-class for all statements. 

62 """ 

63 def __init__(self, label: Nullable[str] = None, parent=None) -> None: 

64 super().__init__(parent) 

65 LabeledEntityMixin.__init__(self, label) 

66 

67 

68@export 

69class ProcedureCallMixin(metaclass=ExtendedType, mixin=True): 

70 _procedure: Symbol # TODO: implement a ProcedureSymbol 

71 _parameterMappings: List[ParameterAssociationItem] 

72 

73 def __init__(self, procedureName: Symbol, parameterMappings: Nullable[Iterable[ParameterAssociationItem]] = None) -> None: 

74 self._procedure = procedureName 

75 procedureName._parent = self 

76 

77 # TODO: extract to mixin 

78 self._parameterMappings = [] 

79 if parameterMappings is not None: 

80 for parameterMapping in parameterMappings: 

81 self._parameterMappings.append(parameterMapping) 

82 parameterMapping._parent = self 

83 

84 @readonly 

85 def Procedure(self) -> Symbol: 

86 return self._procedure 

87 

88 @property 

89 def ParameterMappings(self) -> List[ParameterAssociationItem]: 

90 return self._parameterMappings 

91 

92 

93@export 

94class AssignmentMixin(metaclass=ExtendedType, mixin=True): 

95 """A mixin-class for all assignment statements.""" 

96 

97 _target: Symbol 

98 

99 def __init__(self, target: Symbol) -> None: 

100 self._target = target 

101 target._parent = self 

102 

103 @property 

104 def Target(self) -> Symbol: 

105 return self._target 

106 

107 

108@export 

109class SignalAssignmentMixin(AssignmentMixin, mixin=True): 

110 """A mixin-class for all signal assignment statements.""" 

111 

112 

113@export 

114class VariableAssignmentMixin(AssignmentMixin, mixin=True): 

115 """A mixin-class for all variable assignment statements.""" 

116 

117 # FIXME: move to sequential? 

118 _expression: ExpressionUnion 

119 

120 def __init__(self, target: Symbol, expression: ExpressionUnion) -> None: 

121 super().__init__(target) 

122 

123 self._expression = expression 

124 expression._parent = self 

125 

126 @property 

127 def Expression(self) -> ExpressionUnion: 

128 return self._expression