@startuml

skinparam backgroundColor #EEEBDC

box "Application" #00C1DE
participant "main()" as app
end box

box "Tensorflow" #FF6B00
participant "TFLu" as tflu
participant "Ethos-U custom op" as custom
end box

box "Ethos-U driver" #95D600
participant "Driver" as driver
end box

box "Hardware" #FFC700
participant "Cortex-M" as cortexm
participant "Ethos-U" as ethosu
end box

app -> tflu++: Invoke()
    tflu -> custom++: Eval()
        custom -> driver++: ethosu_reserve_driver()
            loop Find and reserve driver
                driver -> app++: ethosu_mutex_lock()
                return

                driver -> driver: ethosu_find_and_reserve_driver()

                driver -> app++: ethosu_mutex_unlock()
                return

                alt Found free driver
                    note over driver
                        Return free driver
                    end note
                else No driver available
                    driver -> app++: ethosu_semaphore_take()
                        note over app
                            Block on semaphore
                        end note
                    return
                end
            end loop
        return

        custom -> driver++: ethosu_invoke()
            driver -\\ ethosu: Configure NPU and trigger inference

            driver -> driver++: wait_for_irq()
                note over driver
                    Driver sleeping waiting for IRQ
                end note

                ethosu -\\ cortexm: IRQ
                cortexm -\\ driver: ethosu_irq_handler()

                note over driver
                    Driver woken up by IRQ handler
                end note
            return
        return

        custom -> driver++: ethosu_release_driver()
            driver -> app++: ethosu_mutex_lock()
            return

            driver -> app++: ethosu_semaphore_give()
                note over app
                    Wake up threads blocking on the semaphore
                end note
            return

            driver -> app++: ethosu_mutex_unlock()
            return
        return
    return
return

@enduml
