summaryrefslogtreecommitdiff
path: root/cpu/o3/fu_pool.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cpu/o3/fu_pool.cc')
-rw-r--r--cpu/o3/fu_pool.cc297
1 files changed, 0 insertions, 297 deletions
diff --git a/cpu/o3/fu_pool.cc b/cpu/o3/fu_pool.cc
deleted file mode 100644
index b28b5d37f..000000000
--- a/cpu/o3/fu_pool.cc
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Copyright (c) 2002-2005 The Regents of The University of Michigan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sstream>
-
-#include "cpu/o3/fu_pool.hh"
-#include "encumbered/cpu/full/fu_pool.hh"
-#include "sim/builder.hh"
-
-using namespace std;
-
-////////////////////////////////////////////////////////////////////////////
-//
-// A pool of function units
-//
-
-inline void
-FUPool::FUIdxQueue::addFU(int fu_idx)
-{
- funcUnitsIdx.push_back(fu_idx);
- ++size;
-}
-
-inline int
-FUPool::FUIdxQueue::getFU()
-{
- int retval = funcUnitsIdx[idx++];
-
- if (idx == size)
- idx = 0;
-
- return retval;
-}
-
-FUPool::~FUPool()
-{
- fuListIterator i = funcUnits.begin();
- fuListIterator end = funcUnits.end();
- for (; i != end; ++i)
- delete *i;
-}
-
-
-// Constructor
-FUPool::FUPool(string name, vector<FUDesc *> paramList)
- : SimObject(name)
-{
- numFU = 0;
-
- funcUnits.clear();
-
- for (int i = 0; i < Num_OpClasses; ++i) {
- maxOpLatencies[i] = 0;
- maxIssueLatencies[i] = 0;
- }
-
- //
- // Iterate through the list of FUDescData structures
- //
- for (FUDDiterator i = paramList.begin(); i != paramList.end(); ++i) {
-
- //
- // Don't bother with this if we're not going to create any FU's
- //
- if ((*i)->number) {
- //
- // Create the FuncUnit object from this structure
- // - add the capabilities listed in the FU's operation
- // description
- //
- // We create the first unit, then duplicate it as needed
- //
- FuncUnit *fu = new FuncUnit;
-
- OPDDiterator j = (*i)->opDescList.begin();
- OPDDiterator end = (*i)->opDescList.end();
- for (; j != end; ++j) {
- // indicate that this pool has this capability
- capabilityList.set((*j)->opClass);
-
- // Add each of the FU's that will have this capability to the
- // appropriate queue.
- for (int k = 0; k < (*i)->number; ++k)
- fuPerCapList[(*j)->opClass].addFU(numFU + k);
-
- // indicate that this FU has the capability
- fu->addCapability((*j)->opClass, (*j)->opLat, (*j)->issueLat);
-
- if ((*j)->opLat > maxOpLatencies[(*j)->opClass])
- maxOpLatencies[(*j)->opClass] = (*j)->opLat;
-
- if ((*j)->issueLat > maxIssueLatencies[(*j)->opClass])
- maxIssueLatencies[(*j)->opClass] = (*j)->issueLat;
- }
-
- numFU++;
-
- // Add the appropriate number of copies of this FU to the list
- ostringstream s;
-
- s << (*i)->name() << "(0)";
- fu->name = s.str();
- funcUnits.push_back(fu);
-
- for (int c = 1; c < (*i)->number; ++c) {
- ostringstream s;
- numFU++;
- FuncUnit *fu2 = new FuncUnit(*fu);
-
- s << (*i)->name() << "(" << c << ")";
- fu2->name = s.str();
- funcUnits.push_back(fu2);
- }
- }
- }
-
- unitBusy.resize(numFU);
-
- for (int i = 0; i < numFU; i++) {
- unitBusy[i] = false;
- }
-}
-
-void
-FUPool::annotateMemoryUnits(unsigned hit_latency)
-{
- maxOpLatencies[MemReadOp] = hit_latency;
-
- fuListIterator i = funcUnits.begin();
- fuListIterator iend = funcUnits.end();
- for (; i != iend; ++i) {
- if ((*i)->provides(MemReadOp))
- (*i)->opLatency(MemReadOp) = hit_latency;
-
- if ((*i)->provides(MemWriteOp))
- (*i)->opLatency(MemWriteOp) = hit_latency;
- }
-}
-
-int
-FUPool::getUnit(OpClass capability)
-{
- // If this pool doesn't have the specified capability,
- // return this information to the caller
- if (!capabilityList[capability])
- return -2;
-
- int fu_idx = fuPerCapList[capability].getFU();
- int start_idx = fu_idx;
-
- // Iterate through the circular queue if needed, stopping if we've reached
- // the first element again.
- while (unitBusy[fu_idx]) {
- fu_idx = fuPerCapList[capability].getFU();
- if (fu_idx == start_idx) {
- // No FU available
- return -1;
- }
- }
-
- assert(fu_idx < numFU);
-
- unitBusy[fu_idx] = true;
-
- return fu_idx;
-}
-
-void
-FUPool::freeUnitNextCycle(int fu_idx)
-{
- assert(unitBusy[fu_idx]);
- unitsToBeFreed.push_back(fu_idx);
-}
-
-void
-FUPool::processFreeUnits()
-{
- while (!unitsToBeFreed.empty()) {
- int fu_idx = unitsToBeFreed.back();
- unitsToBeFreed.pop_back();
-
- assert(unitBusy[fu_idx]);
-
- unitBusy[fu_idx] = false;
- }
-}
-
-void
-FUPool::dump()
-{
- cout << "Function Unit Pool (" << name() << ")\n";
- cout << "======================================\n";
- cout << "Free List:\n";
-
- for (int i = 0; i < numFU; ++i) {
- if (unitBusy[i]) {
- continue;
- }
-
- cout << " [" << i << "] : ";
-
- cout << funcUnits[i]->name << " ";
-
- cout << "\n";
- }
-
- cout << "======================================\n";
- cout << "Busy List:\n";
- for (int i = 0; i < numFU; ++i) {
- if (!unitBusy[i]) {
- continue;
- }
-
- cout << " [" << i << "] : ";
-
- cout << funcUnits[i]->name << " ";
-
- cout << "\n";
- }
-}
-
-void
-FUPool::switchOut()
-{
-}
-
-void
-FUPool::takeOverFrom()
-{
- for (int i = 0; i < numFU; i++) {
- unitBusy[i] = false;
- }
- unitsToBeFreed.clear();
-}
-
-//
-
-////////////////////////////////////////////////////////////////////////////
-//
-// The SimObjects we use to get the FU information into the simulator
-//
-////////////////////////////////////////////////////////////////////////////
-
-//
-// FUPool - Contails a list of FUDesc objects to make available
-//
-
-//
-// The FuPool object
-//
-
-BEGIN_DECLARE_SIM_OBJECT_PARAMS(FUPool)
-
- SimObjectVectorParam<FUDesc *> FUList;
-
-END_DECLARE_SIM_OBJECT_PARAMS(FUPool)
-
-
-BEGIN_INIT_SIM_OBJECT_PARAMS(FUPool)
-
- INIT_PARAM(FUList, "list of FU's for this pool")
-
-END_INIT_SIM_OBJECT_PARAMS(FUPool)
-
-
-CREATE_SIM_OBJECT(FUPool)
-{
- return new FUPool(getInstanceName(), FUList);
-}
-
-REGISTER_SIM_OBJECT("FUPool", FUPool)
-