chain_wire.hh

来自「linux下基于c++的处理器仿真平台。具有处理器流水线」· HH 代码 · 共 131 行

HH
131
字号
/* * Copyright (c) 2003, 2004, 2005 * The Regents of The University of Michigan * All Rights Reserved * * This code is part of the M5 simulator, developed by Nathan Binkert, * Erik Hallnor, Steve Raasch, and Steve Reinhardt, with contributions * from Ron Dreslinski, Dave Greene, Lisa Hsu, Kevin Lim, Ali Saidi, * and Andrew Schultz. * * Permission is granted to use, copy, create derivative works and * redistribute this software and such derivative works for any * purpose, so long as the copyright notice above, this grant of * permission, and the disclaimer below appear in all copies made; and * so long as the name of The University of Michigan is not used in * any advertising or publicity pertaining to the use or distribution * of this software without specific, written prior authorization. * * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH * DAMAGES. */#ifndef __ENCUMBERED_CPU_FULL_IQ_SEGMENTED_CHAIN_WIRE_HH__#define __ENCUMBERED_CPU_FULL_IQ_SEGMENTED_CHAIN_WIRE_HH__#include <iostream>/*======================================================================Explanation of chain-mapping policies:   OneToOne:  This is the original segmented IQ policy. Each chain is              staticaly allocated a wire in each cluster.   Dynamic:   Each cluster holds an equal fraction of all available              wires (specified with the 'max_wires' CPU parameter).              Any chain ID can be assigned to any cluster with a free	      chain-wire. If the instruction cannot be assigned to the	      preferred "producing" cluster, it can be assigned to a	      "second-chance" cluster (the cluster with the lowest	      occupancy). If the second chance cluster is full or is	      the same cluster as the "producing" cluster, dispatch	      is stalled.   Static:    Each cluster holds an equal fraction of all available              wires (specified with the 'max_wires' CPU parameter).	      These chain-wires are statically assigned a chain-ID.              A chain can only be assigned to the cluster where its	      chain-wire is assigned. If the instruction cannot be	      assigned to the preferred "producing" cluster, it can	      be assigned to a "second-chance" cluster (the cluster	      with the lowest occupancy). If the second chance cluster	      is full or is the same cluster as the "producing" cluster,	      dispatch is stalled.   Static-Stall:  Each cluster holds an equal fraction of all available              wires (specified with the 'max_wires' CPU parameter).	      These chain-wires are statically assigned a chain-ID.              A chain can only be assigned to the cluster where its	      chain-wire is assigned. If the instruction cannot be	      assigned to the preferred "producing" cluster, dispatch	      is stalled.======================================================================*/class ChainWireInfo{  public:    enum MappingPolicy {OneToOne, Static, StaticStall, Dynamic};  private:    //    //  Configuration args    //    MappingPolicy policy;    unsigned num_clusters;    unsigned num_wires;       //  total wires (all clusters)    unsigned num_chains;      //  total chains    struct WireMap {	bool  mapped;   // this chain is mapped to this cluster	bool  free;     // this wire is free to be used	WireMap() {mapped = false; free = false;}	bool allocatable() { return mapped && free; }	void dump() {	    std::cout << "  mapped: " << mapped << ", free: " << free		      << std::endl;	}    };    WireMap **wireMap;    unsigned *wires_in_use;      // wires in use (each cluster)    unsigned *num_clust_wires;   // total wires (each cluster)  public:    ChainWireInfo(unsigned _chains, unsigned _wires, unsigned _clust,		  MappingPolicy _pol);    bool wireAllocatable(unsigned clust, unsigned chain);    bool chainMapped(unsigned clust, unsigned chain);    unsigned freeWires(unsigned clust);    int findFreeWire(unsigned clust);    void allocateWire(unsigned clust, unsigned chain);    void releaseWire(unsigned clust, unsigned chain);    void dump();    bool sanityCheckOK();};#endif  // __ENCUMBERED_CPU_FULL_IQ_SEGMENTED_CHAIN_WIRE_HH__

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?