クラス Onikiri::RegisterFreeList

#include <RegisterFreeList.h>

Onikiri::RegisterFreeListに対する継承グラフ

Inheritance graph
[凡例]
Onikiri::RegisterFreeListのコラボレーション図

Collaboration graph
[凡例]
すべてのメンバ一覧

Public メソッド

int Allocate (int segment)
int GetFreeEntryCount (int segment)
int GetSegmentCount ()
void Initialize (InitPhase phase)
 RegisterFreeList ()
void Release (int segment, int phyRegNum)
virtual ~RegisterFreeList ()

説明

RegisterFreeList.h43 行で定義されています。


コンストラクタとデストラクタ

RegisterFreeList::RegisterFreeList (  ) 

RegisterFreeList.cpp41 行で定義されています。

00042 {
00043 }

RegisterFreeList::~RegisterFreeList (  )  [virtual]

RegisterFreeList.cpp45 行で定義されています。

参照先 Onikiri::PhysicalResourceNode::ReleaseParam().

00046 {
00047     ReleaseParam();
00048 }

関数の呼び出しグラフ:


関数

int RegisterFreeList::Allocate ( int  segment  ) 

RegisterFreeList.cpp133 行で定義されています。

参照先 ASSERT.

参照元 Onikiri::RMT::AllocateRegBody()Onikiri::RMT::Initialize().

00134 {
00135     ASSERT( m_freeList[segment].size() > 0, "cannot allocate register.");
00136 
00137     int phyRegNo = m_freeList[segment].front();
00138     m_freeList[segment].pop_front();
00139 
00140     return phyRegNo;
00141 }

Here is the caller graph for this function:

int RegisterFreeList::GetFreeEntryCount ( int  segment  ) 

RegisterFreeList.cpp148 行で定義されています。

参照元 Onikiri::RMT::CanAllocate()Initialize().

00149 {
00150     return (int)m_freeList[segment].size();
00151 }

Here is the caller graph for this function:

int RegisterFreeList::GetSegmentCount (  ) 

RegisterFreeList.cpp143 行で定義されています。

00144 {
00145     return (int)m_freeList.size();
00146 }

void RegisterFreeList::Initialize ( InitPhase  phase  ) 

RegisterFreeList.cpp50 行で定義されています。

参照先 ASSERTGetFreeEntryCount()Onikiri::ISAInfoIF::GetRegisterCount()Onikiri::ISAInfoIF::GetRegisterSegmentID()Onikiri::PhysicalResourceNode::INIT_POST_CONNECTIONOnikiri::PhysicalResourceNode::INIT_PRE_CONNECTIONOnikiri::ParamExchange::LoadParam()THROW_RUNTIME_ERROR.

00051 {
00052     if(phase == INIT_PRE_CONNECTION){
00053         LoadParam();
00054     }
00055     else if(phase == INIT_POST_CONNECTION){
00056         // o`FbN
00057         if( m_registerFile.GetSize() == 0 ) {
00058             THROW_RUNTIME_ERROR("registerFile not set.");
00059         }
00060         if( m_emulator.GetSize() == 0 ) {
00061             THROW_RUNTIME_ERROR("emulator not set.");
00062         }
00063 
00064         ISAInfoIF* isaInfo = m_emulator[0]->GetISAInfo();
00065 
00066         int numLogicalReg = isaInfo->GetRegisterCount();
00067 
00068 
00069         // segment Xgset
00070         set<int> segmentSet;
00071         for (int i = 0; i < numLogicalReg; ++i) {
00072             int segment = isaInfo->GetRegisterSegmentID(i);
00073             segmentSet.insert(segment);
00074         }
00075 
00076         // freeList 
00077         m_freeList.resize(segmentSet.size());
00078 
00079         // freeList segment \z
00080         int phyRegNo = 0;
00081         for(set<int>::iterator iter = segmentSet.begin();
00082             iter != segmentSet.end();
00083             ++iter)
00084         {
00085             int segment = *iter;
00086             int capacity = m_registerFile[0]->GetCapacity(segment);
00087             // freeList o^
00088             for (int i = 0; i < capacity; i++) {
00089                 m_freeList[segment].push_back(phyRegNo);
00090                 ++phyRegNo;
00091             }
00092         }
00093 
00094         ASSERT(
00095             phyRegNo == m_registerFile[0]->GetTotalCapacity(),
00096             "phyreg count unmatch"
00097         );
00098 
00099 
00100         // t[XgGg`FbN
00101         
00102         vector<int> logicalRegNumList(segmentSet.size(), 0);
00103         for (int i = 0; i < numLogicalReg; i++) {
00104             int segment = isaInfo->GetRegisterSegmentID(i);
00105             logicalRegNumList[segment]++;
00106         }
00107 
00108         int threadCount = m_core[0]->GetThreadCount();
00109         for( size_t i = 0; i < segmentSet.size(); i++ ){
00110             int requiredRegCount = logicalRegNumList[i] * threadCount + 1;
00111             if( GetFreeEntryCount((int)i) < requiredRegCount ){
00112                 THROW_RUNTIME_ERROR(
00113                     "The number of the physical register is too small.\n"
00114                     "segment: %d\n"
00115                     "phy reg num: %d\n"
00116                     "requried num: %d (log reg num:%d x thread num:%d + 1)\n",
00117                     i,
00118                     m_registerFile[0]->GetCapacity((int)i),
00119                     requiredRegCount,
00120                     logicalRegNumList[i],
00121                     threadCount
00122                 );
00123             }
00124         }
00125     }
00126 }

関数の呼び出しグラフ:

void RegisterFreeList::Release ( int  segment,
int  phyRegNum 
)

RegisterFreeList.cpp128 行で定義されています。

参照元 Onikiri::RMT::DeallocateRegBody()Onikiri::RMT::ReleaseRegBody().

00129 {
00130     m_freeList[segment].push_back(phyRegNum);
00131 }

Here is the caller graph for this function:


このクラスの説明は次のファイルから生成されました:
Onikiri2に対してTue Jun 18 15:17:05 2013に生成されました。  doxygen 1.4.7