Skip to content

Automatic test#17802 #26

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 46 commits into from
May 8, 2025
Merged
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
c991fa9
Added map commands & unit test
Cynthia-Tsai Mar 24, 2025
83d33da
Added map commands & unit test
Cynthia-Tsai Mar 24, 2025
014d6ea
Merge branch 'master' into David.Liu/AutomaticTest#17802
MPIDavidLiu Mar 26, 2025
96afe41
Modify the rule of new API(LoaderCommandGroup&StatusCommandGroup)
MPIDavidLiu Mar 27, 2025
c10e0be
Modify TestLoaderCommandGroup.py
MPIDavidLiu Mar 28, 2025
8e8794c
Modify statuscommandgroup.py rule,UnitTest and add enumeration
MPIDavidLiu Mar 28, 2025
62e87fb
update the command follow the rule
Hoca-Chen Apr 1, 2025
87d90bf
Added map cmd & unit test
Cynthia-Tsai Apr 1, 2025
732b882
#18000 and #18087 Simplify AuxCommandGroup and QalibriaCommandFroup API
AdamLin0108 Apr 7, 2025
c6a09e7
Merge branch 'David.Liu/AutomaticTest#17802' of https://github.com/Se…
AdamLin0108 Apr 7, 2025
9dbf0d8
Jeff add chuck and project handling commands
MPIDavidLiu Apr 8, 2025
73430b6
Create 新文字文件.txt
MPIDavidLiu Apr 8, 2025
ba21af2
Delete 新文字文件.txt
MPIDavidLiu Apr 8, 2025
b927756
Test
MPIDavidLiu Apr 10, 2025
8b5b690
Test
MPIDavidLiu Apr 10, 2025
a7c832a
Jeff add chuck and project handling commands
MPIDavidLiu Apr 10, 2025
328ffff
add Cynthia vision API
MPIDavidLiu Apr 10, 2025
deecc1a
add Cynthia vision unit test
MPIDavidLiu Apr 10, 2025
e14609c
Merge branch 'David.Liu/AutomaticTest#17802' of https://github.com/Se…
MPIDavidLiu Apr 10, 2025
c94252c
add John's remote command.
MPIDavidLiu Apr 10, 2025
fb9c304
Update TestStatusCommandGroup.py
Johnwu1020 Apr 11, 2025
9a8294f
Merge branch 'David.Liu/AutomaticTest#17802' into AutomaticTest#17802
MPIDavidLiu Apr 11, 2025
c876a90
Delete sentio_prober_control/Sentio/ProberSentio.py.bak
MPIDavidLiu May 6, 2025
f871a17
LoaderCommandGroup comment restore
MPIDavidLiu May 6, 2025
893236c
Merge branch 'AutomaticTest#17802' of https://github.com/SentioProber…
MPIDavidLiu May 6, 2025
5a3848c
removed Response from set_door_lock
May 6, 2025
946f9a3
Fixed a couple of issues in the PR
May 6, 2025
d2358a9
Update WafermapCommandGroup.py
May 6, 2025
95635e4
fix for get_chuck_site_name
May 6, 2025
24a40fe
Fixed incorrect documentation
May 6, 2025
338ffd1
Fixed for incorrect return value documentation
May 6, 2025
8c12fc3
documentation fixed
May 6, 2025
320110e
removed return types
May 6, 2025
132a9b5
return values removed
May 6, 2025
15c7bab
Modify the Vision/Map API based on Ingo's comments:
Cynthia-Tsai May 7, 2025
a3966bc
Change the return value of map:get_orient_marker to enum
Cynthia-Tsai May 7, 2025
f845c67
restore the statuscommandgroup and enumerations.
MPIDavidLiu May 8, 2025
ac1bd60
Made Python api consistent with remote command api
May 8, 2025
3a6aabc
Work on Review issues
May 8, 2025
14df252
work on code review issues
May 8, 2025
632b497
deprecatedmarker braught back
May 8, 2025
6f84fd0
cleanup
May 8, 2025
da89490
Update Enumerations.py
May 8, 2025
00a3a15
member functions sorted alphabetically; needed for pydoc documentation
May 8, 2025
9c3db7d
Update QAlibriaCommandGroup.py
May 8, 2025
5c33627
methods reordered alphabetically
May 8, 2025
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
304 changes: 182 additions & 122 deletions sentio_prober_control/Sentio/CommandGroups/AuxCommandGroup.py

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -88,7 +88,6 @@ def prealign(self, marker: OrientationMarker, angle: int) -> None:
self.comm.send(f"loader:prealign {marker.toSentioAbbr()}, {angle}")
Response.check_resp(self.comm.read_line())


def query_wafer_status(self, station : LoaderStation, slot : int) -> Tuple[LoaderStation, int, int, int, float] | None:

