Principles of Asynchronous Circuit Design