Hardware/software co-design: state-of-the-art and future directions