Skip to content

Instantly share code, notes, and snippets.

@0riginaln0
Created September 7, 2025 04:20
Show Gist options
  • Select an option

  • Save 0riginaln0/5f1417369bece80b4a1346c060e0954c to your computer and use it in GitHub Desktop.

Select an option

Save 0riginaln0/5f1417369bece80b4a1346c060e0954c to your computer and use it in GitHub Desktop.
Odin FSM example via Enumerated arrays
package main
import "core:fmt"
States :: enum {
initial,
state_1,
state_final,
}
Signals :: enum {
sign0,
sign1,
sign_N,
}
FSM_table := [States][Signals]States {
States.initial = {
Signals.sign0 = States.state_1,
Signals.sign1 = States.initial,
Signals.sign_N = States.state_1,
},
States.state_1 = {
Signals.sign0 = States.initial,
Signals.sign1 = States.state_1,
Signals.sign_N = States.state_final,
},
States.state_final = {
Signals.sign0 = States.initial,
Signals.sign1 = States.initial,
Signals.sign_N = States.initial,
},
}
main :: proc() {
// Function to transition states
transition :: proc(state: States, signal: Signals) -> States {
return FSM_table[state][signal]
}
// Example usage
current_state := States.initial
input_signal := Signals.sign0
next_state := transition(current_state, input_signal)
fmt.printf("Transition from %v with %v leads to %v\n", current_state, input_signal, next_state)
}
@0riginaln0
Copy link
Author

#include <stdio.h>

typedef enum {
    STATE_INITIAL,
    STATE_1,
    STATE_FINAL,
    NUM_STATES  // Helper for array dimensions
} States;

typedef enum {
    SIGNAL_0,
    SIGNAL_1,
    SIGNAL_N,
    NUM_SIGNALS  // Helper for array dimensions
} Signals;

// Transition table using enums as indices
const States FSM_table[NUM_STATES][NUM_SIGNALS] = {
    // Can write in this form
    [STATE_INITIAL][SIGNAL_0] = STATE_1,
    [STATE_INITIAL][SIGNAL_1] = STATE_INITIAL,
    [STATE_INITIAL][SIGNAL_N] = STATE_1,
    // And in this form
    [STATE_1] = {
        [SIGNAL_0] = STATE_INITIAL,
        [SIGNAL_1] = STATE_1,
        [SIGNAL_N] = STATE_FINAL,
    },
    [STATE_FINAL] = {
        [SIGNAL_0] = STATE_INITIAL,
        [SIGNAL_1] = STATE_INITIAL,
        [SIGNAL_N] = STATE_INITIAL,
    },
};

// Transition function
States transition(States state, Signals signal) {
    return FSM_table[state][signal];
}

// String representations for states
const char* state_names[] = {
    [STATE_INITIAL] = "initial",
    [STATE_1] = "state_1",
    [STATE_FINAL] = "state_final"
};

// String representations for signals
const char* signal_names[] = {
    [SIGNAL_0] = "sign0",
    [SIGNAL_1] = "sign1",
    [SIGNAL_N] = "sign_N"
};

int main() {
    States current_state = STATE_INITIAL;
    Signals input_signal = SIGNAL_0;
    States next_state = transition(current_state, input_signal);
    
    printf("Transition from %s with %s leads to %s\n", 
           state_names[current_state], 
           signal_names[input_signal], 
           state_names[next_state]);
    
    return 0;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment