Skip to content

Commit 0692fef

Browse files
authored
Refactor interpreter actions (#2563)
1 parent 1e8ed88 commit 0692fef

File tree

1 file changed

+49
-52
lines changed

1 file changed

+49
-52
lines changed

executor/src/witgen/jit/interpreter.rs

+49-52
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,10 @@ impl<T: FieldElement> EffectsInterpreter<T> {
111111
let mut actions = vec![];
112112
let mut var_mapper = VariableMapper::new();
113113

114-
Self::load_fixed_column_values(&mut var_mapper, &mut actions, effects);
115-
Self::load_known_inputs(&mut var_mapper, &mut actions, known_inputs);
116-
Self::process_effects(&mut var_mapper, &mut actions, effects);
117-
Self::write_data(&mut var_mapper, &mut actions, effects);
114+
actions.extend(Self::load_fixed_column_values(&mut var_mapper, effects));
115+
actions.extend(Self::load_known_inputs(&mut var_mapper, known_inputs));
116+
actions.extend(Self::process_effects(&mut var_mapper, effects));
117+
actions.extend(Self::write_data(&mut var_mapper, effects));
118118

119119
let ret = Self {
120120
var_count: var_mapper.var_count(),
@@ -124,33 +124,31 @@ impl<T: FieldElement> EffectsInterpreter<T> {
124124
Some(ret)
125125
}
126126

127-
fn load_fixed_column_values(
128-
var_mapper: &mut VariableMapper,
129-
actions: &mut Vec<InterpreterAction<T>>,
130-
effects: &[Effect<T, Variable>],
131-
) {
132-
actions.extend(
133-
effects
134-
.iter()
135-
.flat_map(|e| e.referenced_variables())
136-
.filter_map(|v| match v {
137-
Variable::FixedCell(c) => Some((v, c)),
138-
_ => None,
139-
})
140-
.unique()
141-
.map(|(var, cell)| {
142-
let idx = var_mapper.map_var(var);
143-
InterpreterAction::ReadFixedColumn(idx, cell.clone())
144-
}),
145-
)
127+
/// Returns an iterator of actions to load all accessed fixed column values into variables.
128+
fn load_fixed_column_values<'a>(
129+
var_mapper: &'a mut VariableMapper,
130+
effects: &'a [Effect<T, Variable>],
131+
) -> impl Iterator<Item = InterpreterAction<T>> + 'a {
132+
effects
133+
.iter()
134+
.flat_map(|e| e.referenced_variables())
135+
.filter_map(|v| match v {
136+
Variable::FixedCell(c) => Some((v, c)),
137+
_ => None,
138+
})
139+
.unique()
140+
.map(|(var, cell)| {
141+
let idx = var_mapper.map_var(var);
142+
InterpreterAction::ReadFixedColumn(idx, cell.clone())
143+
})
146144
}
147145

148-
fn load_known_inputs(
149-
var_mapper: &mut VariableMapper,
150-
actions: &mut Vec<InterpreterAction<T>>,
151-
known_inputs: &[Variable],
152-
) {
153-
actions.extend(known_inputs.iter().map(|var| match var {
146+
/// Returns an iterator of actions to load all known inputs into variables.
147+
fn load_known_inputs<'a>(
148+
var_mapper: &'a mut VariableMapper,
149+
known_inputs: &'a [Variable],
150+
) -> impl Iterator<Item = InterpreterAction<T>> + 'a {
151+
known_inputs.iter().map(|var| match var {
154152
Variable::WitnessCell(c) => {
155153
let idx = var_mapper.map_var(var);
156154
InterpreterAction::ReadCell(idx, c.clone())
@@ -162,16 +160,16 @@ impl<T: FieldElement> EffectsInterpreter<T> {
162160
Variable::FixedCell(_)
163161
| Variable::MachineCallParam(_)
164162
| Variable::IntermediateCell(_) => unreachable!(),
165-
}));
163+
})
166164
}
167165

168-
fn process_effects(
169-
var_mapper: &mut VariableMapper,
170-
actions: &mut Vec<InterpreterAction<T>>,
171-
effects: &[Effect<T, Variable>],
172-
) {
173-
effects.iter().for_each(|effect| {
174-
let action = match effect {
166+
/// Returns an iterator of actions equivalent to the effects.
167+
fn process_effects<'a>(
168+
var_mapper: &'a mut VariableMapper,
169+
effects: &'a [Effect<T, Variable>],
170+
) -> impl Iterator<Item = InterpreterAction<T>> + 'a {
171+
effects.iter().map(|effect| {
172+
match effect {
175173
Effect::Assignment(var, e) => {
176174
let idx = var_mapper.map_var(var);
177175
InterpreterAction::AssignExpression(idx, var_mapper.map_expr_to_rpn(e))
@@ -207,45 +205,44 @@ impl<T: FieldElement> EffectsInterpreter<T> {
207205
unimplemented!("Prover function calls are not supported in the interpreter yet")
208206
}
209207
Effect::Branch(condition, if_branch, else_branch) => {
210-
let mut if_actions = vec![];
211-
Self::process_effects(var_mapper, &mut if_actions, if_branch);
212-
let mut else_actions = vec![];
213-
Self::process_effects(var_mapper, &mut else_actions, else_branch);
208+
let if_actions = Self::process_effects(var_mapper, if_branch).collect();
209+
let else_actions = Self::process_effects(var_mapper, else_branch).collect();
214210
let test = BranchTest::new(var_mapper, condition);
215211
InterpreterAction::Branch(test, if_actions, else_actions)
216212
}
217-
};
218-
actions.push(action);
213+
}
219214
})
220215
}
221216

222-
fn write_data(
223-
var_mapper: &mut VariableMapper,
224-
actions: &mut Vec<InterpreterAction<T>>,
225-
effects: &[Effect<T, Variable>],
226-
) {
217+
/// Returns an iterator of actions to write all written variables to the data.
218+
fn write_data<'a>(
219+
var_mapper: &'a mut VariableMapper,
220+
effects: &'a [Effect<T, Variable>],
221+
) -> impl Iterator<Item = InterpreterAction<T>> + 'a {
227222
effects
228223
.iter()
229224
.flat_map(Effect::written_vars)
230-
.for_each(|(var, _mutable)| {
225+
.filter_map(|(var, _mutable)| {
231226
match var {
232227
Variable::WitnessCell(cell) => {
233228
let idx = var_mapper.get_var(var).unwrap();
234-
actions.push(InterpreterAction::WriteCell(idx, cell.clone()));
229+
Some(InterpreterAction::WriteCell(idx, cell.clone()))
235230
}
236231
Variable::Param(i) => {
237232
let idx = var_mapper.get_var(var).unwrap();
238-
actions.push(InterpreterAction::WriteParam(idx, *i));
233+
Some(InterpreterAction::WriteParam(idx, *i))
239234
}
240235
Variable::FixedCell(_) => panic!("Should not write to fixed column."),
241236
Variable::IntermediateCell(_) => {
242237
// Intermediate cells are not stored permanently
238+
None
243239
}
244240
Variable::MachineCallParam(_) => {
245241
// This is just an internal variable.
242+
None
246243
}
247244
}
248-
});
245+
})
249246
}
250247

251248
/// Execute the machine effects for the given the parameters

0 commit comments

Comments
 (0)