Coverage for pyVHDLModel/STD.py: 100%

88 statements  

« prev     ^ index     » next       coverage.py v7.11.3, created at 2025-11-14 22:17 +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 ``STD``.""" 

33 

34from pyTooling.Decorators import export 

35 

36from pyVHDLModel.Base import Range, Direction 

37from pyVHDLModel.Name import SimpleName 

38from pyVHDLModel.Symbol import SimpleSubtypeSymbol 

39from pyVHDLModel.Expression import EnumerationLiteral, IntegerLiteral, FloatingPointLiteral, PhysicalIntegerLiteral 

40from pyVHDLModel.Type import EnumeratedType, IntegerType, RealType, PhysicalType, ArrayType, AccessType, Subtype 

41from pyVHDLModel.Predefined import PredefinedLibrary, PredefinedPackage, PredefinedPackageBody 

42 

43 

44@export 

45class Std(PredefinedLibrary): 

46 """ 

47 Predefined VHDL library ``std``. 

48 

49 The following predefined packages are in this library: 

50 

51 * :class:`~pyVHDLModel.STD.Standard` 

52 * :class:`~pyVHDLModel.STD.Env` 

53 * :class:`~pyVHDLModel.STD.TextIO` 

54 

55 .. seealso:: 

56 

57 Other predefined libraries: 

58 * Library :class:`~pyVHDLModel.IEEE.Ieee` 

59 """ 

60 

61 def __init__(self) -> None: 

62 super().__init__(PACKAGES) 

63 

64 

65@export 

66class Standard(PredefinedPackage): 

67 """ 

68 Predefined package ``std.standard``. 

69 

70 Predefined types: 

71 

72 * ``boolean``, ``boolean_vector`` 

73 * ``bit``, ``bit_vector`` 

74 * ``character``, ``string`` 

75 * ``integer``, ``integer_vector`` 

76 * ``natural``, ``positive`` 

77 * ``real``, ``real_vector`` 

78 * ``time``, ``time_vector`` 

79 * ``open_file_kind``, ``open_file_status`` 

80 

81 .. seealso:: 

82 

83 Matching :class:`Package Body <pyVHDLModel.STD.Standard_Body>` declaration. 

