diff --git a/feature/dynamorio-tracer/.buildinfo b/feature/dynamorio-tracer/.buildinfo new file mode 100644 index 000000000..0e820b676 --- /dev/null +++ b/feature/dynamorio-tracer/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 78900a5ac7921b4f150d7c6353f4423e +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/feature/dynamorio-tracer/.doctrees/Address-operations.doctree b/feature/dynamorio-tracer/.doctrees/Address-operations.doctree new file mode 100644 index 000000000..196ec2139 Binary files /dev/null and b/feature/dynamorio-tracer/.doctrees/Address-operations.doctree differ diff --git a/feature/dynamorio-tracer/.doctrees/Bandwidth.doctree b/feature/dynamorio-tracer/.doctrees/Bandwidth.doctree new file mode 100644 index 000000000..f7eafa437 Binary files /dev/null and b/feature/dynamorio-tracer/.doctrees/Bandwidth.doctree differ diff --git a/feature/dynamorio-tracer/.doctrees/Byte-sizes.doctree b/feature/dynamorio-tracer/.doctrees/Byte-sizes.doctree new file mode 100644 index 000000000..a32c0345b Binary files /dev/null and b/feature/dynamorio-tracer/.doctrees/Byte-sizes.doctree differ diff --git a/feature/dynamorio-tracer/.doctrees/Cache-model.doctree b/feature/dynamorio-tracer/.doctrees/Cache-model.doctree new file mode 100644 index 000000000..1a241ae1f Binary files /dev/null and b/feature/dynamorio-tracer/.doctrees/Cache-model.doctree differ diff --git a/feature/dynamorio-tracer/.doctrees/Configuration-API.doctree b/feature/dynamorio-tracer/.doctrees/Configuration-API.doctree new file mode 100644 index 000000000..7fed89998 Binary files /dev/null and b/feature/dynamorio-tracer/.doctrees/Configuration-API.doctree differ diff --git a/feature/dynamorio-tracer/.doctrees/Core-model.doctree b/feature/dynamorio-tracer/.doctrees/Core-model.doctree new file mode 100644 index 000000000..58633938d Binary files /dev/null and b/feature/dynamorio-tracer/.doctrees/Core-model.doctree differ diff --git a/feature/dynamorio-tracer/.doctrees/Creating-a-configuration-file.doctree b/feature/dynamorio-tracer/.doctrees/Creating-a-configuration-file.doctree new file mode 100644 index 000000000..0bb1a2d27 Binary files /dev/null and b/feature/dynamorio-tracer/.doctrees/Creating-a-configuration-file.doctree differ diff --git a/feature/dynamorio-tracer/.doctrees/Legacy-modules.doctree b/feature/dynamorio-tracer/.doctrees/Legacy-modules.doctree new file mode 100644 index 000000000..475c09111 Binary files /dev/null and b/feature/dynamorio-tracer/.doctrees/Legacy-modules.doctree differ diff --git a/feature/dynamorio-tracer/.doctrees/Module-support-library.doctree b/feature/dynamorio-tracer/.doctrees/Module-support-library.doctree new file mode 100644 index 000000000..9e0d4ef85 Binary files /dev/null and b/feature/dynamorio-tracer/.doctrees/Module-support-library.doctree differ diff --git a/feature/dynamorio-tracer/.doctrees/Modules.doctree b/feature/dynamorio-tracer/.doctrees/Modules.doctree new file mode 100644 index 000000000..3bfbb5f80 Binary files /dev/null and b/feature/dynamorio-tracer/.doctrees/Modules.doctree differ diff --git a/feature/dynamorio-tracer/.doctrees/Publications-using-champsim.doctree b/feature/dynamorio-tracer/.doctrees/Publications-using-champsim.doctree new file mode 100644 index 000000000..567e6786e Binary files /dev/null and b/feature/dynamorio-tracer/.doctrees/Publications-using-champsim.doctree differ diff --git a/feature/dynamorio-tracer/.doctrees/environment.pickle b/feature/dynamorio-tracer/.doctrees/environment.pickle new file mode 100644 index 000000000..b45af3dc4 Binary files /dev/null and b/feature/dynamorio-tracer/.doctrees/environment.pickle differ diff --git a/feature/dynamorio-tracer/.doctrees/index.doctree b/feature/dynamorio-tracer/.doctrees/index.doctree new file mode 100644 index 000000000..3109716b4 Binary files /dev/null and b/feature/dynamorio-tracer/.doctrees/index.doctree differ diff --git a/feature/dynamorio-tracer/.nojekyll b/feature/dynamorio-tracer/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/feature/dynamorio-tracer/Address-operations.html b/feature/dynamorio-tracer/Address-operations.html new file mode 100644 index 000000000..d39a88ecd --- /dev/null +++ b/feature/dynamorio-tracer/Address-operations.html @@ -0,0 +1,737 @@ + + + + + + + + Address Operations — ChampSim documentation + + + + + + + + + + + + +
+
+
+
+ +
+

Address Operations

+
+

Addresses

+
+
+template<typename EXTENT>
class address_slice
+

The correctness of address operations is critical to the correctness of ChampSim.

+

This class is a strong type for addresses to prevent bugs that would result from unchecked operations on raw integers. The primary benefit is this: Most address operation bugs are compiler errors. Those that are not are usually runtime exceptions. If you need to manipulate the bits of an address, you can, but you must explicitly enter an unsafe mode.

+

This class is a generalization of a subset of address bits. Implicit conversions between address slices of different extents are compile-time errors, providing a measure of safety. New slices must be explicitly constructed.

