Source: http://www.lingref.com/cpp/hls/14/paper2654.pdf