Skip to content

Enhancement/deembed wave port terminal #838

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Feb 10, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 35 additions & 2 deletions _unittest/test_20_HFSS.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,15 @@ def test_05_create_wave_port_from_sheets(self):
assert port.name in [i.name for i in self.aedtapp.boundaries]
assert port.props["RenormalizeAllTerminals"] is False

udp = self.aedtapp.modeler.Position(100, 0, 0)
o6 = self.aedtapp.modeler.create_circle(self.aedtapp.PLANE.YZ, udp, 10, name="sheet1a")
port = self.aedtapp.create_wave_port_from_sheet(
o6, 0, self.aedtapp.AxisDir.XNeg, 40, 2, "sheet1a_Port", renorm=False, terminal_references=["outer"]
)
assert port.name == "sheet1a_Port"
assert port.name in [i.name for i in self.aedtapp.boundaries]
assert port.props["DoDeembed"] is False

self.aedtapp.solution_type = "Modal"
udp = self.aedtapp.modeler.Position(200, 0, 0)
o6 = self.aedtapp.modeler.create_circle(self.aedtapp.PLANE.YZ, udp, 10, name="sheet2")
Expand Down Expand Up @@ -289,7 +298,7 @@ def test_06g_sweep_clear_subrange(self):
assert sweep.props["SaveSingleField"] == False

def test_06z_validate_setup(self):
list, ok = self.aedtapp.validate_full_design(ports=7)
list, ok = self.aedtapp.validate_full_design(ports=8)
assert ok

def test_07_set_power(self):
Expand Down Expand Up @@ -354,6 +363,14 @@ def test_09_create_waveport_on_objects(self):
"BoxWG1", "BoxWG2", self.aedtapp.AxisDir.XPos, 25, 2, "Wave1", True, 5
)
assert port2.name != "Wave1" and "Wave1" in port2.name
self.aedtapp.solution_type = "Terminal"
assert self.aedtapp.create_wave_port_between_objects(
"BoxWG1", "BoxWG2", self.aedtapp.AxisDir.XPos, 25, 2, "Wave3", True
)
assert self.aedtapp.create_wave_port_between_objects(
"BoxWG1", "BoxWG2", self.aedtapp.AxisDir.XPos, 25, 2, "Wave4", True, 5
)
self.aedtapp.solution_type = "Modal"

def test_09a_create_waveport_on_true_surface_objects(self):
cs = self.aedtapp.PLANE.XY
Expand Down Expand Up @@ -386,6 +403,9 @@ def test_10_create_lumped_on_objects(self):
assert port.name == "Lump1xx"
port.name = "Lump1"
assert port.update()
assert self.aedtapp.create_lumped_port_between_objects(
"BoxLumped1", "BoxLumped2", self.aedtapp.AxisDir.XNeg, 50, "Lump2", True, True
)

def test_11_create_circuit_on_objects(self):
box1 = self.aedtapp.modeler.create_box([0, 0, 80], [10, 10, 5], "BoxCircuit1", "Copper")
Expand Down Expand Up @@ -478,6 +498,10 @@ def test_19_create_lumped_on_sheet(self):
rect.name, self.aedtapp.AxisDir.XNeg, 50, "Lump_sheet", True, False
)
assert port.name + ":1" in self.aedtapp.excitations
port2 = self.aedtapp.create_lumped_port_to_sheet(
rect.name, self.aedtapp.AxisDir.XNeg, 50, "Lump_sheet2", True, True
)
assert port2.name + ":1" in self.aedtapp.excitations

