A self-timed interrupt controller: a case study in asynchronous micro-architecture design