84 """ 

85 

86 def __init__(self) -> None: 

87 super().__init__() 

88 

89 boolean = EnumeratedType("boolean", (EnumerationLiteral("false"), EnumerationLiteral("true")), None) 

90 self._types[boolean._normalizedIdentifier] = boolean 

91 self._declaredItems.append(boolean) 

92 

93 bit = EnumeratedType("bit", (EnumerationLiteral("'0'"), EnumerationLiteral("'1'")), None) 

94 self._types[bit._normalizedIdentifier] = bit 

95 self._declaredItems.append(bit) 

96 

97 chars = \ 

98 "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel", "bs", "ht", "lf", "vt", "ff", "cr", "so", "si", "dle", "dc1", "dc2", "dc3",\ 

99 "dc4", "nak", "syn", "etb", "can", "em", "sub", "esc", "fsp", "gsp", "rsp", "usp", "' '", "'!'", "'\"'", "'#'", "'$'", "'%'", "'&'", "'''",\ 

100 "'('", "')'", "'*'", "'+'", "','", "'-'", "'.'", "'/'", "'0'", "'1'", "'2'", "'3'", "'4'", "'5'", "'6'", "'7'", "'8'", "'9'", "':'", "';'",\ 

101 "'<'", "'='", "'>'", "'?'", "'@'", "'A'", "'B'", "'C'", "'D'", "'E'", "'F'", "'G'", "'H'", "'I'", "'J'", "'K'", "'L'", "'M'", "'N'", "'O'",\ 

102 "'P'", "'Q'", "'R'", "'S'", "'T'", "'U'", "'V'", "'W'", "'X'", "'Y'", "'Z'", "'['", "'\'", "']'", "'^'", "'_'", "'`'", "'a'", "'b'", "'c'",\ 

103 "'d'", "'e'", "'f'", "'g'", "'h'", "'i'", "'j'", "'k'", "'l'", "'m'", "'n'", "'o'", "'p'", "'q'", "'r'", "'s'", "'t'", "'u'", "'v'", "'w'",\ 

104 "'x'", "'y'", "'z'", "'{'", "'|'", "'}'", "'~'", "del", "c128", "c129", "c130", "c131", "c132", "c133", "c134", "c135", "c136", "c137", "c138", "c139",\ 

105 "c140", "c141", "c142", "c143", "c144", "c145", "c146", "c147", "c148", "c149", "c150", "c151", "c152", "c153", "c154", "c155", "c156", "c157", "c158", "c159",\ 

106 "' '", "'¡'", "'¢'", "'£'", "'¤'", "'¥'", "'¦'", "'§'", "'¨'", "'©'", "'ª'", "'«'", "'¬'", "'­'", "'®'", "'¯'", "'°'", "'±'", "'²'", "'³'",\ 

107 "'´'", "'µ'", "'¶'", "'·'", "'¸'", "'¹'", "'º'", "'»'", "'¼'", "'½'", "'¾'", "'¿'", "'À'", "'Á'", "'Â'", "'Ã'", "'Ä'", "'Å'", "'Æ'", "'Ç'",\ 

108 "'È'", "'É'", "'Ê'", "'Ë'", "'Ì'", "'Í'", "'Î'", "'Ï'", "'Ð'", "'Ñ'", "'Ò'", "'Ó'", "'Ô'", "'Õ'", "'Ö'", "'×'", "'Ø'", "'Ù'", "'Ú'", "'Û'",\ 

109 "'Ü'", "'Ý'", "'Þ'", "'ß'", "'à'", "'á'", "'â'", "'ã'", "'ä'", "'å'", "'æ'", "'ç'", "'è'", "'é'", "'ê'", "'ë'", "'ì'", "'í'", "'î'", "'ï'",\ 

110 "'ð'", "'ñ'", "'ò'", "'ó'", "'ô'", "'õ'", "'ö'", "'÷'", "'ø'", "'ù'", "'ú'", "'û'", "'ü'", "'ý'", "'þ'", "'ÿ'" 

111 character = EnumeratedType("character", [EnumerationLiteral(char) for char in chars], None) 

112 self._types[character._normalizedIdentifier] = character 

113 self._declaredItems.append(character) 

114 

115 levels = "note", "warning", "error", "failure" 

116 severityLevel = EnumeratedType("severityLevel", [EnumerationLiteral(level) for level in levels], None) 

117 self._types[severityLevel._normalizedIdentifier] = severityLevel 

118 self._declaredItems.append(severityLevel) 

119 

120 integer = IntegerType("integer", Range(IntegerLiteral(-2**31), IntegerLiteral(2**31 - 1), Direction.To), None) 

121 self._types[integer._normalizedIdentifier] = integer 

122 self._declaredItems.append(integer) 

123 

124 # real 

125 real = RealType("real", Range(FloatingPointLiteral(-5.0), FloatingPointLiteral(5.0), Direction.To), None) 

126 self._types[real._normalizedIdentifier] = real 

127 self._declaredItems.append(real) 

128 

129 time = PhysicalType("time", Range(IntegerLiteral(-2**63), IntegerLiteral(2**63 - 1), Direction.To), primaryUnit="fs", units=( 

130 ("ps", PhysicalIntegerLiteral(1000, "fs")), 

131 ("ns", PhysicalIntegerLiteral(1000, "ps")), 

132 ("us", PhysicalIntegerLiteral(1000, "ns")), 

133 ("ms", PhysicalIntegerLiteral(1000, "us")), 

134 ("sec", PhysicalIntegerLiteral(1000, "ms")), 

135 ("min", PhysicalIntegerLiteral(60, "sec")), 

136 ("hr", PhysicalIntegerLiteral(60, "min")), 

137 ), parent=None) 

138 self._types[time._normalizedIdentifier] = time 

139 self._declaredItems.append(time) 

140 

141 # delay_length 

142 

143 # now 

144 

145 natural = Subtype("natural", SimpleSubtypeSymbol(SimpleName("integer")), None) 

146 natural._baseType = integer 

147 natural._range = Range(IntegerLiteral(0), IntegerLiteral(2**31 - 1), Direction.To) 

148 self._subtypes[natural._normalizedIdentifier] = natural 

149 self._declaredItems.append(natural) 

150 

151 positive = Subtype("positive", SimpleSubtypeSymbol(SimpleName("integer")), None) 

152 positive._baseType = integer 

153 positive._range = Range(IntegerLiteral(1), IntegerLiteral(2**31 - 1), Direction.To) 

154 self._subtypes[positive._normalizedIdentifier] = positive 

155 self._declaredItems.append(positive) 

156 

157 string = ArrayType("string", (SimpleSubtypeSymbol(SimpleName("positive")),), SimpleSubtypeSymbol(SimpleName("character")), None) 

158 self._types[string._normalizedIdentifier] = string 

159 self._declaredItems.append(string) 

160 

161 line = AccessType("line", SimpleSubtypeSymbol(SimpleName("character")), None) 

162 self._types[line._normalizedIdentifier] = line 

163 self._declaredItems.append(line) 

164 

165 booleanVector = ArrayType("boolean_vector", (SimpleSubtypeSymbol(SimpleName("natural")),), SimpleSubtypeSymbol(SimpleName("boolean")), None) 

166 self._types[booleanVector._normalizedIdentifier] = booleanVector 

167 self._declaredItems.append(booleanVector) 

168 

169 bitVector = ArrayType("bit_vector", (SimpleSubtypeSymbol(SimpleName("natural")),), SimpleSubtypeSymbol(SimpleName("bit")), None) 

170 self._types[bitVector._normalizedIdentifier] = bitVector 

171 self._declaredItems.append(bitVector) 

172 

173 integerVector = ArrayType("integer_vector", (SimpleSubtypeSymbol(SimpleName("natural")),), SimpleSubtypeSymbol(SimpleName("integer")), None) 

174 self._types[integerVector._normalizedIdentifier] = integerVector 

175 self._declaredItems.append(integerVector) 

176 

177 # real_vector 

178 

179 timeVector = ArrayType("time_vector", (SimpleSubtypeSymbol(SimpleName("natural")),), SimpleSubtypeSymbol(SimpleName("time")), None) 

180 self._types[timeVector._normalizedIdentifier] = timeVector 

181 self._declaredItems.append(timeVector) 

182 

183 fileOpenKinds = "read_mode", "write_mode", "append_mode" 

184 openFileKind = EnumeratedType("open_file_kind", [EnumerationLiteral(kind) for kind in fileOpenKinds], None) 

185 self._types[openFileKind._normalizedIdentifier] = openFileKind 

186 self._declaredItems.append(openFileKind) 

187 

188 fileOpenStati = "open_ok", "status_error", "name_error", "mode_error" 

189 fileOpenStatus = EnumeratedType("open_file_status", [EnumerationLiteral(status) for status in fileOpenStati], None) 

190 self._types[fileOpenStatus._normalizedIdentifier] = fileOpenStatus 

191 self._declaredItems.append(fileOpenStatus) 

192 

193 # attribute foreign 

194 

195 

196@export 

197class Standard_Body(PredefinedPackageBody): 

198 """ 

