pyedb 0.14.0__py3-none-any.whl → 0.15.0__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.

Potentially problematic release.


This version of pyedb might be problematic. Click here for more details.

@@ -23,57 +23,9 @@
23
23
 
24
24
  import warnings
25
25
 
26
- from pyedb.dotnet.edb_core.general import (
27
- convert_netdict_to_pydict,
28
- convert_pydict_to_netdict,
29
- )
30
- from pyedb.dotnet.edb_core.sim_setup_data.data.mesh_operation import (
31
- MeshOperationLength,
32
- MeshOperationSkinDepth,
33
- )
34
- from pyedb.dotnet.edb_core.sim_setup_data.data.settings import (
35
- AdaptiveSettings,
36
- AdvancedMeshSettings,
37
- CurveApproxSettings,
38
- DcrSettings,
39
- DefeatureSettings,
40
- HfssPortSettings,
41
- HfssSolverSettings,
42
- ViaSettings,
43
- )
44
- from pyedb.dotnet.edb_core.sim_setup_data.data.siw_dc_ir_settings import (
45
- SiwaveDCIRSettings,
46
- )
26
+ from pyedb.dotnet.edb_core.sim_setup_data.data.sim_setup_info import SimSetupInfo
47
27
  from pyedb.dotnet.edb_core.sim_setup_data.data.sweep_data import SweepData
48
- from pyedb.dotnet.edb_core.sim_setup_data.io.siwave import (
49
- AdvancedSettings,
50
- DCAdvancedSettings,
51
- DCSettings,
52
- )
53
- from pyedb.generic.general_methods import generate_unique_name, is_linux
54
-
55
-
56
- def _parse_value(v):
57
- """Parse value in C sharp format."""
58
- # duck typing parse of the value 'v'
59
- if v is None or v == "":
60
- pv = v
61
- elif v == "true":
62
- pv = True
63
- elif v == "false":
64
- pv = False
65
- else:
66
- try:
67
- pv = int(v)
68
- except ValueError:
69
- try:
70
- pv = float(v)
71
- except ValueError:
72
- if isinstance(v, str) and v[0] == v[-1] == "'":
73
- pv = v[1:-1]
74
- else:
75
- pv = v
76
- return pv
28
+ from pyedb.generic.general_methods import generate_unique_name
77
29
 
78
30
 
79
31
  class AdaptiveType(object):
@@ -97,7 +49,8 @@ class SimulationSetup(object):
97
49
  self._pedb = pedb
98
50
  self._edb_object = edb_object
99
51
  self._setup_type = ""
