Generate Layout

Generate Layout#

The first step is to create a layout and test manifest for your project, so that you can relate measurements and analyses back to your source layout.

You can generate the layout with any layout tool. In this notebook you can use kfactory.

Generate layout#

Kfactory allows you to write metadata directly into the cell.

You can download this layout.py file.

import kfactory as kf
from test_chip import TOP
import csv

c = TOP()
c.write("test_chip.gds")
c.plot()
../../../_images/8324cd42af8d7e16e0ac69dddbf418a66394bf1dbece49af5397de05aadb66d1.png

Generate design manifest#

In your sample GDS, you have the device settings annotated on the GDS. Here you can read them from the GDS and write a design manifest, which we can use to associate measurement data with the devices on the GDS. However, you can use any method you prefer to generate your test manifest.

c = kf.kcl["TOP"]
rib = c.kcl["RibLoss"]
ridge = c.kcl["RidgeLoss"]
csvpath = "design_manifest.csv"

with open(csvpath, "w") as f:
    writer = csv.writer(f)
    writer.writerow(
        [
            "cell",
            "x",
            "y",
            "width_um",
            "length_um",
            "analysis",
            "analysis_parameters",
        ]
    )

    rib_it = rib._kdb_cell.begin_instances_rec()
    rib_it.targets = "cutback_rib_assembled*"
    while not rib_it.at_end():
        _c = c.kcl[rib_it.inst_cell().cell_index()]
        _disp = (rib_it.trans() * rib_it.inst_trans()).disp
        writer.writerow(
            [
                _c.name,
                _disp.x,
                _disp.y,
                _c.settings["width"],
                _c.settings["length"],
                "[power_envelope]",
                '[{"n": 10, "wvl_of_interest_nm": 1550}]',
            ]
        )
        rib_it.next()
    ridge_it = ridge._kdb_cell.begin_instances_rec()
    ridge_it.targets = "cutback_ridge_assembled*"
    while not ridge_it.at_end():
        _c = c.kcl[ridge_it.inst_cell().cell_index()]
        _disp = (ridge_it.trans() * ridge_it.inst_trans()).disp
        writer.writerow(
            [
                _c.name,
                _disp.x,
                _disp.y,
                _c.settings["width"],
                _c.settings["length"],
                "[power_envelope]",
                '[{"n": 10, "wvl_of_interest_nm": 1550}]',
            ]
        )
        ridge_it.next()
    rib_it = rib._kdb_cell.begin_instances_rec()

You can take a look a the contents of the device manifest you created.

import pandas as pd

df = pd.read_csv(csvpath)
df
cell x y width_um length_um analysis analysis_parameters
0 cutback_rib_assembled_MFalse_W0p3_L0 20150 60150 0.3 0 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
1 cutback_rib_assembled_MTrue_W0p3_L25000 1039250 60150 0.3 25000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
2 cutback_rib_assembled_MFalse_W0p3_L5000 20150 204150 0.3 5000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
3 cutback_rib_assembled_MTrue_W0p3_L20000 1039250 204150 0.3 20000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
4 cutback_rib_assembled_MFalse_W0p3_L10000 20150 348150 0.3 10000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
5 cutback_rib_assembled_MTrue_W0p3_L15000 1039250 348150 0.3 15000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
6 cutback_rib_assembled_MFalse_W0p5_L0 20250 492250 0.5 0 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
7 cutback_rib_assembled_MTrue_W0p5_L25000 1058750 492250 0.5 25000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
8 cutback_rib_assembled_MFalse_W0p5_L5000 20250 646250 0.5 5000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
9 cutback_rib_assembled_MTrue_W0p5_L20000 1058750 646250 0.5 20000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
10 cutback_rib_assembled_MFalse_W0p5_L10000 20250 800250 0.5 10000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
11 cutback_rib_assembled_MTrue_W0p5_L15000 1058750 800250 0.5 15000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
12 cutback_rib_assembled_MFalse_W0p8_L0 20400 954400 0.8 0 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
13 cutback_rib_assembled_MTrue_W0p8_L25000 1088000 954400 0.8 25000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
14 cutback_rib_assembled_MFalse_W0p8_L5000 20400 1123400 0.8 5000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
15 cutback_rib_assembled_MTrue_W0p8_L20000 1088000 1123400 0.8 20000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
16 cutback_rib_assembled_MFalse_W0p8_L10000 20400 1292400 0.8 10000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
17 cutback_rib_assembled_MTrue_W0p8_L15000 1088000 1292400 0.8 15000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
18 cutback_ridge_assembled_MFalse_W0p3_L0 20150 60150 0.3 0 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
19 cutback_ridge_assembled_MTrue_W0p3_L25000 1037250 60150 0.3 25000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
20 cutback_ridge_assembled_MFalse_W0p3_L5000 20150 203150 0.3 5000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
21 cutback_ridge_assembled_MTrue_W0p3_L20000 1037250 203150 0.3 20000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
22 cutback_ridge_assembled_MFalse_W0p3_L10000 20150 346150 0.3 10000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
23 cutback_ridge_assembled_MTrue_W0p3_L15000 1037250 346150 0.3 15000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
24 cutback_ridge_assembled_MFalse_W0p5_L0 20250 489250 0.5 0 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
25 cutback_ridge_assembled_MTrue_W0p5_L25000 1056750 489250 0.5 25000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
26 cutback_ridge_assembled_MFalse_W0p5_L5000 20250 642250 0.5 5000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
27 cutback_ridge_assembled_MTrue_W0p5_L20000 1056750 642250 0.5 20000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
28 cutback_ridge_assembled_MFalse_W0p5_L10000 20250 795250 0.5 10000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
29 cutback_ridge_assembled_MTrue_W0p5_L15000 1056750 795250 0.5 15000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
30 cutback_ridge_assembled_MFalse_W0p8_L0 20400 948400 0.8 0 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
31 cutback_ridge_assembled_MTrue_W0p8_L25000 1086000 948400 0.8 25000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
32 cutback_ridge_assembled_MFalse_W0p8_L5000 20400 1116400 0.8 5000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
33 cutback_ridge_assembled_MTrue_W0p8_L20000 1086000 1116400 0.8 20000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
34 cutback_ridge_assembled_MFalse_W0p8_L10000 20400 1284400 0.8 10000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]
35 cutback_ridge_assembled_MTrue_W0p8_L15000 1086000 1284400 0.8 15000 [power_envelope] [{"n": 10, "wvl_of_interest_nm": 1550}]