# USB control-transfer FSM semantic one-step benchmark
# Abstract endpoint-zero control engine.
#
# Legal states:
# 0000 IDLE, 0001 SETUP_RX, 0010 SETUP_DECODE, 0011 DATA_IN_LOAD,
# 0100 DATA_IN, 0101 DATA_OUT, 0110 STATUS_IN, 0111 STATUS_OUT,
# 1000 APPLY, 1001 STALL, 1010 DONE, 1011 ERROR, 1100 WAIT_SETUP.
# 1101..1111 unused/unreachable.
#
# Omitted state/event combinations are intentionally unspecified.
.i 17
.o 21
.ilb state3 state2 state1 state0 dir_in has_data setup_token in_token out_token packet_done req_supported req_dir_in req_has_data data_ready out_data_valid host_ack short_packet
.ob next_state3 next_state2 next_state1 next_state0 next_dir_in next_has_data arm_setup_rx latch_setup decode_request arm_data_in arm_data_out load_in_data commit_out_data arm_status_in arm_status_out apply_request send_stall transfer_done protocol_error start_control clear_context
.type fr
.p 43

# IDLE no SETUP
0000--0---------- 000000000000000000001
# IDLE SETUP token
0000--1---------- 000100100000000000010
# SETUP_RX receive
0001000--0------- 000100100000000000000
# SETUP_RX packet complete
0001000--1------- 001000011000000000000
# SETUP_RX restarted by SETUP
0001001---------- 000100100000000000011
# Unsupported request
0010------0------ 100100000000000010000
# Supported IN data request
0010------111---- 001111000000000000000
# Supported OUT data request
0010------101---- 010101000010000000000
# Supported no-data host-to-device request
0010------100---- 011000000000010000000
# Supported no-data device-to-host request
0010------110---- 011110000000001000000
# DATA_IN_LOAD new SETUP abort
0011111---------- 000100100000000000011
# DATA_IN_LOAD wait data
0011110------0--- 001111000000000000000
# DATA_IN_LOAD ready
0011110------1--- 010011000101000000000
# DATA_IN new SETUP abort
0100111---------- 000100100000000000011
# DATA_IN wait
01001100-0------- 010011000100000000000
# DATA_IN token active
01001101-0------- 010011000100000000000
# DATA_IN final packet ACK
0100110--1-----11 011111000000001000000
# DATA_IN more data
0100110--1-----10 001111000000000000000
# DATA_IN retry after no ACK
0100110--1-----0- 010011000100000000000
# DATA_OUT new SETUP abort
0101011---------- 000100100000000000011
# DATA_OUT wait
0101010-00------- 010101000010000000000
# DATA_OUT token active
0101010-10------- 010101000010000000000
# DATA_OUT invalid packet
0101010--1----0-- 101101000000000000100
# DATA_OUT final packet
0101010--1----1-1 011001000000110000000
# DATA_OUT more packets
0101010--1----1-0 010101000010100000000
# STATUS_IN new SETUP abort
0110--1---------- 000100100000000000011
# STATUS_IN wait
0110--00-0------- 011000000000010000000
# STATUS_IN token
0110--01-0------- 011000000000010000000
# STATUS_IN ACK complete
0110--0--1-----1- 100000000000000000000
# STATUS_IN retry
0110--0--1-----0- 011000000000010000000
# STATUS_OUT new SETUP abort
0111--1---------- 000100100000000000011
# STATUS_OUT wait
0111--0-00------- 011100000000001000000
# STATUS_OUT token
0111--0-10------- 011100000000001000000
# STATUS_OUT zero-length packet complete
0111--0--1----1-- 100000000000000000000
# STATUS_OUT invalid packet
0111--0--1----0-- 101100000000000000100
# APPLY new SETUP
1000--1---------- 000100100000000000011
# APPLY request
1000--0---------- 101000000000000101000
# STALL cleared by new SETUP
1001--1---------- 000100100000000000011
# STALL wait for new SETUP
1001--0---------- 110000000000000010000
# WAIT_SETUP hold
1100--0---------- 110000000000000000000
# WAIT_SETUP new SETUP
1100--1---------- 000100100000000000011
# DONE pulse
1010------------- 000000000000000001001
# ERROR pulse
1011------------- 110000000000000000101

.e
