NaR means "Not a Result". They primarily serve the role of traps in traditional architecures. The big difference is, they are speculable.
Belt values are read-only as long as the value exists. Unlike registers they are not reused for new values. This means when anything goes wrong in any operation this isn't indicated in some global state register, but a special value with special Metadata is stored in the scheduled belt location and sits there without causing any trouble.
Almost all operations in the architecture are speculative, which means when they encounter a NaR as a parameter, they just propagate it to the result.
Only when a non-speculative realizing operation encounters a NaR and would change global state with a NaR, usually a store or a branch or a call, then a fault or trap Event is raised. And Events go through handler tables as customary.
The one exception to this is the special None NaR, which is just quietly ignored, i.e. whenever a realizing operation encounters a None operand, it does nothing.
- None - usually explicitly created for data flow reasons, is ignored
- Address Overflow
- Bit Number Too Big - when a value of the bit count pseudo domain doesn't fit into the width of the other argument
- Floating Point Division By Zero
- Floating Point Inexact - IEEE 754 inexact
- Floating Point Invalid - IEEE 754 Invalid
- Floating Point Overflow - IEEE 754 Overflow
- Floating Point Underflow - IEEE 754 Underflow
- Index Out Of Range - when a value of the index count pseudo domain doesn't fit into the vector width of the other argument
- Integer Overflow
- Invalid Address
- Invalid Belt Operand - a new Belt frame usually has a few uninitialized values at the end, accessing them raises this
- Invalid MMIO Access
- Invalid Special Register
- Invalid This
- Mismatched Sizes
- Multipally Accepted Address
- Must Be Scalar
- Not Narrowable
- Not Widenable
- Null Pointer
- Pointer Overflow
- Unaccepted Address
- Undefined Value