replaceable_entry.hh revision 14131
12810Srdreslin@umich.edu/**
212348Snikos.nikoleris@arm.com * Copyright (c) 2018 Inria
311051Sandreas.hansson@arm.com * All rights reserved.
411051Sandreas.hansson@arm.com *
511051Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
611051Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
711051Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
811051Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
911051Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
1011051Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
1111051Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
1211051Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
1311051Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
1411051Sandreas.hansson@arm.com * this software without specific prior written permission.
1511051Sandreas.hansson@arm.com *
162810Srdreslin@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172810Srdreslin@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182810Srdreslin@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192810Srdreslin@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202810Srdreslin@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212810Srdreslin@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222810Srdreslin@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232810Srdreslin@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242810Srdreslin@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252810Srdreslin@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262810Srdreslin@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272810Srdreslin@umich.edu *
282810Srdreslin@umich.edu * Authors: Daniel Carvalho
292810Srdreslin@umich.edu */
302810Srdreslin@umich.edu
312810Srdreslin@umich.edu#ifndef __MEM_CACHE_REPLACEMENT_POLICIES_REPLACEABLE_ENTRY_HH__
322810Srdreslin@umich.edu#define __MEM_CACHE_REPLACEMENT_POLICIES_REPLACEABLE_ENTRY_HH__
332810Srdreslin@umich.edu
342810Srdreslin@umich.edu#include <cstdint>
352810Srdreslin@umich.edu#include <memory>
362810Srdreslin@umich.edu
372810Srdreslin@umich.edu/**
382810Srdreslin@umich.edu * The replacement data needed by replacement policies. Each replacement policy
392810Srdreslin@umich.edu * should have its own implementation of replacement data.
402810Srdreslin@umich.edu */
412810Srdreslin@umich.edustruct ReplacementData {};
4211051Sandreas.hansson@arm.com
4311051Sandreas.hansson@arm.com/**
442810Srdreslin@umich.edu * A replaceable entry is a basic entry in a 2d table-like structure that needs
4511051Sandreas.hansson@arm.com * to have replacement functionality. This entry is located in a specific row
4611051Sandreas.hansson@arm.com * and column of the table (set and way in cache nomenclature), which are
4712349Snikos.nikoleris@arm.com * stored within the entry itself.
482810Srdreslin@umich.edu *
492810Srdreslin@umich.edu * It contains the replacement data pointer, which must be instantiated by the
502810Srdreslin@umich.edu * replacement policy before being used.
512810Srdreslin@umich.edu * @sa Replacement Policies
5211051Sandreas.hansson@arm.com */
532810Srdreslin@umich.educlass ReplaceableEntry
542810Srdreslin@umich.edu{
5511051Sandreas.hansson@arm.com  private:
562810Srdreslin@umich.edu    /**
5712334Sgabeblack@google.com     * Set to which this entry belongs.
5811051Sandreas.hansson@arm.com     */
5911051Sandreas.hansson@arm.com    uint32_t _set;
6011051Sandreas.hansson@arm.com
6111051Sandreas.hansson@arm.com    /**
6211288Ssteve.reinhardt@amd.com     * Way (relative position within the set) to which this entry belongs.
6311051Sandreas.hansson@arm.com     */
6411051Sandreas.hansson@arm.com    uint32_t _way;
6511051Sandreas.hansson@arm.com
6611051Sandreas.hansson@arm.com  public:
6711051Sandreas.hansson@arm.com    ReplaceableEntry() = default;
6811053Sandreas.hansson@arm.com    virtual ~ReplaceableEntry() = default;
6911053Sandreas.hansson@arm.com
7011051Sandreas.hansson@arm.com    /**
7111051Sandreas.hansson@arm.com     * Replacement data associated to this entry.
7211051Sandreas.hansson@arm.com     * It must be instantiated by the replacement policy before being used.
7311197Sandreas.hansson@arm.com     */
7411197Sandreas.hansson@arm.com    std::shared_ptr<ReplacementData> replacementData;
7511199Sandreas.hansson@arm.com
7611197Sandreas.hansson@arm.com    /**
7712084Sspwilson2@wisc.edu     * Set both the set and way. Should be called only once.
7812084Sspwilson2@wisc.edu     *
7911197Sandreas.hansson@arm.com     * @param set The set of this entry.
8011051Sandreas.hansson@arm.com     * @param way The way of this entry.
8111051Sandreas.hansson@arm.com     */
8211051Sandreas.hansson@arm.com    virtual void
8311051Sandreas.hansson@arm.com    setPosition(const uint32_t set, const uint32_t way)
8411051Sandreas.hansson@arm.com    {
8511051Sandreas.hansson@arm.com        _set = set;
8611051Sandreas.hansson@arm.com        _way = way;
8711051Sandreas.hansson@arm.com    }
8811051Sandreas.hansson@arm.com
8911051Sandreas.hansson@arm.com    /**
9011051Sandreas.hansson@arm.com     * Get set number.
9111051Sandreas.hansson@arm.com     *
9211051Sandreas.hansson@arm.com     * @return The set to which this entry belongs.
9311051Sandreas.hansson@arm.com     */
9411051Sandreas.hansson@arm.com    uint32_t getSet() const { return _set; }
9511051Sandreas.hansson@arm.com
9611051Sandreas.hansson@arm.com    /**
9711051Sandreas.hansson@arm.com     * Get way number.
9811051Sandreas.hansson@arm.com     *
9911051Sandreas.hansson@arm.com     * @return The way to which this entry belongs.
10011051Sandreas.hansson@arm.com     */
10111051Sandreas.hansson@arm.com    uint32_t getWay() const { return _way; }
10211051Sandreas.hansson@arm.com};
10311051Sandreas.hansson@arm.com
10411051Sandreas.hansson@arm.com#endif // __MEM_CACHE_REPLACEMENT_POLICIES_REPLACEABLE_ENTRY_HH_
10511051Sandreas.hansson@arm.com