refactor: reorganize backend modules into sub-packages for models, data, visualization, wafer, and controllers
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
"""Load wafer sensor layouts from bundled YAML files.
|
||||
|
||||
YAML schema mirrors the replay app's wafer_desc.py format:
|
||||
X/Y — sensor positions in mm relative to x_origin/y_origin
|
||||
size — wafer diameter/edge in mm
|
||||
shape — "round" or "square"
|
||||
start_sn — first sensor number (usually 1)
|
||||
x_origin — "left" | "right" | "center"
|
||||
y_origin — "bottom" | "top" | "center"
|
||||
|
||||
Returned Sensor coords are center-origin mm (negative values toward the edge).
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
import yaml
|
||||
|
||||
from pygui.backend.wafer.zwafer_models import Sensor
|
||||
|
||||
_LAYOUTS_DIR = Path(__file__).parent.parent.parent / "assets" / "layouts"
|
||||
|
||||
|
||||
def _family_name(raw_name: str) -> str:
|
||||
return raw_name.replace("wafer", "").strip("_")
|
||||
|
||||
|
||||
def _load_yaml(path: Path) -> dict:
|
||||
with path.open(encoding="utf-8") as f:
|
||||
return yaml.safe_load(f)
|
||||
|
||||
|
||||
def available_families() -> list[str]:
|
||||
return [_family_name(_load_yaml(p)["name"]) for p in _LAYOUTS_DIR.glob("*.yaml")]
|
||||
|
||||
|
||||
def load_layout(family: str) -> list[Sensor]:
|
||||
for path in _LAYOUTS_DIR.glob("*.yaml"):
|
||||
data = _load_yaml(path)
|
||||
if _family_name(data["name"]) == family:
|
||||
return _to_sensors(data)
|
||||
raise KeyError(f"Unknown wafer family: {family!r}")
|
||||
|
||||
|
||||
def load_layout_for_wafer_id(wafer_id: str) -> list[Sensor]:
|
||||
"""Match 'B00108' → bcdwafer by looking up the first char in each YAML's 'wafers' list."""
|
||||
prefix = wafer_id[0].upper() if wafer_id else ""
|
||||
for path in _LAYOUTS_DIR.glob("*.yaml"):
|
||||
data = _load_yaml(path)
|
||||
if prefix in data.get("wafers", []):
|
||||
return _to_sensors(data)
|
||||
raise KeyError(f"No layout found for wafer ID prefix {prefix!r}")
|
||||
|
||||
|
||||
def _to_sensors(data: dict) -> list[Sensor]:
|
||||
xs: list[float] = data["X"]
|
||||
ys: list[float] = data["Y"]
|
||||
size: float = float(data["size"])
|
||||
start_sn: int = data.get("start_sn", 1)
|
||||
reverse_x: bool = data.get("reverse_x", False)
|
||||
reverse_y: bool = data.get("reverse_y", False)
|
||||
x_orig: str = data.get("x_origin", "left")
|
||||
y_orig: str = data.get("y_origin", "bottom")
|
||||
|
||||
x_shift = {"left": size / 2, "right": -(size / 2), "center": 0.0}.get(x_orig, 0.0)
|
||||
y_shift = {"bottom": size / 2, "top": -(size / 2), "center": 0.0}.get(y_orig, 0.0)
|
||||
|
||||
sensors: list[Sensor] = []
|
||||
for i, (x_mm, y_mm) in enumerate(zip(xs, ys)):
|
||||
if reverse_x:
|
||||
x_mm = -x_mm
|
||||
if reverse_y:
|
||||
y_mm = -y_mm
|
||||
sensors.append(Sensor(
|
||||
label=str(start_sn + i),
|
||||
x=x_mm - x_shift,
|
||||
y=y_mm - y_shift,
|
||||
))
|
||||
return sensors
|
||||
Reference in New Issue
Block a user