cairo_lang_sierra_to_casm/
circuit.rs

1use cairo_lang_sierra::extensions::circuit::{CircuitInfo, CircuitTypeConcrete, ConcreteCircuit};
2use cairo_lang_sierra::extensions::core::{CoreLibfunc, CoreType, CoreTypeConcrete};
3use cairo_lang_sierra::ids::ConcreteTypeId;
4use cairo_lang_sierra::program_registry::ProgramRegistry;
5use cairo_lang_utils::ordered_hash_map::OrderedHashMap;
6
7use crate::compiler::CompilationError;
8
9/// Describes a circuit in the program.
10/// The information about the circuits used in the program.
11#[derive(Clone, Debug, Default, Eq, PartialEq)]
12pub struct CircuitsInfo {
13    pub circuits: OrderedHashMap<ConcreteTypeId, CircuitInfo>,
14}
15
16impl CircuitsInfo {
17    pub fn new<'a>(
18        registry: &ProgramRegistry<CoreType, CoreLibfunc>,
19        type_ids: impl Iterator<Item = &'a ConcreteTypeId>,
20    ) -> Result<Self, CompilationError> {
21        let mut res = Self::default();
22        for ty in type_ids {
23            if let CoreTypeConcrete::Circuit(CircuitTypeConcrete::Circuit(ConcreteCircuit {
24                circuit_info,
25                ..
26            })) = registry.get_type(ty).unwrap()
27            {
28                res.circuits.entry(ty.clone()).or_insert_with(|| circuit_info.clone());
29            }
30        }
31        Ok(res)
32    }
33}