openvm_pairing_circuit/fp12_chip/
sub.rs

1use std::{cell::RefCell, rc::Rc};
2
3use openvm_circuit_primitives::var_range::VariableRangeCheckerBus;
4use openvm_mod_circuit_builder::{ExprBuilder, ExprBuilderConfig, FieldExpr};
5
6use crate::Fp12;
7
8pub fn fp12_sub_expr(config: ExprBuilderConfig, range_bus: VariableRangeCheckerBus) -> FieldExpr {
9    config.check_valid();
10    let builder = ExprBuilder::new(config, range_bus.range_max_bits);
11    let builder = Rc::new(RefCell::new(builder));
12
13    let mut x = Fp12::new(builder.clone());
14    let mut y = Fp12::new(builder.clone());
15    let mut res = x.sub(&mut y);
16    res.save_output();
17
18    let builder = builder.borrow().clone();
19    FieldExpr::new(builder, range_bus, false)
20}