PyIBIS-AMI 9.3.0__tar.gz → 10.0.0__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 (87) hide show
  1. pyibis_ami-10.0.0/CHANGELOG.md +380 -0
  2. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/MANIFEST.in +2 -0
  3. pyibis_ami-10.0.0/PKG-INFO +201 -0
  4. pyibis_ami-10.0.0/README.md +153 -0
  5. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/docs/source/ami.rst +7 -4
  6. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/docs/source/conf.py +1 -6
  7. pyibis_ami-10.0.0/docs/source/gui.rst +15 -0
  8. pyibis_ami-10.0.0/docs/source/ibis.rst +24 -0
  9. pyibis_ami-10.0.0/docs/source/install.rst +136 -0
  10. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/docs/source/modules.rst +1 -0
  11. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/examples/freq_resp.em +3 -3
  12. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/examples/impulse.em +4 -4
  13. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/pyproject.toml +28 -14
  14. pyibis_ami-10.0.0/requirements.txt +20 -0
  15. pyibis_ami-10.0.0/src/pyibis_ami.egg-info/PKG-INFO +201 -0
  16. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibis_ami.egg-info/SOURCES.txt +19 -6
  17. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibis_ami.egg-info/entry_points.txt +1 -1
  18. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibis_ami.egg-info/requires.txt +19 -10
  19. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/IBIS_AMI_Checker.ipynb +2 -2
  20. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/IBIS_AMI_Tester.ipynb +4 -4
  21. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/__init__.py +4 -1
  22. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/__main__.py +1 -1
  23. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/ami/config.py +43 -9
  24. pyibis_ami-10.0.0/src/pyibisami/ami/configurator.py +553 -0
  25. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/ami/model.py +68 -54
  26. pyibis_ami-10.0.0/src/pyibisami/ami/parameter.py +532 -0
  27. pyibis_ami-10.0.0/src/pyibisami/ami/parser.py +390 -0
  28. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/ami/reserved_parameter_names.py +9 -0
  29. pyibis_ami-10.0.0/src/pyibisami/cli_logging.py +70 -0
  30. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/common.py +9 -4
  31. pyibis_ami-10.0.0/src/pyibisami/gui/__init__.py +22 -0
  32. pyibis_ami-10.0.0/src/pyibisami/gui/ami_config.py +127 -0
  33. pyibis_ami-10.0.0/src/pyibisami/gui/ibis.py +157 -0
  34. pyibis_ami-10.0.0/src/pyibisami/ibis/file.py +519 -0
  35. pyibis_ami-10.0.0/src/pyibisami/ibis/iv.py +210 -0
  36. pyibis_ami-10.0.0/src/pyibisami/ibis/model.py +492 -0
  37. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/ibis/parser.py +181 -74
  38. pyibis_ami-10.0.0/src/pyibisami/report/__init__.py +21 -0
  39. {pyibis_ami-9.3.0/src/pyibisami/testing → pyibis_ami-10.0.0/src/pyibisami/report}/ami_tests.py +15 -32
  40. {pyibis_ami-9.3.0/src/pyibisami/testing → pyibis_ami-10.0.0/src/pyibisami/report}/ami_tests_helpers.py +5 -5
  41. {pyibis_ami-9.3.0/src/pyibisami/testing → pyibis_ami-10.0.0/src/pyibisami/report}/ibis_file_tests.py +2 -10
  42. {pyibis_ami-9.3.0/src/pyibisami/util → pyibis_ami-10.0.0/src/pyibisami/report}/plot.py +10 -14
  43. {pyibis_ami-9.3.0/src/pyibisami/testing → pyibis_ami-10.0.0/src/pyibisami/report}/test_models.py +13 -11
  44. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/testing/__init__.py +4 -2
  45. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/testing/ami_test_config.py +4 -1
  46. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/testing/test_defs.py +23 -11
  47. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/tools/run_notebook.py +59 -32
  48. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/tools/run_tests.py +30 -19
  49. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/util/ami.py +45 -9
  50. pyibis_ami-10.0.0/tests/test_core_only.py +108 -0
  51. pyibis_ami-10.0.0/tests/test_gui_render.py +62 -0
  52. pyibis_ami-10.0.0/tests/test_report.py +37 -0
  53. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/tests/test_run_tests.py +28 -15
  54. pyibis_ami-9.3.0/PKG-INFO +0 -111
  55. pyibis_ami-9.3.0/README.md +0 -68
  56. pyibis_ami-9.3.0/docs/source/ibis.rst +0 -22
  57. pyibis_ami-9.3.0/docs/source/install.rst +0 -31
  58. pyibis_ami-9.3.0/src/pyibis_ami.egg-info/PKG-INFO +0 -111
  59. pyibis_ami-9.3.0/src/pyibisami/ami/parameter.py +0 -395
  60. pyibis_ami-9.3.0/src/pyibisami/ami/parser.py +0 -905
  61. pyibis_ami-9.3.0/src/pyibisami/ibis/file.py +0 -394
  62. pyibis_ami-9.3.0/src/pyibisami/ibis/model.py +0 -419
  63. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/LICENSE +0 -0
  64. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/docs/source/index.rst +0 -0
  65. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/docs/source/tools.rst +0 -0
  66. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/examples/all_taps.run +0 -0
  67. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/examples/bandwidth.run +0 -0
  68. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/examples/dummy.em +0 -0
  69. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/examples/examples.md +0 -0
  70. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/examples/impulse_response_8ma.txt +0 -0
  71. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/examples/mode.run +0 -0
  72. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/examples/stratix4_ami_tx_runs/all_taps.run +0 -0
  73. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/examples/stratix4_ami_tx_runs/test_results.xml +0 -0
  74. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/examples/test_results/test_results.xsl +0 -0
  75. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/setup.cfg +0 -0
  76. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibis_ami.egg-info/dependency_links.txt +0 -0
  77. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibis_ami.egg-info/top_level.txt +0 -0
  78. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/ami/__init__.py +0 -0
  79. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/ami/generic.ami.em +0 -0
  80. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/ami/generic.ibs.em +0 -0
  81. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/ibis/__init__.py +0 -0
  82. /pyibis_ami-9.3.0/src/pyibisami/util/reportlab.py → /pyibis_ami-10.0.0/src/pyibisami/report/pdf.py +0 -0
  83. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/testing/util.py +0 -0
  84. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/tools/__init__.py +0 -0
  85. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/tools/test_results.xsl +0 -0
  86. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/src/pyibisami/util/misc.py +0 -0
  87. {pyibis_ami-9.3.0 → pyibis_ami-10.0.0}/tests/test_ami_test_config.py +0 -0
