Hardware and software Co-design