Svc/FpySequencer/docs/directives.md
bool type is encoded as a single byte: FW_SERIALIZE_TRUE_VALUE (0xFF) for true and FW_SERIALIZE_FALSE_VALUE (0x00) for false.Sleeps for a relative duration from the current time.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| useconds | U32 | stack | Wait time in microseconds (must be less than a second) |
| seconds | U32 | stack | Wait time in seconds |
| Stack Result Type | Description |
|---|---|
| N/A |
Requirement: FPY-SEQ-007
Sleeps until an absolute time.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| useconds | U32 | stack | Microseconds |
| seconds | U32 | stack | Seconds |
| time_context | FwTimeContextStoreType | stack | Time context (user defined value, unused by Fpy) |
| time_base | FwTimeBaseStoreType | stack | Time base |
| Stack Result Type | Description |
|---|---|
| N/A |
Requirement: FPY-SEQ-008
Sets the index of the next directive to execute.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| dir_idx | U32 | hardcoded | The statement index to execute next |
| Stack Result Type | Description |
|---|---|
| N/A |
Requirement: FPY-SEQ-017
Pops a byte off the stack. If the byte is not 0, proceed to the next directive, otherwise goto a hardcoded directive index.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| false_goto_dir_index | U32 | hardcoded | Directive index to jump to if false |
| condition | bool | stack | Condition to evaluate |
| Stack Result Type | Description |
|---|---|
| N/A |
Requirement: FPY-SEQ-001
Does nothing.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| N/A |
| Stack Result Type | Description |
|---|---|
| N/A |
Requirement: FPY-SEQ-018
Pushes a telemetry value buffer to the stack.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| chan_id | U32 | hardcoded | the tlm channel id to get the time of |
| Stack Result Type | Description |
|---|---|
| bytes | The raw bytes of the telemetry value buffer |
Requirement: FPY-SEQ-003
Pushes a parameter buffer to the stack.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| prm_id | U32 | hardcoded | the param id to get the value of |
| Stack Result Type | Description |
|---|---|
| bytes | The raw bytes of the parameter buffer |
Requirement: FPY-SEQ-004
Runs a command with a constant opcode and a constant byte array of arguments.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| cmd_opcode | U32 | hardcoded | Command opcode |
| args | bytes | hardcoded | Command arguments |
| Stack Result Type | Description |
|---|---|
| Fw.CmdResponse | The CmdResponse that the command returned |
Requirement: FPY-SEQ-007, FPY-SEQ-008
Performs an or between two booleans, pushes result to stack.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | bool | stack | Right operand |
| lhs | bool | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Performs an and between two booleans, pushes result to stack.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | bool | stack | Right operand |
| lhs | bool | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Compares two integers for equality. If equal, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE. Doesn't differentiate between signed and unsigned.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | U64 | stack | Right operand |
| lhs | U64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Compares two integers for inequality. If not equal, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE. Doesn't differentiate between signed and unsigned.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | U64 | stack | Right operand |
| lhs | U64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Performs an unsigned less than comparison on two unsigned integers. If the second < first, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | U64 | stack | Right operand |
| lhs | U64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Performs an unsigned less than or equal to comparison on two unsigned integers. If the second <= first, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | U64 | stack | Right operand |
| lhs | U64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Performs an unsigned greater than comparison on two unsigned integers. If the second > first, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | U64 | stack | Right operand |
| lhs | U64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Performs an unsigned greater than or equal to comparison on two unsigned integers. If the second >= first, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | U64 | stack | Right operand |
| lhs | U64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Performs a signed less than comparison on two signed integers. If the second < first, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | I64 | stack | Right operand |
| lhs | I64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Performs a signed less than or equal to comparison on two signed integers. If the second <= first, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | I64 | stack | Right operand |
| lhs | I64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Performs a signed greater than comparison on two signed integers. If the second > first, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | I64 | stack | Right operand |
| lhs | I64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Performs a signed greater than or equal to comparison on two signed integers. If the second >= first, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | I64 | stack | Right operand |
| lhs | I64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Compares two floats for equality, pushes result to stack. If neither is NaN and they are otherwise equal, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE. Infinity is handled consistent with C++.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | F64 | stack | Right operand |
| lhs | F64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Compares two floats for inequality, pushes result to stack. If either is NaN or they are not equal, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE. Infinity is handled consistent with C++.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | F64 | stack | Right operand |
| lhs | F64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Performs a less than comparison on two floats, pushes result to stack. If neither is NaN and the second < first, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE. Infinity is handled consistent with C++.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | F64 | stack | Right operand |
| lhs | F64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Performs a less than or equal to comparison on two floats, pushes result to stack. If neither is NaN and the second <= first, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE. Infinity is handled consistent with C++.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | F64 | stack | Right operand |
| lhs | F64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Performs a greater than comparison on two floats, pushes result to stack. If neither is NaN and the second > first, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE. Infinity is handled consistent with C++.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | F64 | stack | Right operand |
| lhs | F64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Performs a greater than or equal to comparison on two floats, pushes result to stack. If neither is NaN and the second >= first, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE. Infinity is handled consistent with C++.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | F64 | stack | Right operand |
| lhs | F64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Performs a boolean not operation on a boolean. If the operand is FW_SERIALIZE_FALSE_VALUE, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | bool | stack | Value to negate |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-002
Converts an F64 to a signed I64 with saturating semantics (llvm.fptosi.sat, wasm i64.trunc_sat_f64_s, Rust as), pushes result to stack. In-range values truncate toward zero; NaN converts to 0; values above I64 max clamp to I64 max and values below I64 min clamp to I64 min. Never raises an error.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | F64 | stack | Float to convert |
| Stack Result Type | Description |
|---|---|
| I64 | The result |
Requirement: FPY-SEQ-015
Converts an F64 to an unsigned U64 with saturating semantics (llvm.fptoui.sat, wasm i64.trunc_sat_f64_u, Rust as), pushes result to stack. In-range values truncate toward zero; NaN converts to 0; negative values clamp to 0 and values at or above 2**64 clamp to U64 max. Never raises an error.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | F64 | stack | Float to convert |
| Stack Result Type | Description |
|---|---|
| U64 | The result |
Requirement: FPY-SEQ-015
Converts a signed integer to a float, pushes result to stack.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | I64 | stack | Integer to convert |
| Stack Result Type | Description |
|---|---|
| F64 | The result |
Requirement: FPY-SEQ-015
Converts an unsigned integer to a float, pushes result to stack.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | U64 | stack | Integer to convert |
| Stack Result Type | Description |
|---|---|
| F64 | The result |
Requirement: FPY-SEQ-015
Performs integer addition, pushes result to stack. Integers are handled with 2's complement representation.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | U64 | stack | Right operand |
| lhs | U64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| U64 | The result |
Requirement: FPY-SEQ-002
Performs integer subtraction, pushes result to stack. Integers are handled with 2's complement representation.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | U64 | stack | Right operand |
| lhs | U64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| U64 | The result |
Requirement: FPY-SEQ-002
Performs integer multiplication, pushes result to stack. Integers are handled with 2's complement representation.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | U64 | stack | Right operand |
| lhs | U64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| U64 | The result |
Requirement: FPY-SEQ-002
Performs unsigned integer division, pushes result to stack. A divisor of 0 will result in DOMAIN_ERROR.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | U64 | stack | Right operand |
| lhs | U64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| U64 | The result |
Requirement: FPY-SEQ-002
Performs signed integer division floored toward negative infinity, pushes result to stack. A divisor of 0 will result in DOMAIN_ERROR. Dividing I64 min by -1 overflows the result type (the true quotient 2**63 is not representable) and results in ARITHMETIC_OVERFLOW.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | I64 | stack | Right operand |
| lhs | I64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| I64 | The result |
Requirement: FPY-SEQ-002
Performs unsigned integer modulo, pushes result to stack. A 0 divisor (rhs) will result in DOMAIN_ERROR.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | U64 | stack | Right operand |
| lhs | U64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| U64 | The result |
Requirement: FPY-SEQ-002
Performs signed integer modulo, pushes result to stack. A 0 divisor (rhs) will result in DOMAIN_ERROR. Taking the minimum I64 value modulo -1 yields 0, the mathematical remainder (matching wasm i64.rem_s).
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | I64 | stack | Right operand |
| lhs | I64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| I64 | The result |
Requirement: FPY-SEQ-002
Performs float addition, pushes result to stack. NaN, and infinity are handled consistently with C++ addition.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | F64 | stack | Right operand |
| lhs | F64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| F64 | The result |
Requirement: FPY-SEQ-002
Performs float subtraction, pushes result to stack. NaN, and infinity are handled consistently with C++ subtraction.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | F64 | stack | Right operand |
| lhs | F64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| F64 | The result |
Requirement: FPY-SEQ-002
Performs float multiplication, pushes result to stack. NaN, and infinity are handled consistently with C++ multiplication.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | F64 | stack | Right operand |
| lhs | F64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| F64 | The result |
Requirement: FPY-SEQ-002
Performs IEEE 754 float division, pushes result to stack. Division by zero produces an infinity whose sign is the XOR of the operand signs, except that a zero or NaN dividend produces NaN.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | F64 | stack | Right operand |
| lhs | F64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| F64 | The result |
Requirement: FPY-SEQ-002
Performs float exponentiation (C pow semantics), pushes result to stack. A domain error (negative base with a non-integer exponent) yields NaN; overflow of the F64 range yields an infinity with the sign of the true result; a zero base with a negative exponent yields an infinity (pole).
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| exp | F64 | stack | Exponent value |
| base | F64 | stack | Base value |
| Stack Result Type | Description |
|---|---|
| F64 | The result |
Requirement: FPY-SEQ-002
Performs float logarithm, pushes result to stack. Negatives yield a DOMAIN_ERROR, NaN and infinity values are handled consistently with C++ std::log.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | F64 | stack | Value for logarithm |
| Stack Result Type | Description |
|---|---|
| F64 | The result |
Requirement: FPY-SEQ-002
Performs float modulo with Python's floored semantics, pushes result to stack. Computed as the exact truncated remainder (frem, i.e. std::fmod) plus at most one addition of the divisor when the remainder and divisor have differing signs; an exact-multiple result is a zero carrying the divisor's sign. A 0 divisor (rhs) yields a NaN result, not an error. A NaN operand or an infinite dividend yields NaN.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| rhs | F64 | stack | Right operand |
| lhs | F64 | stack | Left operand |
| Stack Result Type | Description |
|---|---|
| F64 | The result |
Requirement: FPY-SEQ-002
Truncates a 64-bit float to a 32-bit float (IEEE round-to-nearest demote), pushes result to stack. A finite value beyond the F32 range rounds to +-inf.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | F64 | stack | Value to truncate |
| Stack Result Type | Description |
|---|---|
| F32 | The result |
Requirement: FPY-SEQ-002
Extends a 32-bit float to a 64-bit float, pushes result to stack.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | F32 | stack | Float to extend |
| Stack Result Type | Description |
|---|---|
| F64 | The result |
Requirement: FPY-SEQ-002
Sign-extends an 8-bit integer to a 64-bit integer, pushes result to stack. Integers are handled with 2's complement representation.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | U8 | stack | Value to extend |
| Stack Result Type | Description |
|---|---|
| U64 | The result |
Requirement: FPY-SEQ-015
Sign-extends a 16-bit integer to a 64-bit integer, pushes result to stack. Integers are handled with 2's complement representation.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | U16 | stack | Value to extend |
| Stack Result Type | Description |
|---|---|
| U64 | The result |
Requirement: FPY-SEQ-015
Sign-extends a 32-bit integer to a 64-bit integer, pushes result to stack. Integers are handled with 2's complement representation.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | U32 | stack | Value to extend |
| Stack Result Type | Description |
|---|---|
| U64 | The result |
Requirement: FPY-SEQ-015
Zero-extends an 8-bit integer to a 64-bit integer, pushes result to stack.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | U8 | stack | Value to extend |
| Stack Result Type | Description |
|---|---|
| U64 | The result |
Requirement: FPY-SEQ-015
Zero-extends a 16-bit integer to a 64-bit integer, pushes result to stack.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | U16 | stack | Value to extend |
| Stack Result Type | Description |
|---|---|
| U64 | The result |
Requirement: FPY-SEQ-015
Zero-extends a 32-bit integer to a 64-bit integer, pushes result to stack.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | U32 | stack | Value to extend |
| Stack Result Type | Description |
|---|---|
| U64 | The result |
Requirement: FPY-SEQ-015
Truncates a 64-bit integer to an 8-bit integer, pushes result to stack. Integers are handled with 2's complement representation.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | I64 | stack | Value to truncate |
| Stack Result Type | Description |
|---|---|
| U8 | The result |
Requirement: FPY-SEQ-015
Truncates a 64-bit integer to a 16-bit integer, pushes result to stack. Integers are handled with 2's complement representation.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | I64 | stack | Value to truncate |
| Stack Result Type | Description |
|---|---|
| I16 | The result |
Requirement: FPY-SEQ-015
Truncates a 64-bit integer to a 32-bit integer, pushes result to stack. Integers are handled with 2's complement representation.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | I64 | stack | Value to truncate |
| Stack Result Type | Description |
|---|---|
| I32 | The result |
Requirement: FPY-SEQ-015
Pops an I32 exit code off the stack. If the code == 0, end sequence as if it had finished nominally, otherwise exit the sequence and raise an event with the error code.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| exit_code | I32 | stack | 0 if should exit without error |
| Stack Result Type | Description |
|---|---|
| N/A |
Requirement: FPY-SEQ-016
Pushes a hard-coded count of 0x00-bytes to the stack.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| size | StackSizeType | hardcoded | Bytes to allocate |
| Stack Result Type | Description |
|---|---|
| bytes | A series of 0 bytes of length size |
Requirement: FPY-SEQ-009, FPY-SEQ-010
Stores a value to a local variable at a compile-time-known offset relative to the current stack frame.
Preconditions:
len(stack) >= sizestack_frame_start + lvar_offset >= 0stack_frame_start + lvar_offset + size <= len(stack)Semantics:
value be the top size bytes of the stack (big-endian, with the first byte at stack[len(stack) - size]).size bytes from the stack.value to stack[stack_frame_start + lvar_offset .. stack_frame_start + lvar_offset + size).Error Conditions:
len(stack) < size: STACK_ACCESS_OUT_OF_BOUNDSstack_frame_start + lvar_offset < 0: STACK_ACCESS_OUT_OF_BOUNDSstack_frame_start + lvar_offset + size > len(stack) (after pop): STACK_ACCESS_OUT_OF_BOUNDS| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| lvar_offset | I32 | hardcoded | Signed byte offset relative to stack_frame_start. Negative values access memory below the frame (e.g., function arguments). |
| size | StackSizeType | hardcoded | Number of bytes to store. |
| value | bytes | stack | The value to store (popped from stack top). |
Requirement: FPY-SEQ-009, FPY-SEQ-010
Loads a value from a local variable at a compile-time-known offset relative to the current stack frame, and pushes it to the stack.
Preconditions:
stack_frame_start + lvar_offset >= 0stack_frame_start + lvar_offset + size <= len(stack)len(stack) + size <= max_stack_sizeSemantics:
addr = stack_frame_start + lvar_offset.size bytes from stack[addr .. addr + size).Error Conditions:
stack_frame_start + lvar_offset < 0: STACK_ACCESS_OUT_OF_BOUNDSstack_frame_start + lvar_offset + size > len(stack): STACK_ACCESS_OUT_OF_BOUNDSlen(stack) + size > max_stack_size: STACK_OVERFLOW| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| lvar_offset | I32 | hardcoded | Signed byte offset relative to stack_frame_start. Negative values access memory below the frame (e.g., function arguments pushed before CALL). |
| size | StackSizeType | hardcoded | Number of bytes to load. |
| Stack Result Type | Description |
|---|---|
| bytes | The size bytes read from the local variable location. |
Requirement: FPY-SEQ-009, FPY-SEQ-010
Pushes a constant array of bytes to the stack.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| val | bytes | hardcoded | the byte array to push |
| Stack Result Type | Description |
|---|---|
| bytes | The byte array from the arg |
Requirement: FPY-SEQ-009, FPY-SEQ-010
Discards bytes from the top of the stack.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| size | StackSizeType | hardcoded | Bytes to discard |
Requirement: FPY-SEQ-009, FPY-SEQ-010
Pops 2x size bytes off the stack. Compares the first size bytes to the second size bytes with a byte-for-byte comparison. If equal, pushes FW_SERIALIZE_TRUE_VALUE to stack, otherwise FW_SERIALIZE_FALSE_VALUE.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| size | StackSizeType | hardcoded | Bytes to compare |
| Stack Result Type | Description |
|---|---|
| bool | The result |
Requirement: FPY-SEQ-019
Dispatches a command with arguments from the stack.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| args_size | StackSizeType | hardcoded | Size of command arguments |
| Stack Result Type | Description |
|---|---|
| Fw.CmdResponse | The CmdResponse that the command returned |
Requirement: FPY-SEQ-010
Gets a telemetry channel and pushes its value, and then its time, onto the stack.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| chan_id | U32 | hardcoded | the tlm channel id to get |
| Stack Result Type | Description |
|---|---|
| bytes | The raw bytes of the telemetry value buffer |
| Fw.Time | The time tag of the telemetry value |
Requirement: FPY-SEQ-010
Pushes the current time, from the timeCaller port, to the stack.
| Stack Result Type | Description |
|---|---|
| Fw.Time | The current time |
Requirement: FPY-SEQ-010
Pops an offset (StackSizeType) off the stack. Takes a hard-coded number of bytes from top of stack, and then inside of that a second array of hard-coded number of bytes. The second array is offset by the value previously popped off the stack, with offset 0 meaning the second array starts furthest down the stack. Leaves only the second array of bytes, deleting the surrounding bytes.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| parent_size | StackSizeType | hardcoded | Size of the struct |
| member_size | StackSizeType | hardcoded | Size of the field |
| offset | StackSizeType | stack | Offset of the field in the struct |
| Stack Result Type | Description |
|---|---|
| bytes | The raw bytes of the field |
Requirement: FPY-SEQ-019
Pops a StackSizeType offset off the stack, then a StackSizeType byteCount. Let top be the top of the stack. Takes the region starting at top - offset - byteCount and going to top - offset, and pushes this region to the top of the stack.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| offset | StackSizeType | stack | Offset from top at which to peek |
| byteCount | StackSizeType | stack | Number of bytes to peek at, starting at offset, and going downwards in the stack |
| Stack Result Type | Description |
|---|---|
| bytes | The peeked bytes |
Requirement: FPY-SEQ-009
Stores a value to a local variable at a runtime-determined offset relative to the current stack frame.
Preconditions:
len(stack) >= size + sizeof(I32) (value bytes + offset)stack_frame_start + lvar_offset >= 0stack_frame_start + lvar_offset + size <= len(stack)Semantics:
lvar_offset from the stack (big-endian).value be the top size bytes of the remaining stack.size bytes from the stack.addr = stack_frame_start + lvar_offset.value to stack[addr .. addr + size).Error Conditions:
len(stack) < size + sizeof(I32): STACK_ACCESS_OUT_OF_BOUNDSstack_frame_start + lvar_offset < 0: STACK_ACCESS_OUT_OF_BOUNDSstack_frame_start + lvar_offset + size > len(stack) (after popping offset, before popping value): STACK_ACCESS_OUT_OF_BOUNDS| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| size | StackSizeType | hardcoded | Number of bytes to store. |
| lvar_offset | I32 | stack | Signed byte offset relative to stack_frame_start. |
| value | bytes | stack | The value to store (below the offset on stack). |
Requirement: FPY-SEQ-009
Performs a function call. Pops the target directive index from the stack, saves the return address and current frame pointer to the stack, then transfers control to the target.
Preconditions:
len(stack) >= sizeof(U32) (for target address)len(stack) + sizeof(U32) + sizeof(StackSizeType) <= max_stack_size (space for return address and frame pointer)0 <= target <= statement_count (validated before jump)Semantics (in order):
target from the stack (big-endian).return_addr = next_dir_idx (the index of the instruction that would execute after this CALL).next_dir_idx = target.return_addr as a U32 (big-endian) to the stack.stack_frame_start as a StackSizeType (big-endian) to the stack.stack_frame_start = len(stack) (the new frame begins immediately after the saved frame pointer).Stack Layout After CALL:
[... function arguments ...][return_addr (sizeof(U32) bytes)][saved_frame_ptr (sizeof(StackSizeType) bytes)]
^
stack_frame_start ────┘
Error Conditions:
len(stack) < sizeof(U32): STACK_ACCESS_OUT_OF_BOUNDSlen(stack) + sizeof(U32) + sizeof(StackSizeType) > max_stack_size: STACK_OVERFLOWtarget > statement_count: STMT_OUT_OF_BOUNDSNote: Function arguments must be pushed to the stack before the target address. The callee accesses arguments using negative lvar_offset values in LOAD_REL (e.g., lvar_offset = -(STACK_FRAME_HEADER_SIZE + arg_size) where STACK_FRAME_HEADER_SIZE = sizeof(U32) + sizeof(StackSizeType)).
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| target | U32 | stack | Directive index to jump to. |
Requirement: FPY-SEQ-009
Returns from a function call. Restores the caller's execution context and optionally returns a value.
Preconditions:
len(stack) >= return_val_size (for return value, if any)len(stack) >= stack_frame_start (sanity check)len(stack) >= sizeof(StackSizeType) + sizeof(U32) (saved frame pointer + return address)len(stack) >= call_args_size (to discard arguments)Semantics (in order):
return_val_size > 0: Copy the top return_val_size bytes from the stack as return_value.stack_frame_start (discard all local variables allocated in this frame).saved_frame_ptr (big-endian).return_addr (big-endian).stack_frame_start = saved_frame_ptr.next_dir_idx = return_addr.call_args_size bytes from the stack (the function arguments pushed by the caller).return_val_size > 0: Push return_value to the stack.Stack Transformation:
Before RETURN:
[... caller locals ...][args (call_args_size)][ret_addr (sizeof(U32))][saved_fp (sizeof(StackSizeType))][... callee locals ...][return_value]
^ ^
stack_frame_start stack top
After RETURN:
[... caller locals ...][return_value]
^ ^
stack_frame_start (restored) stack top
Error Conditions:
len(stack) < return_val_size: STACK_ACCESS_OUT_OF_BOUNDSstack_frame_start > len(stack): FRAME_START_OUT_OF_BOUNDS (corrupt frame)< sizeof(StackSizeType) + sizeof(U32): STACK_ACCESS_OUT_OF_BOUNDS< call_args_size: STACK_ACCESS_OUT_OF_BOUNDS| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| return_val_size | StackSizeType | hardcoded | Size of return value in bytes. Use 0 for void functions. |
| call_args_size | StackSizeType | hardcoded | Total size of function arguments in bytes. This must match the bytes pushed by the caller before CALL. |
| Stack Result Type | Description |
|---|---|
| bytes | The return value (only if return_val_size > 0). |
Requirement: FPY-SEQ-009
Loads a value from an absolute address in the stack (used for global variables), and pushes it to the stack.
Preconditions:
global_offset + size <= len(stack)len(stack) + size <= max_stack_sizeSemantics:
size bytes from stack[global_offset .. global_offset + size).Error Conditions:
global_offset + size > len(stack): STACK_ACCESS_OUT_OF_BOUNDSlen(stack) + size > max_stack_size: STACK_OVERFLOW| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| global_offset | StackSizeType | hardcoded | Absolute byte offset from the start of the stack (index 0). |
| size | StackSizeType | hardcoded | Number of bytes to load. |
| Stack Result Type | Description |
|---|---|
| bytes | The size bytes read from the global variable location. |
Requirement: FPY-SEQ-009
Stores a value to an absolute address in the stack (used for global variables), with the offset determined at runtime.
Preconditions:
len(stack) >= size + sizeof(StackSizeType) (value bytes + offset)global_offset + size <= len(stack)Semantics:
global_offset from the stack (big-endian).value be the top size bytes of the remaining stack.size bytes from the stack.value to stack[global_offset .. global_offset + size).Error Conditions:
len(stack) < size + sizeof(StackSizeType): STACK_ACCESS_OUT_OF_BOUNDSglobal_offset + size > len(stack) (after popping offset, before popping value): STACK_ACCESS_OUT_OF_BOUNDS| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| size | StackSizeType | hardcoded | Number of bytes to store. |
| global_offset | StackSizeType | stack | Absolute byte offset from the start of the stack. |
| value | bytes | stack | The value to store (below the offset on stack). |
Requirement: FPY-SEQ-009
Stores a value to an absolute address in the stack (used for global variables), with a compile-time-known offset.
Preconditions:
len(stack) >= sizeglobal_offset + size <= len(stack)Semantics:
value be the top size bytes of the stack.size bytes from the stack.value to stack[global_offset .. global_offset + size).Error Conditions:
len(stack) < size: STACK_ACCESS_OUT_OF_BOUNDSglobal_offset + size > len(stack) (after pop): STACK_ACCESS_OUT_OF_BOUNDS| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| global_offset | StackSizeType | hardcoded | Absolute byte offset from the start of the stack. |
| size | StackSizeType | hardcoded | Number of bytes to store. |
| value | bytes | stack | The value to store (popped from stack top). |
Requirement: FPY-SEQ-009
Pops a message size, message, and severity from the stack and emits an F Prime event.
Preconditions:
len(stack) >= sizeof(StackSizeType) (to pop message_size)len(stack) >= message_size + sizeof(Fw.LogSeverity)Semantics:
StackSizeType from the stack — this is message_size.message_size bytes from the stack — this is the UTF-8 encoded message.Fw.LogSeverity (rep type U8) from the stack — this is the severity.Severity values:
| Value | FPP Severity |
|---|---|
| 1 | FATAL |
| 2 | WARNING_HI |
| 3 | WARNING_LO |
| 4 | COMMAND |
| 5 | ACTIVITY_HI |
| 6 | ACTIVITY_LO |
| 7 | DIAGNOSTIC |
Error Conditions:
len(stack) < sizeof(StackSizeType): STACK_UNDERFLOWlen(stack) < message_size + sizeof(Fw.LogSeverity) (after popping message_size): STACK_UNDERFLOWFw.LogSeverity value: INVALID_ARG| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| message_size | StackSizeType | stack | Number of bytes to pop for the message. |
| message | bytes | stack | UTF-8 encoded message string. |
| severity | Fw.LogSeverity | stack | The event severity level. |
Pops a U32 seed value from the stack and uses it to seed the sequencer's internal PRNG.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| seed | U32 | stack | Seed value used to initialize the PRNG |
| Stack Result Type | Description |
|---|---|
| N/A |
Pushes the next PRNG value to the stack.
If this is called without the seed being manually set beforehand, then the seed will be set based on the current time.
PUSH_RAND uses std::mt19937 from C++'s random library, a deterministic non-cryptographic PRNG. It is suitable for repeatable pseudo-random values, simulations, randomized sequencing behavior, or tests, but it does not qualify as a cryptographically secure pseudorandom number generator and is not suitable for cryptographic keys, secrets, authentication tokens, or security-sensitive randomness.
| Stack Result Type | Description |
|---|---|
| U32 | The next pseudorandom 32-bit value from the sequencer's internal PRNG |
Pops size bytes of serialized data from the stack and sends them to an external component via the sequencer's serialOut output port array.
Preconditions:
port_index < MAX_SERIAL_PORTS (from the Svc.Fpy.SerialPortIndex enum in FpySequencerCfg)serialOut[port_index] is connected to a target componentlen(stack) >= sizeSemantics:
size bytes from the stack.serialOut[port_index].Error Conditions:
port_index >= MAX_SERIAL_PORTS: SERIAL_PORT_INVALID_INDEXserialOut[port_index] is not connected: SERIAL_PORT_NOT_CONNECTEDlen(stack) < size: STACK_UNDERFLOW| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| port_index | FwIndexType | hardcoded | Index of the serialOut port array to use. |
| size | StackSizeType | hardcoded | Number of bytes to pop and send. |
| value | bytes | stack | Serialized data to send (popped from stack). |
Requirement: FPY-SEQ-019
Floors an F64 toward negative infinity (the IEEE 754 roundToIntegralTowardNegative operation), pushes result to stack. A zero, infinite, or NaN value passes through unchanged; the sign of a zero is preserved (-0.0 floors to -0.0). A NaN result is a quiet NaN; its sign and payload are unspecified. A value in (0, 1) floors to 0.0; a value in (-1, 0) floors to -1.0. Never raises an error. Used to lower float floor division (//).
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | F64 | stack | Value to floor |
| Stack Result Type | Description |
|---|---|
| F64 | The floored value |
Requirement: FPY-SEQ-002
Pops a signed I64, pushes its absolute value to the stack: the value itself if non-negative, its negation otherwise. The absolute value of I64 min (-2**63) is not representable in I64 and results in ARITHMETIC_OVERFLOW.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | I64 | stack | Value to take the absolute value of |
| Stack Result Type | Description |
|---|---|
| I64 | The absolute value |
Requirement: FPY-SEQ-002
Pops an F64, clears its sign bit, and pushes the result to the stack (the IEEE 754 abs operation, matching llvm.fabs and wasm's f64.abs). No bits other than the sign bit change: -0.0 becomes 0.0, -inf becomes inf, and a NaN keeps its payload and signaling bit. Never raises an error or floating-point exception.
| Arg Name | Arg Type | Source | Description |
|---|---|---|---|
| value | F64 | stack | Value to take the absolute value of |
| Stack Result Type | Description |
|---|---|
| F64 | The absolute value |
Requirement: FPY-SEQ-002