module-qc-tools 2.7.0__tar.gz → 2.7.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/.gitlab-ci.yml +1 -1
  2. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/.zenodo.json +3 -3
  3. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/CITATION.cff +2 -2
  4. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/PKG-INFO +2 -2
  5. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/README.md +1 -1
  6. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/history.md +0 -2
  7. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/install.md +2 -2
  8. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/_version.py +2 -2
  9. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/utils/yarr.py +2 -118
  10. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/tbump.toml +2 -2
  11. module_qc_tools-2.7.0/src/module_qc_tools/utils/file_lock.py +0 -97
  12. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/.gitattributes +0 -0
  13. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/.gitignore +0 -0
  14. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/.gitmodules +0 -0
  15. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/.linkcheckerrc +0 -0
  16. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/.pre-commit-config.yaml +0 -0
  17. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/LICENSE +0 -0
  18. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/.gitkeep +0 -0
  19. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/.overrides/main.html +0 -0
  20. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/.snippets/abbrs.txt +0 -0
  21. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/.snippets/links.txt +0 -0
  22. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/assets/css/custom.css +0 -0
  23. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/config.md +0 -0
  24. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/development.md +0 -0
  25. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/emulator.md +0 -0
  26. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/index.md +0 -0
  27. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/measurements.md +0 -0
  28. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/meta/authors.md +0 -0
  29. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/reference/cli.md +0 -0
  30. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/reference/gen_ref_nav.py +0 -0
  31. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc-CsTKlA.woff2 +0 -0
  32. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc0CsTKlA.woff2 +0 -0
  33. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc1CsTKlA.woff2 +0 -0
  34. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc2CsTKlA.woff2 +0 -0
  35. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc3CsTKlA.woff2 +0 -0
  36. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc5CsTKlA.woff2 +0 -0
  37. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc6CsQ.woff2 +0 -0
  38. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic-CsTKlA.woff2 +0 -0
  39. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic0CsTKlA.woff2 +0 -0
  40. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic1CsTKlA.woff2 +0 -0
  41. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic2CsTKlA.woff2 +0 -0
  42. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic3CsTKlA.woff2 +0 -0
  43. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic5CsTKlA.woff2 +0 -0
  44. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic6CsQ.woff2 +0 -0
  45. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2 +0 -0
  46. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xFIzIFKw.woff2 +0 -0
  47. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2 +0 -0
  48. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2 +0 -0
  49. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xIIzI.woff2 +0 -0
  50. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2 +0 -0
  51. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2 +0 -0
  52. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2 +0 -0
  53. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fBBc4.woff2 +0 -0
  54. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2 +0 -0
  55. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2 +0 -0
  56. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2 +0 -0
  57. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2 +0 -0
  58. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2 +0 -0
  59. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2 +0 -0
  60. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfBBc4.woff2 +0 -0
  61. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2 +0 -0
  62. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2 +0 -0
  63. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2 +0 -0
  64. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2 +0 -0
  65. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2 +0 -0
  66. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu4WxKOzY.woff2 +0 -0
  67. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu4mxK.woff2 +0 -0
  68. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu5mxKOzY.woff2 +0 -0
  69. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu72xKOzY.woff2 +0 -0
  70. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 +0 -0
  71. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu7WxKOzY.woff2 +0 -0
  72. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu7mxKOzY.woff2 +0 -0
  73. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0mf0h.woff2 +0 -0
  74. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0mf0h.woff2 +0 -0
  75. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0mf0h.woff2 +0 -0
  76. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0mQ.woff2 +0 -0
  77. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0mf0h.woff2 +0 -0
  78. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0mf0h.woff2 +0 -0
  79. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlYIw.woff2 +0 -0
  80. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlYIw.woff2 +0 -0
  81. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlYIw.woff2 +0 -0
  82. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ul.woff2 +0 -0
  83. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlYIw.woff2 +0 -0
  84. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-UlYIw.woff2 +0 -0
  85. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/fonts.css +0 -0
  86. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/docs/stylesheets/readme.txt +0 -0
  87. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/mkdocs.yml +0 -0
  88. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/pyproject.toml +0 -0
  89. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/__init__.py +0 -0
  90. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/ADC_CALIBRATION.py +0 -0
  91. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/ANALOG_READBACK.py +0 -0
  92. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/DATA_TRANSMISSION.py +0 -0
  93. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/INJECTION_CAPACITANCE.py +0 -0
  94. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/IV_MEASURE.py +0 -0
  95. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/LONG_TERM_STABILITY_DCS.py +0 -0
  96. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/LP_MODE.py +0 -0
  97. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/OVERVOLTAGE_PROTECTION.py +0 -0
  98. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/SLDO.py +0 -0
  99. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/UNDERSHUNT_PROTECTION.py +0 -0
  100. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/VCAL_CALIBRATION.py +0 -0
  101. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/__init__.py +0 -0
  102. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/__main__.py +0 -0
  103. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/get_nominal_current.py +0 -0
  104. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/globals.py +0 -0
  105. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/hardware_emulator.py +0 -0
  106. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/main.py +0 -0
  107. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/split_old_config.py +0 -0
  108. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/upload_localdb.py +0 -0
  109. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/cli/yarr.py +0 -0
  110. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/console.py +0 -0
  111. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/configs/hw_config_emulator_merged_vmux.json +0 -0
  112. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/configs/hw_config_example_felix_merged_vmux_itkpixv2.json +0 -0
  113. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/configs/hw_config_example_felix_merged_vmux_v1.json +0 -0
  114. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/configs/hw_config_example_felix_separate_vmux_itkpixv2.json +0 -0
  115. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/configs/hw_config_example_felix_separate_vmux_v1.json +0 -0
  116. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/configs/hw_config_example_merged_vmux_itkpixv2.json +0 -0
  117. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/configs/hw_config_example_merged_vmux_v1.json +0 -0
  118. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/configs/hw_config_example_separate_vmux_itkpixv2.json +0 -0
  119. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/configs/hw_config_example_separate_vmux_v1.json +0 -0
  120. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/configs/meas_config.json +0 -0
  121. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/emulator/configs/connectivity/20UPGXM1234567_Lx_dummy.json +0 -0
  122. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/emulator/configs/connectivity/20UPGXM1234567_Lx_dummy_disabledchip.json +0 -0
  123. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/emulator/configs/connectivity/20UPGXM1234567_info.json +0 -0
  124. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/emulator/configs/connectivity/chip/dummy_chip1.json +0 -0
  125. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/emulator/configs/connectivity/chip/dummy_chip2.json +0 -0
  126. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/emulator/configs/connectivity/chip/dummy_chip3.json +0 -0
  127. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/emulator/configs/connectivity/chip/dummy_chip4.json +0 -0
  128. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/emulator/configs/controller/specCfg-rd53b.json +0 -0
  129. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/emulator/module_state_template.json +0 -0
  130. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/data/schema/meas_config.json +0 -0
  131. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/measurements/__init__.py +0 -0
  132. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/measurements/adc_calibration.py +0 -0
  133. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/measurements/analog_readback.py +0 -0
  134. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/measurements/data_transmission.py +0 -0
  135. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/measurements/injection_capacitance.py +0 -0
  136. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/measurements/iv_measure.py +0 -0
  137. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/measurements/long_term_stability_dcs.py +0 -0
  138. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/measurements/lp_mode.py +0 -0
  139. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/measurements/overvoltage_protection.py +0 -0
  140. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/measurements/sldo.py +0 -0
  141. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/measurements/undershunt_protection.py +0 -0
  142. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/measurements/vcal_calibration.py +0 -0
  143. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/typing_compat.py +0 -0
  144. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/utils/__init__.py +0 -0
  145. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/utils/hardware_control_base.py +0 -0
  146. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/utils/hrc.py +0 -0
  147. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/utils/misc.py +0 -0
  148. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/utils/multimeter.py +0 -0
  149. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/utils/ntc.py +0 -0
  150. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/utils/power_supply.py +0 -0
  151. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/src/module_qc_tools/utils/subprocess_emulator.py +0 -0
  152. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/tests/conftest.py +0 -0
  153. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/tests/test_emulator.py +0 -0
  154. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/tests/test_measurements.py +0 -0
  155. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/tests/test_package.py +0 -0
  156. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/tests/test_schema/cutter_pcb_tab.json +0 -0
  157. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/tests/test_schema/cutter_pcb_tab_BAD.json +0 -0
  158. {module_qc_tools-2.7.0 → module_qc_tools-2.7.1}/tests/test_schema.py +0 -0
