Towards Closing The Programmability-Efficiency Gap Using Software-Defined Hardware