def test_20_create_voltage_on_sheet(self):
rect = self.aedtapp.modeler.create_rectangle(
Expand Down Expand Up @@ -560,9 +584,14 @@ def test_31_create_microstrip_port(self):
sub = self.aedtapp.modeler.create_box([0, 5, -2], [20, 100, 2], name="SUB1", matname="FR4_epoxy")
gnd = self.aedtapp.modeler.create_box([0, 5, -2.2], [20, 100, 0.2], name="GND1", matname="FR4_epoxy")
port = self.aedtapp.create_wave_port_microstrip_between_objects(gnd.name, ms.name, portname="MS1", axisdir=1)

assert port.name == "MS1"
assert port.update()
self.aedtapp.solution_type = "Terminal"
assert self.aedtapp.create_wave_port_microstrip_between_objects(gnd.name, ms.name, portname="MS2", axisdir=1)
assert self.aedtapp.create_wave_port_microstrip_between_objects(
gnd.name, ms.name, portname="MS3", axisdir=1, deembed_dist=1
)
self.aedtapp.solution_type = "Modal"

def test_32_get_property_value(self):
rect = self.aedtapp.modeler.create_rectangle(
Expand Down Expand Up @@ -712,6 +741,10 @@ def test_45_terminal_port(self):
sheet.name, self.aedtapp.AxisDir.XNeg, 50, "Lump_sheet", True, False, reference_object_list=[box1]
)
assert port2.name + "_T1" in self.aedtapp.excitations
port3 = self.aedtapp.create_lumped_port_between_objects(
box1, box2.name, self.aedtapp.AxisDir.XNeg, 50, "Lump3", True, True
)
assert port3.name + "_T1" in self.aedtapp.excitations

box1 = self.aedtapp.modeler.create_box([-40, -40, -20], [80, 80, 10], name="gnd", matname="copper")
box2 = self.aedtapp.modeler.create_box([-40, -40, 10], [80, 80, 10], name="sig", matname="copper")
Expand Down
56 changes: 44 additions & 12 deletions pyaedt/hfss.py
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ def _create_lumped_driven(self, objectname, int_line_start, int_line_stop, imped
return self._create_boundary(portname, props, "LumpedPort")

@aedt_exception_handler
def _create_port_terminal(self, objectname, int_line_stop, portname, renorm=True, iswaveport=False):
def _create_port_terminal(self, objectname, int_line_stop, portname, renorm=True, deembed=None, iswaveport=False):
ref_conductors = self.modeler.convert_to_selections(int_line_stop, True)
props = OrderedDict({})
props["Faces"] = int(objectname)
Expand Down Expand Up @@ -343,9 +343,14 @@ def _create_port_terminal(self, objectname, int_line_stop, portname, renorm=True
if iswaveport:
props["NumModes"] = 1
props["UseLineModeAlignment"] = 1
props["DoDeembed"] = True
if iswaveport:
props["DeembedDist"] = "0mm"
if deembed is None:
props["DoDeembed"] = False
if iswaveport:
props["DeembedDist"] = self.modeler._arg_with_dim(0)
else:
props["DoDeembed"] = True
if iswaveport:
props["DeembedDist"] = self.modeler._arg_with_dim(deembed)
props["RenormalizeAllTerminals"] = renorm
props["ShowReporterFilter"] = False
props["UseAnalyticAlignment"] = False
Expand Down Expand Up @@ -410,8 +415,7 @@ def _create_waveport_driven(

if deemb_distance != 0:
props["DoDeembed"] = True
props["DeembedDist"] = str(deemb_distance) + self.modeler.model_units

props["DeembedDist"] = self.modeler._arg_with_dim(deemb_distance)
else:
props["DoDeembed"] = False
props["RenormalizeAllTerminals"] = renorm
Expand Down Expand Up @@ -1596,7 +1600,13 @@ def create_lumped_port_between_objects(
return self._create_lumped_driven(sheet_name, point0, point1, impedance, portname, renorm, deemb)
else:
faces = self.modeler.get_object_faces(sheet_name)
return self._create_port_terminal(faces[0], endobject, portname, renorm=renorm, iswaveport=False)
if deemb:
deembed = 0
else:
deembed = None
return self._create_port_terminal(
faces[0], endobject, portname, renorm=renorm, deembed=deembed, iswaveport=False
)
return False # pragma: no cover

@aedt_exception_handler
Expand Down Expand Up @@ -2037,7 +2047,13 @@ def create_wave_port_between_objects(
)
else:
faces = self.modeler.get_object_faces(sheet_name)
return self._create_port_terminal(faces[0], endobject, portname, renorm=renorm, iswaveport=True)
if deembed_dist == 0:
deembed = None
else:
deembed = deembed_dist
return self._create_port_terminal(
faces[0], endobject, portname, renorm=renorm, deembed=deembed, iswaveport=True
)
return False # pragma: no cover

@aedt_exception_handler
Expand Down Expand Up @@ -2462,7 +2478,13 @@ def create_wave_port_microstrip_between_objects(
)
else:
faces = self.modeler.get_object_faces(sheet_name)
return self._create_port_terminal(faces[0], endobject, portname, renorm=renorm, iswaveport=True)
if deembed_dist == 0:
deembed = None
else:
deembed = deembed_dist
return self._create_port_terminal(
faces[0], endobject, portname, renorm=renorm, deembed=deembed, iswaveport=True
)
return False

@aedt_exception_handler
Expand Down Expand Up @@ -3041,7 +3063,13 @@ def create_wave_port_from_sheet(
elif portname in self.excitations:
portname = generate_unique_name(portname)
if terminal_references:
return self._create_port_terminal(faces, terminal_references, portname, renorm=renorm, iswaveport=True)
if deemb == 0:
deembed = None
else:
deembed = deemb
return self._create_port_terminal(
faces, terminal_references, portname, renorm=renorm, deembed=deembed, iswaveport=True
)
else:
self.logger.error("Reference Conductors are missed.")
return False
Expand Down Expand Up @@ -3115,11 +3143,15 @@ def create_lumped_port_to_sheet(
faces = sheet_name
else:
faces = self.modeler.get_object_faces(sheet_name)[0]
if not faces:
if not faces: # pragma: no cover
self.logger.error("Wrong Input object. it has to be a face id or a sheet.")
return False
if deemb:
deembed = 0
else:
deembed = None
port = self._create_port_terminal(
faces, reference_object_list, portname, renorm=renorm, iswaveport=False
faces, reference_object_list, portname, renorm=renorm, deembed=deembed, iswaveport=False
)

return port
Expand Down