Coverage for pyVHDLModel/IEEE.py: 97%

210 statements  

« 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``.""" 

33 

34from typing import Optional as Nullable 

35 

36from pyTooling.Decorators import export, readonly 

37 

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 

45 

46 

47@export 

48class Ieee(PredefinedLibrary): 

49 """ 

50 Predefined VHDL library ``ieee``. 

51 

52 The following predefined packages are in this library: 

53 

54 * Math 

55 

56 * :class:`~pyVHDLModel.IEEE.Math_Real` 

57 * :class:`~pyVHDLModel.IEEE.Math_Complex` 

58 

59 * Std_logic 

60 

61 * :class:`~pyVHDLModel.IEEE.Std_Logic_1164` 

62 * :class:`~pyVHDLModel.IEEE.Std_Logic_TextIO` 

63 

64 * Numeric 

65 

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` 

70 

71 * Fixed/floating point 

72 

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` 

78 

79 * Mentor Graphics packages 

80 

81 * :class:`~pyVHDLModel.IEEE.Std_logic_arith` 

82 

83 * Synopsys packages 

84 

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` 

90 

91 .. seealso:: 

92 

93 Other predefined libraries: 

94 * Library :class:`~pyVHDLModel.STD.Std` 

95 """ 

96 

97 _flavor: IEEEFlavor 

98 

99 def __init__(self, flavor: Nullable[IEEEFlavor] = None) -> None: 

100 super().__init__(PACKAGES) 

101 

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}'.") 

111 

112 @readonly 

113 def Flavor(self) -> IEEEFlavor: 

114 return self._flavor 

115 

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}'.") 

119 

120 self._flavor = IEEEFlavor.MentorGraphics 

121 self.AddPackages(MENTOR_GRAPHICS_PACKAGES) 

122 

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}'.") 

126 

127 self._flavor = IEEEFlavor.Synopsys 

128 self.AddPackages(SYNOPSYS_PACKAGES) 

129 

130 

131@export 

132class Math_Real(PredefinedPackage): 

133 """ 

134 Predefined package ``ieee.math_real``. 

135 """ 

136 

137 

138@export 

139class Math_Real_Body(PredefinedPackageBody): 

140 """ 

141 Predefined package body of package ``ieee.math_real``. 

142 """ 

143 

144 

145@export 

146class Math_Complex(PredefinedPackage): 

147 """ 

148 Predefined package ``ieee.math_complex``. 

149 """ 

150 

151 def __init__(self) -> None: 

152 super().__init__() 

153 

154 self._AddPackageClause(("work.math_real.all",)) 

155 

156 

157@export 

158class Math_Complex_Body(PredefinedPackageBody): 

159 """ 

160 Predefined package body of package ``ieee.math_complex``. 

161 """ 

162 

163 def __init__(self) -> None: 

164 super().__init__() 

165 

166 self._AddPackageClause(("work.math_real.all",)) 

167 

168 

169@export 

170class Std_Logic_1164(PredefinedPackage): 

171 """ 

172 Predefined package ``ieee.std_logic_1164``. 

173 

174 Predefined types: 

175 

176 * ``std_ulogic``, ``std_ulogic_vector`` 

177 * ``std_logic``, ``std_logic_vector`` 

178 """ 

179 

180 def __init__(self) -> None: 

181 super().__init__() 

182 

183 self._AddPackageClause(("STD.TEXTIO.all", )) 

184 

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) 

198 

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) 

202 

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) 

207 

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) 

212 

213 

214@export 

215class Std_Logic_1164_Body(PredefinedPackageBody): 

216 """ 

217 Predefined package body of package ``ieee.std_logic_1164``. 

218 """ 

219 

220 

221@export 

222class Std_Logic_TextIO(PredefinedPackage): 

223 """ 

224 Predefined package ``ieee.std_logic_textio``. 

225 """ 

226 

227 def __init__(self) -> None: 

228 super().__init__() 

229 

230 self._AddPackageClause(("STD.TEXTIO.all", )) 

231 self._AddLibraryClause(("IEEE", )) 

232 self._AddPackageClause(("IEEE.std_logic_1164.all", )) 

233 

234 

235@export 

236class Numeric_Bit(PredefinedPackage): 

237 """ 

238 Predefined package ``ieee.numeric_bit``. 

239 """ 

240 

241 def __init__(self) -> None: 

242 super().__init__() 

243 

244 self._AddPackageClause(("STD.TEXTIO.all", )) 

245 

246 

247@export 

248class Numeric_Bit_Body(PredefinedPackageBody): 

249 """ 

250 Predefined package body of package ``ieee.numeric_bit``. 

251 """ 

252 

253 

254@export 

255class Numeric_Bit_Unsigned(PredefinedPackage): 

256 """ 

257 Predefined package ``ieee.numeric_bit_unsigned``. 

258 """ 

259 

260 

261@export 

262class Numeric_Bit_Unsigned_Body(PredefinedPackageBody): 

263 """ 

264 Predefined package body of package ``ieee.numeric_bit_unsigned``. 

265 """ 

266 

267 def __init__(self) -> None: 

268 super().__init__() 

269 

270 self._AddLibraryClause(("IEEE", )) 

271 self._AddPackageClause(("IEEE.numeric_bit.all", )) 

272 

273 

274@export 

275class Numeric_Std(PredefinedPackage): 

276 """ 

277 Predefined package ``ieee.numeric_std``. 

278 

279 Predefined types: 

280 

281 * ``unresolved_unsigned``, ``unsigned`` 

282 * ``unresolved_signed``, ``signed`` 

283 """ 

284 

285 def __init__(self) -> None: 

286 super().__init__() 

287 

288 self._AddPackageClause(("STD.TEXTIO.all", )) 

289 self._AddLibraryClause(("IEEE", )) 

290 self._AddPackageClause(("IEEE.std_logic_1164.all", )) 

291 

292 unresolvedUnsigned = ArrayType("unresolved_unsigned", (SimpleSubtypeSymbol(SimpleName("natural")),), SimpleSubtypeSymbol(SimpleName("std_ulogic")), None) 

293 self._types[unresolvedUnsigned._normalizedIdentifier] = unresolvedUnsigned 

294 self._declaredItems.append(unresolvedUnsigned) 

295 

296 unsigned = Subtype("unsigned", SimpleSubtypeSymbol(SimpleName("unresolved_unsigned")), None) 

297 unsigned._baseType = unresolvedUnsigned 

298 self._subtypes[unsigned._normalizedIdentifier] = unsigned 

299 self._declaredItems.append(unsigned) 

300 

301 unresolvedSigned = ArrayType("unresolved_signed", (SimpleSubtypeSymbol(SimpleName("natural")),), SimpleSubtypeSymbol(SimpleName("std_ulogic")), None) 

302 self._types[unresolvedSigned._normalizedIdentifier] = unresolvedSigned 

303 self._declaredItems.append(unresolvedSigned) 

304 

305 signed = Subtype("signed", SimpleSubtypeSymbol(SimpleName("unresolved_signed")), None) 

306 signed._baseType = unresolvedSigned 

307 self._subtypes[signed._normalizedIdentifier] = signed 

308 self._declaredItems.append(signed) 

309 

310 

311@export 

312class Numeric_Std_Body(PredefinedPackageBody): 

313 """ 

314 Predefined package body of package ``ieee.numeric_std``. 

315 """ 

316 

317 

318@export 

319class Numeric_Std_Unsigned(PredefinedPackage): 

320 """ 

321 Predefined package ``ieee.numeric_std_unsigned``. 

322 """ 

323 

324 def __init__(self) -> None: 

325 super().__init__() 

326 

327 self._AddLibraryClause(("IEEE", )) 

328 self._AddPackageClause(("IEEE.std_logic_1164.all", )) 

329 

330 

331@export 

332class Numeric_Std_Unsigned_Body(PredefinedPackageBody): 

333 """ 

334 Predefined package body of package ``ieee.numeric_std_unsigned``. 

335 """ 

336 

337 def __init__(self) -> None: 

338 super().__init__() 

339 

340 self._AddLibraryClause(("IEEE", )) 

341 self._AddPackageClause(("IEEE.numeric_std.all", )) 

342 

343 

344@export 

345class Fixed_Float_Types(PredefinedPackage): 

346 """ 

347 Predefined package ``ieee.fixed_float_types``. 

348 """ 

349 

350 

351@export 

352class Fixed_Generic_Pkg(PredefinedPackage): 

353 """ 

354 Predefined package ``ieee.fixed_generic_pkg``. 

355 """ 

356 

357 def __init__(self) -> None: 

358 super().__init__() 

359 

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", )) 

365 

366 

367@export 

368class Fixed_Generic_Pkg_Body(PredefinedPackageBody): 

369 """ 

370 Predefined package body of package ``ieee.fixed_generic_pkg``. 

371 """ 

372 

373 def __init__(self) -> None: 

374 super().__init__() 

375 

376 self._AddLibraryClause(("IEEE", )) 

377 self._AddPackageClause(("IEEE.MATH_REAL.all", )) 

378 

379 

380@export 

381class Fixed_Pkg(PredefinedPackage): 

382 """ 

383 Predefined package ``ieee.fixed_pkg``. 

384 """ 

385 def __init__(self) -> None: 

386 super().__init__() 

387 

388 self._AddLibraryClause(("IEEE", )) 

389 

390 

391@export 

392class Float_Generic_Pkg(PredefinedPackage): 

393 """ 

394 Predefined package ``ieee.float_generic_pkg``. 

395 """ 

396 

397 def __init__(self) -> None: 

398 super().__init__() 

399 

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", )) 

405 

406 

407@export 

408class Float_Generic_Pkg_Body(PredefinedPackageBody): 

409 """ 

410 Predefined package body of package ``ieee.float_generic_pkg``. 

411 """ 

412 

413 

414@export 

415class Float_Pkg(PredefinedPackage): 

416 """ 

417 Predefined package ``ieee.float_pkg``. 

418 """ 

419 

420 def __init__(self) -> None: 

421 super().__init__() 

422 

423 self._AddLibraryClause(("IEEE", )) 

424 

425 

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) 

441 

442 

443@export 

444class Std_Logic_Arith(PredefinedPackage): 

445 """ 

446 Predefined Mentor Graphics package ``ieee.std_logic_arith``. 

447 """ 

448 

449 def __init__(self) -> None: 

450 super().__init__() 

451 

452 self._AddLibraryClause(("IEEE", )) 

453 

454 # used inside of package 

455 # self._AddPackageClause(("IEEE.std_logic_1164.all", )) 

456 

457 

458@export 

459class Std_Logic_Arith_Body(PredefinedPackageBody): 

460 """ 

461 Predefined package body of Mentor Graphics package ``ieee.std_logic_arith``. 

462 """ 

463 

464 

465MENTOR_GRAPHICS_PACKAGES = ( 

466 (Std_Logic_Arith, Std_Logic_Arith_Body), 

467) 

468 

469 

470@export 

471class Std_Logic_Arith(PredefinedPackage): 

472 """ 

473 Predefined Synopsys package ``ieee.std_logic_arith``. 

474 """ 

475 

476 def __init__(self) -> None: 

477 super().__init__() 

478 

479 self._AddLibraryClause(("IEEE", )) 

480 self._AddPackageClause(("IEEE.std_logic_1164.all", )) 

481 

482 

483@export 

484class Std_Logic_Misc(PredefinedPackage): 

485 """ 

486 Predefined Synopsys package ``ieee.std_logic_misc``. 

487 """ 

488 

489 def __init__(self) -> None: 

490 super().__init__() 

491 

492 self._AddLibraryClause(("IEEE", )) 

493 self._AddPackageClause(("IEEE.std_logic_1164.all", )) 

494 

495 

496@export 

497class Std_Logic_Misc_Body(PredefinedPackageBody): 

498 """ 

499 Predefined package body of Synopsys package ``ieee.std_logic_misc``. 

500 """ 

501 

502 

503@export 

504class Std_Logic_Signed(PredefinedPackage): 

505 """ 

506 Predefined Synopsys package ``ieee.std_logic_signed``. 

507 """ 

508 

509 def __init__(self) -> None: 

510 super().__init__() 

511 

512 self._AddLibraryClause(("IEEE", )) 

513 self._AddPackageClause(("IEEE.std_logic_1164.all", )) 

514 self._AddPackageClause(("IEEE.std_logic_arith.all", )) 

515 

516 

517@export 

518class Std_Logic_TextIO(PredefinedPackage): 

519 """ 

520 Predefined Synopsys package ``ieee.std_logic_textio``. 

521 """ 

522 

523 def __init__(self) -> None: 

524 super().__init__() 

525 

526 self._AddPackageClause(("STD.textio.all", )) 

527 

528 self._AddLibraryClause(("IEEE", )) 

529 self._AddPackageClause(("IEEE.std_logic_1164.all", )) 

530 

531 

532@export 

533class Std_Logic_Unsigned(PredefinedPackage): 

534 """ 

535 Predefined Synopsys package ``ieee.std_logic_unsigned``. 

536 """ 

537 

538 def __init__(self) -> None: 

539 super().__init__() 

540 

541 self._AddLibraryClause(("IEEE", )) 

542 self._AddPackageClause(("IEEE.std_logic_1164.all", )) 

543 self._AddPackageClause(("IEEE.std_logic_arith.all", )) 

544 

545 

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)