"""Query the status of a wafer in a loader station.
@@ -186,14 +185,12 @@ def start_prepare_station(self, station: LoaderStation, angle: float | None = No

return Response.check_resp(self.comm.read_line())


@deprecated("duplicate functionality; Use SentioProber.move_chuck_work_area!")
def switch_work_area(self, area: str):
self.comm.send("move_chuck_work_area {0}".format(area))
resp = Response.check_resp(self.comm.read_line())
return resp.message()


def transfer_wafer(
self,
src_station: LoaderStation,
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from sentio_prober_control.Sentio.Response import Response
from sentio_prober_control.Sentio.CommandGroups.CommandGroupBase import CommandGroupBase
from typing import Tuple

from enum import Enum

class ModuleCommandGroupBase(CommandGroupBase):
"""Base class for all command groups."""
@@ -30,6 +30,8 @@ def get_prop(self, prop_name: str, arg1=None) -> int | float | str | bool | Tupl

if arg1 == None:
self.comm.send(f"{self._groupAbbr}:get_prop {prop_name}")
elif isinstance(arg1, Enum):
self.comm.send(f"{self._groupAbbr}:get_prop {prop_name}, {arg1.name}")
else:
self.comm.send(f"{self._groupAbbr}:get_prop {prop_name}, {arg1}")

@@ -78,7 +80,10 @@ def set_prop(self, prop_name: str, *argv) -> None:
"""
cmd: str = self._groupAbbr + ":set_prop {0}"
for n in range(0, len(argv)):
cmd += ", {0}".format(argv[n])
if isinstance(argv[n], Enum):
cmd += f", {argv[n].name}"
else:
cmd += f", {argv[n]}"

self.comm.send(cmd.format(prop_name))
Response.check_resp(self.comm.read_line())
164 changes: 83 additions & 81 deletions sentio_prober_control/Sentio/CommandGroups/QAlibriaCommandGroup.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
from deprecated import deprecated
from sentio_prober_control.Sentio.Response import Response
from sentio_prober_control.Sentio.CommandGroups.CommandGroupBase import CommandGroupBase
from sentio_prober_control.Sentio.ProberBase import ProberException
from sentio_prober_control.Sentio.Enumerations import DriftType
from typing import List

class QAlibriaCommandGroup(CommandGroupBase):
"""
@@ -28,78 +31,49 @@ def calibration_drift_verify(self, dut_name: str = "", auto_exec: bool = True) -
Wraps SENTIO's "qal:calibration_drift_verify" remote command.

Args:
dut_name: The name of the DUT.
auto_exec: Whether to automatically execute the drift verify process.
dut_name (str): The name of the DUT.
auto_exec (bool): Whether to automatically execute the drift verify process.
"""
self.comm.send(f"qal:calibration_drift_verify {dut_name},{str(auto_exec).lower()}")
Response.check_resp(self.comm.read_line())


@deprecated(reason="use calibration_execute instead!; violates naming conventions. (CR#13887)")
def start_calibration(self) -> None:
def check_calibration_status(self) -> None:
"""
Deprecated function for starting calibration.
Please use calibration_execute instead.
"""
self.comm.send("qal:calibration_execute")
Response.check_resp(self.comm.read_line())
Checks the calibration status of QAlibria.

Wraps SENTIO's "qal:get_calibration_status" remote command.

@deprecated(reason="use calibration_drift_verify instead!; violates naming conventions. (CR#13887)")
def verify_calibration_drift(self) -> None:
"""
Deprecated function for verifying calibration drift.
Please use calibration_drift_verify instead.
Raises:
ProberException: If the calibration status is not "OK".
"""
self.comm.send("qal:calibration_drift_verify")
self.comm.send("qal:get_calibration_status")
Response.check_resp(self.comm.read_line())


@deprecated(reason="use calibration_drift_verify instead!; violates naming conventions. (CR#13887)")
def verify_calibration_drift_dut(self, dut) -> None:
"""
Deprecated function for verifying calibration drift with a specific DUT.
Please use calibration_drift_verify(dut_name, ...) instead.
def clear_dut_network(self, dut_name: str, drift_type: DriftType, update_ui: bool) -> None:
"""
self.comm.send(f"qal:calibration_drift_verify {dut}")
Response.check_resp(self.comm.read_line())


@deprecated(reason="oddly specific function name; filed as CR#13887")
def set_calibration_drift_probe12(self):
"""
Deprecated function for setting calibration drift for probe 1 and 2.
"""
self.comm.send("qal:set_dut_network RefDUT,DriftRef,12,false")
Response.check_resp(self.comm.read_line())

self.comm.send("qal:set_dut_network RefDUT,Drift,12,false")
resp = Response.check_resp(self.comm.read_line())
return resp.message()

# -------------------------------------------------------------------------
# New / Additional Commands
# -------------------------------------------------------------------------
Clear network data for a DUT.

