pyadi-jif 0.1.0__py2.py3-none-any.whl

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 (73) hide show
  1. adijif/__init__.py +32 -0
  2. adijif/adijif.py +1 -0
  3. adijif/cli.py +21 -0
  4. adijif/clocks/__init__.py +10 -0
  5. adijif/clocks/ad9523.py +321 -0
  6. adijif/clocks/ad9523_1_bf.py +91 -0
  7. adijif/clocks/ad9528.py +444 -0
  8. adijif/clocks/ad9528_bf.py +70 -0
  9. adijif/clocks/ad9545.py +553 -0
  10. adijif/clocks/clock.py +153 -0
  11. adijif/clocks/hmc7044.py +558 -0
  12. adijif/clocks/hmc7044_bf.py +68 -0
  13. adijif/clocks/ltc6952.py +624 -0
  14. adijif/clocks/ltc6952_bf.py +67 -0
  15. adijif/clocks/ltc6953.py +509 -0
  16. adijif/common.py +70 -0
  17. adijif/converters/__init__.py +3 -0
  18. adijif/converters/ad9081.py +679 -0
  19. adijif/converters/ad9081_dp.py +206 -0
  20. adijif/converters/ad9081_util.py +124 -0
  21. adijif/converters/ad9084.py +588 -0
  22. adijif/converters/ad9084_dp.py +111 -0
  23. adijif/converters/ad9084_draw.py +203 -0
  24. adijif/converters/ad9084_util.py +365 -0
  25. adijif/converters/ad9144.py +316 -0
  26. adijif/converters/ad9144_bf.py +44 -0
  27. adijif/converters/ad9680.py +201 -0
  28. adijif/converters/ad9680_bf.py +43 -0
  29. adijif/converters/ad9680_draw.py +184 -0
  30. adijif/converters/adc.py +83 -0
  31. adijif/converters/adrv9009.py +426 -0
  32. adijif/converters/adrv9009_bf.py +43 -0
  33. adijif/converters/adrv9009_util.py +89 -0
  34. adijif/converters/converter.py +399 -0
  35. adijif/converters/dac.py +85 -0
  36. adijif/converters/resources/AD9084_JTX_JRX.xlsx +0 -0
  37. adijif/converters/resources/ad9081_JRx_204B.csv +180 -0
  38. adijif/converters/resources/ad9081_JRx_204C.csv +411 -0
  39. adijif/converters/resources/ad9081_JTx_204B.csv +1488 -0
  40. adijif/converters/resources/ad9081_JTx_204C.csv +1064 -0
  41. adijif/converters/resources/full_rx_mode_table_ad9081.csv +1904 -0
  42. adijif/converters/resources/full_tx_mode_table_ad9081.csv +994 -0
  43. adijif/d2/__init__.py +26 -0
  44. adijif/d2/d2lib.h +81 -0
  45. adijif/draw.py +498 -0
  46. adijif/fpgas/__init__.py +1 -0
  47. adijif/fpgas/fpga.py +64 -0
  48. adijif/fpgas/xilinx/__init__.py +1143 -0
  49. adijif/fpgas/xilinx/bf.py +101 -0
  50. adijif/fpgas/xilinx/pll.py +232 -0
  51. adijif/fpgas/xilinx/sevenseries.py +531 -0
  52. adijif/fpgas/xilinx/ultrascaleplus.py +485 -0
  53. adijif/fpgas/xilinx/xilinx_draw.py +516 -0
  54. adijif/gekko_trans.py +295 -0
  55. adijif/jesd.py +760 -0
  56. adijif/plls/__init__.py +3 -0
  57. adijif/plls/adf4030.py +259 -0
  58. adijif/plls/adf4371.py +419 -0
  59. adijif/plls/adf4382.py +581 -0
  60. adijif/plls/pll.py +103 -0
  61. adijif/solvers.py +54 -0
  62. adijif/sys/__init__.py +1 -0
  63. adijif/sys/s_plls.py +185 -0
  64. adijif/system.py +567 -0
  65. adijif/system_draw.py +65 -0
  66. adijif/types.py +151 -0
  67. adijif/utils.py +191 -0
  68. pyadi_jif-0.1.0.dist-info/METADATA +62 -0
  69. pyadi_jif-0.1.0.dist-info/RECORD +73 -0
  70. pyadi_jif-0.1.0.dist-info/WHEEL +6 -0
  71. pyadi_jif-0.1.0.dist-info/licenses/AUTHORS.rst +13 -0
  72. pyadi_jif-0.1.0.dist-info/licenses/LICENSE +277 -0
  73. pyadi_jif-0.1.0.dist-info/top_level.txt +1 -0
