Download fsl/include/FSLOps.td from Snapkitty/nvidia-stack: direct link, hf CLI and curl.
- Browser
- Download file 6.49 kB
-
https://huggingface.co/Snapkitty/nvidia-stack/resolve/main/fsl/include/FSLOps.td
- Command line
-
hf download hf://Snapkitty/nvidia-stack/fsl/include/FSLOps.td
-
curl -L -o FSLOps.td https://huggingface.co/Snapkitty/nvidia-stack/resolve/main/fsl/include/FSLOps.td
6.49 kB
| // ============================================================ | |
| // FSLOps.td — Operation definitions for the FSL dialect | |
| // ============================================================ | |
| // Covers: MambaStep, SelectiveMambaStep, OutputProjection, FSMTransition. | |
| // Hybrid continuous-discrete semantics. | |
| #ifndef FSL_OPS | |
| #define FSL_OPS | |
| include "FSLDialect.td" | |
| include "FSLTypes.td" | |
| include "mlir/Interfaces/SideEffectInterfaces.td" | |
| // ============================================================ | |
| // MambaStepOp — Basic SSM state transition | |
| // ============================================================ | |
| def FSL_MambaStepOp : FSL_Op<"mamba_step", [ | |
| NoMemoryEffect | |
| ]> { | |
| let summary = "Linear SSM state transition (fixed A, B)"; | |
| let description = [{ | |
| Executes one step of the state-space model recurrence: | |
| s_{t+1} = A * s_t + B * u_t | |
| This is the non-selective version where A and B are fixed | |
| matrices provided as explicit operands. The output is | |
| zeroed (output_projection is a separate op). | |
| Parameters from YAML: | |
| n = d_state = 16 (state dimension) | |
| m = d_model = 512 (model dimension) | |
| }]; | |
| let arguments = (ins | |
| FSL_StateVectorType:$state, // s_t ∈ R^n | |
| FSL_TokenVectorType:$input, // u_t ∈ R^m (convolved) | |
| AnyType:$matrix_a, // A ∈ R^{n×n} | |
| AnyType:$matrix_b // B ∈ R^{n×m} | |
| ); | |
| let results = (outs | |
| FSL_StateVectorType:$next_state, // s_{t+1} ∈ R^n | |
| FSL_TokenVectorType:$output // y_t = 0_m (placeholder) | |
| ); | |
| let assemblyFormat = [{ | |
| $state `,` $input `,` $matrix_a `,` $matrix_b | |
| attr-dict `:` functional-type(operands, results) | |
| }]; | |
| let hasVerifier = 1; | |
| } | |
| // ============================================================ | |
| // SelectiveMambaStepOp — Selective SSM (Mamba-2) | |
| // ============================================================ | |
| def FSL_SelectiveMambaStepOp : FSL_Op<"selective_mamba_step", [ | |
| NoMemoryEffect | |
| ]> { | |
| let summary = "Selective SSM state transition (Mamba-2 architecture)"; | |
| let description = [{ | |
| Executes one step of the selective state-space model: | |
| s_{t+1} = A * s_t + B * u_t | |
| where u_t is computed from the raw input via: | |
| 1. Depthwise convolution: z_t = Conv_{d_c}(x_t; W) | |
| 2. Split: z1 = z_t[:, :m/2], z2 = z_t[:, m/2:] | |
| 3. SiLU gating: u_t = z1 ⊙ silu(z2) | |
| A is diagonal: A = diag(-exp(A_log)) | |
| B is fixed (provided as full n×m matrix or low-rank factors) | |
| This implements the Mamba-2 selectivity mechanism where | |
| input-dependence flows through u_t, not through A/B. | |
| Parameters from YAML: | |
| n = d_state = 16 | |
| m = d_model = 512 | |
| d_c = d_conv = 4 | |
| }]; | |
| let arguments = (ins | |
| FSL_StateVectorType:$state, // s_t ∈ R^n | |
| FSL_TokenVectorType:$input, // x_t ∈ R^m (raw token) | |
| FSL_SSMMatricesType:$params // A_log, B, W_conv, V, U | |
| ); | |
| let results = (outs | |
| FSL_StateVectorType:$next_state, // s_{t+1} ∈ R^n | |
| FSL_TokenVectorType:$output // y_t = 0_m (placeholder) | |
| ); | |
| let assemblyFormat = [{ | |
| $state `,` $input `,` $params | |
| attr-dict `:` functional-type(operands, results) | |
| }]; | |
| let hasVerifier = 1; | |
| } | |
| // ============================================================ | |
| // OutputProjectionOp — Emit output from SSM state | |
| // ============================================================ | |
| def FSL_OutputProjectionOp : FSL_Op<"output_projection", [ | |
| NoMemoryEffect | |
| ]> { | |
| let summary = "Project SSM state to output token"; | |
| let description = [{ | |
| Projects the SSM state to an output token: | |
| y_t = C * s_t + D * u_t | |
| In Mamba-2, C and D are fixed matrices. This op is | |
| executed in the S1_EMIT state (per YAML FSM). | |
| Note: This op is separate from mamba_step to enable | |
| hybrid FSM semantics where emission is gated by | |
| discrete state transitions. | |
| }]; | |
| let arguments = (ins | |
| FSL_StateVectorType:$state, // s_t ∈ R^n | |
| FSL_TokenVectorType:$input, // u_t ∈ R^m (optional) | |
| AnyType:$matrix_c, // C ∈ R^{m×n} | |
| AnyType:$matrix_d // D ∈ R^{m×m} | |
| ); | |
| let results = (outs | |
| FSL_TokenVectorType:$output // y_t ∈ R^m | |
| ); | |
| let assemblyFormat = [{ | |
| $state `,` $input `,` $matrix_c `,` $matrix_d | |
| attr-dict `:` functional-type(operands, results) | |
| }]; | |
| let hasVerifier = 1; | |
| } | |
| // ============================================================ | |
| // FSMTransitionOp — Discrete state transition | |
| // ============================================================ | |
| def FSL_FSMTransitionOp : FSL_Op<"transition", [ | |
| NoMemoryEffect | |
| ]> { | |
| let summary = "Discrete FSM state transition (gated by condition)"; | |
| let description = [{ | |
| Evaluates a transition condition and updates the FSM state. | |
| The condition is a boolean flag derived from the SSM state: | |
| condition(s) = ||s||_2 > theta (threshold) | |
| condition(s) = scan_complete (external signal) | |
| If the condition is true, the FSM transitions from | |
| from_state to to_state. Otherwise, it stays in from_state. | |
| This enables hybrid continuous-discrete semantics: | |
| - Continuous: SSM state evolves via mamba_step | |
| - Discrete: FSM state gates which actions are executed | |
| }]; | |
| let arguments = (ins | |
| FSL_FSMStateType:$from_state, | |
| FSL_FSMStateType:$to_state, | |
| IntegerAttr<I1>:$condition // boolean flag | |
| ); | |
| let results = (outs | |
| FSL_FSMStateType:$new_state // updated FSM state | |
| ); | |
| let assemblyFormat = [{ | |
| $from_state `->` $to_state `if` $condition | |
| attr-dict `:` type($new_state) | |
| }]; | |
| } | |
| // ============================================================ | |
| // ScanCompleteOp — Generate scan_complete flag | |
| // ============================================================ | |
| def FSL_ScanCompleteOp : FSL_Op<"scan_complete", [ | |
| Pure | |
| ]> { | |
| let summary = "Check if SSM scan is complete"; | |
| let description = [{ | |
| Evaluates whether the SSM scan is complete based on | |
| the state vector. Returns a boolean flag. | |
| Common conditions: | |
| - ||s_t||_2 < epsilon (state converged) | |
| - t >= T_max (maximum timesteps reached) | |
| - External trigger (e.g., end-of-sequence token) | |
| }]; | |
| let arguments = (ins | |
| FSL_StateVectorType:$state | |
| ); | |
| let results = (outs | |
| I1:$is_complete | |
| ); | |
| let assemblyFormat = [{ | |
| $state attr-dict `:` type($is_complete) | |
| }]; | |
| } | |
| #endif // FSL_OPS | |