@startuml

enum CoreTypes {
	+ const int HAL_CORE_USER
	+ const int HAL_CORE_RMAN
	+ const int HAL_CORE_SYSTEM
}

interface CoreInterface {
	+ const int HAL_NR_CORES_USER
	+ const int HAL_NR_CORES_RMAN
	+ const int HAL_NR_CORES_SYSTEM
	+ const int HAL_NR_CLUSTERS
	+ int hal_get_cluster_id(void)
	+ int hal_get_core_id(void)
	+ int hal_get_core_type(void)
	+ int hal_get_num_cores(void)
	+ int hal_get_core_freq(void)
}

interface MailboxInterface {
	+ const int HAL_NR_MAILBOX
	+ const int HAL_MAILBOX_MSG_SIZE
	+ int hal_mailbox_create(int)
	+ int hal_mailbox_open(int)
	+ int hal_mailbox_unlink(int)
	+ int hal_mailbox_close(int)
	+ size_t hal_mailbox_write(int, const void *, size_t)
	+ size_t hal_mailbox_read(int, void *, size_t)
}

interface SyncInterface {
	+ const int HAL_NR_SYNC
	+ const int HAL_SYNC_ONE_TO_ALL
	+ const int HAL_SYNC_ALL_TO_ONE
	+ int hal_sync_create(const int *, int, int)
	+ int hal_sync_open(const int *, int, int)
	+ int hal_sync_wait(int)
	+ int hal_sync_signal(int)
	+ int hal_sync_close(int)
	+ int hal_sync_unlink(int)
}

interface PortalInterface {
	class portal_t
	+ int hal_portal_allow(portal_t *, int)
	+ int hal_portal_create(portal_t *, int)
	+ int hal_portal_open(portal_t *, int)
	+ int hal_portal_read(portal_t *, void *, size_t)
	+ int hal_portal_write(portal_t *, const void *, size_t)
	+ int hal_portal_close(portal_t *)
	+ int hal_portal_unlink(portal_t *)
}

interface NoCInterface {
	+ const int HAL_NR_NOC_NODES
	+ const int hal_noc_nodes[HAL_NR_NOC_NODES]
	+ int hal_get_node_id(void)
}

interface SetupInterface {
	+ void hal_setup(void)
	+ void hal_cleanup(void)
}

CoreInterface ..> CoreTypes : <<use>>

@enduml
