Coverage for pyVHDLModel/STD.py: 100%

88 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-09-11 23:50 +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 ``STD``.""" 

33 

34from pyTooling.Decorators import export 

35 

36from pyVHDLModel.Base import SimpleRange, 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 """ 

63 Initializes the ``std`` library. 

64 """ 

65 super().__init__(PACKAGES) 

66 

67 

68@export 

69class Standard(PredefinedPackage): 

70 """ 

71 Predefined package ``std.standard``. 

72 

73 Predefined types: 

74 

75 * ``boolean``, ``boolean_vector`` 

76 * ``bit``, ``bit_vector`` 

77 * ``character``, ``string`` 

78 * ``integer``, ``integer_vector`` 

79 * ``natural``, ``positive`` 

80 * ``real``, ``real_vector`` 

81 * ``time``, ``time_vector`` 

82 * ``open_file_kind``, ``open_file_status`` 

83 

84 .. seealso:: 

85 

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

87 """ 

88 

89 def __init__(self) -> None: 

90 """ 

91 Initializes the ``standard`` package. 

92 """ 

93 super().__init__() 

94 

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

96 self._types[boolean._normalizedIdentifier] = boolean 

97 self._declaredItems.append(boolean) 

98 

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

100 self._types[bit._normalizedIdentifier] = bit 

101 self._declaredItems.append(bit) 

102 

103 chars = \ 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

118 self._types[character._normalizedIdentifier] = character 

119 self._declaredItems.append(character) 

120 

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

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

123 self._types[severityLevel._normalizedIdentifier] = severityLevel 

124 self._declaredItems.append(severityLevel) 

125 

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

127 self._types[integer._normalizedIdentifier] = integer 

128 self._declaredItems.append(integer) 

129 

130 # real 

131 real = RealType("real", SimpleRange(FloatingPointLiteral(-5.0), FloatingPointLiteral(5.0), Direction.To), None) 

132 self._types[real._normalizedIdentifier] = real 

133 self._declaredItems.append(real) 

134 

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

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

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

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

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

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

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

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

143 ), parent=None) 

144 self._types[time._normalizedIdentifier] = time 

145 self._declaredItems.append(time) 

146 

147 # delay_length 

148 

149 # now 

150 

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

152 natural._baseType = integer 

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

154 self._subtypes[natural._normalizedIdentifier] = natural 

155 self._declaredItems.append(natural) 

156 

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

158 positive._baseType = integer 

159 positive._range = SimpleRange(IntegerLiteral(1), IntegerLiteral(2**31 - 1), Direction.To) 

160 self._subtypes[positive._normalizedIdentifier] = positive 

161 self._declaredItems.append(positive) 

162 

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

164 self._types[string._normalizedIdentifier] = string 

165 self._declaredItems.append(string) 

166 

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

168 self._types[line._normalizedIdentifier] = line 

169 self._declaredItems.append(line) 

170 

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

172 self._types[booleanVector._normalizedIdentifier] = booleanVector 

173 self._declaredItems.append(booleanVector) 

174 

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

176 self._types[bitVector._normalizedIdentifier] = bitVector 

177 self._declaredItems.append(bitVector) 

178 

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

180 self._types[integerVector._normalizedIdentifier] = integerVector 

181 self._declaredItems.append(integerVector) 

182 

183 # real_vector 

184 

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

186 self._types[timeVector._normalizedIdentifier] = timeVector 

187 self._declaredItems.append(timeVector) 

188 

189 fileOpenKinds = "read_mode", "write_mode", "append_mode" 

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

191 self._types[openFileKind._normalizedIdentifier] = openFileKind 

192 self._declaredItems.append(openFileKind) 

193 

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

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

196 self._types[fileOpenStatus._normalizedIdentifier] = fileOpenStatus 

197 self._declaredItems.append(fileOpenStatus) 

198 

199 # attribute foreign 

200 

201 

202@export 

203class Standard_Body(PredefinedPackageBody): 

204 """ 

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

206 

207 .. seealso:: 

208 

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

210 """ 

211 

212 

213@export 

214class TextIO(PredefinedPackage): 

215 """ 

216 Predefined package ``std.textio``. 

217 

218 .. seealso:: 

219 

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

221 """ 

222 

223 

224@export 

225class TextIO_Body(PredefinedPackageBody): 

226 """ 

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

228 

229 .. seealso:: 

230 

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

232 """ 

233 

234 

235@export 

236class Env(PredefinedPackage): 

237 """ 

238 Predefined package ``std.env``. 

239 

240 .. seealso:: 

241 

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

243 """ 

244 

245 def __init__(self) -> None: 

246 """ 

247 Initializes the ``env`` package. 

248 """ 

249 super().__init__() 

250 

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

252 

253 

254@export 

255class Env_Body(PredefinedPackageBody): 

256 """ 

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

258 

259 .. seealso:: 

260 

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

262 """ 

263 

264 

265PACKAGES = ( 

266 (Standard, Standard_Body), 

267 (TextIO, TextIO_Body), 

268 (Env, Env_Body), 

269)