A Formal Model for Microprocessor Caches