199 Predefined package body of package ``std.standard``. 

200 

201 .. seealso:: 

202 

203 Matching :class:`Package <pyVHDLModel.STD.Standard>` declaration. 

204 """ 

205 

206 

207@export 

208class TextIO(PredefinedPackage): 

209 """ 

210 Predefined package ``std.textio``. 

211 

212 .. seealso:: 

213 

214 Matching :class:`Package Body <pyVHDLModel.STD.TextIO_Body>` declaration. 

215 """ 

216 

217 

218@export 

219class TextIO_Body(PredefinedPackageBody): 

220 """ 

221 Predefined package body of package ``std.textio``. 

222 

223 .. seealso:: 

224 

225 Matching :class:`Package <pyVHDLModel.STD.TextIO>` declaration. 

226 """ 

227 

228 

229@export 

230class Env(PredefinedPackage): 

231 """ 

232 Predefined package ``std.env``. 

233 

234 .. seealso:: 

235 

236 Matching :class:`Package Body <pyVHDLModel.STD.Env_Body>` declaration. 

237 """ 

238 

239 def __init__(self) -> None: 

240 super().__init__() 

241 

242 self._AddPackageClause(("work.textio.all",)) 

243 

244 

245@export 

246class Env_Body(PredefinedPackageBody): 

247 """ 

248 Predefined package body of package ``std.env``. 

249 

250 .. seealso:: 

251 

252 Matching :class:`Package <pyVHDLModel.STD.Env>` declaration. 

253 """ 

254 

255 

256PACKAGES = ( 

257 (Standard, Standard_Body), 

258 (TextIO, TextIO_Body), 

259 (Env, Env_Body), 

260)