forked from libre-chip/fayalite
		
	WIP adding extern modules to simulator
This commit is contained in:
		
							parent
							
								
									6e0016b370
								
							
						
					
					
						commit
						b4650f1bff
					
				
					 14 changed files with 1729 additions and 6853 deletions
				
			
		| 
						 | 
				
			
			@ -6484,12 +6484,382 @@ macro_rules! impl_to_sim_value_for_int_value {
 | 
			
		|||
impl_to_sim_value_for_int_value!(UIntValue, UInt, UIntType);
 | 
			
		||||
impl_to_sim_value_for_int_value!(SIntValue, SInt, SIntType);
 | 
			
		||||
 | 
			
		||||
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
 | 
			
		||||
enum MaybeNeedsSettle<S, N = S> {
 | 
			
		||||
    NeedsSettle(S),
 | 
			
		||||
    NoSettleNeeded(N),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<T> MaybeNeedsSettle<T> {
 | 
			
		||||
    fn map<U>(self, f: impl FnOnce(T) -> U) -> MaybeNeedsSettle<U> {
 | 
			
		||||
        match self {
 | 
			
		||||
            MaybeNeedsSettle::NeedsSettle(v) => MaybeNeedsSettle::NeedsSettle(f(v)),
 | 
			
		||||
            MaybeNeedsSettle::NoSettleNeeded(v) => MaybeNeedsSettle::NoSettleNeeded(f(v)),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// workaround implementing FnOnce not being stable
 | 
			
		||||
trait MaybeNeedsSettleFn<A> {
 | 
			
		||||
    type Output;
 | 
			
		||||
 | 
			
		||||
    fn call(self, arg: A) -> Self::Output;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<T: FnOnce(A) -> O, A, O> MaybeNeedsSettleFn<A> for T {
 | 
			
		||||
    type Output = O;
 | 
			
		||||
 | 
			
		||||
    fn call(self, arg: A) -> Self::Output {
 | 
			
		||||
        self(arg)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<S, N> MaybeNeedsSettle<S, N> {
 | 
			
		||||
    fn apply_no_settle<T>(self, arg: T) -> MaybeNeedsSettle<S, N::Output>
 | 
			
		||||
    where
 | 
			
		||||
        N: MaybeNeedsSettleFn<T>,
 | 
			
		||||
    {
 | 
			
		||||
        match self {
 | 
			
		||||
            MaybeNeedsSettle::NeedsSettle(v) => MaybeNeedsSettle::NeedsSettle(v),
 | 
			
		||||
            MaybeNeedsSettle::NoSettleNeeded(v) => MaybeNeedsSettle::NoSettleNeeded(v.call(arg)),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct SimulationModuleState {
 | 
			
		||||
    base_targets: Vec<Target>,
 | 
			
		||||
    uninitialized_ios: HashMap<Target, Vec<Target>>,
 | 
			
		||||
    io_targets: HashMap<Target, CompiledValue<CanonicalType>>,
 | 
			
		||||
    did_initial_settle: bool,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl fmt::Debug for SimulationModuleState {
 | 
			
		||||
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 | 
			
		||||
        let Self {
 | 
			
		||||
            base_targets,
 | 
			
		||||
            uninitialized_ios,
 | 
			
		||||
            io_targets,
 | 
			
		||||
            did_initial_settle,
 | 
			
		||||
        } = self;
 | 
			
		||||
        f.debug_struct("SimulationModuleState")
 | 
			
		||||
            .field("base_targets", base_targets)
 | 
			
		||||
            .field("uninitialized_ios", &SortedSetDebug(uninitialized_ios))
 | 
			
		||||
            .field("io_targets", &SortedSetDebug(io_targets))
 | 
			
		||||
            .field("did_initial_settle", did_initial_settle)
 | 
			
		||||
            .finish()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl SimulationModuleState {
 | 
			
		||||
    fn new(base_targets: impl IntoIterator<Item = (Target, CompiledValue<CanonicalType>)>) -> Self {
 | 
			
		||||
        let mut retval = Self {
 | 
			
		||||
            base_targets: Vec::new(),
 | 
			
		||||
            uninitialized_ios: HashMap::new(),
 | 
			
		||||
            io_targets: HashMap::new(),
 | 
			
		||||
            did_initial_settle: false,
 | 
			
		||||
        };
 | 
			
		||||
        for (base_target, value) in base_targets {
 | 
			
		||||
            retval.base_targets.push(base_target);
 | 
			
		||||
            retval.parse_io(base_target, value);
 | 
			
		||||
        }
 | 
			
		||||
        retval
 | 
			
		||||
    }
 | 
			
		||||
    /// returns `true` if `target` or any sub-targets are uninitialized inputs
 | 
			
		||||
    fn parse_io(&mut self, target: Target, value: CompiledValue<CanonicalType>) -> bool {
 | 
			
		||||
        self.io_targets.insert(target, value);
 | 
			
		||||
        match value.layout.body {
 | 
			
		||||
            CompiledTypeLayoutBody::Scalar => match target.flow() {
 | 
			
		||||
                Flow::Source => false,
 | 
			
		||||
                Flow::Sink => {
 | 
			
		||||
                    self.uninitialized_ios.insert(target, vec![]);
 | 
			
		||||
                    true
 | 
			
		||||
                }
 | 
			
		||||
                Flow::Duplex => unreachable!(),
 | 
			
		||||
            },
 | 
			
		||||
            CompiledTypeLayoutBody::Array { .. } => {
 | 
			
		||||
                let value = value.map_ty(Array::from_canonical);
 | 
			
		||||
                let mut sub_targets = Vec::new();
 | 
			
		||||
                for index in 0..value.layout.ty.len() {
 | 
			
		||||
                    let sub_target = target.join(
 | 
			
		||||
                        TargetPathElement::from(TargetPathArrayElement { index }).intern_sized(),
 | 
			
		||||
                    );
 | 
			
		||||
                    if self.parse_io(sub_target, value.element(index)) {
 | 
			
		||||
                        sub_targets.push(sub_target);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if sub_targets.is_empty() {
 | 
			
		||||
                    false
 | 
			
		||||
                } else {
 | 
			
		||||
                    self.uninitialized_ios.insert(target, sub_targets);
 | 
			
		||||
                    true
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            CompiledTypeLayoutBody::Bundle { .. } => {
 | 
			
		||||
                let value = value.map_ty(Bundle::from_canonical);
 | 
			
		||||
                let mut sub_targets = Vec::new();
 | 
			
		||||
                for BundleField { name, .. } in value.layout.ty.fields() {
 | 
			
		||||
                    let sub_target = target.join(
 | 
			
		||||
                        TargetPathElement::from(TargetPathBundleField { name }).intern_sized(),
 | 
			
		||||
                    );
 | 
			
		||||
                    if self.parse_io(sub_target, value.field_by_name(name)) {
 | 
			
		||||
                        sub_targets.push(sub_target);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if sub_targets.is_empty() {
 | 
			
		||||
                    false
 | 
			
		||||
                } else {
 | 
			
		||||
                    self.uninitialized_ios.insert(target, sub_targets);
 | 
			
		||||
                    true
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    fn mark_target_as_initialized(&mut self, mut target: Target) {
 | 
			
		||||
        fn remove_target_and_children(
 | 
			
		||||
            uninitialized_ios: &mut HashMap<Target, Vec<Target>>,
 | 
			
		||||
            target: Target,
 | 
			
		||||
        ) {
 | 
			
		||||
            let Some(children) = uninitialized_ios.remove(&target) else {
 | 
			
		||||
                return;
 | 
			
		||||
            };
 | 
			
		||||
            for child in children {
 | 
			
		||||
                remove_target_and_children(uninitialized_ios, child);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        remove_target_and_children(&mut self.uninitialized_ios, target);
 | 
			
		||||
        while let Some(target_child) = target.child() {
 | 
			
		||||
            let parent = target_child.parent();
 | 
			
		||||
            for child in self
 | 
			
		||||
                .uninitialized_ios
 | 
			
		||||
                .get(&*parent)
 | 
			
		||||
                .map(|v| &**v)
 | 
			
		||||
                .unwrap_or(&[])
 | 
			
		||||
            {
 | 
			
		||||
                if self.uninitialized_ios.contains_key(child) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            target = *parent;
 | 
			
		||||
            self.uninitialized_ios.remove(&target);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    fn get_io(
 | 
			
		||||
        &self,
 | 
			
		||||
        mut target: Target,
 | 
			
		||||
        which_module: WhichModule,
 | 
			
		||||
    ) -> CompiledValue<CanonicalType> {
 | 
			
		||||
        if let Some(&retval) = self.io_targets.get(&target) {
 | 
			
		||||
            return retval;
 | 
			
		||||
        }
 | 
			
		||||
        loop {
 | 
			
		||||
            target = match target {
 | 
			
		||||
                Target::Base(_) => break,
 | 
			
		||||
                Target::Child(child) => {
 | 
			
		||||
                    match *child.path_element() {
 | 
			
		||||
                        TargetPathElement::BundleField(_) | TargetPathElement::ArrayElement(_) => {}
 | 
			
		||||
                        TargetPathElement::DynArrayElement(_) => panic!(
 | 
			
		||||
                            "simulator read/write expression must not have dynamic array indexes"
 | 
			
		||||
                        ),
 | 
			
		||||
                    }
 | 
			
		||||
                    *child.parent()
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
        match which_module {
 | 
			
		||||
            WhichModule::Main => panic!(
 | 
			
		||||
                "simulator read/write expression must be \
 | 
			
		||||
                an array element/field of `Simulation::io()`"
 | 
			
		||||
            ),
 | 
			
		||||
            WhichModule::Extern { .. } => panic!(
 | 
			
		||||
                "simulator read/write expression must be \
 | 
			
		||||
                one of this module's inputs/outputs or an \
 | 
			
		||||
                array element/field of one of this module's inputs/outputs"
 | 
			
		||||
            ),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    fn read_helper(
 | 
			
		||||
        &self,
 | 
			
		||||
        io: Expr<CanonicalType>,
 | 
			
		||||
        which_module: WhichModule,
 | 
			
		||||
    ) -> MaybeNeedsSettle<CompiledValue<CanonicalType>> {
 | 
			
		||||
        let Some(target) = io.target() else {
 | 
			
		||||
            match which_module {
 | 
			
		||||
                WhichModule::Main => panic!(
 | 
			
		||||
                    "can't read from an expression that's not a field/element of `Simulation::io()`"
 | 
			
		||||
                ),
 | 
			
		||||
                WhichModule::Extern { .. } => panic!(
 | 
			
		||||
                    "can't read from an expression that's not based on one of this module's inputs/outputs"
 | 
			
		||||
                ),
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        let compiled_value = self.get_io(*target, which_module);
 | 
			
		||||
        match target.flow() {
 | 
			
		||||
            Flow::Source => {
 | 
			
		||||
                if !self.uninitialized_ios.is_empty() {
 | 
			
		||||
                    match which_module {
 | 
			
		||||
                        WhichModule::Main => {
 | 
			
		||||
                            panic!("can't read from an output before initializing all inputs");
 | 
			
		||||
                        }
 | 
			
		||||
                        WhichModule::Extern { .. } => {
 | 
			
		||||
                            panic!("can't read from an input before initializing all outputs");
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                MaybeNeedsSettle::NeedsSettle(compiled_value)
 | 
			
		||||
            }
 | 
			
		||||
            Flow::Sink => {
 | 
			
		||||
                if self.uninitialized_ios.contains_key(&*target) {
 | 
			
		||||
                    match which_module {
 | 
			
		||||
                        WhichModule::Main => panic!("can't read from an uninitialized input"),
 | 
			
		||||
                        WhichModule::Extern { .. } => {
 | 
			
		||||
                            panic!("can't read from an uninitialized output");
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                MaybeNeedsSettle::NoSettleNeeded(compiled_value)
 | 
			
		||||
            }
 | 
			
		||||
            Flow::Duplex => unreachable!(),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    fn write_helper(
 | 
			
		||||
        &mut self,
 | 
			
		||||
        io: Expr<CanonicalType>,
 | 
			
		||||
        which_module: WhichModule,
 | 
			
		||||
    ) -> CompiledValue<CanonicalType> {
 | 
			
		||||
        let Some(target) = io.target() else {
 | 
			
		||||
            match which_module {
 | 
			
		||||
                WhichModule::Main => panic!(
 | 
			
		||||
                    "can't write to an expression that's not a field/element of `Simulation::io()`"
 | 
			
		||||
                ),
 | 
			
		||||
                WhichModule::Extern { .. } => panic!(
 | 
			
		||||
                    "can't write to an expression that's not based on one of this module's outputs"
 | 
			
		||||
                ),
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        let compiled_value = self.get_io(*target, which_module);
 | 
			
		||||
        match target.flow() {
 | 
			
		||||
            Flow::Source => match which_module {
 | 
			
		||||
                WhichModule::Main => panic!("can't write to an output"),
 | 
			
		||||
                WhichModule::Extern { .. } => panic!("can't write to an input"),
 | 
			
		||||
            },
 | 
			
		||||
            Flow::Sink => {}
 | 
			
		||||
            Flow::Duplex => unreachable!(),
 | 
			
		||||
        }
 | 
			
		||||
        if !self.did_initial_settle {
 | 
			
		||||
            self.mark_target_as_initialized(*target);
 | 
			
		||||
        }
 | 
			
		||||
        compiled_value
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct SimulationExternModuleState {
 | 
			
		||||
    module_state: SimulationModuleState,
 | 
			
		||||
    sim: ExternModuleSimulation<Bundle>,
 | 
			
		||||
    running_generator: Option<Box<dyn Future<Output = ()> + 'static>>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl fmt::Debug for SimulationExternModuleState {
 | 
			
		||||
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 | 
			
		||||
        let Self {
 | 
			
		||||
            module_state,
 | 
			
		||||
            sim,
 | 
			
		||||
            running_generator,
 | 
			
		||||
        } = self;
 | 
			
		||||
        f.debug_struct("SimulationExternModuleState")
 | 
			
		||||
            .field("module_state", module_state)
 | 
			
		||||
            .field("sim", sim)
 | 
			
		||||
            .field(
 | 
			
		||||
                "running_generator",
 | 
			
		||||
                &running_generator.as_ref().map(|_| DebugAsDisplay("...")),
 | 
			
		||||
            )
 | 
			
		||||
            .finish()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
 | 
			
		||||
enum WhichModule {
 | 
			
		||||
    Main,
 | 
			
		||||
    Extern { index: usize },
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ReadBitFn {
 | 
			
		||||
    compiled_value: CompiledValue<CanonicalType>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl MaybeNeedsSettleFn<&'_ mut interpreter::State> for ReadBitFn {
 | 
			
		||||
    type Output = bool;
 | 
			
		||||
 | 
			
		||||
    fn call(self, state: &mut interpreter::State) -> Self::Output {
 | 
			
		||||
        match self.compiled_value.range.len() {
 | 
			
		||||
            TypeLen::A_SMALL_SLOT => {
 | 
			
		||||
                state.small_slots[self.compiled_value.range.small_slots.start] != 0
 | 
			
		||||
            }
 | 
			
		||||
            TypeLen::A_BIG_SLOT => !state.big_slots[self.compiled_value.range.big_slots.start]
 | 
			
		||||
                .clone()
 | 
			
		||||
                .is_zero(),
 | 
			
		||||
            _ => unreachable!(),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ReadBoolOrIntFn<I: BoolOrIntType> {
 | 
			
		||||
    compiled_value: CompiledValue<CanonicalType>,
 | 
			
		||||
    io: Expr<I>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<I: BoolOrIntType> MaybeNeedsSettleFn<&'_ mut interpreter::State> for ReadBoolOrIntFn<I> {
 | 
			
		||||
    type Output = I::Value;
 | 
			
		||||
 | 
			
		||||
    fn call(self, state: &mut interpreter::State) -> Self::Output {
 | 
			
		||||
        let Self { compiled_value, io } = self;
 | 
			
		||||
        match compiled_value.range.len() {
 | 
			
		||||
            TypeLen::A_SMALL_SLOT => Expr::ty(io)
 | 
			
		||||
                .value_from_int_wrapping(state.small_slots[compiled_value.range.small_slots.start]),
 | 
			
		||||
            TypeLen::A_BIG_SLOT => Expr::ty(io).value_from_int_wrapping(
 | 
			
		||||
                state.big_slots[compiled_value.range.big_slots.start].clone(),
 | 
			
		||||
            ),
 | 
			
		||||
            _ => unreachable!(),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ReadFn {
 | 
			
		||||
    compiled_value: CompiledValue<CanonicalType>,
 | 
			
		||||
    io: Expr<CanonicalType>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl MaybeNeedsSettleFn<&'_ mut interpreter::State> for ReadFn {
 | 
			
		||||
    type Output = SimValue<CanonicalType>;
 | 
			
		||||
 | 
			
		||||
    fn call(self, state: &mut interpreter::State) -> Self::Output {
 | 
			
		||||
        let Self { compiled_value, io } = self;
 | 
			
		||||
        let mut bits = BitVec::repeat(false, compiled_value.layout.ty.bit_width());
 | 
			
		||||
        SimulationImpl::read_write_sim_value_helper(
 | 
			
		||||
            state,
 | 
			
		||||
            compiled_value,
 | 
			
		||||
            &mut bits,
 | 
			
		||||
            |_signed, bits, value| <UInt>::copy_bits_from_bigint_wrapping(value, bits),
 | 
			
		||||
            |_signed, bits, value| {
 | 
			
		||||
                let bytes = value.to_le_bytes();
 | 
			
		||||
                let bitslice = BitSlice::<u8, Lsb0>::from_slice(&bytes);
 | 
			
		||||
                bits.clone_from_bitslice(&bitslice[..bits.len()]);
 | 
			
		||||
            },
 | 
			
		||||
        );
 | 
			
		||||
        SimValue {
 | 
			
		||||
            ty: Expr::ty(io),
 | 
			
		||||
            bits,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct SimulationImpl {
 | 
			
		||||
    state: interpreter::State,
 | 
			
		||||
    io: Expr<Bundle>,
 | 
			
		||||
    uninitialized_inputs: HashMap<Target, Vec<Target>>,
 | 
			
		||||
    io_targets: HashMap<Target, CompiledValue<CanonicalType>>,
 | 
			
		||||
    made_initial_step: bool,
 | 
			
		||||
    main_module: SimulationModuleState,
 | 
			
		||||
    extern_modules: Vec<SimulationExternModuleState>,
 | 
			
		||||
    needs_settle: bool,
 | 
			
		||||
    trace_decls: TraceModule,
 | 
			
		||||
    traces: SimTraces<Box<[SimTrace<SimTraceKind, BitVec>]>>,
 | 
			
		||||
| 
						 | 
				
			
			@ -6511,9 +6881,8 @@ impl SimulationImpl {
 | 
			
		|||
        let Self {
 | 
			
		||||
            state,
 | 
			
		||||
            io: self_io,
 | 
			
		||||
            uninitialized_inputs,
 | 
			
		||||
            io_targets,
 | 
			
		||||
            made_initial_step,
 | 
			
		||||
            main_module,
 | 
			
		||||
            extern_modules,
 | 
			
		||||
            needs_settle,
 | 
			
		||||
            trace_decls,
 | 
			
		||||
            traces,
 | 
			
		||||
| 
						 | 
				
			
			@ -6526,12 +6895,8 @@ impl SimulationImpl {
 | 
			
		|||
        f.debug_struct("Simulation")
 | 
			
		||||
            .field("state", state)
 | 
			
		||||
            .field("io", io.unwrap_or(self_io))
 | 
			
		||||
            .field(
 | 
			
		||||
                "uninitialized_inputs",
 | 
			
		||||
                &SortedSetDebug(uninitialized_inputs),
 | 
			
		||||
            )
 | 
			
		||||
            .field("io_targets", &SortedMapDebug(io_targets))
 | 
			
		||||
            .field("made_initial_step", made_initial_step)
 | 
			
		||||
            .field("main_module", main_module)
 | 
			
		||||
            .field("extern_modules", extern_modules)
 | 
			
		||||
            .field("needs_settle", needs_settle)
 | 
			
		||||
            .field("trace_decls", trace_decls)
 | 
			
		||||
            .field("traces", traces)
 | 
			
		||||
| 
						 | 
				
			
			@ -6541,63 +6906,30 @@ impl SimulationImpl {
 | 
			
		|||
            .field("clocks_triggered", clocks_triggered)
 | 
			
		||||
            .finish_non_exhaustive()
 | 
			
		||||
    }
 | 
			
		||||
    /// returns `true` if `target` or any sub-targets are uninitialized inputs
 | 
			
		||||
    fn parse_io(&mut self, target: Target, value: CompiledValue<CanonicalType>) -> bool {
 | 
			
		||||
        self.io_targets.insert(target, value);
 | 
			
		||||
        match value.layout.body {
 | 
			
		||||
            CompiledTypeLayoutBody::Scalar => match target.flow() {
 | 
			
		||||
                Flow::Source => false,
 | 
			
		||||
                Flow::Sink => {
 | 
			
		||||
                    self.uninitialized_inputs.insert(target, vec![]);
 | 
			
		||||
                    true
 | 
			
		||||
                }
 | 
			
		||||
                Flow::Duplex => unreachable!(),
 | 
			
		||||
            },
 | 
			
		||||
            CompiledTypeLayoutBody::Array { .. } => {
 | 
			
		||||
                let value = value.map_ty(Array::from_canonical);
 | 
			
		||||
                let mut sub_targets = Vec::new();
 | 
			
		||||
                for index in 0..value.layout.ty.len() {
 | 
			
		||||
                    let sub_target = target.join(
 | 
			
		||||
                        TargetPathElement::from(TargetPathArrayElement { index }).intern_sized(),
 | 
			
		||||
                    );
 | 
			
		||||
                    if self.parse_io(sub_target, value.element(index)) {
 | 
			
		||||
                        sub_targets.push(sub_target);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if sub_targets.is_empty() {
 | 
			
		||||
                    false
 | 
			
		||||
                } else {
 | 
			
		||||
                    self.uninitialized_inputs.insert(target, sub_targets);
 | 
			
		||||
                    true
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            CompiledTypeLayoutBody::Bundle { .. } => {
 | 
			
		||||
                let value = value.map_ty(Bundle::from_canonical);
 | 
			
		||||
                let mut sub_targets = Vec::new();
 | 
			
		||||
                for BundleField { name, .. } in value.layout.ty.fields() {
 | 
			
		||||
                    let sub_target = target.join(
 | 
			
		||||
                        TargetPathElement::from(TargetPathBundleField { name }).intern_sized(),
 | 
			
		||||
                    );
 | 
			
		||||
                    if self.parse_io(sub_target, value.field_by_name(name)) {
 | 
			
		||||
                        sub_targets.push(sub_target);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if sub_targets.is_empty() {
 | 
			
		||||
                    false
 | 
			
		||||
                } else {
 | 
			
		||||
                    self.uninitialized_inputs.insert(target, sub_targets);
 | 
			
		||||
                    true
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    fn new(compiled: Compiled<Bundle>) -> Self {
 | 
			
		||||
        let mut retval = Self {
 | 
			
		||||
        let io_target = Target::from(compiled.io);
 | 
			
		||||
        Self {
 | 
			
		||||
            state: State::new(compiled.insns),
 | 
			
		||||
            io: compiled.io.to_expr(),
 | 
			
		||||
            uninitialized_inputs: HashMap::new(),
 | 
			
		||||
            io_targets: HashMap::new(),
 | 
			
		||||
            made_initial_step: false,
 | 
			
		||||
            main_module: SimulationModuleState::new(
 | 
			
		||||
                compiled
 | 
			
		||||
                    .io
 | 
			
		||||
                    .ty()
 | 
			
		||||
                    .fields()
 | 
			
		||||
                    .into_iter()
 | 
			
		||||
                    .zip(compiled.base_module.module_io)
 | 
			
		||||
                    .map(|(BundleField { name, .. }, value)| {
 | 
			
		||||
                        (
 | 
			
		||||
                            io_target.join(
 | 
			
		||||
                                TargetPathElement::from(TargetPathBundleField { name })
 | 
			
		||||
                                    .intern_sized(),
 | 
			
		||||
                            ),
 | 
			
		||||
                            value,
 | 
			
		||||
                        )
 | 
			
		||||
                    }),
 | 
			
		||||
            ),
 | 
			
		||||
            // TODO: add extern_modules
 | 
			
		||||
            extern_modules: vec![],
 | 
			
		||||
            needs_settle: true,
 | 
			
		||||
            trace_decls: compiled.base_module.trace_decls,
 | 
			
		||||
            traces: SimTraces(Box::from_iter(compiled.traces.0.iter().map(
 | 
			
		||||
| 
						 | 
				
			
			@ -6616,22 +6948,7 @@ impl SimulationImpl {
 | 
			
		|||
            instant: SimInstant::START,
 | 
			
		||||
            clocks_triggered: compiled.clocks_triggered,
 | 
			
		||||
            breakpoints: None,
 | 
			
		||||
        };
 | 
			
		||||
        let io_target = Target::from(compiled.io);
 | 
			
		||||
        for (BundleField { name, .. }, value) in compiled
 | 
			
		||||
            .io
 | 
			
		||||
            .ty()
 | 
			
		||||
            .fields()
 | 
			
		||||
            .into_iter()
 | 
			
		||||
            .zip(compiled.base_module.module_io)
 | 
			
		||||
        {
 | 
			
		||||
            retval.parse_io(
 | 
			
		||||
                io_target
 | 
			
		||||
                    .join(TargetPathElement::from(TargetPathBundleField { name }).intern_sized()),
 | 
			
		||||
                value,
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
        retval
 | 
			
		||||
    }
 | 
			
		||||
    fn write_traces<const ONLY_IF_CHANGED: bool>(
 | 
			
		||||
        &mut self,
 | 
			
		||||
| 
						 | 
				
			
			@ -6786,7 +7103,7 @@ impl SimulationImpl {
 | 
			
		|||
    #[track_caller]
 | 
			
		||||
    fn settle(&mut self) {
 | 
			
		||||
        assert!(
 | 
			
		||||
            self.uninitialized_inputs.is_empty(),
 | 
			
		||||
            self.main_module.uninitialized_ios.is_empty(),
 | 
			
		||||
            "didn't initialize all inputs",
 | 
			
		||||
        );
 | 
			
		||||
        for _ in 0..100000 {
 | 
			
		||||
| 
						 | 
				
			
			@ -6818,14 +7135,14 @@ impl SimulationImpl {
 | 
			
		|||
            } else {
 | 
			
		||||
                let RunResult::Return(()) = self.state.run(());
 | 
			
		||||
            }
 | 
			
		||||
            if self.made_initial_step {
 | 
			
		||||
            if self.main_module.did_initial_settle {
 | 
			
		||||
                self.read_traces::<false>();
 | 
			
		||||
            } else {
 | 
			
		||||
                self.read_traces::<true>();
 | 
			
		||||
            }
 | 
			
		||||
            self.state.memory_write_log.sort_unstable();
 | 
			
		||||
            self.state.memory_write_log.dedup();
 | 
			
		||||
            self.made_initial_step = true;
 | 
			
		||||
            self.main_module.did_initial_settle = true;
 | 
			
		||||
            self.needs_settle = self
 | 
			
		||||
                .clocks_triggered
 | 
			
		||||
                .iter()
 | 
			
		||||
| 
						 | 
				
			
			@ -6852,110 +7169,35 @@ impl SimulationImpl {
 | 
			
		|||
        }
 | 
			
		||||
        panic!("settle(): took too many steps");
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    fn get_io(&self, target: Target) -> CompiledValue<CanonicalType> {
 | 
			
		||||
        if let Some(&retval) = self.io_targets.get(&target) {
 | 
			
		||||
            return retval;
 | 
			
		||||
    fn get_module(&self, which_module: WhichModule) -> &SimulationModuleState {
 | 
			
		||||
        match which_module {
 | 
			
		||||
            WhichModule::Main => &self.main_module,
 | 
			
		||||
            WhichModule::Extern { index } => &self.extern_modules[index].module_state,
 | 
			
		||||
        }
 | 
			
		||||
        if Some(&target) == self.io.target().as_deref()
 | 
			
		||||
            || Some(target.base()) != self.io.target().map(|v| v.base())
 | 
			
		||||
        {
 | 
			
		||||
            panic!("simulator read/write expression must be an array element/field of `Simulation::io()`");
 | 
			
		||||
        };
 | 
			
		||||
        panic!("simulator read/write expression must not have dynamic array indexes");
 | 
			
		||||
    }
 | 
			
		||||
    fn mark_target_as_initialized(&mut self, mut target: Target) {
 | 
			
		||||
        fn remove_target_and_children(
 | 
			
		||||
            uninitialized_inputs: &mut HashMap<Target, Vec<Target>>,
 | 
			
		||||
            target: Target,
 | 
			
		||||
        ) {
 | 
			
		||||
            let Some(children) = uninitialized_inputs.remove(&target) else {
 | 
			
		||||
                return;
 | 
			
		||||
            };
 | 
			
		||||
            for child in children {
 | 
			
		||||
                remove_target_and_children(uninitialized_inputs, child);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        remove_target_and_children(&mut self.uninitialized_inputs, target);
 | 
			
		||||
        while let Some(target_child) = target.child() {
 | 
			
		||||
            let parent = target_child.parent();
 | 
			
		||||
            for child in self
 | 
			
		||||
                .uninitialized_inputs
 | 
			
		||||
                .get(&*parent)
 | 
			
		||||
                .map(|v| &**v)
 | 
			
		||||
                .unwrap_or(&[])
 | 
			
		||||
            {
 | 
			
		||||
                if self.uninitialized_inputs.contains_key(child) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            target = *parent;
 | 
			
		||||
            self.uninitialized_inputs.remove(&target);
 | 
			
		||||
    fn get_module_mut(&mut self, which_module: WhichModule) -> &mut SimulationModuleState {
 | 
			
		||||
        match which_module {
 | 
			
		||||
            WhichModule::Main => &mut self.main_module,
 | 
			
		||||
            WhichModule::Extern { index } => &mut self.extern_modules[index].module_state,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    fn read_helper(&mut self, io: Expr<CanonicalType>) -> CompiledValue<CanonicalType> {
 | 
			
		||||
        let Some(target) = io.target() else {
 | 
			
		||||
            panic!("can't read from expression that's not a field/element of `Simulation::io()`");
 | 
			
		||||
        };
 | 
			
		||||
        let compiled_value = self.get_io(*target);
 | 
			
		||||
        if self.made_initial_step {
 | 
			
		||||
            self.settle();
 | 
			
		||||
        } else {
 | 
			
		||||
            match target.flow() {
 | 
			
		||||
                Flow::Source => {
 | 
			
		||||
                    if !self.uninitialized_inputs.is_empty() {
 | 
			
		||||
                        panic!(
 | 
			
		||||
                            "can't read from an output before the simulation has made any steps"
 | 
			
		||||
                        );
 | 
			
		||||
                    }
 | 
			
		||||
                    self.settle();
 | 
			
		||||
                }
 | 
			
		||||
                Flow::Sink => {
 | 
			
		||||
                    if self.uninitialized_inputs.contains_key(&*target) {
 | 
			
		||||
                        panic!("can't read from an uninitialized input");
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                Flow::Duplex => unreachable!(),
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        compiled_value
 | 
			
		||||
    fn read_bit(
 | 
			
		||||
        &mut self,
 | 
			
		||||
        io: Expr<CanonicalType>,
 | 
			
		||||
        which_module: WhichModule,
 | 
			
		||||
    ) -> MaybeNeedsSettle<ReadBitFn, bool> {
 | 
			
		||||
        self.get_module(which_module)
 | 
			
		||||
            .read_helper(Expr::canonical(io), which_module)
 | 
			
		||||
            .map(|compiled_value| ReadBitFn { compiled_value })
 | 
			
		||||
            .apply_no_settle(&mut self.state)
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    fn write_helper(&mut self, io: Expr<CanonicalType>) -> CompiledValue<CanonicalType> {
 | 
			
		||||
        let Some(target) = io.target() else {
 | 
			
		||||
            panic!("can't write to an expression that's not a field/element of `Simulation::io()`");
 | 
			
		||||
        };
 | 
			
		||||
        let compiled_value = self.get_io(*target);
 | 
			
		||||
        match target.flow() {
 | 
			
		||||
            Flow::Source => {
 | 
			
		||||
                panic!("can't write to an output");
 | 
			
		||||
            }
 | 
			
		||||
            Flow::Sink => {}
 | 
			
		||||
            Flow::Duplex => unreachable!(),
 | 
			
		||||
        }
 | 
			
		||||
        if !self.made_initial_step {
 | 
			
		||||
            self.mark_target_as_initialized(*target);
 | 
			
		||||
        }
 | 
			
		||||
    fn write_bit(&mut self, io: Expr<CanonicalType>, value: bool, which_module: WhichModule) {
 | 
			
		||||
        let compiled_value = self
 | 
			
		||||
            .get_module_mut(which_module)
 | 
			
		||||
            .write_helper(io, which_module);
 | 
			
		||||
        self.needs_settle = true;
 | 
			
		||||
        compiled_value
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    fn read_bit(&mut self, io: Expr<CanonicalType>) -> bool {
 | 
			
		||||
        let compiled_value = self.read_helper(Expr::canonical(io));
 | 
			
		||||
        match compiled_value.range.len() {
 | 
			
		||||
            TypeLen::A_SMALL_SLOT => {
 | 
			
		||||
                self.state.small_slots[compiled_value.range.small_slots.start] != 0
 | 
			
		||||
            }
 | 
			
		||||
            TypeLen::A_BIG_SLOT => !self.state.big_slots[compiled_value.range.big_slots.start]
 | 
			
		||||
                .clone()
 | 
			
		||||
                .is_zero(),
 | 
			
		||||
            _ => unreachable!(),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    fn write_bit(&mut self, io: Expr<CanonicalType>, value: bool) {
 | 
			
		||||
        let compiled_value = self.write_helper(io);
 | 
			
		||||
        match compiled_value.range.len() {
 | 
			
		||||
            TypeLen::A_SMALL_SLOT => {
 | 
			
		||||
                self.state.small_slots[compiled_value.range.small_slots.start] = value as _;
 | 
			
		||||
| 
						 | 
				
			
			@ -6967,21 +7209,27 @@ impl SimulationImpl {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    fn read_bool_or_int<I: BoolOrIntType>(&mut self, io: Expr<I>) -> I::Value {
 | 
			
		||||
        let compiled_value = self.read_helper(Expr::canonical(io));
 | 
			
		||||
        match compiled_value.range.len() {
 | 
			
		||||
            TypeLen::A_SMALL_SLOT => Expr::ty(io).value_from_int_wrapping(
 | 
			
		||||
                self.state.small_slots[compiled_value.range.small_slots.start],
 | 
			
		||||
            ),
 | 
			
		||||
            TypeLen::A_BIG_SLOT => Expr::ty(io).value_from_int_wrapping(
 | 
			
		||||
                self.state.big_slots[compiled_value.range.big_slots.start].clone(),
 | 
			
		||||
            ),
 | 
			
		||||
            _ => unreachable!(),
 | 
			
		||||
        }
 | 
			
		||||
    fn read_bool_or_int<I: BoolOrIntType>(
 | 
			
		||||
        &mut self,
 | 
			
		||||
        io: Expr<I>,
 | 
			
		||||
        which_module: WhichModule,
 | 
			
		||||
    ) -> MaybeNeedsSettle<ReadBoolOrIntFn<I>, I::Value> {
 | 
			
		||||
        self.get_module(which_module)
 | 
			
		||||
            .read_helper(Expr::canonical(io), which_module)
 | 
			
		||||
            .map(|compiled_value| ReadBoolOrIntFn { compiled_value, io })
 | 
			
		||||
            .apply_no_settle(&mut self.state)
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    fn write_bool_or_int<I: BoolOrIntType>(&mut self, io: Expr<I>, value: I::Value) {
 | 
			
		||||
        let compiled_value = self.write_helper(Expr::canonical(io));
 | 
			
		||||
    fn write_bool_or_int<I: BoolOrIntType>(
 | 
			
		||||
        &mut self,
 | 
			
		||||
        io: Expr<I>,
 | 
			
		||||
        value: I::Value,
 | 
			
		||||
        which_module: WhichModule,
 | 
			
		||||
    ) {
 | 
			
		||||
        let compiled_value = self
 | 
			
		||||
            .get_module_mut(which_module)
 | 
			
		||||
            .write_helper(Expr::canonical(io), which_module);
 | 
			
		||||
        self.needs_settle = true;
 | 
			
		||||
        let value: BigInt = value.into();
 | 
			
		||||
        match compiled_value.range.len() {
 | 
			
		||||
            TypeLen::A_SMALL_SLOT => {
 | 
			
		||||
| 
						 | 
				
			
			@ -6999,7 +7247,7 @@ impl SimulationImpl {
 | 
			
		|||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    fn read_write_sim_value_helper(
 | 
			
		||||
        &mut self,
 | 
			
		||||
        state: &mut interpreter::State,
 | 
			
		||||
        compiled_value: CompiledValue<CanonicalType>,
 | 
			
		||||
        bits: &mut BitSlice,
 | 
			
		||||
        read_write_big_scalar: impl Fn(bool, &mut BitSlice, &mut BigInt) + Copy,
 | 
			
		||||
| 
						 | 
				
			
			@ -7024,12 +7272,12 @@ impl SimulationImpl {
 | 
			
		|||
                    TypeLen::A_SMALL_SLOT => read_write_small_scalar(
 | 
			
		||||
                        signed,
 | 
			
		||||
                        bits,
 | 
			
		||||
                        &mut self.state.small_slots[compiled_value.range.small_slots.start],
 | 
			
		||||
                        &mut state.small_slots[compiled_value.range.small_slots.start],
 | 
			
		||||
                    ),
 | 
			
		||||
                    TypeLen::A_BIG_SLOT => read_write_big_scalar(
 | 
			
		||||
                        signed,
 | 
			
		||||
                        bits,
 | 
			
		||||
                        &mut self.state.big_slots[compiled_value.range.big_slots.start],
 | 
			
		||||
                        &mut state.big_slots[compiled_value.range.big_slots.start],
 | 
			
		||||
                    ),
 | 
			
		||||
                    _ => unreachable!(),
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -7038,7 +7286,8 @@ impl SimulationImpl {
 | 
			
		|||
                let ty = <Array>::from_canonical(compiled_value.layout.ty);
 | 
			
		||||
                let element_bit_width = ty.element().bit_width();
 | 
			
		||||
                for element_index in 0..ty.len() {
 | 
			
		||||
                    self.read_write_sim_value_helper(
 | 
			
		||||
                    Self::read_write_sim_value_helper(
 | 
			
		||||
                        state,
 | 
			
		||||
                        CompiledValue {
 | 
			
		||||
                            layout: *element,
 | 
			
		||||
                            range: compiled_value
 | 
			
		||||
| 
						 | 
				
			
			@ -7062,7 +7311,8 @@ impl SimulationImpl {
 | 
			
		|||
                    },
 | 
			
		||||
                ) in ty.fields().iter().zip(ty.field_offsets()).zip(fields)
 | 
			
		||||
                {
 | 
			
		||||
                    self.read_write_sim_value_helper(
 | 
			
		||||
                    Self::read_write_sim_value_helper(
 | 
			
		||||
                        state,
 | 
			
		||||
                        CompiledValue {
 | 
			
		||||
                            layout: field_layout,
 | 
			
		||||
                            range: compiled_value.range.slice(TypeIndexRange::new(
 | 
			
		||||
| 
						 | 
				
			
			@ -7080,29 +7330,30 @@ impl SimulationImpl {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    fn read(&mut self, io: Expr<CanonicalType>) -> SimValue<CanonicalType> {
 | 
			
		||||
        let compiled_value = self.read_helper(io);
 | 
			
		||||
        let mut bits = BitVec::repeat(false, compiled_value.layout.ty.bit_width());
 | 
			
		||||
        self.read_write_sim_value_helper(
 | 
			
		||||
            compiled_value,
 | 
			
		||||
            &mut bits,
 | 
			
		||||
            |_signed, bits, value| <UInt>::copy_bits_from_bigint_wrapping(value, bits),
 | 
			
		||||
            |_signed, bits, value| {
 | 
			
		||||
                let bytes = value.to_le_bytes();
 | 
			
		||||
                let bitslice = BitSlice::<u8, Lsb0>::from_slice(&bytes);
 | 
			
		||||
                bits.clone_from_bitslice(&bitslice[..bits.len()]);
 | 
			
		||||
            },
 | 
			
		||||
        );
 | 
			
		||||
        SimValue {
 | 
			
		||||
            ty: Expr::ty(io),
 | 
			
		||||
            bits,
 | 
			
		||||
        }
 | 
			
		||||
    fn read(
 | 
			
		||||
        &mut self,
 | 
			
		||||
        io: Expr<CanonicalType>,
 | 
			
		||||
        which_module: WhichModule,
 | 
			
		||||
    ) -> MaybeNeedsSettle<ReadFn, SimValue<CanonicalType>> {
 | 
			
		||||
        self.get_module(which_module)
 | 
			
		||||
            .read_helper(io, which_module)
 | 
			
		||||
            .map(|compiled_value| ReadFn { compiled_value, io })
 | 
			
		||||
            .apply_no_settle(&mut self.state)
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    fn write(&mut self, io: Expr<CanonicalType>, value: SimValue<CanonicalType>) {
 | 
			
		||||
        let compiled_value = self.write_helper(io);
 | 
			
		||||
    fn write(
 | 
			
		||||
        &mut self,
 | 
			
		||||
        io: Expr<CanonicalType>,
 | 
			
		||||
        value: SimValue<CanonicalType>,
 | 
			
		||||
        which_module: WhichModule,
 | 
			
		||||
    ) {
 | 
			
		||||
        let compiled_value = self
 | 
			
		||||
            .get_module_mut(which_module)
 | 
			
		||||
            .write_helper(io, which_module);
 | 
			
		||||
        self.needs_settle = true;
 | 
			
		||||
        assert_eq!(Expr::ty(io), value.ty());
 | 
			
		||||
        self.read_write_sim_value_helper(
 | 
			
		||||
        Self::read_write_sim_value_helper(
 | 
			
		||||
            &mut self.state,
 | 
			
		||||
            compiled_value,
 | 
			
		||||
            &mut value.into_bits(),
 | 
			
		||||
            |signed, bits, value| {
 | 
			
		||||
| 
						 | 
				
			
			@ -7122,6 +7373,19 @@ impl SimulationImpl {
 | 
			
		|||
            },
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    fn settle_if_needed<F, O>(&mut self, v: MaybeNeedsSettle<F, O>) -> O
 | 
			
		||||
    where
 | 
			
		||||
        for<'a> F: MaybeNeedsSettleFn<&'a mut interpreter::State, Output = O>,
 | 
			
		||||
    {
 | 
			
		||||
        match v {
 | 
			
		||||
            MaybeNeedsSettle::NeedsSettle(v) => {
 | 
			
		||||
                self.settle();
 | 
			
		||||
                v.call(&mut self.state)
 | 
			
		||||
            }
 | 
			
		||||
            MaybeNeedsSettle::NoSettleNeeded(v) => v,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    fn close_all_trace_writers(&mut self) -> std::io::Result<()> {
 | 
			
		||||
        let trace_writers = mem::take(&mut self.trace_writers);
 | 
			
		||||
        let mut retval = Ok(());
 | 
			
		||||
| 
						 | 
				
			
			@ -7192,13 +7456,13 @@ impl SimulationImpl {
 | 
			
		|||
        retval
 | 
			
		||||
    }
 | 
			
		||||
    fn close(mut self) -> std::io::Result<()> {
 | 
			
		||||
        if self.made_initial_step {
 | 
			
		||||
        if self.main_module.did_initial_settle {
 | 
			
		||||
            self.settle();
 | 
			
		||||
        }
 | 
			
		||||
        self.close_all_trace_writers()
 | 
			
		||||
    }
 | 
			
		||||
    fn flush_traces(&mut self) -> std::io::Result<()> {
 | 
			
		||||
        if self.made_initial_step {
 | 
			
		||||
        if self.main_module.did_initial_settle {
 | 
			
		||||
            self.settle();
 | 
			
		||||
        }
 | 
			
		||||
        self.for_each_trace_writer_getting_error(
 | 
			
		||||
| 
						 | 
				
			
			@ -7335,7 +7599,8 @@ impl<T: BundleType> Simulation<T> {
 | 
			
		|||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    pub fn read_bool_or_int<I: BoolOrIntType>(&mut self, io: Expr<I>) -> I::Value {
 | 
			
		||||
        self.sim_impl.read_bool_or_int(io)
 | 
			
		||||
        let retval = self.sim_impl.read_bool_or_int(io, WhichModule::Main);
 | 
			
		||||
        self.sim_impl.settle_if_needed(retval)
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    pub fn write_bool_or_int<I: BoolOrIntType>(
 | 
			
		||||
| 
						 | 
				
			
			@ -7348,42 +7613,59 @@ impl<T: BundleType> Simulation<T> {
 | 
			
		|||
        let value = value
 | 
			
		||||
            .to_literal_bits()
 | 
			
		||||
            .expect("the value that is being written to an input must be a literal");
 | 
			
		||||
        self.sim_impl
 | 
			
		||||
            .write_bool_or_int(io, I::bits_to_value(Cow::Borrowed(&value)));
 | 
			
		||||
        self.sim_impl.write_bool_or_int(
 | 
			
		||||
            io,
 | 
			
		||||
            I::bits_to_value(Cow::Borrowed(&value)),
 | 
			
		||||
            WhichModule::Main,
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    pub fn write_clock(&mut self, io: Expr<Clock>, value: bool) {
 | 
			
		||||
        self.sim_impl.write_bit(Expr::canonical(io), value);
 | 
			
		||||
        self.sim_impl
 | 
			
		||||
            .write_bit(Expr::canonical(io), value, WhichModule::Main);
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    pub fn read_clock(&mut self, io: Expr<Clock>) -> bool {
 | 
			
		||||
        self.sim_impl.read_bit(Expr::canonical(io))
 | 
			
		||||
        let retval = self
 | 
			
		||||
            .sim_impl
 | 
			
		||||
            .read_bit(Expr::canonical(io), WhichModule::Main);
 | 
			
		||||
        self.sim_impl.settle_if_needed(retval)
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    pub fn write_bool(&mut self, io: Expr<Bool>, value: bool) {
 | 
			
		||||
        self.sim_impl.write_bit(Expr::canonical(io), value);
 | 
			
		||||
        self.sim_impl
 | 
			
		||||
            .write_bit(Expr::canonical(io), value, WhichModule::Main);
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    pub fn read_bool(&mut self, io: Expr<Bool>) -> bool {
 | 
			
		||||
        self.sim_impl.read_bit(Expr::canonical(io))
 | 
			
		||||
        let retval = self
 | 
			
		||||
            .sim_impl
 | 
			
		||||
            .read_bit(Expr::canonical(io), WhichModule::Main);
 | 
			
		||||
        self.sim_impl.settle_if_needed(retval)
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    pub fn write_reset<R: ResetType>(&mut self, io: Expr<R>, value: bool) {
 | 
			
		||||
        self.sim_impl.write_bit(Expr::canonical(io), value);
 | 
			
		||||
        self.sim_impl
 | 
			
		||||
            .write_bit(Expr::canonical(io), value, WhichModule::Main);
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    pub fn read_reset<R: ResetType>(&mut self, io: Expr<R>) -> bool {
 | 
			
		||||
        self.sim_impl.read_bit(Expr::canonical(io))
 | 
			
		||||
        let retval = self
 | 
			
		||||
            .sim_impl
 | 
			
		||||
            .read_bit(Expr::canonical(io), WhichModule::Main);
 | 
			
		||||
        self.sim_impl.settle_if_needed(retval)
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    pub fn read<IO: Type>(&mut self, io: Expr<IO>) -> SimValue<IO> {
 | 
			
		||||
        SimValue::from_canonical(self.sim_impl.read(Expr::canonical(io)))
 | 
			
		||||
        let retval = self.sim_impl.read(Expr::canonical(io), WhichModule::Main);
 | 
			
		||||
        SimValue::from_canonical(self.sim_impl.settle_if_needed(retval))
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    pub fn write<IO: Type, V: ToSimValue<IO>>(&mut self, io: Expr<IO>, value: V) {
 | 
			
		||||
        self.sim_impl.write(
 | 
			
		||||
            Expr::canonical(io),
 | 
			
		||||
            value.into_sim_value(Expr::ty(io)).into_canonical(),
 | 
			
		||||
            WhichModule::Main,
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
    #[doc(hidden)]
 | 
			
		||||
| 
						 | 
				
			
			@ -7462,39 +7744,60 @@ impl InternedCompare for dyn DynExternModuleSimGenerator {
 | 
			
		|||
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
 | 
			
		||||
pub struct ExternModuleSimulation<T: BundleType> {
 | 
			
		||||
    generator: Interned<dyn DynExternModuleSimGenerator>,
 | 
			
		||||
    source_location: SourceLocation,
 | 
			
		||||
    _phantom: PhantomData<T>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<T: BundleType> ExternModuleSimulation<T> {
 | 
			
		||||
    pub fn new<G: ExternModuleSimGenerator>(generator: G) -> Self {
 | 
			
		||||
    pub fn new_with_loc<G: ExternModuleSimGenerator>(
 | 
			
		||||
        source_location: SourceLocation,
 | 
			
		||||
        generator: G,
 | 
			
		||||
    ) -> Self {
 | 
			
		||||
        Self {
 | 
			
		||||
            generator: Interned::cast_unchecked(
 | 
			
		||||
                generator.intern(),
 | 
			
		||||
                |v| -> &dyn DynExternModuleSimGenerator { v },
 | 
			
		||||
            ),
 | 
			
		||||
            source_location,
 | 
			
		||||
            _phantom: PhantomData,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    pub fn new<G: ExternModuleSimGenerator>(generator: G) -> Self {
 | 
			
		||||
        Self::new_with_loc(SourceLocation::caller(), generator)
 | 
			
		||||
    }
 | 
			
		||||
    pub fn canonical(self) -> ExternModuleSimulation<Bundle> {
 | 
			
		||||
        let Self {
 | 
			
		||||
            generator,
 | 
			
		||||
            source_location,
 | 
			
		||||
            _phantom: _,
 | 
			
		||||
        } = self;
 | 
			
		||||
        ExternModuleSimulation {
 | 
			
		||||
            generator: self.generator,
 | 
			
		||||
            generator,
 | 
			
		||||
            source_location,
 | 
			
		||||
            _phantom: PhantomData,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    pub fn from_canonical(v: ExternModuleSimulation<Bundle>) -> Self {
 | 
			
		||||
        let ExternModuleSimulation {
 | 
			
		||||
            generator,
 | 
			
		||||
            source_location,
 | 
			
		||||
            _phantom: _,
 | 
			
		||||
        } = v;
 | 
			
		||||
        Self {
 | 
			
		||||
            generator: v.generator,
 | 
			
		||||
            generator,
 | 
			
		||||
            source_location,
 | 
			
		||||
            _phantom: PhantomData,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl ExternModuleSimulation<Bundle> {
 | 
			
		||||
    fn run<'a>(
 | 
			
		||||
        &'a self,
 | 
			
		||||
    fn run(
 | 
			
		||||
        &self,
 | 
			
		||||
        sim: ExternModuleSimulationState<Bundle>,
 | 
			
		||||
    ) -> Box<dyn Future<Output = ()> + 'a> {
 | 
			
		||||
        self.generator.dyn_run(sim)
 | 
			
		||||
    ) -> Box<dyn Future<Output = ()> + 'static> {
 | 
			
		||||
        Interned::into_inner(self.generator).dyn_run(sim)
 | 
			
		||||
    }
 | 
			
		||||
    #[track_caller]
 | 
			
		||||
    pub fn check_io_ty(self, io_ty: Bundle) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -92,44 +92,29 @@ Simulation {
 | 
			
		|||
            ..
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    uninitialized_inputs: {},
 | 
			
		||||
    io_targets: {
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::conditional_assignment_last,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: conditional_assignment_last,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.i: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Bool,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(conditional_assignment_last: conditional_assignment_last).conditional_assignment_last::i",
 | 
			
		||||
                                ty: Bool,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
    main_module: SimulationModuleState {
 | 
			
		||||
        base_targets: [
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::conditional_assignment_last,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: conditional_assignment_last,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
            }.i,
 | 
			
		||||
        ],
 | 
			
		||||
        uninitialized_ios: {},
 | 
			
		||||
        io_targets: {
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::conditional_assignment_last,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: conditional_assignment_last,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.i,
 | 
			
		||||
        },
 | 
			
		||||
        did_initial_settle: true,
 | 
			
		||||
    },
 | 
			
		||||
    made_initial_step: true,
 | 
			
		||||
    extern_modules: [],
 | 
			
		||||
    needs_settle: false,
 | 
			
		||||
    trace_decls: TraceModule {
 | 
			
		||||
        name: "conditional_assignment_last",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,44 +68,29 @@ Simulation {
 | 
			
		|||
            ..
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    uninitialized_inputs: {},
 | 
			
		||||
    io_targets: {
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::connect_const,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: connect_const,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.o: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: UInt<8>,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(connect_const: connect_const).connect_const::o",
 | 
			
		||||
                                ty: UInt<8>,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
    main_module: SimulationModuleState {
 | 
			
		||||
        base_targets: [
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::connect_const,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: connect_const,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
            }.o,
 | 
			
		||||
        ],
 | 
			
		||||
        uninitialized_ios: {},
 | 
			
		||||
        io_targets: {
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::connect_const,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: connect_const,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.o,
 | 
			
		||||
        },
 | 
			
		||||
        did_initial_settle: true,
 | 
			
		||||
    },
 | 
			
		||||
    made_initial_step: true,
 | 
			
		||||
    extern_modules: [],
 | 
			
		||||
    needs_settle: false,
 | 
			
		||||
    trace_decls: TraceModule {
 | 
			
		||||
        name: "connect_const",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -97,78 +97,43 @@ Simulation {
 | 
			
		|||
            ..
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    uninitialized_inputs: {},
 | 
			
		||||
    io_targets: {
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::connect_const_reset,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: connect_const_reset,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.bit_out: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Bool,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(connect_const_reset: connect_const_reset).connect_const_reset::bit_out",
 | 
			
		||||
                                ty: Bool,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
    main_module: SimulationModuleState {
 | 
			
		||||
        base_targets: [
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::connect_const_reset,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: connect_const_reset,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 1, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::connect_const_reset,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: connect_const_reset,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.reset_out: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: AsyncReset,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(connect_const_reset: connect_const_reset).connect_const_reset::reset_out",
 | 
			
		||||
                                ty: AsyncReset,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
            }.reset_out,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::connect_const_reset,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: connect_const_reset,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
            }.bit_out,
 | 
			
		||||
        ],
 | 
			
		||||
        uninitialized_ios: {},
 | 
			
		||||
        io_targets: {
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::connect_const_reset,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: connect_const_reset,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.bit_out,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::connect_const_reset,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: connect_const_reset,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.reset_out,
 | 
			
		||||
        },
 | 
			
		||||
        did_initial_settle: true,
 | 
			
		||||
    },
 | 
			
		||||
    made_initial_step: true,
 | 
			
		||||
    extern_modules: [],
 | 
			
		||||
    needs_settle: false,
 | 
			
		||||
    trace_decls: TraceModule {
 | 
			
		||||
        name: "connect_const_reset",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -203,212 +203,57 @@ Simulation {
 | 
			
		|||
            ..
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    uninitialized_inputs: {},
 | 
			
		||||
    io_targets: {
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::counter,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: counter,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.cd: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Bundle {
 | 
			
		||||
                    /* offset = 0 */
 | 
			
		||||
                    clk: Clock,
 | 
			
		||||
                    /* offset = 1 */
 | 
			
		||||
                    rst: AsyncReset,
 | 
			
		||||
    main_module: SimulationModuleState {
 | 
			
		||||
        base_targets: [
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::counter,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: counter,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 2,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(counter: counter).counter::cd.clk",
 | 
			
		||||
                                ty: Clock,
 | 
			
		||||
                            },
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(counter: counter).counter::cd.rst",
 | 
			
		||||
                                ty: AsyncReset,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
            }.cd,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::counter,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: counter,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
                body: Bundle {
 | 
			
		||||
                    fields: [
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(0),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: Clock,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: Clock,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(1),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: AsyncReset,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: AsyncReset,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                    ],
 | 
			
		||||
            }.count,
 | 
			
		||||
        ],
 | 
			
		||||
        uninitialized_ios: {},
 | 
			
		||||
        io_targets: {
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::counter,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: counter,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 2 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::counter,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: counter,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.cd.clk: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Clock,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: Clock,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::counter,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: counter,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.cd.rst: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: AsyncReset,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: AsyncReset,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 1, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::counter,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: counter,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.count: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: UInt<4>,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(counter: counter).counter::count",
 | 
			
		||||
                                ty: UInt<4>,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 2, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
            }.cd,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::counter,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: counter,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.cd.clk,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::counter,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: counter,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.cd.rst,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::counter,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: counter,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.count,
 | 
			
		||||
        },
 | 
			
		||||
        did_initial_settle: true,
 | 
			
		||||
    },
 | 
			
		||||
    made_initial_step: true,
 | 
			
		||||
    extern_modules: [],
 | 
			
		||||
    needs_settle: false,
 | 
			
		||||
    trace_decls: TraceModule {
 | 
			
		||||
        name: "counter",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -184,212 +184,57 @@ Simulation {
 | 
			
		|||
            ..
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    uninitialized_inputs: {},
 | 
			
		||||
    io_targets: {
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::counter,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: counter,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.cd: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Bundle {
 | 
			
		||||
                    /* offset = 0 */
 | 
			
		||||
                    clk: Clock,
 | 
			
		||||
                    /* offset = 1 */
 | 
			
		||||
                    rst: SyncReset,
 | 
			
		||||
    main_module: SimulationModuleState {
 | 
			
		||||
        base_targets: [
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::counter,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: counter,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 2,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(counter: counter).counter::cd.clk",
 | 
			
		||||
                                ty: Clock,
 | 
			
		||||
                            },
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(counter: counter).counter::cd.rst",
 | 
			
		||||
                                ty: SyncReset,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
            }.cd,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::counter,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: counter,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
                body: Bundle {
 | 
			
		||||
                    fields: [
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(0),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: Clock,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: Clock,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(1),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: SyncReset,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: SyncReset,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                    ],
 | 
			
		||||
            }.count,
 | 
			
		||||
        ],
 | 
			
		||||
        uninitialized_ios: {},
 | 
			
		||||
        io_targets: {
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::counter,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: counter,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 2 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::counter,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: counter,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.cd.clk: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Clock,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: Clock,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::counter,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: counter,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.cd.rst: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: SyncReset,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: SyncReset,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 1, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::counter,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: counter,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.count: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: UInt<4>,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(counter: counter).counter::count",
 | 
			
		||||
                                ty: UInt<4>,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 2, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
            }.cd,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::counter,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: counter,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.cd.clk,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::counter,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: counter,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.cd.rst,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::counter,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: counter,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.count,
 | 
			
		||||
        },
 | 
			
		||||
        did_initial_settle: true,
 | 
			
		||||
    },
 | 
			
		||||
    made_initial_step: true,
 | 
			
		||||
    extern_modules: [],
 | 
			
		||||
    needs_settle: false,
 | 
			
		||||
    trace_decls: TraceModule {
 | 
			
		||||
        name: "counter",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -88,9 +88,13 @@ Simulation {
 | 
			
		|||
            ..
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    uninitialized_inputs: {},
 | 
			
		||||
    io_targets: {},
 | 
			
		||||
    made_initial_step: true,
 | 
			
		||||
    main_module: SimulationModuleState {
 | 
			
		||||
        base_targets: [],
 | 
			
		||||
        uninitialized_ios: {},
 | 
			
		||||
        io_targets: {},
 | 
			
		||||
        did_initial_settle: true,
 | 
			
		||||
    },
 | 
			
		||||
    extern_modules: [],
 | 
			
		||||
    needs_settle: false,
 | 
			
		||||
    trace_decls: TraceModule {
 | 
			
		||||
        name: "duplicate_names",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1215,388 +1215,127 @@ Simulation {
 | 
			
		|||
            ..
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    uninitialized_inputs: {},
 | 
			
		||||
    io_targets: {
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::enums,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: enums,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.b_out: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Enum {
 | 
			
		||||
                    HdlNone,
 | 
			
		||||
                    HdlSome(Bundle {0: UInt<1>, 1: Bool}),
 | 
			
		||||
    main_module: SimulationModuleState {
 | 
			
		||||
        base_targets: [
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::enums,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: enums,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(enums: enums).enums::b_out",
 | 
			
		||||
                                ty: Enum {
 | 
			
		||||
                                    HdlNone,
 | 
			
		||||
                                    HdlSome(Bundle {0: UInt<1>, 1: Bool}),
 | 
			
		||||
                                },
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
            }.cd,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::enums,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: enums,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 7, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::enums,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: enums,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.cd: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Bundle {
 | 
			
		||||
                    /* offset = 0 */
 | 
			
		||||
                    clk: Clock,
 | 
			
		||||
                    /* offset = 1 */
 | 
			
		||||
                    rst: SyncReset,
 | 
			
		||||
                },
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 2,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(enums: enums).enums::cd.clk",
 | 
			
		||||
                                ty: Clock,
 | 
			
		||||
                            },
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(enums: enums).enums::cd.rst",
 | 
			
		||||
                                ty: SyncReset,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Bundle {
 | 
			
		||||
                    fields: [
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(0),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: Clock,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: Clock,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(1),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: SyncReset,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: SyncReset,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                    ],
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 2 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::enums,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: enums,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.cd.clk: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Clock,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: Clock,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::enums,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: enums,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.cd.rst: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: SyncReset,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: SyncReset,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 1, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::enums,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: enums,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.data_in: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: UInt<4>,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(enums: enums).enums::data_in",
 | 
			
		||||
                                ty: UInt<4>,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 4, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::enums,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: enums,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.data_out: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: UInt<4>,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(enums: enums).enums::data_out",
 | 
			
		||||
                                ty: UInt<4>,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 6, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::enums,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: enums,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.en: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Bool,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(enums: enums).enums::en",
 | 
			
		||||
                                ty: Bool,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 2, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::enums,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: enums,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.which_in: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: UInt<2>,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(enums: enums).enums::which_in",
 | 
			
		||||
                                ty: UInt<2>,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 3, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::enums,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: enums,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.which_out: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: UInt<2>,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(enums: enums).enums::which_out",
 | 
			
		||||
                                ty: UInt<2>,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 5, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
            }.en,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::enums,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: enums,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.which_in,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::enums,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: enums,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.data_in,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::enums,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: enums,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.which_out,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::enums,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: enums,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.data_out,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::enums,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: enums,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.b_out,
 | 
			
		||||
        ],
 | 
			
		||||
        uninitialized_ios: {},
 | 
			
		||||
        io_targets: {
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::enums,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: enums,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.b_out,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::enums,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: enums,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.cd,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::enums,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: enums,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.cd.clk,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::enums,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: enums,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.cd.rst,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::enums,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: enums,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.data_in,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::enums,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: enums,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.data_out,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::enums,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: enums,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.en,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::enums,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: enums,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.which_in,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::enums,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: enums,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.which_out,
 | 
			
		||||
        },
 | 
			
		||||
        did_initial_settle: true,
 | 
			
		||||
    },
 | 
			
		||||
    made_initial_step: true,
 | 
			
		||||
    extern_modules: [],
 | 
			
		||||
    needs_settle: false,
 | 
			
		||||
    trace_decls: TraceModule {
 | 
			
		||||
        name: "enums",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -598,513 +598,78 @@ Simulation {
 | 
			
		|||
            ..
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    uninitialized_inputs: {},
 | 
			
		||||
    io_targets: {
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::memories2,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: memories2,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.rw: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Bundle {
 | 
			
		||||
                    /* offset = 0 */
 | 
			
		||||
                    addr: UInt<3>,
 | 
			
		||||
                    /* offset = 3 */
 | 
			
		||||
                    en: Bool,
 | 
			
		||||
                    /* offset = 4 */
 | 
			
		||||
                    clk: Clock,
 | 
			
		||||
                    #[hdl(flip)] /* offset = 5 */
 | 
			
		||||
                    rdata: UInt<2>,
 | 
			
		||||
                    /* offset = 7 */
 | 
			
		||||
                    wmode: Bool,
 | 
			
		||||
                    /* offset = 8 */
 | 
			
		||||
                    wdata: UInt<2>,
 | 
			
		||||
                    /* offset = 10 */
 | 
			
		||||
                    wmask: Bool,
 | 
			
		||||
    main_module: SimulationModuleState {
 | 
			
		||||
        base_targets: [
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::memories2,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: memories2,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 7,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(memories2: memories2).memories2::rw.addr",
 | 
			
		||||
                                ty: UInt<3>,
 | 
			
		||||
                            },
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(memories2: memories2).memories2::rw.en",
 | 
			
		||||
                                ty: Bool,
 | 
			
		||||
                            },
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(memories2: memories2).memories2::rw.clk",
 | 
			
		||||
                                ty: Clock,
 | 
			
		||||
                            },
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(memories2: memories2).memories2::rw.rdata",
 | 
			
		||||
                                ty: UInt<2>,
 | 
			
		||||
                            },
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(memories2: memories2).memories2::rw.wmode",
 | 
			
		||||
                                ty: Bool,
 | 
			
		||||
                            },
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(memories2: memories2).memories2::rw.wdata",
 | 
			
		||||
                                ty: UInt<2>,
 | 
			
		||||
                            },
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(memories2: memories2).memories2::rw.wmask",
 | 
			
		||||
                                ty: Bool,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
            }.rw,
 | 
			
		||||
        ],
 | 
			
		||||
        uninitialized_ios: {},
 | 
			
		||||
        io_targets: {
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::memories2,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: memories2,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
                body: Bundle {
 | 
			
		||||
                    fields: [
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(0),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: UInt<3>,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: UInt<3>,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(1),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: Bool,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: Bool,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(2),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: Clock,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: Clock,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(3),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: UInt<2>,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: UInt<2>,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(4),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: Bool,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: Bool,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(5),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: UInt<2>,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: UInt<2>,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(6),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: Bool,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: Bool,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                    ],
 | 
			
		||||
            }.rw,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::memories2,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: memories2,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 7 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::memories2,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: memories2,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.rw.addr: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: UInt<3>,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: UInt<3>,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::memories2,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: memories2,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.rw.clk: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Clock,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: Clock,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 2, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::memories2,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: memories2,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.rw.en: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Bool,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: Bool,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 1, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::memories2,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: memories2,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.rw.rdata: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: UInt<2>,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: UInt<2>,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 3, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::memories2,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: memories2,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.rw.wdata: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: UInt<2>,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: UInt<2>,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 5, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::memories2,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: memories2,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.rw.wmask: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Bool,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: Bool,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 6, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::memories2,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: memories2,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.rw.wmode: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Bool,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: Bool,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 4, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
            }.rw.addr,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::memories2,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: memories2,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.rw.clk,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::memories2,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: memories2,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.rw.en,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::memories2,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: memories2,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.rw.rdata,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::memories2,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: memories2,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.rw.wdata,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::memories2,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: memories2,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.rw.wmask,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::memories2,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: memories2,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.rw.wmode,
 | 
			
		||||
        },
 | 
			
		||||
        did_initial_settle: true,
 | 
			
		||||
    },
 | 
			
		||||
    made_initial_step: true,
 | 
			
		||||
    extern_modules: [],
 | 
			
		||||
    needs_settle: false,
 | 
			
		||||
    trace_decls: TraceModule {
 | 
			
		||||
        name: "memories2",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -216,312 +216,57 @@ Simulation {
 | 
			
		|||
            ..
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    uninitialized_inputs: {},
 | 
			
		||||
    io_targets: {
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::mod1,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: mod1,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.o: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Bundle {
 | 
			
		||||
                    #[hdl(flip)] /* offset = 0 */
 | 
			
		||||
                    i: UInt<4>,
 | 
			
		||||
                    /* offset = 4 */
 | 
			
		||||
                    o: SInt<2>,
 | 
			
		||||
                    #[hdl(flip)] /* offset = 6 */
 | 
			
		||||
                    i2: SInt<2>,
 | 
			
		||||
                    /* offset = 8 */
 | 
			
		||||
                    o2: UInt<4>,
 | 
			
		||||
    main_module: SimulationModuleState {
 | 
			
		||||
        base_targets: [
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::mod1,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: mod1,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 4,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(mod1: mod1).mod1::o.i",
 | 
			
		||||
                                ty: UInt<4>,
 | 
			
		||||
                            },
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(mod1: mod1).mod1::o.o",
 | 
			
		||||
                                ty: SInt<2>,
 | 
			
		||||
                            },
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(mod1: mod1).mod1::o.i2",
 | 
			
		||||
                                ty: SInt<2>,
 | 
			
		||||
                            },
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(mod1: mod1).mod1::o.o2",
 | 
			
		||||
                                ty: UInt<4>,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
            }.o,
 | 
			
		||||
        ],
 | 
			
		||||
        uninitialized_ios: {},
 | 
			
		||||
        io_targets: {
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::mod1,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: mod1,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
                body: Bundle {
 | 
			
		||||
                    fields: [
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(0),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: UInt<4>,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: UInt<4>,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(1),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: SInt<2>,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: SInt<2>,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(2),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: SInt<2>,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: SInt<2>,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(3),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: UInt<4>,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: UInt<4>,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                    ],
 | 
			
		||||
            }.o,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::mod1,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: mod1,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 4 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::mod1,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: mod1,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.o.i: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: UInt<4>,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: UInt<4>,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::mod1,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: mod1,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.o.i2: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: SInt<2>,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: SInt<2>,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 2, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::mod1,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: mod1,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.o.o: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: SInt<2>,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: SInt<2>,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 1, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::mod1,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: mod1,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.o.o2: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: UInt<4>,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: UInt<4>,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 3, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
            }.o.i,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::mod1,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: mod1,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.o.i2,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::mod1,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: mod1,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.o.o,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::mod1,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: mod1,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.o.o2,
 | 
			
		||||
        },
 | 
			
		||||
        did_initial_settle: true,
 | 
			
		||||
    },
 | 
			
		||||
    made_initial_step: true,
 | 
			
		||||
    extern_modules: [],
 | 
			
		||||
    needs_settle: false,
 | 
			
		||||
    trace_decls: TraceModule {
 | 
			
		||||
        name: "mod1",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -265,246 +265,71 @@ Simulation {
 | 
			
		|||
            ..
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    uninitialized_inputs: {},
 | 
			
		||||
    io_targets: {
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::shift_register,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: shift_register,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.cd: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Bundle {
 | 
			
		||||
                    /* offset = 0 */
 | 
			
		||||
                    clk: Clock,
 | 
			
		||||
                    /* offset = 1 */
 | 
			
		||||
                    rst: SyncReset,
 | 
			
		||||
    main_module: SimulationModuleState {
 | 
			
		||||
        base_targets: [
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::shift_register,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: shift_register,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 2,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(shift_register: shift_register).shift_register::cd.clk",
 | 
			
		||||
                                ty: Clock,
 | 
			
		||||
                            },
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(shift_register: shift_register).shift_register::cd.rst",
 | 
			
		||||
                                ty: SyncReset,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
            }.cd,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::shift_register,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: shift_register,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
                body: Bundle {
 | 
			
		||||
                    fields: [
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(0),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: Clock,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: Clock,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                        CompiledBundleField {
 | 
			
		||||
                            offset: TypeIndex {
 | 
			
		||||
                                small_slots: StatePartIndex<SmallSlots>(0),
 | 
			
		||||
                                big_slots: StatePartIndex<BigSlots>(1),
 | 
			
		||||
                            },
 | 
			
		||||
                            ty: CompiledTypeLayout {
 | 
			
		||||
                                ty: SyncReset,
 | 
			
		||||
                                layout: TypeLayout {
 | 
			
		||||
                                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                                        len: 0,
 | 
			
		||||
                                        debug_data: [],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                                        len: 1,
 | 
			
		||||
                                        debug_data: [
 | 
			
		||||
                                            SlotDebugData {
 | 
			
		||||
                                                name: "",
 | 
			
		||||
                                                ty: SyncReset,
 | 
			
		||||
                                            },
 | 
			
		||||
                                        ],
 | 
			
		||||
                                        ..
 | 
			
		||||
                                    },
 | 
			
		||||
                                },
 | 
			
		||||
                                body: Scalar,
 | 
			
		||||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                    ],
 | 
			
		||||
            }.d,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::shift_register,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: shift_register,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 2 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::shift_register,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: shift_register,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.cd.clk: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Clock,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: Clock,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::shift_register,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: shift_register,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.cd.rst: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: SyncReset,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "",
 | 
			
		||||
                                ty: SyncReset,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 1, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::shift_register,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: shift_register,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.d: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Bool,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(shift_register: shift_register).shift_register::d",
 | 
			
		||||
                                ty: Bool,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 2, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
        },
 | 
			
		||||
        Instance {
 | 
			
		||||
            name: <simulator>::shift_register,
 | 
			
		||||
            instantiated: Module {
 | 
			
		||||
                name: shift_register,
 | 
			
		||||
                ..
 | 
			
		||||
            },
 | 
			
		||||
        }.q: CompiledValue {
 | 
			
		||||
            layout: CompiledTypeLayout {
 | 
			
		||||
                ty: Bool,
 | 
			
		||||
                layout: TypeLayout {
 | 
			
		||||
                    small_slots: StatePartLayout<SmallSlots> {
 | 
			
		||||
                        len: 0,
 | 
			
		||||
                        debug_data: [],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                    big_slots: StatePartLayout<BigSlots> {
 | 
			
		||||
                        len: 1,
 | 
			
		||||
                        debug_data: [
 | 
			
		||||
                            SlotDebugData {
 | 
			
		||||
                                name: "InstantiatedModule(shift_register: shift_register).shift_register::q",
 | 
			
		||||
                                ty: Bool,
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                        ..
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                body: Scalar,
 | 
			
		||||
            },
 | 
			
		||||
            range: TypeIndexRange {
 | 
			
		||||
                small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
 | 
			
		||||
                big_slots: StatePartIndexRange<BigSlots> { start: 3, len: 1 },
 | 
			
		||||
            },
 | 
			
		||||
            write: None,
 | 
			
		||||
            }.q,
 | 
			
		||||
        ],
 | 
			
		||||
        uninitialized_ios: {},
 | 
			
		||||
        io_targets: {
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::shift_register,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: shift_register,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.cd,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::shift_register,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: shift_register,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.cd.clk,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::shift_register,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: shift_register,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.cd.rst,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::shift_register,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: shift_register,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.d,
 | 
			
		||||
            Instance {
 | 
			
		||||
                name: <simulator>::shift_register,
 | 
			
		||||
                instantiated: Module {
 | 
			
		||||
                    name: shift_register,
 | 
			
		||||
                    ..
 | 
			
		||||
                },
 | 
			
		||||
            }.q,
 | 
			
		||||
        },
 | 
			
		||||
        did_initial_settle: true,
 | 
			
		||||
    },
 | 
			
		||||
    made_initial_step: true,
 | 
			
		||||
    extern_modules: [],
 | 
			
		||||
    needs_settle: false,
 | 
			
		||||
    trace_decls: TraceModule {
 | 
			
		||||
        name: "shift_register",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue