From 0143e1253b717cda81026f19997c2decb81553ee Mon Sep 17 00:00:00 2001 From: Jacob Lifshay Date: Mon, 27 Oct 2025 22:41:33 -0700 Subject: [PATCH] WIP adding next_pc --- crates/cpu/src/config.rs | 28 + crates/cpu/src/lib.rs | 1 + crates/cpu/src/next_pc.rs | 728 ++++ crates/cpu/tests/expected/next_pc.vcd | 4702 +++++++++++++++++++++++++ crates/cpu/tests/next_pc.rs | 45 + 5 files changed, 5504 insertions(+) create mode 100644 crates/cpu/src/next_pc.rs create mode 100644 crates/cpu/tests/expected/next_pc.vcd create mode 100644 crates/cpu/tests/next_pc.rs diff --git a/crates/cpu/src/config.rs b/crates/cpu/src/config.rs index 9a66c68..b3d9905 100644 --- a/crates/cpu/src/config.rs +++ b/crates/cpu/src/config.rs @@ -34,6 +34,8 @@ pub struct CpuConfig { pub units: Vec, pub out_reg_num_width: usize, pub fetch_width: NonZeroUsize, + pub max_branches_per_fetch: NonZeroUsize, + pub log2_fetch_width_in_bytes: u8, /// default value for [`UnitConfig::max_in_flight`] pub default_unit_max_in_flight: NonZeroUsize, pub rob_size: NonZeroUsize, @@ -47,6 +49,13 @@ impl CpuConfig { }; v }; + pub const DEFAULT_MAX_BRANCHES_PER_FETCH: NonZeroUsize = { + let Some(v) = NonZeroUsize::new(1) else { + unreachable!(); + }; + v + }; + pub const DEFAULT_LOG2_FETCH_WIDTH_IN_BYTES: u8 = 3; pub const DEFAULT_UNIT_MAX_IN_FLIGHT: NonZeroUsize = { let Some(v) = NonZeroUsize::new(8) else { unreachable!(); @@ -58,6 +67,8 @@ impl CpuConfig { units, out_reg_num_width: Self::DEFAULT_OUT_REG_NUM_WIDTH, fetch_width: Self::DEFAULT_FETCH_WIDTH, + max_branches_per_fetch: Self::DEFAULT_MAX_BRANCHES_PER_FETCH, + log2_fetch_width_in_bytes: Self::DEFAULT_LOG2_FETCH_WIDTH_IN_BYTES, default_unit_max_in_flight: Self::DEFAULT_UNIT_MAX_IN_FLIGHT, rob_size, } @@ -117,4 +128,21 @@ impl CpuConfig { UnitToRegAlloc[mop_ty][extra_out_ty][self.unit_num_width()][self.out_reg_num_width] [self.non_const_unit_nums().len()] } + pub fn fetch_width_in_bytes(&self) -> usize { + 1usize + .checked_shl(self.log2_fetch_width_in_bytes.into()) + .expect("log2_fetch_width_in_bytes is too big") + } } + +#[hdl(get(|c| c.fetch_width.get()))] +pub type CpuConfigFetchWidth> = DynSize; + +#[hdl(get(|c| c.max_branches_per_fetch.get()))] +pub type CpuConfigMaxBranchesPerFetch> = DynSize; + +#[hdl(get(|c| c.log2_fetch_width_in_bytes.into()))] +pub type CpuConfigLog2FetchWidthInBytes> = DynSize; + +#[hdl(get(|c| c.fetch_width_in_bytes()))] +pub type CpuConfigFetchWidthInBytes> = DynSize; diff --git a/crates/cpu/src/lib.rs b/crates/cpu/src/lib.rs index bae3720..a00b668 100644 --- a/crates/cpu/src/lib.rs +++ b/crates/cpu/src/lib.rs @@ -2,6 +2,7 @@ // See Notices.txt for copyright information pub mod config; pub mod instruction; +pub mod next_pc; pub mod reg_alloc; pub mod register; pub mod unit; diff --git a/crates/cpu/src/next_pc.rs b/crates/cpu/src/next_pc.rs new file mode 100644 index 0000000..96c2e4c --- /dev/null +++ b/crates/cpu/src/next_pc.rs @@ -0,0 +1,728 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// See Notices.txt for copyright information + +//! [Next-Instruction Logic](https://git.libre-chip.org/libre-chip/grant-tracking/issues/10) +//! +//! The basic idea here is that there's a `next_pc` stage that sends predicted fetch PCs to the `fetch` stage, +//! the `fetch` stage's outputs eventually end up in the `decode` stage, +//! after the `decode` stage there's a `post_decode` stage (that may run in the same clock cycle as `decode`) +//! that checks that the fetched instructions' kinds match the predicted instruction kinds and that feeds +//! information back to the `fetch` stage to cancel fetches that need to be predicted differently. + +use crate::{config::CpuConfig, util::array_vec::ArrayVec}; +use fayalite::{ + int::{UIntInRange, UIntInRangeInclusive, UIntInRangeType}, + prelude::*, + sim::{ForkJoinScope, value::SimOnlyValueTrait}, + util::ready_valid::ReadyValid, +}; + +#[hdl] +pub enum PredictedCond { + Taken, + Fallthrough, +} + +#[hdl] +pub struct PredictedFallthrough {} + +#[hdl] +pub enum BranchPredictionKind { + Branch(HdlOption), + IndirectBranch(HdlOption), + Call(HdlOption), + IndirectCall(HdlOption), + Ret(HdlOption), +} + +#[hdl(get(|c| c.max_branches_per_fetch.get() - 1))] +pub type NextPcPredictionMaxBranchesBeforeLast> = DynSize; + +#[hdl(no_static)] +pub struct NextPcPrediction> { + pub fetch_pc: UInt<64>, + pub async_interrupt: Bool, + pub branches_before_last: ArrayVec< + BranchPredictionKind, + NextPcPredictionMaxBranchesBeforeLast, + >, + pub last_branch: HdlOption>, + pub last_branch_target_pc: UInt<64>, +} + +pub const FETCH_BLOCK_ID_WIDTH: usize = FetchBlockIdInt::BITS as usize; +type FetchBlockIdInt = u8; + +#[hdl] +pub struct NextPcToFetchInterfaceInner { + pub next_fetch_pc: UInt<64>, + pub fetch_block_id: UInt<{ FETCH_BLOCK_ID_WIDTH }>, + pub in_progress_fetches_to_cancel: UInt<8>, +} + +#[hdl(no_static)] +pub struct NextPcToFetchInterface> { + pub inner: ReadyValid, + pub config: C, +} + +#[hdl] +/// WIP version of decoded instruction just good enough to represent stuff needed for [`next_pc()`] since the actual instruction definition isn't finalized yet. This will be replaced at a later point. +pub enum WipDecodedInsnKind { + NonBranch, + Branch(UInt<64>), + BranchCond(UInt<64>), + IndirectBranch, + IndirectBranchCond, + Call(UInt<64>), + CallCond(UInt<64>), + IndirectCall, + IndirectCallCond, + Ret, + RetCond, + /// not actually an instruction read from memory, covers stuff like external interrupts, page faults, memory errors, and so on. + Interrupt(UInt<64>), +} + +#[hdl] +/// WIP version of decoded instruction just good enough to represent stuff needed for [`next_pc()`] since the actual instruction definition isn't finalized yet. This will be replaced at a later point. +pub struct WipDecodedInsn { + pub fetch_block_id: UInt<8>, + pub id: UInt<12>, + pub pc: UInt<64>, + pub kind: WipDecodedInsnKind, +} + +#[hdl(no_static)] +/// handles updating speculative branch predictor state (e.g. branch histories) when instructions retire, +/// as well as updating state when a branch instruction is mis-speculated. +pub struct NextPcToRetireInterface> { + // TODO: add needed fields + pub config: C, +} + +#[hdl(no_static)] +pub struct DecodeToPostDecodeInterface> { + // TODO: add needed fields + pub config: C, +} + +#[hdl(no_static)] +pub struct PostDecodeOutputInterface> { + // TODO: add needed fields + pub config: C, +} + +#[hdl] +enum BranchPredictionState { + StronglyNotTaken, + WeaklyNotTaken, + WeaklyTaken, + StronglyTaken, +} + +impl BranchPredictionState { + #[must_use] + #[hdl] + fn is_taken(this: &SimValue) -> bool { + #[hdl(sim)] + match this { + Self::StronglyNotTaken => false, + Self::WeaklyNotTaken => false, + Self::WeaklyTaken => true, + Self::StronglyTaken => true, + } + } + #[must_use] + #[hdl] + fn towards_taken(this: &SimValue) -> SimValue { + (#[hdl(sim)] + match this { + Self::StronglyNotTaken => BranchPredictionState.WeaklyNotTaken(), + Self::WeaklyNotTaken => BranchPredictionState.WeaklyTaken(), + Self::WeaklyTaken => BranchPredictionState.StronglyTaken(), + Self::StronglyTaken => BranchPredictionState.StronglyTaken(), + }) + .to_sim_value() + } + #[must_use] + #[hdl] + fn towards_not_taken(this: &SimValue) -> SimValue { + (#[hdl(sim)] + match this { + Self::StronglyNotTaken => BranchPredictionState.StronglyNotTaken(), + Self::WeaklyNotTaken => BranchPredictionState.StronglyNotTaken(), + Self::WeaklyTaken => BranchPredictionState.WeaklyNotTaken(), + Self::StronglyTaken => BranchPredictionState.WeaklyTaken(), + }) + .to_sim_value() + } +} + +impl SimValueDefault for BranchPredictionState { + fn sim_value_default(self) -> SimValue { + self.WeaklyNotTaken().to_sim_value() + } +} + +#[derive(Copy, Clone, Debug)] +#[must_use] +enum ResetStatus { + Done, + Working, +} + +impl ResetStatus { + fn and(self, other: Self) -> Self { + match (self, other) { + (ResetStatus::Done, ResetStatus::Done) => ResetStatus::Done, + (ResetStatus::Done | ResetStatus::Working, ResetStatus::Working) + | (ResetStatus::Working, ResetStatus::Done) => ResetStatus::Working, + } + } +} + +trait SimValueDefault: Type { + fn sim_value_default(self) -> SimValue; +} + +impl SimValueDefault for SimOnly { + fn sim_value_default(self) -> SimValue { + SimOnlyValue::::default().to_sim_value_with_type(self) + } +} + +impl SimValueDefault for HdlOption { + fn sim_value_default(self) -> SimValue { + self.HdlNone().to_sim_value_with_type(self) + } +} + +impl SimValueDefault for Bool { + fn sim_value_default(self) -> SimValue { + false.to_sim_value() + } +} + +impl SimValueDefault for UIntType { + fn sim_value_default(self) -> SimValue { + self.zero().to_sim_value() + } +} + +trait ResetSteps: Type { + fn reset_step(this: &mut SimValue, step: usize) -> ResetStatus; +} + +impl ResetSteps for ArrayType { + fn reset_step(this: &mut SimValue, step: usize) -> ResetStatus { + let element = SimValue::ty(this).element(); + let len = SimValue::ty(this).len(); + if step < len { + this[step] = element.sim_value_default(); + } + if step.saturating_add(1) >= len { + ResetStatus::Done + } else { + ResetStatus::Working + } + } +} + +#[hdl] +struct CallStack { + return_addresses: Array, { CallStack::SIZE }>, + len: UIntInRangeInclusive<0, { CallStack::SIZE }>, +} + +impl CallStack { + const SIZE: usize = 16; +} + +impl SimValueDefault for CallStack { + #[hdl] + fn sim_value_default(self) -> SimValue { + #[hdl(sim)] + CallStack { + // something other than zero so you can see the values getting reset + return_addresses: [!0u64; Self::SIZE], + len: 0usize.to_sim_value_with_type(self.len), + } + } +} + +impl ResetSteps for CallStack { + #[hdl] + fn reset_step(this: &mut SimValue, _step: usize) -> ResetStatus { + #[hdl(sim)] + let CallStack { + return_addresses, + len, + } = this; + // return_addresses is implemented as a shift register, so it can be all reset at once + return_addresses.fill(0u64.to_sim_value()); + **len = 0; + ResetStatus::Done + } +} + +#[hdl] +struct BranchTargetBuffer { + branch_pc_to_target_map: Array, UInt<64>)>, { BranchTargetBuffer::SIZE }>, +} + +impl BranchTargetBuffer { + const SIZE: usize = 16; +} + +impl SimValueDefault for BranchTargetBuffer { + #[hdl] + fn sim_value_default(self) -> SimValue { + #[hdl(sim)] + BranchTargetBuffer { + // something other than zero so you can see the values getting reset + branch_pc_to_target_map: [HdlSome((0u64, 0u64)); Self::SIZE], + } + } +} + +impl ResetSteps for BranchTargetBuffer { + #[hdl] + fn reset_step(this: &mut SimValue, step: usize) -> ResetStatus { + #[hdl(sim)] + let BranchTargetBuffer { + branch_pc_to_target_map, + } = this; + ResetSteps::reset_step(branch_pc_to_target_map, step) + } +} + +#[hdl] +struct BranchHistory { + history: Array, + /// exclusive + tail: UIntInRange<0, { BranchHistory::SIZE }>, + /// inclusive, always at or after tail, always at or before speculative_head + non_speculative_head: UIntInRange<0, { BranchHistory::SIZE }>, + /// inclusive, always at or after both tail and non_speculative_head + speculative_head: UIntInRange<0, { BranchHistory::SIZE }>, +} + +impl ResetSteps for BranchHistory { + #[hdl] + fn reset_step(this: &mut SimValue, step: usize) -> ResetStatus { + #[hdl(sim)] + let Self { + history, + tail, + non_speculative_head, + speculative_head, + } = this; + **tail = 0; + **non_speculative_head = 0; + **speculative_head = 0; + ResetSteps::reset_step(history, step) + } +} + +impl SimValueDefault for BranchHistory { + #[hdl] + fn sim_value_default(self) -> SimValue { + #[hdl(sim)] + BranchHistory { + // something other than zero so you can see the values getting reset + history: [true; Self::SIZE], + tail: 0usize.to_sim_value_with_type(self.tail), + non_speculative_head: 0usize.to_sim_value_with_type(self.non_speculative_head), + speculative_head: 0usize.to_sim_value_with_type(self.speculative_head), + } + } +} + +enum BranchHistoryTryPushSpeculativeError { + NoSpace, +} + +enum BranchHistoryTryPushNonSpeculativeError { + NoSpace, + Misprediction { speculated: bool }, +} + +impl BranchHistory { + const LOG2_SIZE: usize = 8; + const SIZE: usize = 1 << Self::LOG2_SIZE; + fn next_pos(pos: usize) -> usize { + (pos + 1) % Self::SIZE + } + fn prev_pos(pos: usize) -> usize { + (pos + Self::SIZE - 1) % Self::SIZE + } + fn history_from_head(this: &SimValue, head: usize) -> [bool; N] { + let mut retval = [false; N]; + let mut pos = head; + for entry in &mut retval { + if pos == *this.tail { + break; + } + *entry = *this.history[pos]; + pos = Self::prev_pos(pos); + } + retval + } + fn delete_speculative_history(this: &mut SimValue) { + let non_speculative_head = *this.non_speculative_head; + *this.speculative_head = non_speculative_head; + } + fn recent_history_including_speculative(this: &SimValue) -> [bool; N] { + let head = *this.speculative_head; + Self::history_from_head(this, head) + } + fn speculative_full(this: &SimValue) -> bool { + let speculative_head = *this.speculative_head; + Self::next_pos(speculative_head) == *this.tail + } + fn try_push_speculative( + this: &mut SimValue, + value: bool, + ) -> Result<(), BranchHistoryTryPushSpeculativeError> { + if Self::speculative_full(this) { + Err(BranchHistoryTryPushSpeculativeError::NoSpace) + } else { + let speculative_head = Self::next_pos(*this.speculative_head); + *this.speculative_head = speculative_head; + *this.history[speculative_head] = value; + Ok(()) + } + } + fn try_push_non_speculative( + this: &mut SimValue, + value: bool, + ) -> Result<(), BranchHistoryTryPushNonSpeculativeError> { + let speculative_head = *this.speculative_head; + let non_speculative_head = *this.non_speculative_head; + if speculative_head == non_speculative_head { + Err(BranchHistoryTryPushNonSpeculativeError::NoSpace) + } else { + let pos = Self::next_pos(non_speculative_head); + let speculated = *this.history[pos]; + if speculated != value { + Err(BranchHistoryTryPushNonSpeculativeError::Misprediction { speculated }) + } else { + *this.non_speculative_head = pos; + Ok(()) + } + } + } +} + +#[hdl] +struct Queue { + data: ArrayType, + /// inclusive + head: UIntInRangeType, Capacity>, + /// exclusive + tail: UIntInRangeType, Capacity>, +} + +impl Queue { + fn capacity(self) -> usize { + self.data.len() + } + fn next_pos(self, pos: usize) -> usize { + assert_ne!(self.capacity(), 0); + (pos + 1) % self.capacity() + } + fn prev_pos(self, pos: usize) -> usize { + assert_ne!(self.capacity(), 0); + (pos + self.capacity() - 1) % self.capacity() + } + fn is_empty(this: &SimValue) -> bool { + this.head == this.tail + } + fn is_full(this: &SimValue) -> bool { + let head = *this.head; + let tail = *this.tail; + SimValue::ty(this).next_pos(head) == tail + } + fn try_push(this: &mut SimValue, value: impl ToSimValueWithType) -> Result<(), ()> { + if Self::is_full(this) { + Err(()) + } else { + let head = *this.head; + let head = SimValue::ty(this).next_pos(head); + *this.head = head; + let data = &mut this.data[head]; + *data = value.to_sim_value_with_type(SimValue::ty(data)); + Ok(()) + } + } +} + +impl SimValueDefault for Queue { + #[hdl] + fn sim_value_default(self) -> SimValue { + let Self { data, head, tail } = self; + #[hdl(sim)] + Queue:: { + data: repeat( + data.element().sim_value_default(), + Capacity::from_usize(data.len()), + ), + head: 0usize.to_sim_value_with_type(head), + tail: 0usize.to_sim_value_with_type(tail), + } + } +} + +impl ResetSteps for Queue { + #[hdl] + fn reset_step(this: &mut SimValue, step: usize) -> ResetStatus { + #[hdl(sim)] + let Queue:: { data, head, tail } = this; + **head = 0; + **tail = 0; + ResetSteps::reset_step(data, step) + } +} + +#[hdl] +struct FetchQueueEntry { + fetch_block_id: UInt<{ FETCH_BLOCK_ID_WIDTH }>, +} + +impl SimValueDefault for FetchQueueEntry { + #[hdl] + fn sim_value_default(self) -> SimValue { + #[hdl(sim)] + FetchQueueEntry { + fetch_block_id: 0 as FetchBlockIdInt, + } + } +} + +const BRANCH_PREDICTOR_LOG2_SIZE: usize = 8; +const BRANCH_PREDICTOR_SIZE: usize = 1 << BRANCH_PREDICTOR_LOG2_SIZE; + +#[hdl] +pub struct NextPcState> { + speculative_call_stack: CallStack, + non_speculative_call_stack: CallStack, + branch_target_buffer: BranchTargetBuffer, + branch_history: BranchHistory, + branch_predictor: Array, + fetching_queue: Queue>, + pc: UInt<64>, + fetch_block_id: UInt<{ FETCH_BLOCK_ID_WIDTH }>, + config: C, +} + +impl> NextPcState { + fn next_fetch_pc(this: &SimValue) -> u64 { + let pc = u64::try_from(this.pc.to_bigint()).expect("in range"); + pc & (!0u64 << SimValue::ty(&this.config).get().log2_fetch_width_in_bytes) + } + fn branch_predictor_index(this: &SimValue, pc: u64) -> usize { + let mut history = 0u64; + let history_bits: [bool; BRANCH_PREDICTOR_LOG2_SIZE] = + BranchHistory::recent_history_including_speculative(&this.branch_history); + for history_bit in history_bits { + history <<= 1; + if history_bit { + history |= 1; + } + } + let mut t = history; + t ^= t.rotate_left(5) & !pc.rotate_right(3); + t ^= pc; + t ^= !t.rotate_left(2) & t.rotate_left(4); + let mut retval = 0; + for i in (0..BRANCH_PREDICTOR_LOG2_SIZE).step_by(BRANCH_PREDICTOR_LOG2_SIZE) { + retval ^= t >> i; + } + retval as usize % BRANCH_PREDICTOR_SIZE + } +} + +impl SimValueDefault for NextPcState> { + #[hdl] + fn sim_value_default(self) -> SimValue { + let Self { + speculative_call_stack, + non_speculative_call_stack, + branch_target_buffer, + branch_history, + branch_predictor: _, + fetching_queue, + pc: _, + fetch_block_id: _, + config, + } = self; + #[hdl(sim)] + Self { + speculative_call_stack: speculative_call_stack.sim_value_default(), + non_speculative_call_stack: non_speculative_call_stack.sim_value_default(), + branch_target_buffer: branch_target_buffer.sim_value_default(), + branch_history: branch_history.sim_value_default(), + // use something other than the default so you can see the reset progress + branch_predictor: std::array::from_fn(|_| { + BranchPredictionState::towards_not_taken(&BranchPredictionState.sim_value_default()) + }), + fetching_queue: fetching_queue.sim_value_default(), + // use something other than the default so you can see the reset progress + pc: !0u64, + // use something other than the default so you can see the reset progress + fetch_block_id: !0u8, + config, + } + } +} + +impl> ResetSteps for NextPcState { + #[hdl] + fn reset_step(this: &mut SimValue, step: usize) -> ResetStatus { + #[hdl(sim)] + let NextPcState:: { + speculative_call_stack, + non_speculative_call_stack, + branch_target_buffer, + branch_history, + branch_predictor, + fetching_queue, + pc, + fetch_block_id, + config: _, + } = this; + **pc = 0u64.into(); // match Microwatt's reset PC + **fetch_block_id = 0u8.into(); + let speculative_call_stack = ResetSteps::reset_step(speculative_call_stack, step); + let non_speculative_call_stack = ResetSteps::reset_step(non_speculative_call_stack, step); + let branch_target_buffer = ResetSteps::reset_step(branch_target_buffer, step); + let branch_history = ResetSteps::reset_step(branch_history, step); + let branch_predictor = ResetSteps::reset_step(branch_predictor, step); + let fetching_queue = ResetSteps::reset_step(fetching_queue, step); + speculative_call_stack + .and(non_speculative_call_stack) + .and(branch_target_buffer) + .and(branch_history) + .and(branch_predictor) + .and(fetching_queue) + } +} + +#[hdl_module(extern)] +pub fn next_pc(config: PhantomConst) { + #[hdl] + let cd: ClockDomain = m.input(); + #[hdl] + let to_fetch: NextPcToFetchInterface> = + m.output(NextPcToFetchInterface[config]); + #[hdl] + let state_for_debug: NextPcState> = m.output(NextPcState[config]); + m.register_clock_for_past(cd.clk); + #[hdl] + async fn run( + scope: ForkJoinScope<'_>, + mut sim: ExternModuleSimulationState, + cd: Expr, + to_fetch: Expr>>, + state_expr: Expr>>, + ) { + let config = Expr::ty(state_expr.config); + let mut state = sim.read(state_expr).await; + for step in 0usize.. { + sim.write(state_expr, state).await; + sim.wait_for_clock_edge(cd.clk).await; + state = sim.read_past(state_expr, cd.clk).await; + let reset_status = ResetSteps::reset_step(&mut state, step); + match reset_status { + ResetStatus::Done => break, + ResetStatus::Working => {} + } + } + scope.spawn_detached(|_, mut sim: ExternModuleSimulationState| async move { + loop { + let state = sim.read(state_expr).await; + if Queue::is_full(&state.fetching_queue) { + sim.write(to_fetch.inner.data, HdlNone()).await; + } else { + sim.write( + to_fetch.inner.data, + HdlSome( + #[hdl(sim)] + NextPcToFetchInterfaceInner { + next_fetch_pc: NextPcState::next_fetch_pc(&state), + fetch_block_id: state.fetch_block_id, + in_progress_fetches_to_cancel: 0u8, // TODO: implement + }, + ), + ) + .await; + } + sim.wait_for_changes([state_expr], None).await; + } + }); + loop { + sim.write(state_expr, state).await; + sim.wait_for_clock_edge(cd.clk).await; + state = sim.read_past(state_expr, cd.clk).await; + let next_fetch_pc = NextPcState::next_fetch_pc(&state); + if Queue::is_full(&state.fetching_queue) { + continue; + } + if sim.read_past_bool(to_fetch.inner.ready, cd.clk).await { + let fetch_block_id = + FetchBlockIdInt::try_from(state.fetch_block_id.to_bigint()).expect("in range"); + Queue::try_push( + &mut state.fetching_queue, + #[hdl(sim)] + FetchQueueEntry { fetch_block_id }, + ) + .expect("checked is_full above"); + // TODO: handle instructions not aligned with fetch blocks + let mut new_pc = + next_fetch_pc.wrapping_add(config.get().fetch_width_in_bytes() as u64); + for entry in &state.branch_target_buffer.branch_pc_to_target_map { + #[hdl(sim)] + match entry { + HdlNone => continue, + HdlSome(entry) => { + #[hdl(sim)] + let (entry_pc, entry_target) = entry; + if *entry_pc == state.pc { + new_pc = entry_target + .to_bigint() + .try_into() + .expect("known to be in range"); + break; + } + } + } + } + *state.pc = new_pc.into(); + *state.fetch_block_id = fetch_block_id.wrapping_add(1).into(); + } + } + // TODO: finish + } + m.extern_module_simulation_fn( + (cd, to_fetch, state_for_debug), + |(cd, to_fetch, state_for_debug), mut sim| async move { + sim.write( + state_for_debug, + Expr::ty(state_for_debug).sim_value_default(), + ) + .await; + sim.resettable( + cd, + |mut sim: ExternModuleSimulationState| async move { + sim.write(to_fetch.inner.data, HdlNone()).await; + }, + |mut sim: ExternModuleSimulationState, ()| async move { + sim.fork_join_scope(|scope, sim| run(scope, sim, cd, to_fetch, state_for_debug)) + .await + }, + ) + .await; + }, + ); +} diff --git a/crates/cpu/tests/expected/next_pc.vcd b/crates/cpu/tests/expected/next_pc.vcd new file mode 100644 index 0000000..e244bc6 --- /dev/null +++ b/crates/cpu/tests/expected/next_pc.vcd @@ -0,0 +1,4702 @@ +$timescale 1 ps $end +$scope module next_pc $end +$scope struct cd $end +$var wire 1 ! clk $end +$var wire 1 " rst $end +$upscope $end +$scope struct to_fetch $end +$scope struct inner $end +$scope struct data $end +$var string 1 # \$tag $end +$scope struct HdlSome $end +$var wire 64 $ next_fetch_pc $end +$var wire 8 % fetch_block_id $end +$var wire 8 & in_progress_fetches_to_cancel $end +$upscope $end +$upscope $end +$var wire 1 ' ready $end +$upscope $end +$var string 1 ( config $end +$upscope $end +$scope struct state_for_debug $end +$scope struct speculative_call_stack $end +$scope struct return_addresses $end +$var wire 64 ) \[0] $end +$var wire 64 * \[1] $end +$var wire 64 + \[2] $end +$var wire 64 , \[3] $end +$var wire 64 - \[4] $end +$var wire 64 . \[5] $end +$var wire 64 / \[6] $end +$var wire 64 0 \[7] $end +$var wire 64 1 \[8] $end +$var wire 64 2 \[9] $end +$var wire 64 3 \[10] $end +$var wire 64 4 \[11] $end +$var wire 64 5 \[12] $end +$var wire 64 6 \[13] $end +$var wire 64 7 \[14] $end +$var wire 64 8 \[15] $end +$upscope $end +$scope struct len $end +$var wire 5 9 value $end +$var string 1 : range $end +$upscope $end +$upscope $end +$scope struct non_speculative_call_stack $end +$scope struct return_addresses $end +$var wire 64 ; \[0] $end +$var wire 64 < \[1] $end +$var wire 64 = \[2] $end +$var wire 64 > \[3] $end +$var wire 64 ? \[4] $end +$var wire 64 @ \[5] $end +$var wire 64 A \[6] $end +$var wire 64 B \[7] $end +$var wire 64 C \[8] $end +$var wire 64 D \[9] $end +$var wire 64 E \[10] $end +$var wire 64 F \[11] $end +$var wire 64 G \[12] $end +$var wire 64 H \[13] $end +$var wire 64 I \[14] $end +$var wire 64 J \[15] $end +$upscope $end +$scope struct len $end +$var wire 5 K value $end +$var string 1 L range $end +$upscope $end +$upscope $end +$scope struct branch_target_buffer $end +$scope struct branch_pc_to_target_map $end +$scope struct \[0] $end +$var string 1 M \$tag $end +$scope struct HdlSome $end +$var wire 64 N \0 $end +$var wire 64 O \1 $end +$upscope $end +$upscope $end +$scope struct \[1] $end +$var string 1 P \$tag $end +$scope struct HdlSome $end +$var wire 64 Q \0 $end +$var wire 64 R \1 $end +$upscope $end +$upscope $end +$scope struct \[2] $end +$var string 1 S \$tag $end +$scope struct HdlSome $end +$var wire 64 T \0 $end +$var wire 64 U \1 $end +$upscope $end +$upscope $end +$scope struct \[3] $end +$var string 1 V \$tag $end +$scope struct HdlSome $end +$var wire 64 W \0 $end +$var wire 64 X \1 $end +$upscope $end +$upscope $end +$scope struct \[4] $end +$var string 1 Y \$tag $end +$scope struct HdlSome $end +$var wire 64 Z \0 $end +$var wire 64 [ \1 $end +$upscope $end +$upscope $end +$scope struct \[5] $end +$var string 1 \ \$tag $end +$scope struct HdlSome $end +$var wire 64 ] \0 $end +$var wire 64 ^ \1 $end +$upscope $end +$upscope $end +$scope struct \[6] $end +$var string 1 _ \$tag $end +$scope struct HdlSome $end +$var wire 64 ` \0 $end +$var wire 64 a \1 $end +$upscope $end +$upscope $end +$scope struct \[7] $end +$var string 1 b \$tag $end +$scope struct HdlSome $end +$var wire 64 c \0 $end +$var wire 64 d \1 $end +$upscope $end +$upscope $end +$scope struct \[8] $end +$var string 1 e \$tag $end +$scope struct HdlSome $end +$var wire 64 f \0 $end +$var wire 64 g \1 $end +$upscope $end +$upscope $end +$scope struct \[9] $end +$var string 1 h \$tag $end +$scope struct HdlSome $end +$var wire 64 i \0 $end +$var wire 64 j \1 $end +$upscope $end +$upscope $end +$scope struct \[10] $end +$var string 1 k \$tag $end +$scope struct HdlSome $end +$var wire 64 l \0 $end +$var wire 64 m \1 $end +$upscope $end +$upscope $end +$scope struct \[11] $end +$var string 1 n \$tag $end +$scope struct HdlSome $end +$var wire 64 o \0 $end +$var wire 64 p \1 $end +$upscope $end +$upscope $end +$scope struct \[12] $end +$var string 1 q \$tag $end +$scope struct HdlSome $end +$var wire 64 r \0 $end +$var wire 64 s \1 $end +$upscope $end +$upscope $end +$scope struct \[13] $end +$var string 1 t \$tag $end +$scope struct HdlSome $end +$var wire 64 u \0 $end +$var wire 64 v \1 $end +$upscope $end +$upscope $end +$scope struct \[14] $end +$var string 1 w \$tag $end +$scope struct HdlSome $end +$var wire 64 x \0 $end +$var wire 64 y \1 $end +$upscope $end +$upscope $end +$scope struct \[15] $end +$var string 1 z \$tag $end +$scope struct HdlSome $end +$var wire 64 { \0 $end +$var wire 64 | \1 $end +$upscope $end +$upscope $end +$upscope $end +$upscope $end +$scope struct branch_history $end +$scope struct history $end +$var wire 1 } \[0] $end +$var wire 1 ~ \[1] $end +$var wire 1 !" \[2] $end +$var wire 1 "" \[3] $end +$var wire 1 #" \[4] $end +$var wire 1 $" \[5] $end +$var wire 1 %" \[6] $end +$var wire 1 &" \[7] $end +$var wire 1 '" \[8] $end +$var wire 1 (" \[9] $end +$var wire 1 )" \[10] $end +$var wire 1 *" \[11] $end +$var wire 1 +" \[12] $end +$var wire 1 ," \[13] $end +$var wire 1 -" \[14] $end +$var wire 1 ." \[15] $end +$var wire 1 /" \[16] $end +$var wire 1 0" \[17] $end +$var wire 1 1" \[18] $end +$var wire 1 2" \[19] $end +$var wire 1 3" \[20] $end +$var wire 1 4" \[21] $end +$var wire 1 5" \[22] $end +$var wire 1 6" \[23] $end +$var wire 1 7" \[24] $end +$var wire 1 8" \[25] $end +$var wire 1 9" \[26] $end +$var wire 1 :" \[27] $end +$var wire 1 ;" \[28] $end +$var wire 1 <" \[29] $end +$var wire 1 =" \[30] $end +$var wire 1 >" \[31] $end +$var wire 1 ?" \[32] $end +$var wire 1 @" \[33] $end +$var wire 1 A" \[34] $end +$var wire 1 B" \[35] $end +$var wire 1 C" \[36] $end +$var wire 1 D" \[37] $end +$var wire 1 E" \[38] $end +$var wire 1 F" \[39] $end +$var wire 1 G" \[40] $end +$var wire 1 H" \[41] $end +$var wire 1 I" \[42] $end +$var wire 1 J" \[43] $end +$var wire 1 K" \[44] $end +$var wire 1 L" \[45] $end +$var wire 1 M" \[46] $end +$var wire 1 N" \[47] $end +$var wire 1 O" \[48] $end +$var wire 1 P" \[49] $end +$var wire 1 Q" \[50] $end +$var wire 1 R" \[51] $end +$var wire 1 S" \[52] $end +$var wire 1 T" \[53] $end +$var wire 1 U" \[54] $end +$var wire 1 V" \[55] $end +$var wire 1 W" \[56] $end +$var wire 1 X" \[57] $end +$var wire 1 Y" \[58] $end +$var wire 1 Z" \[59] $end +$var wire 1 [" \[60] $end +$var wire 1 \" \[61] $end +$var wire 1 ]" \[62] $end +$var wire 1 ^" \[63] $end +$var wire 1 _" \[64] $end +$var wire 1 `" \[65] $end +$var wire 1 a" \[66] $end +$var wire 1 b" \[67] $end +$var wire 1 c" \[68] $end +$var wire 1 d" \[69] $end +$var wire 1 e" \[70] $end +$var wire 1 f" \[71] $end +$var wire 1 g" \[72] $end +$var wire 1 h" \[73] $end +$var wire 1 i" \[74] $end +$var wire 1 j" \[75] $end +$var wire 1 k" \[76] $end +$var wire 1 l" \[77] $end +$var wire 1 m" \[78] $end +$var wire 1 n" \[79] $end +$var wire 1 o" \[80] $end +$var wire 1 p" \[81] $end +$var wire 1 q" \[82] $end +$var wire 1 r" \[83] $end +$var wire 1 s" \[84] $end +$var wire 1 t" \[85] $end +$var wire 1 u" \[86] $end +$var wire 1 v" \[87] $end +$var wire 1 w" \[88] $end +$var wire 1 x" \[89] $end +$var wire 1 y" \[90] $end +$var wire 1 z" \[91] $end +$var wire 1 {" \[92] $end +$var wire 1 |" \[93] $end +$var wire 1 }" \[94] $end +$var wire 1 ~" \[95] $end +$var wire 1 !# \[96] $end +$var wire 1 "# \[97] $end +$var wire 1 ## \[98] $end +$var wire 1 $# \[99] $end +$var wire 1 %# \[100] $end +$var wire 1 &# \[101] $end +$var wire 1 '# \[102] $end +$var wire 1 (# \[103] $end +$var wire 1 )# \[104] $end +$var wire 1 *# \[105] $end +$var wire 1 +# \[106] $end +$var wire 1 ,# \[107] $end +$var wire 1 -# \[108] $end +$var wire 1 .# \[109] $end +$var wire 1 /# \[110] $end +$var wire 1 0# \[111] $end +$var wire 1 1# \[112] $end +$var wire 1 2# \[113] $end +$var wire 1 3# \[114] $end +$var wire 1 4# \[115] $end +$var wire 1 5# \[116] $end +$var wire 1 6# \[117] $end +$var wire 1 7# \[118] $end +$var wire 1 8# \[119] $end +$var wire 1 9# \[120] $end +$var wire 1 :# \[121] $end +$var wire 1 ;# \[122] $end +$var wire 1 <# \[123] $end +$var wire 1 =# \[124] $end +$var wire 1 ># \[125] $end +$var wire 1 ?# \[126] $end +$var wire 1 @# \[127] $end +$var wire 1 A# \[128] $end +$var wire 1 B# \[129] $end +$var wire 1 C# \[130] $end +$var wire 1 D# \[131] $end +$var wire 1 E# \[132] $end +$var wire 1 F# \[133] $end +$var wire 1 G# \[134] $end +$var wire 1 H# \[135] $end +$var wire 1 I# \[136] $end +$var wire 1 J# \[137] $end +$var wire 1 K# \[138] $end +$var wire 1 L# \[139] $end +$var wire 1 M# \[140] $end +$var wire 1 N# \[141] $end +$var wire 1 O# \[142] $end +$var wire 1 P# \[143] $end +$var wire 1 Q# \[144] $end +$var wire 1 R# \[145] $end +$var wire 1 S# \[146] $end +$var wire 1 T# \[147] $end +$var wire 1 U# \[148] $end +$var wire 1 V# \[149] $end +$var wire 1 W# \[150] $end +$var wire 1 X# \[151] $end +$var wire 1 Y# \[152] $end +$var wire 1 Z# \[153] $end +$var wire 1 [# \[154] $end +$var wire 1 \# \[155] $end +$var wire 1 ]# \[156] $end +$var wire 1 ^# \[157] $end +$var wire 1 _# \[158] $end +$var wire 1 `# \[159] $end +$var wire 1 a# \[160] $end +$var wire 1 b# \[161] $end +$var wire 1 c# \[162] $end +$var wire 1 d# \[163] $end +$var wire 1 e# \[164] $end +$var wire 1 f# \[165] $end +$var wire 1 g# \[166] $end +$var wire 1 h# \[167] $end +$var wire 1 i# \[168] $end +$var wire 1 j# \[169] $end +$var wire 1 k# \[170] $end +$var wire 1 l# \[171] $end +$var wire 1 m# \[172] $end +$var wire 1 n# \[173] $end +$var wire 1 o# \[174] $end +$var wire 1 p# \[175] $end +$var wire 1 q# \[176] $end +$var wire 1 r# \[177] $end +$var wire 1 s# \[178] $end +$var wire 1 t# \[179] $end +$var wire 1 u# \[180] $end +$var wire 1 v# \[181] $end +$var wire 1 w# \[182] $end +$var wire 1 x# \[183] $end +$var wire 1 y# \[184] $end +$var wire 1 z# \[185] $end +$var wire 1 {# \[186] $end +$var wire 1 |# \[187] $end +$var wire 1 }# \[188] $end +$var wire 1 ~# \[189] $end +$var wire 1 !$ \[190] $end +$var wire 1 "$ \[191] $end +$var wire 1 #$ \[192] $end +$var wire 1 $$ \[193] $end +$var wire 1 %$ \[194] $end +$var wire 1 &$ \[195] $end +$var wire 1 '$ \[196] $end +$var wire 1 ($ \[197] $end +$var wire 1 )$ \[198] $end +$var wire 1 *$ \[199] $end +$var wire 1 +$ \[200] $end +$var wire 1 ,$ \[201] $end +$var wire 1 -$ \[202] $end +$var wire 1 .$ \[203] $end +$var wire 1 /$ \[204] $end +$var wire 1 0$ \[205] $end +$var wire 1 1$ \[206] $end +$var wire 1 2$ \[207] $end +$var wire 1 3$ \[208] $end +$var wire 1 4$ \[209] $end +$var wire 1 5$ \[210] $end +$var wire 1 6$ \[211] $end +$var wire 1 7$ \[212] $end +$var wire 1 8$ \[213] $end +$var wire 1 9$ \[214] $end +$var wire 1 :$ \[215] $end +$var wire 1 ;$ \[216] $end +$var wire 1 <$ \[217] $end +$var wire 1 =$ \[218] $end +$var wire 1 >$ \[219] $end +$var wire 1 ?$ \[220] $end +$var wire 1 @$ \[221] $end +$var wire 1 A$ \[222] $end +$var wire 1 B$ \[223] $end +$var wire 1 C$ \[224] $end +$var wire 1 D$ \[225] $end +$var wire 1 E$ \[226] $end +$var wire 1 F$ \[227] $end +$var wire 1 G$ \[228] $end +$var wire 1 H$ \[229] $end +$var wire 1 I$ \[230] $end +$var wire 1 J$ \[231] $end +$var wire 1 K$ \[232] $end +$var wire 1 L$ \[233] $end +$var wire 1 M$ \[234] $end +$var wire 1 N$ \[235] $end +$var wire 1 O$ \[236] $end +$var wire 1 P$ \[237] $end +$var wire 1 Q$ \[238] $end +$var wire 1 R$ \[239] $end +$var wire 1 S$ \[240] $end +$var wire 1 T$ \[241] $end +$var wire 1 U$ \[242] $end +$var wire 1 V$ \[243] $end +$var wire 1 W$ \[244] $end +$var wire 1 X$ \[245] $end +$var wire 1 Y$ \[246] $end +$var wire 1 Z$ \[247] $end +$var wire 1 [$ \[248] $end +$var wire 1 \$ \[249] $end +$var wire 1 ]$ \[250] $end +$var wire 1 ^$ \[251] $end +$var wire 1 _$ \[252] $end +$var wire 1 `$ \[253] $end +$var wire 1 a$ \[254] $end +$var wire 1 b$ \[255] $end +$upscope $end +$scope struct tail $end +$var wire 8 c$ value $end +$var string 1 d$ range $end +$upscope $end +$scope struct non_speculative_head $end +$var wire 8 e$ value $end +$var string 1 f$ range $end +$upscope $end +$scope struct speculative_head $end +$var wire 8 g$ value $end +$var string 1 h$ range $end +$upscope $end +$upscope $end +$scope struct branch_predictor $end +$var string 1 i$ \[0] $end +$var string 1 j$ \[1] $end +$var string 1 k$ \[2] $end +$var string 1 l$ \[3] $end +$var string 1 m$ \[4] $end +$var string 1 n$ \[5] $end +$var string 1 o$ \[6] $end +$var string 1 p$ \[7] $end +$var string 1 q$ \[8] $end +$var string 1 r$ \[9] $end +$var string 1 s$ \[10] $end +$var string 1 t$ \[11] $end +$var string 1 u$ \[12] $end +$var string 1 v$ \[13] $end +$var string 1 w$ \[14] $end +$var string 1 x$ \[15] $end +$var string 1 y$ \[16] $end +$var string 1 z$ \[17] $end +$var string 1 {$ \[18] $end +$var string 1 |$ \[19] $end +$var string 1 }$ \[20] $end +$var string 1 ~$ \[21] $end +$var string 1 !% \[22] $end +$var string 1 "% \[23] $end +$var string 1 #% \[24] $end +$var string 1 $% \[25] $end +$var string 1 %% \[26] $end +$var string 1 &% \[27] $end +$var string 1 '% \[28] $end +$var string 1 (% \[29] $end +$var string 1 )% \[30] $end +$var string 1 *% \[31] $end +$var string 1 +% \[32] $end +$var string 1 ,% \[33] $end +$var string 1 -% \[34] $end +$var string 1 .% \[35] $end +$var string 1 /% \[36] $end +$var string 1 0% \[37] $end +$var string 1 1% \[38] $end +$var string 1 2% \[39] $end +$var string 1 3% \[40] $end +$var string 1 4% \[41] $end +$var string 1 5% \[42] $end +$var string 1 6% \[43] $end +$var string 1 7% \[44] $end +$var string 1 8% \[45] $end +$var string 1 9% \[46] $end +$var string 1 :% \[47] $end +$var string 1 ;% \[48] $end +$var string 1 <% \[49] $end +$var string 1 =% \[50] $end +$var string 1 >% \[51] $end +$var string 1 ?% \[52] $end +$var string 1 @% \[53] $end +$var string 1 A% \[54] $end +$var string 1 B% \[55] $end +$var string 1 C% \[56] $end +$var string 1 D% \[57] $end +$var string 1 E% \[58] $end +$var string 1 F% \[59] $end +$var string 1 G% \[60] $end +$var string 1 H% \[61] $end +$var string 1 I% \[62] $end +$var string 1 J% \[63] $end +$var string 1 K% \[64] $end +$var string 1 L% \[65] $end +$var string 1 M% \[66] $end +$var string 1 N% \[67] $end +$var string 1 O% \[68] $end +$var string 1 P% \[69] $end +$var string 1 Q% \[70] $end +$var string 1 R% \[71] $end +$var string 1 S% \[72] $end +$var string 1 T% \[73] $end +$var string 1 U% \[74] $end +$var string 1 V% \[75] $end +$var string 1 W% \[76] $end +$var string 1 X% \[77] $end +$var string 1 Y% \[78] $end +$var string 1 Z% \[79] $end +$var string 1 [% \[80] $end +$var string 1 \% \[81] $end +$var string 1 ]% \[82] $end +$var string 1 ^% \[83] $end +$var string 1 _% \[84] $end +$var string 1 `% \[85] $end +$var string 1 a% \[86] $end +$var string 1 b% \[87] $end +$var string 1 c% \[88] $end +$var string 1 d% \[89] $end +$var string 1 e% \[90] $end +$var string 1 f% \[91] $end +$var string 1 g% \[92] $end +$var string 1 h% \[93] $end +$var string 1 i% \[94] $end +$var string 1 j% \[95] $end +$var string 1 k% \[96] $end +$var string 1 l% \[97] $end +$var string 1 m% \[98] $end +$var string 1 n% \[99] $end +$var string 1 o% \[100] $end +$var string 1 p% \[101] $end +$var string 1 q% \[102] $end +$var string 1 r% \[103] $end +$var string 1 s% \[104] $end +$var string 1 t% \[105] $end +$var string 1 u% \[106] $end +$var string 1 v% \[107] $end +$var string 1 w% \[108] $end +$var string 1 x% \[109] $end +$var string 1 y% \[110] $end +$var string 1 z% \[111] $end +$var string 1 {% \[112] $end +$var string 1 |% \[113] $end +$var string 1 }% \[114] $end +$var string 1 ~% \[115] $end +$var string 1 !& \[116] $end +$var string 1 "& \[117] $end +$var string 1 #& \[118] $end +$var string 1 $& \[119] $end +$var string 1 %& \[120] $end +$var string 1 && \[121] $end +$var string 1 '& \[122] $end +$var string 1 (& \[123] $end +$var string 1 )& \[124] $end +$var string 1 *& \[125] $end +$var string 1 +& \[126] $end +$var string 1 ,& \[127] $end +$var string 1 -& \[128] $end +$var string 1 .& \[129] $end +$var string 1 /& \[130] $end +$var string 1 0& \[131] $end +$var string 1 1& \[132] $end +$var string 1 2& \[133] $end +$var string 1 3& \[134] $end +$var string 1 4& \[135] $end +$var string 1 5& \[136] $end +$var string 1 6& \[137] $end +$var string 1 7& \[138] $end +$var string 1 8& \[139] $end +$var string 1 9& \[140] $end +$var string 1 :& \[141] $end +$var string 1 ;& \[142] $end +$var string 1 <& \[143] $end +$var string 1 =& \[144] $end +$var string 1 >& \[145] $end +$var string 1 ?& \[146] $end +$var string 1 @& \[147] $end +$var string 1 A& \[148] $end +$var string 1 B& \[149] $end +$var string 1 C& \[150] $end +$var string 1 D& \[151] $end +$var string 1 E& \[152] $end +$var string 1 F& \[153] $end +$var string 1 G& \[154] $end +$var string 1 H& \[155] $end +$var string 1 I& \[156] $end +$var string 1 J& \[157] $end +$var string 1 K& \[158] $end +$var string 1 L& \[159] $end +$var string 1 M& \[160] $end +$var string 1 N& \[161] $end +$var string 1 O& \[162] $end +$var string 1 P& \[163] $end +$var string 1 Q& \[164] $end +$var string 1 R& \[165] $end +$var string 1 S& \[166] $end +$var string 1 T& \[167] $end +$var string 1 U& \[168] $end +$var string 1 V& \[169] $end +$var string 1 W& \[170] $end +$var string 1 X& \[171] $end +$var string 1 Y& \[172] $end +$var string 1 Z& \[173] $end +$var string 1 [& \[174] $end +$var string 1 \& \[175] $end +$var string 1 ]& \[176] $end +$var string 1 ^& \[177] $end +$var string 1 _& \[178] $end +$var string 1 `& \[179] $end +$var string 1 a& \[180] $end +$var string 1 b& \[181] $end +$var string 1 c& \[182] $end +$var string 1 d& \[183] $end +$var string 1 e& \[184] $end +$var string 1 f& \[185] $end +$var string 1 g& \[186] $end +$var string 1 h& \[187] $end +$var string 1 i& \[188] $end +$var string 1 j& \[189] $end +$var string 1 k& \[190] $end +$var string 1 l& \[191] $end +$var string 1 m& \[192] $end +$var string 1 n& \[193] $end +$var string 1 o& \[194] $end +$var string 1 p& \[195] $end +$var string 1 q& \[196] $end +$var string 1 r& \[197] $end +$var string 1 s& \[198] $end +$var string 1 t& \[199] $end +$var string 1 u& \[200] $end +$var string 1 v& \[201] $end +$var string 1 w& \[202] $end +$var string 1 x& \[203] $end +$var string 1 y& \[204] $end +$var string 1 z& \[205] $end +$var string 1 {& \[206] $end +$var string 1 |& \[207] $end +$var string 1 }& \[208] $end +$var string 1 ~& \[209] $end +$var string 1 !' \[210] $end +$var string 1 "' \[211] $end +$var string 1 #' \[212] $end +$var string 1 $' \[213] $end +$var string 1 %' \[214] $end +$var string 1 &' \[215] $end +$var string 1 '' \[216] $end +$var string 1 (' \[217] $end +$var string 1 )' \[218] $end +$var string 1 *' \[219] $end +$var string 1 +' \[220] $end +$var string 1 ,' \[221] $end +$var string 1 -' \[222] $end +$var string 1 .' \[223] $end +$var string 1 /' \[224] $end +$var string 1 0' \[225] $end +$var string 1 1' \[226] $end +$var string 1 2' \[227] $end +$var string 1 3' \[228] $end +$var string 1 4' \[229] $end +$var string 1 5' \[230] $end +$var string 1 6' \[231] $end +$var string 1 7' \[232] $end +$var string 1 8' \[233] $end +$var string 1 9' \[234] $end +$var string 1 :' \[235] $end +$var string 1 ;' \[236] $end +$var string 1 <' \[237] $end +$var string 1 =' \[238] $end +$var string 1 >' \[239] $end +$var string 1 ?' \[240] $end +$var string 1 @' \[241] $end +$var string 1 A' \[242] $end +$var string 1 B' \[243] $end +$var string 1 C' \[244] $end +$var string 1 D' \[245] $end +$var string 1 E' \[246] $end +$var string 1 F' \[247] $end +$var string 1 G' \[248] $end +$var string 1 H' \[249] $end +$var string 1 I' \[250] $end +$var string 1 J' \[251] $end +$var string 1 K' \[252] $end +$var string 1 L' \[253] $end +$var string 1 M' \[254] $end +$var string 1 N' \[255] $end +$upscope $end +$scope struct fetching_queue $end +$scope struct data $end +$scope struct \[0] $end +$var wire 8 O' fetch_block_id $end +$upscope $end +$scope struct \[1] $end +$var wire 8 P' fetch_block_id $end +$upscope $end +$scope struct \[2] $end +$var wire 8 Q' fetch_block_id $end +$upscope $end +$scope struct \[3] $end +$var wire 8 R' fetch_block_id $end +$upscope $end +$scope struct \[4] $end +$var wire 8 S' fetch_block_id $end +$upscope $end +$scope struct \[5] $end +$var wire 8 T' fetch_block_id $end +$upscope $end +$scope struct \[6] $end +$var wire 8 U' fetch_block_id $end +$upscope $end +$scope struct \[7] $end +$var wire 8 V' fetch_block_id $end +$upscope $end +$scope struct \[8] $end +$var wire 8 W' fetch_block_id $end +$upscope $end +$scope struct \[9] $end +$var wire 8 X' fetch_block_id $end +$upscope $end +$scope struct \[10] $end +$var wire 8 Y' fetch_block_id $end +$upscope $end +$scope struct \[11] $end +$var wire 8 Z' fetch_block_id $end +$upscope $end +$scope struct \[12] $end +$var wire 8 [' fetch_block_id $end +$upscope $end +$scope struct \[13] $end +$var wire 8 \' fetch_block_id $end +$upscope $end +$scope struct \[14] $end +$var wire 8 ]' fetch_block_id $end +$upscope $end +$scope struct \[15] $end +$var wire 8 ^' fetch_block_id $end +$upscope $end +$scope struct \[16] $end +$var wire 8 _' fetch_block_id $end +$upscope $end +$scope struct \[17] $end +$var wire 8 `' fetch_block_id $end +$upscope $end +$scope struct \[18] $end +$var wire 8 a' fetch_block_id $end +$upscope $end +$scope struct \[19] $end +$var wire 8 b' fetch_block_id $end +$upscope $end +$scope struct \[20] $end +$var wire 8 c' fetch_block_id $end +$upscope $end +$scope struct \[21] $end +$var wire 8 d' fetch_block_id $end +$upscope $end +$scope struct \[22] $end +$var wire 8 e' fetch_block_id $end +$upscope $end +$scope struct \[23] $end +$var wire 8 f' fetch_block_id $end +$upscope $end +$scope struct \[24] $end +$var wire 8 g' fetch_block_id $end +$upscope $end +$scope struct \[25] $end +$var wire 8 h' fetch_block_id $end +$upscope $end +$scope struct \[26] $end +$var wire 8 i' fetch_block_id $end +$upscope $end +$scope struct \[27] $end +$var wire 8 j' fetch_block_id $end +$upscope $end +$scope struct \[28] $end +$var wire 8 k' fetch_block_id $end +$upscope $end +$scope struct \[29] $end +$var wire 8 l' fetch_block_id $end +$upscope $end +$scope struct \[30] $end +$var wire 8 m' fetch_block_id $end +$upscope $end +$scope struct \[31] $end +$var wire 8 n' fetch_block_id $end +$upscope $end +$scope struct \[32] $end +$var wire 8 o' fetch_block_id $end +$upscope $end +$scope struct \[33] $end +$var wire 8 p' fetch_block_id $end +$upscope $end +$scope struct \[34] $end +$var wire 8 q' fetch_block_id $end +$upscope $end +$scope struct \[35] $end +$var wire 8 r' fetch_block_id $end +$upscope $end +$scope struct \[36] $end +$var wire 8 s' fetch_block_id $end +$upscope $end +$scope struct \[37] $end +$var wire 8 t' fetch_block_id $end +$upscope $end +$scope struct \[38] $end +$var wire 8 u' fetch_block_id $end +$upscope $end +$scope struct \[39] $end +$var wire 8 v' fetch_block_id $end +$upscope $end +$scope struct \[40] $end +$var wire 8 w' fetch_block_id $end +$upscope $end +$scope struct \[41] $end +$var wire 8 x' fetch_block_id $end +$upscope $end +$scope struct \[42] $end +$var wire 8 y' fetch_block_id $end +$upscope $end +$scope struct \[43] $end +$var wire 8 z' fetch_block_id $end +$upscope $end +$scope struct \[44] $end +$var wire 8 {' fetch_block_id $end +$upscope $end +$scope struct \[45] $end +$var wire 8 |' fetch_block_id $end +$upscope $end +$scope struct \[46] $end +$var wire 8 }' fetch_block_id $end +$upscope $end +$scope struct \[47] $end +$var wire 8 ~' fetch_block_id $end +$upscope $end +$scope struct \[48] $end +$var wire 8 !( fetch_block_id $end +$upscope $end +$scope struct \[49] $end +$var wire 8 "( fetch_block_id $end +$upscope $end +$scope struct \[50] $end +$var wire 8 #( fetch_block_id $end +$upscope $end +$scope struct \[51] $end +$var wire 8 $( fetch_block_id $end +$upscope $end +$scope struct \[52] $end +$var wire 8 %( fetch_block_id $end +$upscope $end +$scope struct \[53] $end +$var wire 8 &( fetch_block_id $end +$upscope $end +$scope struct \[54] $end +$var wire 8 '( fetch_block_id $end +$upscope $end +$scope struct \[55] $end +$var wire 8 (( fetch_block_id $end +$upscope $end +$scope struct \[56] $end +$var wire 8 )( fetch_block_id $end +$upscope $end +$scope struct \[57] $end +$var wire 8 *( fetch_block_id $end +$upscope $end +$scope struct \[58] $end +$var wire 8 +( fetch_block_id $end +$upscope $end +$scope struct \[59] $end +$var wire 8 ,( fetch_block_id $end +$upscope $end +$scope struct \[60] $end +$var wire 8 -( fetch_block_id $end +$upscope $end +$scope struct \[61] $end +$var wire 8 .( fetch_block_id $end +$upscope $end +$scope struct \[62] $end +$var wire 8 /( fetch_block_id $end +$upscope $end +$scope struct \[63] $end +$var wire 8 0( fetch_block_id $end +$upscope $end +$scope struct \[64] $end +$var wire 8 1( fetch_block_id $end +$upscope $end +$scope struct \[65] $end +$var wire 8 2( fetch_block_id $end +$upscope $end +$scope struct \[66] $end +$var wire 8 3( fetch_block_id $end +$upscope $end +$scope struct \[67] $end +$var wire 8 4( fetch_block_id $end +$upscope $end +$scope struct \[68] $end +$var wire 8 5( fetch_block_id $end +$upscope $end +$scope struct \[69] $end +$var wire 8 6( fetch_block_id $end +$upscope $end +$scope struct \[70] $end +$var wire 8 7( fetch_block_id $end +$upscope $end +$scope struct \[71] $end +$var wire 8 8( fetch_block_id $end +$upscope $end +$scope struct \[72] $end +$var wire 8 9( fetch_block_id $end +$upscope $end +$scope struct \[73] $end +$var wire 8 :( fetch_block_id $end +$upscope $end +$scope struct \[74] $end +$var wire 8 ;( fetch_block_id $end +$upscope $end +$scope struct \[75] $end +$var wire 8 <( fetch_block_id $end +$upscope $end +$scope struct \[76] $end +$var wire 8 =( fetch_block_id $end +$upscope $end +$scope struct \[77] $end +$var wire 8 >( fetch_block_id $end +$upscope $end +$scope struct \[78] $end +$var wire 8 ?( fetch_block_id $end +$upscope $end +$scope struct \[79] $end +$var wire 8 @( fetch_block_id $end +$upscope $end +$scope struct \[80] $end +$var wire 8 A( fetch_block_id $end +$upscope $end +$scope struct \[81] $end +$var wire 8 B( fetch_block_id $end +$upscope $end +$scope struct \[82] $end +$var wire 8 C( fetch_block_id $end +$upscope $end +$scope struct \[83] $end +$var wire 8 D( fetch_block_id $end +$upscope $end +$scope struct \[84] $end +$var wire 8 E( fetch_block_id $end +$upscope $end +$scope struct \[85] $end +$var wire 8 F( fetch_block_id $end +$upscope $end +$scope struct \[86] $end +$var wire 8 G( fetch_block_id $end +$upscope $end +$scope struct \[87] $end +$var wire 8 H( fetch_block_id $end +$upscope $end +$scope struct \[88] $end +$var wire 8 I( fetch_block_id $end +$upscope $end +$scope struct \[89] $end +$var wire 8 J( fetch_block_id $end +$upscope $end +$scope struct \[90] $end +$var wire 8 K( fetch_block_id $end +$upscope $end +$scope struct \[91] $end +$var wire 8 L( fetch_block_id $end +$upscope $end +$scope struct \[92] $end +$var wire 8 M( fetch_block_id $end +$upscope $end +$scope struct \[93] $end +$var wire 8 N( fetch_block_id $end +$upscope $end +$scope struct \[94] $end +$var wire 8 O( fetch_block_id $end +$upscope $end +$scope struct \[95] $end +$var wire 8 P( fetch_block_id $end +$upscope $end +$scope struct \[96] $end +$var wire 8 Q( fetch_block_id $end +$upscope $end +$scope struct \[97] $end +$var wire 8 R( fetch_block_id $end +$upscope $end +$scope struct \[98] $end +$var wire 8 S( fetch_block_id $end +$upscope $end +$scope struct \[99] $end +$var wire 8 T( fetch_block_id $end +$upscope $end +$scope struct \[100] $end +$var wire 8 U( fetch_block_id $end +$upscope $end +$scope struct \[101] $end +$var wire 8 V( fetch_block_id $end +$upscope $end +$scope struct \[102] $end +$var wire 8 W( fetch_block_id $end +$upscope $end +$scope struct \[103] $end +$var wire 8 X( fetch_block_id $end +$upscope $end +$scope struct \[104] $end +$var wire 8 Y( fetch_block_id $end +$upscope $end +$scope struct \[105] $end +$var wire 8 Z( fetch_block_id $end +$upscope $end +$scope struct \[106] $end +$var wire 8 [( fetch_block_id $end +$upscope $end +$scope struct \[107] $end +$var wire 8 \( fetch_block_id $end +$upscope $end +$scope struct \[108] $end +$var wire 8 ]( fetch_block_id $end +$upscope $end +$scope struct \[109] $end +$var wire 8 ^( fetch_block_id $end +$upscope $end +$scope struct \[110] $end +$var wire 8 _( fetch_block_id $end +$upscope $end +$scope struct \[111] $end +$var wire 8 `( fetch_block_id $end +$upscope $end +$scope struct \[112] $end +$var wire 8 a( fetch_block_id $end +$upscope $end +$scope struct \[113] $end +$var wire 8 b( fetch_block_id $end +$upscope $end +$scope struct \[114] $end +$var wire 8 c( fetch_block_id $end +$upscope $end +$scope struct \[115] $end +$var wire 8 d( fetch_block_id $end +$upscope $end +$scope struct \[116] $end +$var wire 8 e( fetch_block_id $end +$upscope $end +$scope struct \[117] $end +$var wire 8 f( fetch_block_id $end +$upscope $end +$scope struct \[118] $end +$var wire 8 g( fetch_block_id $end +$upscope $end +$scope struct \[119] $end +$var wire 8 h( fetch_block_id $end +$upscope $end +$scope struct \[120] $end +$var wire 8 i( fetch_block_id $end +$upscope $end +$scope struct \[121] $end +$var wire 8 j( fetch_block_id $end +$upscope $end +$scope struct \[122] $end +$var wire 8 k( fetch_block_id $end +$upscope $end +$scope struct \[123] $end +$var wire 8 l( fetch_block_id $end +$upscope $end +$scope struct \[124] $end +$var wire 8 m( fetch_block_id $end +$upscope $end +$scope struct \[125] $end +$var wire 8 n( fetch_block_id $end +$upscope $end +$scope struct \[126] $end +$var wire 8 o( fetch_block_id $end +$upscope $end +$scope struct \[127] $end +$var wire 8 p( fetch_block_id $end +$upscope $end +$scope struct \[128] $end +$var wire 8 q( fetch_block_id $end +$upscope $end +$scope struct \[129] $end +$var wire 8 r( fetch_block_id $end +$upscope $end +$scope struct \[130] $end +$var wire 8 s( fetch_block_id $end +$upscope $end +$scope struct \[131] $end +$var wire 8 t( fetch_block_id $end +$upscope $end +$scope struct \[132] $end +$var wire 8 u( fetch_block_id $end +$upscope $end +$scope struct \[133] $end +$var wire 8 v( fetch_block_id $end +$upscope $end +$scope struct \[134] $end +$var wire 8 w( fetch_block_id $end +$upscope $end +$scope struct \[135] $end +$var wire 8 x( fetch_block_id $end +$upscope $end +$scope struct \[136] $end +$var wire 8 y( fetch_block_id $end +$upscope $end +$scope struct \[137] $end +$var wire 8 z( fetch_block_id $end +$upscope $end +$scope struct \[138] $end +$var wire 8 {( fetch_block_id $end +$upscope $end +$scope struct \[139] $end +$var wire 8 |( fetch_block_id $end +$upscope $end +$scope struct \[140] $end +$var wire 8 }( fetch_block_id $end +$upscope $end +$scope struct \[141] $end +$var wire 8 ~( fetch_block_id $end +$upscope $end +$scope struct \[142] $end +$var wire 8 !) fetch_block_id $end +$upscope $end +$scope struct \[143] $end +$var wire 8 ") fetch_block_id $end +$upscope $end +$scope struct \[144] $end +$var wire 8 #) fetch_block_id $end +$upscope $end +$scope struct \[145] $end +$var wire 8 $) fetch_block_id $end +$upscope $end +$scope struct \[146] $end +$var wire 8 %) fetch_block_id $end +$upscope $end +$scope struct \[147] $end +$var wire 8 &) fetch_block_id $end +$upscope $end +$scope struct \[148] $end +$var wire 8 ') fetch_block_id $end +$upscope $end +$scope struct \[149] $end +$var wire 8 () fetch_block_id $end +$upscope $end +$scope struct \[150] $end +$var wire 8 )) fetch_block_id $end +$upscope $end +$scope struct \[151] $end +$var wire 8 *) fetch_block_id $end +$upscope $end +$scope struct \[152] $end +$var wire 8 +) fetch_block_id $end +$upscope $end +$scope struct \[153] $end +$var wire 8 ,) fetch_block_id $end +$upscope $end +$scope struct \[154] $end +$var wire 8 -) fetch_block_id $end +$upscope $end +$scope struct \[155] $end +$var wire 8 .) fetch_block_id $end +$upscope $end +$scope struct \[156] $end +$var wire 8 /) fetch_block_id $end +$upscope $end +$scope struct \[157] $end +$var wire 8 0) fetch_block_id $end +$upscope $end +$scope struct \[158] $end +$var wire 8 1) fetch_block_id $end +$upscope $end +$scope struct \[159] $end +$var wire 8 2) fetch_block_id $end +$upscope $end +$scope struct \[160] $end +$var wire 8 3) fetch_block_id $end +$upscope $end +$scope struct \[161] $end +$var wire 8 4) fetch_block_id $end +$upscope $end +$scope struct \[162] $end +$var wire 8 5) fetch_block_id $end +$upscope $end +$scope struct \[163] $end +$var wire 8 6) fetch_block_id $end +$upscope $end +$scope struct \[164] $end +$var wire 8 7) fetch_block_id $end +$upscope $end +$scope struct \[165] $end +$var wire 8 8) fetch_block_id $end +$upscope $end +$scope struct \[166] $end +$var wire 8 9) fetch_block_id $end +$upscope $end +$scope struct \[167] $end +$var wire 8 :) fetch_block_id $end +$upscope $end +$scope struct \[168] $end +$var wire 8 ;) fetch_block_id $end +$upscope $end +$scope struct \[169] $end +$var wire 8 <) fetch_block_id $end +$upscope $end +$scope struct \[170] $end +$var wire 8 =) fetch_block_id $end +$upscope $end +$scope struct \[171] $end +$var wire 8 >) fetch_block_id $end +$upscope $end +$scope struct \[172] $end +$var wire 8 ?) fetch_block_id $end +$upscope $end +$scope struct \[173] $end +$var wire 8 @) fetch_block_id $end +$upscope $end +$scope struct \[174] $end +$var wire 8 A) fetch_block_id $end +$upscope $end +$scope struct \[175] $end +$var wire 8 B) fetch_block_id $end +$upscope $end +$scope struct \[176] $end +$var wire 8 C) fetch_block_id $end +$upscope $end +$scope struct \[177] $end +$var wire 8 D) fetch_block_id $end +$upscope $end +$scope struct \[178] $end +$var wire 8 E) fetch_block_id $end +$upscope $end +$scope struct \[179] $end +$var wire 8 F) fetch_block_id $end +$upscope $end +$scope struct \[180] $end +$var wire 8 G) fetch_block_id $end +$upscope $end +$scope struct \[181] $end +$var wire 8 H) fetch_block_id $end +$upscope $end +$scope struct \[182] $end +$var wire 8 I) fetch_block_id $end +$upscope $end +$scope struct \[183] $end +$var wire 8 J) fetch_block_id $end +$upscope $end +$scope struct \[184] $end +$var wire 8 K) fetch_block_id $end +$upscope $end +$scope struct \[185] $end +$var wire 8 L) fetch_block_id $end +$upscope $end +$scope struct \[186] $end +$var wire 8 M) fetch_block_id $end +$upscope $end +$scope struct \[187] $end +$var wire 8 N) fetch_block_id $end +$upscope $end +$scope struct \[188] $end +$var wire 8 O) fetch_block_id $end +$upscope $end +$scope struct \[189] $end +$var wire 8 P) fetch_block_id $end +$upscope $end +$scope struct \[190] $end +$var wire 8 Q) fetch_block_id $end +$upscope $end +$scope struct \[191] $end +$var wire 8 R) fetch_block_id $end +$upscope $end +$scope struct \[192] $end +$var wire 8 S) fetch_block_id $end +$upscope $end +$scope struct \[193] $end +$var wire 8 T) fetch_block_id $end +$upscope $end +$scope struct \[194] $end +$var wire 8 U) fetch_block_id $end +$upscope $end +$scope struct \[195] $end +$var wire 8 V) fetch_block_id $end +$upscope $end +$scope struct \[196] $end +$var wire 8 W) fetch_block_id $end +$upscope $end +$scope struct \[197] $end +$var wire 8 X) fetch_block_id $end +$upscope $end +$scope struct \[198] $end +$var wire 8 Y) fetch_block_id $end +$upscope $end +$scope struct \[199] $end +$var wire 8 Z) fetch_block_id $end +$upscope $end +$scope struct \[200] $end +$var wire 8 [) fetch_block_id $end +$upscope $end +$scope struct \[201] $end +$var wire 8 \) fetch_block_id $end +$upscope $end +$scope struct \[202] $end +$var wire 8 ]) fetch_block_id $end +$upscope $end +$scope struct \[203] $end +$var wire 8 ^) fetch_block_id $end +$upscope $end +$scope struct \[204] $end +$var wire 8 _) fetch_block_id $end +$upscope $end +$scope struct \[205] $end +$var wire 8 `) fetch_block_id $end +$upscope $end +$scope struct \[206] $end +$var wire 8 a) fetch_block_id $end +$upscope $end +$scope struct \[207] $end +$var wire 8 b) fetch_block_id $end +$upscope $end +$scope struct \[208] $end +$var wire 8 c) fetch_block_id $end +$upscope $end +$scope struct \[209] $end +$var wire 8 d) fetch_block_id $end +$upscope $end +$scope struct \[210] $end +$var wire 8 e) fetch_block_id $end +$upscope $end +$scope struct \[211] $end +$var wire 8 f) fetch_block_id $end +$upscope $end +$scope struct \[212] $end +$var wire 8 g) fetch_block_id $end +$upscope $end +$scope struct \[213] $end +$var wire 8 h) fetch_block_id $end +$upscope $end +$scope struct \[214] $end +$var wire 8 i) fetch_block_id $end +$upscope $end +$scope struct \[215] $end +$var wire 8 j) fetch_block_id $end +$upscope $end +$scope struct \[216] $end +$var wire 8 k) fetch_block_id $end +$upscope $end +$scope struct \[217] $end +$var wire 8 l) fetch_block_id $end +$upscope $end +$scope struct \[218] $end +$var wire 8 m) fetch_block_id $end +$upscope $end +$scope struct \[219] $end +$var wire 8 n) fetch_block_id $end +$upscope $end +$scope struct \[220] $end +$var wire 8 o) fetch_block_id $end +$upscope $end +$scope struct \[221] $end +$var wire 8 p) fetch_block_id $end +$upscope $end +$scope struct \[222] $end +$var wire 8 q) fetch_block_id $end +$upscope $end +$scope struct \[223] $end +$var wire 8 r) fetch_block_id $end +$upscope $end +$scope struct \[224] $end +$var wire 8 s) fetch_block_id $end +$upscope $end +$scope struct \[225] $end +$var wire 8 t) fetch_block_id $end +$upscope $end +$scope struct \[226] $end +$var wire 8 u) fetch_block_id $end +$upscope $end +$scope struct \[227] $end +$var wire 8 v) fetch_block_id $end +$upscope $end +$scope struct \[228] $end +$var wire 8 w) fetch_block_id $end +$upscope $end +$scope struct \[229] $end +$var wire 8 x) fetch_block_id $end +$upscope $end +$scope struct \[230] $end +$var wire 8 y) fetch_block_id $end +$upscope $end +$scope struct \[231] $end +$var wire 8 z) fetch_block_id $end +$upscope $end +$scope struct \[232] $end +$var wire 8 {) fetch_block_id $end +$upscope $end +$scope struct \[233] $end +$var wire 8 |) fetch_block_id $end +$upscope $end +$scope struct \[234] $end +$var wire 8 }) fetch_block_id $end +$upscope $end +$scope struct \[235] $end +$var wire 8 ~) fetch_block_id $end +$upscope $end +$scope struct \[236] $end +$var wire 8 !* fetch_block_id $end +$upscope $end +$scope struct \[237] $end +$var wire 8 "* fetch_block_id $end +$upscope $end +$scope struct \[238] $end +$var wire 8 #* fetch_block_id $end +$upscope $end +$scope struct \[239] $end +$var wire 8 $* fetch_block_id $end +$upscope $end +$scope struct \[240] $end +$var wire 8 %* fetch_block_id $end +$upscope $end +$scope struct \[241] $end +$var wire 8 &* fetch_block_id $end +$upscope $end +$scope struct \[242] $end +$var wire 8 '* fetch_block_id $end +$upscope $end +$scope struct \[243] $end +$var wire 8 (* fetch_block_id $end +$upscope $end +$scope struct \[244] $end +$var wire 8 )* fetch_block_id $end +$upscope $end +$scope struct \[245] $end +$var wire 8 ** fetch_block_id $end +$upscope $end +$scope struct \[246] $end +$var wire 8 +* fetch_block_id $end +$upscope $end +$scope struct \[247] $end +$var wire 8 ,* fetch_block_id $end +$upscope $end +$scope struct \[248] $end +$var wire 8 -* fetch_block_id $end +$upscope $end +$scope struct \[249] $end +$var wire 8 .* fetch_block_id $end +$upscope $end +$scope struct \[250] $end +$var wire 8 /* fetch_block_id $end +$upscope $end +$scope struct \[251] $end +$var wire 8 0* fetch_block_id $end +$upscope $end +$scope struct \[252] $end +$var wire 8 1* fetch_block_id $end +$upscope $end +$scope struct \[253] $end +$var wire 8 2* fetch_block_id $end +$upscope $end +$scope struct \[254] $end +$var wire 8 3* fetch_block_id $end +$upscope $end +$scope struct \[255] $end +$var wire 8 4* fetch_block_id $end +$upscope $end +$upscope $end +$scope struct head $end +$var wire 8 5* value $end +$var string 1 6* range $end +$upscope $end +$scope struct tail $end +$var wire 8 7* value $end +$var string 1 8* range $end +$upscope $end +$upscope $end +$var wire 64 9* pc $end +$var wire 8 :* fetch_block_id $end +$var string 1 ;* config $end +$upscope $end +$upscope $end +$enddefinitions $end +$dumpvars +0! +1" +sHdlNone\x20(0) # +b0 $ +b0 % +b0 & +1' +sPhantomConst({\"units\":[{\"kind\":\"AluBranch\",\"max_in_flight\":null},{\"kind\":\"AluBranch\",\"max_in_flight\":null}],\"out_reg_num_width\":4,\"fetch_width\":2,\"max_branches_per_fetch\":1,\"log2_fetch_width_in_bytes\":3,\"default_unit_max_in_flight\":8,\"rob_size\":20}) ( +b0 ) +b0 * +b0 + +b0 , +b0 - +b0 . +b0 / +b0 0 +b0 1 +b0 2 +b0 3 +b0 4 +b0 5 +b0 6 +b0 7 +b0 8 +b0 9 +sPhantomConst(\"0..=16\") : +b0 ; +b0 < +b0 = +b0 > +b0 ? +b0 @ +b0 A +b0 B +b0 C +b0 D +b0 E +b0 F +b0 G +b0 H +b0 I +b0 J +b0 K +sPhantomConst(\"0..=16\") L +sHdlNone\x20(0) M +b0 N +b0 O +sHdlNone\x20(0) P +b0 Q +b0 R +sHdlNone\x20(0) S +b0 T +b0 U +sHdlNone\x20(0) V +b0 W +b0 X +sHdlNone\x20(0) Y +b0 Z +b0 [ +sHdlNone\x20(0) \ +b0 ] +b0 ^ +sHdlNone\x20(0) _ +b0 ` +b0 a +sHdlNone\x20(0) b +b0 c +b0 d +sHdlNone\x20(0) e +b0 f +b0 g +sHdlNone\x20(0) h +b0 i +b0 j +sHdlNone\x20(0) k +b0 l +b0 m +sHdlNone\x20(0) n +b0 o +b0 p +sHdlNone\x20(0) q +b0 r +b0 s +sHdlNone\x20(0) t +b0 u +b0 v +sHdlNone\x20(0) w +b0 x +b0 y +sHdlNone\x20(0) z +b0 { +b0 | +0} +0~ +0!" +0"" +0#" +0$" +0%" +0&" +0'" +0(" +0)" +0*" +0+" +0," +0-" +0." +0/" +00" +01" +02" +03" +04" +05" +06" +07" +08" +09" +0:" +0;" +0<" +0=" +0>" +0?" +0@" +0A" +0B" +0C" +0D" +0E" +0F" +0G" +0H" +0I" +0J" +0K" +0L" +0M" +0N" +0O" +0P" +0Q" +0R" +0S" +0T" +0U" +0V" +0W" +0X" +0Y" +0Z" +0[" +0\" +0]" +0^" +0_" +0`" +0a" +0b" +0c" +0d" +0e" +0f" +0g" +0h" +0i" +0j" +0k" +0l" +0m" +0n" +0o" +0p" +0q" +0r" +0s" +0t" +0u" +0v" +0w" +0x" +0y" +0z" +0{" +0|" +0}" +0~" +0!# +0"# +0## +0$# +0%# +0&# +0'# +0(# +0)# +0*# +0+# +0,# +0-# +0.# +0/# +00# +01# +02# +03# +04# +05# +06# +07# +08# +09# +0:# +0;# +0<# +0=# +0># +0?# +0@# +0A# +0B# +0C# +0D# +0E# +0F# +0G# +0H# +0I# +0J# +0K# +0L# +0M# +0N# +0O# +0P# +0Q# +0R# +0S# +0T# +0U# +0V# +0W# +0X# +0Y# +0Z# +0[# +0\# +0]# +0^# +0_# +0`# +0a# +0b# +0c# +0d# +0e# +0f# +0g# +0h# +0i# +0j# +0k# +0l# +0m# +0n# +0o# +0p# +0q# +0r# +0s# +0t# +0u# +0v# +0w# +0x# +0y# +0z# +0{# +0|# +0}# +0~# +0!$ +0"$ +0#$ +0$$ +0%$ +0&$ +0'$ +0($ +0)$ +0*$ +0+$ +0,$ +0-$ +0.$ +0/$ +00$ +01$ +02$ +03$ +04$ +05$ +06$ +07$ +08$ +09$ +0:$ +0;$ +0<$ +0=$ +0>$ +0?$ +0@$ +0A$ +0B$ +0C$ +0D$ +0E$ +0F$ +0G$ +0H$ +0I$ +0J$ +0K$ +0L$ +0M$ +0N$ +0O$ +0P$ +0Q$ +0R$ +0S$ +0T$ +0U$ +0V$ +0W$ +0X$ +0Y$ +0Z$ +0[$ +0\$ +0]$ +0^$ +0_$ +0`$ +0a$ +0b$ +b0 c$ +sPhantomConst(\"0..256\") d$ +b0 e$ +sPhantomConst(\"0..256\") f$ +b0 g$ +sPhantomConst(\"0..256\") h$ +sStronglyNotTaken\x20(0) i$ +sStronglyNotTaken\x20(0) j$ +sStronglyNotTaken\x20(0) k$ +sStronglyNotTaken\x20(0) l$ +sStronglyNotTaken\x20(0) m$ +sStronglyNotTaken\x20(0) n$ +sStronglyNotTaken\x20(0) o$ +sStronglyNotTaken\x20(0) p$ +sStronglyNotTaken\x20(0) q$ +sStronglyNotTaken\x20(0) r$ +sStronglyNotTaken\x20(0) s$ +sStronglyNotTaken\x20(0) t$ +sStronglyNotTaken\x20(0) u$ +sStronglyNotTaken\x20(0) v$ +sStronglyNotTaken\x20(0) w$ +sStronglyNotTaken\x20(0) x$ +sStronglyNotTaken\x20(0) y$ +sStronglyNotTaken\x20(0) z$ +sStronglyNotTaken\x20(0) {$ +sStronglyNotTaken\x20(0) |$ +sStronglyNotTaken\x20(0) }$ +sStronglyNotTaken\x20(0) ~$ +sStronglyNotTaken\x20(0) !% +sStronglyNotTaken\x20(0) "% +sStronglyNotTaken\x20(0) #% +sStronglyNotTaken\x20(0) $% +sStronglyNotTaken\x20(0) %% +sStronglyNotTaken\x20(0) &% +sStronglyNotTaken\x20(0) '% +sStronglyNotTaken\x20(0) (% +sStronglyNotTaken\x20(0) )% +sStronglyNotTaken\x20(0) *% +sStronglyNotTaken\x20(0) +% +sStronglyNotTaken\x20(0) ,% +sStronglyNotTaken\x20(0) -% +sStronglyNotTaken\x20(0) .% +sStronglyNotTaken\x20(0) /% +sStronglyNotTaken\x20(0) 0% +sStronglyNotTaken\x20(0) 1% +sStronglyNotTaken\x20(0) 2% +sStronglyNotTaken\x20(0) 3% +sStronglyNotTaken\x20(0) 4% +sStronglyNotTaken\x20(0) 5% +sStronglyNotTaken\x20(0) 6% +sStronglyNotTaken\x20(0) 7% +sStronglyNotTaken\x20(0) 8% +sStronglyNotTaken\x20(0) 9% +sStronglyNotTaken\x20(0) :% +sStronglyNotTaken\x20(0) ;% +sStronglyNotTaken\x20(0) <% +sStronglyNotTaken\x20(0) =% +sStronglyNotTaken\x20(0) >% +sStronglyNotTaken\x20(0) ?% +sStronglyNotTaken\x20(0) @% +sStronglyNotTaken\x20(0) A% +sStronglyNotTaken\x20(0) B% +sStronglyNotTaken\x20(0) C% +sStronglyNotTaken\x20(0) D% +sStronglyNotTaken\x20(0) E% +sStronglyNotTaken\x20(0) F% +sStronglyNotTaken\x20(0) G% +sStronglyNotTaken\x20(0) H% +sStronglyNotTaken\x20(0) I% +sStronglyNotTaken\x20(0) J% +sStronglyNotTaken\x20(0) K% +sStronglyNotTaken\x20(0) L% +sStronglyNotTaken\x20(0) M% +sStronglyNotTaken\x20(0) N% +sStronglyNotTaken\x20(0) O% +sStronglyNotTaken\x20(0) P% +sStronglyNotTaken\x20(0) Q% +sStronglyNotTaken\x20(0) R% +sStronglyNotTaken\x20(0) S% +sStronglyNotTaken\x20(0) T% +sStronglyNotTaken\x20(0) U% +sStronglyNotTaken\x20(0) V% +sStronglyNotTaken\x20(0) W% +sStronglyNotTaken\x20(0) X% +sStronglyNotTaken\x20(0) Y% +sStronglyNotTaken\x20(0) Z% +sStronglyNotTaken\x20(0) [% +sStronglyNotTaken\x20(0) \% +sStronglyNotTaken\x20(0) ]% +sStronglyNotTaken\x20(0) ^% +sStronglyNotTaken\x20(0) _% +sStronglyNotTaken\x20(0) `% +sStronglyNotTaken\x20(0) a% +sStronglyNotTaken\x20(0) b% +sStronglyNotTaken\x20(0) c% +sStronglyNotTaken\x20(0) d% +sStronglyNotTaken\x20(0) e% +sStronglyNotTaken\x20(0) f% +sStronglyNotTaken\x20(0) g% +sStronglyNotTaken\x20(0) h% +sStronglyNotTaken\x20(0) i% +sStronglyNotTaken\x20(0) j% +sStronglyNotTaken\x20(0) k% +sStronglyNotTaken\x20(0) l% +sStronglyNotTaken\x20(0) m% +sStronglyNotTaken\x20(0) n% +sStronglyNotTaken\x20(0) o% +sStronglyNotTaken\x20(0) p% +sStronglyNotTaken\x20(0) q% +sStronglyNotTaken\x20(0) r% +sStronglyNotTaken\x20(0) s% +sStronglyNotTaken\x20(0) t% +sStronglyNotTaken\x20(0) u% +sStronglyNotTaken\x20(0) v% +sStronglyNotTaken\x20(0) w% +sStronglyNotTaken\x20(0) x% +sStronglyNotTaken\x20(0) y% +sStronglyNotTaken\x20(0) z% +sStronglyNotTaken\x20(0) {% +sStronglyNotTaken\x20(0) |% +sStronglyNotTaken\x20(0) }% +sStronglyNotTaken\x20(0) ~% +sStronglyNotTaken\x20(0) !& +sStronglyNotTaken\x20(0) "& +sStronglyNotTaken\x20(0) #& +sStronglyNotTaken\x20(0) $& +sStronglyNotTaken\x20(0) %& +sStronglyNotTaken\x20(0) && +sStronglyNotTaken\x20(0) '& +sStronglyNotTaken\x20(0) (& +sStronglyNotTaken\x20(0) )& +sStronglyNotTaken\x20(0) *& +sStronglyNotTaken\x20(0) +& +sStronglyNotTaken\x20(0) ,& +sStronglyNotTaken\x20(0) -& +sStronglyNotTaken\x20(0) .& +sStronglyNotTaken\x20(0) /& +sStronglyNotTaken\x20(0) 0& +sStronglyNotTaken\x20(0) 1& +sStronglyNotTaken\x20(0) 2& +sStronglyNotTaken\x20(0) 3& +sStronglyNotTaken\x20(0) 4& +sStronglyNotTaken\x20(0) 5& +sStronglyNotTaken\x20(0) 6& +sStronglyNotTaken\x20(0) 7& +sStronglyNotTaken\x20(0) 8& +sStronglyNotTaken\x20(0) 9& +sStronglyNotTaken\x20(0) :& +sStronglyNotTaken\x20(0) ;& +sStronglyNotTaken\x20(0) <& +sStronglyNotTaken\x20(0) =& +sStronglyNotTaken\x20(0) >& +sStronglyNotTaken\x20(0) ?& +sStronglyNotTaken\x20(0) @& +sStronglyNotTaken\x20(0) A& +sStronglyNotTaken\x20(0) B& +sStronglyNotTaken\x20(0) C& +sStronglyNotTaken\x20(0) D& +sStronglyNotTaken\x20(0) E& +sStronglyNotTaken\x20(0) F& +sStronglyNotTaken\x20(0) G& +sStronglyNotTaken\x20(0) H& +sStronglyNotTaken\x20(0) I& +sStronglyNotTaken\x20(0) J& +sStronglyNotTaken\x20(0) K& +sStronglyNotTaken\x20(0) L& +sStronglyNotTaken\x20(0) M& +sStronglyNotTaken\x20(0) N& +sStronglyNotTaken\x20(0) O& +sStronglyNotTaken\x20(0) P& +sStronglyNotTaken\x20(0) Q& +sStronglyNotTaken\x20(0) R& +sStronglyNotTaken\x20(0) S& +sStronglyNotTaken\x20(0) T& +sStronglyNotTaken\x20(0) U& +sStronglyNotTaken\x20(0) V& +sStronglyNotTaken\x20(0) W& +sStronglyNotTaken\x20(0) X& +sStronglyNotTaken\x20(0) Y& +sStronglyNotTaken\x20(0) Z& +sStronglyNotTaken\x20(0) [& +sStronglyNotTaken\x20(0) \& +sStronglyNotTaken\x20(0) ]& +sStronglyNotTaken\x20(0) ^& +sStronglyNotTaken\x20(0) _& +sStronglyNotTaken\x20(0) `& +sStronglyNotTaken\x20(0) a& +sStronglyNotTaken\x20(0) b& +sStronglyNotTaken\x20(0) c& +sStronglyNotTaken\x20(0) d& +sStronglyNotTaken\x20(0) e& +sStronglyNotTaken\x20(0) f& +sStronglyNotTaken\x20(0) g& +sStronglyNotTaken\x20(0) h& +sStronglyNotTaken\x20(0) i& +sStronglyNotTaken\x20(0) j& +sStronglyNotTaken\x20(0) k& +sStronglyNotTaken\x20(0) l& +sStronglyNotTaken\x20(0) m& +sStronglyNotTaken\x20(0) n& +sStronglyNotTaken\x20(0) o& +sStronglyNotTaken\x20(0) p& +sStronglyNotTaken\x20(0) q& +sStronglyNotTaken\x20(0) r& +sStronglyNotTaken\x20(0) s& +sStronglyNotTaken\x20(0) t& +sStronglyNotTaken\x20(0) u& +sStronglyNotTaken\x20(0) v& +sStronglyNotTaken\x20(0) w& +sStronglyNotTaken\x20(0) x& +sStronglyNotTaken\x20(0) y& +sStronglyNotTaken\x20(0) z& +sStronglyNotTaken\x20(0) {& +sStronglyNotTaken\x20(0) |& +sStronglyNotTaken\x20(0) }& +sStronglyNotTaken\x20(0) ~& +sStronglyNotTaken\x20(0) !' +sStronglyNotTaken\x20(0) "' +sStronglyNotTaken\x20(0) #' +sStronglyNotTaken\x20(0) $' +sStronglyNotTaken\x20(0) %' +sStronglyNotTaken\x20(0) &' +sStronglyNotTaken\x20(0) '' +sStronglyNotTaken\x20(0) (' +sStronglyNotTaken\x20(0) )' +sStronglyNotTaken\x20(0) *' +sStronglyNotTaken\x20(0) +' +sStronglyNotTaken\x20(0) ,' +sStronglyNotTaken\x20(0) -' +sStronglyNotTaken\x20(0) .' +sStronglyNotTaken\x20(0) /' +sStronglyNotTaken\x20(0) 0' +sStronglyNotTaken\x20(0) 1' +sStronglyNotTaken\x20(0) 2' +sStronglyNotTaken\x20(0) 3' +sStronglyNotTaken\x20(0) 4' +sStronglyNotTaken\x20(0) 5' +sStronglyNotTaken\x20(0) 6' +sStronglyNotTaken\x20(0) 7' +sStronglyNotTaken\x20(0) 8' +sStronglyNotTaken\x20(0) 9' +sStronglyNotTaken\x20(0) :' +sStronglyNotTaken\x20(0) ;' +sStronglyNotTaken\x20(0) <' +sStronglyNotTaken\x20(0) =' +sStronglyNotTaken\x20(0) >' +sStronglyNotTaken\x20(0) ?' +sStronglyNotTaken\x20(0) @' +sStronglyNotTaken\x20(0) A' +sStronglyNotTaken\x20(0) B' +sStronglyNotTaken\x20(0) C' +sStronglyNotTaken\x20(0) D' +sStronglyNotTaken\x20(0) E' +sStronglyNotTaken\x20(0) F' +sStronglyNotTaken\x20(0) G' +sStronglyNotTaken\x20(0) H' +sStronglyNotTaken\x20(0) I' +sStronglyNotTaken\x20(0) J' +sStronglyNotTaken\x20(0) K' +sStronglyNotTaken\x20(0) L' +sStronglyNotTaken\x20(0) M' +sStronglyNotTaken\x20(0) N' +b0 O' +b0 P' +b0 Q' +b0 R' +b0 S' +b0 T' +b0 U' +b0 V' +b0 W' +b0 X' +b0 Y' +b0 Z' +b0 [' +b0 \' +b0 ]' +b0 ^' +b0 _' +b0 `' +b0 a' +b0 b' +b0 c' +b0 d' +b0 e' +b0 f' +b0 g' +b0 h' +b0 i' +b0 j' +b0 k' +b0 l' +b0 m' +b0 n' +b0 o' +b0 p' +b0 q' +b0 r' +b0 s' +b0 t' +b0 u' +b0 v' +b0 w' +b0 x' +b0 y' +b0 z' +b0 {' +b0 |' +b0 }' +b0 ~' +b0 !( +b0 "( +b0 #( +b0 $( +b0 %( +b0 &( +b0 '( +b0 (( +b0 )( +b0 *( +b0 +( +b0 ,( +b0 -( +b0 .( +b0 /( +b0 0( +b0 1( +b0 2( +b0 3( +b0 4( +b0 5( +b0 6( +b0 7( +b0 8( +b0 9( +b0 :( +b0 ;( +b0 <( +b0 =( +b0 >( +b0 ?( +b0 @( +b0 A( +b0 B( +b0 C( +b0 D( +b0 E( +b0 F( +b0 G( +b0 H( +b0 I( +b0 J( +b0 K( +b0 L( +b0 M( +b0 N( +b0 O( +b0 P( +b0 Q( +b0 R( +b0 S( +b0 T( +b0 U( +b0 V( +b0 W( +b0 X( +b0 Y( +b0 Z( +b0 [( +b0 \( +b0 ]( +b0 ^( +b0 _( +b0 `( +b0 a( +b0 b( +b0 c( +b0 d( +b0 e( +b0 f( +b0 g( +b0 h( +b0 i( +b0 j( +b0 k( +b0 l( +b0 m( +b0 n( +b0 o( +b0 p( +b0 q( +b0 r( +b0 s( +b0 t( +b0 u( +b0 v( +b0 w( +b0 x( +b0 y( +b0 z( +b0 {( +b0 |( +b0 }( +b0 ~( +b0 !) +b0 ") +b0 #) +b0 $) +b0 %) +b0 &) +b0 ') +b0 () +b0 )) +b0 *) +b0 +) +b0 ,) +b0 -) +b0 .) +b0 /) +b0 0) +b0 1) +b0 2) +b0 3) +b0 4) +b0 5) +b0 6) +b0 7) +b0 8) +b0 9) +b0 :) +b0 ;) +b0 <) +b0 =) +b0 >) +b0 ?) +b0 @) +b0 A) +b0 B) +b0 C) +b0 D) +b0 E) +b0 F) +b0 G) +b0 H) +b0 I) +b0 J) +b0 K) +b0 L) +b0 M) +b0 N) +b0 O) +b0 P) +b0 Q) +b0 R) +b0 S) +b0 T) +b0 U) +b0 V) +b0 W) +b0 X) +b0 Y) +b0 Z) +b0 [) +b0 \) +b0 ]) +b0 ^) +b0 _) +b0 `) +b0 a) +b0 b) +b0 c) +b0 d) +b0 e) +b0 f) +b0 g) +b0 h) +b0 i) +b0 j) +b0 k) +b0 l) +b0 m) +b0 n) +b0 o) +b0 p) +b0 q) +b0 r) +b0 s) +b0 t) +b0 u) +b0 v) +b0 w) +b0 x) +b0 y) +b0 z) +b0 {) +b0 |) +b0 }) +b0 ~) +b0 !* +b0 "* +b0 #* +b0 $* +b0 %* +b0 &* +b0 '* +b0 (* +b0 )* +b0 ** +b0 +* +b0 ,* +b0 -* +b0 .* +b0 /* +b0 0* +b0 1* +b0 2* +b0 3* +b0 4* +b0 5* +sPhantomConst(\"0..256\") 6* +b0 7* +sPhantomConst(\"0..256\") 8* +b0 9* +b0 :* +sPhantomConst({\"units\":[{\"kind\":\"AluBranch\",\"max_in_flight\":null},{\"kind\":\"AluBranch\",\"max_in_flight\":null}],\"out_reg_num_width\":4,\"fetch_width\":2,\"max_branches_per_fetch\":1,\"log2_fetch_width_in_bytes\":3,\"default_unit_max_in_flight\":8,\"rob_size\":20}) ;* +$end +b1111111111111111111111111111111111111111111111111111111111111111 ) +b1111111111111111111111111111111111111111111111111111111111111111 * +b1111111111111111111111111111111111111111111111111111111111111111 + +b1111111111111111111111111111111111111111111111111111111111111111 , +b1111111111111111111111111111111111111111111111111111111111111111 - +b1111111111111111111111111111111111111111111111111111111111111111 . +b1111111111111111111111111111111111111111111111111111111111111111 / +b1111111111111111111111111111111111111111111111111111111111111111 0 +b1111111111111111111111111111111111111111111111111111111111111111 1 +b1111111111111111111111111111111111111111111111111111111111111111 2 +b1111111111111111111111111111111111111111111111111111111111111111 3 +b1111111111111111111111111111111111111111111111111111111111111111 4 +b1111111111111111111111111111111111111111111111111111111111111111 5 +b1111111111111111111111111111111111111111111111111111111111111111 6 +b1111111111111111111111111111111111111111111111111111111111111111 7 +b1111111111111111111111111111111111111111111111111111111111111111 8 +b1111111111111111111111111111111111111111111111111111111111111111 ; +b1111111111111111111111111111111111111111111111111111111111111111 < +b1111111111111111111111111111111111111111111111111111111111111111 = +b1111111111111111111111111111111111111111111111111111111111111111 > +b1111111111111111111111111111111111111111111111111111111111111111 ? +b1111111111111111111111111111111111111111111111111111111111111111 @ +b1111111111111111111111111111111111111111111111111111111111111111 A +b1111111111111111111111111111111111111111111111111111111111111111 B +b1111111111111111111111111111111111111111111111111111111111111111 C +b1111111111111111111111111111111111111111111111111111111111111111 D +b1111111111111111111111111111111111111111111111111111111111111111 E +b1111111111111111111111111111111111111111111111111111111111111111 F +b1111111111111111111111111111111111111111111111111111111111111111 G +b1111111111111111111111111111111111111111111111111111111111111111 H +b1111111111111111111111111111111111111111111111111111111111111111 I +b1111111111111111111111111111111111111111111111111111111111111111 J +sHdlSome\x20(1) M +sHdlSome\x20(1) P +sHdlSome\x20(1) S +sHdlSome\x20(1) V +sHdlSome\x20(1) Y +sHdlSome\x20(1) \ +sHdlSome\x20(1) _ +sHdlSome\x20(1) b +sHdlSome\x20(1) e +sHdlSome\x20(1) h +sHdlSome\x20(1) k +sHdlSome\x20(1) n +sHdlSome\x20(1) q +sHdlSome\x20(1) t +sHdlSome\x20(1) w +sHdlSome\x20(1) z +1} +1~ +1!" +1"" +1#" +1$" +1%" +1&" +1'" +1(" +1)" +1*" +1+" +1," +1-" +1." +1/" +10" +11" +12" +13" +14" +15" +16" +17" +18" +19" +1:" +1;" +1<" +1=" +1>" +1?" +1@" +1A" +1B" +1C" +1D" +1E" +1F" +1G" +1H" +1I" +1J" +1K" +1L" +1M" +1N" +1O" +1P" +1Q" +1R" +1S" +1T" +1U" +1V" +1W" +1X" +1Y" +1Z" +1[" +1\" +1]" +1^" +1_" +1`" +1a" +1b" +1c" +1d" +1e" +1f" +1g" +1h" +1i" +1j" +1k" +1l" +1m" +1n" +1o" +1p" +1q" +1r" +1s" +1t" +1u" +1v" +1w" +1x" +1y" +1z" +1{" +1|" +1}" +1~" +1!# +1"# +1## +1$# +1%# +1&# +1'# +1(# +1)# +1*# +1+# +1,# +1-# +1.# +1/# +10# +11# +12# +13# +14# +15# +16# +17# +18# +19# +1:# +1;# +1<# +1=# +1># +1?# +1@# +1A# +1B# +1C# +1D# +1E# +1F# +1G# +1H# +1I# +1J# +1K# +1L# +1M# +1N# +1O# +1P# +1Q# +1R# +1S# +1T# +1U# +1V# +1W# +1X# +1Y# +1Z# +1[# +1\# +1]# +1^# +1_# +1`# +1a# +1b# +1c# +1d# +1e# +1f# +1g# +1h# +1i# +1j# +1k# +1l# +1m# +1n# +1o# +1p# +1q# +1r# +1s# +1t# +1u# +1v# +1w# +1x# +1y# +1z# +1{# +1|# +1}# +1~# +1!$ +1"$ +1#$ +1$$ +1%$ +1&$ +1'$ +1($ +1)$ +1*$ +1+$ +1,$ +1-$ +1.$ +1/$ +10$ +11$ +12$ +13$ +14$ +15$ +16$ +17$ +18$ +19$ +1:$ +1;$ +1<$ +1=$ +1>$ +1?$ +1@$ +1A$ +1B$ +1C$ +1D$ +1E$ +1F$ +1G$ +1H$ +1I$ +1J$ +1K$ +1L$ +1M$ +1N$ +1O$ +1P$ +1Q$ +1R$ +1S$ +1T$ +1U$ +1V$ +1W$ +1X$ +1Y$ +1Z$ +1[$ +1\$ +1]$ +1^$ +1_$ +1`$ +1a$ +1b$ +b1111111111111111111111111111111111111111111111111111111111111111 9* +b11111111 :* +#500000 +1! +b0 ) +b0 * +b0 + +b0 , +b0 - +b0 . +b0 / +b0 0 +b0 1 +b0 2 +b0 3 +b0 4 +b0 5 +b0 6 +b0 7 +b0 8 +b0 ; +b0 < +b0 = +b0 > +b0 ? +b0 @ +b0 A +b0 B +b0 C +b0 D +b0 E +b0 F +b0 G +b0 H +b0 I +b0 J +sHdlNone\x20(0) M +0} +sWeaklyNotTaken\x20(1) i$ +b0 9* +b0 :* +#1000000 +0! +0" +#1500000 +1! +#2000000 +0! +#2500000 +1! +sHdlNone\x20(0) P +0~ +sWeaklyNotTaken\x20(1) j$ +#3000000 +0! +#3500000 +1! +sHdlNone\x20(0) S +0!" +sWeaklyNotTaken\x20(1) k$ +#4000000 +0! +#4500000 +1! +sHdlNone\x20(0) V +0"" +sWeaklyNotTaken\x20(1) l$ +#5000000 +0! +#5500000 +1! +sHdlNone\x20(0) Y +0#" +sWeaklyNotTaken\x20(1) m$ +#6000000 +0! +#6500000 +1! +sHdlNone\x20(0) \ +0$" +sWeaklyNotTaken\x20(1) n$ +#7000000 +0! +#7500000 +1! +sHdlNone\x20(0) _ +0%" +sWeaklyNotTaken\x20(1) o$ +#8000000 +0! +#8500000 +1! +sHdlNone\x20(0) b +0&" +sWeaklyNotTaken\x20(1) p$ +#9000000 +0! +#9500000 +1! +sHdlNone\x20(0) e +0'" +sWeaklyNotTaken\x20(1) q$ +#10000000 +0! +#10500000 +1! +sHdlNone\x20(0) h +0(" +sWeaklyNotTaken\x20(1) r$ +#11000000 +0! +#11500000 +1! +sHdlNone\x20(0) k +0)" +sWeaklyNotTaken\x20(1) s$ +#12000000 +0! +#12500000 +1! +sHdlNone\x20(0) n +0*" +sWeaklyNotTaken\x20(1) t$ +#13000000 +0! +#13500000 +1! +sHdlNone\x20(0) q +0+" +sWeaklyNotTaken\x20(1) u$ +#14000000 +0! +#14500000 +1! +sHdlNone\x20(0) t +0," +sWeaklyNotTaken\x20(1) v$ +#15000000 +0! +#15500000 +1! +sHdlNone\x20(0) w +0-" +sWeaklyNotTaken\x20(1) w$ +#16000000 +0! +#16500000 +1! +sHdlNone\x20(0) z +0." +sWeaklyNotTaken\x20(1) x$ +#17000000 +0! +#17500000 +1! +0/" +sWeaklyNotTaken\x20(1) y$ +#18000000 +0! +#18500000 +1! +00" +sWeaklyNotTaken\x20(1) z$ +#19000000 +0! +#19500000 +1! +01" +sWeaklyNotTaken\x20(1) {$ +#20000000 +0! +#20500000 +1! +02" +sWeaklyNotTaken\x20(1) |$ +#21000000 +0! +#21500000 +1! +03" +sWeaklyNotTaken\x20(1) }$ +#22000000 +0! +#22500000 +1! +04" +sWeaklyNotTaken\x20(1) ~$ +#23000000 +0! +#23500000 +1! +05" +sWeaklyNotTaken\x20(1) !% +#24000000 +0! +#24500000 +1! +06" +sWeaklyNotTaken\x20(1) "% +#25000000 +0! +#25500000 +1! +07" +sWeaklyNotTaken\x20(1) #% +#26000000 +0! +#26500000 +1! +08" +sWeaklyNotTaken\x20(1) $% +#27000000 +0! +#27500000 +1! +09" +sWeaklyNotTaken\x20(1) %% +#28000000 +0! +#28500000 +1! +0:" +sWeaklyNotTaken\x20(1) &% +#29000000 +0! +#29500000 +1! +0;" +sWeaklyNotTaken\x20(1) '% +#30000000 +0! +#30500000 +1! +0<" +sWeaklyNotTaken\x20(1) (% +#31000000 +0! +#31500000 +1! +0=" +sWeaklyNotTaken\x20(1) )% +#32000000 +0! +#32500000 +1! +0>" +sWeaklyNotTaken\x20(1) *% +#33000000 +0! +#33500000 +1! +0?" +sWeaklyNotTaken\x20(1) +% +#34000000 +0! +#34500000 +1! +0@" +sWeaklyNotTaken\x20(1) ,% +#35000000 +0! +#35500000 +1! +0A" +sWeaklyNotTaken\x20(1) -% +#36000000 +0! +#36500000 +1! +0B" +sWeaklyNotTaken\x20(1) .% +#37000000 +0! +#37500000 +1! +0C" +sWeaklyNotTaken\x20(1) /% +#38000000 +0! +#38500000 +1! +0D" +sWeaklyNotTaken\x20(1) 0% +#39000000 +0! +#39500000 +1! +0E" +sWeaklyNotTaken\x20(1) 1% +#40000000 +0! +#40500000 +1! +0F" +sWeaklyNotTaken\x20(1) 2% +#41000000 +0! +#41500000 +1! +0G" +sWeaklyNotTaken\x20(1) 3% +#42000000 +0! +#42500000 +1! +0H" +sWeaklyNotTaken\x20(1) 4% +#43000000 +0! +#43500000 +1! +0I" +sWeaklyNotTaken\x20(1) 5% +#44000000 +0! +#44500000 +1! +0J" +sWeaklyNotTaken\x20(1) 6% +#45000000 +0! +#45500000 +1! +0K" +sWeaklyNotTaken\x20(1) 7% +#46000000 +0! +#46500000 +1! +0L" +sWeaklyNotTaken\x20(1) 8% +#47000000 +0! +#47500000 +1! +0M" +sWeaklyNotTaken\x20(1) 9% +#48000000 +0! +#48500000 +1! +0N" +sWeaklyNotTaken\x20(1) :% +#49000000 +0! +#49500000 +1! +0O" +sWeaklyNotTaken\x20(1) ;% +#50000000 +0! +#50500000 +1! +0P" +sWeaklyNotTaken\x20(1) <% +#51000000 +0! +#51500000 +1! +0Q" +sWeaklyNotTaken\x20(1) =% +#52000000 +0! +#52500000 +1! +0R" +sWeaklyNotTaken\x20(1) >% +#53000000 +0! +#53500000 +1! +0S" +sWeaklyNotTaken\x20(1) ?% +#54000000 +0! +#54500000 +1! +0T" +sWeaklyNotTaken\x20(1) @% +#55000000 +0! +#55500000 +1! +0U" +sWeaklyNotTaken\x20(1) A% +#56000000 +0! +#56500000 +1! +0V" +sWeaklyNotTaken\x20(1) B% +#57000000 +0! +#57500000 +1! +0W" +sWeaklyNotTaken\x20(1) C% +#58000000 +0! +#58500000 +1! +0X" +sWeaklyNotTaken\x20(1) D% +#59000000 +0! +#59500000 +1! +0Y" +sWeaklyNotTaken\x20(1) E% +#60000000 +0! +#60500000 +1! +0Z" +sWeaklyNotTaken\x20(1) F% +#61000000 +0! +#61500000 +1! +0[" +sWeaklyNotTaken\x20(1) G% +#62000000 +0! +#62500000 +1! +0\" +sWeaklyNotTaken\x20(1) H% +#63000000 +0! +#63500000 +1! +0]" +sWeaklyNotTaken\x20(1) I% +#64000000 +0! +#64500000 +1! +0^" +sWeaklyNotTaken\x20(1) J% +#65000000 +0! +#65500000 +1! +0_" +sWeaklyNotTaken\x20(1) K% +#66000000 +0! +#66500000 +1! +0`" +sWeaklyNotTaken\x20(1) L% +#67000000 +0! +#67500000 +1! +0a" +sWeaklyNotTaken\x20(1) M% +#68000000 +0! +#68500000 +1! +0b" +sWeaklyNotTaken\x20(1) N% +#69000000 +0! +#69500000 +1! +0c" +sWeaklyNotTaken\x20(1) O% +#70000000 +0! +#70500000 +1! +0d" +sWeaklyNotTaken\x20(1) P% +#71000000 +0! +#71500000 +1! +0e" +sWeaklyNotTaken\x20(1) Q% +#72000000 +0! +#72500000 +1! +0f" +sWeaklyNotTaken\x20(1) R% +#73000000 +0! +#73500000 +1! +0g" +sWeaklyNotTaken\x20(1) S% +#74000000 +0! +#74500000 +1! +0h" +sWeaklyNotTaken\x20(1) T% +#75000000 +0! +#75500000 +1! +0i" +sWeaklyNotTaken\x20(1) U% +#76000000 +0! +#76500000 +1! +0j" +sWeaklyNotTaken\x20(1) V% +#77000000 +0! +#77500000 +1! +0k" +sWeaklyNotTaken\x20(1) W% +#78000000 +0! +#78500000 +1! +0l" +sWeaklyNotTaken\x20(1) X% +#79000000 +0! +#79500000 +1! +0m" +sWeaklyNotTaken\x20(1) Y% +#80000000 +0! +#80500000 +1! +0n" +sWeaklyNotTaken\x20(1) Z% +#81000000 +0! +#81500000 +1! +0o" +sWeaklyNotTaken\x20(1) [% +#82000000 +0! +#82500000 +1! +0p" +sWeaklyNotTaken\x20(1) \% +#83000000 +0! +#83500000 +1! +0q" +sWeaklyNotTaken\x20(1) ]% +#84000000 +0! +#84500000 +1! +0r" +sWeaklyNotTaken\x20(1) ^% +#85000000 +0! +#85500000 +1! +0s" +sWeaklyNotTaken\x20(1) _% +#86000000 +0! +#86500000 +1! +0t" +sWeaklyNotTaken\x20(1) `% +#87000000 +0! +#87500000 +1! +0u" +sWeaklyNotTaken\x20(1) a% +#88000000 +0! +#88500000 +1! +0v" +sWeaklyNotTaken\x20(1) b% +#89000000 +0! +#89500000 +1! +0w" +sWeaklyNotTaken\x20(1) c% +#90000000 +0! +#90500000 +1! +0x" +sWeaklyNotTaken\x20(1) d% +#91000000 +0! +#91500000 +1! +0y" +sWeaklyNotTaken\x20(1) e% +#92000000 +0! +#92500000 +1! +0z" +sWeaklyNotTaken\x20(1) f% +#93000000 +0! +#93500000 +1! +0{" +sWeaklyNotTaken\x20(1) g% +#94000000 +0! +#94500000 +1! +0|" +sWeaklyNotTaken\x20(1) h% +#95000000 +0! +#95500000 +1! +0}" +sWeaklyNotTaken\x20(1) i% +#96000000 +0! +#96500000 +1! +0~" +sWeaklyNotTaken\x20(1) j% +#97000000 +0! +#97500000 +1! +0!# +sWeaklyNotTaken\x20(1) k% +#98000000 +0! +#98500000 +1! +0"# +sWeaklyNotTaken\x20(1) l% +#99000000 +0! +#99500000 +1! +0## +sWeaklyNotTaken\x20(1) m% +#100000000 +0! +#100500000 +1! +0$# +sWeaklyNotTaken\x20(1) n% +#101000000 +0! +#101500000 +1! +0%# +sWeaklyNotTaken\x20(1) o% +#102000000 +0! +#102500000 +1! +0&# +sWeaklyNotTaken\x20(1) p% +#103000000 +0! +#103500000 +1! +0'# +sWeaklyNotTaken\x20(1) q% +#104000000 +0! +#104500000 +1! +0(# +sWeaklyNotTaken\x20(1) r% +#105000000 +0! +#105500000 +1! +0)# +sWeaklyNotTaken\x20(1) s% +#106000000 +0! +#106500000 +1! +0*# +sWeaklyNotTaken\x20(1) t% +#107000000 +0! +#107500000 +1! +0+# +sWeaklyNotTaken\x20(1) u% +#108000000 +0! +#108500000 +1! +0,# +sWeaklyNotTaken\x20(1) v% +#109000000 +0! +#109500000 +1! +0-# +sWeaklyNotTaken\x20(1) w% +#110000000 +0! +#110500000 +1! +0.# +sWeaklyNotTaken\x20(1) x% +#111000000 +0! +#111500000 +1! +0/# +sWeaklyNotTaken\x20(1) y% +#112000000 +0! +#112500000 +1! +00# +sWeaklyNotTaken\x20(1) z% +#113000000 +0! +#113500000 +1! +01# +sWeaklyNotTaken\x20(1) {% +#114000000 +0! +#114500000 +1! +02# +sWeaklyNotTaken\x20(1) |% +#115000000 +0! +#115500000 +1! +03# +sWeaklyNotTaken\x20(1) }% +#116000000 +0! +#116500000 +1! +04# +sWeaklyNotTaken\x20(1) ~% +#117000000 +0! +#117500000 +1! +05# +sWeaklyNotTaken\x20(1) !& +#118000000 +0! +#118500000 +1! +06# +sWeaklyNotTaken\x20(1) "& +#119000000 +0! +#119500000 +1! +07# +sWeaklyNotTaken\x20(1) #& +#120000000 +0! +#120500000 +1! +08# +sWeaklyNotTaken\x20(1) $& +#121000000 +0! +#121500000 +1! +09# +sWeaklyNotTaken\x20(1) %& +#122000000 +0! +#122500000 +1! +0:# +sWeaklyNotTaken\x20(1) && +#123000000 +0! +#123500000 +1! +0;# +sWeaklyNotTaken\x20(1) '& +#124000000 +0! +#124500000 +1! +0<# +sWeaklyNotTaken\x20(1) (& +#125000000 +0! +#125500000 +1! +0=# +sWeaklyNotTaken\x20(1) )& +#126000000 +0! +#126500000 +1! +0># +sWeaklyNotTaken\x20(1) *& +#127000000 +0! +#127500000 +1! +0?# +sWeaklyNotTaken\x20(1) +& +#128000000 +0! +#128500000 +1! +0@# +sWeaklyNotTaken\x20(1) ,& +#129000000 +0! +#129500000 +1! +0A# +sWeaklyNotTaken\x20(1) -& +#130000000 +0! +#130500000 +1! +0B# +sWeaklyNotTaken\x20(1) .& +#131000000 +0! +#131500000 +1! +0C# +sWeaklyNotTaken\x20(1) /& +#132000000 +0! +#132500000 +1! +0D# +sWeaklyNotTaken\x20(1) 0& +#133000000 +0! +#133500000 +1! +0E# +sWeaklyNotTaken\x20(1) 1& +#134000000 +0! +#134500000 +1! +0F# +sWeaklyNotTaken\x20(1) 2& +#135000000 +0! +#135500000 +1! +0G# +sWeaklyNotTaken\x20(1) 3& +#136000000 +0! +#136500000 +1! +0H# +sWeaklyNotTaken\x20(1) 4& +#137000000 +0! +#137500000 +1! +0I# +sWeaklyNotTaken\x20(1) 5& +#138000000 +0! +#138500000 +1! +0J# +sWeaklyNotTaken\x20(1) 6& +#139000000 +0! +#139500000 +1! +0K# +sWeaklyNotTaken\x20(1) 7& +#140000000 +0! +#140500000 +1! +0L# +sWeaklyNotTaken\x20(1) 8& +#141000000 +0! +#141500000 +1! +0M# +sWeaklyNotTaken\x20(1) 9& +#142000000 +0! +#142500000 +1! +0N# +sWeaklyNotTaken\x20(1) :& +#143000000 +0! +#143500000 +1! +0O# +sWeaklyNotTaken\x20(1) ;& +#144000000 +0! +#144500000 +1! +0P# +sWeaklyNotTaken\x20(1) <& +#145000000 +0! +#145500000 +1! +0Q# +sWeaklyNotTaken\x20(1) =& +#146000000 +0! +#146500000 +1! +0R# +sWeaklyNotTaken\x20(1) >& +#147000000 +0! +#147500000 +1! +0S# +sWeaklyNotTaken\x20(1) ?& +#148000000 +0! +#148500000 +1! +0T# +sWeaklyNotTaken\x20(1) @& +#149000000 +0! +#149500000 +1! +0U# +sWeaklyNotTaken\x20(1) A& +#150000000 +0! +#150500000 +1! +0V# +sWeaklyNotTaken\x20(1) B& +#151000000 +0! +#151500000 +1! +0W# +sWeaklyNotTaken\x20(1) C& +#152000000 +0! +#152500000 +1! +0X# +sWeaklyNotTaken\x20(1) D& +#153000000 +0! +#153500000 +1! +0Y# +sWeaklyNotTaken\x20(1) E& +#154000000 +0! +#154500000 +1! +0Z# +sWeaklyNotTaken\x20(1) F& +#155000000 +0! +#155500000 +1! +0[# +sWeaklyNotTaken\x20(1) G& +#156000000 +0! +#156500000 +1! +0\# +sWeaklyNotTaken\x20(1) H& +#157000000 +0! +#157500000 +1! +0]# +sWeaklyNotTaken\x20(1) I& +#158000000 +0! +#158500000 +1! +0^# +sWeaklyNotTaken\x20(1) J& +#159000000 +0! +#159500000 +1! +0_# +sWeaklyNotTaken\x20(1) K& +#160000000 +0! +#160500000 +1! +0`# +sWeaklyNotTaken\x20(1) L& +#161000000 +0! +#161500000 +1! +0a# +sWeaklyNotTaken\x20(1) M& +#162000000 +0! +#162500000 +1! +0b# +sWeaklyNotTaken\x20(1) N& +#163000000 +0! +#163500000 +1! +0c# +sWeaklyNotTaken\x20(1) O& +#164000000 +0! +#164500000 +1! +0d# +sWeaklyNotTaken\x20(1) P& +#165000000 +0! +#165500000 +1! +0e# +sWeaklyNotTaken\x20(1) Q& +#166000000 +0! +#166500000 +1! +0f# +sWeaklyNotTaken\x20(1) R& +#167000000 +0! +#167500000 +1! +0g# +sWeaklyNotTaken\x20(1) S& +#168000000 +0! +#168500000 +1! +0h# +sWeaklyNotTaken\x20(1) T& +#169000000 +0! +#169500000 +1! +0i# +sWeaklyNotTaken\x20(1) U& +#170000000 +0! +#170500000 +1! +0j# +sWeaklyNotTaken\x20(1) V& +#171000000 +0! +#171500000 +1! +0k# +sWeaklyNotTaken\x20(1) W& +#172000000 +0! +#172500000 +1! +0l# +sWeaklyNotTaken\x20(1) X& +#173000000 +0! +#173500000 +1! +0m# +sWeaklyNotTaken\x20(1) Y& +#174000000 +0! +#174500000 +1! +0n# +sWeaklyNotTaken\x20(1) Z& +#175000000 +0! +#175500000 +1! +0o# +sWeaklyNotTaken\x20(1) [& +#176000000 +0! +#176500000 +1! +0p# +sWeaklyNotTaken\x20(1) \& +#177000000 +0! +#177500000 +1! +0q# +sWeaklyNotTaken\x20(1) ]& +#178000000 +0! +#178500000 +1! +0r# +sWeaklyNotTaken\x20(1) ^& +#179000000 +0! +#179500000 +1! +0s# +sWeaklyNotTaken\x20(1) _& +#180000000 +0! +#180500000 +1! +0t# +sWeaklyNotTaken\x20(1) `& +#181000000 +0! +#181500000 +1! +0u# +sWeaklyNotTaken\x20(1) a& +#182000000 +0! +#182500000 +1! +0v# +sWeaklyNotTaken\x20(1) b& +#183000000 +0! +#183500000 +1! +0w# +sWeaklyNotTaken\x20(1) c& +#184000000 +0! +#184500000 +1! +0x# +sWeaklyNotTaken\x20(1) d& +#185000000 +0! +#185500000 +1! +0y# +sWeaklyNotTaken\x20(1) e& +#186000000 +0! +#186500000 +1! +0z# +sWeaklyNotTaken\x20(1) f& +#187000000 +0! +#187500000 +1! +0{# +sWeaklyNotTaken\x20(1) g& +#188000000 +0! +#188500000 +1! +0|# +sWeaklyNotTaken\x20(1) h& +#189000000 +0! +#189500000 +1! +0}# +sWeaklyNotTaken\x20(1) i& +#190000000 +0! +#190500000 +1! +0~# +sWeaklyNotTaken\x20(1) j& +#191000000 +0! +#191500000 +1! +0!$ +sWeaklyNotTaken\x20(1) k& +#192000000 +0! +#192500000 +1! +0"$ +sWeaklyNotTaken\x20(1) l& +#193000000 +0! +#193500000 +1! +0#$ +sWeaklyNotTaken\x20(1) m& +#194000000 +0! +#194500000 +1! +0$$ +sWeaklyNotTaken\x20(1) n& +#195000000 +0! +#195500000 +1! +0%$ +sWeaklyNotTaken\x20(1) o& +#196000000 +0! +#196500000 +1! +0&$ +sWeaklyNotTaken\x20(1) p& +#197000000 +0! +#197500000 +1! +0'$ +sWeaklyNotTaken\x20(1) q& +#198000000 +0! +#198500000 +1! +0($ +sWeaklyNotTaken\x20(1) r& +#199000000 +0! +#199500000 +1! +0)$ +sWeaklyNotTaken\x20(1) s& +#200000000 +0! +#200500000 +1! +0*$ +sWeaklyNotTaken\x20(1) t& +#201000000 +0! +#201500000 +1! +0+$ +sWeaklyNotTaken\x20(1) u& +#202000000 +0! +#202500000 +1! +0,$ +sWeaklyNotTaken\x20(1) v& +#203000000 +0! +#203500000 +1! +0-$ +sWeaklyNotTaken\x20(1) w& +#204000000 +0! +#204500000 +1! +0.$ +sWeaklyNotTaken\x20(1) x& +#205000000 +0! +#205500000 +1! +0/$ +sWeaklyNotTaken\x20(1) y& +#206000000 +0! +#206500000 +1! +00$ +sWeaklyNotTaken\x20(1) z& +#207000000 +0! +#207500000 +1! +01$ +sWeaklyNotTaken\x20(1) {& +#208000000 +0! +#208500000 +1! +02$ +sWeaklyNotTaken\x20(1) |& +#209000000 +0! +#209500000 +1! +03$ +sWeaklyNotTaken\x20(1) }& +#210000000 +0! +#210500000 +1! +04$ +sWeaklyNotTaken\x20(1) ~& +#211000000 +0! +#211500000 +1! +05$ +sWeaklyNotTaken\x20(1) !' +#212000000 +0! +#212500000 +1! +06$ +sWeaklyNotTaken\x20(1) "' +#213000000 +0! +#213500000 +1! +07$ +sWeaklyNotTaken\x20(1) #' +#214000000 +0! +#214500000 +1! +08$ +sWeaklyNotTaken\x20(1) $' +#215000000 +0! +#215500000 +1! +09$ +sWeaklyNotTaken\x20(1) %' +#216000000 +0! +#216500000 +1! +0:$ +sWeaklyNotTaken\x20(1) &' +#217000000 +0! +#217500000 +1! +0;$ +sWeaklyNotTaken\x20(1) '' +#218000000 +0! +#218500000 +1! +0<$ +sWeaklyNotTaken\x20(1) (' +#219000000 +0! +#219500000 +1! +0=$ +sWeaklyNotTaken\x20(1) )' +#220000000 +0! +#220500000 +1! +0>$ +sWeaklyNotTaken\x20(1) *' +#221000000 +0! +#221500000 +1! +0?$ +sWeaklyNotTaken\x20(1) +' +#222000000 +0! +#222500000 +1! +0@$ +sWeaklyNotTaken\x20(1) ,' +#223000000 +0! +#223500000 +1! +0A$ +sWeaklyNotTaken\x20(1) -' +#224000000 +0! +#224500000 +1! +0B$ +sWeaklyNotTaken\x20(1) .' +#225000000 +0! +#225500000 +1! +0C$ +sWeaklyNotTaken\x20(1) /' +#226000000 +0! +#226500000 +1! +0D$ +sWeaklyNotTaken\x20(1) 0' +#227000000 +0! +#227500000 +1! +0E$ +sWeaklyNotTaken\x20(1) 1' +#228000000 +0! +#228500000 +1! +0F$ +sWeaklyNotTaken\x20(1) 2' +#229000000 +0! +#229500000 +1! +0G$ +sWeaklyNotTaken\x20(1) 3' +#230000000 +0! +#230500000 +1! +0H$ +sWeaklyNotTaken\x20(1) 4' +#231000000 +0! +#231500000 +1! +0I$ +sWeaklyNotTaken\x20(1) 5' +#232000000 +0! +#232500000 +1! +0J$ +sWeaklyNotTaken\x20(1) 6' +#233000000 +0! +#233500000 +1! +0K$ +sWeaklyNotTaken\x20(1) 7' +#234000000 +0! +#234500000 +1! +0L$ +sWeaklyNotTaken\x20(1) 8' +#235000000 +0! +#235500000 +1! +0M$ +sWeaklyNotTaken\x20(1) 9' +#236000000 +0! +#236500000 +1! +0N$ +sWeaklyNotTaken\x20(1) :' +#237000000 +0! +#237500000 +1! +0O$ +sWeaklyNotTaken\x20(1) ;' +#238000000 +0! +#238500000 +1! +0P$ +sWeaklyNotTaken\x20(1) <' +#239000000 +0! +#239500000 +1! +0Q$ +sWeaklyNotTaken\x20(1) =' +#240000000 +0! +#240500000 +1! +0R$ +sWeaklyNotTaken\x20(1) >' +#241000000 +0! +#241500000 +1! +0S$ +sWeaklyNotTaken\x20(1) ?' +#242000000 +0! +#242500000 +1! +0T$ +sWeaklyNotTaken\x20(1) @' +#243000000 +0! +#243500000 +1! +0U$ +sWeaklyNotTaken\x20(1) A' +#244000000 +0! +#244500000 +1! +0V$ +sWeaklyNotTaken\x20(1) B' +#245000000 +0! +#245500000 +1! +0W$ +sWeaklyNotTaken\x20(1) C' +#246000000 +0! +#246500000 +1! +0X$ +sWeaklyNotTaken\x20(1) D' +#247000000 +0! +#247500000 +1! +0Y$ +sWeaklyNotTaken\x20(1) E' +#248000000 +0! +#248500000 +1! +0Z$ +sWeaklyNotTaken\x20(1) F' +#249000000 +0! +#249500000 +1! +0[$ +sWeaklyNotTaken\x20(1) G' +#250000000 +0! +#250500000 +1! +0\$ +sWeaklyNotTaken\x20(1) H' +#251000000 +0! +#251500000 +1! +0]$ +sWeaklyNotTaken\x20(1) I' +#252000000 +0! +#252500000 +1! +0^$ +sWeaklyNotTaken\x20(1) J' +#253000000 +0! +#253500000 +1! +0_$ +sWeaklyNotTaken\x20(1) K' +#254000000 +0! +#254500000 +1! +0`$ +sWeaklyNotTaken\x20(1) L' +#255000000 +0! +#255500000 +1! +0a$ +sWeaklyNotTaken\x20(1) M' +#256000000 +0! +#256500000 +1! +sHdlSome\x20(1) # +0b$ +sWeaklyNotTaken\x20(1) N' +#257000000 +0! +#257500000 +1! +b1 5* +b1000 9* +b1 :* +b1000 $ +b1 % +#258000000 +0! +#258500000 +1! +b1 Q' +b10 5* +b10000 9* +b10 :* +b10000 $ +b10 % +#259000000 +0! +#259500000 +1! +b10 R' +b11 5* +b11000 9* +b11 :* +b11000 $ +b11 % +#260000000 +0! +#260500000 +1! +b11 S' +b100 5* +b100000 9* +b100 :* +b100000 $ +b100 % +#261000000 +0! +#261500000 +1! +b100 T' +b101 5* +b101000 9* +b101 :* +b101000 $ +b101 % +#262000000 +0! +#262500000 +1! +b101 U' +b110 5* +b110000 9* +b110 :* +b110000 $ +b110 % +#263000000 +0! +#263500000 +1! +b110 V' +b111 5* +b111000 9* +b111 :* +b111000 $ +b111 % +#264000000 +0! +#264500000 +1! +b111 W' +b1000 5* +b1000000 9* +b1000 :* +b1000000 $ +b1000 % +#265000000 +0! +#265500000 +1! +b1000 X' +b1001 5* +b1001000 9* +b1001 :* +b1001000 $ +b1001 % +#266000000 +0! +#266500000 +1! +b1001 Y' +b1010 5* +b1010000 9* +b1010 :* +b1010000 $ +b1010 % +#267000000 +0! +#267500000 +1! +b1010 Z' +b1011 5* +b1011000 9* +b1011 :* +b1011000 $ +b1011 % +#268000000 +0! +#268500000 +1! +b1011 [' +b1100 5* +b1100000 9* +b1100 :* +b1100000 $ +b1100 % +#269000000 +0! +#269500000 +1! +b1100 \' +b1101 5* +b1101000 9* +b1101 :* +b1101000 $ +b1101 % +#270000000 +0! +#270500000 +1! +b1101 ]' +b1110 5* +b1110000 9* +b1110 :* +b1110000 $ +b1110 % +#271000000 +0! +#271500000 +1! +b1110 ^' +b1111 5* +b1111000 9* +b1111 :* +b1111000 $ +b1111 % +#272000000 +0! +#272500000 +1! +b1111 _' +b10000 5* +b10000000 9* +b10000 :* +b10000000 $ +b10000 % +#273000000 +0! +#273500000 +1! +b10000 `' +b10001 5* +b10001000 9* +b10001 :* +b10001000 $ +b10001 % +#274000000 +0! +#274500000 +1! +b10001 a' +b10010 5* +b10010000 9* +b10010 :* +b10010000 $ +b10010 % +#275000000 +0! +#275500000 +1! +b10010 b' +b10011 5* +b10011000 9* +b10011 :* +b10011000 $ +b10011 % +#276000000 +0! +#276500000 +1! +b10011 c' +b10100 5* +b10100000 9* +b10100 :* +b10100000 $ +b10100 % +#277000000 +0! +#277500000 +1! +b10100 d' +b10101 5* +b10101000 9* +b10101 :* +b10101000 $ +b10101 % +#278000000 +0! +#278500000 +1! +b10101 e' +b10110 5* +b10110000 9* +b10110 :* +b10110000 $ +b10110 % +#279000000 +0! +#279500000 +1! +b10110 f' +b10111 5* +b10111000 9* +b10111 :* +b10111000 $ +b10111 % +#280000000 +0! +#280500000 +1! +b10111 g' +b11000 5* +b11000000 9* +b11000 :* +b11000000 $ +b11000 % +#281000000 +0! +#281500000 +1! +b11000 h' +b11001 5* +b11001000 9* +b11001 :* +b11001000 $ +b11001 % +#282000000 +0! +#282500000 +1! +b11001 i' +b11010 5* +b11010000 9* +b11010 :* +b11010000 $ +b11010 % +#283000000 +0! +#283500000 +1! +b11010 j' +b11011 5* +b11011000 9* +b11011 :* +b11011000 $ +b11011 % +#284000000 +0! +#284500000 +1! +b11011 k' +b11100 5* +b11100000 9* +b11100 :* +b11100000 $ +b11100 % +#285000000 +0! +#285500000 +1! +b11100 l' +b11101 5* +b11101000 9* +b11101 :* +b11101000 $ +b11101 % +#286000000 +0! +#286500000 +1! +b11101 m' +b11110 5* +b11110000 9* +b11110 :* +b11110000 $ +b11110 % +#287000000 +0! +#287500000 +1! +b11110 n' +b11111 5* +b11111000 9* +b11111 :* +b11111000 $ +b11111 % +#288000000 +0! +#288500000 +1! +b11111 o' +b100000 5* +b100000000 9* +b100000 :* +b100000000 $ +b100000 % +#289000000 +0! +#289500000 +1! +b100000 p' +b100001 5* +b100001000 9* +b100001 :* +b100001000 $ +b100001 % +#290000000 +0! +#290500000 +1! +b100001 q' +b100010 5* +b100010000 9* +b100010 :* +b100010000 $ +b100010 % +#291000000 +0! +#291500000 +1! +b100010 r' +b100011 5* +b100011000 9* +b100011 :* +b100011000 $ +b100011 % +#292000000 +0! +#292500000 +1! +b100011 s' +b100100 5* +b100100000 9* +b100100 :* +b100100000 $ +b100100 % +#293000000 +0! +#293500000 +1! +b100100 t' +b100101 5* +b100101000 9* +b100101 :* +b100101000 $ +b100101 % +#294000000 +0! +#294500000 +1! +b100101 u' +b100110 5* +b100110000 9* +b100110 :* +b100110000 $ +b100110 % +#295000000 +0! +#295500000 +1! +b100110 v' +b100111 5* +b100111000 9* +b100111 :* +b100111000 $ +b100111 % +#296000000 +0! +#296500000 +1! +b100111 w' +b101000 5* +b101000000 9* +b101000 :* +b101000000 $ +b101000 % +#297000000 +0! +#297500000 +1! +b101000 x' +b101001 5* +b101001000 9* +b101001 :* +b101001000 $ +b101001 % +#298000000 +0! +#298500000 +1! +b101001 y' +b101010 5* +b101010000 9* +b101010 :* +b101010000 $ +b101010 % +#299000000 +0! +#299500000 +1! +b101010 z' +b101011 5* +b101011000 9* +b101011 :* +b101011000 $ +b101011 % +#300000000 diff --git a/crates/cpu/tests/next_pc.rs b/crates/cpu/tests/next_pc.rs new file mode 100644 index 0000000..28c78e0 --- /dev/null +++ b/crates/cpu/tests/next_pc.rs @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// See Notices.txt for copyright information + +use cpu::{ + config::{CpuConfig, UnitConfig}, + next_pc::next_pc, + unit::UnitKind, +}; +use fayalite::{prelude::*, sim::vcd::VcdWriterDecls, util::RcWriter}; +use std::num::NonZeroUsize; + +#[hdl] +#[test] +fn test_next_pc() { + let _n = SourceLocation::normalize_files_for_tests(); + let mut config = CpuConfig::new( + vec![ + UnitConfig::new(UnitKind::AluBranch), + UnitConfig::new(UnitKind::AluBranch), + ], + NonZeroUsize::new(20).unwrap(), + ); + config.fetch_width = NonZeroUsize::new(2).unwrap(); + let m = next_pc(PhantomConst::new_sized(config)); + let mut sim = Simulation::new(m); + let mut writer = RcWriter::default(); + sim.add_trace_writer(VcdWriterDecls::new(writer.clone())); + let to_fetch = sim.io().to_fetch; + sim.write_clock(sim.io().cd.clk, false); + sim.write_reset(sim.io().cd.rst, true); + sim.write_bool(to_fetch.inner.ready, true); + for _cycle in 0..300 { + sim.advance_time(SimDuration::from_nanos(500)); + sim.write_clock(sim.io().cd.clk, true); + sim.advance_time(SimDuration::from_nanos(500)); + sim.write_clock(sim.io().cd.clk, false); + sim.write_reset(sim.io().cd.rst, false); + } + // FIXME: vcd is just whatever next_pc does now, which isn't known to be correct + let vcd = String::from_utf8(writer.take()).unwrap(); + println!("####### VCD:\n{vcd}\n#######"); + if vcd != include_str!("expected/next_pc.vcd") { + panic!(); + } +}