Source: https://www.lingref.com/cpp/hls/12/paper2402.pdf