diff --git a/.forgejo/workflows/deps.yml b/.forgejo/workflows/deps.yml new file mode 100644 index 0000000..b29723c --- /dev/null +++ b/.forgejo/workflows/deps.yml @@ -0,0 +1,77 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later +# See Notices.txt for copyright information +on: + workflow_call: + outputs: + cache-primary-key: + value: ${{ jobs.deps.outputs.cache-primary-key }} + +jobs: + deps: + runs-on: debian-12 + outputs: + cache-primary-key: ${{ steps.restore-deps.outputs.cache-primary-key }} + steps: + - uses: https://git.libre-chip.org/mirrors/checkout@v3 + with: + fetch-depth: 0 + - uses: https://git.libre-chip.org/mirrors/cache/restore@v3 + id: restore-deps + with: + path: deps + key: ${{ github.repository }}-deps-${{ runner.os }}-${{ hashFiles('.forgejo/workflows/deps.yml') }} + lookup-only: true + - name: Install Apt packages + if: steps.restore-deps.outputs.cache-hit != 'true' + run: | + apt-get update -qq + apt-get install -qq \ + bison \ + build-essential \ + ccache \ + clang \ + cvc5 \ + flex \ + gawk \ + g++ \ + git \ + libboost-filesystem-dev \ + libboost-python-dev \ + libboost-system-dev \ + libffi-dev \ + libreadline-dev \ + lld \ + pkg-config \ + python3 \ + python3-click \ + tcl-dev \ + zlib1g-dev + - name: Install Firtool + if: steps.restore-deps.outputs.cache-hit != 'true' + run: | + mkdir -p deps + wget -O deps/firrtl.tar.gz https://github.com/llvm/circt/releases/download/firtool-1.86.0/firrtl-bin-linux-x64.tar.gz + sha256sum -c - <<<'bf6f4ab18ae76f135c944efbd81e25391c31c1bd0617c58ab0592640abefee14 deps/firrtl.tar.gz' + tar -C deps -xvaf deps/firrtl.tar.gz + rm -rf deps/firtool + mv deps/firtool-1.86.0 deps/firtool + - name: Get SymbiYosys + if: steps.restore-deps.outputs.cache-hit != 'true' + run: | + git clone --depth=1 --branch=yosys-0.45 https://git.libre-chip.org/mirrors/sby deps/sby + - name: Build Z3 + if: steps.restore-deps.outputs.cache-hit != 'true' + run: | + git clone --depth=1 --recursive --branch=z3-4.13.3 https://git.libre-chip.org/mirrors/z3 deps/z3 + (cd deps/z3; PYTHON=python3 ./configure --prefix=/usr/local) + make -C deps/z3/build -j"$(nproc)" + - name: Build Yosys + if: steps.restore-deps.outputs.cache-hit != 'true' + run: | + git clone --depth=1 --recursive --branch=0.45 https://git.libre-chip.org/mirrors/yosys deps/yosys + make -C deps/yosys -j"$(nproc)" + - uses: https://git.libre-chip.org/mirrors/cache/save@v3 + if: steps.restore-deps.outputs.cache-hit != 'true' + with: + path: deps + key: ${{ steps.restore-deps.outputs.cache-primary-key }} diff --git a/.forgejo/workflows/test.yml b/.forgejo/workflows/test.yml index 88dda29..775a503 100644 --- a/.forgejo/workflows/test.yml +++ b/.forgejo/workflows/test.yml @@ -3,16 +3,56 @@ on: [push, pull_request] jobs: + deps: + runs-on: debian-12 + uses: ./.forgejo/workflows/deps.yml test: runs-on: debian-12 - container: - image: git.libre-chip.org/libre-chip/fayalite-deps:latest + needs: deps steps: - - uses: actions/checkout@v3 + - uses: https://git.libre-chip.org/mirrors/checkout@v3 with: fetch-depth: 0 - run: | scripts/check-copyright.sh + - run: | + apt-get update -qq + apt-get install -qq \ + bison \ + build-essential \ + ccache \ + clang \ + cvc5 \ + flex \ + gawk \ + git \ + libboost-filesystem-dev \ + libboost-python-dev \ + libboost-system-dev \ + libffi-dev \ + libreadline-dev \ + lld \ + pkg-config \ + python3 \ + python3-click \ + tcl-dev \ + z3 \ + zlib1g-dev + - run: | + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain 1.89.0 + source "$HOME/.cargo/env" + echo "$PATH" >> "$GITHUB_PATH" + - uses: https://git.libre-chip.org/mirrors/cache/restore@v3 + with: + path: deps + key: ${{ needs.deps.outputs.cache-primary-key }} + fail-on-cache-miss: true + - run: | + make -C deps/z3/build install + make -C deps/sby install + make -C deps/yosys install + export PATH="$(realpath deps/firtool/bin):$PATH" + echo "$PATH" >> "$GITHUB_PATH" - uses: https://git.libre-chip.org/mirrors/rust-cache@v2 with: save-if: ${{ github.ref == 'refs/heads/master' }} diff --git a/Cargo.lock b/Cargo.lock index 0444993..2e1df0c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,18 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 4 +version = 3 + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] [[package]] name = "allocator-api2" @@ -81,12 +93,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - [[package]] name = "bitflags" version = "2.6.0" @@ -166,15 +172,6 @@ dependencies = [ "strsim", ] -[[package]] -name = "clap_complete" -version = "4.5.59" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2348487adcd4631696ced64ccdb40d38ac4d31cae7f2eec8817fcea1b9d1c43c" -dependencies = [ - "clap", -] - [[package]] name = "clap_derive" version = "4.5.18" @@ -210,7 +207,6 @@ name = "cpu" version = "0.1.0" dependencies = [ "fayalite", - "serde", ] [[package]] @@ -304,22 +300,20 @@ checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "fayalite" version = "0.3.0" -source = "git+https://git.libre-chip.org/libre-chip/fayalite.git?branch=master#45fea70c1841aedbb32377d88c0280c7a83e6208" +source = "git+https://git.libre-chip.org/libre-chip/fayalite.git?branch=master#bd75fdfefd642f6dd2210cfb003fa63f9dce114e" dependencies = [ - "base64", "bitvec", "blake3", "clap", - "clap_complete", "ctor", "eyre", "fayalite-proc-macros", "fayalite-visit-gen", - "hashbrown 0.15.5", + "hashbrown", "jobslot", "num-bigint", "num-traits", - "ordered-float", + "os_pipe", "petgraph", "serde", "serde_json", @@ -331,7 +325,7 @@ dependencies = [ [[package]] name = "fayalite-proc-macros" version = "0.3.0" -source = "git+https://git.libre-chip.org/libre-chip/fayalite.git?branch=master#45fea70c1841aedbb32377d88c0280c7a83e6208" +source = "git+https://git.libre-chip.org/libre-chip/fayalite.git?branch=master#bd75fdfefd642f6dd2210cfb003fa63f9dce114e" dependencies = [ "fayalite-proc-macros-impl", ] @@ -339,7 +333,7 @@ dependencies = [ [[package]] name = "fayalite-proc-macros-impl" version = "0.3.0" -source = "git+https://git.libre-chip.org/libre-chip/fayalite.git?branch=master#45fea70c1841aedbb32377d88c0280c7a83e6208" +source = "git+https://git.libre-chip.org/libre-chip/fayalite.git?branch=master#bd75fdfefd642f6dd2210cfb003fa63f9dce114e" dependencies = [ "base16ct", "num-bigint", @@ -354,7 +348,7 @@ dependencies = [ [[package]] name = "fayalite-visit-gen" version = "0.3.0" -source = "git+https://git.libre-chip.org/libre-chip/fayalite.git?branch=master#45fea70c1841aedbb32377d88c0280c7a83e6208" +source = "git+https://git.libre-chip.org/libre-chip/fayalite.git?branch=master#bd75fdfefd642f6dd2210cfb003fa63f9dce114e" dependencies = [ "indexmap", "prettyplease", @@ -372,12 +366,6 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - [[package]] name = "funty" version = "2.0.0" @@ -396,14 +384,13 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.4" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "r-efi", - "wasip2", + "wasi", ] [[package]] @@ -411,16 +398,9 @@ name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ + "ahash", "allocator-api2", - "equivalent", - "foldhash", ] [[package]] @@ -451,7 +431,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown", "serde", ] @@ -469,16 +449,16 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobslot" -version = "0.2.23" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58715c67c327da7f1558708348d68c207fd54900c4ae0529e29305d04d795b8c" +checksum = "fe10868679d7a24c2c67d862d0e64a342ce9aef7cdde9ce8019bd35d353d458d" dependencies = [ "cfg-if", "derive_destructure2", "getrandom", "libc", "scopeguard", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -534,26 +514,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] -name = "ordered-float" -version = "5.1.0" +name = "os_pipe" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d" +checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" dependencies = [ - "num-traits", - "rand", - "serde", + "libc", + "windows-sys 0.59.0", ] [[package]] name = "petgraph" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +version = "0.6.5" +source = "git+https://github.com/programmerjake/petgraph.git?rev=258ea8071209a924b73fe96f9f87a3b7b45cbc9f#258ea8071209a924b73fe96f9f87a3b7b45cbc9f" dependencies = [ "fixedbitset", - "hashbrown 0.15.5", "indexmap", - "serde", ] [[package]] @@ -584,37 +560,12 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - [[package]] name = "radium" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "rand_core", - "serde", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "serde", -] - [[package]] name = "rustix" version = "0.38.37" @@ -777,13 +728,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] -name = "wasip2" -version = "1.0.1+wasi-0.2.4" +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" -dependencies = [ - "wit-bindgen", -] +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "which" @@ -797,12 +745,6 @@ dependencies = [ "winsafe", ] -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - [[package]] name = "windows-sys" version = "0.52.0" @@ -821,15 +763,6 @@ dependencies = [ "windows-targets", ] -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-targets" version = "0.52.6" @@ -900,12 +833,6 @@ version = "0.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" -[[package]] -name = "wit-bindgen" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" - [[package]] name = "wyz" version = "0.5.1" @@ -914,3 +841,23 @@ checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" dependencies = [ "tap", ] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml index a3e74f0..57ca631 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,6 @@ rust-version = "1.89.0" [workspace.dependencies] fayalite = { git = "https://git.libre-chip.org/libre-chip/fayalite.git", version = "0.3.0", branch = "master" } -serde = { version = "1.0.202", features = ["derive"] } [profile.dev] opt-level = 1 diff --git a/README.md b/README.md deleted file mode 100644 index 03fad1d..0000000 --- a/README.md +++ /dev/null @@ -1,15 +0,0 @@ - -# Libre-Chip's CPU - - - -# Funding - -## NLnet Grants - -* [Libre-Chip CPU with proof of No Spectre bugs](https://nlnet.nl/project/Libre-Chip-proof/) 2024-12-324 [(progress)](https://git.libre-chip.org/libre-chip/grant-tracking/src/branch/master/nlnet-2024-12-324/progress.md) - -This project was funded through the [NGI0 Commons Fund](https://nlnet.nl/commonsfund), a fund established by [NLnet](https://nlnet.nl/) with financial support from the European Commission's [Next Generation Internet](https://ngi.eu) programme, under the aegis of [DG Communications Networks, Content and Technology](https://commission.europa.eu/about-european-commission/departments-and-executive-agencies/communications-networks-content-and-technology_en) under grant agreement № [101135429](https://cordis.europa.eu/project/id/101135429). Additional funding is made available by the [Swiss State Secretariat for Education, Research and Innovation](https://www.sbfi.admin.ch/sbfi/en/home.html) (SERI). diff --git a/crates/cpu/Cargo.toml b/crates/cpu/Cargo.toml index 4dd85d8..16ec0b9 100644 --- a/crates/cpu/Cargo.toml +++ b/crates/cpu/Cargo.toml @@ -16,4 +16,3 @@ version.workspace = true [dependencies] fayalite.workspace = true -serde.workspace = true diff --git a/crates/cpu/README.md b/crates/cpu/README.md deleted file mode 120000 index fe84005..0000000 --- a/crates/cpu/README.md +++ /dev/null @@ -1 +0,0 @@ -../../README.md \ No newline at end of file diff --git a/crates/cpu/src/config.rs b/crates/cpu/src/config.rs index ed3b814..4e66010 100644 --- a/crates/cpu/src/config.rs +++ b/crates/cpu/src/config.rs @@ -8,10 +8,9 @@ use crate::{ }, }; use fayalite::prelude::*; -use serde::{Deserialize, Serialize}; use std::num::NonZeroUsize; -#[derive(Clone, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)] +#[derive(Clone, Eq, PartialEq, Hash, Debug)] #[non_exhaustive] pub struct UnitConfig { pub kind: UnitKind, @@ -28,14 +27,12 @@ impl UnitConfig { } } -#[derive(Clone, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)] +#[derive(Clone, Eq, PartialEq, Hash, Debug)] #[non_exhaustive] 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, @@ -49,18 +46,6 @@ 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!(); @@ -72,8 +57,6 @@ 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, } @@ -134,12 +117,3 @@ 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/instruction.rs b/crates/cpu/src/instruction.rs index c410b56..dad8087 100644 --- a/crates/cpu/src/instruction.rs +++ b/crates/cpu/src/instruction.rs @@ -5,7 +5,6 @@ use fayalite::{ expr::ops::{ArrayLiteral, ExprPartialEq}, intern::Interned, prelude::*, - sim::value::SimValuePartialEq, }; use std::{fmt, marker::PhantomData, ops::Range}; @@ -182,12 +181,6 @@ impl ExprPartialEq for OutputIntegerMode { } } -impl SimValuePartialEq for OutputIntegerMode { - fn sim_value_eq(this: &SimValue, other: &SimValue) -> bool { - SimValue::opaque(this) == SimValue::opaque(other) - } -} - pub const MOP_IMM_WIDTH: usize = 34; pub const MOP_MIN_REG_WIDTH: usize = 8; pub const COMMON_MOP_SRC_LEN: usize = 3; diff --git a/crates/cpu/src/lib.rs b/crates/cpu/src/lib.rs index a00b668..bae3720 100644 --- a/crates/cpu/src/lib.rs +++ b/crates/cpu/src/lib.rs @@ -2,7 +2,6 @@ // 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 deleted file mode 100644 index 0338cc4..0000000 --- a/crates/cpu/src/next_pc.rs +++ /dev/null @@ -1,564 +0,0 @@ -// 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/src/reg_alloc/unit_free_regs_tracker.rs b/crates/cpu/src/reg_alloc/unit_free_regs_tracker.rs index a7bf687..d19cf2a 100644 --- a/crates/cpu/src/reg_alloc/unit_free_regs_tracker.rs +++ b/crates/cpu/src/reg_alloc/unit_free_regs_tracker.rs @@ -120,7 +120,10 @@ pub fn unit_free_regs_tracker( #[cfg(test)] mod tests { use super::*; - use fayalite::{firrtl::ExportOptions, module::transform::simplify_enums::SimplifyEnumsKind}; + use fayalite::{ + cli::FormalMode, firrtl::ExportOptions, + module::transform::simplify_enums::SimplifyEnumsKind, testing::assert_formal, + }; use std::num::NonZero; fn test_unit_free_regs_tracker( diff --git a/crates/cpu/src/unit.rs b/crates/cpu/src/unit.rs index b71f79a..d6cd1d6 100644 --- a/crates/cpu/src/unit.rs +++ b/crates/cpu/src/unit.rs @@ -15,7 +15,6 @@ use fayalite::{ intern::{Intern, Interned}, prelude::*, }; -use serde::{Deserialize, Serialize}; pub mod alu_branch; pub mod unit_base; @@ -37,7 +36,7 @@ macro_rules! all_units { } ) => { $(#[$enum_meta])* - #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Serialize, Deserialize)] + #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)] $vis enum $UnitKind { $( $(#[$variant_meta])* diff --git a/crates/cpu/src/util/array_vec.rs b/crates/cpu/src/util/array_vec.rs index 4af5663..761f53f 100644 --- a/crates/cpu/src/util/array_vec.rs +++ b/crates/cpu/src/util/array_vec.rs @@ -1,10 +1,147 @@ // SPDX-License-Identifier: LGPL-3.0-or-later // See Notices.txt for copyright information -use fayalite::{expr::ops::ExprIndex, int::UIntInRangeInclusiveType, prelude::*}; +use fayalite::{ + expr::ops::{ExprCastTo, ExprIndex, ExprPartialEq, ExprPartialOrd}, + int::SizeType, + intern::{Intern, Interned}, + prelude::*, + ty::{MatchVariantWithoutScope, StaticType, TypeProperties}, +}; +use std::{marker::PhantomData, ops::Index}; -#[hdl] -pub type Length = UIntInRangeInclusiveType, Max>; +#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct Length { + ty: UInt, + _phantom: PhantomData, +} + +impl Length { + pub fn new(max: Max::SizeType) -> Self { + Self { + ty: UInt::range_inclusive(0..=Max::as_usize(max)), + _phantom: PhantomData, + } + } + pub fn ty(self) -> UInt { + self.ty + } + pub fn zero(self) -> Expr { + Self::from_uint_unchecked(self.ty.zero()) + } + pub fn from_uint_unchecked(v: impl ToExpr) -> Expr { + Expr::from_canonical(Expr::canonical(v.to_expr())) + } + pub fn cast_from_uint_unchecked( + self, + v: impl ToExpr>, + ) -> Expr { + Self::from_uint_unchecked(v.to_expr().cast_to(self.ty)) + } + pub fn as_uint(this: impl ToExpr) -> Expr { + let this = this.to_expr(); + this.cast_to(Expr::ty(this).ty) + } +} + +impl ExprCastTo> for Length { + fn cast_to(src: Expr, to_type: UIntType) -> Expr> { + Expr::::from_canonical(Expr::canonical(src)).cast_to(to_type) + } +} + +#[allow(non_upper_case_globals)] +pub const Length: __LengthWithoutGenerics = __LengthWithoutGenerics {}; + +#[non_exhaustive] +pub struct __LengthWithoutGenerics {} + +impl Index for __LengthWithoutGenerics { + type Output = Length; + + fn index(&self, max: M) -> &Self::Output { + Interned::into_inner(Length::new(max).intern_sized()) + } +} + +impl Type for Length { + type BaseType = UInt; + type MaskType = Bool; + type MatchVariant = Expr; + type MatchActiveScope = (); + type MatchVariantAndInactiveScope = MatchVariantWithoutScope; + type MatchVariantsIter = std::iter::Once; + fn match_variants( + this: Expr, + source_location: SourceLocation, + ) -> Self::MatchVariantsIter { + let _ = source_location; + std::iter::once(MatchVariantWithoutScope(this)) + } + + fn mask_type(&self) -> Self::MaskType { + Bool + } + + fn canonical(&self) -> CanonicalType { + self.ty.canonical() + } + + fn from_canonical(canonical_type: CanonicalType) -> Self { + let ty = ::from_canonical(canonical_type); + if let Some(known_max) = Max::KNOWN_VALUE { + assert_eq!(ty, UInt::range_inclusive(0..=known_max)); + } + Self { + ty, + _phantom: PhantomData, + } + } + + fn source_location() -> SourceLocation { + SourceLocation::caller() + } +} + +impl StaticType for Length { + const TYPE: Self = Self { + ty: UInt { + width: Max::VALUE.next_power_of_two().ilog2() as usize, + }, + _phantom: PhantomData, + }; + const MASK_TYPE: Self::MaskType = Bool; + const TYPE_PROPERTIES: TypeProperties = { + let mut p = >::TYPE_PROPERTIES; + p.bit_width = Self::TYPE.ty.width; + p + }; + const MASK_TYPE_PROPERTIES: TypeProperties = Bool::TYPE_PROPERTIES; +} + +impl ExprPartialEq for Length { + fn cmp_eq(lhs: Expr, rhs: Expr) -> Expr { + Self::as_uint(lhs).cmp_eq(Self::as_uint(rhs)) + } + fn cmp_ne(lhs: Expr, rhs: Expr) -> Expr { + Self::as_uint(lhs).cmp_ne(Self::as_uint(rhs)) + } +} + +impl ExprPartialOrd for Length { + fn cmp_lt(lhs: Expr, rhs: Expr) -> Expr { + Self::as_uint(lhs).cmp_lt(Self::as_uint(rhs)) + } + fn cmp_le(lhs: Expr, rhs: Expr) -> Expr { + Self::as_uint(lhs).cmp_le(Self::as_uint(rhs)) + } + fn cmp_gt(lhs: Expr, rhs: Expr) -> Expr { + Self::as_uint(lhs).cmp_gt(Self::as_uint(rhs)) + } + fn cmp_ge(lhs: Expr, rhs: Expr) -> Expr { + Self::as_uint(lhs).cmp_ge(Self::as_uint(rhs)) + } +} /// like [`std::vec::Vec`], except with a [`Expr`] for [`len()`][`Self::len()`] and a fixed capacity #[hdl] @@ -19,7 +156,7 @@ impl ArrayVec { #[hdl] ArrayVec { elements: self.elements.uninit(), - len: 0u8.cast_to(self.len), + len: self.len.zero(), } } pub fn element(self) -> T { @@ -39,7 +176,7 @@ impl ArrayVec { let elements = elements.to_expr(); let len = len.to_expr(); assert_eq!( - Length[N::from_usize(Expr::ty(elements).len())], + Length::new(N::from_usize(Expr::ty(elements).len())), Expr::ty(len), "len type mismatch", ); @@ -54,7 +191,7 @@ impl ArrayVec { } pub fn is_empty(this: impl ToExpr) -> Expr { let len = Self::len(this); - len.cmp_eq(0u8) + len.cmp_eq(Expr::ty(len).zero()) } pub fn capacity(self) -> usize { self.elements.len() @@ -70,7 +207,7 @@ impl ArrayVec { let this = this.to_expr(); for (index, element) in this.elements.into_iter().enumerate() { #[hdl] - if index.cmp_lt(this.len) { + if index.cmp_lt(Length::as_uint(this.len)) { f(index, element); } } diff --git a/crates/cpu/tests/expected/next_pc.vcd b/crates/cpu/tests/expected/next_pc.vcd deleted file mode 100644 index 45e1cd6..0000000 --- a/crates/cpu/tests/expected/next_pc.vcd +++ /dev/null @@ -1,3650 +0,0 @@ -$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/expected/reg_alloc.vcd b/crates/cpu/tests/expected/reg_alloc.vcd index f69c9a7..ee343b4 100644 --- a/crates/cpu/tests/expected/reg_alloc.vcd +++ b/crates/cpu/tests/expected/reg_alloc.vcd @@ -16832,6 +16832,38 @@ $upscope $end $upscope $end $enddefinitions $end $dumpvars +0vg +0wg +0xg +0yg +0zg +0{g +0|g +0}g +0~g +0!h +0"h +0#h +0$h +0%h +0&h +0'h +0(h +0)h +0*h +0+h +0,h +0-h +0.h +0/h +00h +01h +02h +03h +04h +05h +06h +07h b0 (_ b0 ia b0 )_ @@ -17338,26 +17370,6 @@ b0 ga b0 Jd b0 ha b0 Kd -b0 Ld -b0 Nd -b0 Md -b0 Od -0Pd -0Qd -0Rd -0Sd -0Td -0Ud -0Vd -0Wd -0Xd -0Yd -0Zd -0[d -0\d -0]d -0^d -0_d 0`d 0ad 0bd @@ -17374,326 +17386,6 @@ b0 Od 0md 0nd 0od -b0 pd -0"e -02e -0Be -0Re -0be -0re -0$f -04f -b0 qd -0#e -03e -0Ce -0Se -0ce -0se -0%f -05f -b0 rd -0$e -04e -0De -0Te -0de -0te -0&f -06f -b0 sd -0%e -05e -0Ee -0Ue -0ee -0ue -0'f -07f -b0 td -0&e -06e -0Fe -0Ve -0fe -0ve -0(f -08f -b0 ud -0'e -07e -0Ge -0We -0ge -0we -0)f -09f -b0 vd -0(e -08e -0He -0Xe -0he -0xe -0*f -0:f -b0 wd -0)e -09e -0Ie -0Ye -0ie -0ye -0+f -0;f -b0 xd -0*e -0:e -0Je -0Ze -0je -0ze -0,f -0f -b0 {d -0-e -0=e -0Me -0]e -0me -0}e -0/f -0?f -b0 |d -0.e -0>e -0Ne -0^e -0ne -0~e -00f -0@f -b0 }d -0/e -0?e -0Oe -0_e -0oe -0!f -01f -0Af -b0 ~d -00e -0@e -0Pe -0`e -0pe -0"f -02f -0Bf -b0 !e -01e -0Ae -0Qe -0ae -0qe -0#f -03f -0Cf -b0 Df -0Tf -0df -0tf -0&g -06g -0Fg -0Vg -0fg -b0 Ef -0Uf -0ef -0uf -0'g -07g -0Gg -0Wg -0gg -b0 Ff -0Vf -0ff -0vf -0(g -08g -0Hg -0Xg -0hg -b0 Gf -0Wf -0gf -0wf -0)g -09g -0Ig -0Yg -0ig -b0 Hf -0Xf -0hf -0xf -0*g -0:g -0Jg -0Zg -0jg -b0 If -0Yf -0if -0yf -0+g -0;g -0Kg -0[g -0kg -b0 Jf -0Zf -0jf -0zf -0,g -0g -0Ng -0^g -0ng -b0 Mf -0]f -0mf -0}f -0/g -0?g -0Og -0_g -0og -b0 Nf -0^f -0nf -0~f -00g -0@g -0Pg -0`g -0pg -b0 Of -0_f -0of -0!g -01g -0Ag -0Qg -0ag -0qg -b0 Pf -0`f -0pf -0"g -02g -0Bg -0Rg -0bg -0rg -b0 Qf -0af -0qf -0#g -03g -0Cg -0Sg -0cg -0sg -b0 Rf -0bf -0rf -0$g -04g -0Dg -0Tg -0dg -0tg -b0 Sf -0cf -0sf -0%g -05g -0Eg -0Ug -0eg -0ug -0vg -0wg -0xg -0yg -0zg -0{g -0|g -0}g -0~g -0!h -0"h -0#h -0$h -0%h -0&h -0'h -0(h -0)h -0*h -0+h -0,h -0-h -0.h -0/h -00h -01h -02h -03h -04h -05h -06h -07h b0 8h 0Hh 0Xh @@ -17838,6 +17530,150 @@ b0 Gh 0Ii 0Yi 0ii +b0 Df +0Tf +0df +0tf +0&g +06g +0Fg +0Vg +0fg +b0 Ef +0Uf +0ef +0uf +0'g +07g +0Gg +0Wg +0gg +b0 Ff +0Vf +0ff +0vf +0(g +08g +0Hg +0Xg +0hg +b0 Gf +0Wf +0gf +0wf +0)g +09g +0Ig +0Yg +0ig +b0 Hf +0Xf +0hf +0xf +0*g +0:g +0Jg +0Zg +0jg +b0 If +0Yf +0if +0yf +0+g +0;g +0Kg +0[g +0kg +b0 Jf +0Zf +0jf +0zf +0,g +0g +0Ng +0^g +0ng +b0 Mf +0]f +0mf +0}f +0/g +0?g +0Og +0_g +0og +b0 Nf +0^f +0nf +0~f +00g +0@g +0Pg +0`g +0pg +b0 Of +0_f +0of +0!g +01g +0Ag +0Qg +0ag +0qg +b0 Pf +0`f +0pf +0"g +02g +0Bg +0Rg +0bg +0rg +b0 Qf +0af +0qf +0#g +03g +0Cg +0Sg +0cg +0sg +b0 Rf +0bf +0rf +0$g +04g +0Dg +0Tg +0dg +0tg +b0 Sf +0cf +0sf +0%g +05g +0Eg +0Ug +0eg +0ug b0 ji 0zi 0,j @@ -17982,6 +17818,170 @@ b0 yi 0{j 0-k 0=k +b0 pd +0"e +02e +0Be +0Re +0be +0re +0$f +04f +b0 qd +0#e +03e +0Ce +0Se +0ce +0se +0%f +05f +b0 rd +0$e +04e +0De +0Te +0de +0te +0&f +06f +b0 sd +0%e +05e +0Ee +0Ue +0ee +0ue +0'f +07f +b0 td +0&e +06e +0Fe +0Ve +0fe +0ve +0(f +08f +b0 ud +0'e +07e +0Ge +0We +0ge +0we +0)f +09f +b0 vd +0(e +08e +0He +0Xe +0he +0xe +0*f +0:f +b0 wd +0)e +09e +0Ie +0Ye +0ie +0ye +0+f +0;f +b0 xd +0*e +0:e +0Je +0Ze +0je +0ze +0,f +0f +b0 {d +0-e +0=e +0Me +0]e +0me +0}e +0/f +0?f +b0 |d +0.e +0>e +0Ne +0^e +0ne +0~e +00f +0@f +b0 }d +0/e +0?e +0Oe +0_e +0oe +0!f +01f +0Af +b0 ~d +00e +0@e +0Pe +0`e +0pe +0"f +02f +0Bf +b0 !e +01e +0Ae +0Qe +0ae +0qe +0#f +03f +0Cf +0Pd +0Qd +0Rd +0Sd +0Td +0Ud +0Vd +0Wd +0Xd +0Yd +0Zd +0[d +0\d +0]d +0^d +0_d +b0 Ld +b0 Nd +b0 Md +b0 Od 0! 1" sHdlSome\x20(1) # diff --git a/crates/cpu/tests/next_pc.rs b/crates/cpu/tests/next_pc.rs deleted file mode 100644 index 28c78e0..0000000 --- a/crates/cpu/tests/next_pc.rs +++ /dev/null @@ -1,45 +0,0 @@ -// 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!(); - } -} diff --git a/crates/cpu/tests/reg_alloc.rs b/crates/cpu/tests/reg_alloc.rs index f9a292c..f88d241 100644 --- a/crates/cpu/tests/reg_alloc.rs +++ b/crates/cpu/tests/reg_alloc.rs @@ -9,6 +9,8 @@ use cpu::{ unit::{GlobalState, UnitKind}, }; use fayalite::{ + assert_export_firrtl, + firrtl::ExportOptions, prelude::*, sim::{Simulation, time::SimDuration, vcd::VcdWriterDecls}, util::RcWriter,