From c52cf12360e21e3524cd3e858a4537f7a34478e3 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 | 25 + crates/cpu/src/lib.rs | 1 + crates/cpu/src/next_pc.rs | 564 ++++ crates/cpu/tests/expected/next_pc.vcd | 3650 +++++++++++++++++++++++++ crates/cpu/tests/next_pc.rs | 45 + 5 files changed, 4285 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..ed3b814 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 fetch_width_in_bytes: NonZeroUsize, /// default value for [`UnitConfig::max_in_flight`] pub default_unit_max_in_flight: NonZeroUsize, pub rob_size: NonZeroUsize, @@ -47,6 +49,18 @@ impl CpuConfig { }; v }; + pub const DEFAULT_MAX_BRANCHES_PER_FETCH: NonZeroUsize = { + let Some(v) = NonZeroUsize::new(1) else { + unreachable!(); + }; + v + }; + pub const DEFAULT_FETCH_WIDTH_IN_BYTES: NonZeroUsize = { + let Some(v) = NonZeroUsize::new(4) else { + unreachable!(); + }; + v + }; pub const DEFAULT_UNIT_MAX_IN_FLIGHT: NonZeroUsize = { let Some(v) = NonZeroUsize::new(8) else { unreachable!(); @@ -58,6 +72,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, + fetch_width_in_bytes: Self::DEFAULT_FETCH_WIDTH_IN_BYTES, default_unit_max_in_flight: Self::DEFAULT_UNIT_MAX_IN_FLIGHT, rob_size, } @@ -118,3 +134,12 @@ impl CpuConfig { [self.non_const_unit_nums().len()] } } + +#[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.fetch_width_in_bytes.get()))] +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..0338cc4 --- /dev/null +++ b/crates/cpu/src/next_pc.rs @@ -0,0 +1,564 @@ +// 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}, + prelude::*, + sim::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>, +} + +#[hdl] +pub struct NextPcToFetchInterfaceInner { + pub next_fetch_pc: UInt<64>, + pub fetch_block_id: UInt<8>, + 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, +} + +#[derive( + Copy, Clone, PartialEq, Eq, Debug, Hash, Default, serde::Serialize, serde::Deserialize, +)] +enum BranchPredictionState { + StronglyNotTaken, + #[default] + WeaklyNotTaken, + WeaklyTaken, + StronglyTaken, +} + +impl BranchPredictionState { + #[must_use] + fn is_taken(self) -> bool { + match self { + Self::StronglyNotTaken => false, + Self::WeaklyNotTaken => false, + Self::WeaklyTaken => true, + Self::StronglyTaken => true, + } + } + #[must_use] + fn towards_taken(self) -> Self { + match self { + Self::StronglyNotTaken => Self::WeaklyNotTaken, + Self::WeaklyNotTaken => Self::WeaklyTaken, + Self::WeaklyTaken => Self::StronglyTaken, + Self::StronglyTaken => Self::StronglyTaken, + } + } + #[must_use] + fn towards_not_taken(self) -> Self { + match self { + Self::StronglyNotTaken => Self::StronglyNotTaken, + Self::WeaklyNotTaken => Self::StronglyNotTaken, + Self::WeaklyTaken => Self::WeaklyNotTaken, + Self::StronglyTaken => Self::WeaklyTaken, + } + } +} + +#[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 { + async fn reset_step( + this: Expr, + sim: &mut ExternModuleSimulationState, + step: usize, + ) -> ResetStatus; +} + +impl ResetSteps for ArrayType { + async fn reset_step( + this: Expr, + sim: &mut ExternModuleSimulationState, + step: usize, + ) -> ResetStatus { + let element = Expr::ty(this).element(); + let len = Expr::ty(this).len(); + if step < len { + sim.write(this[step], element.sim_value_default()).await; + } + 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] + async fn reset_step( + this: Expr, + sim: &mut ExternModuleSimulationState, + _step: usize, + ) -> ResetStatus { + #[hdl] + let CallStack { + return_addresses, + len, + } = this; + // return_addresses is implemented as a shift register, so it can be all reset at once + for i in return_addresses { + sim.write(i, 0u64).await; + } + sim.write(len, 0usize).await; + 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] + async fn reset_step( + this: Expr, + sim: &mut ExternModuleSimulationState, + step: usize, + ) -> ResetStatus { + #[hdl] + let BranchTargetBuffer { + branch_pc_to_target_map, + } = this; + ResetSteps::reset_step(branch_pc_to_target_map, sim, step).await + } +} + +#[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] + async fn reset_step( + this: Expr, + sim: &mut ExternModuleSimulationState, + step: usize, + ) -> ResetStatus { + #[hdl] + let Self { + history, + tail, + non_speculative_head, + speculative_head, + } = this; + sim.write(tail, 0usize).await; + sim.write(non_speculative_head, 0usize).await; + sim.write(speculative_head, 0usize).await; + ResetSteps::reset_step(history, sim, step).await + } +} + +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 + } + async fn history_from_head( + this: Expr, + sim: &mut ExternModuleSimulationState, + head: usize, + ) -> [bool; N] { + let mut retval = [false; N]; + let mut pos = head; + for entry in &mut retval { + if pos == *sim.read(this.tail).await { + break; + } + *entry = sim.read_bool(this.history[pos]).await; + pos = Self::prev_pos(pos); + } + retval + } + async fn delete_speculative_history(this: Expr, sim: &mut ExternModuleSimulationState) { + let non_speculative_head = sim.read(this.non_speculative_head).await; + sim.write(this.speculative_head, non_speculative_head).await; + } + async fn recent_history_including_speculative( + this: Expr, + sim: &mut ExternModuleSimulationState, + ) -> [bool; N] { + let head = *sim.read(this.speculative_head).await; + Self::history_from_head(this, sim, head).await + } + async fn speculative_full(this: Expr, sim: &mut ExternModuleSimulationState) -> bool { + let speculative_head = *sim.read(this.speculative_head).await; + Self::next_pos(speculative_head) == *sim.read(this.tail).await + } + async fn try_push_speculative( + this: Expr, + sim: &mut ExternModuleSimulationState, + value: bool, + ) -> Result<(), BranchHistoryTryPushSpeculativeError> { + if Self::speculative_full(this, sim).await { + Err(BranchHistoryTryPushSpeculativeError::NoSpace) + } else { + let speculative_head = *sim.read(this.speculative_head).await; + let speculative_head = Self::next_pos(speculative_head); + sim.write(this.speculative_head, speculative_head).await; + sim.write(this.history[speculative_head], value).await; + Ok(()) + } + } + async fn try_push_non_speculative( + this: Expr, + sim: &mut ExternModuleSimulationState, + value: bool, + ) -> Result<(), BranchHistoryTryPushNonSpeculativeError> { + let speculative_head = *sim.read(this.speculative_head).await; + let non_speculative_head = *sim.read(this.non_speculative_head).await; + if speculative_head == non_speculative_head { + Err(BranchHistoryTryPushNonSpeculativeError::NoSpace) + } else { + let pos = Self::next_pos(non_speculative_head); + let speculated = sim.read_bool(this.history[pos]).await; + if speculated != value { + Err(BranchHistoryTryPushNonSpeculativeError::Misprediction { speculated }) + } else { + sim.write(this.non_speculative_head, pos).await; + Ok(()) + } + } + } +} + +#[hdl] +pub struct NextPcState { + speculative_call_stack: CallStack, + non_speculative_call_stack: CallStack, + branch_target_buffer: BranchTargetBuffer, + branch_history: BranchHistory, + branch_predictor: Array, { NextPcState::BRANCH_PREDICTOR_SIZE }>, +} + +impl NextPcState { + const BRANCH_PREDICTOR_LOG2_SIZE: usize = 8; + const BRANCH_PREDICTOR_SIZE: usize = 1 << Self::BRANCH_PREDICTOR_LOG2_SIZE; + async fn branch_predictor_index( + this: Expr, + sim: &mut ExternModuleSimulationState, + pc: u64, + ) -> usize { + let mut history = 0u64; + let history_bits: [bool; Self::BRANCH_PREDICTOR_LOG2_SIZE] = + BranchHistory::recent_history_including_speculative(this.branch_history, sim).await; + 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..Self::BRANCH_PREDICTOR_LOG2_SIZE).step_by(Self::BRANCH_PREDICTOR_LOG2_SIZE) { + retval ^= t >> i; + } + retval as usize % Self::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, + } = 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(|_| { + SimOnlyValue::new(BranchPredictionState::default().towards_not_taken()) + }), + } + } +} + +impl ResetSteps for NextPcState { + #[hdl] + async fn reset_step( + this: Expr, + sim: &mut ExternModuleSimulationState, + step: usize, + ) -> ResetStatus { + #[hdl] + let NextPcState { + speculative_call_stack, + non_speculative_call_stack, + branch_target_buffer, + branch_history, + branch_predictor, + } = this; + let speculative_call_stack = + ResetSteps::reset_step(speculative_call_stack, sim, step).await; + let non_speculative_call_stack = + ResetSteps::reset_step(non_speculative_call_stack, sim, step).await; + let branch_target_buffer = ResetSteps::reset_step(branch_target_buffer, sim, step).await; + let branch_history = ResetSteps::reset_step(branch_history, sim, step).await; + let branch_predictor = ResetSteps::reset_step(branch_predictor, sim, step).await; + speculative_call_stack + .and(non_speculative_call_stack) + .and(branch_target_buffer) + .and(branch_history) + .and(branch_predictor) + } +} + +#[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(); + 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, NextPcState.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, mut sim: ExternModuleSimulationState| async move { + for step in 0usize.. { + sim.wait_for_clock_edge(cd.clk).await; + match ResetSteps::reset_step(state_for_debug, &mut sim, step).await { + ResetStatus::Done => break, + ResetStatus::Working => {} + } + } + // TODO: finish + }) + .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..45e1cd6 --- /dev/null +++ b/crates/cpu/tests/expected/next_pc.vcd @@ -0,0 +1,3650 @@ +$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 +$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,\"fetch_width_in_bytes\":4,\"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$ +sWeaklyNotTaken i$ +sWeaklyNotTaken j$ +sWeaklyNotTaken k$ +sWeaklyNotTaken l$ +sWeaklyNotTaken m$ +sWeaklyNotTaken n$ +sWeaklyNotTaken o$ +sWeaklyNotTaken p$ +sWeaklyNotTaken q$ +sWeaklyNotTaken r$ +sWeaklyNotTaken s$ +sWeaklyNotTaken t$ +sWeaklyNotTaken u$ +sWeaklyNotTaken v$ +sWeaklyNotTaken w$ +sWeaklyNotTaken x$ +sWeaklyNotTaken y$ +sWeaklyNotTaken z$ +sWeaklyNotTaken {$ +sWeaklyNotTaken |$ +sWeaklyNotTaken }$ +sWeaklyNotTaken ~$ +sWeaklyNotTaken !% +sWeaklyNotTaken "% +sWeaklyNotTaken #% +sWeaklyNotTaken $% +sWeaklyNotTaken %% +sWeaklyNotTaken &% +sWeaklyNotTaken '% +sWeaklyNotTaken (% +sWeaklyNotTaken )% +sWeaklyNotTaken *% +sWeaklyNotTaken +% +sWeaklyNotTaken ,% +sWeaklyNotTaken -% +sWeaklyNotTaken .% +sWeaklyNotTaken /% +sWeaklyNotTaken 0% +sWeaklyNotTaken 1% +sWeaklyNotTaken 2% +sWeaklyNotTaken 3% +sWeaklyNotTaken 4% +sWeaklyNotTaken 5% +sWeaklyNotTaken 6% +sWeaklyNotTaken 7% +sWeaklyNotTaken 8% +sWeaklyNotTaken 9% +sWeaklyNotTaken :% +sWeaklyNotTaken ;% +sWeaklyNotTaken <% +sWeaklyNotTaken =% +sWeaklyNotTaken >% +sWeaklyNotTaken ?% +sWeaklyNotTaken @% +sWeaklyNotTaken A% +sWeaklyNotTaken B% +sWeaklyNotTaken C% +sWeaklyNotTaken D% +sWeaklyNotTaken E% +sWeaklyNotTaken F% +sWeaklyNotTaken G% +sWeaklyNotTaken H% +sWeaklyNotTaken I% +sWeaklyNotTaken J% +sWeaklyNotTaken K% +sWeaklyNotTaken L% +sWeaklyNotTaken M% +sWeaklyNotTaken N% +sWeaklyNotTaken O% +sWeaklyNotTaken P% +sWeaklyNotTaken Q% +sWeaklyNotTaken R% +sWeaklyNotTaken S% +sWeaklyNotTaken T% +sWeaklyNotTaken U% +sWeaklyNotTaken V% +sWeaklyNotTaken W% +sWeaklyNotTaken X% +sWeaklyNotTaken Y% +sWeaklyNotTaken Z% +sWeaklyNotTaken [% +sWeaklyNotTaken \% +sWeaklyNotTaken ]% +sWeaklyNotTaken ^% +sWeaklyNotTaken _% +sWeaklyNotTaken `% +sWeaklyNotTaken a% +sWeaklyNotTaken b% +sWeaklyNotTaken c% +sWeaklyNotTaken d% +sWeaklyNotTaken e% +sWeaklyNotTaken f% +sWeaklyNotTaken g% +sWeaklyNotTaken h% +sWeaklyNotTaken i% +sWeaklyNotTaken j% +sWeaklyNotTaken k% +sWeaklyNotTaken l% +sWeaklyNotTaken m% +sWeaklyNotTaken n% +sWeaklyNotTaken o% +sWeaklyNotTaken p% +sWeaklyNotTaken q% +sWeaklyNotTaken r% +sWeaklyNotTaken s% +sWeaklyNotTaken t% +sWeaklyNotTaken u% +sWeaklyNotTaken v% +sWeaklyNotTaken w% +sWeaklyNotTaken x% +sWeaklyNotTaken y% +sWeaklyNotTaken z% +sWeaklyNotTaken {% +sWeaklyNotTaken |% +sWeaklyNotTaken }% +sWeaklyNotTaken ~% +sWeaklyNotTaken !& +sWeaklyNotTaken "& +sWeaklyNotTaken #& +sWeaklyNotTaken $& +sWeaklyNotTaken %& +sWeaklyNotTaken && +sWeaklyNotTaken '& +sWeaklyNotTaken (& +sWeaklyNotTaken )& +sWeaklyNotTaken *& +sWeaklyNotTaken +& +sWeaklyNotTaken ,& +sWeaklyNotTaken -& +sWeaklyNotTaken .& +sWeaklyNotTaken /& +sWeaklyNotTaken 0& +sWeaklyNotTaken 1& +sWeaklyNotTaken 2& +sWeaklyNotTaken 3& +sWeaklyNotTaken 4& +sWeaklyNotTaken 5& +sWeaklyNotTaken 6& +sWeaklyNotTaken 7& +sWeaklyNotTaken 8& +sWeaklyNotTaken 9& +sWeaklyNotTaken :& +sWeaklyNotTaken ;& +sWeaklyNotTaken <& +sWeaklyNotTaken =& +sWeaklyNotTaken >& +sWeaklyNotTaken ?& +sWeaklyNotTaken @& +sWeaklyNotTaken A& +sWeaklyNotTaken B& +sWeaklyNotTaken C& +sWeaklyNotTaken D& +sWeaklyNotTaken E& +sWeaklyNotTaken F& +sWeaklyNotTaken G& +sWeaklyNotTaken H& +sWeaklyNotTaken I& +sWeaklyNotTaken J& +sWeaklyNotTaken K& +sWeaklyNotTaken L& +sWeaklyNotTaken M& +sWeaklyNotTaken N& +sWeaklyNotTaken O& +sWeaklyNotTaken P& +sWeaklyNotTaken Q& +sWeaklyNotTaken R& +sWeaklyNotTaken S& +sWeaklyNotTaken T& +sWeaklyNotTaken U& +sWeaklyNotTaken V& +sWeaklyNotTaken W& +sWeaklyNotTaken X& +sWeaklyNotTaken Y& +sWeaklyNotTaken Z& +sWeaklyNotTaken [& +sWeaklyNotTaken \& +sWeaklyNotTaken ]& +sWeaklyNotTaken ^& +sWeaklyNotTaken _& +sWeaklyNotTaken `& +sWeaklyNotTaken a& +sWeaklyNotTaken b& +sWeaklyNotTaken c& +sWeaklyNotTaken d& +sWeaklyNotTaken e& +sWeaklyNotTaken f& +sWeaklyNotTaken g& +sWeaklyNotTaken h& +sWeaklyNotTaken i& +sWeaklyNotTaken j& +sWeaklyNotTaken k& +sWeaklyNotTaken l& +sWeaklyNotTaken m& +sWeaklyNotTaken n& +sWeaklyNotTaken o& +sWeaklyNotTaken p& +sWeaklyNotTaken q& +sWeaklyNotTaken r& +sWeaklyNotTaken s& +sWeaklyNotTaken t& +sWeaklyNotTaken u& +sWeaklyNotTaken v& +sWeaklyNotTaken w& +sWeaklyNotTaken x& +sWeaklyNotTaken y& +sWeaklyNotTaken z& +sWeaklyNotTaken {& +sWeaklyNotTaken |& +sWeaklyNotTaken }& +sWeaklyNotTaken ~& +sWeaklyNotTaken !' +sWeaklyNotTaken "' +sWeaklyNotTaken #' +sWeaklyNotTaken $' +sWeaklyNotTaken %' +sWeaklyNotTaken &' +sWeaklyNotTaken '' +sWeaklyNotTaken (' +sWeaklyNotTaken )' +sWeaklyNotTaken *' +sWeaklyNotTaken +' +sWeaklyNotTaken ,' +sWeaklyNotTaken -' +sWeaklyNotTaken .' +sWeaklyNotTaken /' +sWeaklyNotTaken 0' +sWeaklyNotTaken 1' +sWeaklyNotTaken 2' +sWeaklyNotTaken 3' +sWeaklyNotTaken 4' +sWeaklyNotTaken 5' +sWeaklyNotTaken 6' +sWeaklyNotTaken 7' +sWeaklyNotTaken 8' +sWeaklyNotTaken 9' +sWeaklyNotTaken :' +sWeaklyNotTaken ;' +sWeaklyNotTaken <' +sWeaklyNotTaken =' +sWeaklyNotTaken >' +sWeaklyNotTaken ?' +sWeaklyNotTaken @' +sWeaklyNotTaken A' +sWeaklyNotTaken B' +sWeaklyNotTaken C' +sWeaklyNotTaken D' +sWeaklyNotTaken E' +sWeaklyNotTaken F' +sWeaklyNotTaken G' +sWeaklyNotTaken H' +sWeaklyNotTaken I' +sWeaklyNotTaken J' +sWeaklyNotTaken K' +sWeaklyNotTaken L' +sWeaklyNotTaken M' +sWeaklyNotTaken N' +$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$ +sStronglyNotTaken i$ +sStronglyNotTaken j$ +sStronglyNotTaken k$ +sStronglyNotTaken l$ +sStronglyNotTaken m$ +sStronglyNotTaken n$ +sStronglyNotTaken o$ +sStronglyNotTaken p$ +sStronglyNotTaken q$ +sStronglyNotTaken r$ +sStronglyNotTaken s$ +sStronglyNotTaken t$ +sStronglyNotTaken u$ +sStronglyNotTaken v$ +sStronglyNotTaken w$ +sStronglyNotTaken x$ +sStronglyNotTaken y$ +sStronglyNotTaken z$ +sStronglyNotTaken {$ +sStronglyNotTaken |$ +sStronglyNotTaken }$ +sStronglyNotTaken ~$ +sStronglyNotTaken !% +sStronglyNotTaken "% +sStronglyNotTaken #% +sStronglyNotTaken $% +sStronglyNotTaken %% +sStronglyNotTaken &% +sStronglyNotTaken '% +sStronglyNotTaken (% +sStronglyNotTaken )% +sStronglyNotTaken *% +sStronglyNotTaken +% +sStronglyNotTaken ,% +sStronglyNotTaken -% +sStronglyNotTaken .% +sStronglyNotTaken /% +sStronglyNotTaken 0% +sStronglyNotTaken 1% +sStronglyNotTaken 2% +sStronglyNotTaken 3% +sStronglyNotTaken 4% +sStronglyNotTaken 5% +sStronglyNotTaken 6% +sStronglyNotTaken 7% +sStronglyNotTaken 8% +sStronglyNotTaken 9% +sStronglyNotTaken :% +sStronglyNotTaken ;% +sStronglyNotTaken <% +sStronglyNotTaken =% +sStronglyNotTaken >% +sStronglyNotTaken ?% +sStronglyNotTaken @% +sStronglyNotTaken A% +sStronglyNotTaken B% +sStronglyNotTaken C% +sStronglyNotTaken D% +sStronglyNotTaken E% +sStronglyNotTaken F% +sStronglyNotTaken G% +sStronglyNotTaken H% +sStronglyNotTaken I% +sStronglyNotTaken J% +sStronglyNotTaken K% +sStronglyNotTaken L% +sStronglyNotTaken M% +sStronglyNotTaken N% +sStronglyNotTaken O% +sStronglyNotTaken P% +sStronglyNotTaken Q% +sStronglyNotTaken R% +sStronglyNotTaken S% +sStronglyNotTaken T% +sStronglyNotTaken U% +sStronglyNotTaken V% +sStronglyNotTaken W% +sStronglyNotTaken X% +sStronglyNotTaken Y% +sStronglyNotTaken Z% +sStronglyNotTaken [% +sStronglyNotTaken \% +sStronglyNotTaken ]% +sStronglyNotTaken ^% +sStronglyNotTaken _% +sStronglyNotTaken `% +sStronglyNotTaken a% +sStronglyNotTaken b% +sStronglyNotTaken c% +sStronglyNotTaken d% +sStronglyNotTaken e% +sStronglyNotTaken f% +sStronglyNotTaken g% +sStronglyNotTaken h% +sStronglyNotTaken i% +sStronglyNotTaken j% +sStronglyNotTaken k% +sStronglyNotTaken l% +sStronglyNotTaken m% +sStronglyNotTaken n% +sStronglyNotTaken o% +sStronglyNotTaken p% +sStronglyNotTaken q% +sStronglyNotTaken r% +sStronglyNotTaken s% +sStronglyNotTaken t% +sStronglyNotTaken u% +sStronglyNotTaken v% +sStronglyNotTaken w% +sStronglyNotTaken x% +sStronglyNotTaken y% +sStronglyNotTaken z% +sStronglyNotTaken {% +sStronglyNotTaken |% +sStronglyNotTaken }% +sStronglyNotTaken ~% +sStronglyNotTaken !& +sStronglyNotTaken "& +sStronglyNotTaken #& +sStronglyNotTaken $& +sStronglyNotTaken %& +sStronglyNotTaken && +sStronglyNotTaken '& +sStronglyNotTaken (& +sStronglyNotTaken )& +sStronglyNotTaken *& +sStronglyNotTaken +& +sStronglyNotTaken ,& +sStronglyNotTaken -& +sStronglyNotTaken .& +sStronglyNotTaken /& +sStronglyNotTaken 0& +sStronglyNotTaken 1& +sStronglyNotTaken 2& +sStronglyNotTaken 3& +sStronglyNotTaken 4& +sStronglyNotTaken 5& +sStronglyNotTaken 6& +sStronglyNotTaken 7& +sStronglyNotTaken 8& +sStronglyNotTaken 9& +sStronglyNotTaken :& +sStronglyNotTaken ;& +sStronglyNotTaken <& +sStronglyNotTaken =& +sStronglyNotTaken >& +sStronglyNotTaken ?& +sStronglyNotTaken @& +sStronglyNotTaken A& +sStronglyNotTaken B& +sStronglyNotTaken C& +sStronglyNotTaken D& +sStronglyNotTaken E& +sStronglyNotTaken F& +sStronglyNotTaken G& +sStronglyNotTaken H& +sStronglyNotTaken I& +sStronglyNotTaken J& +sStronglyNotTaken K& +sStronglyNotTaken L& +sStronglyNotTaken M& +sStronglyNotTaken N& +sStronglyNotTaken O& +sStronglyNotTaken P& +sStronglyNotTaken Q& +sStronglyNotTaken R& +sStronglyNotTaken S& +sStronglyNotTaken T& +sStronglyNotTaken U& +sStronglyNotTaken V& +sStronglyNotTaken W& +sStronglyNotTaken X& +sStronglyNotTaken Y& +sStronglyNotTaken Z& +sStronglyNotTaken [& +sStronglyNotTaken \& +sStronglyNotTaken ]& +sStronglyNotTaken ^& +sStronglyNotTaken _& +sStronglyNotTaken `& +sStronglyNotTaken a& +sStronglyNotTaken b& +sStronglyNotTaken c& +sStronglyNotTaken d& +sStronglyNotTaken e& +sStronglyNotTaken f& +sStronglyNotTaken g& +sStronglyNotTaken h& +sStronglyNotTaken i& +sStronglyNotTaken j& +sStronglyNotTaken k& +sStronglyNotTaken l& +sStronglyNotTaken m& +sStronglyNotTaken n& +sStronglyNotTaken o& +sStronglyNotTaken p& +sStronglyNotTaken q& +sStronglyNotTaken r& +sStronglyNotTaken s& +sStronglyNotTaken t& +sStronglyNotTaken u& +sStronglyNotTaken v& +sStronglyNotTaken w& +sStronglyNotTaken x& +sStronglyNotTaken y& +sStronglyNotTaken z& +sStronglyNotTaken {& +sStronglyNotTaken |& +sStronglyNotTaken }& +sStronglyNotTaken ~& +sStronglyNotTaken !' +sStronglyNotTaken "' +sStronglyNotTaken #' +sStronglyNotTaken $' +sStronglyNotTaken %' +sStronglyNotTaken &' +sStronglyNotTaken '' +sStronglyNotTaken (' +sStronglyNotTaken )' +sStronglyNotTaken *' +sStronglyNotTaken +' +sStronglyNotTaken ,' +sStronglyNotTaken -' +sStronglyNotTaken .' +sStronglyNotTaken /' +sStronglyNotTaken 0' +sStronglyNotTaken 1' +sStronglyNotTaken 2' +sStronglyNotTaken 3' +sStronglyNotTaken 4' +sStronglyNotTaken 5' +sStronglyNotTaken 6' +sStronglyNotTaken 7' +sStronglyNotTaken 8' +sStronglyNotTaken 9' +sStronglyNotTaken :' +sStronglyNotTaken ;' +sStronglyNotTaken <' +sStronglyNotTaken =' +sStronglyNotTaken >' +sStronglyNotTaken ?' +sStronglyNotTaken @' +sStronglyNotTaken A' +sStronglyNotTaken B' +sStronglyNotTaken C' +sStronglyNotTaken D' +sStronglyNotTaken E' +sStronglyNotTaken F' +sStronglyNotTaken G' +sStronglyNotTaken H' +sStronglyNotTaken I' +sStronglyNotTaken J' +sStronglyNotTaken K' +sStronglyNotTaken L' +sStronglyNotTaken M' +sStronglyNotTaken N' +#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 i$ +#1000000 +0! +0" +#1500000 +1! +#2000000 +0! +#2500000 +1! +sHdlNone\x20(0) P +0~ +sWeaklyNotTaken j$ +#3000000 +0! +#3500000 +1! +sHdlNone\x20(0) S +0!" +sWeaklyNotTaken k$ +#4000000 +0! +#4500000 +1! +sHdlNone\x20(0) V +0"" +sWeaklyNotTaken l$ +#5000000 +0! +#5500000 +1! +sHdlNone\x20(0) Y +0#" +sWeaklyNotTaken m$ +#6000000 +0! +#6500000 +1! +sHdlNone\x20(0) \ +0$" +sWeaklyNotTaken n$ +#7000000 +0! +#7500000 +1! +sHdlNone\x20(0) _ +0%" +sWeaklyNotTaken o$ +#8000000 +0! +#8500000 +1! +sHdlNone\x20(0) b +0&" +sWeaklyNotTaken p$ +#9000000 +0! +#9500000 +1! +sHdlNone\x20(0) e +0'" +sWeaklyNotTaken q$ +#10000000 +0! +#10500000 +1! +sHdlNone\x20(0) h +0(" +sWeaklyNotTaken r$ +#11000000 +0! +#11500000 +1! +sHdlNone\x20(0) k +0)" +sWeaklyNotTaken s$ +#12000000 +0! +#12500000 +1! +sHdlNone\x20(0) n +0*" +sWeaklyNotTaken t$ +#13000000 +0! +#13500000 +1! +sHdlNone\x20(0) q +0+" +sWeaklyNotTaken u$ +#14000000 +0! +#14500000 +1! +sHdlNone\x20(0) t +0," +sWeaklyNotTaken v$ +#15000000 +0! +#15500000 +1! +sHdlNone\x20(0) w +0-" +sWeaklyNotTaken w$ +#16000000 +0! +#16500000 +1! +sHdlNone\x20(0) z +0." +sWeaklyNotTaken x$ +#17000000 +0! +#17500000 +1! +0/" +sWeaklyNotTaken y$ +#18000000 +0! +#18500000 +1! +00" +sWeaklyNotTaken z$ +#19000000 +0! +#19500000 +1! +01" +sWeaklyNotTaken {$ +#20000000 +0! +#20500000 +1! +02" +sWeaklyNotTaken |$ +#21000000 +0! +#21500000 +1! +03" +sWeaklyNotTaken }$ +#22000000 +0! +#22500000 +1! +04" +sWeaklyNotTaken ~$ +#23000000 +0! +#23500000 +1! +05" +sWeaklyNotTaken !% +#24000000 +0! +#24500000 +1! +06" +sWeaklyNotTaken "% +#25000000 +0! +#25500000 +1! +07" +sWeaklyNotTaken #% +#26000000 +0! +#26500000 +1! +08" +sWeaklyNotTaken $% +#27000000 +0! +#27500000 +1! +09" +sWeaklyNotTaken %% +#28000000 +0! +#28500000 +1! +0:" +sWeaklyNotTaken &% +#29000000 +0! +#29500000 +1! +0;" +sWeaklyNotTaken '% +#30000000 +0! +#30500000 +1! +0<" +sWeaklyNotTaken (% +#31000000 +0! +#31500000 +1! +0=" +sWeaklyNotTaken )% +#32000000 +0! +#32500000 +1! +0>" +sWeaklyNotTaken *% +#33000000 +0! +#33500000 +1! +0?" +sWeaklyNotTaken +% +#34000000 +0! +#34500000 +1! +0@" +sWeaklyNotTaken ,% +#35000000 +0! +#35500000 +1! +0A" +sWeaklyNotTaken -% +#36000000 +0! +#36500000 +1! +0B" +sWeaklyNotTaken .% +#37000000 +0! +#37500000 +1! +0C" +sWeaklyNotTaken /% +#38000000 +0! +#38500000 +1! +0D" +sWeaklyNotTaken 0% +#39000000 +0! +#39500000 +1! +0E" +sWeaklyNotTaken 1% +#40000000 +0! +#40500000 +1! +0F" +sWeaklyNotTaken 2% +#41000000 +0! +#41500000 +1! +0G" +sWeaklyNotTaken 3% +#42000000 +0! +#42500000 +1! +0H" +sWeaklyNotTaken 4% +#43000000 +0! +#43500000 +1! +0I" +sWeaklyNotTaken 5% +#44000000 +0! +#44500000 +1! +0J" +sWeaklyNotTaken 6% +#45000000 +0! +#45500000 +1! +0K" +sWeaklyNotTaken 7% +#46000000 +0! +#46500000 +1! +0L" +sWeaklyNotTaken 8% +#47000000 +0! +#47500000 +1! +0M" +sWeaklyNotTaken 9% +#48000000 +0! +#48500000 +1! +0N" +sWeaklyNotTaken :% +#49000000 +0! +#49500000 +1! +0O" +sWeaklyNotTaken ;% +#50000000 +0! +#50500000 +1! +0P" +sWeaklyNotTaken <% +#51000000 +0! +#51500000 +1! +0Q" +sWeaklyNotTaken =% +#52000000 +0! +#52500000 +1! +0R" +sWeaklyNotTaken >% +#53000000 +0! +#53500000 +1! +0S" +sWeaklyNotTaken ?% +#54000000 +0! +#54500000 +1! +0T" +sWeaklyNotTaken @% +#55000000 +0! +#55500000 +1! +0U" +sWeaklyNotTaken A% +#56000000 +0! +#56500000 +1! +0V" +sWeaklyNotTaken B% +#57000000 +0! +#57500000 +1! +0W" +sWeaklyNotTaken C% +#58000000 +0! +#58500000 +1! +0X" +sWeaklyNotTaken D% +#59000000 +0! +#59500000 +1! +0Y" +sWeaklyNotTaken E% +#60000000 +0! +#60500000 +1! +0Z" +sWeaklyNotTaken F% +#61000000 +0! +#61500000 +1! +0[" +sWeaklyNotTaken G% +#62000000 +0! +#62500000 +1! +0\" +sWeaklyNotTaken H% +#63000000 +0! +#63500000 +1! +0]" +sWeaklyNotTaken I% +#64000000 +0! +#64500000 +1! +0^" +sWeaklyNotTaken J% +#65000000 +0! +#65500000 +1! +0_" +sWeaklyNotTaken K% +#66000000 +0! +#66500000 +1! +0`" +sWeaklyNotTaken L% +#67000000 +0! +#67500000 +1! +0a" +sWeaklyNotTaken M% +#68000000 +0! +#68500000 +1! +0b" +sWeaklyNotTaken N% +#69000000 +0! +#69500000 +1! +0c" +sWeaklyNotTaken O% +#70000000 +0! +#70500000 +1! +0d" +sWeaklyNotTaken P% +#71000000 +0! +#71500000 +1! +0e" +sWeaklyNotTaken Q% +#72000000 +0! +#72500000 +1! +0f" +sWeaklyNotTaken R% +#73000000 +0! +#73500000 +1! +0g" +sWeaklyNotTaken S% +#74000000 +0! +#74500000 +1! +0h" +sWeaklyNotTaken T% +#75000000 +0! +#75500000 +1! +0i" +sWeaklyNotTaken U% +#76000000 +0! +#76500000 +1! +0j" +sWeaklyNotTaken V% +#77000000 +0! +#77500000 +1! +0k" +sWeaklyNotTaken W% +#78000000 +0! +#78500000 +1! +0l" +sWeaklyNotTaken X% +#79000000 +0! +#79500000 +1! +0m" +sWeaklyNotTaken Y% +#80000000 +0! +#80500000 +1! +0n" +sWeaklyNotTaken Z% +#81000000 +0! +#81500000 +1! +0o" +sWeaklyNotTaken [% +#82000000 +0! +#82500000 +1! +0p" +sWeaklyNotTaken \% +#83000000 +0! +#83500000 +1! +0q" +sWeaklyNotTaken ]% +#84000000 +0! +#84500000 +1! +0r" +sWeaklyNotTaken ^% +#85000000 +0! +#85500000 +1! +0s" +sWeaklyNotTaken _% +#86000000 +0! +#86500000 +1! +0t" +sWeaklyNotTaken `% +#87000000 +0! +#87500000 +1! +0u" +sWeaklyNotTaken a% +#88000000 +0! +#88500000 +1! +0v" +sWeaklyNotTaken b% +#89000000 +0! +#89500000 +1! +0w" +sWeaklyNotTaken c% +#90000000 +0! +#90500000 +1! +0x" +sWeaklyNotTaken d% +#91000000 +0! +#91500000 +1! +0y" +sWeaklyNotTaken e% +#92000000 +0! +#92500000 +1! +0z" +sWeaklyNotTaken f% +#93000000 +0! +#93500000 +1! +0{" +sWeaklyNotTaken g% +#94000000 +0! +#94500000 +1! +0|" +sWeaklyNotTaken h% +#95000000 +0! +#95500000 +1! +0}" +sWeaklyNotTaken i% +#96000000 +0! +#96500000 +1! +0~" +sWeaklyNotTaken j% +#97000000 +0! +#97500000 +1! +0!# +sWeaklyNotTaken k% +#98000000 +0! +#98500000 +1! +0"# +sWeaklyNotTaken l% +#99000000 +0! +#99500000 +1! +0## +sWeaklyNotTaken m% +#100000000 +0! +#100500000 +1! +0$# +sWeaklyNotTaken n% +#101000000 +0! +#101500000 +1! +0%# +sWeaklyNotTaken o% +#102000000 +0! +#102500000 +1! +0&# +sWeaklyNotTaken p% +#103000000 +0! +#103500000 +1! +0'# +sWeaklyNotTaken q% +#104000000 +0! +#104500000 +1! +0(# +sWeaklyNotTaken r% +#105000000 +0! +#105500000 +1! +0)# +sWeaklyNotTaken s% +#106000000 +0! +#106500000 +1! +0*# +sWeaklyNotTaken t% +#107000000 +0! +#107500000 +1! +0+# +sWeaklyNotTaken u% +#108000000 +0! +#108500000 +1! +0,# +sWeaklyNotTaken v% +#109000000 +0! +#109500000 +1! +0-# +sWeaklyNotTaken w% +#110000000 +0! +#110500000 +1! +0.# +sWeaklyNotTaken x% +#111000000 +0! +#111500000 +1! +0/# +sWeaklyNotTaken y% +#112000000 +0! +#112500000 +1! +00# +sWeaklyNotTaken z% +#113000000 +0! +#113500000 +1! +01# +sWeaklyNotTaken {% +#114000000 +0! +#114500000 +1! +02# +sWeaklyNotTaken |% +#115000000 +0! +#115500000 +1! +03# +sWeaklyNotTaken }% +#116000000 +0! +#116500000 +1! +04# +sWeaklyNotTaken ~% +#117000000 +0! +#117500000 +1! +05# +sWeaklyNotTaken !& +#118000000 +0! +#118500000 +1! +06# +sWeaklyNotTaken "& +#119000000 +0! +#119500000 +1! +07# +sWeaklyNotTaken #& +#120000000 +0! +#120500000 +1! +08# +sWeaklyNotTaken $& +#121000000 +0! +#121500000 +1! +09# +sWeaklyNotTaken %& +#122000000 +0! +#122500000 +1! +0:# +sWeaklyNotTaken && +#123000000 +0! +#123500000 +1! +0;# +sWeaklyNotTaken '& +#124000000 +0! +#124500000 +1! +0<# +sWeaklyNotTaken (& +#125000000 +0! +#125500000 +1! +0=# +sWeaklyNotTaken )& +#126000000 +0! +#126500000 +1! +0># +sWeaklyNotTaken *& +#127000000 +0! +#127500000 +1! +0?# +sWeaklyNotTaken +& +#128000000 +0! +#128500000 +1! +0@# +sWeaklyNotTaken ,& +#129000000 +0! +#129500000 +1! +0A# +sWeaklyNotTaken -& +#130000000 +0! +#130500000 +1! +0B# +sWeaklyNotTaken .& +#131000000 +0! +#131500000 +1! +0C# +sWeaklyNotTaken /& +#132000000 +0! +#132500000 +1! +0D# +sWeaklyNotTaken 0& +#133000000 +0! +#133500000 +1! +0E# +sWeaklyNotTaken 1& +#134000000 +0! +#134500000 +1! +0F# +sWeaklyNotTaken 2& +#135000000 +0! +#135500000 +1! +0G# +sWeaklyNotTaken 3& +#136000000 +0! +#136500000 +1! +0H# +sWeaklyNotTaken 4& +#137000000 +0! +#137500000 +1! +0I# +sWeaklyNotTaken 5& +#138000000 +0! +#138500000 +1! +0J# +sWeaklyNotTaken 6& +#139000000 +0! +#139500000 +1! +0K# +sWeaklyNotTaken 7& +#140000000 +0! +#140500000 +1! +0L# +sWeaklyNotTaken 8& +#141000000 +0! +#141500000 +1! +0M# +sWeaklyNotTaken 9& +#142000000 +0! +#142500000 +1! +0N# +sWeaklyNotTaken :& +#143000000 +0! +#143500000 +1! +0O# +sWeaklyNotTaken ;& +#144000000 +0! +#144500000 +1! +0P# +sWeaklyNotTaken <& +#145000000 +0! +#145500000 +1! +0Q# +sWeaklyNotTaken =& +#146000000 +0! +#146500000 +1! +0R# +sWeaklyNotTaken >& +#147000000 +0! +#147500000 +1! +0S# +sWeaklyNotTaken ?& +#148000000 +0! +#148500000 +1! +0T# +sWeaklyNotTaken @& +#149000000 +0! +#149500000 +1! +0U# +sWeaklyNotTaken A& +#150000000 +0! +#150500000 +1! +0V# +sWeaklyNotTaken B& +#151000000 +0! +#151500000 +1! +0W# +sWeaklyNotTaken C& +#152000000 +0! +#152500000 +1! +0X# +sWeaklyNotTaken D& +#153000000 +0! +#153500000 +1! +0Y# +sWeaklyNotTaken E& +#154000000 +0! +#154500000 +1! +0Z# +sWeaklyNotTaken F& +#155000000 +0! +#155500000 +1! +0[# +sWeaklyNotTaken G& +#156000000 +0! +#156500000 +1! +0\# +sWeaklyNotTaken H& +#157000000 +0! +#157500000 +1! +0]# +sWeaklyNotTaken I& +#158000000 +0! +#158500000 +1! +0^# +sWeaklyNotTaken J& +#159000000 +0! +#159500000 +1! +0_# +sWeaklyNotTaken K& +#160000000 +0! +#160500000 +1! +0`# +sWeaklyNotTaken L& +#161000000 +0! +#161500000 +1! +0a# +sWeaklyNotTaken M& +#162000000 +0! +#162500000 +1! +0b# +sWeaklyNotTaken N& +#163000000 +0! +#163500000 +1! +0c# +sWeaklyNotTaken O& +#164000000 +0! +#164500000 +1! +0d# +sWeaklyNotTaken P& +#165000000 +0! +#165500000 +1! +0e# +sWeaklyNotTaken Q& +#166000000 +0! +#166500000 +1! +0f# +sWeaklyNotTaken R& +#167000000 +0! +#167500000 +1! +0g# +sWeaklyNotTaken S& +#168000000 +0! +#168500000 +1! +0h# +sWeaklyNotTaken T& +#169000000 +0! +#169500000 +1! +0i# +sWeaklyNotTaken U& +#170000000 +0! +#170500000 +1! +0j# +sWeaklyNotTaken V& +#171000000 +0! +#171500000 +1! +0k# +sWeaklyNotTaken W& +#172000000 +0! +#172500000 +1! +0l# +sWeaklyNotTaken X& +#173000000 +0! +#173500000 +1! +0m# +sWeaklyNotTaken Y& +#174000000 +0! +#174500000 +1! +0n# +sWeaklyNotTaken Z& +#175000000 +0! +#175500000 +1! +0o# +sWeaklyNotTaken [& +#176000000 +0! +#176500000 +1! +0p# +sWeaklyNotTaken \& +#177000000 +0! +#177500000 +1! +0q# +sWeaklyNotTaken ]& +#178000000 +0! +#178500000 +1! +0r# +sWeaklyNotTaken ^& +#179000000 +0! +#179500000 +1! +0s# +sWeaklyNotTaken _& +#180000000 +0! +#180500000 +1! +0t# +sWeaklyNotTaken `& +#181000000 +0! +#181500000 +1! +0u# +sWeaklyNotTaken a& +#182000000 +0! +#182500000 +1! +0v# +sWeaklyNotTaken b& +#183000000 +0! +#183500000 +1! +0w# +sWeaklyNotTaken c& +#184000000 +0! +#184500000 +1! +0x# +sWeaklyNotTaken d& +#185000000 +0! +#185500000 +1! +0y# +sWeaklyNotTaken e& +#186000000 +0! +#186500000 +1! +0z# +sWeaklyNotTaken f& +#187000000 +0! +#187500000 +1! +0{# +sWeaklyNotTaken g& +#188000000 +0! +#188500000 +1! +0|# +sWeaklyNotTaken h& +#189000000 +0! +#189500000 +1! +0}# +sWeaklyNotTaken i& +#190000000 +0! +#190500000 +1! +0~# +sWeaklyNotTaken j& +#191000000 +0! +#191500000 +1! +0!$ +sWeaklyNotTaken k& +#192000000 +0! +#192500000 +1! +0"$ +sWeaklyNotTaken l& +#193000000 +0! +#193500000 +1! +0#$ +sWeaklyNotTaken m& +#194000000 +0! +#194500000 +1! +0$$ +sWeaklyNotTaken n& +#195000000 +0! +#195500000 +1! +0%$ +sWeaklyNotTaken o& +#196000000 +0! +#196500000 +1! +0&$ +sWeaklyNotTaken p& +#197000000 +0! +#197500000 +1! +0'$ +sWeaklyNotTaken q& +#198000000 +0! +#198500000 +1! +0($ +sWeaklyNotTaken r& +#199000000 +0! +#199500000 +1! +0)$ +sWeaklyNotTaken s& +#200000000 +0! +#200500000 +1! +0*$ +sWeaklyNotTaken t& +#201000000 +0! +#201500000 +1! +0+$ +sWeaklyNotTaken u& +#202000000 +0! +#202500000 +1! +0,$ +sWeaklyNotTaken v& +#203000000 +0! +#203500000 +1! +0-$ +sWeaklyNotTaken w& +#204000000 +0! +#204500000 +1! +0.$ +sWeaklyNotTaken x& +#205000000 +0! +#205500000 +1! +0/$ +sWeaklyNotTaken y& +#206000000 +0! +#206500000 +1! +00$ +sWeaklyNotTaken z& +#207000000 +0! +#207500000 +1! +01$ +sWeaklyNotTaken {& +#208000000 +0! +#208500000 +1! +02$ +sWeaklyNotTaken |& +#209000000 +0! +#209500000 +1! +03$ +sWeaklyNotTaken }& +#210000000 +0! +#210500000 +1! +04$ +sWeaklyNotTaken ~& +#211000000 +0! +#211500000 +1! +05$ +sWeaklyNotTaken !' +#212000000 +0! +#212500000 +1! +06$ +sWeaklyNotTaken "' +#213000000 +0! +#213500000 +1! +07$ +sWeaklyNotTaken #' +#214000000 +0! +#214500000 +1! +08$ +sWeaklyNotTaken $' +#215000000 +0! +#215500000 +1! +09$ +sWeaklyNotTaken %' +#216000000 +0! +#216500000 +1! +0:$ +sWeaklyNotTaken &' +#217000000 +0! +#217500000 +1! +0;$ +sWeaklyNotTaken '' +#218000000 +0! +#218500000 +1! +0<$ +sWeaklyNotTaken (' +#219000000 +0! +#219500000 +1! +0=$ +sWeaklyNotTaken )' +#220000000 +0! +#220500000 +1! +0>$ +sWeaklyNotTaken *' +#221000000 +0! +#221500000 +1! +0?$ +sWeaklyNotTaken +' +#222000000 +0! +#222500000 +1! +0@$ +sWeaklyNotTaken ,' +#223000000 +0! +#223500000 +1! +0A$ +sWeaklyNotTaken -' +#224000000 +0! +#224500000 +1! +0B$ +sWeaklyNotTaken .' +#225000000 +0! +#225500000 +1! +0C$ +sWeaklyNotTaken /' +#226000000 +0! +#226500000 +1! +0D$ +sWeaklyNotTaken 0' +#227000000 +0! +#227500000 +1! +0E$ +sWeaklyNotTaken 1' +#228000000 +0! +#228500000 +1! +0F$ +sWeaklyNotTaken 2' +#229000000 +0! +#229500000 +1! +0G$ +sWeaklyNotTaken 3' +#230000000 +0! +#230500000 +1! +0H$ +sWeaklyNotTaken 4' +#231000000 +0! +#231500000 +1! +0I$ +sWeaklyNotTaken 5' +#232000000 +0! +#232500000 +1! +0J$ +sWeaklyNotTaken 6' +#233000000 +0! +#233500000 +1! +0K$ +sWeaklyNotTaken 7' +#234000000 +0! +#234500000 +1! +0L$ +sWeaklyNotTaken 8' +#235000000 +0! +#235500000 +1! +0M$ +sWeaklyNotTaken 9' +#236000000 +0! +#236500000 +1! +0N$ +sWeaklyNotTaken :' +#237000000 +0! +#237500000 +1! +0O$ +sWeaklyNotTaken ;' +#238000000 +0! +#238500000 +1! +0P$ +sWeaklyNotTaken <' +#239000000 +0! +#239500000 +1! +0Q$ +sWeaklyNotTaken =' +#240000000 +0! +#240500000 +1! +0R$ +sWeaklyNotTaken >' +#241000000 +0! +#241500000 +1! +0S$ +sWeaklyNotTaken ?' +#242000000 +0! +#242500000 +1! +0T$ +sWeaklyNotTaken @' +#243000000 +0! +#243500000 +1! +0U$ +sWeaklyNotTaken A' +#244000000 +0! +#244500000 +1! +0V$ +sWeaklyNotTaken B' +#245000000 +0! +#245500000 +1! +0W$ +sWeaklyNotTaken C' +#246000000 +0! +#246500000 +1! +0X$ +sWeaklyNotTaken D' +#247000000 +0! +#247500000 +1! +0Y$ +sWeaklyNotTaken E' +#248000000 +0! +#248500000 +1! +0Z$ +sWeaklyNotTaken F' +#249000000 +0! +#249500000 +1! +0[$ +sWeaklyNotTaken G' +#250000000 +0! +#250500000 +1! +0\$ +sWeaklyNotTaken H' +#251000000 +0! +#251500000 +1! +0]$ +sWeaklyNotTaken I' +#252000000 +0! +#252500000 +1! +0^$ +sWeaklyNotTaken J' +#253000000 +0! +#253500000 +1! +0_$ +sWeaklyNotTaken K' +#254000000 +0! +#254500000 +1! +0`$ +sWeaklyNotTaken L' +#255000000 +0! +#255500000 +1! +0a$ +sWeaklyNotTaken M' +#256000000 +0! +#256500000 +1! +0b$ +sWeaklyNotTaken N' +#257000000 +0! +#257500000 +1! +#258000000 +0! +#258500000 +1! +#259000000 +0! +#259500000 +1! +#260000000 +0! +#260500000 +1! +#261000000 +0! +#261500000 +1! +#262000000 +0! +#262500000 +1! +#263000000 +0! +#263500000 +1! +#264000000 +0! +#264500000 +1! +#265000000 +0! +#265500000 +1! +#266000000 +0! +#266500000 +1! +#267000000 +0! +#267500000 +1! +#268000000 +0! +#268500000 +1! +#269000000 +0! +#269500000 +1! +#270000000 +0! +#270500000 +1! +#271000000 +0! +#271500000 +1! +#272000000 +0! +#272500000 +1! +#273000000 +0! +#273500000 +1! +#274000000 +0! +#274500000 +1! +#275000000 +0! +#275500000 +1! +#276000000 +0! +#276500000 +1! +#277000000 +0! +#277500000 +1! +#278000000 +0! +#278500000 +1! +#279000000 +0! +#279500000 +1! +#280000000 +0! +#280500000 +1! +#281000000 +0! +#281500000 +1! +#282000000 +0! +#282500000 +1! +#283000000 +0! +#283500000 +1! +#284000000 +0! +#284500000 +1! +#285000000 +0! +#285500000 +1! +#286000000 +0! +#286500000 +1! +#287000000 +0! +#287500000 +1! +#288000000 +0! +#288500000 +1! +#289000000 +0! +#289500000 +1! +#290000000 +0! +#290500000 +1! +#291000000 +0! +#291500000 +1! +#292000000 +0! +#292500000 +1! +#293000000 +0! +#293500000 +1! +#294000000 +0! +#294500000 +1! +#295000000 +0! +#295500000 +1! +#296000000 +0! +#296500000 +1! +#297000000 +0! +#297500000 +1! +#298000000 +0! +#298500000 +1! +#299000000 +0! +#299500000 +1! +#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!(); + } +}