100
- self._setup_type_mapping = {
52
+ self._simulation_setup_builder = None
53
+ self._simulation_setup_type = {
101
54
  "kHFSS": self._pedb.simsetupdata.HFSSSimulationSettings,
102
55
  "kPEM": None,
103
56
  "kSIwave": self._pedb.simsetupdata.SIwave.SIWSimulationSettings,
@@ -116,7 +69,7 @@ class SimulationSetup(object):
116
69
  }
117
70
 
118
71
  if float(self._pedb.edbversion) >= 2024.2:
119
- self._setup_type_mapping.update(
72
+ self._simulation_setup_type.update(
120
73
  {
121
74
  "kRaptorX": self._pedb.simsetupdata.RaptorX.RaptorXSimulationSettings,
122
75
  "kHFSSPI": self._pedb.simsetupdata.HFSSPISimulationSettings,
@@ -127,14 +80,25 @@ class SimulationSetup(object):
127
80
 
128
81
  self._sweep_list = {}
129
82
 
130
- def _create(self, name=None):
83
+ @property
84
+ def sim_setup_info(self):
85
+ return SimSetupInfo(self._pedb, sim_setup=self, edb_object=self._edb_object.GetSimSetupInfo())
86
+
87
+ @sim_setup_info.setter
88
+ def sim_setup_info(self, sim_setup_info):
89
+ self._edb_object = self._simulation_setup_builder(sim_setup_info._edb_object)
90
+
91
+ @property
92
+ def setup_type(self):
93
+ return self.sim_setup_info.sim_setup_type
94
+
95
+ def _create(self, name=None, simulation_setup_type=""):
131
96
  """Create a simulation setup."""
132
97
  if not name:
133
98
  name = generate_unique_name(self.setup_type)
134
99
  self._name = name
135
100
 
136
- setup_type = self._setup_type_mapping[self._setup_type]
137
- edb_setup_info = self._pedb.simsetupdata.SimSetupInfo[setup_type]()
101
+ edb_setup_info = self._pedb.simsetupdata.SimSetupInfo[self._simulation_setup_type[simulation_setup_type]]()
138
102
  edb_setup_info.Name = name
139
103
  if (
140
104
  edb_setup_info.get_SimSetupType().ToString() == "kRaptorX"
@@ -168,17 +132,17 @@ class SimulationSetup(object):
168
132
  version = self._pedb.edbversion.split(".")
169
133
  if int(version[0]) == 2024 and int(version[1]) == 2 or int(version[0]) > 2024:
170
134
  setup_type_mapping["kRaptorX"] = utility.RaptorXSimulationSetup
171
- setup_utility = setup_type_mapping[self._setup_type]
135
+ setup_type_mapping["kHFSSPI"] = utility.HFSSPISimulationSetup
136
+ sim_setup_type = self.sim_setup_info.sim_setup_type
137
+ setup_utility = setup_type_mapping[sim_setup_type.ToString()]
172
138
  return setup_utility(edb_setup_info)
173
139
 
174
140
  def _update_setup(self):
175
141
  """Update setup in EDB."""
176
- if self._setup_type == "kHFSS":
177
- mesh_operations = self.get_sim_setup_info.SimulationSettings.MeshOperations
178
- mesh_operations.Clear()
179
- for mop in self.mesh_operations.values():
180
- mesh_operations.Add(mop.mesh_operation)
142
+ # Update mesh operation
143
+ # Update sweep
181
144
 
145
+ # Replace setup
182
146
  if self._name in self._pedb.setups:
183
147
  self._pedb.layout.cell.DeleteSimulationSetup(self._name)
184
148
  if not self._pedb.layout.cell.AddSimulationSetup(self._edb_object):
@@ -230,15 +194,59 @@ class SimulationSetup(object):
230
194
 
231
195
  @property
232
196
  def frequency_sweeps(self):
197
+ warnings.warn("Use new property :func:`sweeps` instead.", DeprecationWarning)
198
+ return self.sweeps
199
+
200
+ @property
201
+ def sweeps(self):
233
202
  """List of frequency sweeps."""
234
203
  temp = {}
235
204
  if self.setup_type in ("kRaptorX", "kHFSSPI"):
236
205
  sweep_data_list = self._edb_setup_info.SweepDataList
206
+ for i in list(sweep_data_list):
207
+ temp[i.Name] = SweepData(self, None, i.Name, i)
208
+ return temp
209
+ else:
210
+ return {i.name: i for i in self.sim_setup_info.sweep_data_list}
211
+
212
+ def add_sweep(self, name, frequency_set: list = None):
213
+ """Add frequency sweep.
214
+
215
+ Parameters
216
+ ----------
217
+ name : str, optional
218
+ Name of the frequency sweep. The default is ``None``.
219
+ frequency_set : list, optional
220
+ List of frequency points. The default is ``None``.
221
+
222
+ Returns
223
+ -------
224
+
225
+ Examples
226
+ --------
227
+ >>> setup1 = edbapp.create_siwave_syz_setup("setup1")
228
+ >>> setup1.add_sweep(name="sw1", frequency_set=["linear count", "1MHz", "100MHz", 10])
229
+ """
230
+ name = generate_unique_name("sweep") if not name else name
231
+ if name in self.sweeps:
232
+ raise ValueError("Sweep {} already exists.".format(name))
233
+
234
+ sweep_data = SweepData(self._pedb, name=name, sim_setup=self)
235
+ if frequency_set is None:
236
+ sweep_type = "linear_scale"
237
+ start, stop, increment = "50MHz", "5GHz", "50MHz"
238
+ sweep_data.add(sweep_type, start, stop, increment)
237
239
  else:
238
- sweep_data_list = self.get_sim_setup_info.SweepDataList
239
- for i in list(sweep_data_list):
240
- temp[i.Name] = SweepData(self, None, i.Name, i)
241
- return temp
240
+ if not isinstance(frequency_set[0], list):
241
+ frequency_set = [frequency_set]
242
+ for fs in frequency_set:
243
+ sweep_data.add(*fs)
244
+
245
+ ss_info = self.sim_setup_info
246
+ ss_info.add_sweep_data(sweep_data)
247
+ self.sim_setup_info = ss_info
248
+ self._update_setup()
249
+ return sweep_data
242
250
 
243
251
  def _add_frequency_sweep(self, sweep_data):
244
252
  """Add a frequency sweep.
@@ -247,6 +255,7 @@ class SimulationSetup(object):
247
255
  ----------
248
256
  sweep_data: SweepData
249
257
  """
258
+ warnings.warn("Use new property :func:`add_sweep_data` instead.", DeprecationWarning)
250
259
  self._sweep_list[sweep_data.name] = sweep_data
251
260
  if self.setup_type in ["kRaptorX", "kHFSSPI"]:
252
261
  edb_setup_info = self._edb_setup_info
@@ -303,708 +312,5 @@ class SimulationSetup(object):
303
312
  ... ["linear scale", "0.1GHz", "10GHz", "0.1GHz"],
304
313
  ... ])
305
314
  """
306
- if name in self.frequency_sweeps:
307
- return False
308
-
309
- if not frequency_sweep:
310
- frequency_sweep = [["linear scale", "0.1GHz", "10GHz", "0.1GHz"]]
311
- elif not isinstance(frequency_sweep[0], list):
312
- frequency_sweep = [frequency_sweep]
313
-
314
- if not name:
315
- name = generate_unique_name("sweep")
316
- sweep = SweepData(self, frequency_sweep, name)
317
- self._add_frequency_sweep(sweep)
318
- self._update_setup()
319
- return sweep
320
-
321
-
322
- class HfssSimulationSetup(SimulationSetup):
323
- """Manages EDB methods for HFSS simulation setup."""
324
-
325
- def __init__(self, pedb, edb_object=None):
326
- super().__init__(pedb, edb_object)
327
- self._setup_type = "kHFSS"
328
- self._mesh_operations = {}
329
-
330
- def create(self, name=None):
331
- """Create an HFSS setup."""
332
- self._name = name
333
- self._create(name)
334
- return self
335
-
336
- @property
337
- def get_sim_setup_info(self):
338
- """Get simulation setup information."""
339
- return self._edb_object.GetSimSetupInfo()
340
-
341
- @property
342
- def solver_slider_type(self):
343
- """Solver slider type.
344
- Options are:
345
- 1 - ``kFast``.
346
- 2 - ``kMedium``.
347
- 3 - ``kAccurate``.
348
- 4 - ``kNumSliderTypes``.
349
-
350
- Returns
351
- -------
352
- str
353
- """
354
- return self.get_sim_setup_info.SimulationSettings.TSolveSliderType.ToString()
355
-
356
- @solver_slider_type.setter
357
- def solver_slider_type(self, value):
358
- """Set solver slider type."""
359
- solver_types = {
360
- "kFast": self.get_sim_setup_info.SimulationSettings.TSolveSliderType.k25DViaWirebond,
361
- "kMedium": self.get_sim_setup_info.SimulationSettings.TSolveSliderType.k25DViaRibbon,
362
- "kAccurate": self.get_sim_setup_info.SimulationSettings.TSolveSliderType.k25DViaMesh,
363
- "kNumSliderTypes": self.get_sim_setup_info.SimulationSettings.TSolveSliderType.k25DViaField,
364
- }
365
- self.get_sim_setup_info.SimulationSettings.TSolveSliderType = solver_types[value]
366
- self._update_setup()
367
-
368
- @property
369
- def is_auto_setup(self):
370
- """Flag indicating if automatic setup is enabled."""
371
- return self.get_sim_setup_info.SimulationSettings.IsAutoSetup
372
-
373
- @is_auto_setup.setter
374
- def is_auto_setup(self, value):
375
- self.get_sim_setup_info.SimulationSettings.IsAutoSetup = value
376
- self._update_setup()
377
-
378
- @property
379
- def hfss_solver_settings(self):
380
- """Manages EDB methods for HFSS solver settings.
381
-
382
- Returns
383
- -------
384
- :class:`pyedb.dotnet.edb_core.edb_data.hfss_simulation_setup_data.HfssSolverSettings`
385
-
386
- """
387
- return HfssSolverSettings(self)
388
-
389
- @property
390
- def adaptive_settings(self):
391
- """Adaptive Settings Class.
392
-
393
- Returns
394
- -------
395
- :class:`pyedb.dotnet.edb_core.edb_data.hfss_simulation_setup_data.AdaptiveSettings`
396
-
397
- """
398
- return AdaptiveSettings(self)
399
-
400
- @property
401
- def defeature_settings(self):
402
- """Defeature settings Class.
403
-
404
- Returns
405
- -------
406
- :class:`pyedb.dotnet.edb_core.edb_data.hfss_simulation_setup_data.DefeatureSettings`
407
-
408
- """
409
- return DefeatureSettings(self)
410
-
411
- @property
412
- def via_settings(self):
413
- """Via settings Class.
414
-
415
- Returns
416
- -------
417
- :class:`pyedb.dotnet.edb_core.edb_data.hfss_simulation_setup_data.ViaSettings`
418
-
419
- """
420
- return ViaSettings(self)
421
-
422
- @property
423
- def advanced_mesh_settings(self):
424
- """Advanced mesh settings Class.
425
-
426
- Returns
427
- -------
428
- :class:`pyedb.dotnet.edb_core.edb_data.hfss_simulation_setup_data.AdvancedMeshSettings`
429
-
430
- """
431
- return AdvancedMeshSettings(self)
432
-
433
- @property
434
- def curve_approx_settings(self):
435
- """Curve approximation settings Class.
436
-
437
- Returns
438
- -------
439
- :class:`pyedb.dotnet.edb_core.edb_data.hfss_simulation_setup_data.CurveApproxSettings`
440
-
441
- """
442
- return CurveApproxSettings(self)
443
-
444
- @property
445
- def dcr_settings(self):
446
- """Dcr settings Class.
447
-
448
- Returns
449
- -------
450
- :class:`pyedb.dotnet.edb_core.edb_data.hfss_simulation_setup_data.DcrSettings`
451
-
452
- """
453
- return DcrSettings(self)
454
-
455
- @property
456
- def hfss_port_settings(self):
457
- """HFSS port settings Class.
458
-
459
- Returns
460
- -------
461
- :class:`pyedb.dotnet.edb_core.edb_data.hfss_simulation_setup_data.HfssPortSettings`
462
-
463
- """
464
- return HfssPortSettings(self)
465
-
466
- @property
467
- def mesh_operations(self):
468
- """Mesh operations settings Class.
469
-
470
- Returns
471
- -------
472
- List of :class:`dotnet.edb_core.edb_data.hfss_simulation_setup_data.MeshOperation`
473
-
474
- """
475
- if self._mesh_operations:
476
- return self._mesh_operations
477
- settings = self.get_sim_setup_info.SimulationSettings.MeshOperations
478
- self._mesh_operations = {}
479
- for i in list(settings):
480
- if i.MeshOpType == i.TMeshOpType.kMeshSetupLength:
481
- self._mesh_operations[i.Name] = MeshOperationLength(self, i)
482
- elif i.MeshOpType == i.TMeshOpType.kMeshSetupSkinDepth:
483
- self._mesh_operations[i.Name] = MeshOperationSkinDepth(self, i)
484
- elif i.MeshOpType == i.TMeshOpType.kMeshSetupBase:
485
- self._mesh_operations[i.Name] = MeshOperationSkinDepth(self, i)
486
-
487
- return self._mesh_operations
488
-
489
- def add_length_mesh_operation(
490
- self,
491
- net_layer_list,
492
- name=None,
493
- max_elements=1000,
494
- max_length="1mm",
495
- restrict_elements=True,
496
- restrict_length=True,
497
- refine_inside=False,
498
- mesh_region=None,
499
- ):
500
- """Add a mesh operation to the setup.
501
-
502
- Parameters
503
- ----------
504
- net_layer_list : dict
505
- Dictionary containing nets and layers on which enable Mesh operation. Example ``{"A0_N": ["TOP", "PWR"]}``.
506
- name : str, optional
507
- Mesh operation name.
508
- max_elements : int, optional
509
- Maximum number of elements. Default is ``1000``.
510
- max_length : str, optional
511
- Maximum length of elements. Default is ``1mm``.
512
- restrict_elements : bool, optional
513
- Whether to restrict number of elements. Default is ``True``.
514
- restrict_length : bool, optional
515
- Whether to restrict length of elements. Default is ``True``.
516
- mesh_region : str, optional
517
- Mesh region name.
518
- refine_inside : bool, optional
519
- Whether to refine inside or not. Default is ``False``.
520
-
521
- Returns
522
- -------
523
- :class:`dotnet.edb_core.edb_data.hfss_simulation_setup_data.LengthMeshOperation`
524
- """
525
- if not name:
526
- name = generate_unique_name("skin")
527
- mesh_operation = MeshOperationLength(self, self._pedb.simsetupdata.LengthMeshOperation())
528
- mesh_operation.mesh_region = mesh_region
529
- mesh_operation.name = name
530
- mesh_operation.nets_layers_list = net_layer_list
531
- mesh_operation.refine_inside = refine_inside
532
- mesh_operation.max_elements = str(max_elements)
533
- mesh_operation.max_length = max_length
534
- mesh_operation.restrict_length = restrict_length
535
- mesh_operation.restrict_max_elements = restrict_elements
536
- self.mesh_operations[name] = mesh_operation
537
- return mesh_operation if self._update_setup() else False
538
-
539
- def add_skin_depth_mesh_operation(
540
- self,
541
- net_layer_list,
542
- name=None,
543
- max_elements=1000,
544
- skin_depth="1um",
545
- restrict_elements=True,
546
- surface_triangle_length="1mm",
547
- number_of_layers=2,
548
- refine_inside=False,
549
- mesh_region=None,
550
- ):
551
- """Add a mesh operation to the setup.
552
-
553
- Parameters
554
- ----------
555
- net_layer_list : dict
556
- Dictionary containing nets and layers on which enable Mesh operation. Example ``{"A0_N": ["TOP", "PWR"]}``.
557
- name : str, optional
558
- Mesh operation name.
559
- max_elements : int, optional
560
- Maximum number of elements. Default is ``1000``.
561
- skin_depth : str, optional
562
- Skin Depth. Default is ``1um``.
563
- restrict_elements : bool, optional
564
- Whether to restrict number of elements. Default is ``True``.
565
- surface_triangle_length : bool, optional
566
- Surface Triangle length. Default is ``1mm``.
567
- number_of_layers : int, str, optional
568
- Number of layers. Default is ``2``.
569
- mesh_region : str, optional
570
- Mesh region name.
571
- refine_inside : bool, optional
572
- Whether to refine inside or not. Default is ``False``.
573
-
574
- Returns
575
- -------
576
- :class:`dotnet.edb_core.edb_data.hfss_simulation_setup_data.LengthMeshOperation`
577
- """
578
- if not name:
579
- name = generate_unique_name("length")
580
- mesh_operation = MeshOperationSkinDepth(self, self._pedb.simsetupdata.SkinDepthMeshOperation())
581
- mesh_operation.mesh_region = mesh_region
582
- mesh_operation.name = name
583
- mesh_operation.nets_layers_list = net_layer_list
584
- mesh_operation.refine_inside = refine_inside
585
- mesh_operation.max_elements = max_elements
586
- mesh_operation.skin_depth = skin_depth
587
- mesh_operation.number_of_layer_elements = number_of_layers
588
- mesh_operation.surface_triangle_length = surface_triangle_length
589
- mesh_operation.restrict_max_elements = restrict_elements
590
- self.mesh_operations[name] = mesh_operation
591
- return mesh_operation if self._update_setup() else False
592
-
593
- def add_frequency_sweep(self, name=None, frequency_sweep=None):
594
- """Add frequency sweep.
595
-
596
- Parameters
597
- ----------
598
- name : str, optional
599
- Name of the frequency sweep.
600
- frequency_sweep : list, optional
601
- List of frequency points.
602
-
603
- Returns
604
- -------
605
- :class:`pyedb.dotnet.edb_core.edb_data.simulation_setup.EdbFrequencySweep`
606
-
607
- Examples
608
- --------
609
- >>> setup1 = edbapp.create_hfss_setup("setup1")
610
- >>> setup1.add_frequency_sweep(frequency_sweep=[
611
- ... ["linear count", "0", "1kHz", 1],
612
- ... ["log scale", "1kHz", "0.1GHz", 10],
613
- ... ["linear scale", "0.1GHz", "10GHz", "0.1GHz"],
614
- ... ])
615
- """
616
- if name in self.frequency_sweeps:
617
- return False
618
- if not name:
619
- name = generate_unique_name("sweep")
620
- return SweepData(self, frequency_sweep, name)
621
-
622
- def set_solution_single_frequency(self, frequency="5GHz", max_num_passes=10, max_delta_s=0.02):
623
- """Set single-frequency solution.
624
-
625
- Parameters
626
- ----------
627
- frequency : str, float, optional
628
- Adaptive frequency. The default is ``5GHz``.
629
- max_num_passes : int, optional
630
- Maximum number of passes. The default is ``10``.
631
- max_delta_s : float, optional
632
- Maximum delta S. The default is ``0.02``.
633
-
634
- Returns
635
- -------
636
- bool
637
-
638
- """
639
- self.adaptive_settings.adapt_type = "kSingle"
640
- self.adaptive_settings.adaptive_settings.AdaptiveFrequencyDataList.Clear()
641
- return self.adaptive_settings.add_adaptive_frequency_data(frequency, max_num_passes, max_delta_s)
642
-
643
- def set_solution_multi_frequencies(self, frequencies=("5GHz", "10GHz"), max_num_passes=10, max_delta_s="0.02"):
644
- """Set multi-frequency solution.
645
-
646
- Parameters
647
- ----------
648
- frequencies : list, tuple, optional
649
- List or tuple of adaptive frequencies. The default is ``5GHz``.
650
- max_num_passes : int, optional
651
- Maximum number of passes. Default is ``10``.
652
- max_delta_s : float, optional
653
- Maximum delta S. The default is ``0.02``.
654
-
655
- Returns
656
- -------
657
- bool
658
-
659
- """
660
- self.adaptive_settings.adapt_type = "kMultiFrequencies"
661
- self.adaptive_settings.adaptive_settings.AdaptiveFrequencyDataList.Clear()
662
- for i in frequencies:
663
- if not self.adaptive_settings.add_adaptive_frequency_data(i, max_num_passes, max_delta_s):
664
- return False
665
- return True
666
-
667
- def set_solution_broadband(
668
- self, low_frequency="5GHz", high_frequency="10GHz", max_num_passes=10, max_delta_s="0.02"
669
- ):
670
- """Set broadband solution.
671
-
672
- Parameters
673
- ----------
674
- low_frequency : str, float, optional
675
- Low frequency. The default is ``5GHz``.
676
- high_frequency : str, float, optional
677
- High frequency. The default is ``10GHz``.
678
- max_num_passes : int, optional
679
- Maximum number of passes. The default is ``10``.
680
- max_delta_s : float, optional
681
- Maximum Delta S. Default is ``0.02``.
682
-
683
- Returns
684
- -------
685
- bool
686
- """
687
- self.adaptive_settings.adapt_type = "kBroadband"
688
- self.adaptive_settings.adaptive_settings.AdaptiveFrequencyDataList.Clear()
689
- if not self.adaptive_settings.add_broadband_adaptive_frequency_data(
690
- low_frequency, high_frequency, max_num_passes, max_delta_s
691
- ): # pragma no cover
692
- return False
693
- return True
694
-
695
-
696
- class SiwaveSYZSimulationSetup(SimulationSetup):
697
- """Manages EDB methods for SIwave simulation setup.
698
-
699
- Parameters
700
- ----------
701
- pedb : :class:`pyedb.dotnet.edb.Edb`
702
- Inherited AEDT object.
703
- edb_setup : :class:`Ansys.Ansoft.Edb.Utility.SIWaveSimulationSetup`
704
- Edb object.
705
- """
706
-
707
- def __init__(self, pedb, edb_setup=None):
708
- super().__init__(pedb, edb_setup)
709
- self._edb = self._pedb
710
- self._setup_type = "kSIwave"
711
- self._sim_setup_info = None
712
-
713
- def create(self, name=None):
714
- """Create a SIwave SYZ setup.
715
-
716
- Returns
717
- -------
718
- :class:`SiwaveDCSimulationSetup`
719
- """
720
- self._name = name
721
- self._create(name)
722
- self.si_slider_position = 1
723
-
724
- return self
725
-
726
- def get_configurations(self):
727
- """Get SIwave SYZ simulation settings.
728
-
729
- Returns
730
- -------
731
- dict
732
- Dictionary of SIwave SYZ simulation settings.
733
- """
734
- return {
735
- "pi_slider_position": self.pi_slider_position,
736
- "si_slider_position": self.si_slider_position,
737
- "use_custom_settings": self.use_si_settings,
738
- "use_si_settings": self.use_si_settings,
739
- "advanced_settings": self.advanced_settings.get_configurations(),
740
- }
741
-
742
- @property
743
- def advanced_settings(self):
744
- """SIwave advanced settings."""
745
- return AdvancedSettings(self)
746
-
747
- @property
748
- def get_sim_setup_info(self):
749
- """Get simulation information from the setup."""
750
- if self._sim_setup_info:
751
- return self._sim_setup_info
752
-
753
- edb_setup = self._edb_object
754
- edb_sim_setup_info = self._pedb.simsetupdata.SimSetupInfo[self._setup_type_mapping[self._setup_type]]()
755
- edb_sim_setup_info.Name = edb_setup.GetName()
756
-
757
- string = edb_setup.ToString().replace("\t", "").split("\r\n")
758
-
759
- if is_linux:
760
- string = string[0].split("\n")
761
- keys = [i.split("=")[0] for i in string if len(i.split("=")) == 2 and "SourceTermsToGround" not in i]
762
- values = [i.split("=")[1] for i in string if len(i.split("=")) == 2 and "SourceTermsToGround" not in i]
763
- for val in string:
764
- if "SourceTermsToGround()" in val:
765
- break
766
- elif "SourceTermsToGround" in val:
767
- sources = {}
768
- val = val.replace("SourceTermsToGround(", "").replace(")", "").split(",")
769
- for v in val:
770
- source = v.split("=")
771
- sources[source[0]] = int(source[1].replace("'", ""))
772
- edb_sim_setup_info.SimulationSettings.DCIRSettings.SourceTermsToGround = convert_pydict_to_netdict(
773
- sources
774
- )
775
- break
776
- for k in keys:
777
- value = _parse_value(values[keys.index(k)])
778
- setter = None
779
- if k in dir(edb_sim_setup_info.SimulationSettings):
780
- setter = edb_sim_setup_info.SimulationSettings
781
- elif k in dir(edb_sim_setup_info.SimulationSettings.AdvancedSettings):
782
- setter = edb_sim_setup_info.SimulationSettings.AdvancedSettings
783
-
784
- elif k in dir(edb_sim_setup_info.SimulationSettings.DCAdvancedSettings):
785
- setter = edb_sim_setup_info.SimulationSettings.DCAdvancedSettings
786
- elif "DCIRSettings" in dir(edb_sim_setup_info.SimulationSettings) and k in dir(
787
- edb_sim_setup_info.SimulationSettings.DCIRSettings
788
- ):
789
- setter = edb_sim_setup_info.SimulationSettings.DCIRSettings
790
- elif k in dir(edb_sim_setup_info.SimulationSettings.DCSettings):
791
- setter = edb_sim_setup_info.SimulationSettings.DCSettings
792
- elif k in dir(edb_sim_setup_info.SimulationSettings.AdvancedSettings):
793
- setter = edb_sim_setup_info.SimulationSettings.AdvancedSettings
794
- if setter:
795
- try:
796
- setter.__setattr__(k, value)
797
- except TypeError:
798
- try:
799
- setter.__setattr__(k, str(value))
800
- except:
801
- pass
802
-
803
- return edb_sim_setup_info
804
-
805
- def set_pi_slider(self, value):
806
- """Set SIwave PI simulation accuracy level.
807
- Options are:
808
- - ``0``: Optimal speed
809
- - ``1``: Balanced
810
- - ``2``: Optimal accuracy
811
-
812
- .. deprecated:: 0.7.5
813
- Use :property:`pi_slider_position` property instead.
814
-
815
- """
816
- warnings.warn("`set_pi_slider` is deprecated. Use `pi_slider_position` property instead.", DeprecationWarning)
817
- self.pi_slider_position = value
818
-
819
- def set_si_slider(self, value):
820
- """Set SIwave SI simulation accuracy level.
821
-
822
- Options are:
823
- - ``0``: Optimal speed;
824
- - ``1``: Balanced;
825
- - ``2``: Optimal accuracy```.
826
- """
827
- self.use_si_settings = True
828
- self.use_custom_settings = False
829
- self.si_slider_position = value
830
- self.advanced_settings.set_si_slider(value)
831
-
832
- @property
833
- def pi_slider_position(self):
834
- """PI solider position. Values are from ``1`` to ``3``."""
835
- return self.get_sim_setup_info.SimulationSettings.PISliderPos
836
-
837
- @pi_slider_position.setter
838
- def pi_slider_position(self, value):
839
- edb_setup_info = self.get_sim_setup_info
840
- edb_setup_info.SimulationSettings.PISliderPos = value
841
- self._edb_object = self._set_edb_setup_info(edb_setup_info)
842
- self._update_setup()
843
-
844
- self.use_si_settings = False
845
- self.use_custom_settings = False
846
- self.advanced_settings.set_pi_slider(value)
847
-
848
- @property
849
- def si_slider_position(self):
850
- """SI slider position. Values are from ``1`` to ``3``."""
851
- return self.get_sim_setup_info.SimulationSettings.SISliderPos
852
-
853
- @si_slider_position.setter
854
- def si_slider_position(self, value):
855
- edb_setup_info = self.get_sim_setup_info
856
- edb_setup_info.SimulationSettings.SISliderPos = value
857
- self._edb_object = self._set_edb_setup_info(edb_setup_info)
858
- self._update_setup()
859
-
860
- self.use_si_settings = True
861
- self.use_custom_settings = False
862
- self.advanced_settings.set_si_slider(value)
863
-
864
- @property
865
- def use_custom_settings(self):
866
- """Custom settings to use.
867
-
868
- Returns
869
- -------
870
- bool
871
- """
872
- return self.get_sim_setup_info.SimulationSettings.UseCustomSettings
873
-
874
- @use_custom_settings.setter
875
- def use_custom_settings(self, value):
876
- edb_setup_info = self.get_sim_setup_info
877
- edb_setup_info.SimulationSettings.UseCustomSettings = value
878
- self._edb_object = self._set_edb_setup_info(edb_setup_info)
879
- self._update_setup()
880
-
881
- @property
882
- def use_si_settings(self):
883
- """Whether to use SI Settings.
884
-
885
- Returns
886
- -------
887
- bool
888
- """
889
- return self.get_sim_setup_info.SimulationSettings.UseSISettings
890
-
891
- @use_si_settings.setter
892
- def use_si_settings(self, value):
893
- edb_setup_info = self.get_sim_setup_info
894
- edb_setup_info.SimulationSettings.UseSISettings = value
895
- self._edb_object = self._set_edb_setup_info(edb_setup_info)
896
- self._update_setup()
897
-
898
-
899
- class SiwaveDCSimulationSetup(SiwaveSYZSimulationSetup):
900
- """Manages EDB methods for SIwave DC simulation setup.
901
-
902
- Parameters
903
- ----------
904
- pedb : :class:`pyedb.dotnet.edb.Edb`
905
- Inherited AEDT object.
906
- edb_setup : Ansys.Ansoft.Edb.Utility.SIWDCIRSimulationSettings
907
- EDB object. The default is ``None``.
908
- """
909
-
910
- def __init__(self, pedb, edb_object=None):
911
- super().__init__(pedb, edb_object)
912
- self._setup_type = "kSIwaveDCIR"
913
- self._edb = pedb
914
- self._mesh_operations = {}
915
-
916
- def create(self, name=None):
917
- """Create a SIwave DCIR setup.
918
-
919
- Returns
920
- -------
921
- :class:`SiwaveDCSimulationSetup`
922
- """
923
- self._name = name
924
- self._create(name)
925
- self.set_dc_slider(1)
926
- return self
927
-
928
- @property
929
- def dc_ir_settings(self):
930
- """DC IR settings."""
931
- return SiwaveDCIRSettings(self)
932
-
933
- def get_configurations(self):
934
- """Get SIwave DC simulation settings.
935
-
936
- Returns
937
- -------
938
- dict
939
- Dictionary of SIwave DC simulation settings.
940
- """
941
- return {
942
- "dc_settings": self.dc_settings.get_configurations(),
943
- "dc_advanced_settings": self.dc_advanced_settings.get_configurations(),
944
- }
945
-
946
- def set_dc_slider(self, value):
947
- """Set DC simulation accuracy level.
948
-
949
- Options are:
950
-
951
- - ``0``: Optimal speed
952
- - ``1``: Balanced
953
- - ``2``: Optimal accuracy
954
- """
955
- self.use_custom_settings = False
956
- self.dc_settings.dc_slider_position = value
957
- self.dc_advanced_settings.set_dc_slider(value)
958
-
959
- @property
960
- def dc_settings(self):
961
- """SIwave DC setting."""
962
- return DCSettings(self)
963
-
964
- @property
965
- def dc_advanced_settings(self):
966
- """Siwave DC advanced settings.
967
-
968
- Returns
969
- -------
970
- :class:`pyedb.dotnet.edb_core.edb_data.siwave_simulation_setup_data.SiwaveDCAdvancedSettings`
971
- """
972
- return DCAdvancedSettings(self)
973
-
974
- @property
975
- def source_terms_to_ground(self):
976
- """Dictionary of grounded terminals.
977
-
978
- Returns
979
- -------
980
- Dictionary
981
- {str, int}, keys is source name, value int 0 unspecified, 1 negative node, 2 positive one.
982
-
983
- """
984
- return convert_netdict_to_pydict(self.get_sim_setup_info.SimulationSettings.DCIRSettings.SourceTermsToGround)
985
-
986
- def add_source_terminal_to_ground(self, source_name, terminal=0):
987
- """Add a source terminal to ground.
988
-
989
- Parameters
990
- ----------
991
- source_name : str,
992
- Source name.
993
- terminal : int, optional
994
- Terminal to assign. Options are:
995
-
996
- - 0=Unspecified
997
- - 1=Negative node
998
- - 2=Positive none
999
-
1000
- Returns
1001
- -------
1002
- bool
1003
-
1004
- """
1005
- terminals = self.source_terms_to_ground
1006
- terminals[source_name] = terminal
1007
- self.get_sim_setup_info.SimulationSettings.DCIRSettings.SourceTermsToGround = convert_pydict_to_netdict(
1008
- terminals
1009
- )
1010
- return self._update_setup()
315
+ warnings.warn("`create_component_from_pins` is deprecated. Use `add_sweep` method instead.", DeprecationWarning)
316
+ return self.add_sweep(name, frequency_sweep)