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.
- adijif/__init__.py +32 -0
- adijif/adijif.py +1 -0
- adijif/cli.py +21 -0
- adijif/clocks/__init__.py +10 -0
- adijif/clocks/ad9523.py +321 -0
- adijif/clocks/ad9523_1_bf.py +91 -0
- adijif/clocks/ad9528.py +444 -0
- adijif/clocks/ad9528_bf.py +70 -0
- adijif/clocks/ad9545.py +553 -0
- adijif/clocks/clock.py +153 -0
- adijif/clocks/hmc7044.py +558 -0
- adijif/clocks/hmc7044_bf.py +68 -0
- adijif/clocks/ltc6952.py +624 -0
- adijif/clocks/ltc6952_bf.py +67 -0
- adijif/clocks/ltc6953.py +509 -0
- adijif/common.py +70 -0
- adijif/converters/__init__.py +3 -0
- adijif/converters/ad9081.py +679 -0
- adijif/converters/ad9081_dp.py +206 -0
- adijif/converters/ad9081_util.py +124 -0
- adijif/converters/ad9084.py +588 -0
- adijif/converters/ad9084_dp.py +111 -0
- adijif/converters/ad9084_draw.py +203 -0
- adijif/converters/ad9084_util.py +365 -0
- adijif/converters/ad9144.py +316 -0
- adijif/converters/ad9144_bf.py +44 -0
- adijif/converters/ad9680.py +201 -0
- adijif/converters/ad9680_bf.py +43 -0
- adijif/converters/ad9680_draw.py +184 -0
- adijif/converters/adc.py +83 -0
- adijif/converters/adrv9009.py +426 -0
- adijif/converters/adrv9009_bf.py +43 -0
- adijif/converters/adrv9009_util.py +89 -0
- adijif/converters/converter.py +399 -0
- adijif/converters/dac.py +85 -0
- adijif/converters/resources/AD9084_JTX_JRX.xlsx +0 -0
- adijif/converters/resources/ad9081_JRx_204B.csv +180 -0
- adijif/converters/resources/ad9081_JRx_204C.csv +411 -0
- adijif/converters/resources/ad9081_JTx_204B.csv +1488 -0
- adijif/converters/resources/ad9081_JTx_204C.csv +1064 -0
- adijif/converters/resources/full_rx_mode_table_ad9081.csv +1904 -0
- adijif/converters/resources/full_tx_mode_table_ad9081.csv +994 -0
- adijif/d2/__init__.py +26 -0
- adijif/d2/d2lib.h +81 -0
- adijif/draw.py +498 -0
- adijif/fpgas/__init__.py +1 -0
- adijif/fpgas/fpga.py +64 -0
- adijif/fpgas/xilinx/__init__.py +1143 -0
- adijif/fpgas/xilinx/bf.py +101 -0
- adijif/fpgas/xilinx/pll.py +232 -0
- adijif/fpgas/xilinx/sevenseries.py +531 -0
- adijif/fpgas/xilinx/ultrascaleplus.py +485 -0
- adijif/fpgas/xilinx/xilinx_draw.py +516 -0
- adijif/gekko_trans.py +295 -0
- adijif/jesd.py +760 -0
- adijif/plls/__init__.py +3 -0
- adijif/plls/adf4030.py +259 -0
- adijif/plls/adf4371.py +419 -0
- adijif/plls/adf4382.py +581 -0
- adijif/plls/pll.py +103 -0
- adijif/solvers.py +54 -0
- adijif/sys/__init__.py +1 -0
- adijif/sys/s_plls.py +185 -0
- adijif/system.py +567 -0
- adijif/system_draw.py +65 -0
- adijif/types.py +151 -0
- adijif/utils.py +191 -0
- pyadi_jif-0.1.0.dist-info/METADATA +62 -0
- pyadi_jif-0.1.0.dist-info/RECORD +73 -0
- pyadi_jif-0.1.0.dist-info/WHEEL +6 -0
- pyadi_jif-0.1.0.dist-info/licenses/AUTHORS.rst +13 -0
- pyadi_jif-0.1.0.dist-info/licenses/LICENSE +277 -0
- 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
|