1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
//! The Binding bus & its value-tag registry.
//!
//! The transcript DAG is *evaluated* by propagating a typed value up
//! from each node to its parents over a single **self-referential**
//! LogUp bus: [`BusId::Binding`]. A node-evaluating chiplet *provides*
//! one [`BindingMsg`] per node it binds and *consumes* its children's
//! bindings; bus balance then means the DAG was evaluated consistently.
//! See the design notes.
//!
//! A binding is `node_hash ↦ typed value`: `h` is the bus key, the
//! [`ValueTag`] says what kind of value it is, `ptr` is the canonical
//! handle for value-bindings, and `bound_ptr` names the modulus a uint
//! value lives under (both unused — zero — for `True`).
use ;
use crate::;
/// Typed value a node binds to on the [`Binding`](BusId::Binding) bus.
///
/// `#[repr(u8)]` lets a variant cast directly (`ValueTag::True as u8`)
/// to the felt the `value_tag` slot holds — mirroring
/// [`NodeTag`](super::nodes::NodeTag).
///
/// The pvm-design's `KeccakDigest` / `Chunks` value variants are
/// deliberately **absent**: a Keccak digest is terminal (only ever
/// consumed by a Keccak relation node), so the Keccak path fuses and
/// never puts a digest or chunks object on the Binding bus as a value —
/// see the design notes
/// §"Why Keccak fuses". `Uint` / `Group` are non-terminal and *do* need
/// value-bindings: `Uint` is live (transient uint leaves and the eval
/// chip's `UintOp` results); `Group` lands with the group chiplet.
/// LogUp message for the [`Binding`](BusId::Binding) relation: a 7-tuple
/// `(h0, h1, h2, h3, value_tag, ptr, bound_ptr)` binding a node's 4-felt
/// hash to a typed value.
///
/// - `h` — the node's hash (`Poseidon2(preimage)[0..4]`), the bus key.
/// - `value_tag` — the [`ValueTag`] discriminant.
/// - `ptr` — canonical value handle for value-bindings; `0` for `True`.
/// - `bound_ptr` — for a `Uint` value, the ptr of the uint storing its modulus `p − 1`; `0` for
/// `True`.
///
/// Encoded as `bus_prefix[Binding] + β⁰·h0 + β¹·h1 + β²·h2 + β³·h3 +
/// β⁴·value_tag + β⁵·ptr + β⁶·bound_ptr`.