# ACME-PVD-3000 — example data dictionary for a fictional Physical # Vapor Deposition tool. Designed to look like a real fab tool, not a # unit-test fixture. Read this alongside main.cpp to see how each # entry is wired to behaviour. # # Topology: # - One process chamber, single-wafer # - Four load ports, each accepting a 25-slot FOUP # - Three deposition recipes (Al / Ti / Cu) # # Real PVD tools have hundreds of SVIDs. This one ships 30 — enough # to demonstrate every wiring pattern (status, derived, setpoint, # event, alarm, recipe, host command) without burying the example. device: id: 0 model_name: "ACME-PVD-3000" software_rev: "1.4.2" equipment_type: "PVD" # E30 §6.10 — what the equipment self-reports to the host on S1F19. # CCODE values follow E30 Appendix A. capabilities: - {code: 1, name: "Establish Communications"} - {code: 2, name: "Dynamic Event Report Configuration"} - {code: 3, name: "Variable Data Collection"} - {code: 5, name: "Status Data Collection"} - {code: 6, name: "Alarm Management"} - {code: 7, name: "Remote Control"} - {code: 8, name: "Equipment Constants"} - {code: 9, name: "Process Program Management"} - {code: 11, name: "Equipment Terminal Services"} - {code: 12, name: "Clock"} - {code: 14, name: "Spooling"} - {code: 15, name: "Control (operator initiated)"} - {code: 40, name: "E40 Process Job Management"} - {code: 87, name: "E87 Carrier Management"} - {code: 90, name: "E90 Substrate Tracking"} - {code: 94, name: "E94 Control Job Management"} - {code: 116, name: "E116 Equipment Performance Tracking"} - {code: 148, name: "E148 Time Synchronization"} - {code: 157, name: "E157 Module Process Tracking"} # Status variables — read-only, host queries via S1F3. # main.cpp updates the sensor values on a poll loop. svids: # Mandatory framework SVIDs - {id: 1, name: ControlState, units: "", type: ASCII, value: ""} - {id: 2, name: Clock, units: "", type: ASCII, value: ""} - {id: 3, name: EventsEnabled, units: "", type: BOOLEAN, value: true} # Equipment-defined - {id: 10, name: ProcessChamberPressureTorr, units: "Torr", type: F4, value: 1.0e-7} - {id: 11, name: ProcessChamberTemperatureC, units: "C", type: F4, value: 23.5} - {id: 12, name: LoadlockPressureTorr, units: "Torr", type: F4, value: 760.0} - {id: 13, name: VacuumPumpRpm, units: "rpm", type: U4, value: 0} - {id: 20, name: SourcePowerWatts, units: "W", type: F4, value: 0.0} - {id: 21, name: TargetVoltageVolts, units: "V", type: F4, value: 0.0} - {id: 22, name: SubstrateBiasVolts, units: "V", type: F4, value: 0.0} - {id: 23, name: SourceTargetMaterial, units: "", type: ASCII, value: "None"} - {id: 30, name: ArgonFlowSccm, units: "sccm", type: F4, value: 0.0} - {id: 31, name: NitrogenFlowSccm, units: "sccm", type: F4, value: 0.0} - {id: 32, name: CoolingWaterFlowLpm, units: "L/min", type: F4, value: 12.5} - {id: 40, name: ChuckTemperatureC, units: "C", type: F4, value: 24.0} - {id: 41, name: ShieldTemperatureC, units: "C", type: F4, value: 24.0} - {id: 50, name: WafersProcessedTotal, units: "wafer", type: U4, value: 0} - {id: 51, name: WafersProcessedSinceCleanup, units: "wafer", type: U4, value: 0} - {id: 52, name: ChamberHoursSinceCleanup, units: "h", type: F4, value: 0.0} - {id: 53, name: ActiveRecipePpid, units: "", type: ASCII, value: ""} - {id: 54, name: RecipeStepName, units: "", type: ASCII, value: ""} - {id: 55, name: RecipeStepElapsedSec, units: "s", type: U4, value: 0} - {id: 60, name: LoadPort1Active, units: "", type: BOOLEAN, value: false} - {id: 61, name: LoadPort2Active, units: "", type: BOOLEAN, value: false} - {id: 62, name: LoadPort3Active, units: "", type: BOOLEAN, value: false} - {id: 63, name: LoadPort4Active, units: "", type: BOOLEAN, value: false} - {id: 70, name: EptStateName, units: "", type: ASCII, value: "Standby"} - {id: 71, name: ProductiveHoursTotal, units: "h", type: F4, value: 0.0} - {id: 72, name: UnscheduledDowntimeHours, units: "h", type: F4, value: 0.0} # Data variables — same shape as SVIDs but conceptually "intermediate # data" rather than equipment status. Reported via S1F21/F22. dvids: - {id: 200, name: LastCycleTimeSec, units: "s", type: F4, value: 0.0} - {id: 201, name: AverageCycleTimeSec, units: "s", type: F4, value: 0.0} - {id: 202, name: BatchYieldPercent, units: "%", type: F4, value: 0.0} - {id: 203, name: LastWaferProcessedId, units: "", type: ASCII, value: ""} - {id: 204, name: ProcessChamberLeakRate, units: "Torr/s", type: F4, value: 1.0e-9} # Equipment constants — host-settable parameters. S2F15 set, S2F13 read. ecids: - {id: 100, name: ChamberBasePressureSetpoint, units: "Torr", type: F4, value: 1.0e-7, min: "1.0e-9", max: "1.0e-5"} - {id: 101, name: ChamberTempSetpointC, units: "C", type: F4, value: 25.0, min: "15.0", max: "40.0"} - {id: 102, name: SourcePowerSetpointW, units: "W", type: F4, value: 1500.0, min: "0.0", max: "5000.0"} - {id: 103, name: T_CRA_Seconds, units: "s", type: U4, value: 30, min: "5", max: "120"} - {id: 104, name: T_DELAY_Seconds, units: "s", type: U4, value: 10, min: "5", max: "60"} - {id: 105, name: CleaningIntervalWafers, units: "wafer", type: U4, value: 500, min: "100", max: "2000"} - {id: 106, name: MaxRecipeRetries, units: "", type: U4, value: 3, min: "0", max: "10"} # Collection events. CEID → linked report binding happens at runtime # via S2F33/F35/F37; the equipment fires S6F11 on transitions through # main.cpp's event-emit hooks. ceids: # Control / lifecycle - {id: 100, name: ControlStateChanged} - {id: 200, name: AlarmSet} - {id: 201, name: AlarmCleared} # Process lifecycle - {id: 300, name: ProcessStarted} - {id: 301, name: ProcessCompleted} - {id: 302, name: ProcessAborted} - {id: 303, name: ProcessPaused} - {id: 304, name: ProcessResumed} - {id: 310, name: RecipeStepStarted} - {id: 311, name: RecipeStepCompleted} # Material movement - {id: 400, name: ControlJobExecuting} - {id: 401, name: ControlJobCompleted} - {id: 410, name: CarrierLoaded} - {id: 411, name: CarrierUnloaded} - {id: 420, name: SubstrateAtSource} - {id: 421, name: SubstrateInProcess} - {id: 422, name: SubstrateProcessed} # Equipment performance (E116) - {id: 500, name: EptEnteredProductive} - {id: 501, name: EptEnteredStandby} - {id: 502, name: EptEnteredEngineering} - {id: 503, name: EptEnteredUnscheduledDowntime} # Alarms. Categories follow E5 §10.3 ALCD lower-7 bitmap: # 0x01 PersonalSafety 0x02 EquipmentSafety 0x04 ParameterError # 0x08 ParameterWarning 0x10 Irrecoverable 0x20 EquipmentStatus # 0x40 Attention alarms: - {id: 1, text: "Chamber pressure high (above setpoint)", category: 0x04} - {id: 2, text: "Chamber pressure low (below setpoint)", category: 0x04} - {id: 3, text: "Chamber temperature out of range", category: 0x04} - {id: 4, text: "Source power loss during process", category: 0x12} # safety + error - {id: 5, text: "Cooling water flow loss", category: 0x02} # equip safety - {id: 6, text: "Vacuum pump failure", category: 0x12} - {id: 7, text: "Door open during process", category: 0x01} # personal safety - {id: 8, text: "Target end-of-life", category: 0x40} # attention - {id: 9, text: "Recipe step timeout", category: 0x08} # warning - {id: 10, text: "Cleaning interval exceeded (500 wafers)", category: 0x40} - {id: 11, text: "Load port 1 carrier mis-clocked", category: 0x20} - {id: 12, text: "Substrate scanner unavailable", category: 0x20} # Recipes. The body is a placeholder string in this example; real # tools would store binary recipe bundles (E42 formatted PP) here. # The recipe runner in main.cpp parses the body line-by-line. recipes: - id: "AL-METALLIZATION-V3" body: | STEP PUMPDOWN duration=120s target=1.0e-7 STEP HEAT-SUBSTRATE duration=60s target=300C STEP SOURCE-PREHEAT duration=30s power=500W STEP DEPOSIT-AL duration=180s power=2500W gas=Argon flow=50sccm STEP COOL duration=120s target=25C STEP VENT duration=60s target=760 END - id: "TI-BARRIER-V2" body: | STEP PUMPDOWN duration=120s target=1.0e-7 STEP HEAT-SUBSTRATE duration=60s target=350C STEP DEPOSIT-TI duration=90s power=1800W gas=Argon flow=40sccm STEP COOL duration=120s target=25C STEP VENT duration=60s target=760 END - id: "CU-SEED-V1" body: | STEP PUMPDOWN duration=120s target=1.0e-7 STEP HEAT-SUBSTRATE duration=60s target=250C STEP DEPOSIT-CU duration=240s power=3000W gas=Argon flow=60sccm STEP COOL duration=120s target=25C STEP VENT duration=60s target=760 END # Host commands. `emit_ceid` fires the named CEID after dispatch; # `set_alarm` sets an alarm. `force_spool` is the demo-only test hook. host_commands: - {name: START, ack: Accept, emit_ceid: 300} - {name: STOP, ack: Accept, emit_ceid: 301} - {name: PAUSE, ack: Accept, emit_ceid: 303} - {name: RESUME, ack: Accept, emit_ceid: 304} - {name: ABORT, ack: Accept, emit_ceid: 302} - {name: CLEAN_CHAMBER, ack: Accept} - {name: FAULT, ack: Accept, set_alarm: 4} # injected fault for demo - {name: SPOOL_ON, ack: Accept, force_spool: true} - {name: SPOOL_OFF, ack: Accept, force_spool: false} # Spool (E30 §6.22) — when the host disconnects, queue these streams # for later drain via S6F23. spool: max_size: 1000 spoolable_streams: [5, 6] # Auto-fire CEID 100 on every control-state change. emit_on_control_change: 100