def get_calibration_status(self) -> str:
"""
Retrieve the status of QAlibria.
Wraps SENTIO's "qal:clear_dut_network" remote command.

Wraps SENTIO's "qal:get_calibration_status" remote command.
Args:
dut_name (str): The name of the DUT (e.g. "RefDUT").
drift_type (DriftType): The type of drift data to clear (DriftType.DriftRef or DriftType.Drift).
update_ui (bool): Whether to update the UI (True/False).

Returns:
str: The status string of QAlibria (e.g., "OK"). If "OK" and
the system is in Remote mode, calibration is ready.
None

Raises:
ProberException: If the remote command returns an error.
"""
self.comm.send("qal:get_calibration_status")
resp = Response.check_resp(self.comm.read_line())
return resp.message()

cmd = f"qal:clear_dut_network {dut_name},{drift_type.value},{str(update_ui).lower()}"
self.comm.send(cmd)
Response.check_resp(self.comm.read_line())

def measurement_execute(
self,
file_name: str,
ports: str = "1,2",
ports: List[int] = [1, 2],
correct_by_vna: bool = True,
enable_use_ratio: bool = False,
enable_switch_term: bool = False
@@ -111,14 +85,18 @@ def measurement_execute(

Args:
file_name: The path to the SNP file.
ports: The port(s) used for the measurement, e.g. "1,2".
ports: A list of port numbers used for the measurement (e.g. [1, 2]).
correct_by_vna: Whether to apply VNA correction (True/False).
enable_use_ratio: Whether to enable 'Use Ratio b/a' (True/False).
enable_switch_term: Whether to enable switch term (True/False).

Raises:
ProberException: If the remote command returns an error.
"""
ports_str = ",".join(str(port) for port in ports)
cmd = (
f"qal:measurement_execute "
f"{file_name},{ports},"
f"{file_name},{ports_str},"
f"{str(correct_by_vna).lower()},"
f"{str(enable_use_ratio).lower()},"
f"{str(enable_switch_term).lower()}"
@@ -135,18 +113,33 @@ def reset_ets(self) -> None:
self.comm.send("qal:reset_ets")
Response.check_resp(self.comm.read_line())

@deprecated(reason="oddly specific function name; filed as CR#13887")
def set_calibration_drift_probe12(self):
"""
Deprecated function for setting calibration drift for probe 1 and 2.
"""
self.comm.send("qal:set_dut_network RefDUT,DriftRef,12,false")
Response.check_resp(self.comm.read_line())

def set_ets(self, ports: str, path: str) -> None:
self.comm.send("qal:set_dut_network RefDUT,Drift,12,false")
resp = Response.check_resp(self.comm.read_line())
return resp.message()

def set_ets(self, port: int, path: str, ets_mode: int = 0) -> None:
"""
Set error terms in the buffer.

Wraps SENTIO's "qal:set_ets" remote command.

Args:
ports: Port(s) of error terms (e.g. "12").
port: Port of error terms (e.g. 12).
path: Path to the error terms file in the buffer (e.g. "D:\\temp\\ets.txt").
ets_mode: An integer parameter as defined by the remote command spec (default is 0).

Raises:
ProberException: If the remote command returns an error.
"""
cmd = f"qal:set_ets {ports},{path}"
cmd = f"qal:set_ets {port},{path},{ets_mode}"
self.comm.send(cmd)
Response.check_resp(self.comm.read_line())

@@ -164,37 +157,34 @@ def send_ets_to_vna(self, cal_set_name: str) -> None:
self.comm.send(cmd)
Response.check_resp(self.comm.read_line())


def clear_dut_network(self, dut_name: str, drift_type: str, update_ui: bool) -> None:
@deprecated(reason="use calibration_execute instead!; violates naming conventions. (CR#13887)")
def start_calibration(self) -> None:
"""
Clear network data for a DUT.

Wraps SENTIO's "qal:clear_dut_network" remote command.

Args:
dut_name: The name of the DUT (e.g. "RefDUT").
drift_type: The type of drift data to clear ("DriftRef" or "Drift").
update_ui: Whether to update the UI (True/False).
Deprecated function for starting calibration.
Please use calibration_execute instead.
"""
cmd = (f"qal:clear_dut_network {dut_name},{drift_type},{str(update_ui).lower()}")
self.comm.send(cmd)
self.comm.send("qal:calibration_execute")
Response.check_resp(self.comm.read_line())


def vna_write(self, vna_command: str) -> None:
@deprecated(reason="use calibration_drift_verify instead!; violates naming conventions. (CR#13887)")
def verify_calibration_drift(self) -> None:
"""
Write a remote command to the VNA.
Deprecated function for verifying calibration drift.
Please use calibration_drift_verify instead.
"""
self.comm.send("qal:calibration_drift_verify")
Response.check_resp(self.comm.read_line())

Wraps SENTIO's "qal:vna_write" remote command.

Args:
vna_command: The remote command to send to the VNA (e.g. ":SENS1:FREQ:STAR 1.0E9").
@deprecated(reason="use calibration_drift_verify instead!; violates naming conventions. (CR#13887)")
def verify_calibration_drift_dut(self, dut) -> None:
"""
cmd = f"qal:vna_write {vna_command}"
self.comm.send(cmd)
Deprecated function for verifying calibration drift with a specific DUT.
Please use calibration_drift_verify(dut_name, ...) instead.
"""
self.comm.send(f"qal:calibration_drift_verify {dut}")
Response.check_resp(self.comm.read_line())


def vna_query(self, vna_command: str) -> str:
"""
Query a remote command from the VNA and return the response.
@@ -212,7 +202,6 @@ def vna_query(self, vna_command: str) -> str:
resp = Response.check_resp(self.comm.read_line())
return resp.message()


def vna_read(self) -> str:
"""
Read data from the VNA.
@@ -224,4 +213,17 @@ def vna_read(self) -> str:
"""
self.comm.send("qal:vna_read")
resp = Response.check_resp(self.comm.read_line())
return resp.message()
return resp.message()

def vna_write(self, vna_command: str) -> None:
"""
Write a remote command to the VNA.

Wraps SENTIO's "qal:vna_write" remote command.

Args:
vna_command: The remote command to send to the VNA (e.g. ":SENS1:FREQ:STAR 1.0E9").
"""
cmd = f"qal:vna_write {vna_command}"
self.comm.send(cmd)
Response.check_resp(self.comm.read_line())
12 changes: 12 additions & 0 deletions sentio_prober_control/Sentio/CommandGroups/SetupCommandGroup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from sentio_prober_control.Sentio.CommandGroups.SetupContactCounterCommandGroup import SetupContactCounterCommandGroup
from sentio_prober_control.Sentio.CommandGroups.SetupRemoteCommandGroup import SetupRemoteCommandGroup
from sentio_prober_control.Sentio.CommandGroups.ModuleCommandGroupBase import ModuleCommandGroupBase


class SetupCommandGroup(ModuleCommandGroupBase):
"""A command group for accessing setup module functions."""
def __init__(self, comm) -> None:
super().__init__(comm, "setup")

self.contact_counter: SetupContactCounterCommandGroup = SetupContactCounterCommandGroup(comm)
self.remote: SetupRemoteCommandGroup = SetupRemoteCommandGroup(comm)
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from sentio_prober_control.Sentio.Response import Response
from sentio_prober_control.Sentio.CommandGroups.CommandGroupBase import CommandGroupBase


class SetupContactCounterCommandGroup(CommandGroupBase):
"""This command group bundles functions setting up the contact counter."""

def __init__(self, comm) -> None:
super().__init__(comm)

def get(self) -> int:
""" Retrieves the contact counter value.

Returns:
An integer representing the number of times the chuck moved into contact height,
excluding moves on cleaning substrate.
"""
self.comm.send("setup:contact_counter:get")
resp = Response.check_resp(self.comm.read_line())
return int(resp.message())

def reset(self) -> None:
""" Resets the contact counter.

Returns:
None
"""
self.comm.send("setup:contact_counter:reset")
Response.check_resp(self.comm.read_line())
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from sentio_prober_control.Sentio.Response import Response
from sentio_prober_control.Sentio.CommandGroups.CommandGroupBase import CommandGroupBase

class SetupRemoteCommandGroup(CommandGroupBase):
""" This command group bundles functions setting up the behavior of SENTIO in remote mode. """
def __init__(self, comm) -> None:
super().__init__(comm)

def light_off_at_contact(self, status: bool) -> None:
"""Defines whether light is switched off at contact height in remote mode.

Args:
status (BooleanStatus): True/False, ON/OFF as defined in Enum.

Returns:
None
"""
self.comm.send(f"setup:remote:light_off_at_contact {status}")
Response.check_resp(self.comm.read_line())

def light_on_at_separation(self, status: bool) -> None:
"""Defines whether light is switched on at separation height in remote mode.

Args:
status (BooleanStatus): True/False, ON/OFF as defined in Enum.

Returns:
None
"""
self.comm.send(f"setup:remote:light_on_at_separation {status}")
Response.check_resp(self.comm.read_line())

def scope_follow_off(self, status: bool) -> None:
"""Defines whether scope follow mode is switched off in remote mode.

Args:
status (BooleanStatus): True/False, ON/OFF as defined in Enum.
Note: ON disables scope follow.

Returns:
Response: Response object for result checking.
"""
self.comm.send(f"setup:remote:scope_follow_off {status}")
Response.check_resp(self.comm.read_line())
Loading