@@ -0,0 +1,380 @@
1
+ # Changelog
2
+
3
+ Notable changes to *PyIBIS-AMI* (`pyibis-ami` on PyPI).
4
+ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
+ Releases before 10.0.0 are summarized from their
6
+ [GitHub release notes](https://github.com/capn-freako/PyAMI/releases), which have the full details.
7
+
8
+ For help porting code from v9.x, see
9
+ [Upgrading from v9.x](https://pyibis-ami.readthedocs.io/en/latest/install.html#upgrading-from-v9-x).
10
+
11
+ ## [10.0.0] - Unreleased
12
+
13
+ ### Changed (breaking)
14
+
15
+ - The GUI, report and notebook dependencies are optional extras now: `gui` (chaco, enable, traitsui),
16
+ `report` (matplotlib, reportlab, scipy), `notebook` (jupyter, papermill, ..., plus `report`) and `all`.
17
+ The core (AMI/IBIS parsing, AMI DLL calls, `ami-config`, `check-ami`) needs none of them.
18
+ The `gui` extra installs no Qt binding.
19
+ - SciPy is now in the `report` extra. `common.deconv_same()` uses NumPy only;
20
+ `testing.test_defs.lossy_channel()`/`reflective_channel()` need SciPy.
21
+ - The PDF/plot reporting modules moved to the new `pyibisami.report` package
22
+ (`testing.test_models`, `testing.ami_tests`, `testing.ami_tests_helpers`, `testing.ibis_file_tests`,
23
+ `util.plot`, `util.reportlab`).
24
+ - `make_gui()`/`make_gui_items()` moved to `pyibisami.gui.ami_config`, and no longer return `Trait`s.
25
+ `make_param_traits()` builds those.
26
+ - `AMIParamConfigurator`, `make_param_traits()` and `trait_name_part()` moved from `pyibisami.ami.parser`
27
+ to the new `pyibisami.ami.configurator`. The old imports still work.
28
+ - Tap parameters (`-1`, `0`, `1`, ...) get trait names `pre1`, `post0`, `post1`, ...
29
+ The names sent to the model, and the `fetch_param_val()`/`set_param_val()` paths, stay as written in the `.ami` file.
30
+ - *PyIBIS-AMI* only logs now, through loggers under `pyibisami`; it never prints or opens dialogs itself.
31
+ `IBISModel.log()`, `IBISModel.log_txt` and the `debug` and `gui` arguments of `IBISModel` and
32
+ `parse_ibis_file()` were removed. `IBISModel` sends its notices through its new `alert` event;
33
+ `pyibisami.gui.ibis.show_alerts()` shows them as dialogs. CLIs take `-d/--debug`.
34
+ - `IBISModel` raises `ValueError` (`Couldn't parse IBIS file ...`, with the line and column) when the file
35
+ doesn't parse, instead of logging a warning.
36
+ - `IBISModel.dll_file`/`ami_file` come from the selected model, not the file.
37
+ The private `Model._exec32Wins`, etc., were removed; `Model.ami_files` and `Model.executables` remain.
38
+ - `Model.zout`/`slew`/`zin` are `None` (and the model has no such trait) where its `Model_type` or data
39
+ gives no value.
40
+ - A Boolean `List` with no `Default` starts at its first value, not `False`.
41
+ - Viewer titles no longer mention *PyBERT*; the IBIS model selector's view `id` is now
42
+ `pyibisami_ibis_model_selector`.
43
+
44
+ ### Added
45
+
46
+ - `IBISModel(..., model_types=...)` offers only the pins and models of the given `Model_type`s
47
+ (e.g. `TX_MODEL_TYPES`, `RX_MODEL_TYPES`); it can be changed later through the `model_types` trait.
48
+ - Direction-aware AMI executables for `I/O` models: `Model.get_ami_files(is_tx)`, `Model.ami_executables`
49
+ (`AmiExecutable` tuples, with `Executable_Tx`/`Executable_Rx` direction) and `Model.is_io`.
50
+ - `IBISModel.ibis_dir`, `resolve_file()`, `dll_path` and `ami_path`, for the paths of the files an `.ibs` names.
51
+ - `IBISModel.comps`, the components offered for selection (those with a usable pin).
52
+ - `Model.iv_data` (`pyibisami.ibis.iv.IVData`/`IVCurve`): I-V tables without any GUI dependency.
53
+ `Model.plot_iv` is built on first access and needs the `gui` extra.
54
+ - IBIS spec-rule warnings (`Model.spec_warnings`, the parsed file's `"warnings"`, and `ibis_parsing_errors`):
55
+ `[Algorithmic Model]` use for each `Model_type`, `Executable` vs. `Executable_Tx`/`_Rx`, `.ami` extensions,
56
+ missing `Vinl`/`Vinh`.
57
+ - Every `.ami` `Format` parses: `Increment` and `Steps` (offered as their legal values), `Corner` (follows the new
58
+ `AMIParamConfigurator.sim_corner`), `Table`, `Gaussian`, `Dual-Dirac` and `DjRj` (sent as written).
59
+ Usage `Dep` is accepted.
60
+ - `model.ami_params_string()` builds the `AMI_parameters_in` string.
61
+ - The AMI_Version 7.2 and 8.0 reserved parameter names
62
+ (`Modulation_Levels`, `PAM_Offsets`, `PAM_Thresholds`, `Tx_Impulse_Input`, `Adaptation_Valid`,
63
+ `Rx_Port_Order`, `Tx_Port_Order`).
64
+ - IBIS parsing of:
65
+ true differential `*_diff` `Model_type`s; any OS in `Executable` lines; pin, signal and model names with
66
+ punctuation (e.g. `TX+`, `DQ<0>`); `NA` for either of min/max; `NA` in a pin's R/L/C columns;
67
+ `[Comment Char]`; `name=value` without spaces; `[Pin]` header words in any case.
68
+
69
+ ### Fixed
70
+
71
+ - `.ami` parameter names and `Default` values are sent to the model as written (`Default` is read with the
72
+ parameter's `Type`). Empty groups aren't sent. Descriptions lose their quotes.
73
+ - A parameter that can't be built is skipped, with a warning; the rest of the `.ami` file loads.
74
+ Subparameters named like tags (e.g. `Corner`) are kept.
75
+ - A `List` parameter's dropdown no longer offers its default value twice.
76
+ - `set_param_val()` validates through the parameter's trait; tap tuners read their values from the traits.
77
+ - `IBISModel.get_pins_qualified()` used a removed `is_tx` attribute; it now goes by the pin's models'
78
+ `Model_type`s (any model of a `[Model Selector]`).
79
+ - A component change to a pin of the same name updates the models offered; `pin_` is no longer stale.
80
+ - `zout`/`slew`/`zin` are found for every `Model_type` the data supports (e.g. `3-state`, `Open_*`).
81
+ - A `Vmeas` outside an I-V table no longer fails the file; the first table row no longer wraps around.
82
+ - Trailing `|` comments are dropped from text values; text after `[End]` is ignored, with a warning;
83
+ `CIRCUITCALL` pins are dropped.
84
+ - `test-model` picks the executable by the interpreter's bitness and OS.
85
+ - `run-notebook` works on Python 3.10 and 3.11, and picks the `.ami` file for `--is_tx` on `I/O` models.
86
+ - The model viewers no longer crash on their `zout`/`slew`/`zin` and display values.
87
+
88
+ ### Deprecated
89
+
90
+ - `ami-config` / `ami.config.ami_config()` now warn when used. Make your model configurator executable and
91
+ have it call `ami.config.mk_model()` instead.
92
+
93
+ ### Dependencies
94
+
95
+ - `click>=8.4.2,<9`, `traits>=7.1,<8` (were pinned); `reportlab==5.0.1`.
96
+
97
+ ## [9.3.1] - 2026-08-17
98
+
99
+ ### Added
100
+
101
+ - The source distribution includes a `requirements.txt` exported from `uv.lock`.
102
+
103
+ ## [9.3.0] - 2026-08-15
104
+
105
+ ### Added
106
+
107
+ - What *PyBERT* needs to tune IBIS-AMI model equalization: `AMIParamConfigurator.tunable_params` (#92).
108
+
109
+ ### Fixed
110
+
111
+ - Hierarchical AMI parameter naming (#92).
112
+
113
+ ## [9.2.0] - 2026-07-20
114
+
115
+ ### Added
116
+
117
+ - Python 3.13 support (#91).
118
+
119
+ ### Fixed
120
+
121
+ - The tap parser, and test sweep file naming (#89).
122
+
123
+ ## [9.1.0] - 2026-06-18
124
+
125
+ ### Added
126
+
127
+ - `check-ami` command: runs the IBIS 8.0 `[AMI Test Configuration]`s of an IBIS file and checks the results
128
+ against their golden data (#85).
129
+
130
+ ## [9.0.0] - 2026-05-25
131
+
132
+ ### Changed (breaking)
133
+
134
+ - New model testing infrastructure, in plain Python, with PDF reports made with ReportLab: `test-model`.
135
+ Parameter sweeps are `TestSweep` subclasses in Python modules (a `defaults_template.py` is generated).
136
+ - `ami.parser.parse_ami_file_contents()` returns separate lists of errors and warnings, and raises
137
+ `RuntimeError` when the file doesn't parse.
138
+ - `ami.model.get_responses()` takes a maximum run length in place of `pad_bits` (it no longer overrides
139
+ `Ignore_Bits`), returns a more specific type, and takes a `debug` flag.
140
+ - `IBISModel` no longer takes an `is_tx` argument.
141
+ - Stricter types for `ami.config.mk_model()`, `make_gui()` and `make_gui_items()`.
142
+
143
+ ### Added
144
+
145
+ - Modules `testing`, `util.ami`, `util.misc`, `util.plot` and `util.reportlab`.
146
+ - `run-notebook` builds a default parameter sweep (#65).
147
+
148
+ ### Fixed
149
+
150
+ - The `Clocks` array size, to prevent access violations (#78).
151
+
152
+ ### Deprecated
153
+
154
+ - The `tools` modules; use `testing`.
155
+
156
+ ## [8.1.0] - 2026-02-13
157
+
158
+ ### Changed
159
+
160
+ - Better type specification of the recursive `AmiNode` type (#62).
161
+
162
+ ## [8.0.0] - 2026-01-25
163
+
164
+ ### Changed
165
+
166
+ - Development moved from pip and Tox to uv, still driven by `make` (#60).
167
+
168
+ ### Fixed
169
+
170
+ - `(Format Corner ...)` AMI parameters (#58).
171
+
172
+ ## [7.3.1] - 2025-12-24
173
+
174
+ ### Changed (breaking)
175
+
176
+ - `AMIModel.ami_params_out` is a decoded `str`.
177
+
178
+ ### Fixed
179
+
180
+ - The AMI parameter configuration dialog no longer grows wider than the screen (#56).
181
+ - Some IBIS and AMI parsing bugs.
182
+
183
+ ## [7.2.7] - 2025-10-18
184
+
185
+ ### Fixed
186
+
187
+ - Negative tap indices in AMI files.
188
+
189
+ ## [7.2.5] - 2025-07-23
190
+
191
+ ### Fixed
192
+
193
+ - Miscellaneous fixes made for *PyBERT* v9.1.2.
194
+
195
+ ## [7.2.4] - 2025-07-12
196
+
197
+ ### Fixed
198
+
199
+ - A crash when a String parameter's `Format` was left as `None`.
200
+
201
+ ## [7.2.3] - 2025-05-01
202
+
203
+ ### Fixed
204
+
205
+ - Passing String parameters to the model.
206
+
207
+ ### Changed
208
+
209
+ - Assertions removed from the code base, except in notebooks (#52).
210
+
211
+ ## [7.2.2] - 2025-04-06
212
+
213
+ ### Fixed
214
+
215
+ - AMI model initialization no longer crashes when no `Info` parameters are given.
216
+
217
+ ### Changed
218
+
219
+ - Build infrastructure improvements.
220
+
221
+ ## [7.2.0] - 2025-03-18
222
+
223
+ ### Changed (breaking)
224
+
225
+ - Python 3.9 support dropped; Python 3.10-3.12 supported.
226
+ - Wheel and sdist file names are lower case.
227
+
228
+ ### Added
229
+
230
+ - Type annotations throughout.
231
+ - `Tap` parameter type.
232
+ - AMI reserved parameter names as a `dataclass`.
233
+ - Cleaner AMI parameter configurator GUIs, and more documentation.
234
+
235
+ ### Fixed
236
+
237
+ - A crash on models with only one of `[POWER Clamp]` and `[GND Clamp]`.
238
+ - Like-named AMI parameters below the top level were conflated.
239
+
240
+ ### Deprecated
241
+
242
+ - Non-executable model configurators; use executable ones.
243
+
244
+ ## [6.2.2] - 2025-02-23
245
+
246
+ ### Fixed
247
+
248
+ - `run-notebook` with models generated by *ibisami*.
249
+
250
+ ## [6.2.1] - 2025-02-22
251
+
252
+ ### Added
253
+
254
+ - `run-notebook` command: runs the IBIS-AMI model testing notebook on a model (#48).
255
+
256
+ ## [6.2.0] - 2024-09-09
257
+
258
+ ### Changed (breaking)
259
+
260
+ - `ami.model.get_responses()` returns only the impulse responses.
261
+
262
+ ### Added
263
+
264
+ - Output parameters are captured from each `GetWave()` call.
265
+
266
+ ### Fixed
267
+
268
+ - One extra clock-times slot, to prevent segmentation faults.
269
+ - CTLE step response shifted one UI right; `GetWave()` input gets a prequel, to remove step response noise.
270
+ - Fixes for macOS on Apple silicon; `IBIS_AMI_Checker` notebook finishing touches.
271
+
272
+ ## [5.1.4] - 2024-04-23
273
+
274
+ ### Fixed
275
+
276
+ - `FLOAT`/`TAP` parameters use C type `double`, not `float`.
277
+
278
+ ## [5.1.3] - 2024-04-11
279
+
280
+ ### Changed
281
+
282
+ - Model configurators (e.g. `rx.py`) are executable and drive model configuration, using the library.
283
+
284
+ ## [5.1.2] - 2024-04-09
285
+
286
+ ### Changed
287
+
288
+ - Updated to the current Enable/Chaco/Traits/UI; pip-installable.
289
+
290
+ ## [5.1.1] - 2024-02-12
291
+
292
+ ### Fixed
293
+
294
+ - Rx input termination in generated IBIS models.
295
+
296
+ ## [4.1.1] - 2023-04-20
297
+
298
+ ### Changed
299
+
300
+ - Single-source versioning.
301
+
302
+ ## [4.0.0] - 2022-11-16
303
+
304
+ ### Changed
305
+
306
+ - pip-installable, with a `src/` layout and `pyproject.toml`.
307
+
308
+ ## [3.5.5] - 2022-02-19
309
+
310
+ ### Fixed
311
+
312
+ - AMI parameter parsing fragilities.
313
+
314
+ ## [3.4.1] - 2021-08-16
315
+
316
+ ### Changed
317
+
318
+ - Clean-ups for the *DesignCon 2021 Bootcamp* exercises.
319
+
320
+ ## [3.3.2] - 2020-01-21
321
+
322
+ ### Fixed
323
+
324
+ - IBIS files without `[Date]`, and models with incomplete `[Algorithmic Model]` sections, failed to parse.
325
+
326
+ ## [3.3] - 2019-12-02
327
+
328
+ ### Changed
329
+
330
+ - Python 3 support.
331
+
332
+ ## [2.0.1] - 2017-01-02
333
+
334
+ ### Fixed
335
+
336
+ - Fixes made while testing *PyBERT* v2.0.1 against several IBIS-AMI models.
337
+
338
+ ## [1.1.2] - 2015-05-13
339
+
340
+ ### Fixed
341
+
342
+ - A crash when loading models without `GetWave()`.
343
+
344
+ ## [1.1] - 2015-04-17
345
+
346
+ ### Fixed
347
+
348
+ - `AMIModelInitializer.__init__()` handling of extra keyword arguments.
349
+
350
+ [10.0.0]: https://github.com/capn-freako/PyAMI/compare/v9.3.1...HEAD
351
+ [9.3.1]: https://github.com/capn-freako/PyAMI/compare/v9.3.0...v9.3.1
352
+ [9.3.0]: https://github.com/capn-freako/PyAMI/releases/tag/v9.3.0
353
+ [9.2.0]: https://github.com/capn-freako/PyAMI/releases/tag/v9.2.0
354
+ [9.1.0]: https://github.com/capn-freako/PyAMI/releases/tag/v9.1.0
355
+ [9.0.0]: https://github.com/capn-freako/PyAMI/releases/tag/v9.0.0
356
+ [8.1.0]: https://github.com/capn-freako/PyAMI/releases/tag/v8.1.0
357
+ [8.0.0]: https://github.com/capn-freako/PyAMI/releases/tag/v8.0.0
358
+ [7.3.1]: https://github.com/capn-freako/PyAMI/releases/tag/v7.3.1
359
+ [7.2.7]: https://github.com/capn-freako/PyAMI/releases/tag/v7.2.7
360
+ [7.2.5]: https://github.com/capn-freako/PyAMI/releases/tag/v7.2.5
361
+ [7.2.4]: https://github.com/capn-freako/PyAMI/releases/tag/v7.2.4
362
+ [7.2.3]: https://github.com/capn-freako/PyAMI/releases/tag/v7.2.3
363
+ [7.2.2]: https://github.com/capn-freako/PyAMI/releases/tag/v7.2.2
364
+ [7.2.0]: https://github.com/capn-freako/PyAMI/releases/tag/v7.2.0
365
+ [6.2.2]: https://github.com/capn-freako/PyAMI/releases/tag/v6.2.2
366
+ [6.2.1]: https://github.com/capn-freako/PyAMI/releases/tag/v6.2.1
367
+ [6.2.0]: https://github.com/capn-freako/PyAMI/releases/tag/v6.2.0
368
+ [5.1.4]: https://github.com/capn-freako/PyAMI/releases/tag/v5.1.4
369
+ [5.1.3]: https://github.com/capn-freako/PyAMI/releases/tag/v5.1.3
370
+ [5.1.2]: https://github.com/capn-freako/PyAMI/releases/tag/v5.1.2
371
+ [5.1.1]: https://github.com/capn-freako/PyAMI/releases/tag/5.1.1
372
+ [4.1.1]: https://github.com/capn-freako/PyAMI/releases/tag/4.1.1
373
+ [4.0.0]: https://github.com/capn-freako/PyAMI/releases/tag/4.0.0
374
+ [3.5.5]: https://github.com/capn-freako/PyAMI/releases/tag/3.5.5
375
+ [3.4.1]: https://github.com/capn-freako/PyAMI/releases/tag/v3.4.1
376
+ [3.3.2]: https://github.com/capn-freako/PyAMI/releases/tag/v3.3.2
377
+ [3.3]: https://github.com/capn-freako/PyAMI/releases/tag/v3.3
378
+ [2.0.1]: https://github.com/capn-freako/PyAMI/releases/tag/v2.0.1
379
+ [1.1.2]: https://github.com/capn-freako/PyAMI/releases/tag/v1.1.2
380
+ [1.1]: https://github.com/capn-freako/PyAMI/releases/tag/v1.1
@@ -1,5 +1,7 @@
1
1
  include README.md
2
+ include CHANGELOG.md
2
3
  include LICENSE
4
+ include requirements.txt
3
5
  include src/pyibisami/tools/test_results.xsl
4
6
  include src/pyibisami/ami/generic.ami.em
5
7
  include src/pyibisami/ami/generic.ibs.em
@@ -0,0 +1,201 @@
1
+ Metadata-Version: 2.4
2
+ Name: pyibis-ami
3
+ Version: 10.0.0
4
+ Summary: Facilitates working directly with IBIS-AMI DLLs from the Python command prompt.
5
+ Author-email: David Banas <capn.freako@gmail.com>
6
+ Project-URL: Documentation, https://pyibis-ami.readthedocs.io/en/latest/
7
+ Project-URL: Wiki, https://github.com/capn-freako/PyAMI/wiki
8
+ Project-URL: GitHub, https://github.com/capn-freako/PyAMI
9
+ Project-URL: PyPi, https://pypi.org/project/PyIBIS-AMI/
10
+ Keywords: ibis-ami
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: Implementation :: CPython
22
+ Classifier: Topic :: System :: Emulators
23
+ Classifier: Topic :: Utilities
24
+ Requires-Python: <3.14,>=3.10
25
+ Description-Content-Type: text/markdown
26
+ License-File: LICENSE
27
+ Requires-Dist: click<9,>=8.4.2
28
+ Requires-Dist: empy==4.2.1
29
+ Requires-Dist: numpy>=1.26
30
+ Requires-Dist: parsec==3.17
31
+ Requires-Dist: traits<8,>=7.1
32
+ Provides-Extra: gui
33
+ Requires-Dist: chaco==6.1.1; extra == "gui"
34
+ Requires-Dist: enable==6.1.0; extra == "gui"
35
+ Requires-Dist: traitsui==8.0.0; extra == "gui"
36
+ Provides-Extra: report
37
+ Requires-Dist: matplotlib>=3.6.1; extra == "report"
38
+ Requires-Dist: reportlab==5.0.1; extra == "report"
39
+ Requires-Dist: scipy>=1.15; extra == "report"
40
+ Provides-Extra: notebook
41
+ Requires-Dist: pyibis-ami[report]; extra == "notebook"
42
+ Requires-Dist: jupyter==1.1.1; extra == "notebook"
43
+ Requires-Dist: lxml-html-clean==0.4.5; extra == "notebook"
44
+ Requires-Dist: papermill==2.7.0; extra == "notebook"
45
+ Provides-Extra: all
46
+ Requires-Dist: pyibis-ami[gui,notebook,report]; extra == "all"
47
+ Dynamic: license-file
48
+
49
+ [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/capn-freako/PyAMI/master.svg)](https://results.pre-commit.ci/latest/github/capn-freako/PyAMI/master)
50
+
51
+ # PyIBIS-AMI
52
+
53
+ PyIBIS-AMI is a Python package of tools useful in the development and testing of IBIS-AMI models.
54
+ It parses IBIS (`.ibs`) and AMI (`.ami`) files, drives a model's `AMI_Init()` / `AMI_GetWave()`
55
+ functions from Python, and provides several command line applications.
56
+ This library is used in [PyBERT](https://github.com/capn-freako/PyBERT).
57
+
58
+ [View API/Developer's Documentation.](https://pyibis-ami.readthedocs.io/en/latest/)
59
+ [View the changelog.](https://github.com/capn-freako/PyAMI/blob/master/CHANGELOG.md)
60
+
61
+ ## Installation
62
+
63
+ ```bash
64
+ pip install PyIBIS-AMI
65
+ ```
66
+
67
+ The basic install contains the core library, plus the `ami-config` and `check-ami` tools.
68
+ Optional features are installed as extras, e.g. `pip install 'PyIBIS-AMI[gui]'`:
69
+
70
+ | Extra | Needed for |
71
+ |------------|-----------------------------------------------------------------|
72
+ | `gui` | Traits/UI GUIs (AMI parameter configurator, IBIS model viewers) |
73
+ | `report` | `test-model` and `run-tests` |
74
+ | `notebook` | `run-notebook` |
75
+ | `all` | All of the above |
76
+
77
+ The `gui` extra doesn't include a Qt binding; install one too, if you have none (e.g. `pip install pyside6`).
78
+
79
+ ## Python Example
80
+
81
+ Load an IBIS-AMI model, initialize it with its default parameter values, and run a bit stream through it:
82
+
83
+ ```python
84
+ import logging
85
+
86
+ import numpy as np
87
+
88
+ from pyibisami.ami.model import AMIModel
89
+ from pyibisami.ami.parser import AMIParamConfigurator
90
+ from pyibisami.ibis.file import IBISModel
91
+
92
+ # PyIBIS-AMI only logs (to loggers under `pyibisami`); it's silent until you configure logging.
93
+ # Show warnings and above from everything, plus `pyibisami`'s debug messages:
94
+ logging.basicConfig(level=logging.WARNING, format="%(levelname)s %(name)s: %(message)s")
95
+ logging.getLogger("pyibisami").setLevel(logging.DEBUG)
96
+ # Or, tune one module, e.g. quiet the IBIS parser:
97
+ logging.getLogger("pyibisami.ibis.parser").setLevel(logging.INFO)
98
+ log = logging.getLogger("example") # This script's own messages.
99
+ log.setLevel(logging.INFO)
100
+
101
+ # Parse the IBIS file. The first component/pin/model is selected by default;
102
+ # change the selection via `ibis.comp`, `ibis.pin`, and `ibis.mod`.
103
+ ibis = IBISModel("example_tx.ibs")
104
+
105
+ # Parse the selected model's AMI file and take its default parameter values.
106
+ # (For an I/O model with both Tx and Rx executables, use `ibis.model.get_ami_files(is_tx)` to pick one.)
107
+ with open(ibis.ami_path, encoding="utf-8") as f:
108
+ ami_cfg = AMIParamConfigurator(f.read())
109
+ ami_params = ami_cfg.input_ami_params # e.g. {'root_name': 'example_tx', 'tx_tap_units': 27, ...}
110
+
111
+ # Build the `AMI_Init()` input: 10 Gb/s, 32 samples per UI, ideal channel (unit impulse).
112
+ bit_time = 100e-12
113
+ sample_interval = bit_time / 32
114
+ h = np.zeros(256)
115
+ h[0] = 1 / sample_interval
116
+ initializer = ami_cfg.get_init(bit_time, sample_interval, h, ami_params=ami_params)
117
+
118
+ # Load the model's DLL/SO (for this platform) and call `AMI_Init()`.
119
+ model = AMIModel(str(ibis.dll_path))
120
+ model.initialize(initializer)
121
+ log.info("AMI_Init() message: %s", model.msg.decode().strip())
122
+ log.info("AMI_Init() output parameters: %s", model.ami_params_out)
123
+ h_out = np.array(model.initOut) # Channel impulse response, convolved with the model's
124
+
125
+ # Run a random NRZ bit stream through `AMI_GetWave()`, if the model has one.
126
+ if model.has_getwave:
127
+ bits = np.random.randint(2, size=1000)
128
+ wave_in = np.repeat(2.0 * bits - 1.0, 32)
129
+ wave_out, clock_times, params_out = model.getWave(wave_in)
130
+
131
+ # Plot the first 50 bits of the input and output waveforms (needs `matplotlib`).
132
+ import matplotlib.pyplot as plt
133
+
134
+ n = 50 * 32
135
+ t_ns = np.arange(n) * sample_interval * 1e9
136
+ plt.plot(t_ns, wave_in[:n], label="wave_in")
137
+ plt.plot(t_ns, wave_out[:n], label="wave_out")
138
+ plt.xlabel("Time (ns)")
139
+ plt.ylabel("Amplitude (V)")
140
+ plt.legend()
141
+ plt.show()
142
+ ```
143
+
144
+ ## Command Line Tools
145
+
146
+ | Command | Purpose | Extra |
147
+ |----------------|------------------------------------------------------------------------|------------|
148
+ | `test-model` | Test an IBIS-AMI model, producing a PDF report | `report` |
149
+ | `check-ami` | Run the `[AMI Test Configuration]` blocks of an IBIS 8.0 file | (core) |
150
+ | `run-notebook` | Run a Jupyter notebook on an IBIS-AMI model | `notebook` |
151
+ | `run-tests` | Run EmPy-based tests on an AMI model DLL, producing XML output (older) | `report` |
152
+ | `ami-config` | Generate model C++ source, `.ibs`, and `.ami` files (deprecated) | (core) |
153
+
154
+ All commands accept `-h`/`--help`.
155
+
156
+ ### IBIS-AMI Model Testing
157
+
158
+ **PyIBIS-AMI Native:**
159
+
160
+ ```bash
161
+ % test-model -h
162
+ Usage: test-model [OPTIONS] IBIS_FILE
163
+
164
+ Options:
165
+ -m, --model TEXT Name of IBIS-AMI model to test.
166
+ -p, --params TEXT Directory containing test configuration sweeps.
167
+ -d, --debug Provide extra debugging information.
168
+ --version Show the version and exit.
169
+ -h, --help Show this message and exit.
170
+ ```
171
+
172
+ **IBIS v8.0:**
173
+
174
+ Runs the `[AMI Test Configuration]` blocks of an IBIS 8.0 file (§10.11).
175
+ From Python, use `pyibisami.testing.ami_test_config.run_ami_test_config()` (one configuration)
176
+ or `run_all_ami_test_configs()` (all of a model's).
177
+
178
+ ```bash
179
+ % check-ami -h
180
+ Usage: check-ami [OPTIONS] IBIS_FILE
181
+
182
+ Run [AMI Test Configuration] blocks embedded in an IBIS file (IBIS 8.0
183
+ §10.11).
184
+
185
+ Parses IBIS_FILE, locates the target model, then calls AMI_Init() (and
186
+ AMI_GetWave() for Time_domain configs) and compares the outputs against the
187
+ golden data files referenced in each [AMI Test Configuration] block.
188
+
189
+ Exits with status 1 if any configuration fails.
190
+
191
+ Options:
192
+ -m, --model-name TEXT Name of the [Model] to test. Required when the .ibs
193
+ file defines more than one model.
194
+ -c, --config TEXT Name of a single [AMI Test Configuration] to run.
195
+ Runs all configs when omitted.
196
+ --tol-ir FLOAT Absolute tolerance for impulse-response comparison.
197
+ [default: 1e-06]
198
+ --tol-wave FLOAT Absolute tolerance for waveform comparison.
199
+ [default: 1e-06]
200
+ -h, --help Show this message and exit.
201
+ ```