"""Dataclass models used by manifest-backed technologies.""" from dataclasses import dataclass from typing import Any, Optional, Tuple @dataclass(frozen=True) class LayerSpec: """One canonical foundry GDS layer plus optional process metadata.""" name: str layer: Tuple[int, int] aliases: Tuple[str, ...] = () material: Optional[str] = None z_start: Optional[float] = None thickness: Optional[float] = None sidewall_angle: Optional[float] = None process: Optional[str] = None description: str = "" @dataclass(frozen=True) class XSectionLayerSpec: """One layer contribution inside a Nazca xsection.""" layer: str growx: Optional[float] = None growy: Optional[float] = None leftedge: Optional[Tuple[float, float]] = None rightedge: Optional[Tuple[float, float]] = None overwrite: bool = True @dataclass(frozen=True) class XSectionSpec: """Named cross-section made from one or more layer contributions.""" name: str layers: Tuple[XSectionLayerSpec, ...] @dataclass(frozen=True) class MaterialSpec: """Material metadata and optional refractive-index data reference.""" name: str display_name: Optional[str] = None source_file: Optional[str] = None source_revision: Optional[str] = None data_file: Optional[str] = None notes: str = "" @dataclass(frozen=True) class ProcessLayerSpec: """Detailed process-stack row reserved for full process exports.""" name: str gds: Any = None z_start_um: Optional[float] = None thickness_um: Optional[float] = None material: Optional[str] = None pattern_material: Optional[str] = None process: Optional[str] = None sidewall_angle: Optional[float] = None pattern_growth_delta_um: Optional[float] = None enabled: Optional[bool] = None