Skip to content

Commit

Permalink
Internal audit changes.
Browse files Browse the repository at this point in the history
commit-id:9acb216d
  • Loading branch information
liorgold2 committed Jun 25, 2024
1 parent 652d137 commit ed6d3bf
Show file tree
Hide file tree
Showing 14 changed files with 309 additions and 298 deletions.
36 changes: 18 additions & 18 deletions corelib/src/circuit.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -116,34 +116,34 @@ extern fn eval_circuit<C>(
) -> EvalCircuitResult<C> implicits(AddMod, MulMod) nopanic;

/// Fill an input in the circuit instance's data.
extern fn fill_circuit_input<C>(
extern fn add_circuit_input<C>(
accumulator: CircuitInputAccumulator<C>, value: [U96Guarantee; 4]
) -> FillInputResult<C> nopanic;
) -> AddInputResult<C> nopanic;

/// The result of filling an input in the circuit instance's data.
pub enum FillInputResult<C> {
pub enum AddInputResult<C> {
/// All inputs have been filled.
Done: CircuitData<C>,
/// More inputs are needed to fill the circuit instance's data.
More: CircuitInputAccumulator<C>,
}

mod internal {
impl FillInputResultDrop<C> of Drop<super::FillInputResult<C>>;
pub impl PanicDestructFillInputResult<C> of PanicDestruct<super::FillInputResult<C>> {
impl AddInputResultDrop<C> of Drop<super::AddInputResult<C>>;
pub impl PanicDestructAddInputResult<C> of PanicDestruct<super::AddInputResult<C>> {
// Inlining to make sure possibly huge `C` won't be in a user function name.
#[inline(always)]
fn panic_destruct(
self: super::FillInputResult<C>, ref panic: core::panics::Panic
self: super::AddInputResult<C>, ref panic: core::panics::Panic
) nopanic {}
}
}
impl PanicDestructFillInputResult<C> = internal::PanicDestructFillInputResult<C>;
impl PanicDestructAddInputResult<C> = internal::PanicDestructAddInputResult<C>;

/// Type for accumulating inputs into the circuit instance's data.
extern type CircuitInputAccumulator<C>;

/// A type representing a circuit instance data with all the inputs filled.
/// A type representing a circuit instance data with all the inputs addeded.
extern type CircuitData<C>;

/// A type representing a circuit instance where the outputs are filled.
Expand Down Expand Up @@ -233,8 +233,8 @@ pub impl CircuitInputsImpl<CES> of CircuitInputs<CES> {
#[inline]
fn new_inputs<impl CD: CircuitDefinition<CES>, +Drop<CES>>(
self: CES
) -> FillInputResult<CD::CircuitType> {
FillInputResult::More(init_circuit_data::<CD::CircuitType>())
) -> AddInputResult<CD::CircuitType> {
AddInputResult::More(init_circuit_data::<CD::CircuitType>())
}
}

Expand All @@ -253,26 +253,26 @@ impl GetCircuitDescriptorImpl<CES> of GetCircuitDescriptor<CES> {

/// A trait for filling inputs in a circuit instance's data.
#[generate_trait]
pub impl FillInputResultImpl<C> of FillInputResultTrait<C> {
pub impl AddInputResultImpl<C> of AddInputResultTrait<C> {
/// Adds an input to the accumulator.
// Inlining to make sure possibly huge `C` won't be in a user function name.
#[inline]
fn next<Value, +IntoCircuitInputValue<Value>, +Drop<Value>>(
self: FillInputResult<C>, value: Value
) -> FillInputResult<C> {
self: AddInputResult<C>, value: Value
) -> AddInputResult<C> {
match self {
FillInputResult::More(accumulator) => fill_circuit_input(
AddInputResult::More(accumulator) => add_circuit_input(
accumulator, value.into_circuit_input_value()
),
FillInputResult::Done(_) => panic!("All inputs have been filled"),
AddInputResult::Done(_) => panic!("All inputs have been filled"),
}
}
// Inlining to make sure possibly huge `C` won't be in a user function name.
#[inline(always)]
fn done(self: FillInputResult<C>) -> CircuitData<C> {
fn done(self: AddInputResult<C>) -> CircuitData<C> {
match self {
FillInputResult::Done(data) => data,
FillInputResult::More(_) => panic!("Not all inputs have been filled"),
AddInputResult::Done(data) => data,
AddInputResult::More(_) => panic!("Not all inputs have been filled"),
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion corelib/src/test/circuit_test.cairo
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use core::circuit::{
RangeCheck96, AddMod, MulMod, u96, CircuitElement, CircuitInput, circuit_add, circuit_sub,
circuit_mul, circuit_inverse, EvalCircuitTrait, u384, CircuitOutputsTrait, CircuitModulus,
FillInputResultTrait, CircuitInputs,
AddInputResultTrait, CircuitInputs,
};

use core::test::test_utils::assert_eq;
Expand Down
6 changes: 4 additions & 2 deletions crates/cairo-lang-runner/src/casm_run/circuit.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
use std::array;
use std::ops::{Deref, Shl};

use cairo_lang_sierra::extensions::circuit::{BUILTIN_INSTANCE_SIZE, OFFSETS_PER_GATE, VALUE_SIZE};
use cairo_lang_sierra::extensions::circuit::{
MOD_BUILTIN_INSTANCE_SIZE, OFFSETS_PER_GATE, VALUE_SIZE,
};
use cairo_vm::types::relocatable::{MaybeRelocatable, Relocatable};
use cairo_vm::vm::errors::hint_errors::HintError;
use cairo_vm::vm::vm_core::VirtualMachine;
Expand Down Expand Up @@ -214,7 +216,7 @@ pub fn fill_instances(
mut offsets_ptr: Relocatable,
) -> Result<(), HintError> {
for i in 0..n_instances {
let instance_ptr = (builtin_ptr + i * BUILTIN_INSTANCE_SIZE)?;
let instance_ptr = (builtin_ptr + i * MOD_BUILTIN_INSTANCE_SIZE)?;

for (idx, value) in modulus.iter().enumerate() {
vm.insert_value((instance_ptr + idx)?, *value)?;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,7 @@ pub fn core_libfunc_ap_change<InfoProvider: InvocationApChangeInfoProvider>(
Circuit(CircuitConcreteLibfunc::TryIntoCircuitModulus(_)) => {
vec![ApChange::Known(1), ApChange::Known(1)]
}
Circuit(CircuitConcreteLibfunc::FillInput(_)) => {
Circuit(CircuitConcreteLibfunc::AddInput(_)) => {
vec![ApChange::Known(2), ApChange::Known(2)]
}
Circuit(CircuitConcreteLibfunc::Eval(_)) => vec![ApChange::Known(4), ApChange::Known(4)],
Expand Down
14 changes: 7 additions & 7 deletions crates/cairo-lang-sierra-gas/src/core_libfunc_cost_base.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use cairo_lang_sierra::extensions::boxing::BoxConcreteLibfunc;
use cairo_lang_sierra::extensions::bytes31::Bytes31ConcreteLibfunc;
use cairo_lang_sierra::extensions::casts::{CastConcreteLibfunc, CastType};
use cairo_lang_sierra::extensions::circuit::{
CircuitConcreteLibfunc, CircuitInfo, BUILTIN_INSTANCE_SIZE,
CircuitConcreteLibfunc, CircuitInfo, MOD_BUILTIN_INSTANCE_SIZE,
};
use cairo_lang_sierra::extensions::const_type::ConstConcreteLibfunc;
use cairo_lang_sierra::extensions::core::CoreConcreteLibfunc::{self, *};
Expand Down Expand Up @@ -509,13 +509,13 @@ pub fn core_libfunc_cost(
}
},
Circuit(libfunc) => match libfunc {
CircuitConcreteLibfunc::FillInput(_) => {
CircuitConcreteLibfunc::AddInput(_) => {
vec![ConstCost::steps(7).into(), ConstCost::steps(7).into()]
}
CircuitConcreteLibfunc::Eval(libfunc) => {
let info = info_provider.circuit_info(&libfunc.ty);

let instance_size: i32 = BUILTIN_INSTANCE_SIZE.into_or_panic();
let instance_size: i32 = MOD_BUILTIN_INSTANCE_SIZE.into_or_panic();
let mut steps: i32 = 8 + instance_size;

if !info.add_offsets.is_empty() {
Expand Down Expand Up @@ -575,10 +575,10 @@ pub fn core_libfunc_cost(
]
}
CircuitConcreteLibfunc::FailureGuaranteeVerify(_) => {
// The libfunc also costs 1 mulmod instance, however, in the failure case
// `eval_circuit` uses less mulmod gates then it actaually uses, so
// the mulmod is already paid for.
vec![ConstCost { steps: 33, holes: 0, range_checks: 0, range_checks96: 6 }.into()]
// The libfunc costs 1 MulMod instance (in addition to the cost below).
// However, in the failure case `eval_circuit` uses at least one MulMod gate less
// than it actually costs, so the MulMod is already paid for.
vec![ConstCost { steps: 32, holes: 0, range_checks: 0, range_checks96: 6 }.into()]
}
},
}
Expand Down
Loading

0 comments on commit ed6d3bf

Please sign in to comment.