Skip to content

Commit

Permalink
Solder balls height control with simconfig (#3905)
Browse files Browse the repository at this point in the history
* edb intersection bug fix

* custom solder balls hieght support with simulation configuration class

* arbitrary size and shape support added

* bug fix

* codecov fix

---------

Co-authored-by: Samuel Lopez <[email protected]>
  • Loading branch information
svandenb-dev and Samuelopez-ansys authored Nov 24, 2023
1 parent 2ba12b5 commit 09db4b3
Show file tree
Hide file tree
Showing 6 changed files with 424 additions and 29 deletions.
148 changes: 148 additions & 0 deletions _unittest/example_models/TEDB/ANSYS-HSD_V1.aedb/simsetup.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
{
"filename": null,
"open_edb_after_build": true,
"dc_settings": {
"dc_compute_inductance": false,
"dc_contact_radius": "100um",
"dc_slide_position": 1,
"dc_use_dc_custom_settings": false,
"dc_plot_jv": true,
"dc_min_plane_area_to_mesh": "8mil2",
"dc_min_void_area_to_mesh": "0.734mil2",
"dc_error_energy": 0.02,
"dc_max_init_mesh_edge_length": "5.0mm",
"dc_max_num_pass": 5,
"dc_min_num_pass": 1,
"dc_mesh_bondwires": true,
"dc_num_bondwire_sides": 8,
"dc_mesh_vias": true,
"dc_num_via_sides": 8,
"dc_percent_local_refinement": 0.2,
"dc_perform_adaptive_refinement": true,
"dc_refine_bondwires": true,
"dc_refine_vias": true,
"dc_report_config_file": "",
"dc_report_show_Active_devices": true,
"dc_export_thermal_data": true,
"dc_full_report_path": "",
"dc_icepak_temp_file": "",
"dc_import_thermal_data": false,
"dc_per_pin_res_path": "",
"dc_per_pin_use_pin_format": true,
"dc_use_loop_res_for_per_pin": true,
"dc_via_report_path": "",
"dc_source_terms_to_ground": {}
},
"ac_settings": {
"sweep_interpolating": true,
"use_q3d_for_dc": false,
"relative_error": 0.005,
"use_error_z0": false,
"percentage_error_z0": 1,
"enforce_causality": true,
"enforce_passivity": false,
"passivity_tolerance": 0.0001,
"sweep_name": "Sweep1",
"radiation_box": 2,
"start_freq": "0.0GHz",
"stop_freq": "20GHz",
"sweep_type": 0,
"step_freq": "0GHz",
"decade_count": 100,
"mesh_freq": "33GHz",
"max_num_passes": 30,
"max_mag_delta_s": 0.03,
"min_num_passes": 1,
"basis_order": 0,
"do_lambda_refinement": true,
"arc_angle": "10deg",
"start_azimuth": 5,
"max_arc_points": 24,
"use_arc_to_chord_error": true,
"arc_to_chord_error": "1um",
"defeature_abs_length": "1um",
"defeature_layout": true,
"minimum_void_surface": 0,
"max_suf_dev": 0.001,
"process_padstack_definitions": false,
"return_current_distribution": true,
"ignore_non_functional_pads": true,
"include_inter_plane_coupling": true,
"xtalk_threshold": -50,
"min_void_area": "0.01mm2",
"min_pad_area_to_mesh": "0.01mm2",
"snap_length_threshold": "2.5um",
"min_plane_area_to_mesh": "4mil2",
"mesh_sizefactor": 0.0
},
"batch_solve_settings": {
"signal_nets": [
"PCIe_Gen4_RX0_N",
"PCIe_Gen4_RX0_P",
"PCIe_Gen4_RX1_N",
"PCIe_Gen4_RX1_P",
"PCIe_Gen4_RX2_N",
"PCIe_Gen4_RX2_P",
"PCIe_Gen4_RX3_N",
"PCIe_Gen4_RX3_P",
"PCIe_Gen4_TX0_N",
"PCIe_Gen4_TX0_CAP_N",
"PCIe_Gen4_TX0_p",
"PCIe_Gen4_TX0_CAP_P",
"PCIe_Gen4_TX1_N",
"PCIe_Gen4_TX1_CAP_N",
"PCIe_Gen4_TX1_P",
"PCIe_Gen4_TX1_CAP_P",
"PCIe_Gen4_TX2_N",
"PCIe_Gen4_TX2_CAP_N",
"PCIe_Gen4_TX2_P",
"PCIe_Gen4_TX2_CAP_P",
"PCIe_Gen4_TX3_N",
"PCIe_Gen4_TX3_CAP_N",
"PCIe_Gen4_TX3_P",
"PCIe_Gen4_TX3_CAP_P"
],
"power_nets": [
"1V0",
"2V5",
"5V",
"GND"
],
"components": [
"X1",
"U1"
],
"cutout_subdesign_type": 1,
"cutout_subdesign_expansion": 0.001,
"cutout_subdesign_round_corner": true,
"use_default_cutout": false,
"generate_excitations": true,
"add_frequency_sweep": true,
"include_only_selected_nets": false,
"generate_solder_balls": true,
"coax_solder_ball_diameter": [],
"use_default_coax_port_radial_extension": true,
"trim_reference_size": false,
"output_aedb": null,
"signal_layers_properties": {},
"coplanar_instances": [],
"signal_layer_etching_instances": [],
"etching_factor_instances": [],
"use_dielectric_extent_multiple": true,
"dielectric_extent": 0.001,
"use_airbox_horizontal_multiple": true,
"airbox_horizontal_extent": 0.1,
"use_airbox_negative_vertical_extent_multiple": true,
"airbox_negative_vertical_extent": 0.1,
"use_airbox_positive_vertical_extent_multiple": true,
"airbox_positive_vertical_extent": 0.1,
"honor_user_dielectric": false,
"truncate_airbox_at_ground": false,
"use_radiation_boundary": true,
"do_cutout_subdesign": true,
"do_pin_group": true,
"sources": []
},
"setup_name": "Pyaedt_setup",
"solver_type": 6
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
{
"filename": null,
"open_edb_after_build": true,
"dc_settings": {
"dc_compute_inductance": false,
"dc_contact_radius": "100um",
"dc_slide_position": 1,
"dc_use_dc_custom_settings": false,
"dc_plot_jv": true,
"dc_min_plane_area_to_mesh": "8mil2",
"dc_min_void_area_to_mesh": "0.734mil2",
"dc_error_energy": 0.02,
"dc_max_init_mesh_edge_length": "5.0mm",
"dc_max_num_pass": 5,
"dc_min_num_pass": 1,
"dc_mesh_bondwires": true,
"dc_num_bondwire_sides": 8,
"dc_mesh_vias": true,
"dc_num_via_sides": 8,
"dc_percent_local_refinement": 0.2,
"dc_perform_adaptive_refinement": true,
"dc_refine_bondwires": true,
"dc_refine_vias": true,
"dc_report_config_file": "",
"dc_report_show_Active_devices": true,
"dc_export_thermal_data": true,
"dc_full_report_path": "",
"dc_icepak_temp_file": "",
"dc_import_thermal_data": false,
"dc_per_pin_res_path": "",
"dc_per_pin_use_pin_format": true,
"dc_use_loop_res_for_per_pin": true,
"dc_via_report_path": "",
"dc_source_terms_to_ground": {}
},
"ac_settings": {
"sweep_interpolating": true,
"use_q3d_for_dc": false,
"relative_error": 0.005,
"use_error_z0": false,
"percentage_error_z0": 1,
"enforce_causality": true,
"enforce_passivity": false,
"passivity_tolerance": 0.0001,
"sweep_name": "Sweep1",
"radiation_box": 2,
"start_freq": "0.0GHz",
"stop_freq": "20GHz",
"sweep_type": 0,
"step_freq": "0GHz",
"decade_count": 100,
"mesh_freq": "33GHz",
"max_num_passes": 30,
"max_mag_delta_s": 0.03,
"min_num_passes": 1,
"basis_order": 0,
"do_lambda_refinement": true,
"arc_angle": "10deg",
"start_azimuth": 5,
"max_arc_points": 24,
"use_arc_to_chord_error": true,
"arc_to_chord_error": "1um",
"defeature_abs_length": "1um",
"defeature_layout": true,
"minimum_void_surface": 0,
"max_suf_dev": 0.001,
"process_padstack_definitions": false,
"return_current_distribution": true,
"ignore_non_functional_pads": true,
"include_inter_plane_coupling": true,
"xtalk_threshold": -50,
"min_void_area": "0.01mm2",
"min_pad_area_to_mesh": "0.01mm2",
"snap_length_threshold": "2.5um",
"min_plane_area_to_mesh": "4mil2",
"mesh_sizefactor": 0.0
},
"batch_solve_settings": {
"signal_nets": [
"PCIe_Gen4_RX0_N",
"PCIe_Gen4_RX0_P",
"PCIe_Gen4_RX1_N",
"PCIe_Gen4_RX1_P",
"PCIe_Gen4_RX2_N",
"PCIe_Gen4_RX2_P",
"PCIe_Gen4_RX3_N",
"PCIe_Gen4_RX3_P",
"PCIe_Gen4_TX0_N",
"PCIe_Gen4_TX0_CAP_N",
"PCIe_Gen4_TX0_p",
"PCIe_Gen4_TX0_CAP_P",
"PCIe_Gen4_TX1_N",
"PCIe_Gen4_TX1_CAP_N",
"PCIe_Gen4_TX1_P",
"PCIe_Gen4_TX1_CAP_P",
"PCIe_Gen4_TX2_N",
"PCIe_Gen4_TX2_CAP_N",
"PCIe_Gen4_TX2_P",
"PCIe_Gen4_TX2_CAP_P",
"PCIe_Gen4_TX3_N",
"PCIe_Gen4_TX3_CAP_N",
"PCIe_Gen4_TX3_P",
"PCIe_Gen4_TX3_CAP_P"
],
"power_nets": [
"1V0",
"2V5",
"5V",
"GND"
],
"components": [
{
"refdes": "X1",
"solder_balls_height": 0.00025,
"solder_balls_size": 0.0001,
"solder_balls_mid_size": 0.00015
},
{
"refdes": "U1",
"solder_balls_height": 0.00035
}
],
"cutout_subdesign_type": 1,
"cutout_subdesign_expansion": 0.001,
"cutout_subdesign_round_corner": true,
"use_default_cutout": false,
"generate_excitations": true,
"add_frequency_sweep": true,
"include_only_selected_nets": false,
"generate_solder_balls": true,
"coax_solder_ball_diameter": [],
"use_default_coax_port_radial_extension": true,
"trim_reference_size": false,
"output_aedb": null,
"signal_layers_properties": {},
"coplanar_instances": [],
"signal_layer_etching_instances": [],
"etching_factor_instances": [],
"use_dielectric_extent_multiple": true,
"dielectric_extent": 0.001,
"use_airbox_horizontal_multiple": true,
"airbox_horizontal_extent": 0.1,
"use_airbox_negative_vertical_extent_multiple": true,
"airbox_negative_vertical_extent": 0.1,
"use_airbox_positive_vertical_extent_multiple": true,
"airbox_positive_vertical_extent": 0.1,
"honor_user_dielectric": false,
"truncate_airbox_at_ground": false,
"use_radiation_boundary": true,
"do_cutout_subdesign": true,
"do_pin_group": true,
"sources": []
},
"setup_name": "Pyaedt_setup",
"solver_type": 6
}
13 changes: 13 additions & 0 deletions _unittest/test_00_EDB.py
Original file line number Diff line number Diff line change
Expand Up @@ -2980,3 +2980,16 @@ def test_151_materials_read_materials(self):
assert mats[key]["mass_density"] == 8055
assert mats[key]["specific_heat"] == 480
assert mats[key]["thermal_expansion_coeffcient"] == 1.08e-005

def test_152_simconfig_built_custom_sballs_height(self):
source_path = os.path.join(local_path, "example_models", test_subfolder, "ANSYS-HSD_V1.aedb")
target_path = os.path.join(self.local_scratch.path, "test_custom_sball_height", "ANSYS-HSD_V1.aedb")
self.local_scratch.copyfolder(source_path, target_path)
json_file = os.path.join(target_path, "simsetup_custom_sballs.json")
edbapp = Edb(target_path, edbversion=desktop_version)
simconfig = edbapp.new_simulation_configuration()
simconfig.import_json(json_file)
edbapp.build_simulation_project(simconfig)
assert round(edbapp.components["X1"].solder_ball_height, 6) == 0.00025
assert round(edbapp.components["U1"].solder_ball_height, 6) == 0.00035
edbapp.close_edb()
Loading

0 comments on commit 09db4b3

Please sign in to comment.