adijif/gekko_trans.py ADDED
@@ -0,0 +1,295 @@
1
+ """Translation methods for solvers and module."""
2
+
3
+ from typing import List, Optional, Union
4
+
5
+ import numpy as np
6
+
7
+ from adijif.solvers import GK_Intermediate
8
+ from adijif.solvers import (
9
+ binary_var,
10
+ CpoExpr,
11
+ CpoFunctionCall,
12
+ CpoSolveResult,
13
+ GEKKO,
14
+ GK_Operators,
15
+ GKVariable,
16
+ integer_var,
17
+ )
18
+
19
+
20
+ class gekko_translation:
21
+ """Collection of utility functions to translate to and from solver types."""
22
+
23
+ # @property
24
+ # @abstractmethod
25
+ # def model(self):
26
+ # raise NotImplementedError
27
+ model: Union[GEKKO, CpoExpr] = None
28
+
29
+ solution: CpoSolveResult = None
30
+
31
+ solver = "gekko" # "CPLEX"
32
+
33
+ def _add_intermediate(
34
+ self, eqs: Union[GK_Operators, CpoFunctionCall]
35
+ ) -> Union[GK_Intermediate, CpoFunctionCall]:
36
+ """Add intermediate/simplified equation.
37
+
38
+ Args:
39
+ eqs (GK_Operators, CpoFunctionCall): Equation
40
+
41
+ Returns:
42
+ GK_Intermediate/CpoFunctionCall: Converted equation for solver
43
+
44
+ Raises:
45
+ Exception: Unknown solver selected
46
+ """
47
+ if self.solver == "gekko":
48
+ return self.model.Intermediate(eqs)
49
+ elif self.solver == "CPLEX":
50
+ return eqs
51
+ else:
52
+ raise Exception(f"Unknown solver: {self.solver}")
53
+
54
+ def _add_equation(
55
+ self,
56
+ eqs: List[Union[GKVariable, GK_Intermediate, GK_Operators, CpoExpr]],
57
+ ) -> None:
58
+ """Add equation or relation to solver.
59
+
60
+ Args:
61
+ eqs (List[Union[GKVariable, GK_Intermediate, GK_Operators, CpoExpr]]):
62
+ List of equations or CPLEX constraints to add to solver.
63
+
64
+ Raises:
65
+ Exception: Unknown solver selected
66
+ """
67
+ if not isinstance(eqs, list):
68
+ eqs = [eqs]
69
+
70
+ if self.solver == "gekko":
71
+ self.model.Equations(eqs)
72
+ elif self.solver == "CPLEX":
73
+ for eq in eqs:
74
+ self.model.add_constraint(eq)
75
+ else:
76
+ raise Exception(f"Unknown solver {self.solver}")
77
+
78
+ def _get_val(
79
+ self,
80
+ value: Union[int, float, GKVariable, GK_Intermediate, GK_Operators],
81
+ ) -> Union[int, float, str]:
82
+ """Extract value from solver types.
83
+
84
+ Args:
85
+ value (GKVariable, GK_Intermediate, GK_Operators): Solver variable
86
+
87
+ Returns:
88
+ int/float: Extracted value
89
+
90
+ Raises:
91
+ Exception: Unknown solver selected
92
+ """
93
+ if isinstance(value, (float, int)):
94
+ return value
95
+ if self.solver == "gekko":
96
+ if type(value) in [
97
+ GKVariable,
98
+ GK_Intermediate,
99
+ ]:
100
+ return value.value[0]
101
+ elif type(value) is GK_Operators:
102
+ return value.value
103
+ else:
104
+ return value
105
+ elif self.solver == "CPLEX":
106
+ if isinstance(value, (int, float)):
107
+ return value
108
+ return self.solution.get_value(value.get_name())
109
+ else:
110
+ raise Exception(f"Unknown solver {self.solver}")
111
+
112
+ def _check_in_range(
113
+ self,
114
+ value: Union[int, str, List[int], List[str]],
115
+ possible: Union[List[int], List[str]],
116
+ varname: str,
117
+ ) -> None:
118
+ """Check if desired value in list.
119
+
120
+ Args:
121
+ value (int, str, List[int], List[str]): Desired input value
122
+ possible (List[int], List[str]): Possible valid options
123
+ varname (str): Name of variable
124
+
125
+ Raises:
126
+ Exception: Value not indexable from list or possible
127
+
128
+ """
129
+ if not isinstance(value, list):
130
+ value = [value] # type: ignore
131
+ for v in value: # type: ignore
132
+ if v not in possible:
133
+ raise Exception(f"{v} invalid for {varname}. Only {possible} possible")
134
+
135
+ def _convert_input(
136
+ self,
137
+ val: Union[int, List[int], float, List[float]],
138
+ name: Optional[str] = None,
139
+ default: Union[int, float] = None,
140
+ ) -> Union[CpoExpr, GKVariable, GK_Operators]:
141
+ """Convert input to solver variables.
142
+
143
+ Args:
144
+ val (int, List[int], float, List[float]): Values or list of
145
+ values to convert to solver variables.
146
+ name (Optional[str]): Name of variable
147
+ default (Optional[int, float]): Default/initial value
148
+
149
+ Returns:
150
+ CpoExpr, GKVariable, GK_Operators: Solver variables
151
+
152
+ Raises:
153
+ Exception: Unknown solver selected
154
+ """
155
+ if self.solver == "gekko":
156
+ name = None
157
+ return self._convert_input_gekko(val, name, default)
158
+ elif self.solver == "CPLEX":
159
+ return self._convert_input_cplex(val, name)
160
+ else:
161
+ raise Exception(f"Unknown solver {self.solver}")
162
+
163
+ def _convert_input_gekko(
164
+ self,
165
+ val: Union[int, List[int], float, List[float]],
166
+ name: Optional[str] = None,
167
+ default: Optional[Union[int, float]] = None,
168
+ ) -> Union[GKVariable, GK_Operators]:
169
+ """Convert input to GEKKO solver variables.
170
+
171
+ Args:
172
+ val (int, List[int], float, List[float]): Values or list of
173
+ values to convert to solver variables.
174
+ name (str): Name of variable
175
+ default (Optional[int, float]): Default/initial value
176
+
177
+ Returns:
178
+ GKVariable, GK_Operators: Solver variables
179
+ """
180
+ if isinstance(val, list) and len(val) > 1:
181
+ return self._convert_list(val, name, default)
182
+ if name:
183
+ name + "_Const"
184
+ return self.model.Const(value=val, name=name)
185
+
186
+ def _convert_input_cplex(
187
+ self,
188
+ val: Union[int, List[int], float, List[float]],
189
+ name: Optional[str] = None,
190
+ ) -> CpoExpr:
191
+ """Convert input to CPLEX solver variables.
192
+
193
+ Args:
194
+ val (int, List[int], float, List[float]): Values or list of
195
+ values to convert to solver variables.
196
+ name (str): Name of variable
197
+
198
+ Returns:
199
+ CpoExpr: Solver variables
200
+
201
+ Raises:
202
+ Exception: Variable already exists in solver model
203
+ """
204
+ if name:
205
+ names = [var.get_name() for var in self.model.get_all_variables()]
206
+ if name in names:
207
+ raise Exception(f"Variable {name} already exists in model")
208
+ if isinstance(val, list) and val.sort() == [0, 1]:
209
+ return binary_var(name=name)
210
+ # if isinstance(val, (float, int)):
211
+ # return constant(val)
212
+ # return integer_var(domain=(val, val), name=name)
213
+ if isinstance(val, int):
214
+ return val
215
+ if isinstance(val, float):
216
+ if float(int(val)) == val:
217
+ val = int(val)
218
+ return val
219
+ # return integer_var(domain=(val, val), name=name)
220
+ # return self.model.continuous_var(domain=(val, val), name=name)
221
+ return integer_var(domain=val, name=name)
222
+
223
+ def _convert_list(
224
+ self,
225
+ val: Union[List[int], List[float]],
226
+ name: Optional[str] = None,
227
+ default: Optional[Union[int, float]] = None,
228
+ ) -> GK_Operators:
229
+ """Convert input list to GEKKO solver variables.
230
+
231
+ Args:
232
+ val (List[int], List[float]): List of values to convert
233
+ to solver variables.
234
+ name (str): Name of variable
235
+ default (Optional[int, float]): Default/initial value
236
+
237
+ Returns:
238
+ GK_Operators: Solver variables
239
+
240
+ Raises:
241
+ Exception: Unsupported case
242
+ """
243
+ # Check if contiguous by simply stride
244
+ delta = val[0] - val[1]
245
+ for i in range(len(val) - 1):
246
+ if val[i] - val[i + 1] is not delta:
247
+ # Must use SOS2
248
+ # print(val[i] - val[i + 1], delta)
249
+ # return self._convert_list2sos(val, name)
250
+ return self.model.sos1(val)
251
+
252
+ if np.abs(delta) == 1: # Easy mode
253
+ # print(np.min(val), np.max(val))
254
+ if not default:
255
+ default = np.min(val)
256
+ if name:
257
+ name + "_Var"
258
+ return self.model.Var(
259
+ integer=True,
260
+ lb=np.min(val),
261
+ ub=np.max(val),
262
+ value=default,
263
+ name=name,
264
+ )
265
+
266
+ else:
267
+ # SOS practical in small cases
268
+ if len(val) < 6:
269
+ print("SOS pract")
270
+ # Need to still handle name
271
+ return self.model.sos1(val)
272
+ # Since stride is not zero the best is to use a scale
273
+ # factor and intermediate for best solving performance
274
+
275
+ # Need to fit-> (Array+B)*C+D == org_arrar
276
+ # 1,3,5 -> ([1,2,3]-1) * 2 + 1
277
+ # 3,6,9 -> [1,2,3]*3
278
+ # 2,4,6 -> [1,2,3]*2
279
+
280
+ raise Exception("NOT COMPLETE")
281
+
282
+ # val = np.array(val)
283
+ # vlen = len(val)
284
+ # Array = np.array(range(1, vlen + 1))
285
+ # for B in range(0, vlen):
286
+ # for C in range(1, vlen):
287
+ # for D in range(0, vlen):
288
+ # if val == (Array + B) * C + D:
289
+ # break
290
+ # array = self.model.Var(
291
+ # integer=True, lb=1, ub=4, value=1, name=name + "_Var"
292
+ # )
293
+
294
+ # def _convert_back(self, value):
295
+ # return value