A3: S12 Wafer Maps stream (E5 §13)

Adds the core map-management messages: setup send/request (F1-F4),
transmit inquire/grant (F5/F6), data send in row format (F7/F8), and
the one-way error report (F19).  Reference points (REFP) are an
external struct shared across F1 and F4.

The alternative data encodings — array format (F9/F10), coordinate
format (F11/F12), and the corresponding request pairs (F13-F18) —
are scope-deferred.  They're mechanical YAML edits once a tool needs
them; the codec already handles the underlying BINARY/list shapes.

Three new ack enums: MapSetupAck (SDACK), MapTransmitGrant (GRANT),
MapDataAck (MAPER).  No state machine yet — maps are a data exchange,
not a lifecycle.

secsgem-py ships S12F0-F19 as a single block; this commit covers the
practically-used subset and matches their wire shapes where they
overlap.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-07 21:15:33 +02:00
parent fafbd2abd2
commit ec478ac9cb
4 changed files with 273 additions and 0 deletions
+157
View File
@@ -1089,6 +1089,163 @@ messages:
builder: s10f6_terminal_display_multi_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: TerminalAck, param: ack}
# =====================================================================
# S12 — Wafer Maps (E5 §13).
#
# IDTYP discriminates the kind of identifier carried by MID:
# 0 wafer ID, 1 substrate ID, 2 lot+slot, 3 design ID.
# MAPFT selects the data-payload format:
# 0 row format (F7/F8), 1 array format (F9/F10), 2 coordinate (F11/F12).
# Reference points are <L,2 RPX RPY> pairs (I4 coordinates).
#
# This first pass covers the setup + transmit-inquire + row-format data
# + error fan; the alternative-encoding pairs (F9/F10 array, F11/F12
# coord, F13-F18 corresponding requests) are scope-deferred — they're
# mechanical YAML edits once a tool needs them.
# =====================================================================
# S12F1 / F2 — Map Setup Data Send.
- id: S12F1
stream: 12
function: 1
w: true
builder: s12f1_map_setup_send
parser: parse_s12f1
body:
kind: list
struct_name: MapSetupData
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: fnloc, shape: {kind: scalar, item_type: U2}}
- {name: ffrot, shape: {kind: scalar, item_type: U2}}
- {name: orloc, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: rpsel, shape: {kind: scalar, item_type: U1}}
- name: refp
shape:
kind: list_of
element:
kind: list
struct_name: ReferencePoint
external_struct: true
fields:
- {name: x, shape: {kind: scalar, item_type: I4}}
- {name: y, shape: {kind: scalar, item_type: I4}}
- name: dutms
shape: {kind: list_of, element: {kind: scalar, item_type: ASCII}}
- id: S12F2
stream: 12
function: 2
builder: s12f2_map_setup_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: MapSetupAck, param: sdack}
# S12F3 / F4 — Map Setup Data Request.
- id: S12F3
stream: 12
function: 3
w: true
builder: s12f3_map_setup_request
parser: parse_s12f3
body:
kind: list
struct_name: MapSetupRequest
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: mapft, shape: {kind: scalar, item_type: BINARY_BYTE}}
- id: S12F4
stream: 12
function: 4
builder: s12f4_map_setup_reply
parser: parse_s12f4
body:
kind: list
struct_name: MapSetupReply
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: fnloc, shape: {kind: scalar, item_type: U2}}
- {name: orloc, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: rpsel, shape: {kind: scalar, item_type: U1}}
- name: refp
shape:
kind: list_of
element:
kind: list
struct_name: ReferencePoint
external_struct: true
fields:
- {name: x, shape: {kind: scalar, item_type: I4}}
- {name: y, shape: {kind: scalar, item_type: I4}}
- name: dutms
shape: {kind: list_of, element: {kind: scalar, item_type: ASCII}}
- {name: xdies, shape: {kind: scalar, item_type: U2}}
- {name: ydies, shape: {kind: scalar, item_type: U2}}
# S12F5 / F6 — Map Transmit Inquire / Grant. Equipment asks the host
# for permission to send a map (MAPFT specifies the format, MLCL is
# the predicted data length in die units).
- id: S12F5
stream: 12
function: 5
w: true
builder: s12f5_map_transmit_inquire
parser: parse_s12f5
body:
kind: list
struct_name: MapTransmitInquire
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: mapft, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: mlcl, shape: {kind: scalar, item_type: U4}}
- id: S12F6
stream: 12
function: 6
builder: s12f6_map_transmit_grant
body: {kind: scalar, item_type: BINARY_BYTE, enum: MapTransmitGrant, param: grant}
# S12F7 / F8 — Map Data Send (row format, MAPFT=0). Each row of the
# map is one BINARY blob of packed bin codes; the outer list orders
# rows top-to-bottom relative to ORLOC.
- id: S12F7
stream: 12
function: 7
w: true
builder: s12f7_map_data_send_row
parser: parse_s12f7
body:
kind: list
struct_name: MapDataRow
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- name: rows
shape: {kind: list_of, element: {kind: scalar, item_type: BINARY}}
- id: S12F8
stream: 12
function: 8
builder: s12f8_map_data_send_row_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: MapDataAck, param: maper}
# S12F19 — Map Error Send. Equipment reports a non-recoverable map
# error (e.g. format mismatch, oversize payload). One-way (no reply).
- id: S12F19
stream: 12
function: 19
builder: s12f19_map_error_send
parser: parse_s12f19
body:
kind: list
struct_name: MapError
fields:
- {name: mapercd, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: errtext, shape: {kind: scalar, item_type: ASCII}}
# =====================================================================
# S14 — Object services (E94 ControlJob create/delete).
#