The pilot introduced stable and transient states. Now use them as an engineering record: the requested state, retained bytes, missing responses and release conditions are separate facts. A name such as IM^D is useful only if those facts are defined.
The cold read miss already traces C0's GetS from X = 0 uncached (MSI): H reads memory, sends Data with S permission, and only that Data makes C0's copy usable. What that trace leaves implicit is the step before the request. C0 first allocates a miss record (an MSHR) and enters IS^D, and only then sends GetS. At that point C0 is IS^D / -, C1 is I / -, H is still U and memory = 0: no message has reached H, so H's entry does not change. The record survives until the grant is delivered.
Pending kind | Retained fact | Missing fact | Local restriction |
|---|---|---|---|
IS^D | Requester and line identity | Readable data and grant | No load or store to X. |
IM^D | Store intent and line identity | Current value and exclusive permission | No store before the grant. |
SM^D | Shared data, unless invalidated | Exclusive permission | Loads hit, stores stall. An Inv can remove the readable copy. |
MI^A (dirty eviction) | The dirty line in the WB entry | Put-Ack from H (H now holds the data) | Loads and stores to X stall. Do not free the WB entry early. |
In SM^D an incoming Inv removes the read rights but keeps the store intent: the line becomes IM^D. The Primer collects acks at the requester and so uses the names IM^AD and SM^AD. Do not mix the two conventions in one lesson.
Its own grant has not arrived and it has no usable copy. H's buffered value is not C0's permission. The pending record identifies the response and operation that must still complete.