Digital Logic Design: A Rigorous Approach