Now we will create wafer maps of the fsr using the device analysis we triggered in the die analysis notebook. Make sure all the analyses we triggered are finished (i.e. make sure the last cell in that notebook has finished running)!
As before, make sure you have the following environment variables set or added to a .env
file:
GDSFACTORY_HUB_API_URL="https://{org}.gdsfactoryhub.com"
GDSFACTORY_HUB_QUERY_URL="https://query.{org}.gdsfactoryhub.com"
GDSFACTORY_HUB_KEY="<your-gdsfactoryplus-api-key>"
project_id = f"rings-{getpass.getuser()}"
client = gfh.create_client_from_env(project_id=project_id)
api = client.api()
query = client.query()
Lets Define the Upper and Lower Spec limits for Known Good Die (KGD).
Lets find a wafer pkey for this project, so that we can trigger the die analysis on it.
wafer_pks = [w["pk"] for w in query.wafers().execute().data]
output = aggregate_die_analyses.run(
wafer_pkey=wafer_pks[0],
die_function_id="aggregate_device_analyses",
output_key="mean",
min_output=4.68,
max_output=4.75,
)
result = api.validate_function(
function_id="aggregate_die_analyses",
target_model="wafer",
file=gfh.get_module_path(aggregate_die_analyses),
test_target_model_pk=wafer_pks[0],
test_kwargs={
"die_function_id": "aggregate_device_analyses",
"output_key": "mean",
"min_output": 4.68,
"max_output": 4.76,
},
)
result.summary_plot()
with gfh.suppress_api_error():
result = api.upload_function(
function_id="aggregate_die_analyses",
target_model="wafer",
file=gfh.get_module_path(aggregate_die_analyses),
)
task_ids = []
for wafer_pk in (pb := tqdm(wafer_pks)):
pb.set_postfix(wafer_pk=wafer_pk)
task_id = api.start_analysis( # start_analysis triggers the analysis task, but does not wait for it to finish.
analysis_id=f"wafer_fsr_{wafer_pk}",
function_id="aggregate_die_analyses",
target_model="wafer",
target_model_pk=wafer_pk,
kwargs={
"die_function_id": "aggregate_device_analyses",
"output_key": "mean",
"min_output": 4.68,
"max_output": 4.76,
},
)
task_ids.append(task_id)