Its main purpose is to make juypter notebooks device agnostic and hence device driver’s command agnostic. This is done by passing the Qcodes drivers into generalized wrapper present in the HAL folder of the package. The function in these HAL modules are used to control devices instead of Qcodes drivers. A direct advantage of this is that change of vendor of insturments such from Aglient to Rohde & Schwarz, should not require any change in the jupyter notebook.
Overall , there are 4 different type of HALs:
The GEN
type is more of a tempelate, and has been inherited and modified for other devices which do not fit the remaining category, such as switch, voltage sources etc.
Each HAL object is directly made from package object and Qcodes driver as mentioned in QuickStart Guide , precisely here. There can additional requirements or arguments needed by the HAL which are described in detail at their respective pages along with the functions and parameters they provide.
This completes the basic description about HALs. Inorder to customize and use their functions it is recommended to read each of pages.