EDB: post-layout parameterization#

This example shows you how to parameterize the signal net in post-layout.

Define input parameters#

signal_net_name = "DDR4_ALERT3"
coplanar_plane_net_name = "1V0"  # Specify coplanar plane net name for adding clearance
layers = ["16_Bottom"]  # Specify layers to be parameterized

Perform required imports#

import os
import tempfile
import pyaedt

from pyaedt import downloads
from pyaedt import Edb

temppath =  pyaedt.generate_unique_folder_name()

Download and open example layout file in edb format#

edb_fpath = pyaedt.downloads.download_file('edb/ANSYS-HSD_V1.aedb',destination=temppath)
appedb = Edb(edb_fpath, edbversion="2023.2")

Cutout#

appedb.cutout([signal_net_name], [coplanar_plane_net_name, "GND"],
              remove_single_pin_components=True)
[[0.04833361583642983, 0.06845950802472248], [0.04839217710290317, 0.06820646420842003], [0.048476096302053164, 0.06797637324983577], [0.048586150580908885, 0.06776080406509359], [0.048672445716054995, 0.06762130958381865], [0.05067176818706848, 0.06491330967510935], [0.050769291930717185, 0.0648000049584815], [0.05114842692016208, 0.06442086996903659], [0.05120289468443713, 0.0643703064923304], [0.08720212328418347, 0.03335982576863652], [0.08735511697746182, 0.03325121473069015], [0.0877047359472929, 0.03304936212434437], [0.0882134021373534, 0.032913065429500635], [0.08878659946264658, 0.032913065429500635], [0.08929526565270708, 0.03304936212434437], [0.08979166909779229, 0.03333596078699098], [0.09016403859300909, 0.033708330282207793], [0.09045063725565565, 0.034204733727292984], [0.09058693395049935, 0.034713399917353435], [0.09058693395049935, 0.03503044372649857], [0.09058683166450263, 0.03504474631880416], [0.09048967107082366, 0.04183735396100174], [0.09048926753190141, 0.04185485402368393], [0.08978637017721422, 0.0639458794927306], [0.0897676295798525, 0.0641094442946288], [0.08970628997324057, 0.06441781932138024], [0.0895555258600598, 0.06478179608814026], [0.08937199173688463, 0.06505647431452988], [0.08924732876262124, 0.06520837658818007], [0.0880208395789273, 0.06643486577187402], [0.08788643646933333, 0.06654755746655197], [0.08679664168378841, 0.06730942192276895], [0.08676294623404525, 0.06733197520160766], [0.08667866067063877, 0.06738594842571934], [0.08658597244333009, 0.06743856277022901], [0.08636336408365564, 0.06754969080651728], [0.08602704906993228, 0.06764934763029656], [0.08581990776977562, 0.06767288408064792], [0.08580812308064588, 0.06767415242192924], [0.051806832872544235, 0.07112987171313323], [0.05170565396058174, 0.07113500016000002], [0.050887072320460844, 0.07113500016000002], [0.050691511158220036, 0.07111573906668872], [0.05046879970844227, 0.07107143900497076], [0.050289214965552706, 0.0710178513978896], [0.04953634065667003, 0.07071397723210866], [0.04935457314629638, 0.07061787855828856], [0.04915820200547062, 0.070486667556885], [0.04900629973182032, 0.07036200458262161], [0.04883555655902538, 0.07019126140982673], [0.04868479628064163, 0.06999824426118566], [0.04853182672022683, 0.06974350703807211], [0.048427348957554184, 0.06950305012843623], [0.0483566751331029, 0.0692563340940017], [0.048318457999324806, 0.0690144173068744], [0.04830834906256023, 0.06872046150414503]]

Get all trace segments from the signal net#

net = appedb.nets[signal_net_name]
trace_segments = []
for p in net.primitives:
    if p.layer_name not in layers:
        continue
    if not p.type == "Path":
        continue
    trace_segments.append(p)

Create and assign delta w variable per layer#

for p in trace_segments:
    vname = f"{p.net_name}_{p.layer_name}_dw"
    if vname not in appedb.variables:
        appedb[vname] = "0mm"
    new_w = f"{p.width}+{vname}"
    p.width = new_w

Delete existing clearance#

for p in trace_segments:
    for g in appedb.modeler.get_polygons_by_layer(p.layer_name, coplanar_plane_net_name):
        for v in g.voids:
            if p.is_intersecting(v):
                v.delete()

Create and assign clearance variable per layer#

for p in trace_segments:
    clr = f"{p.net_name}_{p.layer_name}_clr"
    if clr not in appedb.variables:
        appedb[clr] = "0.5mm"
    path = p.get_center_line()
    for g in appedb.modeler.get_polygons_by_layer(p.layer_name, coplanar_plane_net_name):
        void = appedb.modeler.create_trace(path, p.layer_name, f"{p.width}+{clr}*2")
        g.add_void(void)

Plot#

appedb.nets.plot(layers=layers[0], size=2000)
main

Save and close Edb#

save_edb_fpath = os.path.join(temppath, pyaedt.generate_unique_name("post_layout_parameterization") + ".aedb")
appedb.save_edb_as(save_edb_fpath)
print("Edb is saved to ", save_edb_fpath)
appedb.close_edb()
Edb is saved to  D:\Temp\pyaedt_prj_VEW\post_layout_parameterization_PNM1ID.aedb

True

Total running time of the script: (0 minutes 6.453 seconds)

Gallery generated by Sphinx-Gallery