A memory model for a shared memory, multiprocessor commonly and often implicitly assumed by programmers is that of sequenfiaf consisfency. This model guaranteest hat all memory accessesw ill appear to execute atomically and in program order. An alternative model, weak ordering, offers greater performance potential. Weak ordering was first defined by Dubois, Scheurich and Briggs in terms of a set of rules for hardware that have to be made visible to software. The central hypothesis of this work is that programmers prefer to reason about sequentially consistent memory, rather than having to think about weaker memory. or even write buffers. Following this hypothesis, we re-define weak ordering as a contract between software and hardware. By this contract. software agrees to some formally specified constraints, and hardware agrees to appear sequentially consistent to at least the software that obeys those constraints. We illusuate the power of the new definition with a set of software constraints that forbid data races and an implementation for cache-coherent systems that is not allowed by the old definition.