+
// LOG2_PAGE_SIZE = 12
+// LOG2_BLOCK_SIZE = 6
+address full_addr{0xffff'ffff};
+block_number block{full_addr}; // 0xffff'ffc0
+page_number page{full_addr}; // 0xffff'f000
+
+
+

All address slices can take their extent as a constructor parameter.

+
address_slice st_full_addr{static_extent<64_b,0_b>{},0xffff'ffff};
+address_slice st_block{static_extent<64_b, champsim::data::bits{LOG2_BLOCK_SIZE}>{}, st_full_addr}; // 0xffff'ffc0
+address_slice st_page{static_extent<64_b, champsim::data::bits{LOG2_PAGE_SIZE}>{}, st_full_addr}; // 0xffff'f000
+
+address_slice dyn_full_addr{dynamic_extent{64_b,0_b},0xffff'ffff};
+address_slice dyn_block{dynamic_extent{64_b, champsim::data::bits{LOG2_BLOCK_SIZE}}, dyn_full_addr}; // 0xffff'ffc0
+address_slice dyn_page{dynamic_extent{64_b, champsim::data::bits{LOG2_PAGE_SIZE}}, dyn_full_addr}; // 0xffff'f000
+
+
+

For static extents, it can be useful to explicitly specify the template parameter.

+
address_slice<static_extent<64_b,0_b>> st_full_addr{0xffff'ffff};
+address_slice<static_extent<champsim::data::bits{LOG2_BLOCK_SIZE}, 0_b>> st_block{st_full_addr}; // 0x3f
+address_slice<static_extent<champsim::data::bits{LOG2_PAGE_SIZE}, 0_b>> st_page{st_full_addr}; // 0xfff
+
+
+

The address slices have a constructor that accepts a uint64_t. No bit shifting is performed in these constructors. The argument is assumed to be in the domain of the slice.

+
champsim::block_number block{0xffff}; // 0x003f'ffc0
+
+
+

Relative slicing is possible with member functions:

+
address_slice<static_extent<24_b,12_b>>::slice(static_extent<8_b,4_b>{}) -> address_slice<static_extent<20_b,16_b>>
+address_slice<static_extent<24_b,12_b>>::slice<8_b,4_b>() -> address_slice<static_extent<20_b,16_b>>
+address_slice<static_extent<24_b,12_b>>::slice_upper<4_b>() -> address_slice<static_extent<24_b,16_b>>
+address_slice<static_extent<24_b,12_b>>::slice_lower<8_b>() -> address_slice<static_extent<20_b,12_b>>
+
+
+

The offset between two addresses can be found with

+
auto champsim::offset(champsim::address base, champsim::address other) -> champsim::address::difference_type
+auto champsim::uoffset(champsim::address base, champsim::address other) -> std::make_unsigned_t<champsim::address::difference_type>
+
+
+

The function is a template, so any address slice is accepted, but the two arguments must be of the same type. For the first function, the return type is signed and the conversion is safe against overflows, where it will throw an exception. For the second function, the return type is unsigned and the ‘other’ argument must succeed ‘base’, or the function will throw an exception.

+

Address slices also support addition and subtraction with signed integers. The arguments to this arithmetic are in the domain of the type.

+
champsim::block_number block{0xffff}; // 0x003f'ffc0
+block += 1; // 0x0040'0000
+
+
+

Two or more slices can be spliced together. Later arguments takes priority over the first, and the result type has an extent that is a superset of all slices.

+
champsim::splice(champsim::page_number{0xaaa}, champsim::page_offset{0xbbb}) == champsim::address{0xaaabbb};
+
+
+

Sometimes, it is necessary to directly manipulate the bits of an address in a way that these strong types do not allow. Additionally, sometimes slices must be used as array indices. In those cases, the address_slice<>::to<T>() function performs a checked cast to the type.

+
champsim::address addr{0xffff'ffff};
+class Foo {};
+std::array<Foo, 256> foos = {};
+auto the_foo = foos.at(addr.slice_lower<8_b>().to<std::size_t>());
+
+
+
+
Template Parameters:
+

EXTENT – One of champsim::static_extent<>, champsim::dynamic_extent, or one of the page- or block-sized extents.

+
+
+
+

Public Types

+
+
+using extent_type = EXTENT
+

The extent passed as a template parameter.

+
+ +
+
+using underlying_type = uint64_t
+

The underlying representation of the address.

+
+ +
+
+using difference_type = std::make_signed_t<underlying_type>
+

The type of an offset between two addresses.

+
+ +
+
+

Public Functions

+
+
+inline constexpr address_slice() noexcept(is_static)
+

Default-initialize the slice. This constructor is invalid for dynamically-sized extents.

+
+ +
+
+inline explicit constexpr address_slice(underlying_type val) noexcept(is_static)
+

Initialize the slice with the given raw value. This constructor is invalid for dynamically-sized extents.

+
+ +
+
+template<typename OTHER_EXT>
inline explicit constexpr address_slice(const address_slice<OTHER_EXT> &val) noexcept(is_static)
+

Initialize the slice with the given slice, shifting and masking if necessary. If this extent is dynamic, it will have the same bounds as the given slice. If the conversion is a widening, the widened bits will be 0.

+
+ +
+
+template<typename OTHER_EXT>
inline constexpr address_slice(extent_type ext, const address_slice<OTHER_EXT> &val) noexcept(is_static)
+

Initialize the slice with the given slice, shifting and masking if necessary. The extent type can be deduced from the first argument. If the conversion is a widening, the widened bits will be 0.

+
+ +
+
+inline constexpr address_slice(extent_type ext, underlying_type val) noexcept(is_static)
+

Initialize the slice with the given value. The extent type can be deduced from the first argument. If the conversion is a widening, the widened bits will be 0.

+
+ +
+
+template<typename T>
inline constexpr T to() const
+

Unwrap the value of this slice as a raw integer value.

+
+ +
+
+inline constexpr bool operator==(self_type other) const noexcept(is_static)
+

Compare with another address slice for equality.

+
+
Throws:
+

std::invalid_argument – If the extents do not match

+
+
+
+ +
+
+inline constexpr bool operator<(self_type other) const noexcept(is_static)
+

Compare with another address slice for ordering.

+
+
Throws:
+

std::invalid_argument – If the extents do not match

+
+
+
+ +
+
+inline constexpr bool operator!=(self_type other) const noexcept(is_static)
+

Compare with another address slice for inequality.

+
+
Throws:
+

std::invalid_argument – If the extents do not match

+
+
+
+ +
+
+inline constexpr bool operator<=(self_type other) const noexcept(is_static)
+

Compare with another address slice for ordering.

+
+
Throws:
+

std::invalid_argument – If the extents do not match

+
+
+
+ +
+
+inline constexpr bool operator>(self_type other) const noexcept(is_static)
+

Compare with another address slice for ordering.

+
+
Throws:
+

std::invalid_argument – If the extents do not match

+
+
+
+ +
+
+inline constexpr bool operator>=(self_type other) const noexcept(is_static)
+

Compare with another address slice for ordering.

+
+
Throws:
+

std::invalid_argument – If the extents do not match

+
+
+
+ +
+
+inline constexpr self_type &operator+=(difference_type delta)
+

Increment the slice in place by the given amount. The delta is interpreted in the domain of the slice. That is, the delta need not be scaled by 1 << slice.lower_extent().

+
+ +
+
+inline constexpr self_type &operator+=(champsim::data::bytes delta)
+

Increment the slice in place by the given amount. The delta is interpreted in the domain of the slice. That is, the delta need not be scaled by 1 << slice.lower_extent().

+
+ +
+
+inline constexpr self_type operator+(difference_type delta) const
+

Increment the slice by the given amount. The delta is interpreted in the domain of the slice. That is, the delta need not be scaled by 1 << slice.lower_extent().

+
+ +
+
+inline constexpr self_type operator+(champsim::data::bytes delta) const
+

Increment the slice by the given amount. The delta is interpreted in the domain of the slice. That is, the delta need not be scaled by 1 << slice.lower_extent().

+
+ +
+
+inline constexpr self_type &operator-=(difference_type delta)
+

Decrement the slice in place by the given amount. The delta is interpreted in the domain of the slice. That is, the delta need not be scaled by 1 << slice.lower_extent().

+
+ +
+
+inline constexpr self_type &operator-=(champsim::data::bytes delta)
+

Decrement the slice in place by the given amount. The delta is interpreted in the domain of the slice. That is, the delta need not be scaled by 1 << slice.lower_extent().

+
+ +
+
+inline constexpr self_type operator-(difference_type delta) const
+

Decrement the slice by the given amount. The delta is interpreted in the domain of the slice. That is, the delta need not be scaled by 1 << slice.lower_extent().

+
+ +
+
+inline constexpr self_type operator-(champsim::data::bytes delta) const
+

Decrement the slice by the given amount. The delta is interpreted in the domain of the slice. That is, the delta need not be scaled by 1 << slice.lower_extent().

+
+ +
+
+inline constexpr self_type &operator++()
+

Increment the slice by one.

+
+ +
+
+inline constexpr self_type operator++(int)
+

Increment the slice by one.

+
+ +
+
+inline constexpr self_type &operator--()
+

Decrement the slice by one.

+
+ +
+
+inline constexpr self_type operator--(int)
+

Decrement the slice by one.

+
+ +
+
+template<typename SUB_EXTENT>
inline auto slice(SUB_EXTENT subextent) const noexcept(is_static && detail::extent_is_static<SUB_EXTENT>)
+

Perform a slice on this address. The given extent should be relative to this slice’s extent. If either this extent or the subextent are runtime-sized, the result will have a runtime-sized extent. Otherwise, the extent will be statically-sized.

+
+ +
+
+template<champsim::data::bits new_upper, champsim::data::bits new_lower>
inline auto slice() const noexcept
+

Perform a slice on this address. The given extent should be relative to this slice’s extent. This is a synonym for slice(static_extent<new_upper, new_lower>{}).

+
+ +
+
+template<champsim::data::bits new_lower>
inline auto slice_upper() const noexcept
+

Slice the upper bits, ending with the given bit relative to the lower extent of this. If this slice is statically-sized, the result will be statically-sized.

+
+ +
+
+template<champsim::data::bits new_upper>
inline auto slice_lower() const noexcept
+

Slice the lower bits, ending with the given bit relative to the lower extent of this. If this slice is statically-sized, the result will be statically-sized.

+
+ +
+
+inline auto slice_upper(champsim::data::bits new_lower) const
+

Slice the upper bits, ending with the given bit relative to the lower extent of this. The result of this will always be runtime-sized.

+
+ +
+
+inline auto slice_lower(champsim::data::bits new_upper) const
+

Slice the lower bits, ending with the given bit relative to the lower extent of this. The result of this will always be runtime-sized.

+
+ +
+
+template<champsim::data::bits split_loc>
inline auto split() const
+

Split the slice into an upper and lower slice.

+
+ +
+
+inline auto split(champsim::data::bits split_loc) const
+

Split the slice into an upper and lower slice.

+
+ +
+
+inline constexpr auto upper_extent() const noexcept
+

Get the upper portion of the extent.

+
+ +
+
+inline constexpr auto lower_extent() const noexcept
+

Get the lower portion of the extent.

+
+ +
+
+

Public Static Attributes

+
+
+static constexpr champsim::data::bits bits = {std::numeric_limits<underlying_type>::digits}
+

The maximum width of any address slice. This is not the width of this slice, which can be found by slice.upper_extent() - slice.lower_extent().

+
+ +
+
+ +
+
+template<typename Extent>
constexpr auto champsim::offset(address_slice<Extent> base, address_slice<Extent> other) -> typename address_slice<Extent>::difference_type
+

Find the offset between two slices with the same types.

+
+
Throws:
+

overflow_error – if the difference cannot be represented in the difference type

+
+
+
+ +
+
+template<typename Extent>
constexpr auto champsim::uoffset(address_slice<Extent> base, address_slice<Extent> other) -> std::make_unsigned_t<typename address_slice<Extent>::difference_type>
+

Find the offset between two slices with the same types, where the first element must be less than or equal to than the second. The return type of this function is unsigned.

+
+
Throws:
+

overflow_error – if the difference cannot be represented in the difference type

+
+
+
+ +
+
+template<typename ...Extents>
constexpr auto champsim::splice(address_slice<Extents>... slices)
+

Join address slices together. Later slices will overwrite bits from earlier slices. The extent of the returned slice is the superset of all slices. If all of the slices are statically-sized, the result will be statically-sized as well.

+
+ +
+

Convenience typedefs

+

Champsim provides five specializations of an address slice in inc/champsim.h

+
+
+using champsim::address = address_slice<static_extent<champsim::data::bits{std::numeric_limits<uint64_t>::digits}, champsim::data::bits{}>>
+

Convenience definitions for commmon address slices

+
+ +
+
+using champsim::page_number = address_slice<page_number_extent>
+
+ +
+
+using champsim::page_offset = address_slice<page_offset_extent>
+
+ +
+
+using champsim::block_number = address_slice<block_number_extent>
+
+ +
+
+using champsim::block_offset = address_slice<block_offset_extent>
+
+ +
+
+
+

Extents

+
+
+template<champsim::data::bits UP, champsim::data::bits LOW>
struct static_extent
+

An extent with compile-time size

+
+

Public Static Attributes

+
+
+static constexpr champsim::data::bits upper = {UP}
+

The upper limit of the extent. Generally, this is not inclusive.

+
+ +
+
+static constexpr champsim::data::bits lower = {LOW}
+

The lower limit of the extent. This is generally inclusive.

+
+ +
+
+ +
+
+struct dynamic_extent
+

An extent with runtime size

+

Subclassed by champsim::block_number_extent, champsim::block_offset_extent, champsim::page_number_extent, champsim::page_offset_extent

+
+

Public Functions

+
+
+inline constexpr dynamic_extent(champsim::data::bits up, champsim::data::bits low)
+

Initialize the extent with the given upper and lower extents. The upper must be greater than or equal to the lower.

+
+ +
+
+inline constexpr dynamic_extent(champsim::data::bits low, std::size_t size)
+

Initialize the extent with a lower extent and size.

+
+ +
+
+

Public Members

+
+
+champsim::data::bits upper
+

The upper limit of the extent. Generally, this is not inclusive.

+
+ +
+
+champsim::data::bits lower
+

The lower limit of the extent. This is generally inclusive.

+
+ +
+
+ +
+
+struct page_number_extent : public champsim::dynamic_extent
+

An extent that is always the size of a page number

+
+

Public Functions

+
+
+page_number_extent()
+

This extent can only be default-initialized. It will have upper == champsim::address::bits and lower == LOG2_PAGE_SIZE.

+
+ +
+
+ +
+
+struct page_offset_extent : public champsim::dynamic_extent
+

An extent that is always the size of a page offset

+
+

Public Functions

+
+
+page_offset_extent()
+

This extent can only be default-initialized. It will have upper == LOG2_PAGE_SIZE and lower == 0.

+
+ +
+
+ +
+
+struct block_number_extent : public champsim::dynamic_extent
+

An extent that is always the size of a block number

+
+

Public Functions

+
+
+block_number_extent()
+

This extent can only be default-initialized. It will have upper == champsim::address::bits and lower == LOG2_BLOCK_SIZE.

+
+ +
+
+ +
+
+struct block_offset_extent : public champsim::dynamic_extent
+

An extent that is always the size of a block offset

+
+

Public Functions

+
+
+block_offset_extent()
+

This extent can only be default-initialized. It will have upper == LOG2_BLOCK_SIZE and lower == 0.

+
+ +
+
+ +
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/feature/dynamorio-tracer/Bandwidth.html b/feature/dynamorio-tracer/Bandwidth.html new file mode 100644 index 000000000..b603623a6 --- /dev/null +++ b/feature/dynamorio-tracer/Bandwidth.html @@ -0,0 +1,218 @@ + + + + + + + + Bandwidth — ChampSim documentation + + + + + + + + + + + + +
+
+
+
+ +
+

Bandwidth

+
+
+class bandwidth
+

This class encapuslates the operation of consuming a fixed number of operations, a very common operation in ChampSim. Once initialized, the maximum bandwidth cannot be changed. Instead, consuming the bandwidth reduces the amount available until it is depleted.

+
+

Public Types

+
+
+using maximum_type = max_t
+

The type of the maximum. This type is integer-like, with the exception that it is immutable.

+

This type is exported so that other types can keep maximums as members.

+
+ +
+
+

Public Functions

+
+
+void consume(underlying_type delta)
+

Consume some of the bandwidth.

+
+
Parameters:
+

delta – The amount of bandwidth to consume

+
+
Throws:
+

std::range_error – if more than the maximum amount of bandwidth will have been consumed.

+
+
+
+ +
+
+void consume()
+

Consume one unit of bandwidth.

+
+
Throws:
+

std::range_error – if more than the maximum amount of bandwidth will have been consumed.

+
+
+
+ +
+
+bool has_remaining() const
+

Report if the bandwidth has one or more unit remaining.

+
+ +
+
+underlying_type amount_consumed() const
+

Report the amount of bandwidth that has been consumed

+
+ +
+
+underlying_type amount_remaining() const
+

Report the amount of bandwidth that remains

+
+ +
+
+void reset()
+

Reset the bandwidth, so that it can be used again.

+
+ +
+
+explicit bandwidth(maximum_type maximum)
+

Initialize a bandwidth with the specified maximum.

+
+ +
+
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/feature/dynamorio-tracer/Byte-sizes.html b/feature/dynamorio-tracer/Byte-sizes.html new file mode 100644 index 000000000..1ba9c87e5 --- /dev/null +++ b/feature/dynamorio-tracer/Byte-sizes.html @@ -0,0 +1,312 @@ + + + + + + + + Byte Sizes — ChampSim documentation + + + + + + + + + + + + +
+
+
+
+ +
+

Byte Sizes

+

ChampSim provides a strong type to represent a unit of byte size. +Objects of this type are convertible to other byte sizes, but are more difficult to unintentionally use in arithmetic operations.

+
+
+template<typename Rep, typename Unit>
class size
+

A class to represent data sizes as they are passed around the program. This type is modeled after std::chrono::duration. The units are known as part of the size, but the types are convertible.

+
+
Template Parameters:
+
    +
  • Rep – The type of the underlying representation.

  • +
  • Unit – A specialization of std::ratio that represents the multiple of a single byte.

  • +
+
+
+
+

Public Functions

+
+
+inline explicit constexpr size(rep other)
+

Construct the size with the given value

+
+ +
+
+template<typename Rep2, typename Unit2>
inline constexpr size(const size<Rep2, Unit2> &other)
+

Implicitly convert between data sizes.

+

This permits constructions like

+
void func(champsim::data::kibibytes x);
+func(champsim::data::bytes{1024});
+
+
+
+ +
+
+inline constexpr auto count() const
+

Unwrap the underlying value.

+
+ +
+
+ +
+
+enum class champsim::data::bits : uint64_t
+

A strong type to represent a bit width. Being an enum prevents arbitrary arithmetic from being performed.

+

Values:

+
+ +
+

Convenience specializations

+

ChampSim provides a number of ratio specializations for use in sizes:

+
+
+using champsim::kibi = std::ratio<(1LL << 10)>
+
+ +
+
+using champsim::mebi = std::ratio<(1LL << 20)>
+
+ +
+
+using champsim::gibi = std::ratio<(1LL << 30)>
+
+ +
+
+using champsim::tebi = std::ratio<(1LL << 40)>
+
+ +
+
+using champsim::pebi = std::ratio<(1LL << 50)>
+
+ +
+
+using champsim::exbi = std::ratio<(1LL << 60)>
+
+ +

These types are also used in the convenience specializations:

+
+
+using champsim::data::bytes = size<long long, std::ratio<1>>
+

Convenience definitions for common data types

+
+ +
+
+using champsim::data::kibibytes = size<long long, kibi>
+
+ +
+
+using champsim::data::mebibytes = size<long long, mebi>
+
+ +
+
+using champsim::data::gibibytes = size<long long, gibi>
+
+ +
+
+using champsim::data::tebibytes = size<long long, tebi>
+
+ +
+
+

Literals

+
+
+constexpr auto champsim::data::data_literals::operator""_b(unsigned long long val) -> bits
+

Specify a literal number of champsim::data::bits.

+
+ +
+
+constexpr auto champsim::data::data_literals::operator""_B(unsigned long long val) -> size<long long, std::ratio<1>>
+

Specify a literal number of champsim::data::bytes.

+
+ +
+
+constexpr auto champsim::data::data_literals::operator""_kiB(unsigned long long val) -> size<long long, kibi>
+

Specify a literal number of champsim::data::kibibytes.

+
+ +
+
+constexpr auto champsim::data::data_literals::operator""_MiB(unsigned long long val) -> size<long long, mebi>
+

Specify a literal number of champsim::data::mebibytes.

+
+ +
+
+constexpr auto champsim::data::data_literals::operator""_GiB(unsigned long long val) -> size<long long, gibi>
+

Specify a literal number of champsim::data::gibibytes.

+
+ +
+
+constexpr auto champsim::data::data_literals::operator""_TiB(unsigned long long val) -> size<long long, tebi>
+

Specify a literal number of champsim::data::tebibytes.

+
+ +
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/feature/dynamorio-tracer/Cache-model.html b/feature/dynamorio-tracer/Cache-model.html new file mode 100644 index 000000000..241ab9f82 --- /dev/null +++ b/feature/dynamorio-tracer/Cache-model.html @@ -0,0 +1,402 @@ + + + + + + + + Cache Model — ChampSim documentation + + + + + + + + + + + + +
+
+
+
+ +
+

Cache Model

+
+
+class CACHE : public champsim::operable
+
+
+struct mshr_type
+
+
+struct returned_value
+
+ +
+ +
+
+struct prefetcher_module_concept
+

Subclassed by CACHE::prefetcher_module_model< Ps >

+
+ +
+
+template<typename ...Ps>
struct prefetcher_module_model : public CACHE::prefetcher_module_concept
+
+ +
+
+struct replacement_module_concept
+

Subclassed by CACHE::replacement_module_model< Rs >

+
+ +
+
+template<typename ...Rs>
struct replacement_module_model : public CACHE::replacement_module_concept
+
+ +
+ +
+

Builder

+
+
+template<typename P = cache_builder_module_type_holder<>, typename R = cache_builder_module_type_holder<>>
class cache_builder : public champsim::detail::cache_builder_base
+
+

Public Functions

+
+
+self_type &name(std::string name_)
+

Specify the name of the cache. This will be a unique identifier in the statistics.

+
+ +
+
+self_type &clock_period(champsim::chrono::picoseconds clock_period_)
+

Specify the clock period of the cache.

+
+ +
+
+self_type &size(champsim::data::bytes size_)
+

Specify the size of the cache.

+

If the number of sets or ways is not specified, this value can be used to derive them.

+
+ +
+
+self_type &log2_size(uint64_t log2_size_)
+

Specify the logarithm of the cache size.

+
+ +
+
+self_type &sets(uint32_t sets_)
+

Specify the number of sets in the cache.

+
+ +
+
+self_type &log2_sets(uint32_t log2_sets_)
+

Specify the logarithm of the number of sets in the cache.

+
+ +
+
+self_type &ways(uint32_t ways_)
+

Specify the number of ways in the cache.

+
+ +
+
+self_type &log2_ways(uint32_t log2_ways_)
+

Specify the logarithm of the number of ways in the cache.

+
+ +
+
+self_type &pq_size(uint32_t pq_size_)
+

Specify the size of the internal prefetch queue.

+
+ +
+
+self_type &mshr_size(uint32_t mshr_size_)
+

Specify the number of MSHRs. If this is not specified, it will be derived from the number of sets, fill latency, and fill bandwidth.

+
+ +
+
+self_type &latency(uint64_t lat_)
+

Specify the latency of the cache, in cycles. If the hit latency and fill latency are not specified, this will be distributed evenly between them.

+
+ +
+
+self_type &hit_latency(uint64_t hit_lat_)
+

Specify the latency of the cache’s tag check, in cycles.

+
+ +
+
+self_type &fill_latency(uint64_t fill_lat_)
+

Specify the latency of the cache fill operation, in cycles.

+
+ +
+
+self_type &tag_bandwidth(champsim::bandwidth::maximum_type max_read_)
+

Specify the bandwidth of the cache’s tag check.

+
+ +
+
+self_type &fill_bandwidth(champsim::bandwidth::maximum_type max_write_)
+

Specify the bandwidth of the cache fill.

+
+ +
+
+self_type &offset_bits(champsim::data::bits offset_bits_)
+

Specify the number of bits to be used as a block offset.

+
+ +
+
+self_type &log2_offset_bits(unsigned log2_offset_bits_)
+

Specify the logarithm of the number of bits to be used as a block offset.

+
+ +
+
+self_type &set_prefetch_as_load()
+

Specify that prefetches should be issued with the same priority as loads.

+
+ +
+
+self_type &reset_prefetch_as_load()
+

Specify that prefetches should be issued with lower priority than loads.

+
+ +
+
+self_type &set_wq_checks_full_addr()
+

Specify that the write queue should check the full address (including the offset) when determining collisions.

+
+ +
+
+self_type &reset_wq_checks_full_addr()
+

Specify that the write queue should ignore the offset bits when determining collisions.

+
+ +
+
+self_type &set_virtual_prefetch()
+

Specify that prefetchers should operate in the virtual address space.

+
+ +
+
+self_type &reset_virtual_prefetch()
+

Specify that prefetchers should operate in the physical address space.

+
+ +
+
+template<typename ...Elems>
self_type &prefetch_activate(Elems... pref_act_elems)
+

Specify the access_type values that should activate the prefetcher.

+
+ +
+
+self_type &upper_levels(std::vector<champsim::channel*> &&uls_)
+

Specify the upper levels to this cache.

+
+ +
+
+self_type &lower_level(champsim::channel *ll_)
+

Specify the lower level of the cache.

+
+ +
+
+self_type &lower_translate(champsim::channel *lt_)
+

Specify the translator (TLB) for this cache.

+
+ +
+
+template<typename ...Ps>
cache_builder<cache_builder_module_type_holder<Ps...>, R> prefetcher()
+

Specify the cache prefetcher.

+
+ +
+
+template<typename ...Rs>
cache_builder<P, cache_builder_module_type_holder<Rs...>> replacement()
+

Specify the cache replacement policy.

+
+ +
+
+ +
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/feature/dynamorio-tracer/Configuration-API.html b/feature/dynamorio-tracer/Configuration-API.html new file mode 100644 index 000000000..e5470316f --- /dev/null +++ b/feature/dynamorio-tracer/Configuration-API.html @@ -0,0 +1,530 @@ + + + + + + + + Configuration API — ChampSim documentation + + + + + + + + + + + + +
+
+
+
+ +
+

Configuration API

+

ChampSim uses an initial configuration step, written in Python, to parse the JSON configuration file into C++ files for +building. +The configuration mechanism can be used programmatically, as a Python module.

+
+

Parsing API

+
+
+config.parse.parse_config(*configs, module_dir=None, branch_dir=None, btb_dir=None, pref_dir=None, repl_dir=None, compile_all_modules=False, verbose=False)
+

This is the main parsing dispatch function. Programmatic use of the configuration system should use this as an entry point.

+
+
Parameters:
+
    +
  • configs – The configurations given here will be joined into a single configuration, then parsed. These configurations may be simply the result of parsing a JSON file, although the root should be a JSON object.

  • +
  • module_dir – A directory to search for all modules. The structure is assumed to follow the same as the ChampSim repository: branch direction predictors are under branch/, replacement policies under replacement/, etc.

  • +
  • branch_dir – A directory to search for branch direction predictors

  • +
  • btb_dir – A directory to search for branch target predictors

  • +
  • pref_dir – A directory to search for prefetchers

  • +
  • repl_dir – A directory to search for replacement policies

  • +
  • compile_all_modules – If true, all modules in the given directories will be compiled. If false, only the module in the configuration will be compiled.

  • +
  • verbose – Print extra verbose output

  • +
+
+
+
+ +
+
+

File Generation API

+

The file generation API contains two interfaces: a high-level interface with config.filewrite.FileWriter, and a low-level interface with config.filewrite.Fragment. +Users should prefer the high-level interface where possible. +The low-level interface may provide greater flexibility when needed, for example a more parallel application.

+
+
+class config.filewrite.FileWriter(bindir_name=None, objdir_name=None, makedir_name=None, verbose=False)
+

This class maintains the state of one or more configurations to be written.

+

This class provides a context manager interface over a set of Fragments, and is more convenient for general use.

+
+
Parameters:
+
    +
  • bindir_name – The default directory for binaries if none is given to write_files().

  • +
  • objdir_name – The default directory for object files if none is given to write_files().

  • +
+
+
+
+
+__enter__()
+

This function forms one half of the context manager interface

+
+ +
+
+__exit__(exc_type, exc_value, traceback)
+

This function terminates the context manager and calls finish().

+
+ +
+
+finish()
+

Write all accumulated configurations to their files.

+
+ +
+
+write_files(parsed_config, bindir_name=None, srcdir_names=None, objdir_name=None, makedir_name=None)
+

Accumulate the results of parsing a configuration into the File Writer. +Parameters passed here will override parameters given in the constructor

+
+
Parameters:
+
    +
  • parsed_config – the result of parsing a configuration file

  • +
  • bindir_name – the directory in which to place the binaries

  • +
  • srcdir_name – the directory to search for source files

  • +
  • objdir_name – the directory to place object files

  • +
+
+
+
+ +
+
+static write_fragments(*fragments)
+

Write out a set of prepared fragments.

+
+ +
+ +
+
+class config.filewrite.Fragment(fileparts=None)
+

Examines the given config and prepares to write the needed files.

+

Programs may use this class for fine-grained control of when and how files are written.

+
+
+static from_config(parsed_config, bindir_name=None, srcdir_names=None, objdir_name=None, makedir_name=None, verbose=False)
+

Produce a sequence of Fragments from the result of parse.parse_config().

+
+
Parameters:
+
    +
  • parsed_config – the result of parsing a configuration file

  • +
  • bindir_name – the directory in which to place the binaries

  • +
  • srcdir_name – the directory to search for source files

  • +
  • objdir_name – the directory to place object files

  • +
  • makedir_name – the directory to place makefiles

  • +
+
+
+
+ +
+
+static join(*frags)
+

Merge multiple Fragments into one.

+
+ +
+
+write(verbose=False)
+

Write the internal series of fragments to file.

+
+ +
+ +
+
+

Utility Functions

+
+

System operations

+

ChampSim’s configuration makes frequent use of sequences of dictionaries. The following functions operate on a system, a dictionary whose values are dictionaries.

+
+
+config.util.iter_system(system, name, key='lower_level')
+

Iterate through a dictionary system.

+

The system is organized as a dictionary of { c[‘name’]: c } for all c. +Starting at the given name, generate a path through the system, traversing by the given key. +Loops are not allowed, each element may be visited at most once.

+
+
Parameters:
+
    +
  • system – the system to be iterated through

  • +
  • name – the key to start at

  • +
  • key – the key that points to the next element

  • +
+
+
+
+ +
+
+config.util.combine_named(*iterables)
+

Collect a sequence of sequences of dictionaries by their ‘name’ parameter. +Earlier parameters have priority over later parameters.

+
+ +
+
+config.util.upper_levels_for(system, name, key='lower_level')
+

List all elements of the system who have the given element name under the given key.

+
+
Parameters:
+
    +
  • system – the system to be iterated through

  • +
  • name – the key to start at

  • +
  • key – the key that points to the next element

  • +
+
+
+
+ +
+
+config.util.propogate_down(path, key)
+

Propogate the value of a key down a path of dictionaries. +Later elements inherit the value from earlier elements, unless they have one themselves.

+
+
Parameters:
+
    +
  • path – an iterable of dictionary values

  • +
  • key – they dictionary key to propogate

  • +
+
+
+
+ +
+
+

Itertools extentions

+

The following functions are extentions of the itertools package.

+
+
+config.util.collect(iterable, key_func, join_func)
+

Perform the “sort->groupby” idiom on an iterable, grouping according to the join_func.

+
+ +
+
+config.util.batch(it, n)
+

A backport of itertools.batch().

+
+ +
+
+config.util.sliding(iterable, n)
+

A backport of itertools.sliding()

+
+ +
+
+config.util.cut(iterable, n=-1)
+

Split an iterable into a head and a tail. The head should be completely consumed before the tail is accesssed.

+
+
Parameters:
+
    +
  • iterable – An iterable

  • +
  • n – The length of the head or, if the value is negative, the length of the tail.

  • +
+
+
+
+ +
+
+config.util.do_for_first(func, iterable)
+

Evaluate the function for the first element in the iterable and yield it. +Then yield the rest of the iterable.

+
+ +
+
+config.util.append_except_last(iterable, suffix)
+

Concatenate a suffix to each element of the iterable except the last one.

+
+ +
+
+config.util.multiline(long_line, length=1, indent=0, line_end=None)
+

Split a long string into lines with n words

+
+ +
+
+config.util.yield_from_star(gen, args, n=2)
+

Python generators can return values when they are finished. +This adaptor yields the values from the generators and collects the returned values into a list.

+
+ +
+
+

Dictionary Operations

+

ChampSim frequently operates on dictionaries, so these functions are provided as convenience functions.

+
+
+config.util.chain(*dicts)
+

Combine two or more dictionaries. +Values that are dictionaries are merged recursively. +Values that are lists are joined.

+

Dictionaries given earlier in the parameter list have priority.

+
>>> chain({ 'a': 1 }, { 'b': 2 })
+{ 'a': 1, 'b': 2 }
+>>> chain({ 'a': 1 }, { 'a': 2 })
+{ 'a': 1 }
+>>> chain({ 'd': { 'a': 1 } }, { 'd': { 'b': 2 } })
+{ 'd': { 'a': 1, 'b': 2 } }
+
+
+
+
Parameters:
+

dicts – the sequence to be chained

+
+
+
+ +
+
+config.util.subdict(whole_dict, keys, invert=False)
+

Extract only the given keys from a dictionary. If they keys are not present, they are not defaulted.

+
+ +
+
+config.util.extend_each(lhs, rhs)
+

For two dictionaries whose values are lists, join the values that have the same key.

+
+ +
+
+config.util.explode(value, in_key, out_key=None)
+

Convert a dictionary with a list member to a list with dictionary members. +:param value: the dictionary to be extracted +:param in_key: the key holding the list +:param out_key: the key to distinguish the resulting list elements

+
+ +
+
+config.parse.duplicate_to_length(elements, count)
+

Duplicate an array of elements, truncating if the sequence is longer than the count

+
>>> duplicate_to_length([1,2,3], 6)
+[1,1,2,2,3,3]
+>>> duplicate_to_length([1,2], 5)
+[1,1,1,2,2]
+>>> duplicate_to_length([1,2,3,4], 3)
+[1,2,3]
+
+
+
+
Parameters:
+
    +
  • elements – the sequence of elements to be duplicated

  • +
  • count – the final length

  • +
+
+
+
+ +
+
+config.parse.extract_element(key, *parents)
+

Extract a certain key from the series of parents, returning the merged keys. +Keys whose values are not dictionaries are ignored.

+
>>> a = { 'key': { 'internal': 1 } }
+>>> b = { 'key': { 'internal': 2 } }
+>>> extract_element('key', a, b)
+{ 'internal': 1 }
+>>> c = { 'key': { 'other': 1 } }
+>>> extract_element('key', a, c)
+{ 'internal': 1, 'other': 1 }
+>>> d = { 'key': 'foo' }
+>>> extract_element('key', a, c, d)
+{ 'internal': 1, 'other': 1 }
+
+
+

If one or more of the parents contains a ‘name’ key, the result will contain a ‘name’ key +with value ‘{parent[“name”]}_{key}’.

+
+
Parameters:
+
    +
  • key – the key to extract

  • +
  • parents – the dictionaries to extract from

  • +
+
+
+
+ +
+
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/feature/dynamorio-tracer/Core-model.html b/feature/dynamorio-tracer/Core-model.html new file mode 100644 index 000000000..ac16d2888 --- /dev/null +++ b/feature/dynamorio-tracer/Core-model.html @@ -0,0 +1,428 @@ + + + + + + + + Core Model — ChampSim documentation + + + + + + + + + + + + +
+
+
+
+ +
+

Core Model

+
+
+class O3_CPU : public champsim::operable
+
+
+struct branch_module_concept
+

Subclassed by O3_CPU::branch_module_model< Bs >

+
+ +
+
+template<typename ...Bs>
struct branch_module_model : public O3_CPU::branch_module_concept
+
+ +
+
+struct btb_module_concept
+

Subclassed by O3_CPU::btb_module_model< Ts >

+
+ +
+
+template<typename ...Ts>
struct btb_module_model : public O3_CPU::btb_module_concept
+
+ +
+
+struct dib_shift
+
+ +
+ +
+

Builder

+
+
+template<typename B = core_builder_module_type_holder<>, typename T = core_builder_module_type_holder<>>
class core_builder : public champsim::detail::core_builder_base
+
+

Public Functions

+
+
+self_type &clock_period(champsim::chrono::picoseconds clock_period_)
+

Specify the core’s clock period.

+
+ +
+
+self_type &dib_set(std::size_t dib_set_)
+

Specify the number of sets in the Decoded Instruction Buffer.

+
+ +
+
+self_type &dib_way(std::size_t dib_way_)
+

Specify the number of ways in the Decoded Instruction Buffer.

+
+ +
+
+self_type &dib_window(std::size_t dib_window_)
+

Specify the size of the window within which Decoded Instruction Buffer entries are equivalent.

+
+ +
+
+self_type &ifetch_buffer_size(std::size_t ifetch_buffer_size_)
+

Specify the maximum size of the instruction fetch buffer.

+
+ +
+
+self_type &decode_buffer_size(std::size_t decode_buffer_size_)
+

Specify the maximum size of the decode buffer.

+
+ +
+
+self_type &dispatch_buffer_size(std::size_t dispatch_buffer_size_)
+

Specify the maximum size of the dispatch buffer.

+
+ +
+
+self_type &dib_hit_buffer_size(std::size_t dib_hit_buffer_size_)
+

Specify the maximum size of the DIB hit buffer.

+
+ +
+
+self_type &register_file_size(std::size_t register_file_size_)
+

Specify the maximum size of the physical register file.

+
+ +
+
+self_type &rob_size(std::size_t rob_size_)
+

Specify the maximum size of the reorder buffer.

+
+ +
+
+self_type &lq_size(std::size_t lq_size_)
+

Specify the maximum size of the load queue.

+
+ +
+
+self_type &sq_size(std::size_t sq_size_)
+

Specify the maximum size of the store queue.

+
+ +
+
+self_type &fetch_width(champsim::bandwidth::maximum_type fetch_width_)
+

Specify the width of the instruction fetch.

+
+ +
+
+self_type &decode_width(champsim::bandwidth::maximum_type decode_width_)
+

Specify the width of the decode.

+
+ +
+
+self_type &dispatch_width(champsim::bandwidth::maximum_type dispatch_width_)
+

Specify the width of the dispatch.

+
+ +
+
+self_type &schedule_width(champsim::bandwidth::maximum_type schedule_width_)
+

Specify the width of the scheduler.

+
+ +
+
+self_type &execute_width(champsim::bandwidth::maximum_type execute_width_)
+

Specify the width of the execution.

+
+ +
+
+self_type &lq_width(champsim::bandwidth::maximum_type lq_width_)
+

Specify the width of the load issue.

+
+ +
+
+self_type &sq_width(champsim::bandwidth::maximum_type sq_width_)
+

Specify the width of the store issue.

+
+ +
+
+self_type &retire_width(champsim::bandwidth::maximum_type retire_width_)
+

Specify the width of the retirement.

+
+ +
+
+self_type &dib_inorder_width(champsim::bandwidth::maximum_type dib_inorder_width_)
+

Specify the maximum size of the DIB inorder width.

+
+ +
+
+self_type &mispredict_penalty(unsigned mispredict_penalty_)
+

Specify the reset penalty, in cycles, that follows a misprediction. Note that this value is in addition to the cost of restarting the pipeline, which will depend on the number of instructions inflight at the time when the misprediction is detected.

+
+ +
+
+self_type &decode_latency(unsigned decode_latency_)
+

Specify the latency of the decode.

+
+ +
+
+self_type &dispatch_latency(unsigned dispatch_latency_)
+

Specify the latency of dispatch.

+
+ +
+
+self_type &schedule_latency(unsigned schedule_latency_)
+

Specify the latency of the scheduler.

+
+ +
+
+self_type &execute_latency(unsigned execute_latency_)
+

Specify the latency of execution.

+
+ +
+
+self_type &dib_hit_latency(unsigned dib_hit_latency_)
+

Specify the latency of execution.

+
+ +
+
+self_type &l1i(CACHE *l1i_)
+

Specify a pointer to the L1I cache. This is only used to transmit branch triggers for prefetcher branch hooks.

+
+ +
+
+self_type &l1i_bandwidth(champsim::bandwidth::maximum_type l1i_bw_)
+

Specify the instruction cache bandwidth.

+
+ +
+
+self_type &l1d_bandwidth(champsim::bandwidth::maximum_type l1d_bw_)
+

Specify the data cache bandwidth.

+
+ +
+
+self_type &fetch_queues(champsim::channel *fetch_queues_)
+

Specify the downstream queues to the instruction cache.

+
+ +
+
+self_type &data_queues(champsim::channel *data_queues_)
+

Specify the downstream queues to the data cache.

+
+ +
+
+template<typename ...Bs>
core_builder<core_builder_module_type_holder<Bs...>, T> branch_predictor()
+

Specify the branch direction predictor.

+
+ +
+
+template<typename ...Ts>
core_builder<B, core_builder_module_type_holder<Ts...>> btb()
+

Specify the branch target predictor.

+
+ +
+
+ +
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/feature/dynamorio-tracer/Creating-a-configuration-file.html b/feature/dynamorio-tracer/Creating-a-configuration-file.html new file mode 100644 index 000000000..974313af6 --- /dev/null +++ b/feature/dynamorio-tracer/Creating-a-configuration-file.html @@ -0,0 +1,309 @@ + + + + + + + + Creating a Configuration File — ChampSim documentation + + + + + + + + + + + + +
+
+
+
+ +
+

Creating a Configuration File

+

The configuration file is a central fixture of the ChampSim build system. +An example configuration file (champsim_config.json) is given in the root of the repository, but it is large and unwieldy. +Your configuration file will likely be much smaller. +This page will walk you through many of the features of the ChampSim configuration system.

+

The configuration file is given as an input to the configuration script as below:

+
./config.sh my_config.json
+
+
+

In fact, the configuration file is entirely optional. +Not specifying any file will configure ChampSim with a default configuration.

+
+

Your first configuration file

+

All ChampSim configuration files are JSON files. +We can start with the most trivial of configuration files.:

+
{
+}
+
+
+

This would specify a default configuration. +But, this is not frequently useful. +Let’s change the branch predictor that ChampSim uses. +Legal values for the branch_predictor key are directory names under the branch/ directory, or valid paths. +The same is true for specifying BTBs in the core and both prefetchers and replacement policies in the cache.:

+
{
+    "branch_predictor": "perceptron"
+}
+
+
+

This configuration file will configure ChampSim with a default configuration, but with a perceptron branch predictor instead. +We can take this further and specify many things about our single-core system.:

+
{
+    "branch_predictor": "perceptron",
+
+    "rob_size": 226, "lq_size": 90, "sq_size": 85,
+    "fetch_width": 6, "decode_width": 6, "lq_width": 2, "sq_width": 1,
+
+    "decode_latency": 3, "execute_latency": 2
+}
+
+
+

Each of these options will specify something about our core. Next, we’ll specify some of our caches.

+
+
+

Cache Configuration

+

We can begin by changing some features of our L1 data cache. +We can specify its size based on the block size, the number of sets, and the number of ways. +The following configuration file specifies a 64 KiB L1 data cache.:

+
{
+    "block_size": 64,
+    "L1D": { "sets": 256, "ways": 4 }
+}
+
+
+

Note that 64 is the default block size, specified here for clarity. +The default prefetcher is the do-nothing prefetcher, and the default replacement policy is LRU, but they can be specified, too.:

+
{
+    "L1D": {
+        "sets": 256, "ways": 4,
+        "prefetcher": "next_line",
+        "replacement": "../../my/repl/path"
+    }
+}
+
+
+

Specifying a cache this way will create an identical L1D for each core in the configuration. +So far, we’ve only handled the single-core case.

+
+
+

Multi-core configurations

+

Multi-core simulations can be enabled by specifying the num_cores key.:

+
{
+    "num_cores": 2
+}
+
+
+

This will create two identical cores with default configurations. +This can be combined with the other specifications that we have made so far to create identical cores.:

+
{
+    "num_cores": 2,
+    "branch_predictor": "perceptron",
+
+    "rob_size": 190,
+
+    "L1D": {
+        "sets": 256, "ways": 4,
+        "prefetcher": "next_line",
+        "replacement": "drrip"
+    }
+}
+
+
+
+
+

Heterogeneous systems

+

ChampSim supports a variety of system configurations, including systems that are not homogeneous. +For example, we could create two cores with different ROB sizes. +Specify all cores in a list under the ooo_cpu key.:

+
{
+    "num_cores": 2,
+    "ooo_cpu": [
+        { "rob_size": 120 },
+        { "rob_size": 240 }
+    ]
+}
+
+
+

Each object in the ooo_cpu list specifies one core, and takes all of the options that we have discussed so far.:

+
{
+    "num_cores": 2,
+    "ooo_cpu": [
+        {
+            "branch_predictor": "bimodal",
+            "rob_size": 120, "lq_size": 90,
+            "L1D": { "prefetcher": "next_line" }
+        },
+        {
+            "branch_predictor": "gshare",
+            "rob_size": 240, "lq_size": 70,
+            "L1D": { "prefetcher": "no" }
+        }
+    ]
+}
+
+
+

Each cache object can also be specified in a list under the caches key. +These caches can then be referred to by their name key. +In the following configuration, each core has a distinct L1 cache.:

+
{
+    "num_cores": 2,
+    "ooo_cpu": [
+        { "L1D": "cacheA" },
+        { "L1D": "cacheB" }
+    ],
+    "caches": [
+        { "name": "cacheA", "replacement": "lru" },
+        { "name": "cacheB", "replacement": "srrip" }
+    ]
+}
+
+
+

The configuration script will make every attempt to assign defaults to objects, but it may not be able to do so for. +In the following configuration, cores 0 and 1 are attached to llcA and cores 2 and 3 are attached to llcB. +The script is able to assign LLC-like defaults to each of the caches specified under "caches":

+
{
+    "num_cores": 4,
+    "ooo_cpu": [
+        { "L2C": { "lower_level": "llcA"} },
+        { "L2C": { "lower_level": "llcB"} }
+    ],
+    "caches": [
+        { "name": "llcA" },
+        { "name": "llcB" }
+    ]
+}
+
+
+

However, in the following, the script will not be able to assign defaults to all caches, and you may need to specify additional parameters:

+
{
+    "num_cores": 8,
+    "ooo_cpu": [
+        { "L2C": { "lower_level": "llcA"} },
+        { "L2C": { "lower_level": "llcB"} }
+    ],
+    "caches": [
+        { "name": "llcA", "lower_level": "L4C" },
+        { "name": "llcB", "lower_level": "L4C" },
+        { "name": "L4C" }
+    ]
+}
+
+
+
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/feature/dynamorio-tracer/Legacy-modules.html b/feature/dynamorio-tracer/Legacy-modules.html new file mode 100644 index 000000000..1e80068fd --- /dev/null +++ b/feature/dynamorio-tracer/Legacy-modules.html @@ -0,0 +1,338 @@ + + + + + + + + The Legacy ChampSim Module System — ChampSim documentation + + + + + + + + + + + +
+
+
+
+ +
+

The Legacy ChampSim Module System

+

Previous versions of ChampSim used the following module system. +Many modules exist in published artifacts, so documentation is included here. +New work should use the updated module system.

+

Legacy modules can be enabled by adding an empty file named “__legacy__” in the same directory as the module sources. +This is the preferred method. +Alternatively, ChampSim can be configured with (for example):

+
{
+    "L2C": {
+        "prefetcher" {
+            "path": "../path/to/module",
+            "legacy": true
+        }
+    }
+}
+
+
+

ChampSim uses four kinds of modules:

+
    +
  • Branch Direction Predictors

  • +
  • Branch Target Predictors

  • +
  • Memory Prefetchers

  • +
  • Cache Replacement Policies

  • +
+

Each of these is implemented as a set of hook functions. Each hook must be implemented, or compilation will fail.

+
+

Branch Predictors

+

A branch predictor module must implement three functions.

+
void O3_CPU::initialize_branch_predictor()
+
+
+

This function is called when the core is initialized. You can use it to initialize elements of dynamic structures, such as std::vector or std::map.

+
uint8_t O3_CPU::predict_branch(uint64_t ip, uint64_t predicted_target, uint8_t always_taken, uint8_t branch_type)
+
+
+

This function is called when a prediction is needed. The parameters passed are:

+
    +
  • ip: The instruction pointer of the branch

  • +
  • predicted_target: The predicted target of the branch. This is passed directly from the branch target predictor module and may be incorrect.

  • +
  • always_taken: A boolean value. This parameter will be nonzero if the branch target predictor determines that the branch is always taken.

  • +
  • branch_type: One of the following

    +
      +
    • BRANCH_DIRECT_JUMP: Direct non-call, unconditional branches, whose target is encoded in the instruction

    • +
    • BRANCH_INDIRECT: Indirect non-call, unconditional branches, whose target is stored in a register

    • +
    • BRANCH_CONDITIONAL: A direct conditional branch

    • +
    • BRANCH_DIRECT_CALL: A call to a procedure whose target is encoded in the instruction

    • +
    • BRANCH_INDIRECT_CALL: A call to a procedure whose target is stored in a register

    • +
    • BRANCH_RETURN: A return to a calling procedure

    • +
    • BRANCH_OTHER: If the branch type cannot be determined

    • +
    +
  • +
+
void O3_CPU::last_branch_result(uint64_t ip, uint64_t branch_target, uint8_t taken, uint8_t branch_type)
+
+
+

This function is called when a branch is resolved. The parameters are the same as in the previous hook, except that the last three are guaranteed to be correct.

+
+
+

Branch Target Buffers

+

A BTB module must implement three functions.

+
void O3_CPU::initialize_btb()
+
+
+

This function is called when the core is initialized. You can use it to initialize elements of dynamic structures, such as std::vector or std::map.

+
std::pair<uint64_t, bool> O3_CPU::btb_prediction(uint64_t ip)
+
+
+

This function is called when a prediction is needed. The parameters passed are:

+
    +
  • ip: The instruction pointer of the branch

  • +
+

The function should return a pair containing the predicted address and a boolean that describes if the branch is known to be always taken. If the prediction fails, the function should return a default-initialized address, e.g. uint64_t{}.

+
void O3_CPU::update_btb(uint64_t ip, uint64_t branch_target, uint8_t taken, uint8_t branch_type)
+
+
+

This function is called when a branch is resolved. The parameters are:

+
    +
  • ip: The instruction pointer of the branch

  • +
  • branch_target: The correct target of the branch.

  • +
  • taken: A boolean value. This parameter will be nonzero if the branch was taken.

  • +
  • branch_type: One of the following

    +
      +
    • BRANCH_DIRECT_JUMP: Direct non-call, unconditional branches, whose target is encoded in the instruction

    • +
    • BRANCH_INDIRECT: Indirect non-call, unconditional branches, whose target is stored in a register

    • +
    • BRANCH_CONDITIONAL: A direct conditional branch

    • +
    • BRANCH_DIRECT_CALL: A call to a procedure whose target is encoded in the instruction

    • +
    • BRANCH_INDIRECT_CALL: A call to a procedure whose target is stored in a register

    • +
    • BRANCH_RETURN: A return to a calling procedure

    • +
    • BRANCH_OTHER: If the branch type cannot be determined

    • +
    +
  • +
+
+
+

Memory Prefetchers

+

A prefetcher module must implement five or six functions.

+
void CACHE::prefetcher_initialize()
+
+
+

This function is called when the cache is initialized. You can use it to initialize elements of dynamic structures, such as std::vector or std::map.

+
uint32_t CACHE::prefetcher_cache_operate(uint64_t addr, uint64_t ip, uint8_t cache_hit, bool useful_prefetch, uint8_t type, uint32_t metadata_in);
+
+
+

This function is called when a tag is checked in the cache. The parameters passed are:

+
    +
  • addr: the address of the packet. If this is the first-level cache, the offset bits are included. Otherwise, the offset bits are zero. If the cache was configured with “virtual_prefetch”: true, this address will be a virtual address. Otherwise, this is a physical address.

  • +
  • ip: the address of the instruction that initiated the demand. If the packet is a prefetch from another level, this value will be 0.

  • +
  • cache_hit: if this tag check is a hit, this value is nonzero. Otherwise, it is 0.

  • +
  • useful_prefetch: if this tag check hit a prior prefetch, this value is true.

  • +
  • type: the result of static_cast<std::underlying_type_t<access_type>>(v) for v in: +* access_type::LOAD +* access_type::RFO +* access_type::PREFETCH +* access_type::WRITE +* access_type::TRANSLATION

  • +
  • metadata_in: the metadata carried along by the packet.

  • +
+

The function should return metadata that will be stored alongside the block.

+
uint32_t CACHE::prefetcher_cache_fill(uint64_t addr, uint32_t set, uint32_way, uint8_t prefetch, uint32_t metadata_in);
+
+
+

This function is called when a miss is filled in the cache. The parameters passed are:

+
    +
  • addr: the address of the packet. If this is the first-level cache, the offset bits are included. Otherwise, the offset bits are zero. If the cache was configured with “virtual_prefetch”: true, this address will be a virtual address. Otherwise, this is a physical address.

  • +
  • set: the set that the fill occurred in

  • +
  • way: the way that the fill occurred in, or this->NUM_WAY if a bypass occurred

  • +
  • prefetch: if this tag check hit a prior prefetch, this value is true.

  • +
  • metadata_in: the metadata carried along by the packet.

  • +
+

The function should return metadata that will be stored alongside the block.

+
void CACHE::prefetcher_cycle_operate();
+
+
+

This function is called each cycle, after all other operation has completed.

+
void CACHE::prefetcher_final_stats();
+
+
+

This function is called at the end of the simulation and can be used to print statistics.

+
void CACHE::prefetcher_branch_operate(uint64_t ip, uint8_t branch_type, uint64_t branch_target);
+
+
+

This function must be implemented by instruction prefetchers. The parameters passed are:

+
    +
  • ip: The instruction pointer of the branch

  • +
  • branch_type: One of the following

    +
      +
    • BRANCH_DIRECT_JUMP: Direct non-call, unconditional branches, whose target is encoded in the instruction

    • +
    • BRANCH_INDIRECT: Indirect non-call, unconditional branches, whose target is stored in a register

    • +
    • BRANCH_CONDITIONAL: A direct conditional branch

    • +
    • BRANCH_DIRECT_CALL: A call to a procedure whose target is encoded in the instruction

    • +
    • BRANCH_INDIRECT_CALL: A call to a procedure whose target is stored in a register

    • +
    • BRANCH_RETURN: A return to a calling procedure

    • +
    • BRANCH_OTHER: If the branch type cannot be determined

    • +
    +
  • +
  • branch_target: The instruction pointer of the target

  • +
+
+
+

Replacement Policies

+

A replacement policy module must implement four functions.

+
void CACHE::initialize_replacement()
+
+
+

This function is called when the cache is initialized. You can use it to initialize elements of dynamic structures, such as std::vector or std::map.

+
uint32_t CACHE::find_victim(uint32_t triggering_cpu, uint64_t instr_id, uint32_t set, const BLOCK* current_set, uint64_t ip, uint64_t addr, uint32_t type);
+
+
+

This function is called when a tag is checked in the cache. The parameters passed are:

+
    +
  • triggering_cpu: the core index that initiated this fill

  • +
  • instr_id: an instruction count that can be used to examine the program order of requests.

  • +
  • set: the set that the fill occurred in.

  • +
  • current_set: a pointer to the beginning of the set being accessed.

  • +
  • ip: the address of the instruction that initiated the demand. If the packet is a prefetch from another level, this value will be 0.

  • +
  • addr: the address of the packet. If this is the first-level cache, the offset bits are included. Otherwise, the offset bits are zero. If the cache was configured with “virtual_prefetch”: true, this address will be a virtual address. Otherwise, this is a physical address.

  • +
  • type: the result of static_cast<std::underlying_type_t<access_type>>(v) for v in:

    +
      +
    • access_type::LOAD

    • +
    • access_type::RFO

    • +
    • access_type::PREFETCH

    • +
    • access_type::WRITE

    • +
    • access_type::TRANSLATION

    • +
    +
  • +
+

The function should return the way index that should be evicted, or this->NUM_WAY to indicate that a bypass should occur.

+
void CACHE::update_replacement_state(uint32_t triggering_cpu, uint32_t set, uint32_t way, uint64_t addr, uint64_t ip, uint64_t victim_addr, uint8_t hit);
+
+
+

This function is called when a hit occurs or a miss is filled in the cache. The parameters passed are:

+
    +
  • triggering_cpu: the core index that initiated this fill

  • +
  • set: the set that the fill occurred in.

  • +
  • way: the way that the fill occurred in.

  • +
  • addr: the address of the packet. If this is the first-level cache, the offset bits are included. Otherwise, the offset bits are zero. If the cache was configured with “virtual_prefetch”: true, this address will be a virtual address. Otherwise, this is a physical address.

  • +
  • ip: the address of the instruction that initiated the demand. If the packet is a prefetch from another level, this value will be 0.

  • +
  • victim_addr: the address of the evicted block, if this is a miss. If this is a hit, the value is 0.

  • +
  • type: the result of static_cast<std::underlying_type_t<access_type>>(v) for v in:

    +
      +
    • access_type::LOAD

    • +
    • access_type::RFO

    • +
    • access_type::PREFETCH

    • +
    • access_type::WRITE

    • +
    • access_type::TRANSLATION

    • +
    +
  • +
+

The function should return metadata that will be stored alongside the block.

+
void CACHE::replacement_final_stats();
+
+
+

This function is called at the end of the simulation and can be used to print statistics.

+
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/feature/dynamorio-tracer/Module-support-library.html b/feature/dynamorio-tracer/Module-support-library.html new file mode 100644 index 000000000..783b38beb --- /dev/null +++ b/feature/dynamorio-tracer/Module-support-library.html @@ -0,0 +1,370 @@ + + + + + + + + Module Support Library — ChampSim documentation + + + + + + + + + + + + +
+
+
+
+ +
+

Module Support Library

+
+

Fixed-width saturating counter

+
+
+template<typename val_type, val_type MAXVAL, val_type MINVAL>
class base_fwcounter
+

A fixed-width saturating counter. All arithmetic operations on this value are clamped between the maximum and minimum values.

+
+
Template Parameters:
+
    +
  • val_type – The underlying representation of the value.

  • +
  • MAXVAL – The maximum to saturate at.

  • +
  • MINVAL – The minimum to saturate at.

  • +
+
+
+
+

Public Functions

+
+
+base_fwcounter<val_type, MAXVAL, MINVAL> &operator++()
+

Increment the value, saturating at the maximum value.

+
+ +
+
+base_fwcounter<val_type, MAXVAL, MINVAL> &operator--()
+

Decrement the value, saturating at the minimum value.

+
+ +
+
+base_fwcounter<val_type, MAXVAL, MINVAL> &operator+=(base_fwcounter<val_type, MAXVAL, MINVAL>)
+

Add the other operand to the wrapped value, saturating at the minimum and maximum.

+
+ +
+
+base_fwcounter<val_type, MAXVAL, MINVAL> &operator-=(base_fwcounter<val_type, MAXVAL, MINVAL>)
+

Subtract the other operand from the wrapped value, saturating at the minimum and maximum.

+
+ +
+
+base_fwcounter<val_type, MAXVAL, MINVAL> &operator*=(base_fwcounter<val_type, MAXVAL, MINVAL>)
+

Multiply the wrapped value by the other operand, saturating at the minimum and maximum.

+
+ +
+
+base_fwcounter<val_type, MAXVAL, MINVAL> &operator/=(base_fwcounter<val_type, MAXVAL, MINVAL>)
+

Divide the wrapped value by the other operand, saturating at the minimum and maximum.

+
+ +
+
+inline bool is_max() const
+

Detect whether the counter is saturated at its maximum.

+
+ +
+
+inline bool is_min() const
+

Detect whether the counter is saturated at its minimum.

+
+ +
+
+inline val_type value() const
+

Unpack the wrapped value.

+
+ +
+
+ +
+
+template<std::size_t WIDTH>
using champsim::msl::fwcounter = base_fwcounter<signed long long int, (1 << WIDTH) - 1, 0>
+
+ +
+
+template<std::size_t WIDTH>
using champsim::msl::sfwcounter = base_fwcounter<signed long long int, (1 << (WIDTH - 1)) - 1, -(1 << (WIDTH - 1))>
+
+ +
+
+

Functions for bit operations

+
+
+template<typename T>
constexpr auto champsim::msl::lg2(T n)
+

Compute the base-2 logarithm of an integer.

+
+ +
+
+template<typename T>
constexpr T champsim::msl::next_pow2(T n)
+

Compute the smallest power of 2 not less than the given integer.

+
+ +
+
+template<typename T>
constexpr bool champsim::msl::is_power_of_2(T n)
+

A backport of std::has_single_bit().

+
+ +
+
+constexpr long long champsim::msl::ipow(long long base, unsigned exp)
+

Compute an integer power. This function may overflow very easily. Use only for small bases or very small exponents.

+
+ +
+
+constexpr uint64_t champsim::msl::bitmask(champsim::data::bits begin, champsim::data::bits end)
+

Produce a mask that can be used in a bitwise-and operation to select particular bits of a number.

+
0xffff & bitmask(8_b,4_b) == 0xf0;
+
+
+

If end is not specified, it is defaulted to 0, that is, the least-significant bit.

+
+

Note

+

This should not be used as a mask generator for address types. Use champsim::address_slice instead.

+
+
+
Parameters:
+
    +
  • begin – The most-significant bit of the mask, not inclusive.

  • +
  • end – The least-significant bit of the mask, inclusive.

  • +
+
+
+
+ +
+
+constexpr uint64_t champsim::msl::bitmask(champsim::data::bits begin)
+

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

+
+ +
+
+constexpr uint64_t champsim::msl::bitmask(std::size_t begin, std::size_t end = 0)
+

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

+
+Deprecated:
+

Users should prefer the overload with champsim::data::bits parameters.

+
+ +

+
+ +
+
+template<typename T>
constexpr auto champsim::msl::splice_bits(T upper, T lower, champsim::data::bits bits_upper, champsim::data::bits bits_lower)
+

Join two values, selecting some bits from one value and some bits from another.

+
splice_bits(0xaaaa, 0xbbbb, 8_b, 4_b) == 0xaaba;
+
+
+

If end is not specified, it is defaulted to 0, that is, the least-significant bit.

+
+

Note

+

This is an implementation detail of champsim::splice(), which should be preferred for address types. This function is provided for general use.

+
+
+
Parameters:
+
    +
  • upper – The operand from which to take the not-selected bits.

  • +
  • lower – The operand from which to take the selected bits.

  • +
  • bits_upper – The most-significant bit of the mask, not inclusive.

  • +
  • bits_lower – The least-significant bit of the mask, inclusive.

  • +
+
+
+
+ +
+
+template<typename T>
constexpr auto champsim::msl::splice_bits(T upper, T lower, champsim::data::bits bits)
+

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

+
+ +
+
+template<typename T>
constexpr auto champsim::msl::splice_bits(T upper, T lower, std::size_t bits_upper, std::size_t bits_lower)
+

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

+
+Deprecated:
+

Users should prefer the overload with champsim::data::bits parameters.

+
+ +

+
+ +
+
+template<typename T>
constexpr auto champsim::msl::splice_bits(T upper, T lower, std::size_t bits)
+

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

+
+Deprecated:
+

Users should prefer the overload with champsim::data::bits parameters.

+
+ +

+
+ +
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/feature/dynamorio-tracer/Modules.html b/feature/dynamorio-tracer/Modules.html new file mode 100644 index 000000000..b459cf2b6 --- /dev/null +++ b/feature/dynamorio-tracer/Modules.html @@ -0,0 +1,636 @@ + + + + + + + + The ChampSim Module System — ChampSim documentation + + + + + + + + + + + + +
+
+
+
+ +
+

The ChampSim Module System

+

ChampSim uses four kinds of modules:

+
    +
  • Branch Direction Predictors

  • +
  • Branch Target Predictors

  • +
  • Memory Prefetchers

  • +
  • Cache Replacement Policies

  • +
+

Modules are implemented as C++ objects. +The module should inherit from one of the following classes:

+
    +
  • champsim::modules::branch_predictor

  • +
  • champsim::modules::btb

  • +
  • champsim::modules::prefetcher

  • +
  • champsim::modules::replacement

  • +
+

The module must be constructible with a O3_CPU* (for branch predictors and BTBs) or a CACHE* (for prefetchers and replacement policies). +Such a constructor must call the superclass constructor of the same kind, for example:

+
class my_pref : champsim::modules::prefetcher
+{
+    public:
+    explicit my_pref(CACHE* cache) : champsim::modules::prefetcher(cache) {}
+};
+
+
+

One way to do this, if your module’s constructor has an empty body, is to inherit the constructors of the superclass, as with:

+
class my_pref : champsim::modules::prefetcher
+{
+    public:
+    using champsim::modules::prefetcher::prefetcher;
+};
+
+
+

A module may implement any of the listed member functions. +If a member function has overloads listed, any of them may be implemented, and the simulator will select the first candidate overload in the list.

+
+

Branch Predictors

+

A branch predictor module may implement three functions.

+
+
+void initialize_branch_predictor()
+

This function is called when the core is initialized. You can use it to initialize elements of dynamic structures, such as std::vector or std::map.

+
+ +
+
+bool predict_branch(champsim::address ip, champsim::address predicted_target, bool always_taken, uint8_t branch_type)
+
+ +
+
+bool predict_branch(uint64_t ip, uint64_t predicted_target, bool always_taken, uint8_t branch_type)
+
+ +
+
+bool predict_branch(champsim::address ip)
+
+ +
+
+bool predict_branch(uint64_t ip)
+

This function is called when a prediction is needed.

+
+
Parameters:
+
    +
  • ip – The instruction pointer of the branch

  • +
  • predicted_target – The predicted target of the branch. +This is passed directly from the branch target predictor module and may be incorrect.

  • +
  • always_taken – A boolean value. +This parameter will be nonzero if the branch target predictor determines that the branch is always taken.

  • +
  • branch_type

    One of the following

    +
      +
    • BRANCH_DIRECT_JUMP: Direct non-call, unconditional branches, whose target is encoded in the instruction

    • +
    • BRANCH_INDIRECT: Indirect non-call, unconditional branches, whose target is stored in a register

    • +
    • BRANCH_CONDITIONAL: A direct conditional branch

    • +
    • BRANCH_DIRECT_CALL: A call to a procedure whose target is encoded in the instruction

    • +
    • BRANCH_INDIRECT_CALL: A call to a procedure whose target is stored in a register

    • +
    • BRANCH_RETURN: A return to a calling procedure

    • +
    • BRANCH_OTHER: If the branch type cannot be determined

    • +
    +

  • +
+
+
Returns:
+

This function must return true if the branch is predicted taken, and false otherwise.

+
+
+
+ +
+
+void last_branch_result(champsim::address ip, champsim::address branch_target, uint8_t taken, uint8_t branch_type)
+
+ +
+
+void last_branch_result(uint64_t ip, uint64_t branch_target, uint8_t taken, uint8_t branch_type)
+

This function is called when a branch is resolved. The parameters are the same as in the previous hook, except that the last three are guaranteed to be correct.

+
+ +
+
+

Branch Target Buffers

+

A BTB module may implement three functions.

+
+
+void initialize_btb()
+

This function is called when the core is initialized. You can use it to initialize elements of dynamic structures, such as std::vector or std::map.

+
+ +
+
+std::pair<champsim::address, bool> btb_prediction(champsim::address ip, uint8_t branch_type)
+
+ +
+
+std::pair<champsim::address, bool> btb_prediction(champsim::address ip)
+
+ +
+
+std::pair<champsim::address, bool> btb_prediction(uint64_t ip, uint8_t branch_type)
+
+ +
+
+std::pair<champsim::address, bool> btb_prediction(uint64_t ip)
+

This function is called when a prediction is needed.

+
+
Parameters:
+
    +
  • ip – The instruction pointer of the branch

  • +
  • branch_type

    One of the following

    +
      +
    • BRANCH_DIRECT_JUMP: Direct non-call, unconditional branches, whose target is encoded in the instruction

    • +
    • BRANCH_INDIRECT: Indirect non-call, unconditional branches, whose target is stored in a register

    • +
    • BRANCH_CONDITIONAL: A direct conditional branch

    • +
    • BRANCH_DIRECT_CALL: A call to a procedure whose target is encoded in the instruction

    • +
    • BRANCH_INDIRECT_CALL: A call to a procedure whose target is stored in a register

    • +
    • BRANCH_RETURN: A return to a calling procedure

    • +
    • BRANCH_OTHER: If the branch type cannot be determined

    • +
    +

  • +
+
+
Returns:
+

The function should return a pair containing the predicted address and a boolean that describes if the branch is known to be always taken. +If the prediction fails, the function should return a default-initialized address, e.g. champsim::address{}.

+
+
+
+ +
+
+void update_btb(champsim::address ip, champsim::address branch_target, bool taken, uint8_t branch_type)
+
+ +
+
+void update_btb(uint64_t ip, uint64_t branch_target, bool taken, uint8_t branch_type)
+

This function is called when a branch is resolved.

+
+
Parameters:
+
    +
  • ip – The instruction pointer of the branch

  • +
  • branch_target – The correct target of the branch.

  • +
  • taken – A boolean value. This parameter will be nonzero if the branch was taken.

  • +
  • branch_type

    One of the following

    +
      +
    • BRANCH_DIRECT_JUMP: Direct non-call, unconditional branches, whose target is encoded in the instruction

    • +
    • BRANCH_INDIRECT: Indirect non-call, unconditional branches, whose target is stored in a register

    • +
    • BRANCH_CONDITIONAL: A direct conditional branch

    • +
    • BRANCH_DIRECT_CALL: A call to a procedure whose target is encoded in the instruction

    • +
    • BRANCH_INDIRECT_CALL: A call to a procedure whose target is stored in a register

    • +
    • BRANCH_RETURN: A return to a calling procedure

    • +
    • BRANCH_OTHER: If the branch type cannot be determined

    • +
    +

  • +
+
+
+
+ +
+
+

Memory Prefetchers

+

A prefetcher module may implement five or six functions.

+
+
+void prefetcher_initialize()
+

This function is called when the cache is initialized. You can use it to initialize elements of dynamic structures, such as std::vector or std::map.

+
+ +
+
+uint32_t prefetcher_cache_operate(champsim::address addr, champsim::address ip, bool cache_hit, bool useful_prefetch, access_type type, uint32_t metadata_in)
+
+ +
+
+uint32_t prefetcher_cache_operate(champsim::address addr, champsim::address ip, bool cache_hit, bool useful_prefetch, uint8_t type, uint32_t metadata_in)
+
+ +
+
+uint32_t prefetcher_cache_operate(uint64_t addr, uint64_t ip, bool cache_hit, uint8_t type, uint32_t metadata_in)
+

This function is called when a tag is checked in the cache.

+
+
Parameters:
+
    +
  • addr – the address of the packet. +If this is the first-level cache, the offset bits are included. +Otherwise, the offset bits are zero. +If the cache was configured with "virtual_prefetch": true, this address will be a virtual address. +Otherwise, this is a physical address.

  • +
  • ip – the address of the instruction that initiated the demand. +If the packet is a prefetch from another level, this value will be 0.

  • +
  • cache_hit – if this tag check is a hit, this value is true.

  • +
  • useful_prefetch – if this tag check hit a prior prefetch, this value is true.

  • +
  • type

    one of the following

    +
      +
    • access_type::LOAD

    • +
    • access_type::RFO

    • +
    • access_type::PREFETCH

    • +
    • access_type::WRITE

    • +
    • access_type::TRANSLATION

    • +
    +

  • +
  • metadata_in – the metadata carried along by the packet.

  • +
+
+
Returns:
+

The function should return metadata that will be stored alongside the block.

+
+
+
+ +
+
+uint32_t prefetcher_cache_fill(champsim::address addr, uint32_t set, uint32_way, bool prefetch, champsim::address evicted_address, uint32_t metadata_in)
+
+ +
+
+uint32_t prefetcher_cache_fill(uint64_t addr, uint32_t set, uint32_way, bool prefetch, uint64_t evicted_address, uint32_t metadata_in)
+

This function is called when a miss is filled in the cache.

+
+
Parameters:
+
    +
  • addr – the address of the packet. +If this is the first-level cache, the offset bits are included. +Otherwise, the offset bits are zero. +If the cache was configured with "virtual_prefetch": true, this address will be a virtual address. +Otherwise, this is a physical address.

  • +
  • set – the set that the fill occurred in

  • +
  • way – the way that the fill occurred in, or this->NUM_WAY if a bypass occurred

  • +
  • prefetch – if this tag check hit a prior prefetch, this value is true.

  • +
  • evicted_address – the address of the evicted block. +If the fill was a bypass, this value will be default-constructed. +If the cache was configured with "virtual_prefetch": true, this address will be a virtual address. +Otherwise, this is a physical address.

  • +
  • metadata_in – the metadata carried along by the packet.

  • +
+
+
Returns:
+

The function should return metadata that will be stored alongside the block.

+
+
+
+ +
+
+void prefetcher_cycle_operate()
+

This function is called each cycle, after all other operation has completed.

+
+ +
+
+void prefetcher_final_stats()
+

This function is called at the end of the simulation and can be used to print statistics.

+
+ +
+
+void prefetcher_branch_operate(champsim::address ip, uint8_t branch_type, champsim::address branch_target)
+
+ +
+
+void prefetcher_branch_operate(uint64_t ip, uint8_t branch_type, uint64_t branch_target)
+

This function may be implemented by instruction prefetchers.

+
+
Parameters:
+
    +
  • ip – The instruction pointer of the branch

  • +
  • branch_type

    One of the following

    +
      +
    • BRANCH_DIRECT_JUMP: Direct non-call, unconditional branches, whose target is encoded in the instruction

    • +
    • BRANCH_INDIRECT: Indirect non-call, unconditional branches, whose target is stored in a register

    • +
    • BRANCH_CONDITIONAL: A direct conditional branch

    • +
    • BRANCH_DIRECT_CALL: A call to a procedure whose target is encoded in the instruction

    • +
    • BRANCH_INDIRECT_CALL: A call to a procedure whose target is stored in a register

    • +
    • BRANCH_RETURN: A return to a calling procedure

    • +
    • BRANCH_OTHER: If the branch type cannot be determined

    • +
    +

  • +
  • branch_target – The instruction pointer of the target

  • +
+
+
+
+ +
+
+

Replacement Policies

+

A replacement policy module may implement five functions.

+
+
+void initialize_replacement()
+

This function is called when the cache is initialized. You can use it to initialize elements of dynamic structures, such as std::vector or std::map.

+
+ +
+
+uint32_t find_victim(uint32_t triggering_cpu, uint64_t instr_id, uint32_t set, const BLOCK *current_set, uint64_t ip, uint64_t addr, access_type type)
+
+ +
+
+uint32_t find_victim(uint32_t triggering_cpu, uint64_t instr_id, uint32_t set, const BLOCK *current_set, uint64_t ip, uint64_t addr, uint32_t type)
+

This function is called when a tag is checked in the cache.

+
+
Parameters:
+
    +
  • triggering_cpu – the core index that initiated this fill

  • +
  • instr_id – an instruction count that can be used to examine the program order of requests.

  • +
  • set – the set that the fill occurred in.

  • +
  • current_set – a pointer to the beginning of the set being accessed.

  • +
  • ip – the address of the instruction that initiated the demand. +If the packet is a prefetch from another level, this value will be 0.

  • +
  • addr – the address of the packet. +If this is the first-level cache, the offset bits are included. +Otherwise, the offset bits are zero. +If the cache was configured with "virtual_prefetch": true, this address will be a virtual address. +Otherwise, this is a physical address.

  • +
  • type

    one of the following

    +
      +
    • access_type::LOAD

    • +
    • access_type::RFO

    • +
    • access_type::PREFETCH

    • +
    • access_type::WRITE

    • +
    • access_type::TRANSLATION

    • +
    +

  • +
+
+
Returns:
+

The function should return the way index that should be evicted, or this->NUM_WAY to indicate that a bypass should occur.

+
+
+
+ +
+
+void replacement_cache_fill(uint32_t triggering_cpu, long set, long way, champsim::address full_addr, champsim::address ip, champsim::address victim_addr, access_type type)
+
+

This function is called when a block is filled in the cache. +It is called with the same timing as find_victim(), but is additionally called when filling an invalid way. +Use of this function should be careful not to misinterpret fills to invalid ways.

+
+
+
Parameters:
+
    +
  • triggering_cpu – the core index that initiated this fill

  • +
  • set – the set that the fill occurred in.

  • +
  • way – the way that the fill occurred in.

  • +
  • full_addr – the address of the packet. +If this is the first-level cache, the offset bits are included. +Otherwise, the offset bits are zero. +If the cache was configured with "virtual_prefetch": true, this address will be a virtual address. +Otherwise, this is a physical address.

  • +
  • ip – the address of the instruction that initiated the demand. +If the packet is a prefetch from another level, this value will be 0.

  • +
  • victim_addr – the address of the evicted block, if this is a miss. +If this is a hit, the value is 0.

  • +
  • type

    one of the following

    +
      +
    • access_type::LOAD

    • +
    • access_type::RFO

    • +
    • access_type::PREFETCH

    • +
    • access_type::WRITE

    • +
    • access_type::TRANSLATION

    • +
    +

  • +
+
+
+
+ +
+
+void update_replacement_state(uint32_t triggering_cpu, long set, long way, champsim::address addr, champsim::address ip, access_type type, bool hit)
+
+ +
+
+void update_replacement_state(uint32_t triggering_cpu, long set, long way, champsim::address addr, champsim::address ip, champsim::address victim_addr, access_type type, bool hit)
+
+ +
+
+void update_replacement_state(uint32_t triggering_cpu, long set, long way, champsim::address addr, champsim::address ip, champsim::address victim_addr, uint32_t type, bool hit)
+
+ +
+
+void update_replacement_state(uint32_t triggering_cpu, long set, long way, uint64_t addr, uint64_t ip, uint64_t victim_addr, bool hit)
+

This function has different behavior depending on whether replacement_cache_fill() is defined. +If it is defined, this function is called when a tag check completes, whether the check is a hit or a miss. +If it is not defined, this function is called on hits and when a miss is filled (that is, with the same timing as replacement_cache_fill()).

+
+
Parameters:
+
    +
  • triggering_cpu – the core index that initiated this fill

  • +
  • set – the set that the fill occurred in.

  • +
  • way – the way that the fill occurred in.

  • +
  • addr – the address of the packet. +If this is the first-level cache, the offset bits are included. +Otherwise, the offset bits are zero. +If the cache was configured with "virtual_prefetch": true, this address will be a virtual address. +Otherwise, this is a physical address.

  • +
  • ip – the address of the instruction that initiated the demand. +If the packet is a prefetch from another level, this value will be 0.

  • +
  • victim_addr – This value will be 0 unless replacement_cache_fill() is not defined and hit is false. +If so, this parameter is the address of the evicted block.

  • +
  • type

    one of the following

    +
      +
    • access_type::LOAD

    • +
    • access_type::RFO

    • +
    • access_type::PREFETCH

    • +
    • access_type::WRITE

    • +
    • access_type::TRANSLATION

    • +
    +

  • +
  • hit – true if the packet hit the cache, false otherwise.

  • +
+
+
+
+ +
+
+void replacement_final_stats()
+

This function is called at the end of the simulation and can be used to print statistics.

+
+ +
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/feature/dynamorio-tracer/Publications-using-champsim.html b/feature/dynamorio-tracer/Publications-using-champsim.html new file mode 100644 index 000000000..f71b2a1ab --- /dev/null +++ b/feature/dynamorio-tracer/Publications-using-champsim.html @@ -0,0 +1,117 @@ + + + + + + + + Publications — ChampSim documentation + + + + + + + + + + +
+
+
+
+ +
+

Publications

+

ChampSim is primarily exhibited in

+
+
    +
  • Nathan Gober, Gino Chacon, Lei Wang, Paul V. Gratz, Daniel A. Jiménez, Elvira Teran, Seth Pugsley, and Jinchun Kim. The championship simulator: architectural simulation for education and competition. 2022. arXiv:2210.14324.

  • +
+
+

Other publications that use ChampSim for their results are listed below:

+
+
    +
  • Gino Chacon, Nathan Gober, Krishnendra Nathella, Paul V. Gratz, and Daniel A. Jiménez. A characterization of the effects of software instruction prefetching on an aggressive front-end. In Proceedings of the 47th Annual International Symposium on Computer Architecture, 61–70. IEEE, 5 2020.

  • +
  • Nathan Gober, Gino Chacon, Daniel A. Jiménez, and Paul V. Gratz. Temporal ancestry prefetcher. In Seth Pugsley, Alaa Alameldeen, Muawya Al-otoom, and Huiyang Zhou, editors, The First Instruction Prefetching Championship. IEEE, 5 2020.

  • +
  • Daniel A. Jiménez, Gino Chacon, Nathan Gober, and Paul V. Gratz. Barca: branch agnostic region searching algorithm. In Seth Pugsley, Alaa Alameldeen, Muawya Al-otoom, and Huiyang Zhou, editors, The First Instruction Prefetching Championship. IEEE, 5 2020.

  • +
  • Eshan Bhatia, Gino Chacon, Seth Pugsley, Elvira Teran, Paul V. Gratz, and Daniel A. Jiménez. Perceptron-based prefetch filtering. In Proceedings of the 47th Annual International Symposium on Computer Architecture, 1–13. Phoenix, Arizona, 6 2019. IEEE. doi:10.1145/3307650.3322207.

  • +
  • Samuel Pakalapati and Biswabandan Panda. Bouquet of instruction pointers: instruction pointer classifier-based spatial hardware prefetching. In Proceedings of the 47th Annual International Symposium on Computer Architecture, 118–131. Phoenix, Arizona, 6 2019. IEEE. doi:10.1109/ISCA45697.2020.00021.

  • +
  • Jinchun Kim, Seth H. Pugsley, Paul V. Gratz, A.L. Narasimha Reddy, Chris Wilkerson, and Zeshan Chishti. Path confidence based lookahead prefetching. In MICRO-49: The 49th Annual IEEE\ACM International Symposium on Microarchitecture, 1–12. Association for Computing Machinery, 10 2016. doi:10.1109/MICRO.2016.7783763.

  • +
+
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/feature/dynamorio-tracer/_sources/Address-operations.rst.txt b/feature/dynamorio-tracer/_sources/Address-operations.rst.txt new file mode 100644 index 000000000..0626344d1 --- /dev/null +++ b/feature/dynamorio-tracer/_sources/Address-operations.rst.txt @@ -0,0 +1,44 @@ +.. _Address_operations: + +======================================= +Address Operations +======================================= + +------------------------------------- +Addresses +------------------------------------- + +.. doxygenclass:: champsim::address_slice + :members: + +.. doxygenfunction:: champsim::offset +.. doxygenfunction:: champsim::uoffset +.. doxygenfunction:: champsim::splice + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Convenience typedefs +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Champsim provides five specializations of an address slice in ``inc/champsim.h`` + +.. doxygentypedef:: champsim::address +.. doxygentypedef:: champsim::page_number +.. doxygentypedef:: champsim::page_offset +.. doxygentypedef:: champsim::block_number +.. doxygentypedef:: champsim::block_offset + +-------------------------------------- +Extents +-------------------------------------- + +.. doxygenstruct:: champsim::static_extent + :members: +.. doxygenstruct:: champsim::dynamic_extent + :members: +.. doxygenstruct:: champsim::page_number_extent + :members: +.. doxygenstruct:: champsim::page_offset_extent + :members: +.. doxygenstruct:: champsim::block_number_extent + :members: +.. doxygenstruct:: champsim::block_offset_extent + :members: diff --git a/feature/dynamorio-tracer/_sources/Bandwidth.rst.txt b/feature/dynamorio-tracer/_sources/Bandwidth.rst.txt new file mode 100644 index 000000000..9b2a31f1e --- /dev/null +++ b/feature/dynamorio-tracer/_sources/Bandwidth.rst.txt @@ -0,0 +1,9 @@ +.. _Bandwidth: + +============================================= +Bandwidth +============================================= + +.. doxygenclass:: champsim::bandwidth + :members: + diff --git a/feature/dynamorio-tracer/_sources/Byte-sizes.rst.txt b/feature/dynamorio-tracer/_sources/Byte-sizes.rst.txt new file mode 100644 index 000000000..30ecafca1 --- /dev/null +++ b/feature/dynamorio-tracer/_sources/Byte-sizes.rst.txt @@ -0,0 +1,45 @@ +.. Byte Sizes: + +=========================================== +Byte Sizes +=========================================== + +ChampSim provides a strong type to represent a unit of byte size. +Objects of this type are convertible to other byte sizes, but are more difficult to unintentionally use in arithmetic operations. + +.. doxygenclass:: champsim::data::size + :members: + +.. doxygenenum:: champsim::data::bits + +----------------------------------------- +Convenience specializations +----------------------------------------- + +ChampSim provides a number of ratio specializations for use in sizes: + +.. doxygentypedef:: champsim::kibi +.. doxygentypedef:: champsim::mebi +.. doxygentypedef:: champsim::gibi +.. doxygentypedef:: champsim::tebi +.. doxygentypedef:: champsim::pebi +.. doxygentypedef:: champsim::exbi + +These types are also used in the convenience specializations: + +.. doxygentypedef:: champsim::data::bytes +.. doxygentypedef:: champsim::data::kibibytes +.. doxygentypedef:: champsim::data::mebibytes +.. doxygentypedef:: champsim::data::gibibytes +.. doxygentypedef:: champsim::data::tebibytes + +------------------------------------------ +Literals +------------------------------------------ + +.. doxygenfunction:: champsim::data::data_literals::operator""_b +.. doxygenfunction:: champsim::data::data_literals::operator""_B +.. doxygenfunction:: champsim::data::data_literals::operator""_kiB +.. doxygenfunction:: champsim::data::data_literals::operator""_MiB +.. doxygenfunction:: champsim::data::data_literals::operator""_GiB +.. doxygenfunction:: champsim::data::data_literals::operator""_TiB diff --git a/feature/dynamorio-tracer/_sources/Cache-model.rst.txt b/feature/dynamorio-tracer/_sources/Cache-model.rst.txt new file mode 100644 index 000000000..e7d6ce573 --- /dev/null +++ b/feature/dynamorio-tracer/_sources/Cache-model.rst.txt @@ -0,0 +1,16 @@ +.. _Cache_model: + +===================================== +Cache Model +===================================== + +.. doxygenclass:: CACHE + :members: + +---------------------------------- +Builder +---------------------------------- + +.. doxygenclass:: champsim::cache_builder + :members: + diff --git a/feature/dynamorio-tracer/_sources/Configuration-API.rst.txt b/feature/dynamorio-tracer/_sources/Configuration-API.rst.txt new file mode 100644 index 000000000..f921c80ba --- /dev/null +++ b/feature/dynamorio-tracer/_sources/Configuration-API.rst.txt @@ -0,0 +1,73 @@ +.. _Configuration_API: + +===================================== +Configuration API +===================================== + +.. automodule:: config + +------------------------ +Parsing API +------------------------ + +.. autofunction:: config.parse.parse_config + + +------------------------ +File Generation API +------------------------ + +The file generation API contains two interfaces: a high-level interface with :py:class:`config.filewrite.FileWriter`, and a low-level interface with :py:class:`config.filewrite.Fragment`. +Users should prefer the high-level interface where possible. +The low-level interface may provide greater flexibility when needed, for example a more parallel application. + +.. autoclass:: config.filewrite.FileWriter + :members: + :special-members: __enter__, __exit__ + +.. autoclass:: config.filewrite.Fragment + :members: + +-------------------------- +Utility Functions +-------------------------- + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +System operations +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +ChampSim's configuration makes frequent use of sequences of dictionaries. The following functions operate on a system, a dictionary whose values are dictionaries. + +.. autofunction:: config.util.iter_system +.. autofunction:: config.util.combine_named +.. autofunction:: config.util.upper_levels_for +.. autofunction:: config.util.propogate_down + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Itertools extentions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following functions are extentions of the itertools package. + +.. autofunction:: config.util.collect +.. autofunction:: config.util.batch +.. autofunction:: config.util.sliding +.. autofunction:: config.util.cut +.. autofunction:: config.util.do_for_first +.. autofunction:: config.util.append_except_last +.. autofunction:: config.util.multiline +.. autofunction:: config.util.yield_from_star + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Dictionary Operations +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +ChampSim frequently operates on dictionaries, so these functions are provided as convenience functions. + +.. autofunction:: config.util.chain +.. autofunction:: config.util.subdict +.. autofunction:: config.util.extend_each +.. autofunction:: config.util.explode +.. autofunction:: config.parse.duplicate_to_length +.. autofunction:: config.parse.extract_element + diff --git a/feature/dynamorio-tracer/_sources/Core-model.rst.txt b/feature/dynamorio-tracer/_sources/Core-model.rst.txt new file mode 100644 index 000000000..475d31108 --- /dev/null +++ b/feature/dynamorio-tracer/_sources/Core-model.rst.txt @@ -0,0 +1,16 @@ +.. _Core_model: + +===================================== +Core Model +===================================== + +.. doxygenclass:: O3_CPU + :members: + +---------------------------------- +Builder +---------------------------------- + +.. doxygenclass:: champsim::core_builder + :members: + diff --git a/feature/dynamorio-tracer/_sources/Creating-a-configuration-file.rst.txt b/feature/dynamorio-tracer/_sources/Creating-a-configuration-file.rst.txt new file mode 100644 index 000000000..ce1a0a669 --- /dev/null +++ b/feature/dynamorio-tracer/_sources/Creating-a-configuration-file.rst.txt @@ -0,0 +1,186 @@ +.. _Creating_Config: + +================================================ +Creating a Configuration File +================================================ + +The configuration file is a central fixture of the ChampSim build system. +An example configuration file (champsim_config.json) is given in the root of the repository, but it is large and unwieldy. +Your configuration file will likely be much smaller. +This page will walk you through many of the features of the ChampSim configuration system. + +The configuration file is given as an input to the configuration script as below:: + + ./config.sh my_config.json + +In fact, the configuration file is entirely optional. +Not specifying any file will configure ChampSim with a default configuration. + +------------------------------- +Your first configuration file +------------------------------- + +All ChampSim configuration files are JSON files. +We can start with the most trivial of configuration files.:: + + { + } + +This would specify a default configuration. +But, this is not frequently useful. +Let's change the branch predictor that ChampSim uses. +Legal values for the ``branch_predictor`` key are directory names under the ``branch/`` directory, or valid paths. +The same is true for specifying BTBs in the core and both prefetchers and replacement policies in the cache.:: + + { + "branch_predictor": "perceptron" + } + +This configuration file will configure ChampSim with a default configuration, but with a perceptron branch predictor instead. +We can take this further and specify many things about our single-core system.:: + + { + "branch_predictor": "perceptron", + + "rob_size": 226, "lq_size": 90, "sq_size": 85, + "fetch_width": 6, "decode_width": 6, "lq_width": 2, "sq_width": 1, + + "decode_latency": 3, "execute_latency": 2 + } + +Each of these options will specify something about our core. Next, we'll specify some of our caches. + +--------------------- +Cache Configuration +--------------------- + +We can begin by changing some features of our L1 data cache. +We can specify its size based on the block size, the number of sets, and the number of ways. +The following configuration file specifies a 64 KiB L1 data cache.:: + + { + "block_size": 64, + "L1D": { "sets": 256, "ways": 4 } + } + +Note that 64 is the default block size, specified here for clarity. +The default prefetcher is the do-nothing prefetcher, and the default replacement policy is LRU, but they can be specified, too.:: + + { + "L1D": { + "sets": 256, "ways": 4, + "prefetcher": "next_line", + "replacement": "../../my/repl/path" + } + } + +Specifying a cache this way will create an identical L1D for each core in the configuration. +So far, we've only handled the single-core case. + +-------------------------- +Multi-core configurations +-------------------------- + +Multi-core simulations can be enabled by specifying the ``num_cores`` key.:: + + { + "num_cores": 2 + } + +This will create two identical cores with default configurations. +This can be combined with the other specifications that we have made so far to create identical cores.:: + + { + "num_cores": 2, + "branch_predictor": "perceptron", + + "rob_size": 190, + + "L1D": { + "sets": 256, "ways": 4, + "prefetcher": "next_line", + "replacement": "drrip" + } + } + +----------------------- +Heterogeneous systems +----------------------- + +ChampSim supports a variety of system configurations, including systems that are not homogeneous. +For example, we could create two cores with different ROB sizes. +Specify all cores in a list under the ``ooo_cpu`` key.:: + + { + "num_cores": 2, + "ooo_cpu": [ + { "rob_size": 120 }, + { "rob_size": 240 } + ] + } + +Each object in the ``ooo_cpu`` list specifies one core, and takes all of the options that we have discussed so far.:: + + + { + "num_cores": 2, + "ooo_cpu": [ + { + "branch_predictor": "bimodal", + "rob_size": 120, "lq_size": 90, + "L1D": { "prefetcher": "next_line" } + }, + { + "branch_predictor": "gshare", + "rob_size": 240, "lq_size": 70, + "L1D": { "prefetcher": "no" } + } + ] + } + +Each cache object can also be specified in a list under the ``caches`` key. +These caches can then be referred to by their ``name`` key. +In the following configuration, each core has a distinct L1 cache.:: + + { + "num_cores": 2, + "ooo_cpu": [ + { "L1D": "cacheA" }, + { "L1D": "cacheB" } + ], + "caches": [ + { "name": "cacheA", "replacement": "lru" }, + { "name": "cacheB", "replacement": "srrip" } + ] + } + +The configuration script will make every attempt to assign defaults to objects, but it may not be able to do so for. +In the following configuration, cores 0 and 1 are attached to ``llcA`` and cores 2 and 3 are attached to ``llcB``. +The script is able to assign LLC-like defaults to each of the caches specified under ``"caches"``:: + + { + "num_cores": 4, + "ooo_cpu": [ + { "L2C": { "lower_level": "llcA"} }, + { "L2C": { "lower_level": "llcB"} } + ], + "caches": [ + { "name": "llcA" }, + { "name": "llcB" } + ] + } + +However, in the following, the script will not be able to assign defaults to all caches, and you may need to specify additional parameters:: + + { + "num_cores": 8, + "ooo_cpu": [ + { "L2C": { "lower_level": "llcA"} }, + { "L2C": { "lower_level": "llcB"} } + ], + "caches": [ + { "name": "llcA", "lower_level": "L4C" }, + { "name": "llcB", "lower_level": "L4C" }, + { "name": "L4C" } + ] + } diff --git a/feature/dynamorio-tracer/_sources/Legacy-modules.rst.txt b/feature/dynamorio-tracer/_sources/Legacy-modules.rst.txt new file mode 100644 index 000000000..9ca388c48 --- /dev/null +++ b/feature/dynamorio-tracer/_sources/Legacy-modules.rst.txt @@ -0,0 +1,256 @@ +.. _Legacy_Modules: + +==================================== +The Legacy ChampSim Module System +==================================== + +Previous versions of ChampSim used the following module system. +Many modules exist in published artifacts, so documentation is included here. +New work should use the updated module system. + +Legacy modules can be enabled by adding an empty file named "__legacy__" in the same directory as the module sources. +This is the preferred method. +Alternatively, ChampSim can be configured with (for example):: + + { + "L2C": { + "prefetcher" { + "path": "../path/to/module", + "legacy": true + } + } + } + +ChampSim uses four kinds of modules: + +* Branch Direction Predictors +* Branch Target Predictors +* Memory Prefetchers +* Cache Replacement Policies + +Each of these is implemented as a set of hook functions. Each hook must be implemented, or compilation will fail. + +---------------------------- +Branch Predictors +---------------------------- + +A branch predictor module must implement three functions. + +:: + + void O3_CPU::initialize_branch_predictor() + +This function is called when the core is initialized. You can use it to initialize elements of dynamic structures, such as `std::vector` or `std::map`. + +:: + + uint8_t O3_CPU::predict_branch(uint64_t ip, uint64_t predicted_target, uint8_t always_taken, uint8_t branch_type) + +This function is called when a prediction is needed. The parameters passed are: + +* ip: The instruction pointer of the branch +* predicted_target: The predicted target of the branch. This is passed directly from the branch target predictor module and may be incorrect. +* always_taken: A boolean value. This parameter will be nonzero if the branch target predictor determines that the branch is always taken. +* branch_type: One of the following + + * `BRANCH_DIRECT_JUMP`: Direct non-call, unconditional branches, whose target is encoded in the instruction + * `BRANCH_INDIRECT`: Indirect non-call, unconditional branches, whose target is stored in a register + * `BRANCH_CONDITIONAL`: A direct conditional branch + * `BRANCH_DIRECT_CALL`: A call to a procedure whose target is encoded in the instruction + * `BRANCH_INDIRECT_CALL`: A call to a procedure whose target is stored in a register + * `BRANCH_RETURN`: A return to a calling procedure + * `BRANCH_OTHER`: If the branch type cannot be determined + +:: + + void O3_CPU::last_branch_result(uint64_t ip, uint64_t branch_target, uint8_t taken, uint8_t branch_type) + + +This function is called when a branch is resolved. The parameters are the same as in the previous hook, except that the last three are guaranteed to be correct. + +----------------------------------- +Branch Target Buffers +----------------------------------- + +A BTB module must implement three functions. + +:: + + void O3_CPU::initialize_btb() + +This function is called when the core is initialized. You can use it to initialize elements of dynamic structures, such as `std::vector` or `std::map`. + +:: + + std::pair O3_CPU::btb_prediction(uint64_t ip) + +This function is called when a prediction is needed. The parameters passed are: + +* ip: The instruction pointer of the branch + +The function should return a pair containing the predicted address and a boolean that describes if the branch is known to be always taken. If the prediction fails, the function should return a default-initialized address, e.g. `uint64_t{}`. + +:: + + void O3_CPU::update_btb(uint64_t ip, uint64_t branch_target, uint8_t taken, uint8_t branch_type) + + +This function is called when a branch is resolved. The parameters are: + +* ip: The instruction pointer of the branch +* branch_target: The correct target of the branch. +* taken: A boolean value. This parameter will be nonzero if the branch was taken. +* branch_type: One of the following + + * `BRANCH_DIRECT_JUMP`: Direct non-call, unconditional branches, whose target is encoded in the instruction + * `BRANCH_INDIRECT`: Indirect non-call, unconditional branches, whose target is stored in a register + * `BRANCH_CONDITIONAL`: A direct conditional branch + * `BRANCH_DIRECT_CALL`: A call to a procedure whose target is encoded in the instruction + * `BRANCH_INDIRECT_CALL`: A call to a procedure whose target is stored in a register + * `BRANCH_RETURN`: A return to a calling procedure + * `BRANCH_OTHER`: If the branch type cannot be determined + +----------------------------------- +Memory Prefetchers +----------------------------------- + +A prefetcher module must implement five or six functions. + +:: + + void CACHE::prefetcher_initialize() + +This function is called when the cache is initialized. You can use it to initialize elements of dynamic structures, such as `std::vector` or `std::map`. + +:: + + uint32_t CACHE::prefetcher_cache_operate(uint64_t addr, uint64_t ip, uint8_t cache_hit, bool useful_prefetch, uint8_t type, uint32_t metadata_in); + +This function is called when a tag is checked in the cache. The parameters passed are: + +* addr: the address of the packet. If this is the first-level cache, the offset bits are included. Otherwise, the offset bits are zero. If the cache was configured with `"virtual_prefetch": true`, this address will be a virtual address. Otherwise, this is a physical address. +* ip: the address of the instruction that initiated the demand. If the packet is a prefetch from another level, this value will be 0. +* cache_hit: if this tag check is a hit, this value is nonzero. Otherwise, it is 0. +* useful_prefetch: if this tag check hit a prior prefetch, this value is true. +* type: the result of `static_cast>(v)` for v in: + * `access_type::LOAD` + * `access_type::RFO` + * `access_type::PREFETCH` + * `access_type::WRITE` + * `access_type::TRANSLATION` +* metadata_in: the metadata carried along by the packet. + +The function should return metadata that will be stored alongside the block. + +:: + + uint32_t CACHE::prefetcher_cache_fill(uint64_t addr, uint32_t set, uint32_way, uint8_t prefetch, uint32_t metadata_in); + +This function is called when a miss is filled in the cache. The parameters passed are: + +* addr: the address of the packet. If this is the first-level cache, the offset bits are included. Otherwise, the offset bits are zero. If the cache was configured with `"virtual_prefetch": true`, this address will be a virtual address. Otherwise, this is a physical address. +* set: the set that the fill occurred in +* way: the way that the fill occurred in, or `this->NUM_WAY` if a bypass occurred +* prefetch: if this tag check hit a prior prefetch, this value is true. +* metadata_in: the metadata carried along by the packet. + +The function should return metadata that will be stored alongside the block. + +:: + + void CACHE::prefetcher_cycle_operate(); + + +This function is called each cycle, after all other operation has completed. + +:: + + void CACHE::prefetcher_final_stats(); + + +This function is called at the end of the simulation and can be used to print statistics. + + +:: + + void CACHE::prefetcher_branch_operate(uint64_t ip, uint8_t branch_type, uint64_t branch_target); + + +This function must be implemented by instruction prefetchers. The parameters passed are: + +* ip: The instruction pointer of the branch +* branch_type: One of the following + + * `BRANCH_DIRECT_JUMP`: Direct non-call, unconditional branches, whose target is encoded in the instruction + * `BRANCH_INDIRECT`: Indirect non-call, unconditional branches, whose target is stored in a register + * `BRANCH_CONDITIONAL`: A direct conditional branch + * `BRANCH_DIRECT_CALL`: A call to a procedure whose target is encoded in the instruction + * `BRANCH_INDIRECT_CALL`: A call to a procedure whose target is stored in a register + * `BRANCH_RETURN`: A return to a calling procedure + * `BRANCH_OTHER`: If the branch type cannot be determined + +* branch_target: The instruction pointer of the target + +----------------------------------- +Replacement Policies +----------------------------------- + +A replacement policy module must implement four functions. + +:: + + void CACHE::initialize_replacement() + +This function is called when the cache is initialized. You can use it to initialize elements of dynamic structures, such as `std::vector` or `std::map`. + +:: + + uint32_t CACHE::find_victim(uint32_t triggering_cpu, uint64_t instr_id, uint32_t set, const BLOCK* current_set, uint64_t ip, uint64_t addr, uint32_t type); + +This function is called when a tag is checked in the cache. The parameters passed are: + +* triggering_cpu: the core index that initiated this fill +* instr_id: an instruction count that can be used to examine the program order of requests. +* set: the set that the fill occurred in. +* current_set: a pointer to the beginning of the set being accessed. +* ip: the address of the instruction that initiated the demand. If the packet is a prefetch from another level, this value will be 0. +* addr: the address of the packet. If this is the first-level cache, the offset bits are included. Otherwise, the offset bits are zero. If the cache was configured with `"virtual_prefetch": true`, this address will be a virtual address. Otherwise, this is a physical address. +* type: the result of `static_cast>(v)` for v in: + + * `access_type::LOAD` + * `access_type::RFO` + * `access_type::PREFETCH` + * `access_type::WRITE` + * `access_type::TRANSLATION` + +The function should return the way index that should be evicted, or `this->NUM_WAY` to indicate that a bypass should occur. + +:: + + void CACHE::update_replacement_state(uint32_t triggering_cpu, uint32_t set, uint32_t way, uint64_t addr, uint64_t ip, uint64_t victim_addr, uint8_t hit); + +This function is called when a hit occurs or a miss is filled in the cache. The parameters passed are: + +* triggering_cpu: the core index that initiated this fill +* set: the set that the fill occurred in. +* way: the way that the fill occurred in. +* addr: the address of the packet. If this is the first-level cache, the offset bits are included. Otherwise, the offset bits are zero. If the cache was configured with `"virtual_prefetch": true`, this address will be a virtual address. Otherwise, this is a physical address. +* ip: the address of the instruction that initiated the demand. If the packet is a prefetch from another level, this value will be 0. +* victim_addr: the address of the evicted block, if this is a miss. If this is a hit, the value is 0. +* type: the result of `static_cast>(v)` for v in: + + * `access_type::LOAD` + * `access_type::RFO` + * `access_type::PREFETCH` + * `access_type::WRITE` + * `access_type::TRANSLATION` + +The function should return metadata that will be stored alongside the block. + +:: + + void CACHE::replacement_final_stats(); + + +This function is called at the end of the simulation and can be used to print statistics. + diff --git a/feature/dynamorio-tracer/_sources/Module-support-library.rst.txt b/feature/dynamorio-tracer/_sources/Module-support-library.rst.txt new file mode 100644 index 000000000..81ae5da3c --- /dev/null +++ b/feature/dynamorio-tracer/_sources/Module-support-library.rst.txt @@ -0,0 +1,31 @@ +.. _Module_support_library: + +========================================= +Module Support Library +========================================= + +----------------------------------------- +Fixed-width saturating counter +----------------------------------------- + +.. doxygenclass:: champsim::msl::base_fwcounter + :members: + +.. doxygentypedef:: champsim::msl::fwcounter +.. doxygentypedef:: champsim::msl::sfwcounter + +------------------------------------------ +Functions for bit operations +------------------------------------------ + +.. doxygenfunction:: champsim::msl::lg2 +.. doxygenfunction:: champsim::msl::next_pow2 +.. doxygenfunction:: champsim::msl::is_power_of_2 +.. doxygenfunction:: champsim::msl::ipow +.. doxygenfunction:: champsim::msl::bitmask(champsim::data::bits, champsim::data::bits) +.. doxygenfunction:: champsim::msl::bitmask(champsim::data::bits) +.. doxygenfunction:: champsim::msl::bitmask(std::size_t, std::size_t) +.. doxygenfunction:: champsim::msl::splice_bits(T, T, champsim::data::bits, champsim::data::bits) +.. doxygenfunction:: champsim::msl::splice_bits(T, T, champsim::data::bits) +.. doxygenfunction:: champsim::msl::splice_bits(T, T, std::size_t, std::size_t) +.. doxygenfunction:: champsim::msl::splice_bits(T, T, std::size_t) diff --git a/feature/dynamorio-tracer/_sources/Modules.rst.txt b/feature/dynamorio-tracer/_sources/Modules.rst.txt new file mode 100644 index 000000000..a0b27a355 --- /dev/null +++ b/feature/dynamorio-tracer/_sources/Modules.rst.txt @@ -0,0 +1,313 @@ +.. _Modules: + +==================================== +The ChampSim Module System +==================================== + +ChampSim uses four kinds of modules: + +* Branch Direction Predictors +* Branch Target Predictors +* Memory Prefetchers +* Cache Replacement Policies + +Modules are implemented as C++ objects. +The module should inherit from one of the following classes: + +* ``champsim::modules::branch_predictor`` +* ``champsim::modules::btb`` +* ``champsim::modules::prefetcher`` +* ``champsim::modules::replacement`` + +The module must be constructible with a ``O3_CPU*`` (for branch predictors and BTBs) or a ``CACHE*`` (for prefetchers and replacement policies). +Such a constructor must call the superclass constructor of the same kind, for example:: + + class my_pref : champsim::modules::prefetcher + { + public: + explicit my_pref(CACHE* cache) : champsim::modules::prefetcher(cache) {} + }; + +One way to do this, if your module's constructor has an empty body, is to inherit the constructors of the superclass, as with:: + + class my_pref : champsim::modules::prefetcher + { + public: + using champsim::modules::prefetcher::prefetcher; + }; + +A module may implement any of the listed member functions. +If a member function has overloads listed, any of them may be implemented, and the simulator will select the first candidate overload in the list. + +---------------------------- +Branch Predictors +---------------------------- + +A branch predictor module may implement three functions. + +.. cpp:function:: void initialize_branch_predictor() + + This function is called when the core is initialized. You can use it to initialize elements of dynamic structures, such as ``std::vector`` or ``std::map``. + +.. cpp:function:: bool predict_branch(champsim::address ip, champsim::address predicted_target, bool always_taken, uint8_t branch_type) +.. cpp:function:: bool predict_branch(uint64_t ip, uint64_t predicted_target, bool always_taken, uint8_t branch_type) +.. cpp:function:: bool predict_branch(champsim::address ip) +.. cpp:function:: bool predict_branch(uint64_t ip) + + This function is called when a prediction is needed. + + :param ip: The instruction pointer of the branch + :param predicted_target: The predicted target of the branch. + This is passed directly from the branch target predictor module and may be incorrect. + :param always_taken: A boolean value. + This parameter will be nonzero if the branch target predictor determines that the branch is always taken. + :param branch_type: One of the following + + * ``BRANCH_DIRECT_JUMP``: Direct non-call, unconditional branches, whose target is encoded in the instruction + * ``BRANCH_INDIRECT``: Indirect non-call, unconditional branches, whose target is stored in a register + * ``BRANCH_CONDITIONAL``: A direct conditional branch + * ``BRANCH_DIRECT_CALL``: A call to a procedure whose target is encoded in the instruction + * ``BRANCH_INDIRECT_CALL``: A call to a procedure whose target is stored in a register + * ``BRANCH_RETURN``: A return to a calling procedure + * ``BRANCH_OTHER``: If the branch type cannot be determined + + :return: This function must return true if the branch is predicted taken, and false otherwise. + +.. cpp:function:: void last_branch_result(champsim::address ip, champsim::address branch_target, uint8_t taken, uint8_t branch_type) +.. cpp:function:: void last_branch_result(uint64_t ip, uint64_t branch_target, uint8_t taken, uint8_t branch_type) + + This function is called when a branch is resolved. The parameters are the same as in the previous hook, except that the last three are guaranteed to be correct. + +----------------------------------- +Branch Target Buffers +----------------------------------- + +A BTB module may implement three functions. + +.. cpp:function:: void initialize_btb() + + This function is called when the core is initialized. You can use it to initialize elements of dynamic structures, such as ``std::vector`` or ``std::map``. + +.. cpp:function:: std::pair btb_prediction(champsim::address ip, uint8_t branch_type) +.. cpp:function:: std::pair btb_prediction(champsim::address ip) +.. cpp:function:: std::pair btb_prediction(uint64_t ip, uint8_t branch_type) +.. cpp:function:: std::pair btb_prediction(uint64_t ip) + + This function is called when a prediction is needed. + + :param ip: The instruction pointer of the branch + :param branch_type: One of the following + + * ``BRANCH_DIRECT_JUMP``: Direct non-call, unconditional branches, whose target is encoded in the instruction + * ``BRANCH_INDIRECT``: Indirect non-call, unconditional branches, whose target is stored in a register + * ``BRANCH_CONDITIONAL``: A direct conditional branch + * ``BRANCH_DIRECT_CALL``: A call to a procedure whose target is encoded in the instruction + * ``BRANCH_INDIRECT_CALL``: A call to a procedure whose target is stored in a register + * ``BRANCH_RETURN``: A return to a calling procedure + * ``BRANCH_OTHER``: If the branch type cannot be determined + + :return: The function should return a pair containing the predicted address and a boolean that describes if the branch is known to be always taken. + If the prediction fails, the function should return a default-initialized address, e.g. ``champsim::address{}``. + +.. cpp:function:: void update_btb(champsim::address ip, champsim::address branch_target, bool taken, uint8_t branch_type) +.. cpp:function:: void update_btb(uint64_t ip, uint64_t branch_target, bool taken, uint8_t branch_type) + + This function is called when a branch is resolved. + + :param ip: The instruction pointer of the branch + :param branch_target: The correct target of the branch. + :param taken: A boolean value. This parameter will be nonzero if the branch was taken. + :param branch_type: One of the following + + * ``BRANCH_DIRECT_JUMP``: Direct non-call, unconditional branches, whose target is encoded in the instruction + * ``BRANCH_INDIRECT``: Indirect non-call, unconditional branches, whose target is stored in a register + * ``BRANCH_CONDITIONAL``: A direct conditional branch + * ``BRANCH_DIRECT_CALL``: A call to a procedure whose target is encoded in the instruction + * ``BRANCH_INDIRECT_CALL``: A call to a procedure whose target is stored in a register + * ``BRANCH_RETURN``: A return to a calling procedure + * ``BRANCH_OTHER``: If the branch type cannot be determined + +----------------------------------- +Memory Prefetchers +----------------------------------- + +A prefetcher module may implement five or six functions. + +.. cpp:function:: void prefetcher_initialize() + + This function is called when the cache is initialized. You can use it to initialize elements of dynamic structures, such as ``std::vector`` or ``std::map``. + +.. cpp:function:: uint32_t prefetcher_cache_operate(champsim::address addr, champsim::address ip, bool cache_hit, bool useful_prefetch, access_type type, uint32_t metadata_in) +.. cpp:function:: uint32_t prefetcher_cache_operate(champsim::address addr, champsim::address ip, bool cache_hit, bool useful_prefetch, uint8_t type, uint32_t metadata_in) +.. cpp:function:: uint32_t prefetcher_cache_operate(uint64_t addr, uint64_t ip, bool cache_hit, uint8_t type, uint32_t metadata_in) + + This function is called when a tag is checked in the cache. + + :param addr: the address of the packet. + If this is the first-level cache, the offset bits are included. + Otherwise, the offset bits are zero. + If the cache was configured with ``"virtual_prefetch": true``, this address will be a virtual address. + Otherwise, this is a physical address. + :param ip: the address of the instruction that initiated the demand. + If the packet is a prefetch from another level, this value will be 0. + :param cache_hit: if this tag check is a hit, this value is true. + :param useful_prefetch: if this tag check hit a prior prefetch, this value is true. + :param type: one of the following + + * ``access_type::LOAD`` + * ``access_type::RFO`` + * ``access_type::PREFETCH`` + * ``access_type::WRITE`` + * ``access_type::TRANSLATION`` + + :param metadata_in: the metadata carried along by the packet. + + :return: The function should return metadata that will be stored alongside the block. + +.. cpp:function:: uint32_t prefetcher_cache_fill(champsim::address addr, uint32_t set, uint32_way, bool prefetch, champsim::address evicted_address, uint32_t metadata_in) +.. cpp:function:: uint32_t prefetcher_cache_fill(uint64_t addr, uint32_t set, uint32_way, bool prefetch, uint64_t evicted_address, uint32_t metadata_in) + + This function is called when a miss is filled in the cache. + + :param addr: the address of the packet. + If this is the first-level cache, the offset bits are included. + Otherwise, the offset bits are zero. + If the cache was configured with ``"virtual_prefetch": true``, this address will be a virtual address. + Otherwise, this is a physical address. + :param set: the set that the fill occurred in + :param way: the way that the fill occurred in, or ``this->NUM_WAY`` if a bypass occurred + :param prefetch: if this tag check hit a prior prefetch, this value is true. + :param evicted_address: the address of the evicted block. + If the fill was a bypass, this value will be default-constructed. + If the cache was configured with ``"virtual_prefetch": true``, this address will be a virtual address. + Otherwise, this is a physical address. + :param metadata_in: the metadata carried along by the packet. + + :return: The function should return metadata that will be stored alongside the block. + +.. cpp:function:: void prefetcher_cycle_operate() + + + This function is called each cycle, after all other operation has completed. + +.. cpp:function:: void prefetcher_final_stats() + + + This function is called at the end of the simulation and can be used to print statistics. + + +.. cpp:function:: void prefetcher_branch_operate(champsim::address ip, uint8_t branch_type, champsim::address branch_target) +.. cpp:function:: void prefetcher_branch_operate(uint64_t ip, uint8_t branch_type, uint64_t branch_target) + + + This function may be implemented by instruction prefetchers. + + :param ip: The instruction pointer of the branch + :param branch_type: One of the following + + * ``BRANCH_DIRECT_JUMP``: Direct non-call, unconditional branches, whose target is encoded in the instruction + * ``BRANCH_INDIRECT``: Indirect non-call, unconditional branches, whose target is stored in a register + * ``BRANCH_CONDITIONAL``: A direct conditional branch + * ``BRANCH_DIRECT_CALL``: A call to a procedure whose target is encoded in the instruction + * ``BRANCH_INDIRECT_CALL``: A call to a procedure whose target is stored in a register + * ``BRANCH_RETURN``: A return to a calling procedure + * ``BRANCH_OTHER``: If the branch type cannot be determined + + :param branch_target: The instruction pointer of the target + +----------------------------------- +Replacement Policies +----------------------------------- + +A replacement policy module may implement five functions. + +.. cpp:function:: void initialize_replacement() + + This function is called when the cache is initialized. You can use it to initialize elements of dynamic structures, such as ``std::vector`` or ``std::map``. + +.. cpp:function:: uint32_t find_victim(uint32_t triggering_cpu, uint64_t instr_id, uint32_t set, const BLOCK* current_set, uint64_t ip, uint64_t addr, access_type type) +.. cpp:function:: uint32_t find_victim(uint32_t triggering_cpu, uint64_t instr_id, uint32_t set, const BLOCK* current_set, uint64_t ip, uint64_t addr, uint32_t type) + + This function is called when a tag is checked in the cache. + + :param triggering_cpu: the core index that initiated this fill + :param instr_id: an instruction count that can be used to examine the program order of requests. + :param set: the set that the fill occurred in. + :param current_set: a pointer to the beginning of the set being accessed. + :param ip: the address of the instruction that initiated the demand. + If the packet is a prefetch from another level, this value will be 0. + :param addr: the address of the packet. + If this is the first-level cache, the offset bits are included. + Otherwise, the offset bits are zero. + If the cache was configured with ``"virtual_prefetch": true``, this address will be a virtual address. + Otherwise, this is a physical address. + :param type: one of the following + + * ``access_type::LOAD`` + * ``access_type::RFO`` + * ``access_type::PREFETCH`` + * ``access_type::WRITE`` + * ``access_type::TRANSLATION`` + + :return: The function should return the way index that should be evicted, or ``this->NUM_WAY`` to indicate that a bypass should occur. + +.. cpp:function:: void replacement_cache_fill(uint32_t triggering_cpu, long set, long way, champsim::address full_addr, champsim::address ip, champsim::address victim_addr, access_type type) + + This function is called when a block is filled in the cache. + It is called with the same timing as ``find_victim()``, but is additionally called when filling an invalid way. + Use of this function should be careful not to misinterpret fills to invalid ways. + + :param triggering_cpu: the core index that initiated this fill + :param set: the set that the fill occurred in. + :param way: the way that the fill occurred in. + :param full_addr: the address of the packet. + If this is the first-level cache, the offset bits are included. + Otherwise, the offset bits are zero. + If the cache was configured with ``"virtual_prefetch": true``, this address will be a virtual address. + Otherwise, this is a physical address. + :param ip: the address of the instruction that initiated the demand. + If the packet is a prefetch from another level, this value will be 0. + :param victim_addr: the address of the evicted block, if this is a miss. + If this is a hit, the value is 0. + :param type: one of the following + + * ``access_type::LOAD`` + * ``access_type::RFO`` + * ``access_type::PREFETCH`` + * ``access_type::WRITE`` + * ``access_type::TRANSLATION`` + +.. cpp:function:: void update_replacement_state(uint32_t triggering_cpu, long set, long way, champsim::address addr, champsim::address ip, access_type type, bool hit) +.. cpp:function:: void update_replacement_state(uint32_t triggering_cpu, long set, long way, champsim::address addr, champsim::address ip, champsim::address victim_addr, access_type type, bool hit) +.. cpp:function:: void update_replacement_state(uint32_t triggering_cpu, long set, long way, champsim::address addr, champsim::address ip, champsim::address victim_addr, uint32_t type, bool hit) +.. cpp:function:: void update_replacement_state(uint32_t triggering_cpu, long set, long way, uint64_t addr, uint64_t ip, uint64_t victim_addr, bool hit) + + This function has different behavior depending on whether ``replacement_cache_fill()`` is defined. + If it is defined, this function is called when a tag check completes, whether the check is a hit or a miss. + If it is not defined, this function is called on hits and when a miss is filled (that is, with the same timing as ``replacement_cache_fill()``). + + :param triggering_cpu: the core index that initiated this fill + :param set: the set that the fill occurred in. + :param way: the way that the fill occurred in. + :param addr: the address of the packet. + If this is the first-level cache, the offset bits are included. + Otherwise, the offset bits are zero. + If the cache was configured with ``"virtual_prefetch": true``, this address will be a virtual address. + Otherwise, this is a physical address. + :param ip: the address of the instruction that initiated the demand. + If the packet is a prefetch from another level, this value will be 0. + :param victim_addr: This value will be 0 unless ``replacement_cache_fill()`` is not defined and ``hit`` is false. + If so, this parameter is the address of the evicted block. + :param type: one of the following + + * ``access_type::LOAD`` + * ``access_type::RFO`` + * ``access_type::PREFETCH`` + * ``access_type::WRITE`` + * ``access_type::TRANSLATION`` + :param hit: true if the packet hit the cache, false otherwise. + +.. cpp:function:: void replacement_final_stats() + + This function is called at the end of the simulation and can be used to print statistics. + diff --git a/feature/dynamorio-tracer/_sources/Publications-using-champsim.rst.txt b/feature/dynamorio-tracer/_sources/Publications-using-champsim.rst.txt new file mode 100644 index 000000000..b79b7b876 --- /dev/null +++ b/feature/dynamorio-tracer/_sources/Publications-using-champsim.rst.txt @@ -0,0 +1,20 @@ +.. _Publications: + +================================ +Publications +================================ + +ChampSim is primarily exhibited in + +.. bibliography:: + :list: bullet + :filter: False + + gober2022championship + +Other publications that use ChampSim for their results are listed below: + +.. bibliography:: + :list: bullet + :style: year_author_title + :filter: key not in {'gober2022championship'} diff --git a/feature/dynamorio-tracer/_sources/index.rst.txt b/feature/dynamorio-tracer/_sources/index.rst.txt new file mode 100644 index 000000000..3a118df52 --- /dev/null +++ b/feature/dynamorio-tracer/_sources/index.rst.txt @@ -0,0 +1,91 @@ +Welcome to the ChampSim wiki! +==================================== + +ChampSim is an open-source trace based simulator maintained at Texas A&M University and through the support of the computer architecture community. +ChampSim was originally developed to provide a platform for microarchitectural competitions (DPC3, DPC2, CRC2, IPC1, etc.) and has since been used for the development of multiple state-of-the-art cache replacement and prefetching policies. + +We encourage you to read below to see if ChampSim is right for your research, class, or project! + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + Modules + Module-support-library + Creating-a-configuration-file + Configuration-API + Address-operations + Byte-sizes + Bandwidth + Core-model + Cache-model + Legacy-modules + +ChampSim is commonly used as the basis for academic research. +See a list of publications that use ChampSim :ref:`here `. + +------------------- +ChampSim's Goal +------------------- + +The ultimate design philosophy of ChampSim is to provide an environment where an architect can realistically begin performing significant research within a month, but the simulator works right out of the box for exploration and quickly prototyping cache management ideas! +With this in mind, ChampSim development works towards maintaining an accurate Out of Order execution and cache memory model without the overhead of larger multi-layered architectural research platforms. +There are ChampSim-ready traces available online (from CRC2, IPC1, DPC3, and CVP) to let you quickly get started. +The ChampSim design philosophy is summed up in three main design principles: + +* Low startup time: The user should be able to perform new and meaningful memory system research in one month. +* Little architecture knowledge required: Users need only an entry-level comprehension of C++ to begin researching prefetching and replacement schemes. +* Design configurability: The core model should be flexible enough to model a variety of commodity devices. + +------------------- +What ChampSim is +------------------- + +* A fast trace-based simulator that can get you started in computer architecture research quickly without a deeper understanding of microarchitecture. +* A modular simulator, with multiple interchangeable pieces that can be configured at compile time. This leads to diverse simulation environments and enables you to simulate the system you need! + +---------------------- +What ChampSim is not +---------------------- + +* ChampSim is not ideal for research related to OS and OS-interactions... without modifications. ChampSim is a trace-based simulator, meaning that a program was executed with an instrumentation tool, like PIN or Dynamorio, to create a file that represents the instructions executed by some processor. This means that ChampSim does not have any OS interfaces or full-system mode. + +* The traces ChampSim uses do not currently support specific instructions aside from memory load/store operations. A non-memory instruction is not fully simulated but given a flat latency and consumes resources from the front-end core model. + +* **Perfect**- ChampSim is an ongoing project and while we are working on improving the models in general, there are some pieces that are in active development. We encourage you to make us aware of something you think may make this simulator even better and even submit a pull request to help further development! + + +------------------ +ChampSim Features +------------------ + +* Heterogeneous cores +* Configurable cache hierarchy - Size, queues, associativity +* Different levels and interconnectivity between cache levels +* Aggressive decoupled frontend +* Modular components including: + + * Branch predictor + * Cache prefetchers + * Cache replacement policy + * Branch target buffers + * Extendable DRAM model + +================ +FAQ +================ + +Why use trace-based simulation? + Trace-based simulation is much faster than full system, allowing for students and researchers to quickly jump into architectural research, configuring the system and quickly reviewing simulation results. + This allows for an easier collaboration with industry. The ChampSim traces contain no opcode-specific information making it impossible to reverse engineer the original program that the trace was generated from. Any sensitive information in the traces can be removed through randomization, fuzzing, or other changes to the file without disrupting the overall behavior of the application. + Traces are easy to distribute for competitions, collaboration, or classroom settings. + +Why is it called ChampSim? + This simulator was originally developed for quickly creating and evaluating ideas for Championships, so it's the Championship Simulator. Since its conception as a competition platform, ChampSim has grown into a research and education platform. + +I want to contribute! How do I do that? + We're glad you asked! Take a look at some of the issues and their tags or get started on a new feature for ChampSim. We are currently using the develop branch to add improvements to the overall simulator. When you're done, make a pull request and we'll review it to be merged into the develop branch of the repository. + +How do we cite ChampSim? + For now, please cite our `arXiv paper `_. + diff --git a/feature/dynamorio-tracer/_static/basic.css b/feature/dynamorio-tracer/_static/basic.css new file mode 100644 index 000000000..7ebbd6d07 --- /dev/null +++ b/feature/dynamorio-tracer/_static/basic.css @@ -0,0 +1,914 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/feature/dynamorio-tracer/_static/doctools.js b/feature/dynamorio-tracer/_static/doctools.js new file mode 100644 index 000000000..0398ebb9f --- /dev/null +++ b/feature/dynamorio-tracer/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/feature/dynamorio-tracer/_static/documentation_options.js b/feature/dynamorio-tracer/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/feature/dynamorio-tracer/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/feature/dynamorio-tracer/_static/file.png b/feature/dynamorio-tracer/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/feature/dynamorio-tracer/_static/file.png differ diff --git a/feature/dynamorio-tracer/_static/language_data.js b/feature/dynamorio-tracer/_static/language_data.js new file mode 100644 index 000000000..c7fe6c6fa --- /dev/null +++ b/feature/dynamorio-tracer/_static/language_data.js @@ -0,0 +1,192 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/feature/dynamorio-tracer/_static/minus.png b/feature/dynamorio-tracer/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/feature/dynamorio-tracer/_static/minus.png differ diff --git a/feature/dynamorio-tracer/_static/nature.css b/feature/dynamorio-tracer/_static/nature.css new file mode 100644 index 000000000..e26d936f7 --- /dev/null +++ b/feature/dynamorio-tracer/_static/nature.css @@ -0,0 +1,245 @@ +/* + * Sphinx stylesheet -- nature theme. + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Arial, sans-serif; + font-size: 100%; + background-color: #fff; + color: #555; + margin: 0; + padding: 0; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.document { + background-color: #eee; +} + +div.body { + background-color: #ffffff; + color: #3E4349; + padding: 0 30px 30px 30px; + font-size: 0.9em; +} + +div.footer { + color: #555; + width: 100%; + padding: 13px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #444; + text-decoration: underline; +} + +div.related { + background-color: #6BA81E; + line-height: 32px; + color: #fff; + text-shadow: 0px 1px 0 #444; + font-size: 0.9em; +} + +div.related a { + color: #E2F3CC; +} + +div.sphinxsidebar { + font-size: 0.75em; + line-height: 1.5em; +} + +div.sphinxsidebarwrapper{ + padding: 20px 0; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Arial, sans-serif; + color: #222; + font-size: 1.2em; + font-weight: normal; + margin: 0; + padding: 5px 10px; + background-color: #ddd; + text-shadow: 1px 1px 0 white +} + +div.sphinxsidebar h4{ + font-size: 1.1em; +} + +div.sphinxsidebar h3 a { + color: #444; +} + + +div.sphinxsidebar p { + color: #888; + padding: 5px 20px; +} + +div.sphinxsidebar p.topless { +} + +div.sphinxsidebar ul { + margin: 10px 20px; + padding: 0; + color: #000; +} + +div.sphinxsidebar a { + color: #444; +} + +div.sphinxsidebar input { + border: 1px solid #ccc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar .searchformwrapper { + margin-left: 20px; + margin-right: 20px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #005B81; + text-decoration: none; +} + +a:hover { + color: #E32E00; + text-decoration: underline; +} + +a:visited { + color: #551A8B; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Arial, sans-serif; + background-color: #BED4EB; + font-weight: normal; + color: #212224; + margin: 30px 0px 10px 0px; + padding: 5px 0 5px 10px; + text-shadow: 0px 1px 0 white +} + +div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 150%; background-color: #C8D5E3; } +div.body h3 { font-size: 120%; background-color: #D8DEE3; } +div.body h4 { font-size: 110%; background-color: #D8DEE3; } +div.body h5 { font-size: 100%; background-color: #D8DEE3; } +div.body h6 { font-size: 100%; background-color: #D8DEE3; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li { + line-height: 1.5em; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +nav.contents, +aside.topic, +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 10px; + line-height: 1.2em; + border: 1px solid #C6C9CB; + font-size: 1.1em; + margin: 1.5em 0 1.5em 0; + -webkit-box-shadow: 1px 1px 1px #d8d8d8; + -moz-box-shadow: 1px 1px 1px #d8d8d8; +} + +code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ + font-size: 1.1em; + font-family: monospace; +} + +.viewcode-back { + font-family: Arial, sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +div.code-block-caption { + background-color: #ddd; + color: #222; + border: 1px solid #C6C9CB; +} \ No newline at end of file diff --git a/feature/dynamorio-tracer/_static/plus.png b/feature/dynamorio-tracer/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/feature/dynamorio-tracer/_static/plus.png differ diff --git a/feature/dynamorio-tracer/_static/pygments.css b/feature/dynamorio-tracer/_static/pygments.css new file mode 100644 index 000000000..6110e9f1a --- /dev/null +++ b/feature/dynamorio-tracer/_static/pygments.css @@ -0,0 +1,84 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #8f5902; font-style: italic } /* Comment */ +.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ +.highlight .g { color: #000000 } /* Generic */ +.highlight .k { color: #204a87; font-weight: bold } /* Keyword */ +.highlight .l { color: #000000 } /* Literal */ +.highlight .n { color: #000000 } /* Name */ +.highlight .o { color: #ce5c00; font-weight: bold } /* Operator */ +.highlight .x { color: #000000 } /* Other */ +.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ +.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8f5902; font-style: italic } /* Comment.Preproc */ +.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #a40000 } /* Generic.Deleted */ +.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #000000; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #ef2929 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #000000; font-style: italic } /* Generic.Output */ +.highlight .gp { color: #8f5902 } /* Generic.Prompt */ +.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ +.highlight .kc { color: #204a87; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #204a87; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #204a87; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #204a87; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #204a87; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #204a87; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #000000 } /* Literal.Date */ +.highlight .m { color: #0000cf; font-weight: bold } /* Literal.Number */ +.highlight .s { color: #4e9a06 } /* Literal.String */ +.highlight .na { color: #c4a000 } /* Name.Attribute */ +.highlight .nb { color: #204a87 } /* Name.Builtin */ +.highlight .nc { color: #000000 } /* Name.Class */ +.highlight .no { color: #000000 } /* Name.Constant */ +.highlight .nd { color: #5c35cc; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #ce5c00 } /* Name.Entity */ +.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000000 } /* Name.Function */ +.highlight .nl { color: #f57900 } /* Name.Label */ +.highlight .nn { color: #000000 } /* Name.Namespace */ +.highlight .nx { color: #000000 } /* Name.Other */ +.highlight .py { color: #000000 } /* Name.Property */ +.highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000000 } /* Name.Variable */ +.highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #f8f8f8 } /* Text.Whitespace */ +.highlight .mb { color: #0000cf; font-weight: bold } /* Literal.Number.Bin */ +.highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */ +.highlight .mh { color: #0000cf; font-weight: bold } /* Literal.Number.Hex */ +.highlight .mi { color: #0000cf; font-weight: bold } /* Literal.Number.Integer */ +.highlight .mo { color: #0000cf; font-weight: bold } /* Literal.Number.Oct */ +.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ +.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ +.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ +.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ +.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ +.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ +.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ +.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #000000 } /* Name.Function.Magic */ +.highlight .vc { color: #000000 } /* Name.Variable.Class */ +.highlight .vg { color: #000000 } /* Name.Variable.Global */ +.highlight .vi { color: #000000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000000 } /* Name.Variable.Magic */ +.highlight .il { color: #0000cf; font-weight: bold } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/feature/dynamorio-tracer/_static/searchtools.js b/feature/dynamorio-tracer/_static/searchtools.js new file mode 100644 index 000000000..2c774d17a --- /dev/null +++ b/feature/dynamorio-tracer/_static/searchtools.js @@ -0,0 +1,632 @@ +/* + * Sphinx JavaScript utilities for the full-text search. + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename, kind] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + SearchResultKind.title, + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + SearchResultKind.index, + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + SearchResultKind.object, + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + SearchResultKind.text, + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/feature/dynamorio-tracer/_static/sphinx_highlight.js b/feature/dynamorio-tracer/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/feature/dynamorio-tracer/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/feature/dynamorio-tracer/genindex.html b/feature/dynamorio-tracer/genindex.html new file mode 100644 index 000000000..06bda29c8 --- /dev/null +++ b/feature/dynamorio-tracer/genindex.html @@ -0,0 +1,701 @@ + + + + + + + Index — ChampSim documentation + + + + + + + + + + +
+
+
+
+ + +

Index

+ +
+ _ + | A + | B + | C + | D + | E + | F + | I + | J + | L + | M + | O + | P + | R + | S + | U + | W + | Y + +
+

_

+ + + +
+ +

A

+ + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

I

+ + + +
+ +

J

+ + +
+ +

L

+ + +
+ +

M

+ + + +
    +
  • + module + +
  • +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

U

+ + + +
+ +

W

+ + + +
+ +

Y

+ + +
+ + + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/feature/dynamorio-tracer/index.html b/feature/dynamorio-tracer/index.html new file mode 100644 index 000000000..8da80a9ae --- /dev/null +++ b/feature/dynamorio-tracer/index.html @@ -0,0 +1,256 @@ + + + + + + + + Welcome to the ChampSim wiki! — ChampSim documentation + + + + + + + + + + + +
+
+
+
+ +
+

Welcome to the ChampSim wiki!

+

ChampSim is an open-source trace based simulator maintained at Texas A&M University and through the support of the computer architecture community. +ChampSim was originally developed to provide a platform for microarchitectural competitions (DPC3, DPC2, CRC2, IPC1, etc.) and has since been used for the development of multiple state-of-the-art cache replacement and prefetching policies.

+

We encourage you to read below to see if ChampSim is right for your research, class, or project!

+ +

ChampSim is commonly used as the basis for academic research. +See a list of publications that use ChampSim here.

+
+

ChampSim’s Goal

+

The ultimate design philosophy of ChampSim is to provide an environment where an architect can realistically begin performing significant research within a month, but the simulator works right out of the box for exploration and quickly prototyping cache management ideas! +With this in mind, ChampSim development works towards maintaining an accurate Out of Order execution and cache memory model without the overhead of larger multi-layered architectural research platforms. +There are ChampSim-ready traces available online (from CRC2, IPC1, DPC3, and CVP) to let you quickly get started. +The ChampSim design philosophy is summed up in three main design principles:

+
    +
  • Low startup time: The user should be able to perform new and meaningful memory system research in one month.

  • +
  • Little architecture knowledge required: Users need only an entry-level comprehension of C++ to begin researching prefetching and replacement schemes.

  • +
  • Design configurability: The core model should be flexible enough to model a variety of commodity devices.

  • +
+
+
+

What ChampSim is

+
    +
  • A fast trace-based simulator that can get you started in computer architecture research quickly without a deeper understanding of microarchitecture.

  • +
  • A modular simulator, with multiple interchangeable pieces that can be configured at compile time. This leads to diverse simulation environments and enables you to simulate the system you need!

  • +
+
+
+

What ChampSim is not

+
    +
  • ChampSim is not ideal for research related to OS and OS-interactions… without modifications. ChampSim is a trace-based simulator, meaning that a program was executed with an instrumentation tool, like PIN or Dynamorio, to create a file that represents the instructions executed by some processor. This means that ChampSim does not have any OS interfaces or full-system mode.

  • +
  • The traces ChampSim uses do not currently support specific instructions aside from memory load/store operations. A non-memory instruction is not fully simulated but given a flat latency and consumes resources from the front-end core model.

  • +
  • Perfect- ChampSim is an ongoing project and while we are working on improving the models in general, there are some pieces that are in active development. We encourage you to make us aware of something you think may make this simulator even better and even submit a pull request to help further development!

  • +
+
+
+

ChampSim Features

+
    +
  • Heterogeneous cores

  • +
  • Configurable cache hierarchy - Size, queues, associativity

  • +
  • Different levels and interconnectivity between cache levels

  • +
  • Aggressive decoupled frontend

  • +
  • Modular components including:

    +
      +
    • Branch predictor

    • +
    • Cache prefetchers

    • +
    • Cache replacement policy

    • +
    • Branch target buffers

    • +
    • Extendable DRAM model

    • +
    +
  • +
+
+

FAQ

+
+
Why use trace-based simulation?

Trace-based simulation is much faster than full system, allowing for students and researchers to quickly jump into architectural research, configuring the system and quickly reviewing simulation results. +This allows for an easier collaboration with industry. The ChampSim traces contain no opcode-specific information making it impossible to reverse engineer the original program that the trace was generated from. Any sensitive information in the traces can be removed through randomization, fuzzing, or other changes to the file without disrupting the overall behavior of the application. +Traces are easy to distribute for competitions, collaboration, or classroom settings.

+
+
Why is it called ChampSim?

This simulator was originally developed for quickly creating and evaluating ideas for Championships, so it’s the Championship Simulator. Since its conception as a competition platform, ChampSim has grown into a research and education platform.

+
+
I want to contribute! How do I do that?

We’re glad you asked! Take a look at some of the issues and their tags or get started on a new feature for ChampSim. We are currently using the develop branch to add improvements to the overall simulator. When you’re done, make a pull request and we’ll review it to be merged into the develop branch of the repository.

+
+
How do we cite ChampSim?

For now, please cite our arXiv paper.

+
+
+
+
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/feature/dynamorio-tracer/objects.inv b/feature/dynamorio-tracer/objects.inv new file mode 100644 index 000000000..f728c9416 Binary files /dev/null and b/feature/dynamorio-tracer/objects.inv differ diff --git a/feature/dynamorio-tracer/py-modindex.html b/feature/dynamorio-tracer/py-modindex.html new file mode 100644 index 000000000..14f067d02 --- /dev/null +++ b/feature/dynamorio-tracer/py-modindex.html @@ -0,0 +1,113 @@ + + + + + + + Python Module Index — ChampSim documentation + + + + + + + + + + + + + + + +
+
+
+
+ + +

Python Module Index

+ +
+ c +
+ + + + + + + +
 
+ c
+ config +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/feature/dynamorio-tracer/search.html b/feature/dynamorio-tracer/search.html new file mode 100644 index 000000000..d44f88cee --- /dev/null +++ b/feature/dynamorio-tracer/search.html @@ -0,0 +1,112 @@ + + + + + + + Search — ChampSim documentation + + + + + + + + + + + + + + + + + +
+
+
+
+ +

Search

+ + + + +

+ Searching for multiple words only shows matches that contain + all words. +

+ + +
+ + + +
+ + +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/feature/dynamorio-tracer/searchindex.js b/feature/dynamorio-tracer/searchindex.js new file mode 100644 index 000000000..22884ec34 --- /dev/null +++ b/feature/dynamorio-tracer/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Address Operations": [[0, null]], "Addresses": [[0, "addresses"]], "Bandwidth": [[1, null]], "Branch Predictors": [[7, "branch-predictors"], [9, "branch-predictors"]], "Branch Target Buffers": [[7, "branch-target-buffers"], [9, "branch-target-buffers"]], "Builder": [[3, "builder"], [5, "builder"]], "Byte Sizes": [[2, null]], "Cache Configuration": [[6, "cache-configuration"]], "Cache Model": [[3, null]], "ChampSim Features": [[11, "champsim-features"]], "ChampSim\u2019s Goal": [[11, "champsim-s-goal"]], "Configuration API": [[4, null]], "Contents:": [[11, null]], "Convenience specializations": [[2, "convenience-specializations"]], "Convenience typedefs": [[0, "convenience-typedefs"]], "Core Model": [[5, null]], "Creating a Configuration File": [[6, null]], "Dictionary Operations": [[4, "dictionary-operations"]], "Extents": [[0, "extents"]], "FAQ": [[11, "faq"]], "File Generation API": [[4, "file-generation-api"]], "Fixed-width saturating counter": [[8, "fixed-width-saturating-counter"]], "Functions for bit operations": [[8, "functions-for-bit-operations"]], "Heterogeneous systems": [[6, "heterogeneous-systems"]], "Itertools extentions": [[4, "itertools-extentions"]], "Literals": [[2, "literals"]], "Memory Prefetchers": [[7, "memory-prefetchers"], [9, "memory-prefetchers"]], "Module Support Library": [[8, null]], "Multi-core configurations": [[6, "multi-core-configurations"]], "Parsing API": [[4, "parsing-api"]], "Publications": [[10, null]], "Replacement Policies": [[7, "replacement-policies"], [9, "replacement-policies"]], "System operations": [[4, "system-operations"]], "The ChampSim Module System": [[9, null]], "The Legacy ChampSim Module System": [[7, null]], "Utility Functions": [[4, "utility-functions"]], "Welcome to the ChampSim wiki!": [[11, null]], "What ChampSim is": [[11, "what-champsim-is"]], "What ChampSim is not": [[11, "what-champsim-is-not"]], "Your first configuration file": [[6, "your-first-configuration-file"]]}, "docnames": ["Address-operations", "Bandwidth", "Byte-sizes", "Cache-model", "Configuration-API", "Core-model", "Creating-a-configuration-file", "Legacy-modules", "Module-support-library", "Modules", "Publications-using-champsim", "index"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinxcontrib.bibtex": 9}, "filenames": ["Address-operations.rst", "Bandwidth.rst", "Byte-sizes.rst", "Cache-model.rst", "Configuration-API.rst", "Core-model.rst", "Creating-a-configuration-file.rst", "Legacy-modules.rst", "Module-support-library.rst", "Modules.rst", "Publications-using-champsim.rst", "index.rst"], "indexentries": {"__enter__() (config.filewrite.filewriter method)": [[4, "config.filewrite.FileWriter.__enter__", false]], "__exit__() (config.filewrite.filewriter method)": [[4, "config.filewrite.FileWriter.__exit__", false]], "append_except_last() (in module config.util)": [[4, "config.util.append_except_last", false]], "batch() (in module config.util)": [[4, "config.util.batch", false]], "btb_prediction (c++ function)": [[9, "_CPPv414btb_prediction8uint64_t", false], [9, "_CPPv414btb_prediction8uint64_t7uint8_t", false], [9, "_CPPv414btb_predictionN8champsim7addressE", false], [9, "_CPPv414btb_predictionN8champsim7addressE7uint8_t", false]], "cache (c++ class)": [[3, "_CPPv45CACHE", false]], "cache::mshr_type (c++ struct)": [[3, "_CPPv4N5CACHE9mshr_typeE", false]], "cache::mshr_type::returned_value (c++ struct)": [[3, "_CPPv4N5CACHE9mshr_type14returned_valueE", false]], "cache::prefetcher_module_concept (c++ struct)": [[3, "_CPPv4N5CACHE25prefetcher_module_conceptE", false]], "cache::prefetcher_module_model (c++ struct)": [[3, "_CPPv4IDpEN5CACHE23prefetcher_module_modelE", false]], "cache::replacement_module_concept (c++ struct)": [[3, "_CPPv4N5CACHE26replacement_module_conceptE", false]], "cache::replacement_module_model (c++ struct)": [[3, "_CPPv4IDpEN5CACHE24replacement_module_modelE", false]], "chain() (in module config.util)": [[4, "config.util.chain", false]], "champsim::address (c++ type)": [[0, "_CPPv4N8champsim7addressE", false]], "champsim::address_slice (c++ class)": [[0, "_CPPv4I0EN8champsim13address_sliceE", false]], "champsim::address_slice::address_slice (c++ function)": [[0, "_CPPv4I0EN8champsim13address_slice13address_sliceE11extent_typeRK13address_sliceI9OTHER_EXTE", false], [0, "_CPPv4I0EN8champsim13address_slice13address_sliceERK13address_sliceI9OTHER_EXTE", false], [0, "_CPPv4N8champsim13address_slice13address_sliceE11extent_type15underlying_type", false], [0, "_CPPv4N8champsim13address_slice13address_sliceE15underlying_type", false], [0, "_CPPv4N8champsim13address_slice13address_sliceEv", false]], "champsim::address_slice::bits (c++ member)": [[0, "_CPPv4N8champsim13address_slice4bitsE", false]], "champsim::address_slice::difference_type (c++ type)": [[0, "_CPPv4N8champsim13address_slice15difference_typeE", false]], "champsim::address_slice::extent_type (c++ type)": [[0, "_CPPv4N8champsim13address_slice11extent_typeE", false]], "champsim::address_slice::lower_extent (c++ function)": [[0, "_CPPv4NK8champsim13address_slice12lower_extentEv", false]], "champsim::address_slice::operator!= (c++ function)": [[0, "_CPPv4NK8champsim13address_sliceneE9self_type", false]], "champsim::address_slice::operator+ (c++ function)": [[0, "_CPPv4NK8champsim13address_sliceplE15difference_type", false], [0, "_CPPv4NK8champsim13address_sliceplEN8champsim4data5bytesE", false]], "champsim::address_slice::operator++ (c++ function)": [[0, "_CPPv4N8champsim13address_sliceppEi", false], [0, "_CPPv4N8champsim13address_sliceppEv", false]], "champsim::address_slice::operator+= (c++ function)": [[0, "_CPPv4N8champsim13address_slicepLE15difference_type", false], [0, "_CPPv4N8champsim13address_slicepLEN8champsim4data5bytesE", false]], "champsim::address_slice::operator- (c++ function)": [[0, "_CPPv4NK8champsim13address_slicemiE15difference_type", false], [0, "_CPPv4NK8champsim13address_slicemiEN8champsim4data5bytesE", false]], "champsim::address_slice::operator-- (c++ function)": [[0, "_CPPv4N8champsim13address_slicemmEi", false], [0, "_CPPv4N8champsim13address_slicemmEv", false]], "champsim::address_slice::operator-= (c++ function)": [[0, "_CPPv4N8champsim13address_slicemIE15difference_type", false], [0, "_CPPv4N8champsim13address_slicemIEN8champsim4data5bytesE", false]], "champsim::address_slice::operator< (c++ function)": [[0, "_CPPv4NK8champsim13address_sliceltE9self_type", false]], "champsim::address_slice::operator<= (c++ function)": [[0, "_CPPv4NK8champsim13address_sliceleE9self_type", false]], "champsim::address_slice::operator== (c++ function)": [[0, "_CPPv4NK8champsim13address_sliceeqE9self_type", false]], "champsim::address_slice::operator> (c++ function)": [[0, "_CPPv4NK8champsim13address_slicegtE9self_type", false]], "champsim::address_slice::operator>= (c++ function)": [[0, "_CPPv4NK8champsim13address_slicegeE9self_type", false]], "champsim::address_slice::slice (c++ function)": [[0, "_CPPv4I0ENK8champsim13address_slice5sliceEDa10SUB_EXTENT", false], [0, "_CPPv4I_N8champsim4data4bitsE_N8champsim4data4bitsEENK8champsim13address_slice5sliceEDav", false]], "champsim::address_slice::slice_lower (c++ function)": [[0, "_CPPv4I_N8champsim4data4bitsEENK8champsim13address_slice11slice_lowerEDav", false], [0, "_CPPv4NK8champsim13address_slice11slice_lowerEN8champsim4data4bitsE", false]], "champsim::address_slice::slice_upper (c++ function)": [[0, "_CPPv4I_N8champsim4data4bitsEENK8champsim13address_slice11slice_upperEDav", false], [0, "_CPPv4NK8champsim13address_slice11slice_upperEN8champsim4data4bitsE", false]], "champsim::address_slice::split (c++ function)": [[0, "_CPPv4I_N8champsim4data4bitsEENK8champsim13address_slice5splitEDav", false], [0, "_CPPv4NK8champsim13address_slice5splitEN8champsim4data4bitsE", false]], "champsim::address_slice::to (c++ function)": [[0, "_CPPv4I0ENK8champsim13address_slice2toE1Tv", false]], "champsim::address_slice::underlying_type (c++ type)": [[0, "_CPPv4N8champsim13address_slice15underlying_typeE", false]], "champsim::address_slice::upper_extent (c++ function)": [[0, "_CPPv4NK8champsim13address_slice12upper_extentEv", false]], "champsim::bandwidth (c++ class)": [[1, "_CPPv4N8champsim9bandwidthE", false]], "champsim::bandwidth::amount_consumed (c++ function)": [[1, "_CPPv4NK8champsim9bandwidth15amount_consumedEv", false]], "champsim::bandwidth::amount_remaining (c++ function)": [[1, "_CPPv4NK8champsim9bandwidth16amount_remainingEv", false]], "champsim::bandwidth::bandwidth (c++ function)": [[1, "_CPPv4N8champsim9bandwidth9bandwidthE12maximum_type", false]], "champsim::bandwidth::consume (c++ function)": [[1, "_CPPv4N8champsim9bandwidth7consumeE15underlying_type", false], [1, "_CPPv4N8champsim9bandwidth7consumeEv", false]], "champsim::bandwidth::has_remaining (c++ function)": [[1, "_CPPv4NK8champsim9bandwidth13has_remainingEv", false]], "champsim::bandwidth::maximum_type (c++ type)": [[1, "_CPPv4N8champsim9bandwidth12maximum_typeE", false]], "champsim::bandwidth::reset (c++ function)": [[1, "_CPPv4N8champsim9bandwidth5resetEv", false]], "champsim::block_number (c++ type)": [[0, "_CPPv4N8champsim12block_numberE", false]], "champsim::block_number_extent (c++ struct)": [[0, "_CPPv4N8champsim19block_number_extentE", false]], "champsim::block_number_extent::block_number_extent (c++ function)": [[0, "_CPPv4N8champsim19block_number_extent19block_number_extentEv", false]], "champsim::block_offset (c++ type)": [[0, "_CPPv4N8champsim12block_offsetE", false]], "champsim::block_offset_extent (c++ struct)": [[0, "_CPPv4N8champsim19block_offset_extentE", false]], "champsim::block_offset_extent::block_offset_extent (c++ function)": [[0, "_CPPv4N8champsim19block_offset_extent19block_offset_extentEv", false]], "champsim::cache_builder (c++ class)": [[3, "_CPPv4I00EN8champsim13cache_builderE", false]], "champsim::cache_builder::clock_period (c++ function)": [[3, "_CPPv4N8champsim13cache_builder12clock_periodEN8champsim6chrono11picosecondsE", false]], "champsim::cache_builder::fill_bandwidth (c++ function)": [[3, "_CPPv4N8champsim13cache_builder14fill_bandwidthEN8champsim9bandwidth12maximum_typeE", false]], "champsim::cache_builder::fill_latency (c++ function)": [[3, "_CPPv4N8champsim13cache_builder12fill_latencyE8uint64_t", false]], "champsim::cache_builder::hit_latency (c++ function)": [[3, "_CPPv4N8champsim13cache_builder11hit_latencyE8uint64_t", false]], "champsim::cache_builder::latency (c++ function)": [[3, "_CPPv4N8champsim13cache_builder7latencyE8uint64_t", false]], "champsim::cache_builder::log2_offset_bits (c++ function)": [[3, "_CPPv4N8champsim13cache_builder16log2_offset_bitsEj", false]], "champsim::cache_builder::log2_sets (c++ function)": [[3, "_CPPv4N8champsim13cache_builder9log2_setsE8uint32_t", false]], "champsim::cache_builder::log2_size (c++ function)": [[3, "_CPPv4N8champsim13cache_builder9log2_sizeE8uint64_t", false]], "champsim::cache_builder::log2_ways (c++ function)": [[3, "_CPPv4N8champsim13cache_builder9log2_waysE8uint32_t", false]], "champsim::cache_builder::lower_level (c++ function)": [[3, "_CPPv4N8champsim13cache_builder11lower_levelEPN8champsim7channelE", false]], "champsim::cache_builder::lower_translate (c++ function)": [[3, "_CPPv4N8champsim13cache_builder15lower_translateEPN8champsim7channelE", false]], "champsim::cache_builder::mshr_size (c++ function)": [[3, "_CPPv4N8champsim13cache_builder9mshr_sizeE8uint32_t", false]], "champsim::cache_builder::name (c++ function)": [[3, "_CPPv4N8champsim13cache_builder4nameENSt6stringE", false]], "champsim::cache_builder::offset_bits (c++ function)": [[3, "_CPPv4N8champsim13cache_builder11offset_bitsEN8champsim4data4bitsE", false]], "champsim::cache_builder::pq_size (c++ function)": [[3, "_CPPv4N8champsim13cache_builder7pq_sizeE8uint32_t", false]], "champsim::cache_builder::prefetch_activate (c++ function)": [[3, "_CPPv4IDpEN8champsim13cache_builder17prefetch_activateER9self_typeDp5Elems", false]], "champsim::cache_builder::prefetcher (c++ function)": [[3, "_CPPv4IDpEN8champsim13cache_builder10prefetcherE13cache_builderI32cache_builder_module_type_holderIDp2PsE1REv", false]], "champsim::cache_builder::replacement (c++ function)": [[3, "_CPPv4IDpEN8champsim13cache_builder11replacementE13cache_builderI1P32cache_builder_module_type_holderIDp2RsEEv", false]], "champsim::cache_builder::reset_prefetch_as_load (c++ function)": [[3, "_CPPv4N8champsim13cache_builder22reset_prefetch_as_loadEv", false]], "champsim::cache_builder::reset_virtual_prefetch (c++ function)": [[3, "_CPPv4N8champsim13cache_builder22reset_virtual_prefetchEv", false]], "champsim::cache_builder::reset_wq_checks_full_addr (c++ function)": [[3, "_CPPv4N8champsim13cache_builder25reset_wq_checks_full_addrEv", false]], "champsim::cache_builder::set_prefetch_as_load (c++ function)": [[3, "_CPPv4N8champsim13cache_builder20set_prefetch_as_loadEv", false]], "champsim::cache_builder::set_virtual_prefetch (c++ function)": [[3, "_CPPv4N8champsim13cache_builder20set_virtual_prefetchEv", false]], "champsim::cache_builder::set_wq_checks_full_addr (c++ function)": [[3, "_CPPv4N8champsim13cache_builder23set_wq_checks_full_addrEv", false]], "champsim::cache_builder::sets (c++ function)": [[3, "_CPPv4N8champsim13cache_builder4setsE8uint32_t", false]], "champsim::cache_builder::size (c++ function)": [[3, "_CPPv4N8champsim13cache_builder4sizeEN8champsim4data5bytesE", false]], "champsim::cache_builder::tag_bandwidth (c++ function)": [[3, "_CPPv4N8champsim13cache_builder13tag_bandwidthEN8champsim9bandwidth12maximum_typeE", false]], "champsim::cache_builder::upper_levels (c++ function)": [[3, "_CPPv4N8champsim13cache_builder12upper_levelsERRNSt6vectorIPN8champsim7channelEEE", false]], "champsim::cache_builder::ways (c++ function)": [[3, "_CPPv4N8champsim13cache_builder4waysE8uint32_t", false]], "champsim::core_builder (c++ class)": [[5, "_CPPv4I00EN8champsim12core_builderE", false]], "champsim::core_builder::branch_predictor (c++ function)": [[5, "_CPPv4IDpEN8champsim12core_builder16branch_predictorE12core_builderI31core_builder_module_type_holderIDp2BsE1TEv", false]], "champsim::core_builder::btb (c++ function)": [[5, "_CPPv4IDpEN8champsim12core_builder3btbE12core_builderI1B31core_builder_module_type_holderIDp2TsEEv", false]], "champsim::core_builder::clock_period (c++ function)": [[5, "_CPPv4N8champsim12core_builder12clock_periodEN8champsim6chrono11picosecondsE", false]], "champsim::core_builder::data_queues (c++ function)": [[5, "_CPPv4N8champsim12core_builder11data_queuesEPN8champsim7channelE", false]], "champsim::core_builder::decode_buffer_size (c++ function)": [[5, "_CPPv4N8champsim12core_builder18decode_buffer_sizeENSt6size_tE", false]], "champsim::core_builder::decode_latency (c++ function)": [[5, "_CPPv4N8champsim12core_builder14decode_latencyEj", false]], "champsim::core_builder::decode_width (c++ function)": [[5, "_CPPv4N8champsim12core_builder12decode_widthEN8champsim9bandwidth12maximum_typeE", false]], "champsim::core_builder::dib_hit_buffer_size (c++ function)": [[5, "_CPPv4N8champsim12core_builder19dib_hit_buffer_sizeENSt6size_tE", false]], "champsim::core_builder::dib_hit_latency (c++ function)": [[5, "_CPPv4N8champsim12core_builder15dib_hit_latencyEj", false]], "champsim::core_builder::dib_inorder_width (c++ function)": [[5, "_CPPv4N8champsim12core_builder17dib_inorder_widthEN8champsim9bandwidth12maximum_typeE", false]], "champsim::core_builder::dib_set (c++ function)": [[5, "_CPPv4N8champsim12core_builder7dib_setENSt6size_tE", false]], "champsim::core_builder::dib_way (c++ function)": [[5, "_CPPv4N8champsim12core_builder7dib_wayENSt6size_tE", false]], "champsim::core_builder::dib_window (c++ function)": [[5, "_CPPv4N8champsim12core_builder10dib_windowENSt6size_tE", false]], "champsim::core_builder::dispatch_buffer_size (c++ function)": [[5, "_CPPv4N8champsim12core_builder20dispatch_buffer_sizeENSt6size_tE", false]], "champsim::core_builder::dispatch_latency (c++ function)": [[5, "_CPPv4N8champsim12core_builder16dispatch_latencyEj", false]], "champsim::core_builder::dispatch_width (c++ function)": [[5, "_CPPv4N8champsim12core_builder14dispatch_widthEN8champsim9bandwidth12maximum_typeE", false]], "champsim::core_builder::execute_latency (c++ function)": [[5, "_CPPv4N8champsim12core_builder15execute_latencyEj", false]], "champsim::core_builder::execute_width (c++ function)": [[5, "_CPPv4N8champsim12core_builder13execute_widthEN8champsim9bandwidth12maximum_typeE", false]], "champsim::core_builder::fetch_queues (c++ function)": [[5, "_CPPv4N8champsim12core_builder12fetch_queuesEPN8champsim7channelE", false]], "champsim::core_builder::fetch_width (c++ function)": [[5, "_CPPv4N8champsim12core_builder11fetch_widthEN8champsim9bandwidth12maximum_typeE", false]], "champsim::core_builder::ifetch_buffer_size (c++ function)": [[5, "_CPPv4N8champsim12core_builder18ifetch_buffer_sizeENSt6size_tE", false]], "champsim::core_builder::l1d_bandwidth (c++ function)": [[5, "_CPPv4N8champsim12core_builder13l1d_bandwidthEN8champsim9bandwidth12maximum_typeE", false]], "champsim::core_builder::l1i (c++ function)": [[5, "_CPPv4N8champsim12core_builder3l1iEP5CACHE", false]], "champsim::core_builder::l1i_bandwidth (c++ function)": [[5, "_CPPv4N8champsim12core_builder13l1i_bandwidthEN8champsim9bandwidth12maximum_typeE", false]], "champsim::core_builder::lq_size (c++ function)": [[5, "_CPPv4N8champsim12core_builder7lq_sizeENSt6size_tE", false]], "champsim::core_builder::lq_width (c++ function)": [[5, "_CPPv4N8champsim12core_builder8lq_widthEN8champsim9bandwidth12maximum_typeE", false]], "champsim::core_builder::mispredict_penalty (c++ function)": [[5, "_CPPv4N8champsim12core_builder18mispredict_penaltyEj", false]], "champsim::core_builder::register_file_size (c++ function)": [[5, "_CPPv4N8champsim12core_builder18register_file_sizeENSt6size_tE", false]], "champsim::core_builder::retire_width (c++ function)": [[5, "_CPPv4N8champsim12core_builder12retire_widthEN8champsim9bandwidth12maximum_typeE", false]], "champsim::core_builder::rob_size (c++ function)": [[5, "_CPPv4N8champsim12core_builder8rob_sizeENSt6size_tE", false]], "champsim::core_builder::schedule_latency (c++ function)": [[5, "_CPPv4N8champsim12core_builder16schedule_latencyEj", false]], "champsim::core_builder::schedule_width (c++ function)": [[5, "_CPPv4N8champsim12core_builder14schedule_widthEN8champsim9bandwidth12maximum_typeE", false]], "champsim::core_builder::sq_size (c++ function)": [[5, "_CPPv4N8champsim12core_builder7sq_sizeENSt6size_tE", false]], "champsim::core_builder::sq_width (c++ function)": [[5, "_CPPv4N8champsim12core_builder8sq_widthEN8champsim9bandwidth12maximum_typeE", false]], "champsim::data::bits (c++ enum)": [[2, "_CPPv4N8champsim4data4bitsE", false]], "champsim::data::bytes (c++ type)": [[2, "_CPPv4N8champsim4data5bytesE", false]], "champsim::data::data_literals::operator\"\"_b (c++ function)": [[2, "_CPPv4N8champsim4data13data_literalsli2_BEy", false], [2, "_CPPv4N8champsim4data13data_literalsli2_bEy", false]], "champsim::data::data_literals::operator\"\"_gib (c++ function)": [[2, "_CPPv4N8champsim4data13data_literalsli4_GiBEy", false]], "champsim::data::data_literals::operator\"\"_kib (c++ function)": [[2, "_CPPv4N8champsim4data13data_literalsli4_kiBEy", false]], "champsim::data::data_literals::operator\"\"_mib (c++ function)": [[2, "_CPPv4N8champsim4data13data_literalsli4_MiBEy", false]], "champsim::data::data_literals::operator\"\"_tib (c++ function)": [[2, "_CPPv4N8champsim4data13data_literalsli4_TiBEy", false]], "champsim::data::gibibytes (c++ type)": [[2, "_CPPv4N8champsim4data9gibibytesE", false]], "champsim::data::kibibytes (c++ type)": [[2, "_CPPv4N8champsim4data9kibibytesE", false]], "champsim::data::mebibytes (c++ type)": [[2, "_CPPv4N8champsim4data9mebibytesE", false]], "champsim::data::size (c++ class)": [[2, "_CPPv4I00EN8champsim4data4sizeE", false]], "champsim::data::size::count (c++ function)": [[2, "_CPPv4NK8champsim4data4size5countEv", false]], "champsim::data::size::size (c++ function)": [[2, "_CPPv4I00EN8champsim4data4size4sizeERK4sizeI4Rep25Unit2E", false], [2, "_CPPv4N8champsim4data4size4sizeE3rep", false]], "champsim::data::tebibytes (c++ type)": [[2, "_CPPv4N8champsim4data9tebibytesE", false]], "champsim::dynamic_extent (c++ struct)": [[0, "_CPPv4N8champsim14dynamic_extentE", false]], "champsim::dynamic_extent::dynamic_extent (c++ function)": [[0, "_CPPv4N8champsim14dynamic_extent14dynamic_extentEN8champsim4data4bitsEN8champsim4data4bitsE", false], [0, "_CPPv4N8champsim14dynamic_extent14dynamic_extentEN8champsim4data4bitsENSt6size_tE", false]], "champsim::dynamic_extent::lower (c++ member)": [[0, "_CPPv4N8champsim14dynamic_extent5lowerE", false]], "champsim::dynamic_extent::upper (c++ member)": [[0, "_CPPv4N8champsim14dynamic_extent5upperE", false]], "champsim::exbi (c++ type)": [[2, "_CPPv4N8champsim4exbiE", false]], "champsim::gibi (c++ type)": [[2, "_CPPv4N8champsim4gibiE", false]], "champsim::kibi (c++ type)": [[2, "_CPPv4N8champsim4kibiE", false]], "champsim::mebi (c++ type)": [[2, "_CPPv4N8champsim4mebiE", false]], "champsim::msl::base_fwcounter (c++ class)": [[8, "_CPPv4I0_8val_type_8val_typeEN8champsim3msl14base_fwcounterE", false]], "champsim::msl::base_fwcounter::is_max (c++ function)": [[8, "_CPPv4NK8champsim3msl14base_fwcounter6is_maxEv", false]], "champsim::msl::base_fwcounter::is_min (c++ function)": [[8, "_CPPv4NK8champsim3msl14base_fwcounter6is_minEv", false]], "champsim::msl::base_fwcounter::operator*= (c++ function)": [[8, "_CPPv4N8champsim3msl14base_fwcountermLE14base_fwcounterI8val_type6MAXVAL6MINVALE", false]], "champsim::msl::base_fwcounter::operator++ (c++ function)": [[8, "_CPPv4N8champsim3msl14base_fwcounterppEv", false]], "champsim::msl::base_fwcounter::operator+= (c++ function)": [[8, "_CPPv4N8champsim3msl14base_fwcounterpLE14base_fwcounterI8val_type6MAXVAL6MINVALE", false]], "champsim::msl::base_fwcounter::operator-- (c++ function)": [[8, "_CPPv4N8champsim3msl14base_fwcountermmEv", false]], "champsim::msl::base_fwcounter::operator-= (c++ function)": [[8, "_CPPv4N8champsim3msl14base_fwcountermIE14base_fwcounterI8val_type6MAXVAL6MINVALE", false]], "champsim::msl::base_fwcounter::operator/= (c++ function)": [[8, "_CPPv4N8champsim3msl14base_fwcounterdVE14base_fwcounterI8val_type6MAXVAL6MINVALE", false]], "champsim::msl::base_fwcounter::value (c++ function)": [[8, "_CPPv4NK8champsim3msl14base_fwcounter5valueEv", false]], "champsim::msl::bitmask (c++ function)": [[8, "_CPPv4N8champsim3msl7bitmaskEN8champsim4data4bitsE", false], [8, "_CPPv4N8champsim3msl7bitmaskEN8champsim4data4bitsEN8champsim4data4bitsE", false], [8, "_CPPv4N8champsim3msl7bitmaskENSt6size_tENSt6size_tE", false]], "champsim::msl::fwcounter (c++ type)": [[8, "_CPPv4I_NSt6size_tEEN8champsim3msl9fwcounterE", false]], "champsim::msl::ipow (c++ function)": [[8, "_CPPv4N8champsim3msl4ipowExj", false]], "champsim::msl::is_power_of_2 (c++ function)": [[8, "_CPPv4I0EN8champsim3msl13is_power_of_2Eb1T", false]], "champsim::msl::lg2 (c++ function)": [[8, "_CPPv4I0EN8champsim3msl3lg2EDa1T", false]], "champsim::msl::next_pow2 (c++ function)": [[8, "_CPPv4I0EN8champsim3msl9next_pow2E1T1T", false]], "champsim::msl::sfwcounter (c++ type)": [[8, "_CPPv4I_NSt6size_tEEN8champsim3msl10sfwcounterE", false]], "champsim::msl::splice_bits (c++ function)": [[8, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TN8champsim4data4bitsE", false], [8, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TN8champsim4data4bitsEN8champsim4data4bitsE", false], [8, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TNSt6size_tE", false], [8, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TNSt6size_tENSt6size_tE", false]], "champsim::offset (c++ function)": [[0, "_CPPv4I0EN8champsim6offsetEN13address_sliceI6ExtentE15difference_typeE13address_sliceI6ExtentE13address_sliceI6ExtentE", false]], "champsim::page_number (c++ type)": [[0, "_CPPv4N8champsim11page_numberE", false]], "champsim::page_number_extent (c++ struct)": [[0, "_CPPv4N8champsim18page_number_extentE", false]], "champsim::page_number_extent::page_number_extent (c++ function)": [[0, "_CPPv4N8champsim18page_number_extent18page_number_extentEv", false]], "champsim::page_offset (c++ type)": [[0, "_CPPv4N8champsim11page_offsetE", false]], "champsim::page_offset_extent (c++ struct)": [[0, "_CPPv4N8champsim18page_offset_extentE", false]], "champsim::page_offset_extent::page_offset_extent (c++ function)": [[0, "_CPPv4N8champsim18page_offset_extent18page_offset_extentEv", false]], "champsim::pebi (c++ type)": [[2, "_CPPv4N8champsim4pebiE", false]], "champsim::splice (c++ function)": [[0, "_CPPv4IDpEN8champsim6spliceEDaDp13address_sliceI7ExtentsE", false]], "champsim::static_extent (c++ struct)": [[0, "_CPPv4I_N8champsim4data4bitsE_N8champsim4data4bitsEEN8champsim13static_extentE", false]], "champsim::static_extent::lower (c++ member)": [[0, "_CPPv4N8champsim13static_extent5lowerE", false]], "champsim::static_extent::upper (c++ member)": [[0, "_CPPv4N8champsim13static_extent5upperE", false]], "champsim::tebi (c++ type)": [[2, "_CPPv4N8champsim4tebiE", false]], "champsim::uoffset (c++ function)": [[0, "_CPPv4I0EN8champsim7uoffsetENSt15make_unsigned_tIN13address_sliceI6ExtentE15difference_typeEEE13address_sliceI6ExtentE13address_sliceI6ExtentE", false]], "collect() (in module config.util)": [[4, "config.util.collect", false]], "combine_named() (in module config.util)": [[4, "config.util.combine_named", false]], "config": [[4, "module-config", false]], "cut() (in module config.util)": [[4, "config.util.cut", false]], "do_for_first() (in module config.util)": [[4, "config.util.do_for_first", false]], "duplicate_to_length() (in module config.parse)": [[4, "config.parse.duplicate_to_length", false]], "explode() (in module config.util)": [[4, "config.util.explode", false]], "extend_each() (in module config.util)": [[4, "config.util.extend_each", false]], "extract_element() (in module config.parse)": [[4, "config.parse.extract_element", false]], "filewriter (class in config.filewrite)": [[4, "config.filewrite.FileWriter", false]], "find_victim (c++ function)": [[9, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t11access_type", false], [9, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t8uint32_t", false]], "finish() (config.filewrite.filewriter method)": [[4, "config.filewrite.FileWriter.finish", false]], "fragment (class in config.filewrite)": [[4, "config.filewrite.Fragment", false]], "from_config() (config.filewrite.fragment static method)": [[4, "config.filewrite.Fragment.from_config", false]], "initialize_branch_predictor (c++ function)": [[9, "_CPPv427initialize_branch_predictorv", false]], "initialize_btb (c++ function)": [[9, "_CPPv414initialize_btbv", false]], "initialize_replacement (c++ function)": [[9, "_CPPv422initialize_replacementv", false]], "iter_system() (in module config.util)": [[4, "config.util.iter_system", false]], "join() (config.filewrite.fragment static method)": [[4, "config.filewrite.Fragment.join", false]], "last_branch_result (c++ function)": [[9, "_CPPv418last_branch_result8uint64_t8uint64_t7uint8_t7uint8_t", false], [9, "_CPPv418last_branch_resultN8champsim7addressEN8champsim7addressE7uint8_t7uint8_t", false]], "module": [[4, "module-config", false]], "multiline() (in module config.util)": [[4, "config.util.multiline", false]], "o3_cpu (c++ class)": [[5, "_CPPv46O3_CPU", false]], "o3_cpu::branch_module_concept (c++ struct)": [[5, "_CPPv4N6O3_CPU21branch_module_conceptE", false]], "o3_cpu::branch_module_model (c++ struct)": [[5, "_CPPv4IDpEN6O3_CPU19branch_module_modelE", false]], "o3_cpu::btb_module_concept (c++ struct)": [[5, "_CPPv4N6O3_CPU18btb_module_conceptE", false]], "o3_cpu::btb_module_model (c++ struct)": [[5, "_CPPv4IDpEN6O3_CPU16btb_module_modelE", false]], "o3_cpu::dib_shift (c++ struct)": [[5, "_CPPv4N6O3_CPU9dib_shiftE", false]], "parse_config() (in module config.parse)": [[4, "config.parse.parse_config", false]], "predict_branch (c++ function)": [[9, "_CPPv414predict_branch8uint64_t", false], [9, "_CPPv414predict_branch8uint64_t8uint64_tb7uint8_t", false], [9, "_CPPv414predict_branchN8champsim7addressE", false], [9, "_CPPv414predict_branchN8champsim7addressEN8champsim7addressEb7uint8_t", false]], "prefetcher_branch_operate (c++ function)": [[9, "_CPPv425prefetcher_branch_operate8uint64_t7uint8_t8uint64_t", false], [9, "_CPPv425prefetcher_branch_operateN8champsim7addressE7uint8_tN8champsim7addressE", false]], "prefetcher_cache_fill (c++ function)": [[9, "_CPPv421prefetcher_cache_fill8uint64_t8uint32_t10uint32_wayb8uint64_t8uint32_t", false], [9, "_CPPv421prefetcher_cache_fillN8champsim7addressE8uint32_t10uint32_waybN8champsim7addressE8uint32_t", false]], "prefetcher_cache_operate (c++ function)": [[9, "_CPPv424prefetcher_cache_operate8uint64_t8uint64_tb7uint8_t8uint32_t", false], [9, "_CPPv424prefetcher_cache_operateN8champsim7addressEN8champsim7addressEbb11access_type8uint32_t", false], [9, "_CPPv424prefetcher_cache_operateN8champsim7addressEN8champsim7addressEbb7uint8_t8uint32_t", false]], "prefetcher_cycle_operate (c++ function)": [[9, "_CPPv424prefetcher_cycle_operatev", false]], "prefetcher_final_stats (c++ function)": [[9, "_CPPv422prefetcher_final_statsv", false]], "prefetcher_initialize (c++ function)": [[9, "_CPPv421prefetcher_initializev", false]], "propogate_down() (in module config.util)": [[4, "config.util.propogate_down", false]], "replacement_cache_fill (c++ function)": [[9, "_CPPv422replacement_cache_fill8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_type", false]], "replacement_final_stats (c++ function)": [[9, "_CPPv423replacement_final_statsv", false]], "sliding() (in module config.util)": [[4, "config.util.sliding", false]], "subdict() (in module config.util)": [[4, "config.util.subdict", false]], "update_btb (c++ function)": [[9, "_CPPv410update_btb8uint64_t8uint64_tb7uint8_t", false], [9, "_CPPv410update_btbN8champsim7addressEN8champsim7addressEb7uint8_t", false]], "update_replacement_state (c++ function)": [[9, "_CPPv424update_replacement_state8uint32_tll8uint64_t8uint64_t8uint64_tb", false], [9, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressE11access_typeb", false], [9, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_typeb", false], [9, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE8uint32_tb", false]], "upper_levels_for() (in module config.util)": [[4, "config.util.upper_levels_for", false]], "write() (config.filewrite.fragment method)": [[4, "config.filewrite.Fragment.write", false]], "write_files() (config.filewrite.filewriter method)": [[4, "config.filewrite.FileWriter.write_files", false]], "write_fragments() (config.filewrite.filewriter static method)": [[4, "config.filewrite.FileWriter.write_fragments", false]], "yield_from_star() (in module config.util)": [[4, "config.util.yield_from_star", false]]}, "objects": {"": [[3, 0, 1, "_CPPv45CACHE", "CACHE"], [3, 0, 1, "_CPPv4N5CACHE9mshr_typeE", "CACHE::mshr_type"], [3, 0, 1, "_CPPv4N5CACHE9mshr_type14returned_valueE", "CACHE::mshr_type::returned_value"], [3, 0, 1, "_CPPv4N5CACHE25prefetcher_module_conceptE", "CACHE::prefetcher_module_concept"], [3, 0, 1, "_CPPv4IDpEN5CACHE23prefetcher_module_modelE", "CACHE::prefetcher_module_model"], [3, 1, 1, "_CPPv4IDpEN5CACHE23prefetcher_module_modelE", "CACHE::prefetcher_module_model::Ps"], [3, 0, 1, "_CPPv4N5CACHE26replacement_module_conceptE", "CACHE::replacement_module_concept"], [3, 0, 1, "_CPPv4IDpEN5CACHE24replacement_module_modelE", "CACHE::replacement_module_model"], [3, 1, 1, "_CPPv4IDpEN5CACHE24replacement_module_modelE", "CACHE::replacement_module_model::Rs"], [5, 0, 1, "_CPPv46O3_CPU", "O3_CPU"], [5, 0, 1, "_CPPv4N6O3_CPU21branch_module_conceptE", "O3_CPU::branch_module_concept"], [5, 0, 1, "_CPPv4IDpEN6O3_CPU19branch_module_modelE", "O3_CPU::branch_module_model"], [5, 1, 1, "_CPPv4IDpEN6O3_CPU19branch_module_modelE", "O3_CPU::branch_module_model::Bs"], [5, 0, 1, "_CPPv4N6O3_CPU18btb_module_conceptE", "O3_CPU::btb_module_concept"], [5, 0, 1, "_CPPv4IDpEN6O3_CPU16btb_module_modelE", "O3_CPU::btb_module_model"], [5, 1, 1, "_CPPv4IDpEN6O3_CPU16btb_module_modelE", "O3_CPU::btb_module_model::Ts"], [5, 0, 1, "_CPPv4N6O3_CPU9dib_shiftE", "O3_CPU::dib_shift"], [9, 2, 1, "_CPPv414btb_prediction8uint64_t", "btb_prediction"], [9, 2, 1, "_CPPv414btb_prediction8uint64_t7uint8_t", "btb_prediction"], [9, 2, 1, "_CPPv414btb_predictionN8champsim7addressE", "btb_prediction"], [9, 2, 1, "_CPPv414btb_predictionN8champsim7addressE7uint8_t", "btb_prediction"], [9, 3, 1, "_CPPv414btb_prediction8uint64_t7uint8_t", "btb_prediction::branch_type"], [9, 3, 1, "_CPPv414btb_predictionN8champsim7addressE7uint8_t", "btb_prediction::branch_type"], [9, 3, 1, "_CPPv414btb_prediction8uint64_t", "btb_prediction::ip"], [9, 3, 1, "_CPPv414btb_prediction8uint64_t7uint8_t", "btb_prediction::ip"], [9, 3, 1, "_CPPv414btb_predictionN8champsim7addressE", "btb_prediction::ip"], [9, 3, 1, "_CPPv414btb_predictionN8champsim7addressE7uint8_t", "btb_prediction::ip"], [0, 4, 1, "_CPPv4N8champsim7addressE", "champsim::address"], [0, 0, 1, "_CPPv4I0EN8champsim13address_sliceE", "champsim::address_slice"], [0, 1, 1, "_CPPv4I0EN8champsim13address_sliceE", "champsim::address_slice::EXTENT"], [0, 2, 1, "_CPPv4I0EN8champsim13address_slice13address_sliceE11extent_typeRK13address_sliceI9OTHER_EXTE", "champsim::address_slice::address_slice"], [0, 2, 1, "_CPPv4I0EN8champsim13address_slice13address_sliceERK13address_sliceI9OTHER_EXTE", "champsim::address_slice::address_slice"], [0, 2, 1, "_CPPv4N8champsim13address_slice13address_sliceE11extent_type15underlying_type", "champsim::address_slice::address_slice"], [0, 2, 1, "_CPPv4N8champsim13address_slice13address_sliceE15underlying_type", "champsim::address_slice::address_slice"], [0, 2, 1, "_CPPv4N8champsim13address_slice13address_sliceEv", "champsim::address_slice::address_slice"], [0, 1, 1, "_CPPv4I0EN8champsim13address_slice13address_sliceE11extent_typeRK13address_sliceI9OTHER_EXTE", "champsim::address_slice::address_slice::OTHER_EXT"], [0, 1, 1, "_CPPv4I0EN8champsim13address_slice13address_sliceERK13address_sliceI9OTHER_EXTE", "champsim::address_slice::address_slice::OTHER_EXT"], [0, 3, 1, "_CPPv4I0EN8champsim13address_slice13address_sliceE11extent_typeRK13address_sliceI9OTHER_EXTE", "champsim::address_slice::address_slice::ext"], [0, 3, 1, "_CPPv4N8champsim13address_slice13address_sliceE11extent_type15underlying_type", "champsim::address_slice::address_slice::ext"], [0, 3, 1, "_CPPv4I0EN8champsim13address_slice13address_sliceE11extent_typeRK13address_sliceI9OTHER_EXTE", "champsim::address_slice::address_slice::val"], [0, 3, 1, "_CPPv4I0EN8champsim13address_slice13address_sliceERK13address_sliceI9OTHER_EXTE", "champsim::address_slice::address_slice::val"], [0, 3, 1, "_CPPv4N8champsim13address_slice13address_sliceE11extent_type15underlying_type", "champsim::address_slice::address_slice::val"], [0, 3, 1, "_CPPv4N8champsim13address_slice13address_sliceE15underlying_type", "champsim::address_slice::address_slice::val"], [0, 5, 1, "_CPPv4N8champsim13address_slice4bitsE", "champsim::address_slice::bits"], [0, 4, 1, "_CPPv4N8champsim13address_slice15difference_typeE", "champsim::address_slice::difference_type"], [0, 4, 1, "_CPPv4N8champsim13address_slice11extent_typeE", "champsim::address_slice::extent_type"], [0, 2, 1, "_CPPv4NK8champsim13address_slice12lower_extentEv", "champsim::address_slice::lower_extent"], [0, 2, 1, "_CPPv4NK8champsim13address_sliceneE9self_type", "champsim::address_slice::operator!="], [0, 3, 1, "_CPPv4NK8champsim13address_sliceneE9self_type", "champsim::address_slice::operator!=::other"], [0, 2, 1, "_CPPv4NK8champsim13address_sliceplE15difference_type", "champsim::address_slice::operator+"], [0, 2, 1, "_CPPv4NK8champsim13address_sliceplEN8champsim4data5bytesE", "champsim::address_slice::operator+"], [0, 2, 1, "_CPPv4N8champsim13address_sliceppEi", "champsim::address_slice::operator++"], [0, 2, 1, "_CPPv4N8champsim13address_sliceppEv", "champsim::address_slice::operator++"], [0, 3, 1, "_CPPv4NK8champsim13address_sliceplE15difference_type", "champsim::address_slice::operator+::delta"], [0, 3, 1, "_CPPv4NK8champsim13address_sliceplEN8champsim4data5bytesE", "champsim::address_slice::operator+::delta"], [0, 2, 1, "_CPPv4N8champsim13address_slicepLE15difference_type", "champsim::address_slice::operator+="], [0, 2, 1, "_CPPv4N8champsim13address_slicepLEN8champsim4data5bytesE", "champsim::address_slice::operator+="], [0, 3, 1, "_CPPv4N8champsim13address_slicepLE15difference_type", "champsim::address_slice::operator+=::delta"], [0, 3, 1, "_CPPv4N8champsim13address_slicepLEN8champsim4data5bytesE", "champsim::address_slice::operator+=::delta"], [0, 2, 1, "_CPPv4NK8champsim13address_slicemiE15difference_type", "champsim::address_slice::operator-"], [0, 2, 1, "_CPPv4NK8champsim13address_slicemiEN8champsim4data5bytesE", "champsim::address_slice::operator-"], [0, 2, 1, "_CPPv4N8champsim13address_slicemmEi", "champsim::address_slice::operator--"], [0, 2, 1, "_CPPv4N8champsim13address_slicemmEv", "champsim::address_slice::operator--"], [0, 3, 1, "_CPPv4NK8champsim13address_slicemiE15difference_type", "champsim::address_slice::operator-::delta"], [0, 3, 1, "_CPPv4NK8champsim13address_slicemiEN8champsim4data5bytesE", "champsim::address_slice::operator-::delta"], [0, 2, 1, "_CPPv4N8champsim13address_slicemIE15difference_type", "champsim::address_slice::operator-="], [0, 2, 1, "_CPPv4N8champsim13address_slicemIEN8champsim4data5bytesE", "champsim::address_slice::operator-="], [0, 3, 1, "_CPPv4N8champsim13address_slicemIE15difference_type", "champsim::address_slice::operator-=::delta"], [0, 3, 1, "_CPPv4N8champsim13address_slicemIEN8champsim4data5bytesE", "champsim::address_slice::operator-=::delta"], [0, 2, 1, "_CPPv4NK8champsim13address_sliceltE9self_type", "champsim::address_slice::operator<"], [0, 3, 1, "_CPPv4NK8champsim13address_sliceltE9self_type", "champsim::address_slice::operator<::other"], [0, 2, 1, "_CPPv4NK8champsim13address_sliceleE9self_type", "champsim::address_slice::operator<="], [0, 3, 1, "_CPPv4NK8champsim13address_sliceleE9self_type", "champsim::address_slice::operator<=::other"], [0, 2, 1, "_CPPv4NK8champsim13address_sliceeqE9self_type", "champsim::address_slice::operator=="], [0, 3, 1, "_CPPv4NK8champsim13address_sliceeqE9self_type", "champsim::address_slice::operator==::other"], [0, 2, 1, "_CPPv4NK8champsim13address_slicegtE9self_type", "champsim::address_slice::operator>"], [0, 3, 1, "_CPPv4NK8champsim13address_slicegtE9self_type", "champsim::address_slice::operator>::other"], [0, 2, 1, "_CPPv4NK8champsim13address_slicegeE9self_type", "champsim::address_slice::operator>="], [0, 3, 1, "_CPPv4NK8champsim13address_slicegeE9self_type", "champsim::address_slice::operator>=::other"], [0, 2, 1, "_CPPv4I0ENK8champsim13address_slice5sliceEDa10SUB_EXTENT", "champsim::address_slice::slice"], [0, 2, 1, "_CPPv4I_N8champsim4data4bitsE_N8champsim4data4bitsEENK8champsim13address_slice5sliceEDav", "champsim::address_slice::slice"], [0, 1, 1, "_CPPv4I0ENK8champsim13address_slice5sliceEDa10SUB_EXTENT", "champsim::address_slice::slice::SUB_EXTENT"], [0, 1, 1, "_CPPv4I_N8champsim4data4bitsE_N8champsim4data4bitsEENK8champsim13address_slice5sliceEDav", "champsim::address_slice::slice::new_lower"], [0, 1, 1, "_CPPv4I_N8champsim4data4bitsE_N8champsim4data4bitsEENK8champsim13address_slice5sliceEDav", "champsim::address_slice::slice::new_upper"], [0, 3, 1, "_CPPv4I0ENK8champsim13address_slice5sliceEDa10SUB_EXTENT", "champsim::address_slice::slice::subextent"], [0, 2, 1, "_CPPv4I_N8champsim4data4bitsEENK8champsim13address_slice11slice_lowerEDav", "champsim::address_slice::slice_lower"], [0, 2, 1, "_CPPv4NK8champsim13address_slice11slice_lowerEN8champsim4data4bitsE", "champsim::address_slice::slice_lower"], [0, 3, 1, "_CPPv4NK8champsim13address_slice11slice_lowerEN8champsim4data4bitsE", "champsim::address_slice::slice_lower::new_upper"], [0, 1, 1, "_CPPv4I_N8champsim4data4bitsEENK8champsim13address_slice11slice_lowerEDav", "champsim::address_slice::slice_lower::new_upper"], [0, 2, 1, "_CPPv4I_N8champsim4data4bitsEENK8champsim13address_slice11slice_upperEDav", "champsim::address_slice::slice_upper"], [0, 2, 1, "_CPPv4NK8champsim13address_slice11slice_upperEN8champsim4data4bitsE", "champsim::address_slice::slice_upper"], [0, 3, 1, "_CPPv4NK8champsim13address_slice11slice_upperEN8champsim4data4bitsE", "champsim::address_slice::slice_upper::new_lower"], [0, 1, 1, "_CPPv4I_N8champsim4data4bitsEENK8champsim13address_slice11slice_upperEDav", "champsim::address_slice::slice_upper::new_lower"], [0, 2, 1, "_CPPv4I_N8champsim4data4bitsEENK8champsim13address_slice5splitEDav", "champsim::address_slice::split"], [0, 2, 1, "_CPPv4NK8champsim13address_slice5splitEN8champsim4data4bitsE", "champsim::address_slice::split"], [0, 3, 1, "_CPPv4NK8champsim13address_slice5splitEN8champsim4data4bitsE", "champsim::address_slice::split::split_loc"], [0, 1, 1, "_CPPv4I_N8champsim4data4bitsEENK8champsim13address_slice5splitEDav", "champsim::address_slice::split::split_loc"], [0, 2, 1, "_CPPv4I0ENK8champsim13address_slice2toE1Tv", "champsim::address_slice::to"], [0, 1, 1, "_CPPv4I0ENK8champsim13address_slice2toE1Tv", "champsim::address_slice::to::T"], [0, 4, 1, "_CPPv4N8champsim13address_slice15underlying_typeE", "champsim::address_slice::underlying_type"], [0, 2, 1, "_CPPv4NK8champsim13address_slice12upper_extentEv", "champsim::address_slice::upper_extent"], [1, 0, 1, "_CPPv4N8champsim9bandwidthE", "champsim::bandwidth"], [1, 2, 1, "_CPPv4NK8champsim9bandwidth15amount_consumedEv", "champsim::bandwidth::amount_consumed"], [1, 2, 1, "_CPPv4NK8champsim9bandwidth16amount_remainingEv", "champsim::bandwidth::amount_remaining"], [1, 2, 1, "_CPPv4N8champsim9bandwidth9bandwidthE12maximum_type", "champsim::bandwidth::bandwidth"], [1, 3, 1, "_CPPv4N8champsim9bandwidth9bandwidthE12maximum_type", "champsim::bandwidth::bandwidth::maximum"], [1, 2, 1, "_CPPv4N8champsim9bandwidth7consumeE15underlying_type", "champsim::bandwidth::consume"], [1, 2, 1, "_CPPv4N8champsim9bandwidth7consumeEv", "champsim::bandwidth::consume"], [1, 3, 1, "_CPPv4N8champsim9bandwidth7consumeE15underlying_type", "champsim::bandwidth::consume::delta"], [1, 2, 1, "_CPPv4NK8champsim9bandwidth13has_remainingEv", "champsim::bandwidth::has_remaining"], [1, 4, 1, "_CPPv4N8champsim9bandwidth12maximum_typeE", "champsim::bandwidth::maximum_type"], [1, 2, 1, "_CPPv4N8champsim9bandwidth5resetEv", "champsim::bandwidth::reset"], [0, 4, 1, "_CPPv4N8champsim12block_numberE", "champsim::block_number"], [0, 0, 1, "_CPPv4N8champsim19block_number_extentE", "champsim::block_number_extent"], [0, 2, 1, "_CPPv4N8champsim19block_number_extent19block_number_extentEv", "champsim::block_number_extent::block_number_extent"], [0, 4, 1, "_CPPv4N8champsim12block_offsetE", "champsim::block_offset"], [0, 0, 1, "_CPPv4N8champsim19block_offset_extentE", "champsim::block_offset_extent"], [0, 2, 1, "_CPPv4N8champsim19block_offset_extent19block_offset_extentEv", "champsim::block_offset_extent::block_offset_extent"], [3, 0, 1, "_CPPv4I00EN8champsim13cache_builderE", "champsim::cache_builder"], [3, 1, 1, "_CPPv4I00EN8champsim13cache_builderE", "champsim::cache_builder::P"], [3, 1, 1, "_CPPv4I00EN8champsim13cache_builderE", "champsim::cache_builder::R"], [3, 2, 1, "_CPPv4N8champsim13cache_builder12clock_periodEN8champsim6chrono11picosecondsE", "champsim::cache_builder::clock_period"], [3, 3, 1, "_CPPv4N8champsim13cache_builder12clock_periodEN8champsim6chrono11picosecondsE", "champsim::cache_builder::clock_period::clock_period_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder14fill_bandwidthEN8champsim9bandwidth12maximum_typeE", "champsim::cache_builder::fill_bandwidth"], [3, 3, 1, "_CPPv4N8champsim13cache_builder14fill_bandwidthEN8champsim9bandwidth12maximum_typeE", "champsim::cache_builder::fill_bandwidth::max_write_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder12fill_latencyE8uint64_t", "champsim::cache_builder::fill_latency"], [3, 3, 1, "_CPPv4N8champsim13cache_builder12fill_latencyE8uint64_t", "champsim::cache_builder::fill_latency::fill_lat_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder11hit_latencyE8uint64_t", "champsim::cache_builder::hit_latency"], [3, 3, 1, "_CPPv4N8champsim13cache_builder11hit_latencyE8uint64_t", "champsim::cache_builder::hit_latency::hit_lat_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder7latencyE8uint64_t", "champsim::cache_builder::latency"], [3, 3, 1, "_CPPv4N8champsim13cache_builder7latencyE8uint64_t", "champsim::cache_builder::latency::lat_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder16log2_offset_bitsEj", "champsim::cache_builder::log2_offset_bits"], [3, 3, 1, "_CPPv4N8champsim13cache_builder16log2_offset_bitsEj", "champsim::cache_builder::log2_offset_bits::log2_offset_bits_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder9log2_setsE8uint32_t", "champsim::cache_builder::log2_sets"], [3, 3, 1, "_CPPv4N8champsim13cache_builder9log2_setsE8uint32_t", "champsim::cache_builder::log2_sets::log2_sets_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder9log2_sizeE8uint64_t", "champsim::cache_builder::log2_size"], [3, 3, 1, "_CPPv4N8champsim13cache_builder9log2_sizeE8uint64_t", "champsim::cache_builder::log2_size::log2_size_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder9log2_waysE8uint32_t", "champsim::cache_builder::log2_ways"], [3, 3, 1, "_CPPv4N8champsim13cache_builder9log2_waysE8uint32_t", "champsim::cache_builder::log2_ways::log2_ways_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder11lower_levelEPN8champsim7channelE", "champsim::cache_builder::lower_level"], [3, 3, 1, "_CPPv4N8champsim13cache_builder11lower_levelEPN8champsim7channelE", "champsim::cache_builder::lower_level::ll_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder15lower_translateEPN8champsim7channelE", "champsim::cache_builder::lower_translate"], [3, 3, 1, "_CPPv4N8champsim13cache_builder15lower_translateEPN8champsim7channelE", "champsim::cache_builder::lower_translate::lt_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder9mshr_sizeE8uint32_t", "champsim::cache_builder::mshr_size"], [3, 3, 1, "_CPPv4N8champsim13cache_builder9mshr_sizeE8uint32_t", "champsim::cache_builder::mshr_size::mshr_size_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder4nameENSt6stringE", "champsim::cache_builder::name"], [3, 3, 1, "_CPPv4N8champsim13cache_builder4nameENSt6stringE", "champsim::cache_builder::name::name_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder11offset_bitsEN8champsim4data4bitsE", "champsim::cache_builder::offset_bits"], [3, 3, 1, "_CPPv4N8champsim13cache_builder11offset_bitsEN8champsim4data4bitsE", "champsim::cache_builder::offset_bits::offset_bits_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder7pq_sizeE8uint32_t", "champsim::cache_builder::pq_size"], [3, 3, 1, "_CPPv4N8champsim13cache_builder7pq_sizeE8uint32_t", "champsim::cache_builder::pq_size::pq_size_"], [3, 2, 1, "_CPPv4IDpEN8champsim13cache_builder17prefetch_activateER9self_typeDp5Elems", "champsim::cache_builder::prefetch_activate"], [3, 1, 1, "_CPPv4IDpEN8champsim13cache_builder17prefetch_activateER9self_typeDp5Elems", "champsim::cache_builder::prefetch_activate::Elems"], [3, 3, 1, "_CPPv4IDpEN8champsim13cache_builder17prefetch_activateER9self_typeDp5Elems", "champsim::cache_builder::prefetch_activate::pref_act_elems"], [3, 2, 1, "_CPPv4IDpEN8champsim13cache_builder10prefetcherE13cache_builderI32cache_builder_module_type_holderIDp2PsE1REv", "champsim::cache_builder::prefetcher"], [3, 1, 1, "_CPPv4IDpEN8champsim13cache_builder10prefetcherE13cache_builderI32cache_builder_module_type_holderIDp2PsE1REv", "champsim::cache_builder::prefetcher::Ps"], [3, 2, 1, "_CPPv4IDpEN8champsim13cache_builder11replacementE13cache_builderI1P32cache_builder_module_type_holderIDp2RsEEv", "champsim::cache_builder::replacement"], [3, 1, 1, "_CPPv4IDpEN8champsim13cache_builder11replacementE13cache_builderI1P32cache_builder_module_type_holderIDp2RsEEv", "champsim::cache_builder::replacement::Rs"], [3, 2, 1, "_CPPv4N8champsim13cache_builder22reset_prefetch_as_loadEv", "champsim::cache_builder::reset_prefetch_as_load"], [3, 2, 1, "_CPPv4N8champsim13cache_builder22reset_virtual_prefetchEv", "champsim::cache_builder::reset_virtual_prefetch"], [3, 2, 1, "_CPPv4N8champsim13cache_builder25reset_wq_checks_full_addrEv", "champsim::cache_builder::reset_wq_checks_full_addr"], [3, 2, 1, "_CPPv4N8champsim13cache_builder20set_prefetch_as_loadEv", "champsim::cache_builder::set_prefetch_as_load"], [3, 2, 1, "_CPPv4N8champsim13cache_builder20set_virtual_prefetchEv", "champsim::cache_builder::set_virtual_prefetch"], [3, 2, 1, "_CPPv4N8champsim13cache_builder23set_wq_checks_full_addrEv", "champsim::cache_builder::set_wq_checks_full_addr"], [3, 2, 1, "_CPPv4N8champsim13cache_builder4setsE8uint32_t", "champsim::cache_builder::sets"], [3, 3, 1, "_CPPv4N8champsim13cache_builder4setsE8uint32_t", "champsim::cache_builder::sets::sets_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder4sizeEN8champsim4data5bytesE", "champsim::cache_builder::size"], [3, 3, 1, "_CPPv4N8champsim13cache_builder4sizeEN8champsim4data5bytesE", "champsim::cache_builder::size::size_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder13tag_bandwidthEN8champsim9bandwidth12maximum_typeE", "champsim::cache_builder::tag_bandwidth"], [3, 3, 1, "_CPPv4N8champsim13cache_builder13tag_bandwidthEN8champsim9bandwidth12maximum_typeE", "champsim::cache_builder::tag_bandwidth::max_read_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder12upper_levelsERRNSt6vectorIPN8champsim7channelEEE", "champsim::cache_builder::upper_levels"], [3, 3, 1, "_CPPv4N8champsim13cache_builder12upper_levelsERRNSt6vectorIPN8champsim7channelEEE", "champsim::cache_builder::upper_levels::uls_"], [3, 2, 1, "_CPPv4N8champsim13cache_builder4waysE8uint32_t", "champsim::cache_builder::ways"], [3, 3, 1, "_CPPv4N8champsim13cache_builder4waysE8uint32_t", "champsim::cache_builder::ways::ways_"], [5, 0, 1, "_CPPv4I00EN8champsim12core_builderE", "champsim::core_builder"], [5, 1, 1, "_CPPv4I00EN8champsim12core_builderE", "champsim::core_builder::B"], [5, 1, 1, "_CPPv4I00EN8champsim12core_builderE", "champsim::core_builder::T"], [5, 2, 1, "_CPPv4IDpEN8champsim12core_builder16branch_predictorE12core_builderI31core_builder_module_type_holderIDp2BsE1TEv", "champsim::core_builder::branch_predictor"], [5, 1, 1, "_CPPv4IDpEN8champsim12core_builder16branch_predictorE12core_builderI31core_builder_module_type_holderIDp2BsE1TEv", "champsim::core_builder::branch_predictor::Bs"], [5, 2, 1, "_CPPv4IDpEN8champsim12core_builder3btbE12core_builderI1B31core_builder_module_type_holderIDp2TsEEv", "champsim::core_builder::btb"], [5, 1, 1, "_CPPv4IDpEN8champsim12core_builder3btbE12core_builderI1B31core_builder_module_type_holderIDp2TsEEv", "champsim::core_builder::btb::Ts"], [5, 2, 1, "_CPPv4N8champsim12core_builder12clock_periodEN8champsim6chrono11picosecondsE", "champsim::core_builder::clock_period"], [5, 3, 1, "_CPPv4N8champsim12core_builder12clock_periodEN8champsim6chrono11picosecondsE", "champsim::core_builder::clock_period::clock_period_"], [5, 2, 1, "_CPPv4N8champsim12core_builder11data_queuesEPN8champsim7channelE", "champsim::core_builder::data_queues"], [5, 3, 1, "_CPPv4N8champsim12core_builder11data_queuesEPN8champsim7channelE", "champsim::core_builder::data_queues::data_queues_"], [5, 2, 1, "_CPPv4N8champsim12core_builder18decode_buffer_sizeENSt6size_tE", "champsim::core_builder::decode_buffer_size"], [5, 3, 1, "_CPPv4N8champsim12core_builder18decode_buffer_sizeENSt6size_tE", "champsim::core_builder::decode_buffer_size::decode_buffer_size_"], [5, 2, 1, "_CPPv4N8champsim12core_builder14decode_latencyEj", "champsim::core_builder::decode_latency"], [5, 3, 1, "_CPPv4N8champsim12core_builder14decode_latencyEj", "champsim::core_builder::decode_latency::decode_latency_"], [5, 2, 1, "_CPPv4N8champsim12core_builder12decode_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::decode_width"], [5, 3, 1, "_CPPv4N8champsim12core_builder12decode_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::decode_width::decode_width_"], [5, 2, 1, "_CPPv4N8champsim12core_builder19dib_hit_buffer_sizeENSt6size_tE", "champsim::core_builder::dib_hit_buffer_size"], [5, 3, 1, "_CPPv4N8champsim12core_builder19dib_hit_buffer_sizeENSt6size_tE", "champsim::core_builder::dib_hit_buffer_size::dib_hit_buffer_size_"], [5, 2, 1, "_CPPv4N8champsim12core_builder15dib_hit_latencyEj", "champsim::core_builder::dib_hit_latency"], [5, 3, 1, "_CPPv4N8champsim12core_builder15dib_hit_latencyEj", "champsim::core_builder::dib_hit_latency::dib_hit_latency_"], [5, 2, 1, "_CPPv4N8champsim12core_builder17dib_inorder_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::dib_inorder_width"], [5, 3, 1, "_CPPv4N8champsim12core_builder17dib_inorder_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::dib_inorder_width::dib_inorder_width_"], [5, 2, 1, "_CPPv4N8champsim12core_builder7dib_setENSt6size_tE", "champsim::core_builder::dib_set"], [5, 3, 1, "_CPPv4N8champsim12core_builder7dib_setENSt6size_tE", "champsim::core_builder::dib_set::dib_set_"], [5, 2, 1, "_CPPv4N8champsim12core_builder7dib_wayENSt6size_tE", "champsim::core_builder::dib_way"], [5, 3, 1, "_CPPv4N8champsim12core_builder7dib_wayENSt6size_tE", "champsim::core_builder::dib_way::dib_way_"], [5, 2, 1, "_CPPv4N8champsim12core_builder10dib_windowENSt6size_tE", "champsim::core_builder::dib_window"], [5, 3, 1, "_CPPv4N8champsim12core_builder10dib_windowENSt6size_tE", "champsim::core_builder::dib_window::dib_window_"], [5, 2, 1, "_CPPv4N8champsim12core_builder20dispatch_buffer_sizeENSt6size_tE", "champsim::core_builder::dispatch_buffer_size"], [5, 3, 1, "_CPPv4N8champsim12core_builder20dispatch_buffer_sizeENSt6size_tE", "champsim::core_builder::dispatch_buffer_size::dispatch_buffer_size_"], [5, 2, 1, "_CPPv4N8champsim12core_builder16dispatch_latencyEj", "champsim::core_builder::dispatch_latency"], [5, 3, 1, "_CPPv4N8champsim12core_builder16dispatch_latencyEj", "champsim::core_builder::dispatch_latency::dispatch_latency_"], [5, 2, 1, "_CPPv4N8champsim12core_builder14dispatch_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::dispatch_width"], [5, 3, 1, "_CPPv4N8champsim12core_builder14dispatch_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::dispatch_width::dispatch_width_"], [5, 2, 1, "_CPPv4N8champsim12core_builder15execute_latencyEj", "champsim::core_builder::execute_latency"], [5, 3, 1, "_CPPv4N8champsim12core_builder15execute_latencyEj", "champsim::core_builder::execute_latency::execute_latency_"], [5, 2, 1, "_CPPv4N8champsim12core_builder13execute_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::execute_width"], [5, 3, 1, "_CPPv4N8champsim12core_builder13execute_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::execute_width::execute_width_"], [5, 2, 1, "_CPPv4N8champsim12core_builder12fetch_queuesEPN8champsim7channelE", "champsim::core_builder::fetch_queues"], [5, 3, 1, "_CPPv4N8champsim12core_builder12fetch_queuesEPN8champsim7channelE", "champsim::core_builder::fetch_queues::fetch_queues_"], [5, 2, 1, "_CPPv4N8champsim12core_builder11fetch_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::fetch_width"], [5, 3, 1, "_CPPv4N8champsim12core_builder11fetch_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::fetch_width::fetch_width_"], [5, 2, 1, "_CPPv4N8champsim12core_builder18ifetch_buffer_sizeENSt6size_tE", "champsim::core_builder::ifetch_buffer_size"], [5, 3, 1, "_CPPv4N8champsim12core_builder18ifetch_buffer_sizeENSt6size_tE", "champsim::core_builder::ifetch_buffer_size::ifetch_buffer_size_"], [5, 2, 1, "_CPPv4N8champsim12core_builder13l1d_bandwidthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::l1d_bandwidth"], [5, 3, 1, "_CPPv4N8champsim12core_builder13l1d_bandwidthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::l1d_bandwidth::l1d_bw_"], [5, 2, 1, "_CPPv4N8champsim12core_builder3l1iEP5CACHE", "champsim::core_builder::l1i"], [5, 3, 1, "_CPPv4N8champsim12core_builder3l1iEP5CACHE", "champsim::core_builder::l1i::l1i_"], [5, 2, 1, "_CPPv4N8champsim12core_builder13l1i_bandwidthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::l1i_bandwidth"], [5, 3, 1, "_CPPv4N8champsim12core_builder13l1i_bandwidthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::l1i_bandwidth::l1i_bw_"], [5, 2, 1, "_CPPv4N8champsim12core_builder7lq_sizeENSt6size_tE", "champsim::core_builder::lq_size"], [5, 3, 1, "_CPPv4N8champsim12core_builder7lq_sizeENSt6size_tE", "champsim::core_builder::lq_size::lq_size_"], [5, 2, 1, "_CPPv4N8champsim12core_builder8lq_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::lq_width"], [5, 3, 1, "_CPPv4N8champsim12core_builder8lq_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::lq_width::lq_width_"], [5, 2, 1, "_CPPv4N8champsim12core_builder18mispredict_penaltyEj", "champsim::core_builder::mispredict_penalty"], [5, 3, 1, "_CPPv4N8champsim12core_builder18mispredict_penaltyEj", "champsim::core_builder::mispredict_penalty::mispredict_penalty_"], [5, 2, 1, "_CPPv4N8champsim12core_builder18register_file_sizeENSt6size_tE", "champsim::core_builder::register_file_size"], [5, 3, 1, "_CPPv4N8champsim12core_builder18register_file_sizeENSt6size_tE", "champsim::core_builder::register_file_size::register_file_size_"], [5, 2, 1, "_CPPv4N8champsim12core_builder12retire_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::retire_width"], [5, 3, 1, "_CPPv4N8champsim12core_builder12retire_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::retire_width::retire_width_"], [5, 2, 1, "_CPPv4N8champsim12core_builder8rob_sizeENSt6size_tE", "champsim::core_builder::rob_size"], [5, 3, 1, "_CPPv4N8champsim12core_builder8rob_sizeENSt6size_tE", "champsim::core_builder::rob_size::rob_size_"], [5, 2, 1, "_CPPv4N8champsim12core_builder16schedule_latencyEj", "champsim::core_builder::schedule_latency"], [5, 3, 1, "_CPPv4N8champsim12core_builder16schedule_latencyEj", "champsim::core_builder::schedule_latency::schedule_latency_"], [5, 2, 1, "_CPPv4N8champsim12core_builder14schedule_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::schedule_width"], [5, 3, 1, "_CPPv4N8champsim12core_builder14schedule_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::schedule_width::schedule_width_"], [5, 2, 1, "_CPPv4N8champsim12core_builder7sq_sizeENSt6size_tE", "champsim::core_builder::sq_size"], [5, 3, 1, "_CPPv4N8champsim12core_builder7sq_sizeENSt6size_tE", "champsim::core_builder::sq_size::sq_size_"], [5, 2, 1, "_CPPv4N8champsim12core_builder8sq_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::sq_width"], [5, 3, 1, "_CPPv4N8champsim12core_builder8sq_widthEN8champsim9bandwidth12maximum_typeE", "champsim::core_builder::sq_width::sq_width_"], [2, 6, 1, "_CPPv4N8champsim4data4bitsE", "champsim::data::bits"], [2, 4, 1, "_CPPv4N8champsim4data5bytesE", "champsim::data::bytes"], [2, 2, 1, "_CPPv4N8champsim4data13data_literalsli2_BEy", "champsim::data::data_literals::operator""_B"], [2, 3, 1, "_CPPv4N8champsim4data13data_literalsli2_BEy", "champsim::data::data_literals::operator""_B::val"], [2, 2, 1, "_CPPv4N8champsim4data13data_literalsli4_GiBEy", "champsim::data::data_literals::operator""_GiB"], [2, 3, 1, "_CPPv4N8champsim4data13data_literalsli4_GiBEy", "champsim::data::data_literals::operator""_GiB::val"], [2, 2, 1, "_CPPv4N8champsim4data13data_literalsli4_MiBEy", "champsim::data::data_literals::operator""_MiB"], [2, 3, 1, "_CPPv4N8champsim4data13data_literalsli4_MiBEy", "champsim::data::data_literals::operator""_MiB::val"], [2, 2, 1, "_CPPv4N8champsim4data13data_literalsli4_TiBEy", "champsim::data::data_literals::operator""_TiB"], [2, 3, 1, "_CPPv4N8champsim4data13data_literalsli4_TiBEy", "champsim::data::data_literals::operator""_TiB::val"], [2, 2, 1, "_CPPv4N8champsim4data13data_literalsli2_bEy", "champsim::data::data_literals::operator""_b"], [2, 3, 1, "_CPPv4N8champsim4data13data_literalsli2_bEy", "champsim::data::data_literals::operator""_b::val"], [2, 2, 1, "_CPPv4N8champsim4data13data_literalsli4_kiBEy", "champsim::data::data_literals::operator""_kiB"], [2, 3, 1, "_CPPv4N8champsim4data13data_literalsli4_kiBEy", "champsim::data::data_literals::operator""_kiB::val"], [2, 4, 1, "_CPPv4N8champsim4data9gibibytesE", "champsim::data::gibibytes"], [2, 4, 1, "_CPPv4N8champsim4data9kibibytesE", "champsim::data::kibibytes"], [2, 4, 1, "_CPPv4N8champsim4data9mebibytesE", "champsim::data::mebibytes"], [2, 0, 1, "_CPPv4I00EN8champsim4data4sizeE", "champsim::data::size"], [2, 1, 1, "_CPPv4I00EN8champsim4data4sizeE", "champsim::data::size::Rep"], [2, 1, 1, "_CPPv4I00EN8champsim4data4sizeE", "champsim::data::size::Unit"], [2, 2, 1, "_CPPv4NK8champsim4data4size5countEv", "champsim::data::size::count"], [2, 2, 1, "_CPPv4I00EN8champsim4data4size4sizeERK4sizeI4Rep25Unit2E", "champsim::data::size::size"], [2, 2, 1, "_CPPv4N8champsim4data4size4sizeE3rep", "champsim::data::size::size"], [2, 1, 1, "_CPPv4I00EN8champsim4data4size4sizeERK4sizeI4Rep25Unit2E", "champsim::data::size::size::Rep2"], [2, 1, 1, "_CPPv4I00EN8champsim4data4size4sizeERK4sizeI4Rep25Unit2E", "champsim::data::size::size::Unit2"], [2, 3, 1, "_CPPv4I00EN8champsim4data4size4sizeERK4sizeI4Rep25Unit2E", "champsim::data::size::size::other"], [2, 3, 1, "_CPPv4N8champsim4data4size4sizeE3rep", "champsim::data::size::size::other"], [2, 4, 1, "_CPPv4N8champsim4data9tebibytesE", "champsim::data::tebibytes"], [0, 0, 1, "_CPPv4N8champsim14dynamic_extentE", "champsim::dynamic_extent"], [0, 2, 1, "_CPPv4N8champsim14dynamic_extent14dynamic_extentEN8champsim4data4bitsEN8champsim4data4bitsE", "champsim::dynamic_extent::dynamic_extent"], [0, 2, 1, "_CPPv4N8champsim14dynamic_extent14dynamic_extentEN8champsim4data4bitsENSt6size_tE", "champsim::dynamic_extent::dynamic_extent"], [0, 3, 1, "_CPPv4N8champsim14dynamic_extent14dynamic_extentEN8champsim4data4bitsEN8champsim4data4bitsE", "champsim::dynamic_extent::dynamic_extent::low"], [0, 3, 1, "_CPPv4N8champsim14dynamic_extent14dynamic_extentEN8champsim4data4bitsENSt6size_tE", "champsim::dynamic_extent::dynamic_extent::low"], [0, 3, 1, "_CPPv4N8champsim14dynamic_extent14dynamic_extentEN8champsim4data4bitsENSt6size_tE", "champsim::dynamic_extent::dynamic_extent::size"], [0, 3, 1, "_CPPv4N8champsim14dynamic_extent14dynamic_extentEN8champsim4data4bitsEN8champsim4data4bitsE", "champsim::dynamic_extent::dynamic_extent::up"], [0, 5, 1, "_CPPv4N8champsim14dynamic_extent5lowerE", "champsim::dynamic_extent::lower"], [0, 5, 1, "_CPPv4N8champsim14dynamic_extent5upperE", "champsim::dynamic_extent::upper"], [2, 4, 1, "_CPPv4N8champsim4exbiE", "champsim::exbi"], [2, 4, 1, "_CPPv4N8champsim4gibiE", "champsim::gibi"], [2, 4, 1, "_CPPv4N8champsim4kibiE", "champsim::kibi"], [2, 4, 1, "_CPPv4N8champsim4mebiE", "champsim::mebi"], [8, 0, 1, "_CPPv4I0_8val_type_8val_typeEN8champsim3msl14base_fwcounterE", "champsim::msl::base_fwcounter"], [8, 1, 1, "_CPPv4I0_8val_type_8val_typeEN8champsim3msl14base_fwcounterE", "champsim::msl::base_fwcounter::MAXVAL"], [8, 1, 1, "_CPPv4I0_8val_type_8val_typeEN8champsim3msl14base_fwcounterE", "champsim::msl::base_fwcounter::MINVAL"], [8, 2, 1, "_CPPv4NK8champsim3msl14base_fwcounter6is_maxEv", "champsim::msl::base_fwcounter::is_max"], [8, 2, 1, "_CPPv4NK8champsim3msl14base_fwcounter6is_minEv", "champsim::msl::base_fwcounter::is_min"], [8, 2, 1, "_CPPv4N8champsim3msl14base_fwcountermLE14base_fwcounterI8val_type6MAXVAL6MINVALE", "champsim::msl::base_fwcounter::operator*="], [8, 2, 1, "_CPPv4N8champsim3msl14base_fwcounterppEv", "champsim::msl::base_fwcounter::operator++"], [8, 2, 1, "_CPPv4N8champsim3msl14base_fwcounterpLE14base_fwcounterI8val_type6MAXVAL6MINVALE", "champsim::msl::base_fwcounter::operator+="], [8, 2, 1, "_CPPv4N8champsim3msl14base_fwcountermmEv", "champsim::msl::base_fwcounter::operator--"], [8, 2, 1, "_CPPv4N8champsim3msl14base_fwcountermIE14base_fwcounterI8val_type6MAXVAL6MINVALE", "champsim::msl::base_fwcounter::operator-="], [8, 2, 1, "_CPPv4N8champsim3msl14base_fwcounterdVE14base_fwcounterI8val_type6MAXVAL6MINVALE", "champsim::msl::base_fwcounter::operator/="], [8, 1, 1, "_CPPv4I0_8val_type_8val_typeEN8champsim3msl14base_fwcounterE", "champsim::msl::base_fwcounter::val_type"], [8, 2, 1, "_CPPv4NK8champsim3msl14base_fwcounter5valueEv", "champsim::msl::base_fwcounter::value"], [8, 2, 1, "_CPPv4N8champsim3msl7bitmaskEN8champsim4data4bitsE", "champsim::msl::bitmask"], [8, 2, 1, "_CPPv4N8champsim3msl7bitmaskEN8champsim4data4bitsEN8champsim4data4bitsE", "champsim::msl::bitmask"], [8, 2, 1, "_CPPv4N8champsim3msl7bitmaskENSt6size_tENSt6size_tE", "champsim::msl::bitmask"], [8, 3, 1, "_CPPv4N8champsim3msl7bitmaskEN8champsim4data4bitsE", "champsim::msl::bitmask::begin"], [8, 3, 1, "_CPPv4N8champsim3msl7bitmaskEN8champsim4data4bitsEN8champsim4data4bitsE", "champsim::msl::bitmask::begin"], [8, 3, 1, "_CPPv4N8champsim3msl7bitmaskENSt6size_tENSt6size_tE", "champsim::msl::bitmask::begin"], [8, 3, 1, "_CPPv4N8champsim3msl7bitmaskEN8champsim4data4bitsEN8champsim4data4bitsE", "champsim::msl::bitmask::end"], [8, 3, 1, "_CPPv4N8champsim3msl7bitmaskENSt6size_tENSt6size_tE", "champsim::msl::bitmask::end"], [8, 4, 1, "_CPPv4I_NSt6size_tEEN8champsim3msl9fwcounterE", "champsim::msl::fwcounter"], [8, 1, 1, "_CPPv4I_NSt6size_tEEN8champsim3msl9fwcounterE", "champsim::msl::fwcounter::WIDTH"], [8, 2, 1, "_CPPv4N8champsim3msl4ipowExj", "champsim::msl::ipow"], [8, 3, 1, "_CPPv4N8champsim3msl4ipowExj", "champsim::msl::ipow::base"], [8, 3, 1, "_CPPv4N8champsim3msl4ipowExj", "champsim::msl::ipow::exp"], [8, 2, 1, "_CPPv4I0EN8champsim3msl13is_power_of_2Eb1T", "champsim::msl::is_power_of_2"], [8, 1, 1, "_CPPv4I0EN8champsim3msl13is_power_of_2Eb1T", "champsim::msl::is_power_of_2::T"], [8, 3, 1, "_CPPv4I0EN8champsim3msl13is_power_of_2Eb1T", "champsim::msl::is_power_of_2::n"], [8, 2, 1, "_CPPv4I0EN8champsim3msl3lg2EDa1T", "champsim::msl::lg2"], [8, 1, 1, "_CPPv4I0EN8champsim3msl3lg2EDa1T", "champsim::msl::lg2::T"], [8, 3, 1, "_CPPv4I0EN8champsim3msl3lg2EDa1T", "champsim::msl::lg2::n"], [8, 2, 1, "_CPPv4I0EN8champsim3msl9next_pow2E1T1T", "champsim::msl::next_pow2"], [8, 1, 1, "_CPPv4I0EN8champsim3msl9next_pow2E1T1T", "champsim::msl::next_pow2::T"], [8, 3, 1, "_CPPv4I0EN8champsim3msl9next_pow2E1T1T", "champsim::msl::next_pow2::n"], [8, 4, 1, "_CPPv4I_NSt6size_tEEN8champsim3msl10sfwcounterE", "champsim::msl::sfwcounter"], [8, 1, 1, "_CPPv4I_NSt6size_tEEN8champsim3msl10sfwcounterE", "champsim::msl::sfwcounter::WIDTH"], [8, 2, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TN8champsim4data4bitsE", "champsim::msl::splice_bits"], [8, 2, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TN8champsim4data4bitsEN8champsim4data4bitsE", "champsim::msl::splice_bits"], [8, 2, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TNSt6size_tE", "champsim::msl::splice_bits"], [8, 2, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TNSt6size_tENSt6size_tE", "champsim::msl::splice_bits"], [8, 1, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TN8champsim4data4bitsE", "champsim::msl::splice_bits::T"], [8, 1, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TN8champsim4data4bitsEN8champsim4data4bitsE", "champsim::msl::splice_bits::T"], [8, 1, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TNSt6size_tE", "champsim::msl::splice_bits::T"], [8, 1, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TNSt6size_tENSt6size_tE", "champsim::msl::splice_bits::T"], [8, 3, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TN8champsim4data4bitsE", "champsim::msl::splice_bits::bits"], [8, 3, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TNSt6size_tE", "champsim::msl::splice_bits::bits"], [8, 3, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TN8champsim4data4bitsEN8champsim4data4bitsE", "champsim::msl::splice_bits::bits_lower"], [8, 3, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TNSt6size_tENSt6size_tE", "champsim::msl::splice_bits::bits_lower"], [8, 3, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TN8champsim4data4bitsEN8champsim4data4bitsE", "champsim::msl::splice_bits::bits_upper"], [8, 3, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TNSt6size_tENSt6size_tE", "champsim::msl::splice_bits::bits_upper"], [8, 3, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TN8champsim4data4bitsE", "champsim::msl::splice_bits::lower"], [8, 3, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TN8champsim4data4bitsEN8champsim4data4bitsE", "champsim::msl::splice_bits::lower"], [8, 3, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TNSt6size_tE", "champsim::msl::splice_bits::lower"], [8, 3, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TNSt6size_tENSt6size_tE", "champsim::msl::splice_bits::lower"], [8, 3, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TN8champsim4data4bitsE", "champsim::msl::splice_bits::upper"], [8, 3, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TN8champsim4data4bitsEN8champsim4data4bitsE", "champsim::msl::splice_bits::upper"], [8, 3, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TNSt6size_tE", "champsim::msl::splice_bits::upper"], [8, 3, 1, "_CPPv4I0EN8champsim3msl11splice_bitsEDa1T1TNSt6size_tENSt6size_tE", "champsim::msl::splice_bits::upper"], [0, 2, 1, "_CPPv4I0EN8champsim6offsetEN13address_sliceI6ExtentE15difference_typeE13address_sliceI6ExtentE13address_sliceI6ExtentE", "champsim::offset"], [0, 1, 1, "_CPPv4I0EN8champsim6offsetEN13address_sliceI6ExtentE15difference_typeE13address_sliceI6ExtentE13address_sliceI6ExtentE", "champsim::offset::Extent"], [0, 3, 1, "_CPPv4I0EN8champsim6offsetEN13address_sliceI6ExtentE15difference_typeE13address_sliceI6ExtentE13address_sliceI6ExtentE", "champsim::offset::base"], [0, 3, 1, "_CPPv4I0EN8champsim6offsetEN13address_sliceI6ExtentE15difference_typeE13address_sliceI6ExtentE13address_sliceI6ExtentE", "champsim::offset::other"], [0, 4, 1, "_CPPv4N8champsim11page_numberE", "champsim::page_number"], [0, 0, 1, "_CPPv4N8champsim18page_number_extentE", "champsim::page_number_extent"], [0, 2, 1, "_CPPv4N8champsim18page_number_extent18page_number_extentEv", "champsim::page_number_extent::page_number_extent"], [0, 4, 1, "_CPPv4N8champsim11page_offsetE", "champsim::page_offset"], [0, 0, 1, "_CPPv4N8champsim18page_offset_extentE", "champsim::page_offset_extent"], [0, 2, 1, "_CPPv4N8champsim18page_offset_extent18page_offset_extentEv", "champsim::page_offset_extent::page_offset_extent"], [2, 4, 1, "_CPPv4N8champsim4pebiE", "champsim::pebi"], [0, 2, 1, "_CPPv4IDpEN8champsim6spliceEDaDp13address_sliceI7ExtentsE", "champsim::splice"], [0, 1, 1, "_CPPv4IDpEN8champsim6spliceEDaDp13address_sliceI7ExtentsE", "champsim::splice::Extents"], [0, 3, 1, "_CPPv4IDpEN8champsim6spliceEDaDp13address_sliceI7ExtentsE", "champsim::splice::slices"], [0, 0, 1, "_CPPv4I_N8champsim4data4bitsE_N8champsim4data4bitsEEN8champsim13static_extentE", "champsim::static_extent"], [0, 1, 1, "_CPPv4I_N8champsim4data4bitsE_N8champsim4data4bitsEEN8champsim13static_extentE", "champsim::static_extent::LOW"], [0, 1, 1, "_CPPv4I_N8champsim4data4bitsE_N8champsim4data4bitsEEN8champsim13static_extentE", "champsim::static_extent::UP"], [0, 5, 1, "_CPPv4N8champsim13static_extent5lowerE", "champsim::static_extent::lower"], [0, 5, 1, "_CPPv4N8champsim13static_extent5upperE", "champsim::static_extent::upper"], [2, 4, 1, "_CPPv4N8champsim4tebiE", "champsim::tebi"], [0, 2, 1, "_CPPv4I0EN8champsim7uoffsetENSt15make_unsigned_tIN13address_sliceI6ExtentE15difference_typeEEE13address_sliceI6ExtentE13address_sliceI6ExtentE", "champsim::uoffset"], [0, 1, 1, "_CPPv4I0EN8champsim7uoffsetENSt15make_unsigned_tIN13address_sliceI6ExtentE15difference_typeEEE13address_sliceI6ExtentE13address_sliceI6ExtentE", "champsim::uoffset::Extent"], [0, 3, 1, "_CPPv4I0EN8champsim7uoffsetENSt15make_unsigned_tIN13address_sliceI6ExtentE15difference_typeEEE13address_sliceI6ExtentE13address_sliceI6ExtentE", "champsim::uoffset::base"], [0, 3, 1, "_CPPv4I0EN8champsim7uoffsetENSt15make_unsigned_tIN13address_sliceI6ExtentE15difference_typeEEE13address_sliceI6ExtentE13address_sliceI6ExtentE", "champsim::uoffset::other"], [9, 2, 1, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t11access_type", "find_victim"], [9, 2, 1, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t8uint32_t", "find_victim"], [9, 3, 1, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t11access_type", "find_victim::addr"], [9, 3, 1, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t8uint32_t", "find_victim::addr"], [9, 3, 1, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t11access_type", "find_victim::current_set"], [9, 3, 1, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t8uint32_t", "find_victim::current_set"], [9, 3, 1, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t11access_type", "find_victim::instr_id"], [9, 3, 1, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t8uint32_t", "find_victim::instr_id"], [9, 3, 1, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t11access_type", "find_victim::ip"], [9, 3, 1, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t8uint32_t", "find_victim::ip"], [9, 3, 1, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t11access_type", "find_victim::set"], [9, 3, 1, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t8uint32_t", "find_victim::set"], [9, 3, 1, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t11access_type", "find_victim::triggering_cpu"], [9, 3, 1, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t8uint32_t", "find_victim::triggering_cpu"], [9, 3, 1, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t11access_type", "find_victim::type"], [9, 3, 1, "_CPPv411find_victim8uint32_t8uint64_t8uint32_tPK5BLOCK8uint64_t8uint64_t8uint32_t", "find_victim::type"], [9, 2, 1, "_CPPv427initialize_branch_predictorv", "initialize_branch_predictor"], [9, 2, 1, "_CPPv414initialize_btbv", "initialize_btb"], [9, 2, 1, "_CPPv422initialize_replacementv", "initialize_replacement"], [9, 2, 1, "_CPPv418last_branch_result8uint64_t8uint64_t7uint8_t7uint8_t", "last_branch_result"], [9, 2, 1, "_CPPv418last_branch_resultN8champsim7addressEN8champsim7addressE7uint8_t7uint8_t", "last_branch_result"], [9, 3, 1, "_CPPv418last_branch_result8uint64_t8uint64_t7uint8_t7uint8_t", "last_branch_result::branch_target"], [9, 3, 1, "_CPPv418last_branch_resultN8champsim7addressEN8champsim7addressE7uint8_t7uint8_t", "last_branch_result::branch_target"], [9, 3, 1, "_CPPv418last_branch_result8uint64_t8uint64_t7uint8_t7uint8_t", "last_branch_result::branch_type"], [9, 3, 1, "_CPPv418last_branch_resultN8champsim7addressEN8champsim7addressE7uint8_t7uint8_t", "last_branch_result::branch_type"], [9, 3, 1, "_CPPv418last_branch_result8uint64_t8uint64_t7uint8_t7uint8_t", "last_branch_result::ip"], [9, 3, 1, "_CPPv418last_branch_resultN8champsim7addressEN8champsim7addressE7uint8_t7uint8_t", "last_branch_result::ip"], [9, 3, 1, "_CPPv418last_branch_result8uint64_t8uint64_t7uint8_t7uint8_t", "last_branch_result::taken"], [9, 3, 1, "_CPPv418last_branch_resultN8champsim7addressEN8champsim7addressE7uint8_t7uint8_t", "last_branch_result::taken"], [9, 2, 1, "_CPPv414predict_branch8uint64_t", "predict_branch"], [9, 2, 1, "_CPPv414predict_branch8uint64_t8uint64_tb7uint8_t", "predict_branch"], [9, 2, 1, "_CPPv414predict_branchN8champsim7addressE", "predict_branch"], [9, 2, 1, "_CPPv414predict_branchN8champsim7addressEN8champsim7addressEb7uint8_t", "predict_branch"], [9, 3, 1, "_CPPv414predict_branch8uint64_t8uint64_tb7uint8_t", "predict_branch::always_taken"], [9, 3, 1, "_CPPv414predict_branchN8champsim7addressEN8champsim7addressEb7uint8_t", "predict_branch::always_taken"], [9, 3, 1, "_CPPv414predict_branch8uint64_t8uint64_tb7uint8_t", "predict_branch::branch_type"], [9, 3, 1, "_CPPv414predict_branchN8champsim7addressEN8champsim7addressEb7uint8_t", "predict_branch::branch_type"], [9, 3, 1, "_CPPv414predict_branch8uint64_t", "predict_branch::ip"], [9, 3, 1, "_CPPv414predict_branch8uint64_t8uint64_tb7uint8_t", "predict_branch::ip"], [9, 3, 1, "_CPPv414predict_branchN8champsim7addressE", "predict_branch::ip"], [9, 3, 1, "_CPPv414predict_branchN8champsim7addressEN8champsim7addressEb7uint8_t", "predict_branch::ip"], [9, 3, 1, "_CPPv414predict_branch8uint64_t8uint64_tb7uint8_t", "predict_branch::predicted_target"], [9, 3, 1, "_CPPv414predict_branchN8champsim7addressEN8champsim7addressEb7uint8_t", "predict_branch::predicted_target"], [9, 2, 1, "_CPPv425prefetcher_branch_operate8uint64_t7uint8_t8uint64_t", "prefetcher_branch_operate"], [9, 2, 1, "_CPPv425prefetcher_branch_operateN8champsim7addressE7uint8_tN8champsim7addressE", "prefetcher_branch_operate"], [9, 3, 1, "_CPPv425prefetcher_branch_operate8uint64_t7uint8_t8uint64_t", "prefetcher_branch_operate::branch_target"], [9, 3, 1, "_CPPv425prefetcher_branch_operateN8champsim7addressE7uint8_tN8champsim7addressE", "prefetcher_branch_operate::branch_target"], [9, 3, 1, "_CPPv425prefetcher_branch_operate8uint64_t7uint8_t8uint64_t", "prefetcher_branch_operate::branch_type"], [9, 3, 1, "_CPPv425prefetcher_branch_operateN8champsim7addressE7uint8_tN8champsim7addressE", "prefetcher_branch_operate::branch_type"], [9, 3, 1, "_CPPv425prefetcher_branch_operate8uint64_t7uint8_t8uint64_t", "prefetcher_branch_operate::ip"], [9, 3, 1, "_CPPv425prefetcher_branch_operateN8champsim7addressE7uint8_tN8champsim7addressE", "prefetcher_branch_operate::ip"], [9, 2, 1, "_CPPv421prefetcher_cache_fill8uint64_t8uint32_t10uint32_wayb8uint64_t8uint32_t", "prefetcher_cache_fill"], [9, 2, 1, "_CPPv421prefetcher_cache_fillN8champsim7addressE8uint32_t10uint32_waybN8champsim7addressE8uint32_t", "prefetcher_cache_fill"], [9, 3, 1, "_CPPv421prefetcher_cache_fill8uint64_t8uint32_t10uint32_wayb8uint64_t8uint32_t", "prefetcher_cache_fill::addr"], [9, 3, 1, "_CPPv421prefetcher_cache_fillN8champsim7addressE8uint32_t10uint32_waybN8champsim7addressE8uint32_t", "prefetcher_cache_fill::addr"], [9, 3, 1, "_CPPv421prefetcher_cache_fill8uint64_t8uint32_t10uint32_wayb8uint64_t8uint32_t", "prefetcher_cache_fill::evicted_address"], [9, 3, 1, "_CPPv421prefetcher_cache_fillN8champsim7addressE8uint32_t10uint32_waybN8champsim7addressE8uint32_t", "prefetcher_cache_fill::evicted_address"], [9, 3, 1, "_CPPv421prefetcher_cache_fill8uint64_t8uint32_t10uint32_wayb8uint64_t8uint32_t", "prefetcher_cache_fill::metadata_in"], [9, 3, 1, "_CPPv421prefetcher_cache_fillN8champsim7addressE8uint32_t10uint32_waybN8champsim7addressE8uint32_t", "prefetcher_cache_fill::metadata_in"], [9, 3, 1, "_CPPv421prefetcher_cache_fill8uint64_t8uint32_t10uint32_wayb8uint64_t8uint32_t", "prefetcher_cache_fill::prefetch"], [9, 3, 1, "_CPPv421prefetcher_cache_fillN8champsim7addressE8uint32_t10uint32_waybN8champsim7addressE8uint32_t", "prefetcher_cache_fill::prefetch"], [9, 3, 1, "_CPPv421prefetcher_cache_fill8uint64_t8uint32_t10uint32_wayb8uint64_t8uint32_t", "prefetcher_cache_fill::set"], [9, 3, 1, "_CPPv421prefetcher_cache_fillN8champsim7addressE8uint32_t10uint32_waybN8champsim7addressE8uint32_t", "prefetcher_cache_fill::set"], [9, 2, 1, "_CPPv424prefetcher_cache_operate8uint64_t8uint64_tb7uint8_t8uint32_t", "prefetcher_cache_operate"], [9, 2, 1, "_CPPv424prefetcher_cache_operateN8champsim7addressEN8champsim7addressEbb11access_type8uint32_t", "prefetcher_cache_operate"], [9, 2, 1, "_CPPv424prefetcher_cache_operateN8champsim7addressEN8champsim7addressEbb7uint8_t8uint32_t", "prefetcher_cache_operate"], [9, 3, 1, "_CPPv424prefetcher_cache_operate8uint64_t8uint64_tb7uint8_t8uint32_t", "prefetcher_cache_operate::addr"], [9, 3, 1, "_CPPv424prefetcher_cache_operateN8champsim7addressEN8champsim7addressEbb11access_type8uint32_t", "prefetcher_cache_operate::addr"], [9, 3, 1, "_CPPv424prefetcher_cache_operateN8champsim7addressEN8champsim7addressEbb7uint8_t8uint32_t", "prefetcher_cache_operate::addr"], [9, 3, 1, "_CPPv424prefetcher_cache_operate8uint64_t8uint64_tb7uint8_t8uint32_t", "prefetcher_cache_operate::cache_hit"], [9, 3, 1, "_CPPv424prefetcher_cache_operateN8champsim7addressEN8champsim7addressEbb11access_type8uint32_t", "prefetcher_cache_operate::cache_hit"], [9, 3, 1, "_CPPv424prefetcher_cache_operateN8champsim7addressEN8champsim7addressEbb7uint8_t8uint32_t", "prefetcher_cache_operate::cache_hit"], [9, 3, 1, "_CPPv424prefetcher_cache_operate8uint64_t8uint64_tb7uint8_t8uint32_t", "prefetcher_cache_operate::ip"], [9, 3, 1, "_CPPv424prefetcher_cache_operateN8champsim7addressEN8champsim7addressEbb11access_type8uint32_t", "prefetcher_cache_operate::ip"], [9, 3, 1, "_CPPv424prefetcher_cache_operateN8champsim7addressEN8champsim7addressEbb7uint8_t8uint32_t", "prefetcher_cache_operate::ip"], [9, 3, 1, "_CPPv424prefetcher_cache_operate8uint64_t8uint64_tb7uint8_t8uint32_t", "prefetcher_cache_operate::metadata_in"], [9, 3, 1, "_CPPv424prefetcher_cache_operateN8champsim7addressEN8champsim7addressEbb11access_type8uint32_t", "prefetcher_cache_operate::metadata_in"], [9, 3, 1, "_CPPv424prefetcher_cache_operateN8champsim7addressEN8champsim7addressEbb7uint8_t8uint32_t", "prefetcher_cache_operate::metadata_in"], [9, 3, 1, "_CPPv424prefetcher_cache_operate8uint64_t8uint64_tb7uint8_t8uint32_t", "prefetcher_cache_operate::type"], [9, 3, 1, "_CPPv424prefetcher_cache_operateN8champsim7addressEN8champsim7addressEbb11access_type8uint32_t", "prefetcher_cache_operate::type"], [9, 3, 1, "_CPPv424prefetcher_cache_operateN8champsim7addressEN8champsim7addressEbb7uint8_t8uint32_t", "prefetcher_cache_operate::type"], [9, 3, 1, "_CPPv424prefetcher_cache_operateN8champsim7addressEN8champsim7addressEbb11access_type8uint32_t", "prefetcher_cache_operate::useful_prefetch"], [9, 3, 1, "_CPPv424prefetcher_cache_operateN8champsim7addressEN8champsim7addressEbb7uint8_t8uint32_t", "prefetcher_cache_operate::useful_prefetch"], [9, 2, 1, "_CPPv424prefetcher_cycle_operatev", "prefetcher_cycle_operate"], [9, 2, 1, "_CPPv422prefetcher_final_statsv", "prefetcher_final_stats"], [9, 2, 1, "_CPPv421prefetcher_initializev", "prefetcher_initialize"], [9, 2, 1, "_CPPv422replacement_cache_fill8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_type", "replacement_cache_fill"], [9, 3, 1, "_CPPv422replacement_cache_fill8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_type", "replacement_cache_fill::full_addr"], [9, 3, 1, "_CPPv422replacement_cache_fill8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_type", "replacement_cache_fill::ip"], [9, 3, 1, "_CPPv422replacement_cache_fill8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_type", "replacement_cache_fill::set"], [9, 3, 1, "_CPPv422replacement_cache_fill8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_type", "replacement_cache_fill::triggering_cpu"], [9, 3, 1, "_CPPv422replacement_cache_fill8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_type", "replacement_cache_fill::type"], [9, 3, 1, "_CPPv422replacement_cache_fill8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_type", "replacement_cache_fill::victim_addr"], [9, 3, 1, "_CPPv422replacement_cache_fill8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_type", "replacement_cache_fill::way"], [9, 2, 1, "_CPPv423replacement_final_statsv", "replacement_final_stats"], [9, 2, 1, "_CPPv410update_btb8uint64_t8uint64_tb7uint8_t", "update_btb"], [9, 2, 1, "_CPPv410update_btbN8champsim7addressEN8champsim7addressEb7uint8_t", "update_btb"], [9, 3, 1, "_CPPv410update_btb8uint64_t8uint64_tb7uint8_t", "update_btb::branch_target"], [9, 3, 1, "_CPPv410update_btbN8champsim7addressEN8champsim7addressEb7uint8_t", "update_btb::branch_target"], [9, 3, 1, "_CPPv410update_btb8uint64_t8uint64_tb7uint8_t", "update_btb::branch_type"], [9, 3, 1, "_CPPv410update_btbN8champsim7addressEN8champsim7addressEb7uint8_t", "update_btb::branch_type"], [9, 3, 1, "_CPPv410update_btb8uint64_t8uint64_tb7uint8_t", "update_btb::ip"], [9, 3, 1, "_CPPv410update_btbN8champsim7addressEN8champsim7addressEb7uint8_t", "update_btb::ip"], [9, 3, 1, "_CPPv410update_btb8uint64_t8uint64_tb7uint8_t", "update_btb::taken"], [9, 3, 1, "_CPPv410update_btbN8champsim7addressEN8champsim7addressEb7uint8_t", "update_btb::taken"], [9, 2, 1, "_CPPv424update_replacement_state8uint32_tll8uint64_t8uint64_t8uint64_tb", "update_replacement_state"], [9, 2, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressE11access_typeb", "update_replacement_state"], [9, 2, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_typeb", "update_replacement_state"], [9, 2, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE8uint32_tb", "update_replacement_state"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tll8uint64_t8uint64_t8uint64_tb", "update_replacement_state::addr"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressE11access_typeb", "update_replacement_state::addr"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_typeb", "update_replacement_state::addr"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE8uint32_tb", "update_replacement_state::addr"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tll8uint64_t8uint64_t8uint64_tb", "update_replacement_state::hit"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressE11access_typeb", "update_replacement_state::hit"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_typeb", "update_replacement_state::hit"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE8uint32_tb", "update_replacement_state::hit"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tll8uint64_t8uint64_t8uint64_tb", "update_replacement_state::ip"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressE11access_typeb", "update_replacement_state::ip"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_typeb", "update_replacement_state::ip"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE8uint32_tb", "update_replacement_state::ip"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tll8uint64_t8uint64_t8uint64_tb", "update_replacement_state::set"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressE11access_typeb", "update_replacement_state::set"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_typeb", "update_replacement_state::set"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE8uint32_tb", "update_replacement_state::set"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tll8uint64_t8uint64_t8uint64_tb", "update_replacement_state::triggering_cpu"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressE11access_typeb", "update_replacement_state::triggering_cpu"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_typeb", "update_replacement_state::triggering_cpu"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE8uint32_tb", "update_replacement_state::triggering_cpu"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressE11access_typeb", "update_replacement_state::type"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_typeb", "update_replacement_state::type"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE8uint32_tb", "update_replacement_state::type"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tll8uint64_t8uint64_t8uint64_tb", "update_replacement_state::victim_addr"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_typeb", "update_replacement_state::victim_addr"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE8uint32_tb", "update_replacement_state::victim_addr"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tll8uint64_t8uint64_t8uint64_tb", "update_replacement_state::way"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressE11access_typeb", "update_replacement_state::way"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE11access_typeb", "update_replacement_state::way"], [9, 3, 1, "_CPPv424update_replacement_state8uint32_tllN8champsim7addressEN8champsim7addressEN8champsim7addressE8uint32_tb", "update_replacement_state::way"], [4, 7, 0, "-", "config"]], "config.filewrite": [[4, 8, 1, "", "FileWriter"], [4, 8, 1, "", "Fragment"]], "config.filewrite.FileWriter": [[4, 9, 1, "", "__enter__"], [4, 9, 1, "", "__exit__"], [4, 9, 1, "", "finish"], [4, 9, 1, "", "write_files"], [4, 9, 1, "", "write_fragments"]], "config.filewrite.Fragment": [[4, 9, 1, "", "from_config"], [4, 9, 1, "", "join"], [4, 9, 1, "", "write"]], "config.parse": [[4, 10, 1, "", "duplicate_to_length"], [4, 10, 1, "", "extract_element"], [4, 10, 1, "", "parse_config"]], "config.util": [[4, 10, 1, "", "append_except_last"], [4, 10, 1, "", "batch"], [4, 10, 1, "", "chain"], [4, 10, 1, "", "collect"], [4, 10, 1, "", "combine_named"], [4, 10, 1, "", "cut"], [4, 10, 1, "", "do_for_first"], [4, 10, 1, "", "explode"], [4, 10, 1, "", "extend_each"], [4, 10, 1, "", "iter_system"], [4, 10, 1, "", "multiline"], [4, 10, 1, "", "propogate_down"], [4, 10, 1, "", "sliding"], [4, 10, 1, "", "subdict"], [4, 10, 1, "", "upper_levels_for"], [4, 10, 1, "", "yield_from_star"]]}, "objnames": {"0": ["cpp", "class", "C++ class"], "1": ["cpp", "templateParam", "C++ template parameter"], "2": ["cpp", "function", "C++ function"], "3": ["cpp", "functionParam", "C++ function parameter"], "4": ["cpp", "type", "C++ type"], "5": ["cpp", "member", "C++ member"], "6": ["cpp", "enum", "C++ enum"], "7": ["py", "module", "Python module"], "8": ["py", "class", "Python class"], "9": ["py", "method", "Python method"], "10": ["py", "function", "Python function"]}, "objtypes": {"0": "cpp:class", "1": "cpp:templateParam", "2": "cpp:function", "3": "cpp:functionParam", "4": "cpp:type", "5": "cpp:member", "6": "cpp:enum", "7": "py:module", "8": "py:class", "9": "py:method", "10": "py:function"}, "terms": {"": [0, 3, 4, 5, 6, 8, 9], "0": [0, 4, 6, 7, 8, 9], "0000": 0, "00021": 10, "0_b": 0, "0x003f": 0, "0x0040": 0, "0x3f": 0, "0xaaa": 0, "0xaaaa": 8, "0xaaabbb": 0, "0xaaba": 8, "0xbbb": 0, "0xbbbb": 8, "0xf0": 8, "0xfff": 0, "0xffff": [0, 8], "1": [0, 2, 4, 6, 8, 10], "10": [2, 10], "1024": 2, "1109": 10, "1145": 10, "118": 10, "12": [0, 10], "120": 6, "12_b": 0, "13": 10, "131": 10, "14324": 10, "16_b": 0, "190": 6, "1ll": 2, "2": [4, 6, 8], "20": 2, "2016": 10, "2019": 10, "2020": 10, "2022": 10, "20_b": 0, "2210": 10, "226": 6, "240": 6, "24_b": 0, "256": [0, 6], "3": [4, 6], "30": 2, "3307650": 10, "3322207": 10, "4": [4, 6, 8], "40": 2, "47th": 10, "49": 10, "49th": 10, "4_b": 0, "5": [4, 10], "50": 2, "6": [0, 4, 6, 10], "60": 2, "61": 10, "64": 6, "64_b": 0, "70": [6, 10], "7783763": 10, "8": [6, 8], "85": 6, "8_b": 0, "90": 6, "A": [2, 4, 7, 8, 9, 10, 11], "Being": 2, "But": 6, "For": [0, 4, 6, 11], "If": [0, 3, 4, 7, 8, 9], "In": [0, 6, 10], "It": [0, 8, 9], "No": 0, "Not": 6, "One": [0, 7, 9], "Such": 9, "That": 0, "The": [0, 1, 2, 4, 6, 8, 10, 11], "Then": 4, "There": 11, "These": [2, 4, 6], "With": 11, "_": 4, "__enter__": 4, "__exit__": 4, "__legacy__": 7, "_b": [2, 8], "_gib": 2, "_kib": 2, "_mib": 2, "_tib": 2, "abl": [6, 11], "about": 6, "abov": 8, "academ": 11, "accept": [0, 8], "access": [7, 9], "access_typ": [3, 7, 9], "accesss": 4, "accord": 4, "accumul": 4, "accur": 11, "acm": 10, "activ": [3, 11], "ad": 7, "adaptor": 4, "add": [8, 11], "addit": [0, 5, 6], "addition": [0, 9], "addr": [0, 7, 9], "address": [3, 7, 8, 9, 11], "address_slic": [0, 8], "after": [2, 7, 9], "again": 1, "against": 0, "aggress": [10, 11], "agnost": 10, "al": 10, "alaa": 10, "alameldeen": 10, "algorithm": 10, "all": [0, 4, 6, 7, 8, 9], "allow": [0, 4, 11], "along": [7, 9], "alongsid": [7, 9], "also": [0, 2, 6], "altern": 7, "although": 4, "alwai": [0, 7, 9], "always_taken": [7, 9], "amount": [0, 1], "amount_consum": 1, "amount_remain": 1, "an": [0, 2, 4, 6, 7, 8, 9, 10, 11], "ancestri": 10, "ani": [0, 6, 9, 11], "annual": 10, "anoth": [0, 7, 8, 9], "api": 11, "append_except_last": 4, "applic": [4, 11], "ar": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "arbitrari": 2, "architect": 11, "architectur": [10, 11], "arg": 4, "argument": [0, 8], "arithmet": [0, 2, 8], "arizona": 10, "around": 2, "arrai": [0, 4], "art": 11, "artifact": 7, "arxiv": [10, 11], "asid": 11, "ask": 11, "assign": 6, "associ": [10, 11], "assum": [0, 4], "attach": 6, "attempt": 6, "attribut": 0, "auto": [0, 2, 8], "avail": [1, 11], "awar": 11, "b": [4, 5], "backport": [4, 8], "bandwidth": [3, 5, 11], "barca": 10, "base": [0, 6, 8, 10, 11], "base_fwcount": 8, "basi": 11, "batch": 4, "been": [1, 11], "befor": 4, "begin": [6, 7, 8, 9, 11], "behavior": [9, 11], "being": [2, 7, 9], "below": [6, 10, 11], "benefit": 0, "better": 11, "between": [0, 2, 3, 8, 11], "bhatia": 10, "bimod": 6, "binari": 4, "bindir_nam": 4, "biswabandan": 10, "bit": [0, 2, 3, 7, 9, 11], "bitmask": 8, "bits_low": 8, "bits_upp": 8, "bitwis": 8, "block": [0, 3, 6, 7, 9], "block_numb": 0, "block_number_ext": 0, "block_offset": 0, "block_offset_ext": 0, "block_siz": 6, "bodi": 9, "bool": [0, 1, 7, 8, 9], "boolean": [7, 9], "both": 6, "bound": 0, "bouquet": 10, "box": 11, "branch": [4, 5, 6, 10, 11], "branch_condit": [7, 9], "branch_dir": 4, "branch_direct_cal": [7, 9], "branch_direct_jump": [7, 9], "branch_indirect": [7, 9], "branch_indirect_cal": [7, 9], "branch_module_concept": 5, "branch_module_model": 5, "branch_oth": [7, 9], "branch_predictor": [5, 6, 9], "branch_return": [7, 9], "branch_target": [7, 9], "branch_typ": [7, 9], "btb": [5, 6, 7, 9], "btb_dir": 4, "btb_module_concept": 5, "btb_module_model": 5, "btb_predict": [7, 9], "buffer": [5, 11], "bug": 0, "build": [4, 6], "builder": 11, "bypass": [7, 9], "byte": [0, 3, 11], "c": [4, 9, 11], "cach": [5, 7, 9, 11], "cache_build": 3, "cache_builder_bas": 3, "cache_builder_module_type_hold": 3, "cache_hit": [7, 9], "cachea": 6, "cacheb": 6, "call": [4, 7, 9, 11], "can": [0, 1, 3, 4, 6, 7, 8, 9, 11], "candid": 9, "cannot": [0, 1, 7, 9], "care": 9, "carri": [7, 9], "case": [0, 6], "cast": 0, "central": 6, "certain": 4, "chacon": 10, "chain": 4, "championship": [10, 11], "champsim": [0, 1, 2, 3, 4, 5, 6, 8, 10], "champsim_config": 6, "chang": [1, 6, 11], "channel": [3, 5], "character": 10, "check": [0, 3, 7, 9], "chishti": 10, "chri": 10, "chrono": [2, 3, 5], "cite": 11, "clamp": 8, "clariti": 6, "class": [0, 1, 2, 3, 4, 5, 8, 9, 11], "classifi": 10, "classroom": 11, "clock": [3, 5], "clock_period": [3, 5], "clock_period_": [3, 5], "collabor": 11, "collect": 4, "collis": 3, "combin": [4, 6], "combine_nam": 4, "commmon": 0, "commod": 11, "common": [1, 2], "commonli": 11, "commun": 11, "compar": 0, "competit": [10, 11], "compil": [0, 4, 7, 11], "compile_all_modul": 4, "complet": [4, 7, 9], "compon": 11, "comprehens": 11, "comput": [8, 10, 11], "concaten": 4, "concept": 11, "condit": [7, 9], "confid": 10, "config": [4, 6], "configur": [7, 9, 11], "const": [0, 1, 2, 7, 8, 9], "constexpr": [0, 2, 8], "construct": [0, 2, 9], "constructor": [0, 4, 9], "consum": [1, 4, 11], "contain": [4, 7, 9, 11], "context": 4, "contribut": 11, "control": 4, "conveni": [4, 8, 11], "convers": 0, "convert": [2, 4], "core": [7, 9, 11], "core_build": 5, "core_builder_bas": 5, "core_builder_module_type_hold": 5, "correct": [0, 7, 9], "cost": 5, "could": 6, "count": [2, 4, 7, 9], "counter": 11, "crc2": 11, "creat": 11, "critic": 0, "current": 11, "current_set": [7, 9], "cut": 4, "cvp": 11, "cycl": [3, 5, 7, 9], "d": 4, "daniel": 10, "data": [0, 2, 3, 5, 6, 8], "data_liter": 2, "data_queu": 5, "data_queues_": 5, "decod": 5, "decode_buffer_s": 5, "decode_buffer_size_": 5, "decode_lat": [5, 6], "decode_latency_": 5, "decode_width": [5, 6], "decode_width_": 5, "decoupl": 11, "decrement": [0, 8], "deduc": 0, "deeper": 11, "default": [0, 4, 6, 7, 8, 9], "defin": 9, "definit": [0, 2], "delta": [0, 1], "demand": [7, 9], "depend": [5, 9], "deplet": 1, "deprec": 8, "deriv": 3, "describ": [7, 9], "design": 11, "detail": [0, 3, 5, 8], "detect": [5, 8], "determin": [3, 7, 9], "develop": 11, "devic": 11, "dib": 5, "dib_hit_buffer_s": 5, "dib_hit_buffer_size_": 5, "dib_hit_lat": 5, "dib_hit_latency_": 5, "dib_inorder_width": 5, "dib_inorder_width_": 5, "dib_set": 5, "dib_set_": 5, "dib_shift": 5, "dib_wai": 5, "dib_way_": 5, "dib_window": 5, "dib_window_": 5, "dict": 4, "differ": [0, 6, 8, 9, 11], "difference_typ": 0, "difficult": 2, "digit": 0, "direct": [4, 5, 7, 9], "directli": [0, 7, 9], "directori": [4, 6, 7], "discuss": 6, "dispatch": [4, 5], "dispatch_buffer_s": 5, "dispatch_buffer_size_": 5, "dispatch_lat": 5, "dispatch_latency_": 5, "dispatch_width": 5, "dispatch_width_": 5, "disrupt": 11, "distinct": 6, "distinguish": 4, "distribut": [3, 11], "divers": 11, "divid": 8, "do": [0, 6, 9, 11], "do_for_first": 4, "document": 7, "doe": 11, "doi": 10, "domain": 0, "done": 11, "down": 4, "downstream": 5, "dpc2": 11, "dpc3": 11, "dram": 11, "drrip": 6, "duplic": 4, "duplicate_to_length": 4, "durat": 2, "dyn_block": 0, "dyn_full_addr": 0, "dyn_pag": 0, "dynam": [0, 7, 9], "dynamic_ext": 0, "dynamorio": 11, "e": [7, 9], "each": [4, 6, 7, 9], "earlier": [0, 4], "easi": 11, "easier": 11, "easili": 8, "editor": 10, "educ": [10, 11], "effect": 10, "either": 0, "elem": 3, "element": [0, 4, 7, 9], "elvira": 10, "empti": [7, 9], "enabl": [6, 7, 11], "encapusl": 1, "encod": [7, 9], "encourag": 11, "end": [0, 7, 8, 9, 10, 11], "engin": 11, "enough": 11, "enter": 0, "entir": 6, "entri": [4, 5, 11], "enum": 2, "environ": 11, "equal": 0, "equival": 5, "error": 0, "eshan": 10, "etc": [4, 11], "evalu": [4, 11], "even": 11, "evenli": 3, "everi": 6, "evict": [7, 9], "evicted_address": 9, "examin": [4, 7, 9], "exampl": [4, 6, 7, 9], "exbi": 2, "exc_typ": 4, "exc_valu": 4, "except": [0, 1, 4, 7, 9], "execut": [5, 11], "execute_lat": [5, 6], "execute_latency_": 5, "execute_width": 5, "execute_width_": 5, "exhibit": 10, "exist": 7, "exp": 8, "explicit": [0, 1, 2, 9], "explicitli": 0, "explod": 4, "explor": 11, "expon": 8, "export": 1, "ext": 0, "extend": 11, "extend_each": 4, "extent": 11, "extent_is_stat": 0, "extent_typ": 0, "extra": 4, "extract": 4, "extract_el": 4, "f000": 0, "fact": 6, "fail": [7, 9], "fals": [4, 9], "far": 6, "fast": 11, "faster": 11, "featur": 6, "fetch": 5, "fetch_queu": 5, "fetch_queues_": 5, "fetch_width": [5, 6], "fetch_width_": 5, "ffc0": 0, "ffff": 0, "file": [5, 7, 11], "filepart": 4, "filewrit": 4, "fill": [3, 7, 9], "fill_bandwidth": 3, "fill_lat": 3, "fill_lat_": 3, "filter": 10, "final": 4, "find": 0, "find_victim": [7, 9], "fine": 4, "finish": 4, "first": [0, 4, 7, 9, 10, 11], "five": [0, 7, 9], "fix": [1, 11], "fixtur": 6, "flat": 11, "flexibl": [4, 11], "follow": [4, 5, 6, 7, 9], "foo": [0, 4], "form": 4, "found": 0, "four": [7, 9], "frag": 4, "fragment": 4, "frequent": [4, 6], "from": [0, 2, 3, 4, 7, 8, 9, 11], "from_config": 4, "front": [10, 11], "frontend": 11, "full": [3, 11], "full_addr": [0, 9], "fulli": 11, "func": [2, 4], "function": [0, 1, 2, 3, 5, 7, 9, 11], "further": [6, 11], "fuzz": 11, "fwcounter": 8, "g": [7, 9], "gen": 4, "gener": [0, 8, 11], "get": [0, 11], "gibi": 2, "gibibyt": 2, "gino": 10, "given": [0, 2, 4, 6, 8, 11], "glad": 11, "gober": 10, "grain": 4, "gratz": 10, "greater": [0, 4], "group": 4, "groupbi": 4, "grown": 11, "gshare": 6, "guarante": [7, 9], "h": [0, 10], "ha": [0, 1, 6, 7, 9, 11], "half": 4, "handl": 6, "hardwar": 10, "has_remain": 1, "has_single_bit": 8, "have": [0, 1, 4, 6, 11], "head": 4, "help": 11, "here": [4, 6, 7, 11], "heterogen": 11, "hierarchi": 11, "high": 4, "hit": [3, 5, 7, 9], "hit_lat": 3, "hit_lat_": 3, "hold": 4, "homogen": 6, "hook": [5, 7, 9], "how": [4, 11], "howev": 6, "huiyang": 10, "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "idea": 11, "ideal": 11, "ident": 6, "identifi": 3, "idiom": 4, "ieee": 10, "ifetch_buffer_s": 5, "ifetch_buffer_size_": 5, "ignor": [3, 4], "immut": 1, "implement": [7, 8, 9], "implicit": 0, "implicitli": 2, "imposs": 11, "improv": 11, "in_kei": 4, "inc": 0, "includ": [3, 6, 7, 9, 11], "inclus": [0, 8], "incorrect": [7, 9], "increment": [0, 8], "indent": 4, "index": [7, 9], "indic": [0, 7, 9], "indirect": [7, 9], "industri": 11, "inequ": 0, "inflight": 5, "inform": 11, "inherit": [4, 9], "initi": [0, 1, 4, 7, 9], "initialize_branch_predictor": [7, 9], "initialize_btb": [7, 9], "initialize_replac": [7, 9], "inlin": [0, 2, 8], "inord": 5, "input": 6, "instead": [1, 6, 8], "instr_id": [7, 9], "instruct": [5, 7, 9, 10, 11], "instrument": 11, "int": [0, 8], "integ": [0, 1, 8], "interact": 11, "interchang": 11, "interconnect": 11, "interfac": [4, 11], "intern": [3, 4, 10], "interpret": 0, "invalid": [0, 9], "invalid_argu": 0, "invert": 4, "ip": [7, 9], "ipc1": 11, "ipow": 8, "is_max": 8, "is_min": 8, "is_power_of_2": 8, "is_stat": 0, "isca45697": 10, "issu": [3, 5, 11], "iter": 4, "iter_system": 4, "its": [6, 8, 11], "jim": 10, "jinchun": 10, "join": [0, 4, 8], "join_func": 4, "json": [4, 6], "jump": 11, "keep": 1, "kei": [4, 6], "key_func": 4, "kib": 6, "kibi": 2, "kibibyt": 2, "kim": 10, "kind": [7, 9], "knowledg": 11, "known": [2, 7, 9], "krishnendra": 10, "l": 10, "l1": 6, "l1d": 6, "l1d_bandwidth": 5, "l1d_bw_": 5, "l1i": 5, "l1i_": 5, "l1i_bandwidth": 5, "l1i_bw_": 5, "l2c": [6, 7], "l4c": 6, "larg": 6, "larger": 11, "last": [4, 7, 9], "last_branch_result": [7, 9], "lat_": 3, "latenc": [3, 5, 11], "later": [0, 4], "layer": 11, "lead": 11, "least": 8, "legaci": 11, "legal": 6, "lei": 10, "length": 4, "less": [0, 8], "let": [6, 11], "level": [3, 4, 7, 9, 11], "lg2": 8, "lh": 4, "librari": 11, "like": [1, 2, 6, 11], "limit": 0, "line": 4, "line_end": 4, "list": [4, 6, 9, 10, 11], "liter": 11, "littl": 11, "ll": [6, 11], "ll_": 3, "llc": 6, "llca": 6, "llcb": 6, "load": [3, 5, 7, 9, 11], "log2_block_s": 0, "log2_offset_bit": 3, "log2_offset_bits_": 3, "log2_page_s": 0, "log2_set": 3, "log2_sets_": 3, "log2_siz": 3, "log2_size_": 3, "log2_wai": 3, "log2_ways_": 3, "logarithm": [3, 8], "long": [2, 4, 8, 9], "long_lin": 4, "longer": 4, "look": 11, "lookahead": 10, "loop": 4, "low": [0, 4, 11], "lower": [0, 3, 8], "lower_ext": 0, "lower_level": [3, 4, 6], "lower_transl": 3, "lq_size": [5, 6], "lq_size_": 5, "lq_width": [5, 6], "lq_width_": 5, "lru": 6, "lt_": 3, "m": 11, "machineri": 10, "made": 6, "mai": [4, 6, 7, 8, 9, 11], "main": [4, 11], "maintain": [4, 11], "make": [4, 6, 11], "make_signed_t": 0, "make_unsigned_t": 0, "makedir_nam": 4, "makefil": 4, "manag": [4, 11], "mani": [6, 7], "manipul": 0, "map": [7, 9], "mask": [0, 8], "match": 0, "max_read_": 3, "max_t": 1, "max_write_": 3, "maximum": [0, 1, 5, 8], "maximum_typ": [1, 3, 5], "maxval": 8, "mean": 11, "meaning": 11, "measur": 0, "mebi": 2, "mebibyt": 2, "mechan": 4, "member": [0, 1, 4, 8, 9], "memori": 11, "merg": [4, 11], "metadata": [7, 9], "metadata_in": [7, 9], "method": 7, "micro": 10, "microarchitectur": [10, 11], "mind": 11, "minimum": 8, "minval": 8, "misinterpret": 9, "mispredict": 5, "mispredict_penalti": 5, "mispredict_penalty_": 5, "miss": [7, 9], "mode": [0, 11], "model": [2, 11], "modif": 11, "modul": [4, 11], "modular": 11, "module_dir": 4, "month": 11, "more": [0, 1, 2, 4], "most": [0, 4, 6, 8], "mshr": 3, "mshr_size": 3, "mshr_size_": 3, "mshr_type": 3, "msl": 8, "muawya": 10, "much": [6, 11], "multi": 11, "multilin": 4, "multipl": [2, 4, 11], "multipli": 8, "must": [0, 7, 9], "my": 6, "my_config": 6, "my_pref": 9, "n": [4, 8], "name": [3, 4, 6, 7], "name_": 3, "narasimha": 10, "nathan": 10, "nathella": 10, "necessari": 0, "need": [0, 4, 6, 7, 9, 11], "neg": 4, "new": [0, 7, 11], "new_low": 0, "new_upp": 0, "next": [4, 6], "next_lin": 6, "next_pow2": 8, "nez": 10, "noexcept": 0, "non": [7, 9, 11], "none": 4, "nonzero": [7, 9], "note": [5, 6], "noth": 6, "now": 11, "num_cor": 6, "num_wai": [7, 9], "number": [0, 1, 2, 3, 5, 6, 8], "numeric_limit": 0, "o": 11, "o3_cpu": [5, 7, 9, 11], "objdir_nam": 4, "object": [2, 4, 6, 9], "occur": [7, 9], "offset": [0, 3, 7, 9], "offset_bit": 3, "offset_bits_": 3, "onc": [1, 4], "one": [0, 1, 4, 6, 8, 9, 11], "ongo": 11, "onli": [0, 4, 5, 6, 8, 11], "onlin": 11, "ooo_cpu": 6, "opcod": 11, "open": 11, "oper": [1, 2, 3, 5, 7, 9, 11], "operand": 8, "option": 6, "order": [0, 7, 9, 11], "organ": 4, "origin": 11, "other": [0, 1, 2, 4, 6, 7, 8, 9, 10, 11], "other_ext": 0, "otherwis": [0, 7, 9], "otoom": 10, "our": [6, 11], "out": [4, 11], "out_kei": 4, "output": 4, "over": [0, 4], "overal": 11, "overflow": [0, 8], "overflow_error": 0, "overhead": 11, "overload": [8, 9], "overrid": 4, "overwrit": 0, "p": 3, "packag": 4, "packet": [7, 9], "page": [0, 6], "page_numb": 0, "page_number_ext": 0, "page_offset": 0, "page_offset_ext": 0, "pair": [7, 9], "pakalapati": 10, "panda": 10, "paper": 11, "parallel": 4, "param": 4, "paramet": [0, 1, 2, 4, 6, 7, 8, 9], "parent": 4, "pars": 11, "parse_config": 4, "parsed_config": 4, "part": 2, "particular": 8, "pass": [0, 2, 4, 7, 9], "path": [4, 6, 7, 10], "paul": 10, "pebi": 2, "penalti": 5, "perceptron": [6, 10], "perfect": 11, "perform": [0, 2, 4, 11], "period": [3, 5], "permit": 2, "philosophi": 11, "phoenix": 10, "physic": [3, 5, 7, 9], "picosecond": [3, 5], "piec": 11, "pin": 11, "pipelin": 5, "place": [0, 4], "platform": 11, "pleas": 11, "point": 4, "pointer": [5, 7, 9, 10], "polici": [3, 4, 6, 11], "portion": 0, "possibl": [0, 4], "power": 8, "pq_size": 3, "pq_size_": 3, "predict": [7, 9], "predict_branch": [7, 9], "predicted_target": [7, 9], "predictor": [4, 5, 6, 11], "pref_act_elem": 3, "pref_dir": 4, "prefer": [4, 7, 8], "prefetch": [3, 4, 5, 6, 10, 11], "prefetch_activ": 3, "prefetcher_branch_oper": [7, 9], "prefetcher_cache_fil": [7, 9], "prefetcher_cache_oper": [7, 9], "prefetcher_cycle_oper": [7, 9], "prefetcher_final_stat": [7, 9], "prefetcher_initi": [7, 9], "prefetcher_module_concept": 3, "prefetcher_module_model": 3, "prepar": 4, "present": 4, "prevent": [0, 2], "previou": [7, 9], "primari": 0, "primarili": 10, "principl": 11, "print": [4, 7, 9], "prior": [7, 9], "prioriti": [0, 3, 4], "procedur": [7, 9], "proceed": 10, "processor": 11, "produc": [4, 8], "program": [2, 4, 7, 9, 11], "programmat": 4, "project": 11, "propog": 4, "propogate_down": 4, "prototyp": 11, "provid": [0, 2, 4, 8, 11], "public": [0, 1, 2, 3, 5, 8, 9, 11], "publish": 7, "pugslei": 10, "pull": 11, "python": 4, "queue": [3, 5, 11], "quickli": 11, "r": 3, "random": 11, "range_error": 1, "ratio": 2, "raw": 0, "re": 11, "read": 11, "readi": 11, "realist": 11, "recurs": 4, "reddi": 10, "reduc": 1, "refer": 6, "region": 10, "regist": [5, 7, 9], "register_file_s": 5, "register_file_size_": 5, "rel": 0, "relat": 11, "remain": 1, "remov": 11, "reorder": 5, "rep": 2, "rep2": 2, "repl": 6, "repl_dir": 4, "replac": [3, 4, 6, 11], "replacement_cache_fil": 9, "replacement_final_stat": [7, 9], "replacement_module_concept": 3, "replacement_module_model": 3, "report": 1, "repositori": [4, 6, 11], "repres": [0, 2, 11], "represent": [0, 2, 8], "request": [7, 9, 11], "requir": 11, "research": 11, "reset": [1, 5], "reset_prefetch_as_load": 3, "reset_virtual_prefetch": 3, "reset_wq_checks_full_addr": 3, "resolv": [7, 9], "resourc": 11, "rest": 4, "restart": 5, "result": [0, 4, 7, 10, 11], "retir": 5, "retire_width": 5, "retire_width_": 5, "return": [0, 4, 7, 9], "returned_valu": 3, "revers": 11, "review": 11, "rfo": [7, 9], "rh": 4, "right": 11, "rob": 6, "rob_siz": [5, 6], "rob_size_": 5, "root": [4, 6], "runtim": 0, "safe": 0, "safeti": 0, "same": [0, 3, 4, 6, 7, 9], "samuel": 10, "satur": 11, "scale": 0, "schedul": 5, "schedule_lat": 5, "schedule_latency_": 5, "schedule_width": 5, "schedule_width_": 5, "scheme": 11, "script": 6, "search": [4, 10], "second": 0, "see": 11, "select": [8, 9], "self_typ": [0, 3, 5], "sensit": 11, "sequenc": 4, "seri": 4, "set": [3, 4, 5, 6, 7, 9, 11], "set_prefetch_as_load": 3, "set_virtual_prefetch": 3, "set_wq_checks_full_addr": 3, "seth": 10, "sets_": 3, "sfwcounter": 8, "sh": 6, "shift": 0, "should": [0, 3, 4, 7, 8, 9, 11], "sign": [0, 8], "signific": [8, 11], "simpli": 4, "simul": [6, 7, 9, 10, 11], "sinc": 11, "singl": [2, 4, 6], "six": [7, 9], "size": [0, 3, 5, 6, 11], "size_": 3, "size_t": [0, 5, 8], "slice": 0, "slice_low": 0, "slice_upp": 0, "slide": 4, "small": 8, "smaller": 6, "smallest": 8, "so": [0, 1, 4, 6, 7, 9, 11], "softwar": 10, "some": [1, 6, 8, 11], "someth": [6, 11], "sometim": 0, "sort": 4, "sourc": [4, 7, 11], "space": 3, "spatial": 10, "special": [0, 11], "specif": [6, 11], "specifi": [0, 1, 2, 3, 5, 6, 8], "splice": [0, 8], "splice_bit": 8, "split": [0, 4], "split_loc": 0, "sq_size": [5, 6], "sq_size_": 5, "sq_width": [5, 6], "sq_width_": 5, "srcdir_nam": 4, "srrip": 6, "st_block": 0, "st_full_addr": 0, "st_page": 0, "start": [4, 6, 11], "startup": 11, "state": [4, 11], "static": [0, 4], "static_cast": 7, "static_ext": 0, "statist": [3, 7, 9], "std": [0, 1, 2, 3, 5, 7, 8, 9], "step": 4, "store": [5, 7, 9, 11], "string": [3, 4], "strong": [0, 2], "struct": [0, 3, 5], "structur": [4, 7, 9], "student": 11, "sub_ext": 0, "subclass": [0, 3, 5], "subdict": 4, "subext": 0, "submit": 11, "subset": 0, "subtract": [0, 8], "succe": 0, "suffix": 4, "sum": 11, "superclass": 9, "superset": 0, "support": [0, 6, 11], "symposium": 10, "synonym": 0, "system": 11, "t": [0, 5, 8], "tag": [3, 7, 9, 11], "tag_bandwidth": 3, "tail": 4, "take": [0, 6, 8, 11], "taken": [7, 9], "target": [4, 5, 11], "tebi": 2, "tebibyt": 2, "templat": [0, 2, 3, 5, 8], "tempor": 10, "teran": 10, "termin": 4, "texa": 11, "than": [0, 1, 3, 4, 8, 11], "the_foo": 0, "thei": [2, 4, 6], "them": [3, 9], "themselv": 4, "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11], "thing": 6, "think": 11, "those": 0, "three": [7, 9, 11], "through": [4, 6, 11], "throw": [0, 1], "time": [0, 5, 9, 11], "tlb": 3, "togeth": 0, "too": 6, "tool": 11, "toward": 11, "trace": 11, "traceback": 4, "translat": [3, 7, 9], "transmit": 5, "travers": 4, "trigger": 5, "triggering_cpu": [7, 9], "trivial": 6, "true": [4, 6, 7, 9], "truncat": 4, "two": [0, 4, 6, 8], "type": [0, 1, 2, 7, 8, 9], "typenam": [0, 2, 3, 5, 8], "u": 11, "uint32_t": [3, 7, 9], "uint32_wai": [7, 9], "uint64_t": [0, 2, 3, 7, 8, 9], "uint8_t": [7, 9], "uls_": 3, "ultim": 11, "uncheck": 0, "uncondit": [7, 9], "under": [4, 6], "underli": [0, 2, 8], "underlying_typ": [0, 1], "underlying_type_t": 7, "understand": 11, "unintention": 2, "uniqu": 3, "unit": [1, 2], "unit2": 2, "univers": 11, "unless": [4, 9], "unpack": 8, "unsaf": 0, "unsign": [0, 2, 3, 5, 8], "until": 1, "unwieldi": 6, "unwrap": [0, 2], "uoffset": 0, "up": [0, 11], "updat": 7, "update_btb": [7, 9], "update_replacement_st": [7, 9], "upper": [0, 3, 8], "upper_ext": 0, "upper_level": 3, "upper_levels_for": 4, "us": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "useful_prefetch": [7, 9], "user": [4, 8, 11], "usual": 0, "util": 11, "v": [7, 10], "val": [0, 2], "val_typ": 8, "valid": 6, "valu": [0, 2, 3, 4, 5, 6, 7, 8, 9], "varieti": [6, 11], "ve": 6, "vector": [3, 7, 9], "verbos": 4, "veri": [1, 8], "version": 7, "victim_addr": [7, 9], "virtual": [3, 7, 9], "virtual_prefetch": [7, 9], "visit": 4, "void": [1, 2, 7, 9], "wa": [7, 9, 11], "wai": [0, 3, 5, 6, 7, 9], "walk": 6, "wang": 10, "want": 11, "ways_": 3, "we": [6, 11], "well": 0, "what": 8, "when": [3, 4, 5, 7, 9, 11], "where": [0, 4, 11], "whether": [8, 9], "which": [0, 4, 5, 8], "while": 11, "who": 4, "whole_dict": 4, "whose": [4, 7, 9], "why": 11, "widen": 0, "width": [0, 2, 5, 11], "wilkerson": 10, "window": 5, "within": [5, 11], "without": 11, "word": 4, "work": [7, 11], "would": [0, 6], "wrap": 8, "write": [3, 4, 7, 9], "write_fil": 4, "write_frag": 4, "writer": 4, "written": 4, "x": 2, "yield": 4, "yield_from_star": 4, "you": [0, 6, 7, 9, 11], "your": [9, 11], "zero": [7, 9], "zeshan": 10, "zhou": 10, "\u00e9": 10}, "titles": ["Address Operations", "Bandwidth", "Byte Sizes", "Cache Model", "Configuration API", "Core Model", "Creating a Configuration File", "The Legacy ChampSim Module System", "Module Support Library", "The ChampSim Module System", "Publications", "Welcome to the ChampSim wiki!"], "titleterms": {"": 11, "The": [7, 9], "address": 0, "api": 4, "bandwidth": 1, "bit": 8, "branch": [7, 9], "buffer": [7, 9], "builder": [3, 5], "byte": 2, "cach": [3, 6], "champsim": [7, 9, 11], "configur": [4, 6], "content": 11, "conveni": [0, 2], "core": [5, 6], "counter": 8, "creat": 6, "dictionari": 4, "extent": [0, 4], "faq": 11, "featur": 11, "file": [4, 6], "first": 6, "fix": 8, "function": [4, 8], "gener": 4, "goal": 11, "heterogen": 6, "i": 11, "itertool": 4, "legaci": 7, "librari": 8, "liter": 2, "memori": [7, 9], "model": [3, 5], "modul": [7, 8, 9], "multi": 6, "oper": [0, 4, 8], "pars": 4, "polici": [7, 9], "predictor": [7, 9], "prefetch": [7, 9], "public": 10, "replac": [7, 9], "satur": 8, "size": 2, "special": 2, "support": 8, "system": [4, 6, 7, 9], "target": [7, 9], "typedef": 0, "util": 4, "welcom": 11, "what": 11, "width": 8, "wiki": 11, "your": 6}}) \ No newline at end of file