@@ -186,7 +186,7 @@ deploy_docs_latest:
186
186
  script:
187
187
  # the next three lines are just to commit and push pages to the project
188
188
  - git config --global user.email
189
- "project_139533_bot_52a0e9bbb1570326242e61cb6cd9d917@noreply.gitlab.cern.ch"
189
+ "project_139533_bot_86cd7491df432274ff6bb3decacac29d@noreply.gitlab.cern.ch"
190
190
  - git config --global user.name "pre-commit-ci"
191
191
  - git remote set-url origin
192
192
  "https://__pre-commit_ci_token:${PRE_COMMIT_CI_JOB_TOKEN}@${CI_SERVER_HOST}:${CI_SERVER_PORT}/${CI_PROJECT_PATH}.git"
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "description": " general python tool for running ITkPixV1.1 and ITkPixV2 module QC tests for the ATLAS ITk project",
3
3
  "license": "MIT",
4
- "title": "atlas-itk-pixel-modules/mqt: v2.7.0",
5
- "version": "v2.7.0",
4
+ "title": "atlas-itk-pixel-modules/mqt: v2.7.1",
5
+ "version": "v2.7.1",
6
6
  "upload_type": "software",
7
7
  "creators": [
8
8
  {
@@ -120,7 +120,7 @@
120
120
  "related_identifiers": [
121
121
  {
122
122
  "scheme": "url",
123
- "identifier": "https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/tree/v2.7.0",
123
+ "identifier": "https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/tree/v2.7.1",
124
124
  "relation": "isSupplementTo"
125
125
  }
126
126
  ]
@@ -77,6 +77,6 @@ keywords:
77
77
  license:
78
78
  - mit
79
79
  message: If you use this software, please cite it using the metadata from this file.
80
- title: 'atlas-itk-pixel-modules/mqt: v2.7.0'
80
+ title: 'atlas-itk-pixel-modules/mqt: v2.7.1'
81
81
  type: software
82
- version: v2.7.0
82
+ version: v2.7.1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: module_qc_tools
3
- Version: 2.7.0
3
+ Version: 2.7.1
4
4
  Summary: Module qc tools
5
5
  Project-URL: Homepage, https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools
6
6
  Project-URL: Bug Tracker, https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/issues
@@ -45,7 +45,7 @@ Requires-Dist: typer>=0.18.0
45
45
  Requires-Dist: urllib3<2,>=1.26.20; 'el7.x86_64' in platform_release
46
46
  Description-Content-Type: text/markdown
47
47
 
48
- # module-qc-tools v2.7.0
48
+ # module-qc-tools v2.7.1
49
49
 
50
50
  A general python tool for running ITkPixV1.1 and ITkPixV2 module QC tests
51
51
 
@@ -1,4 +1,4 @@
1
- # module-qc-tools v2.7.0
1
+ # module-qc-tools v2.7.1
2
2
 
3
3
  A general python tool for running ITkPixV1.1 and ITkPixV2 module QC tests
4
4
 
@@ -36,8 +36,6 @@ and this project adheres to
36
36
  `mqt measurement sldo -c <hw config> -o <output dir> --npoints <int>`
37
37
  - a pipeline test `test_measurement_one_point_SLDO` was also added in
38
38
  `test_emulator.py` to check the implementation
39
- - add fcntl capability to lock before calling yarr commands simultaneously
40
- (!265)
41
39
 
42
40
  **_Fixed:_**
43
41
 
@@ -94,7 +94,7 @@ package.
94
94
  $ python -m venv venv
95
95
  $ source venv/bin/activate
96
96
  $ python -m pip install -U pip
97
- $ python -m pip install -U pip module-qc-tools==2.7.0
97
+ $ python -m pip install -U pip module-qc-tools==2.7.1
98
98
  ```
99
99
 
100
100
  ### via uv
@@ -103,7 +103,7 @@ $ python -m pip install -U pip module-qc-tools==2.7.0
103
103
  $ python -m venv venv
104
104
  $ source venv/bin/activate
105
105
  $ python -m pip install uv
106
- $ uv pip install module-qc-tools==2.7.0
106
+ $ uv pip install module-qc-tools==2.7.1
107
107
  ```
108
108
 
109
109
  # Usage
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '2.7.0'
32
- __version_tuple__ = version_tuple = (2, 7, 0)
31
+ __version__ = version = '2.7.1'
32
+ __version_tuple__ = version_tuple = (2, 7, 1)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -11,7 +11,6 @@ from pathlib import Path
11
11
 
12
12
  from module_qc_data_tools.utils import get_chip_type_from_config
13
13
 
14
- from module_qc_tools.utils.file_lock import yarr_file_lock
15
14
  from module_qc_tools.utils.hardware_control_base import hardware_control_base
16
15
 
17
16
  # if sys.version_info >= (3, 9):
@@ -79,121 +78,6 @@ class yarr(hardware_control_base):
79
78
  def running_emulator(self):
80
79
  return self.emulator
81
80
 
82
- def _get_yarr_lock_path(self):
83
- """Get the YARR lock file path for this instance."""
84
- lock_path = Path("/tmp/mqt.lock")
85
- # Create the lock file if it doesn't exist
86
- lock_path.touch(exist_ok=True)
87
- return str(lock_path)
88
-
89
- def _execute_with_lock(self, func, *args, **kwargs):
90
- """Execute a function with file locking if not using emulator."""
91
- if self.emulator:
92
- return func(*args, **kwargs)
93
-
94
- lock_path = self._get_yarr_lock_path()
95
- logger.debug(f"Using file lock for YARR command on {lock_path}")
96
-
97
- try:
98
- with yarr_file_lock(lock_path=lock_path, show_status=True):
99
- return func(*args, **kwargs)
100
- except (FileNotFoundError, PermissionError) as e:
101
- logger.warning(
102
- f"Could not acquire YARR lock on {lock_path}: {e}. Proceeding without lock."
103
- )
104
- return func(*args, **kwargs)
105
- except TimeoutError as e:
106
- logger.error(f"Timeout waiting for YARR lock: {e}")
107
- raise
108
-
109
- def send_command(
110
- self,
111
- cmd,
112
- purpose="send command",
113
- extra_error_messages=None,
114
- pause=0,
115
- success_code=0,
116
- ):
117
- """Send command with file locking for yarr executables."""
118
-
119
- def _send_command_impl():
120
- extra_error_messages_local = extra_error_messages or []
121
- logger.debug("Sending command: ")
122
- logger.debug(cmd)
123
- result = self.run(
124
- cmd, shell=True, capture_output=True, check=False, cwd=self.run_dir
125
- )
126
- if result.stdout:
127
- logger.debug(result.stdout.decode("utf-8"))
128
-
129
- if result.stderr:
130
- logger.error(result.stderr.decode("utf-8"))
131
-
132
- if result.returncode != success_code:
133
- for extra_error_message in extra_error_messages_local:
134
- logger.info(f"[{self._name}] {extra_error_message}")
135
- msg = f"[{self._name}] fail to {purpose}!! Return code {result.returncode}"
136
- raise RuntimeError(msg)
137
- logger.debug(f"[{self._name}] Finished {purpose}")
138
-
139
- time.sleep(pause)
140
- return result.returncode
141
-
142
- return self._execute_with_lock(_send_command_impl)
143
-
144
- def send_command_and_read(
145
- self,
146
- cmd,
147
- dtype=float,
148
- purpose="send command and read",
149
- unit="",
150
- extra_error_messages=None,
151
- max_nTry=0,
152
- success_code=0,
153
- ):
154
- """Send command and read response with file locking for yarr executables."""
155
-
156
- def _send_command_and_read_impl():
157
- extra_error_messages_local = extra_error_messages or []
158
- logger.debug("Sending command: ")
159
- logger.debug(cmd)
160
- result = self.run(
161
- cmd, shell=True, capture_output=True, check=False, cwd=self.run_dir
162
- )
163
-
164
- logger.debug(result.stdout.decode())
165
-
166
- # A while loop to retry communications in case of timeout error.
167
- nTry = 0
168
- while result.returncode != success_code and nTry < max_nTry:
169
- nTry += 1
170
- for extra_error_message in extra_error_messages_local:
171
- logger.info(f"[{self._name}] {extra_error_message}")
172
- logger.info(f"Try again. Send command and read attempt {nTry} time(s).")
173
- logger.debug("Sending command: ")
174
- logger.debug(cmd)
175
- result = self.run(
176
- cmd, shell=True, capture_output=True, check=False, cwd=self.run_dir
177
- )
178
- logger.debug(result.stdout.decode())
179
-
180
- if result.returncode != success_code:
181
- msg = f"[{self._name}] fail to {purpose}!! Exit with returncode {result.returncode}.\nstdout:\n {result.stdout.decode()}\nstderr: {result.stderr.decode()}"
182
- raise RuntimeError(msg)
183
- try:
184
- value = dtype(result.stdout.decode())
185
- except Exception:
186
- logger.debug(
187
- "Failed to return type of decoded send command, will return un-typed result (this happens for read-register)"
188
- )
189
- value = result.stdout.decode()
190
- for _extra_error_message in extra_error_messages_local:
191
- logger.info(f"[{self._name}] {purpose}: {value}{unit}")
192
-
193
- return value, result.returncode
194
-
195
- return self._execute_with_lock(_send_command_and_read_impl)
196
-
197
81
  def configure(self, skip_reset=False, connectivity=None):
198
82
  connectivity = connectivity or self.connectivity
199
83
  cmd = f"{self.scanConsole_exe} -r {self.controller} -c {connectivity} {'--skip-reset' if skip_reset else ''}"
@@ -427,7 +311,7 @@ class yarr(hardware_control_base):
427
311
 
428
312
  def dataMergingCheck(self, testsize=None, mode=None, verbose=False, quiet=False):
429
313
  if not self.dataMergingCheck_exe:
430
- msg = "No `dataMergingCheck_exe` found in hardware config file! Check and compare to https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/blob/v2.7.0/src/module_qc_tools/data/configs/hw_config_example_merged_vmux_itkpixv2.json!"
314
+ msg = "No `dataMergingCheck_exe` found in hardware config file! Check and compare to https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/blob/v2.7.1/src/module_qc_tools/data/configs/hw_config_example_merged_vmux_itkpixv2.json!"
431
315
  raise RuntimeError(msg)
432
316
 
433
317
  _mode = "4-to-1"
@@ -478,7 +362,7 @@ class yarr(hardware_control_base):
478
362
  self, dryrun=False, skipconfig=False, testsize=None, connectivity=None
479
363
  ):
480
364
  if not self.eyeDiagram_exe:
481
- msg = "No `eyeDiagram_exe` found in hardware config file! Check and compare to https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/blob/v2.7.0/src/module_qc_tools/data/configs/hw_config_example_merged_vmux_itkpixv2.json!"
365
+ msg = "No `eyeDiagram_exe` found in hardware config file! Check and compare to https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/blob/v2.7.1/src/module_qc_tools/data/configs/hw_config_example_merged_vmux_itkpixv2.json!"
482
366
  raise RuntimeError(msg)
483
367
  _dryrun = ""
484
368
  _skipconfig = ""
@@ -1,5 +1,5 @@
1
1
  [version]
2
- current = "2.7.0"
2
+ current = "2.7.1"
3
3
 
4
4
  # Example of a semver regexp.
5
5
  # Make sure this matches current_version before
@@ -17,7 +17,7 @@ regex = '''
17
17
 
18
18
  [git]
19
19
  # The current version will get updated when tbump is run
20
- message_template = "Bump version: 2.7.0 → {new_version}"
20
+ message_template = "Bump version: 2.7.1 → {new_version}"
21
21
  tag_template = "v{new_version}"
22
22
 
23
23
  # For each file to patch, add a [[file]] config
@@ -1,97 +0,0 @@
1
- """File locking utilities for YARR executable coordination."""
2
-
3
- from __future__ import annotations
4
-
5
- import fcntl
6
- import logging
7
- import time
8
- from collections.abc import Generator
9
- from contextlib import contextmanager
10
- from pathlib import Path
11
-
12
- from rich.console import Console
13
-
14
- logger = logging.getLogger("measurement")
15
-
16
-
17
- @contextmanager
18
- def yarr_file_lock(
19
- lock_path: str | Path = "/tmp/yarr.lock",
20
- timeout: float = 300,
21
- poll_interval: float = 1.0,
22
- show_status: bool = True,
23
- ) -> Generator[None]:
24
- """
25
- Context manager that acquires an exclusive file lock for YARR process coordination.
26
-
27
- This prevents multiple YARR processes from running simultaneously,
28
- which would cause conflicts and process failures.
29
-
30
- Args:
31
- lock_path: Path to the lock file (default: /tmp/yarr.lock)
32
- timeout: Maximum time to wait for lock in seconds (default: 300)
33
- poll_interval: Time between lock acquisition attempts (default: 1.0)
34
- show_status: Whether to show rich status indicators (default: True)
35
-
36
- Raises:
37
- TimeoutError: If lock cannot be acquired within timeout period
38
- FileNotFoundError: If lock file does not exist
39
- PermissionError: If insufficient permissions to access lock file
40
- """
41
- lock_path = Path(lock_path)
42
-
43
- if not lock_path.exists():
44
- msg = f"Lock file {lock_path} does not exist"
45
- raise FileNotFoundError(msg)
46
-
47
- console = Console() if show_status else None
48
- status = None
49
-
50
- try:
51
- # Open the lock file for locking
52
- with lock_path.open("r", encoding="utf-8") as lock_file:
53
- start_time = time.time()
54
-
55
- if console and show_status:
56
- status = console.status(
57
- f"[yellow]Waiting for YARR lock on {lock_path}..."
58
- )
59
- status.start()
60
-
61
- while True:
62
- try:
63
- # Try to acquire exclusive lock (non-blocking)
64
- fcntl.flock(lock_file.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
65
-
66
- logger.debug(f"Acquired exclusive YARR lock on {lock_path}")
67
- if status:
68
- status.update(f"[green]YARR lock acquired on {lock_path}")
69
-
70
- try:
71
- yield
72
- finally:
73
- # Lock is automatically released when file is closed
74
- logger.debug(f"Released YARR lock on {lock_path}")
75
- if status:
76
- status.update(f"[blue]Released YARR lock on {lock_path}")
77
- status.stop()
78
-
79
- break
80
-
81
- except BlockingIOError:
82
- # Lock is held by another process
83
- elapsed = time.time() - start_time
84
- if elapsed >= timeout:
85
- if status:
86
- status.stop()
87
- msg = f"Timeout waiting for YARR lock on {lock_path} after {timeout} seconds"
88
- raise TimeoutError(msg) from None
89
-
90
- # Wait before trying again
91
- time.sleep(poll_interval)
92
-
93
- except PermissionError as e:
94
- if status:
95
- status.stop()
96
- msg = f"Permission denied accessing {lock_path}: {e}"
97
- raise PermissionError(msg) from e
File without changes